1
0

event.rb 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # Events are how Huginn Agents communicate and log information about the world. Events can be emitted and received by
  2. # Agents. They contain a serialized `payload` of arbitrary JSON data, as well as optional `lat`, `lng`, and `expires_at`
  3. # fields.
  4. class Event < ActiveRecord::Base
  5. include JSONSerializedField
  6. include LiquidDroppable
  7. attr_accessible :lat, :lng, :payload, :user_id, :user, :expires_at
  8. acts_as_mappable
  9. json_serialize :payload
  10. belongs_to :user
  11. belongs_to :agent, :counter_cache => true
  12. has_many :agent_logs_as_inbound_event, :class_name => "AgentLog", :foreign_key => :inbound_event_id, :dependent => :nullify
  13. has_many :agent_logs_as_outbound_event, :class_name => "AgentLog", :foreign_key => :outbound_event_id, :dependent => :nullify
  14. scope :recent, lambda { |timespan = 12.hours.ago|
  15. where("events.created_at > ?", timespan)
  16. }
  17. after_create :update_agent_last_event_at
  18. after_create :possibly_propagate
  19. scope :expired, lambda {
  20. where("expires_at IS NOT NULL AND expires_at < ?", Time.now)
  21. }
  22. # Emit this event again, as a new Event.
  23. def reemit!
  24. agent.create_event :payload => payload, :lat => lat, :lng => lng
  25. end
  26. # Look for Events whose `expires_at` is present and in the past. Remove those events and then update affected Agents'
  27. # `events_counts` cache columns. This method is called by bin/schedule.rb periodically.
  28. def self.cleanup_expired!
  29. affected_agents = Event.expired.group("agent_id").pluck(:agent_id)
  30. Event.expired.delete_all
  31. Agent.where(:id => affected_agents).update_all "events_count = (select count(*) from events where agent_id = agents.id)"
  32. end
  33. protected
  34. def update_agent_last_event_at
  35. agent.touch :last_event_at
  36. end
  37. def possibly_propagate
  38. #immediately schedule agents that want immediate updates
  39. propagate_ids = agent.receivers.where(:propagate_immediately => true).pluck(:id)
  40. Agent.receive!(:only_receivers => propagate_ids) unless propagate_ids.empty?
  41. end
  42. end
  43. class EventDrop
  44. def initialize(object)
  45. @payload = object.payload
  46. super
  47. end
  48. def before_method(key)
  49. @payload[key]
  50. end
  51. def each(&block)
  52. @payload.each(&block)
  53. end
  54. def agent
  55. @payload.fetch(__method__) {
  56. @object.agent
  57. }
  58. end
  59. def created_at
  60. @payload.fetch(__method__) {
  61. @object.created_at
  62. }
  63. end
  64. end