Class: SlackRubyBot::Commands::Base

Inherits:
Object
  • Object
show all
Includes:
Loggable
Defined in:
lib/slack-ruby-bot/commands/base.rb

Direct Known Subclasses

Bot, Default, HelpCommand, Hi, Unknown, Testing::HelloCommand

Class Method Summary collapse

Methods included from Loggable

included

Class Method Details

.command(*values, &block) ⇒ Object



40
41
42
43
# File 'lib/slack-ruby-bot/commands/base.rb', line 40

def command(*values, &block)
  values = values.map { |value| Regexp.escape(value) }.join('|')
  match Regexp.new("^(?<bot>[[:alnum:][:punct:]@<>]*)[\\s]+(?<command>#{values})([\\s]+(?<expression>.*)|)$", Regexp::IGNORECASE), &block
end

.default_command_nameObject



31
32
33
# File 'lib/slack-ruby-bot/commands/base.rb', line 31

def default_command_name
  name && name.split(':').last.downcase
end

.help(&block) ⇒ Object



27
28
29
# File 'lib/slack-ruby-bot/commands/base.rb', line 27

def help(&block)
  CommandsHelper.instance.capture_help(name, &block)
end

.invoke(client, data) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/slack-ruby-bot/commands/base.rb', line 45

def invoke(client, data)
  finalize_routes!
  expression, text = parse(client, data)
  called = false
  routes.each_pair do |route, options|
    match_method = options[:match_method]
    case match_method
    when :match
      match = route.match(expression)
      match ||= route.match(text) if text
      next unless match
      next if match.names.include?('bot') && !client.name?(match['bot'])
    when :scan
      match = expression.scan(route)
      next unless match.any?
    end
    called = true
    call = options[:call]
    if call
      call.call(client, data, match)
    elsif respond_to?(:call)
      send(:call, client, data, match)
    else
      raise NotImplementedError, data.text
    end
    break
  end if expression
  called
end

.match(match, &block) ⇒ Object



75
76
77
78
# File 'lib/slack-ruby-bot/commands/base.rb', line 75

def match(match, &block)
  self.routes ||= ActiveSupport::OrderedHash.new
  self.routes[match] = { match_method: :match, call: block }
end

.operator(*values, &block) ⇒ Object



35
36
37
38
# File 'lib/slack-ruby-bot/commands/base.rb', line 35

def operator(*values, &block)
  values = values.map { |value| Regexp.escape(value) }.join('|')
  match Regexp.new("^(?<operator>#{values})(?<expression>.*)$", Regexp::IGNORECASE), &block
end

.scan(match, &block) ⇒ Object



80
81
82
83
# File 'lib/slack-ruby-bot/commands/base.rb', line 80

def scan(match, &block)
  self.routes ||= ActiveSupport::OrderedHash.new
  self.routes[match] = { match_method: :scan, call: block }
end

.send_gif(client, channel, keywords, options = {}) ⇒ Object



22
23
24
25
# File 'lib/slack-ruby-bot/commands/base.rb', line 22

def send_gif(client, channel, keywords, options = {})
  logger.warn '[DEPRECATION] `send_gif` is deprecated.  Please use `client.say` instead.'
  client.say(options.merge(channel: channel, text: '', gif: keywords))
end

.send_message(client, channel, text, options = {}) ⇒ Object



8
9
10
11
12
13
14
15
# File 'lib/slack-ruby-bot/commands/base.rb', line 8

def send_message(client, channel, text, options = {})
  logger.warn '[DEPRECATION] `send_message` is deprecated.  Please use `client.say` instead.'
  if text && !text.length.empty?
    client.say(options.merge(channel: channel, text: text))
  else
    client.say(options.merge(channel: channel, text: 'Nothing to see here.', gif: 'nothing'))
  end
end

.send_message_with_gif(client, channel, text, keywords, options = {}) ⇒ Object



17
18
19
20
# File 'lib/slack-ruby-bot/commands/base.rb', line 17

def send_message_with_gif(client, channel, text, keywords, options = {})
  logger.warn '[DEPRECATION] `send_message_with_gif` is deprecated.  Please use `client.say` instead.'
  client.say(options.merge(channel: channel, text: text, gif: keywords))
end