|
module Agents
class BasecampAgent < Agent
cannot_receive_events!
include Oauthable
valid_oauth_providers :'37signals'
description <<-MD
The BasecampAgent checks a Basecamp project for new Events
To be able to use this Agent you need to authenticate with 37signals in the [Services](/services) section first.
You need to provide the `project_id` of the project you want to monitor.
If you have your Basecamp project opened in your browser you can find the user_id and project_id as follows:
`https://basecamp.com/123456/projects/`
project_id
`-explore-basecamp`
MD
event_description <<-MD
Events are the raw JSON provided by the Basecamp API. Should look something like:
{
"creator": {
"fullsize_avatar_url": "https://dge9rmgqjs8m1.cloudfront.net/global/dfsdfsdfdsf/original.gif?r=3",
"avatar_url": "http://dge9rmgqjs8m1.cloudfront.net/global/dfsdfsdfdsf/avatar.gif?r=3",
"name": "Dominik Sander",
"id": 123456
},
"attachments": [],
"raw_excerpt": "test test",
"excerpt": "test test",
"id": 6454342343,
"created_at": "2014-04-17T10:25:31.000+02:00",
"updated_at": "2014-04-17T10:25:31.000+02:00",
"summary": "commented on whaat",
"action": "commented on",
"target": "whaat",
"url": "https://basecamp.com/12456/api/v1/projects/76454545-explore-basecamp/messages/76454545-whaat.json",
"html_url": "https://basecamp.com/12456/projects/76454545-explore-basecamp/messages/76454545-whaat#comment_76454545"
}
MD
default_schedule "every_10m"
def default_options
{
'project_id' => '',
}
end
def validate_options
errors.add(:base, "you need to specify the basecamp project id of which you want to receive events") unless options['project_id'].present?
end
def working?
(events_count.present? && events_count > 0)
end
def check
service.prepare_request
reponse = HTTParty.get request_url, request_options.merge(query_parameters)
events = JSON.parse(reponse.body)
if !memory[:last_event].nil?
events.each do |event|
create_event :payload => event
end
end
memory[:last_event] = events.first['created_at'] if events.length > 0
save!
end
private
def request_url
"https://basecamp.com/#{URI.encode(service.options[:user_id].to_s)}/api/v1/projects/#{URI.encode(interpolated[:project_id].to_s)}/events.json"
end
def request_options
{:headers => {"User-Agent" => "Huginn (https://github.com/cantino/huginn)", "Authorization" => "Bearer \"#{service.token}\""}}
end
def query_parameters
memory[:last_event].present? ? { :query => {:since => memory[:last_event]} } : {}
end
end
end
|