class SlackRespondent::Commands::Base
Public Class Methods
attachment(match, fields_to_scan = nil, &block)
click to toggle source
def scan(match, &block)
routes[match] = { match_method: :scan, block: block }
end
# File lib/slack_respondent/commands/base.rb, line 66 def attachment(match, fields_to_scan = nil, &block) fields_to_scan = [fields_to_scan] unless fields_to_scan.nil? || fields_to_scan.is_a?(Array) routes[match] = { match_method: :attachment, block: block, fields_to_scan: fields_to_scan } end
bot_matcher()
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 75 def bot_matcher '(?<bot>\S*)' end
command(*values, &block)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 23 def command(*values, &block) values = values.map { |value| value.is_a?(Regexp) ? value.source : Regexp.escape(value) }.join('|') match Regexp.new("^#{bot_matcher}[\\s]+(?<command>#{values})([\\s]+(?<expression>.*)|)$", Regexp::IGNORECASE | Regexp::MULTILINE) end
command_name_from_class()
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 14 def command_name_from_class name ? name.split(':').last.downcase : object_id.to_s end
help(&block)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 10 def help(&block) Support::Help.instance.capture_help(self, &block) end
invoke(client, data)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 28 def invoke(client, data) finalize_routes! expression, text = parse(client, data) return false unless expression || data.attachments routes.each_pair do |route, options| match_method = options[:match_method] case match_method when :match next unless expression match = route.match(expression) match ||= route.match(text) if text next unless match next if match.names.include?('bot') && !client.name?(match['bot']) match = Support::Match.new(match) # when :scan # next unless expression # match = expression.scan(route) # next unless match.any? # when :attachment # next unless data.attachments && !data.attachments.empty? # match, attachment, field = match_attachments(data, route, options[:fields_to_scan]) # next unless match # match = Support::Match.new(match, attachment, field) end call_command(client, data, match) return true end false end
match(match)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 58 def match(match) routes[match] = { match_method: :match } end
operator(*values, &block)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 18 def operator(*values, &block) values = values.map { |value| Regexp.escape(value) }.join('|') match Regexp.new("^(?<operator>#{values})(?<expression>.*)$", Regexp::IGNORECASE), &block end
routes()
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 79 def routes @routes ||= ActiveSupport::OrderedHash.new end
Private Class Methods
call_command(client, data, match)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 85 def call_command(client, data, match) if respond_to?(:call) send(:call, client, data, match) if permitted?(client, data, match) else raise NotImplementedError, data.text end end
direct_message?(data)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 100 def direct_message?(data) data.channel && data.channel[0] == 'D' end
finalize_routes!()
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 113 def finalize_routes! # return if routes && routes.any? routes.clear match(self.pattern) if respond_to?(:pattern) command command_name_from_class end
match_attachments(data, route, fields_to_scan = nil)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 120 def match_attachments(data, route, fields_to_scan = nil) fields_to_scan ||= %i[pretext text title] data.attachments.each do |attachment| fields_to_scan.each do |field| next unless attachment[field] match = route.match(attachment[field]) return match, attachment, field if match end end false end
message_begins_with_bot_mention?(text, bot_names)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 108 def message_begins_with_bot_mention?(text, bot_names) bot_names = bot_names.join('|') !!text.downcase.match(/\A(#{bot_names})\s|\A(#{bot_names})\z/) end
message_from_another_user?(data)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 104 def message_from_another_user?(data) data.user && data.user != SlackRespondent.config.user_id end
parse(client, data)
click to toggle source
# File lib/slack_respondent/commands/base.rb, line 93 def parse(client, data) text = data.text return text unless direct_message?(data) && message_from_another_user?(data) return text if message_begins_with_bot_mention?(text, client.names) ["#{client.name} #{text}", text] end
permitted?(_client, _data, _match)
click to toggle source
Intended to be overridden by subclasses to hook in an authorization mechanism.
# File lib/slack_respondent/commands/base.rb, line 134 def permitted?(_client, _data, _match) true end