scamp 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +48 -28
- data/examples/bot.rb +27 -21
- data/lib/scamp/action.rb +13 -5
- data/lib/scamp/connection.rb +6 -6
- data/lib/scamp/matcher.rb +29 -6
- data/lib/scamp/messages.rb +31 -0
- data/lib/scamp/rooms.rb +113 -0
- data/lib/scamp/users.rb +7 -15
- data/lib/scamp/version.rb +1 -1
- data/lib/scamp.rb +12 -9
- data/scamp.gemspec +2 -1
- data/spec/lib/scamp_spec.rb +407 -15
- data/spec/spec_helper.rb +7 -1
- metadata +26 -14
- data/lib/scamp/channels.rb +0 -112
data/lib/scamp/channels.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
class Scamp
|
2
|
-
module Channels
|
3
|
-
# TextMessage (regular chat message),
|
4
|
-
# PasteMessage (pre-formatted message, rendered in a fixed-width font),
|
5
|
-
# SoundMessage (plays a sound as determined by the message, which can be either “rimshot”, “crickets”, or “trombone”),
|
6
|
-
# TweetMessage (a Twitter status URL to be fetched and inserted into the chat)
|
7
|
-
|
8
|
-
# curl -vvv -H 'Content-Type: application/json' -d '{"message":{"body":"Yeeeeeaaaaaahh", "type":"Textmessage"}}' -u API_KEY:X https://37s.campfirenow.com/room/293788/speak.json
|
9
|
-
def say(message, channel)
|
10
|
-
url = "https://#{subdomain}.campfirenow.com/room/#{channel_id(channel)}/speak.json"
|
11
|
-
http = EventMachine::HttpRequest.new(url).post :head => {'Content-Type' => 'application/json', 'authorization' => [api_key, 'X']}, :body => Yajl::Encoder.encode({:message => {:body => message, :type => "Textmessage"}})
|
12
|
-
|
13
|
-
http.errback { logger.error "Error speaking: '#{message}' to #{channel_id(channel)}" }
|
14
|
-
end
|
15
|
-
|
16
|
-
def paste(text, channel)
|
17
|
-
end
|
18
|
-
|
19
|
-
def upload
|
20
|
-
end
|
21
|
-
|
22
|
-
def join(channel_id)
|
23
|
-
logger.info "Joining channel #{channel_id}"
|
24
|
-
url = "https://#{subdomain}.campfirenow.com/room/#{channel_id}/join.json"
|
25
|
-
http = EventMachine::HttpRequest.new(url).post :head => {'Content-Type' => 'application/json', 'authorization' => [api_key, 'X']}
|
26
|
-
|
27
|
-
http.errback { logger.error "Error joining channel: #{channel_id}" }
|
28
|
-
http.callback {
|
29
|
-
yield if block_given?
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
def channel_id(channel_id_or_name)
|
34
|
-
if channel_id_or_name.is_a? Integer
|
35
|
-
return channel_id_or_name
|
36
|
-
else
|
37
|
-
return channel_id_from_channel_name(channel_id_or_name)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def channel_name_for(channel_id)
|
42
|
-
data = channel_cache_data(channel_id)
|
43
|
-
return data["name"] if data
|
44
|
-
channel_id.to_s
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def channel_cache_data(channel_id)
|
50
|
-
return channel_cache[channel_id] if channel_cache.has_key? channel_id
|
51
|
-
fetch_channel_data(channel_id)
|
52
|
-
return false
|
53
|
-
end
|
54
|
-
|
55
|
-
def populate_channel_list
|
56
|
-
url = "https://#{subdomain}.campfirenow.com/rooms.json"
|
57
|
-
http = EventMachine::HttpRequest.new(url).get :head => {'authorization' => [api_key, 'X']}
|
58
|
-
http.errback { logger.error "Error populating the channel list: #{http.status.inspect}" }
|
59
|
-
http.callback {
|
60
|
-
new_channels = {}
|
61
|
-
Yajl::Parser.parse(http.response)['rooms'].each do |c|
|
62
|
-
new_channels[c["name"]] = c
|
63
|
-
end
|
64
|
-
# No idea why using the "channels" accessor here doesn't
|
65
|
-
# work but accessing the ivar directly does. There's
|
66
|
-
# Probably a bug.
|
67
|
-
@channels = new_channels # replace existing channel list
|
68
|
-
yield if block_given?
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
def fetch_channel_data(channel_id)
|
73
|
-
logger.debug "Fetching channel data for #{channel_id}"
|
74
|
-
url = "https://#{subdomain}.campfirenow.com/room/#{channel_id}.json"
|
75
|
-
http = EventMachine::HttpRequest.new(url).get :head => {'authorization' => [api_key, 'X']}
|
76
|
-
http.errback { logger.error "Couldn't get data for channel #{channel_id} at url #{url}" }
|
77
|
-
http.callback {
|
78
|
-
logger.debug "Fetched channel data for #{channel_id}"
|
79
|
-
room = Yajl::Parser.parse(http.response)['room']
|
80
|
-
channel_cache[room["id"]] = room
|
81
|
-
room['users'].each do |u|
|
82
|
-
update_user_cache_with(u["id"], u)
|
83
|
-
end
|
84
|
-
}
|
85
|
-
end
|
86
|
-
|
87
|
-
def join_and_stream(id)
|
88
|
-
join(id) do
|
89
|
-
logger.info "Joined channel #{id} successfully"
|
90
|
-
fetch_channel_data(id)
|
91
|
-
stream(id)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def stream(channel_id)
|
96
|
-
json_parser = Yajl::Parser.new :symbolize_keys => true
|
97
|
-
json_parser.on_parse_complete = method(:process_message)
|
98
|
-
|
99
|
-
url = "https://streaming.campfirenow.com/room/#{channel_id}/live.json"
|
100
|
-
# Timeout per https://github.com/igrigorik/em-http-request/wiki/Redirects-and-Timeouts
|
101
|
-
http = EventMachine::HttpRequest.new(url, :connect_timeout => 20, :inactivity_timeout => 0).get :head => {'authorization' => [api_key, 'X']}
|
102
|
-
http.errback { logger.error "Couldn't stream channel #{channel_id} at url #{url}" }
|
103
|
-
http.callback { logger.error "Disconnected from #{url}"; channels_to_join << channel_id}
|
104
|
-
http.stream {|chunk| json_parser << chunk }
|
105
|
-
end
|
106
|
-
|
107
|
-
def channel_id_from_channel_name(channel_name)
|
108
|
-
logger.debug "Looking for channel id for #{channel_name}"
|
109
|
-
channels[channel_name]["id"]
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|