diff --git a/app/models/agents/slack_agent.rb b/app/models/agents/slack_agent.rb index 33877a03..00dedb82 100644 --- a/app/models/agents/slack_agent.rb +++ b/app/models/agents/slack_agent.rb @@ -1,6 +1,7 @@ module Agents class SlackAgent < Agent DEFAULT_USERNAME = 'Huginn' + ALLOWED_PARAMS = ['channel', 'username', 'unfurl_links', 'attachments'] cannot_be_scheduled! cannot_create_events! @@ -13,7 +14,7 @@ module Agents #{'## Include `slack-notifier` in your Gemfile to use this Agent!' if dependencies_missing?} To get started, you will first need to configure an incoming webhook. - + - Go to `https://my.slack.com/services/new/incoming-webhook`, choose a default channel and add the integration. Your webhook URL will look like: `https://hooks.slack.com/services/some/random/characters` @@ -65,14 +66,22 @@ module Agents @slack_notifier ||= Slack::Notifier.new(webhook_url, username: username) end + def filter_options(opts) + opts.select { |key, value| ALLOWED_PARAMS.include? key }.symbolize_keys + end + def receive(incoming_events) incoming_events.each do |event| opts = interpolated(event) - if /^:/.match(opts[:icon]) - slack_notifier.ping opts[:message], channel: opts[:channel], username: opts[:username], icon_emoji: opts[:icon], unfurl_links: opts[:unfurl_links] - else - slack_notifier.ping opts[:message], channel: opts[:channel], username: opts[:username], icon_url: opts[:icon], unfurl_links: opts[:unfurl_links] + slack_opts = filter_options(opts) + if opts[:icon].present? + if /^:/.match(opts[:icon]) + slack_opts[:icon_emoji] = opts[:icon] + else + slack_opts[:icon_url] = opts[:icon] + end end + slack_notifier.ping opts[:message], slack_opts end end end diff --git a/spec/models/agents/slack_agent_spec.rb b/spec/models/agents/slack_agent_spec.rb index 16c7ab10..9fb8257b 100644 --- a/spec/models/agents/slack_agent_spec.rb +++ b/spec/models/agents/slack_agent_spec.rb @@ -2,11 +2,14 @@ require 'spec_helper' describe Agents::SlackAgent do before(:each) do + @fallback = "Its going to rain" + @attachments = [{'fallback' => "{{fallback}}"}] @valid_params = { 'webhook_url' => 'https://hooks.slack.com/services/random1/random2/token', 'channel' => '#random', 'username' => "{{username}}", - 'message' => "{{message}}" + 'message' => "{{message}}", + 'attachments' => @attachments } @checker = Agents::SlackAgent.new(:name => "slacker", :options => @valid_params) @@ -15,7 +18,7 @@ describe Agents::SlackAgent do @event = Event.new @event.agent = agents(:bob_weather_agent) - @event.payload = { :channel => '#random', :message => 'Looks like its going to rain', username: "Huggin user"} + @event.payload = { :channel => '#random', :message => 'Looks like its going to rain', username: "Huggin user", fallback: @fallback} @event.save! end @@ -44,12 +47,22 @@ describe Agents::SlackAgent do @checker.options['icon_emoji'] = "something" expect(@checker).to be_valid end + + it "should allow attachments" do + @checker.options['attachments'] = nil + expect(@checker).to be_valid + @checker.options['attachments'] = [] + expect(@checker).to be_valid + @checker.options['attachments'] = @attachments + expect(@checker).to be_valid + end end describe "#receive" do it "receive an event without errors" do any_instance_of(Slack::Notifier) do |obj| mock(obj).ping(@event.payload[:message], + attachments: [{'fallback' => @fallback}], channel: @event.payload[:channel], username: @event.payload[:username] )