|
|
- module SlackRubyBot
- module Commands
- class Base
- class_attribute :routes
-
- def self.send_message(client, channel, text, options = {})
- if text && text.length > 0
- send_client_message(client, { channel: channel, text: text }.merge(options))
- else
- send_message_with_gif client, channel, 'Nothing to see here.', 'nothing', options
- end
- end
-
- def self.send_message_with_gif(client, channel, text, keywords, options = {})
- get_gif_and_send({
- client: client,
- channel: channel,
- text: text,
- keywords: keywords
- }.merge(options))
- end
-
- def self.send_gif(client, channel, keywords, options = {})
- get_gif_and_send({
- client: client,
- channel: channel,
- keywords: keywords
- }.merge(options))
- end
-
- def self.logger
- @logger ||= begin
- $stdout.sync = true
- Logger.new(STDOUT)
- end
- end
-
- def self.default_command_name
- name && name.split(':').last.downcase
- end
-
- def self.operator(*values, &block)
- values.each do |value|
- match Regexp.new("^(?<operator>\\#{value})(?<expression>.*)$", Regexp::IGNORECASE), &block
- end
- end
-
- def self.command(*values, &block)
- values.each do |value|
- match Regexp.new("^(?<bot>[\\w[:punct:]@<>]*)[\\s]+(?<command>#{value})$", Regexp::IGNORECASE), &block
- match Regexp.new("^(?<bot>[\\w[:punct:]@<>]*)[\\s]+(?<command>#{value})[\\s]+(?<expression>.*)$", Regexp::IGNORECASE), &block
- end
- end
-
- def self.invoke(client, data)
- self.finalize_routes!
- expression = parse(data)
- called = false
- routes.each_pair do |route, method|
- match = route.match(expression)
- next unless match
- next if match.names.include?('bot') && !SlackRubyBot.config.name?(match['bot'])
- called = true
- if method
- method.call(client, data, match)
- elsif self.respond_to?(:call)
- send(:call, client, data, match)
- else
- fail NotImplementedError, data.text
- end
- break
- end
- called
- end
-
- def self.match(match, &block)
- self.routes ||= {}
- self.routes[match] = block
- end
-
- private
-
- def self.parse(data)
- text = data.text
- return text unless data.channel && data.channel[0] == 'D' && data.user && data.user != SlackRubyBot.config.user_id
- SlackRubyBot.config.names.each do |name|
- text.downcase.tap do |td|
- return text if td == name || td.starts_with?("#{name} ")
- end
- end
- "#{SlackRubyBot.config.user} #{text}"
- end
-
- def self.finalize_routes!
- return if self.routes && self.routes.any?
- command default_command_name
- end
-
- def self.get_gif_and_send(options = {})
- options = options.dup
- gif = begin
- keywords = options.delete(:keywords)
- Giphy.random(keywords)
- rescue StandardError => e
- logger.warn "Giphy.random: #{e.message}"
- nil
- end
- client = options.delete(:client)
- text = options.delete(:text)
- text = [text, gif && gif.image_url.to_s].compact.join("\n")
- send_client_message(client, { text: text }.merge(options))
- end
-
- def self.send_client_message(client, data)
- client.message(data)
- end
- end
- end
- end
|