absentee_camper 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|