123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- module Agents
- class GrowlAgent < Agent
- include FormConfigurable
- attr_reader :growler
- cannot_be_scheduled!
- cannot_create_events!
- can_dry_run!
- gem_dependency_check { defined?(Growl) }
- description <<-MD
- The Growl Agent sends any events it receives to a Growl GNTP server immediately.
- #{'## Include `ruby-growl` in your Gemfile to use this Agent!' if dependencies_missing?}
- The option `message`, which will hold the body of the growl notification, and the `subject` option,
- which will have the headline of the Growl notification are required. All other options are optional.
- When `callback_url` is set to a URL clicking on the notification will open the link in your default browser.
- Set `expected_receive_period_in_days` to the maximum amount of time that you'd expect to pass between
- Events being received by this Agent.
- Have a look at the [Wiki](https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid) to learn
- more about liquid templating.
- MD
- def default_options
- {
- 'growl_server' => 'localhost',
- 'growl_password' => '',
- 'growl_app_name' => 'HuginnGrowl',
- 'growl_notification_name' => 'Notification',
- 'expected_receive_period_in_days' => "2",
- 'subject' => '{{subject}}',
- 'message' => '{{message}}',
- 'sticky' => 'false',
- 'priority' => '0'
- }
- end
- form_configurable :growl_server
- form_configurable :growl_password
- form_configurable :growl_app_name
- form_configurable :growl_notification_name
- form_configurable :expected_receive_period_in_days
- form_configurable :subject
- form_configurable :message, type: :text
- form_configurable :sticky, type: :boolean
- form_configurable :priority
- form_configurable :callback_url
- def working?
- last_receive_at && last_receive_at > options['expected_receive_period_in_days'].to_i.days.ago && !recent_error_logs?
- end
- def validate_options
- unless options['growl_server'].present? && options['expected_receive_period_in_days'].present?
- errors.add(:base, "growl_server and expected_receive_period_in_days are required fields")
- end
- end
- def register_growl
- @growler = Growl::GNTP.new(interpolated['growl_server'], interpolated['growl_app_name'])
- @growler.password = interpolated['growl_password']
- @growler.add_notification(interpolated['growl_notification_name'])
- end
- def notify_growl(subject:, message:, priority:, sticky:, callback_url:)
- @growler.notify(interpolated['growl_notification_name'], subject, message, priority, sticky, nil, callback_url)
- end
- def receive(incoming_events)
- incoming_events.each do |event|
- interpolate_with(event) do
- register_growl
- message = interpolated[:message]
- subject = interpolated[:subject]
- if message.present? && subject.present?
- log "Sending Growl notification '#{subject}': '#{message}' to #{interpolated(event)['growl_server']} with event #{event.id}"
- notify_growl(subject: subject,
- message: message,
- priority: interpolated[:priority].to_i,
- sticky: boolify(interpolated[:sticky]) || false,
- callback_url: interpolated[:callback_url].presence)
- else
- log "Event #{event.id} not sent, message and subject expected"
- end
- end
- end
- end
- end
- end
|