Class: Slackbotsy::Bot
- Inherits:
-
Object
- Object
- Slackbotsy::Bot
- Defined in:
- lib/slackbotsy/bot.rb
Instance Method Summary collapse
- #attach(text, attachment, options = {}) ⇒ Object
-
#encode_payload(text, options = {}) ⇒ Object
format to send text to incoming webhook.
-
#eval_scripts(*files) ⇒ Object
pass list of files containing hear statements, to be opened and evaled.
-
#handle_item(msg) ⇒ Object
check message and run blocks for any matches.
-
#hear(regex, &block) ⇒ Object
add regex to things to hear.
-
#initialize(options) ⇒ Bot
constructor
A new instance of Bot.
-
#say(text, options = {}) ⇒ Object
send text to slack using incoming webhook.
-
#setup_incoming_webhook ⇒ Object
setup http connection for sending async incoming webhook messages to slack.
Constructor Details
#initialize(options) ⇒ Bot
Returns a new instance of Bot.
11 12 13 14 15 16 17 18 19 20 |
# File 'lib/slackbotsy/bot.rb', line 11 def initialize() @options = ## use set of tokens for (more or less) O(1) lookup on multiple channels @options['outgoing_token'] = Array(@options['outgoing_token']).to_set @regexes = {} setup_incoming_webhook # http connection for async replies yield if block_given? # run any hear statements in block end |
Instance Method Details
#attach(text, attachment, options = {}) ⇒ Object
49 50 51 52 |
# File 'lib/slackbotsy/bot.rb', line 49 def attach(text, , = {}) = { attachments: [ ] }.merge() say(text, ) end |
#encode_payload(text, options = {}) ⇒ Object
format to send text to incoming webhook
31 32 33 34 35 36 37 38 39 |
# File 'lib/slackbotsy/bot.rb', line 31 def encode_payload(text, = {}) payload = { text: text, username: @options['name'], channel: @options['channel'].gsub(/^#?/, '#'), # ensure channel begins with # }.merge() "payload=#{payload.to_json.to_s}" end |
#eval_scripts(*files) ⇒ Object
pass list of files containing hear statements, to be opened and evaled
60 61 62 63 64 |
# File 'lib/slackbotsy/bot.rb', line 60 def eval_scripts(*files) files.flatten.each do |file| self.instance_eval File.open(file).read end end |
#handle_item(msg) ⇒ Object
check message and run blocks for any matches
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/slackbotsy/bot.rb', line 67 def handle_item(msg) return nil unless @options['outgoing_token'].include? msg[:token] # ensure messages are for us from slack return nil if msg[:user_name] == 'slackbot' # do not reply to self return nil unless msg[:text].is_a?(String) # skip empty messages ## loop things to look for and collect immediate responses ## rescue everything here so the bot keeps running even with a broken script responses = @regexes.map do |regex, proc| if mdata = msg[:text].strip.match(regex) begin Slackbotsy::Message.new(self, msg).instance_exec(mdata, &proc) rescue => err err end end end ## format any replies for http response if responses { text: responses.compact.join("\n") }.to_json end end |
#hear(regex, &block) ⇒ Object
add regex to things to hear
55 56 57 |
# File 'lib/slackbotsy/bot.rb', line 55 def hear(regex, &block) @regexes[regex] = block end |
#say(text, options = {}) ⇒ Object
send text to slack using incoming webhook
42 43 44 45 46 47 |
# File 'lib/slackbotsy/bot.rb', line 42 def say(text, = {}) request = Net::HTTP::Post.new(@uri.request_uri) request.body = encode_payload(text, ) response = @http.request(request) return nil # so as not to trigger text in outgoing webhook reply end |
#setup_incoming_webhook ⇒ Object
setup http connection for sending async incoming webhook messages to slack
23 24 25 26 27 28 |
# File 'lib/slackbotsy/bot.rb', line 23 def setup_incoming_webhook @uri = URI.parse "https://#{@options['team']}.slack.com/services/hooks/incoming-webhook?token=#{@options['incoming_token']}" @http = Net::HTTP.new(@uri.host, @uri.port) @http.use_ssl = true @http.verify_mode = OpenSSL::SSL::VERIFY_PEER end |