123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- module Agents
- class SlackAgent < Agent
- DEFAULT_WEBHOOK = 'incoming-webhook'
- DEFAULT_USERNAME = 'Huginn'
- cannot_be_scheduled!
- cannot_create_events!
- gem_dependency_check { defined?(Slack) }
- description <<-MD
- #{'## Include `slack-notifier` in your Gemfile to use this Agent!' if dependencies_missing?}
- The SlackAgent lets you receive events and send notifications to [slack](https://slack.com/).
- To get started, you will first need to setup an incoming webhook.
- Go to, https://`your_team_name`.slack.com/services/new/incoming-webhook,
- choose a default channel and add the integration.
- Your webhook URL will look like:
- https://`your_team_name`.slack.com/services/hooks/incoming-webhook?token=`your_auth_token`
- Once the webhook has been setup it can be used to post to other channels or ping team members.
- To send a private message to team-mate, assign his username as `@username` to the channel option.
- To communicate with a different webhook on slack, assign your custom webhook name to the webhook option.
- Messages can also be formatted using [Liquid](https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid)
- MD
- def default_options
- {
- 'team_name' => 'your_team_name',
- 'auth_token' => 'your_auth_token',
- 'channel' => '#general',
- 'username' => DEFAULT_USERNAME,
- 'message' => "Hey there, It's Huginn",
- 'webhook' => DEFAULT_WEBHOOK
- }
- end
- def validate_options
- errors.add(:base, "auth_token is required") unless options['auth_token'].present?
- errors.add(:base, "team_name is required") unless options['team_name'].present?
- errors.add(:base, "channel is required") unless options['channel'].present?
- end
- def working?
- received_event_without_error?
- end
- def webhook
- interpolated[:webhook].presence || DEFAULT_WEBHOOK
- end
- def username
- interpolated[:username].presence || DEFAULT_USERNAME
- end
- def slack_notifier
- @slack_notifier ||= Slack::Notifier.new(interpolated[:team_name], interpolated[:auth_token], webhook, username: username)
- end
- def receive(incoming_events)
- incoming_events.each do |event|
- opts = interpolated(event)
- slack_notifier.ping opts[:message], channel: opts[:channel], username: opts[:username]
- end
- end
- end
- end
|