absentee_camper 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/README.md +77 -0
- data/absentee_camper.gemspec +25 -0
- data/bin/absentee_camper +5 -0
- data/lib/absentee_camper/campfire/api.rb +24 -0
- data/lib/absentee_camper/campfire/room.rb +65 -0
- data/lib/absentee_camper/config.rb +27 -0
- data/lib/absentee_camper/monitor.rb +81 -0
- data/lib/absentee_camper/version.rb +3 -0
- data/lib/absentee_camper.rb +19 -0
- metadata +139 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#Absentee Camper
|
2
|
+
|
3
|
+
This gem will monitor a Campfire room for @mentions, and notify the
|
4
|
+
mentioned users via email if they aren't in the room. Multiple users
|
5
|
+
can be mentioned in one Campfire message, and each user will receive one
|
6
|
+
notification email. The email message will contain the message that was
|
7
|
+
triggered by the @mention.
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
1. `gem install absentee_camper`
|
12
|
+
2. `ABSENTEE_CAMPER_CONFIG=/path/to/config absentee_camper`
|
13
|
+
|
14
|
+
## Monitoring User
|
15
|
+
|
16
|
+
It is recommended to create a user for the sole purpose of monitoring
|
17
|
+
the Campfire room (e.g. Campfire Bot), and use that user's API token when running
|
18
|
+
Absentee Camper. The reason is that if you don't, and instead use the
|
19
|
+
API token of a "real" user, that user will never be able to leave the
|
20
|
+
Campfire room because Absentee Camper will be running under that user.
|
21
|
+
This means that any mentions of that user won't trigger an email since
|
22
|
+
they will always be present in the room.
|
23
|
+
|
24
|
+
## Configuration
|
25
|
+
|
26
|
+
Here is a sample config file:
|
27
|
+
|
28
|
+
---
|
29
|
+
room_id: 12345
|
30
|
+
token: 'your-token'
|
31
|
+
campfire_subdomain: 'your-subdomain'
|
32
|
+
replyto_email_domain: 'your-replyto-domain'
|
33
|
+
users:
|
34
|
+
john: 12345
|
35
|
+
steve: 678910
|
36
|
+
|
37
|
+
* `room_id` - The ID of the room you wish to monitor. This can be found
|
38
|
+
in the URL for the room.
|
39
|
+
* `token` - The API token for the monitoring user.
|
40
|
+
* `campfire_subdomain` - This can be found in the Campfire URL (e.g. _subdomain_.campfirenow.com)
|
41
|
+
* `replyto_email_domain` - The subdomain you would like to appear in the
|
42
|
+
email _from_ address.
|
43
|
+
* `users` - Each user line consists of the name of the mention name and
|
44
|
+
that user's corresponding 37Signals Campfire user ID. One way to get
|
45
|
+
this user ID is to log into Campfire as a user that has admin privileges,
|
46
|
+
click on the _Users_ tab, and then hover over the _change_ link of the
|
47
|
+
user for which you want to find the user ID and take note of the number
|
48
|
+
in the path (e.g. https://_your-company_.campfirenow.com/member/12345/permissions).
|
49
|
+
For example, if you have a user named John Smith with a
|
50
|
+
user ID of 12345, and you want to be able to mention them as _@john_,
|
51
|
+
the users line in the config file would be `john: 12345`.
|
52
|
+
|
53
|
+
## TODO
|
54
|
+
|
55
|
+
* Specs!
|
56
|
+
* Provide context in the notification. For example, in a Campfire
|
57
|
+
session there are two users: John and Steve. Another user, Chad
|
58
|
+
is not present in the room:
|
59
|
+
|
60
|
+
John Smith: Hey Steve. I am having a problem with the build.
|
61
|
+
Steve Stallion: Hey John. I don't know anything about that. You
|
62
|
+
should ask @chad. That's his department.
|
63
|
+
John Smith: Oh, I thought you were the one that handled that. OK,
|
64
|
+
I will wait for Chad's response.
|
65
|
+
|
66
|
+
Currently, the email notification that Absentee Camper sends out will
|
67
|
+
only contain the second message, which doesn't have any context about
|
68
|
+
what was being discussed. It would be nice to set some configuration
|
69
|
+
variables that indicated you wanted to include context in the
|
70
|
+
notification message, and how many lines on either side to include.
|
71
|
+
|
72
|
+
* Provide a means other than email, such as text messaging, to notify
|
73
|
+
the users.
|
74
|
+
|
75
|
+
## Contributing
|
76
|
+
|
77
|
+
Do the usual fork -> change -> pull request dance.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "absentee_camper/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "absentee_camper"
|
7
|
+
s.version = AbsenteeCamper::VERSION
|
8
|
+
s.authors = ["Chad Boyd", "David Reese"]
|
9
|
+
s.email = ["hoverlover@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Monitors a Campfire room for @mentions, and emails the @mentioned user with the message if they aren't in the room.}
|
12
|
+
s.description = s.summary
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_dependency('settingslogic', '~> 2.0')
|
20
|
+
s.add_dependency('yajl-ruby', '~> 0.8')
|
21
|
+
s.add_dependency('httparty', '~> 0.7')
|
22
|
+
s.add_dependency('pony', '~> 1.3')
|
23
|
+
|
24
|
+
s.add_development_dependency('rspec', '~> 2.6.0')
|
25
|
+
end
|
data/bin/absentee_camper
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module AbsenteeCamper
|
2
|
+
module Campfire
|
3
|
+
module API
|
4
|
+
extend self
|
5
|
+
include HTTParty
|
6
|
+
|
7
|
+
base_uri "https://#{Config.campfire_subdomain}.campfirenow.com"
|
8
|
+
basic_auth Config.token, 'x'
|
9
|
+
headers 'Content-Type' => 'application/json'
|
10
|
+
|
11
|
+
def rooms
|
12
|
+
get('/rooms.json')["rooms"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def room(room_id)
|
16
|
+
Room.new(room_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def user(id)
|
20
|
+
get("/users/#{id}.json")["user"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module AbsenteeCamper
|
2
|
+
module Campfire
|
3
|
+
class Room
|
4
|
+
attr_reader :room_id
|
5
|
+
|
6
|
+
def initialize(room_id)
|
7
|
+
@room_id = room_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def join
|
11
|
+
post 'join'
|
12
|
+
end
|
13
|
+
|
14
|
+
def leave
|
15
|
+
post 'leave'
|
16
|
+
end
|
17
|
+
|
18
|
+
def lock
|
19
|
+
post 'lock'
|
20
|
+
end
|
21
|
+
|
22
|
+
def unlock
|
23
|
+
post 'unlock'
|
24
|
+
end
|
25
|
+
|
26
|
+
def message(message)
|
27
|
+
send_message message
|
28
|
+
end
|
29
|
+
|
30
|
+
def paste(paste)
|
31
|
+
send_message paste, 'PasteMessage'
|
32
|
+
end
|
33
|
+
|
34
|
+
def play_sound(sound)
|
35
|
+
send_message sound, 'SoundMessage'
|
36
|
+
end
|
37
|
+
|
38
|
+
def transcript
|
39
|
+
get('transcript')['messages']
|
40
|
+
end
|
41
|
+
|
42
|
+
def info
|
43
|
+
API.get "/room/#{room_id}.json"
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def send_message(message, type = 'Textmessage')
|
49
|
+
post 'speak', :body => {:message => {:body => message, :type => type}}.to_json
|
50
|
+
end
|
51
|
+
|
52
|
+
def get(action, options = {})
|
53
|
+
API.get room_url_for(action), options
|
54
|
+
end
|
55
|
+
|
56
|
+
def post(action, options = {})
|
57
|
+
API.post room_url_for(action), options
|
58
|
+
end
|
59
|
+
|
60
|
+
def room_url_for(action)
|
61
|
+
"/room/#{room_id}/#{action}.json"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module AbsenteeCamper
|
2
|
+
class Config < ::Settingslogic
|
3
|
+
source ENV['ABSENTEE_CAMPER_CONFIG']
|
4
|
+
|
5
|
+
def inititalize
|
6
|
+
Pony.options = {
|
7
|
+
# Uncomment for use with Gmail
|
8
|
+
#
|
9
|
+
#:via => :smtp, :via_options => {
|
10
|
+
#:address => 'smtp.gmail.com',
|
11
|
+
#:port => '587',
|
12
|
+
#:enable_starttls_auto => true,
|
13
|
+
#:user_name => 'your username',
|
14
|
+
#:password => 'your password',
|
15
|
+
#:authentication => :plain, # :plain, :login, :cram_md5, no auth by default
|
16
|
+
#:domain => "localhost.localdomain" # the HELO domain provided by the client to the server
|
17
|
+
#},
|
18
|
+
:from => "campfire-#{room_id}@#{replyto_email_domain}",
|
19
|
+
:subject => '[Campfire] People are talking about you!'
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def room_uri
|
24
|
+
"https://#{campfire_subdomain}.campfirenow.com/room/#{room_id}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module AbsenteeCamper
|
2
|
+
class Monitor
|
3
|
+
include Campfire
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@room = Room.new(Config.room_id)
|
7
|
+
@room.join
|
8
|
+
end
|
9
|
+
|
10
|
+
def users_in_room(room)
|
11
|
+
response = room.info
|
12
|
+
raise "Error while retrieving room info: #{response.message}" if response.code != 200
|
13
|
+
|
14
|
+
room = JSON.parse(response.body)
|
15
|
+
room['room']['users']
|
16
|
+
end
|
17
|
+
|
18
|
+
def user_info(user_id)
|
19
|
+
response = API.get("/users/#{user_id}.json")
|
20
|
+
|
21
|
+
if response.code != 200
|
22
|
+
user_name = Config.users.detect { |kv| kv[1] == user_id }[0]
|
23
|
+
raise "Error while retrieving user info for #{user_name}: #{response.message}"
|
24
|
+
end
|
25
|
+
|
26
|
+
user = JSON.parse(response.body)
|
27
|
+
user['user']
|
28
|
+
end
|
29
|
+
|
30
|
+
def email_body(message)
|
31
|
+
body = <<-BODY
|
32
|
+
Come back to the campfire! We're having a good time telling ghost stories! Here's one you missed:
|
33
|
+
|
34
|
+
#{message}
|
35
|
+
|
36
|
+
#{Config.room_uri}
|
37
|
+
BODY
|
38
|
+
end
|
39
|
+
|
40
|
+
def log(message)
|
41
|
+
puts message
|
42
|
+
end
|
43
|
+
|
44
|
+
def start
|
45
|
+
log "monitoring room #{Config.room_id} at #{API.base_uri} ..."
|
46
|
+
|
47
|
+
url = URI.parse("http://#{Config.token}:x@streaming.campfirenow.com/room/#{Config.room_id}/live.json")
|
48
|
+
|
49
|
+
begin
|
50
|
+
Yajl::HttpStream.get(url) do |message|
|
51
|
+
if message['type'] == 'TextMessage'
|
52
|
+
body = message['body']
|
53
|
+
log body
|
54
|
+
|
55
|
+
body.scan(/@\w+/).each do |mention|
|
56
|
+
mentioned = mention[1..-1]
|
57
|
+
if Config.users.keys.include? mentioned
|
58
|
+
user_id = Config.users[mentioned]
|
59
|
+
|
60
|
+
begin
|
61
|
+
# If the user isn't in the room, fire off an email to them
|
62
|
+
unless users_in_room(@room).map { |u| u['id'] }.include? user_id
|
63
|
+
email_address = user_info(user_id)['email_address']
|
64
|
+
@room.message("[Sent an email to #{mentioned}.]")
|
65
|
+
log "sending email to #{mentioned} at #{email_address}"
|
66
|
+
|
67
|
+
Pony.mail :to => email_address, :body => email_body(body)
|
68
|
+
end
|
69
|
+
rescue
|
70
|
+
log $!
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
rescue Yajl::HttpStream::HttpError => e
|
77
|
+
log "Error connecting to campfire: #{e.message}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "uri"
|
3
|
+
require "yajl/http_stream"
|
4
|
+
require 'httparty'
|
5
|
+
require 'json'
|
6
|
+
require 'pony'
|
7
|
+
require 'settingslogic'
|
8
|
+
|
9
|
+
module AbsenteeCamper
|
10
|
+
autoload :Config, 'absentee_camper/config'
|
11
|
+
autoload :Monitor, 'absentee_camper/monitor'
|
12
|
+
autoload :API, 'absentee_camper/campfire/api'
|
13
|
+
autoload :Room, 'absentee_camper/campfire/room'
|
14
|
+
|
15
|
+
module Campfire
|
16
|
+
autoload :API, 'absentee_camper/campfire/api'
|
17
|
+
autoload :Room, 'absentee_camper/campfire/room'
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: absentee_camper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Chad Boyd
|
13
|
+
- David Reese
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-08-22 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: settingslogic
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 2
|
30
|
+
- 0
|
31
|
+
version: "2.0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: yajl-ruby
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 8
|
44
|
+
version: "0.8"
|
45
|
+
type: :runtime
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: httparty
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
- 7
|
57
|
+
version: "0.7"
|
58
|
+
type: :runtime
|
59
|
+
version_requirements: *id003
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: pony
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 1
|
69
|
+
- 3
|
70
|
+
version: "1.3"
|
71
|
+
type: :runtime
|
72
|
+
version_requirements: *id004
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: rspec
|
75
|
+
prerelease: false
|
76
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ~>
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 2
|
82
|
+
- 6
|
83
|
+
- 0
|
84
|
+
version: 2.6.0
|
85
|
+
type: :development
|
86
|
+
version_requirements: *id005
|
87
|
+
description: Monitors a Campfire room for @mentions, and emails the @mentioned user with the message if they aren't in the room.
|
88
|
+
email:
|
89
|
+
- hoverlover@gmail.com
|
90
|
+
executables:
|
91
|
+
- absentee_camper
|
92
|
+
extensions: []
|
93
|
+
|
94
|
+
extra_rdoc_files: []
|
95
|
+
|
96
|
+
files:
|
97
|
+
- .gitignore
|
98
|
+
- Gemfile
|
99
|
+
- README.md
|
100
|
+
- absentee_camper.gemspec
|
101
|
+
- bin/absentee_camper
|
102
|
+
- lib/absentee_camper.rb
|
103
|
+
- lib/absentee_camper/campfire/api.rb
|
104
|
+
- lib/absentee_camper/campfire/room.rb
|
105
|
+
- lib/absentee_camper/config.rb
|
106
|
+
- lib/absentee_camper/monitor.rb
|
107
|
+
- lib/absentee_camper/version.rb
|
108
|
+
has_rdoc: true
|
109
|
+
homepage: ""
|
110
|
+
licenses: []
|
111
|
+
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.3.6
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Monitors a Campfire room for @mentions, and emails the @mentioned user with the message if they aren't in the room.
|
138
|
+
test_files: []
|
139
|
+
|