digest_agent.rb 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. module Agents
  2. class DigestAgent < Agent
  3. include FormConfigurable
  4. default_schedule "6am"
  5. description <<-MD
  6. The Digest Agent collects any Events sent to it and emits them as a single event.
  7. The resulting Event will have a payload message of `message`. You can use liquid templating in the `message`, have a look at the [Wiki](https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid) for details.
  8. 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.
  9. MD
  10. event_description <<-MD
  11. Events look like this:
  12. {
  13. "events": [ event list ],
  14. "message": "Your message"
  15. }
  16. MD
  17. def default_options
  18. {
  19. "expected_receive_period_in_days" => "2",
  20. "message" => "{{ events | map: 'message' | join: ',' }}"
  21. }
  22. end
  23. form_configurable :message, type: :text
  24. form_configurable :expected_receive_period_in_days
  25. def working?
  26. last_receive_at && last_receive_at > interpolated["expected_receive_period_in_days"].to_i.days.ago && !recent_error_logs?
  27. end
  28. def receive(incoming_events)
  29. self.memory["queue"] ||= []
  30. incoming_events.each do |event|
  31. self.memory["queue"] << event.id
  32. end
  33. end
  34. def check
  35. if self.memory["queue"] && self.memory["queue"].length > 0
  36. events = received_events.where(id: self.memory["queue"]).order(id: :asc).to_a
  37. payload = { "events" => events.map { |event| event.payload } }
  38. payload["message"] = interpolated(payload)["message"]
  39. create_event :payload => payload
  40. self.memory["queue"] = []
  41. end
  42. end
  43. end
  44. end