123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- module Agents
- class EventFormattingAgent < Agent
- cannot_be_scheduled!
- description <<-MD
- An Event Formatting Agent allows you to format incoming Events, adding new fields as needed.
- For example, here is a possible Event:
- {
- :high => {
- :celsius => "18",
- :fahreinheit => "64"
- },
- :conditions => "Rain showers",
- :data => "This is some data"
- }
- You may want to send this event to another Agent, for example a Twilio Agent, which expects a `message` key.
- You can use an Event Formatting Agent's `instructions` setting to do this in the following way:
- instructions: {
- message: "Today's conditions look like <$.conditions> with a high temperature of <$.high.celsius> degrees Celsius.",
- subject: "$.data"
- }
- JSONPaths must be between < and > . Make sure that you dont use these symbols anywhere else.
- Events generated by this possible Event Formatting Agent will look like:
- {
- :message => "Today's conditions look like Rain showers with a high temperature of 18 degrees Celsius.",
- :subject => "This is some data"
- }
- If you want to retain original contents of events and only add new keys, then set `mode` to `merge`, otherwise set it to `clean`.
- By default, the output event will have `agent` and `created_at` fields as well, reflecting the original Agent type and Event creation time. You can skip these outputs by setting `skip_agent` and `skip_created_at` to `true`.
- MD
- event_description <<-MD
- User defined
- MD
- def validate_options
- errors.add(:base, "instructions, mode, skip_agent, and skip_created_at all need to be present.") unless options[:instructions].present? and options[:mode].present? and options[:skip_agent].present? and options[:skip_created_at].present?
- end
- def default_options
- {
- :instructions => {
- :message => "You received a text <$.text> from <$.fields.from>",
- :content => "Looks like the weather is going to be <$.fields.weather>"},
- :mode => "clean",
- :skip_agent => "false",
- :skip_created_at => "false"
- }
- end
- def working?
- true
- end
- def value_constructor(value, payload)
- value.gsub(/<[^>]+>/).each {|jsonpath| Utils.values_at(payload,jsonpath[1..-2]).first.to_s }
- end
- def receive(incoming_events)
- incoming_events.each do |event|
- formatted_event = options[:mode].to_s == "merge" ? event.payload : {}
- options[:instructions].each_pair {|key, value| formatted_event[key] = value_constructor value, event.payload }
- formatted_event[:agent] = Agent.find(event.agent_id).type.slice!(8..-1) unless options[:skip_agent].to_s == "true"
- formatted_event[:created_at] = event.created_at unless options[:skip_created_at].to_s == "true"
- create_event :payload => formatted_event
- end
- end
- end
- end
|