flamethrower 0.3.0 → 0.3.2
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/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/README.rdoc +11 -5
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/flamethrower +1 -1
- data/bin/flamethrowerd +20 -0
- data/flamethrower.gemspec +18 -10
- data/flamethrower.yml.example +6 -0
- data/lib/flamethrower.rb +3 -1
- data/lib/flamethrower/ascii_imager.rb +16 -0
- data/lib/flamethrower/campfire/connection.rb +8 -11
- data/lib/flamethrower/campfire/message.rb +58 -2
- data/lib/flamethrower/campfire/rest_api.rb +15 -8
- data/lib/flamethrower/campfire/room.rb +106 -23
- data/lib/flamethrower/{server.rb → connection.rb} +5 -4
- data/lib/flamethrower/dispatcher.rb +29 -28
- data/lib/flamethrower/irc/codes.rb +1 -0
- data/lib/flamethrower/irc/commands.rb +8 -1
- data/lib/flamethrower/server/event_server.rb +13 -7
- data/lib/flamethrower/server/{mock_server.rb → mock_connection.rb} +6 -2
- data/spec/fixtures/recent_messages.json +1 -0
- data/spec/fixtures/streaming_image_message.json +1 -0
- data/spec/fixtures/tweet_message.json +1 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/campfire/connection_spec.rb +20 -17
- data/spec/unit/campfire/message_spec.rb +66 -0
- data/spec/unit/campfire/room_spec.rb +221 -14
- data/spec/unit/{server_spec.rb → connection_spec.rb} +51 -41
- data/spec/unit/dispatcher_spec.rb +63 -45
- data/spec/unit/irc/channel_spec.rb +3 -3
- data/spec/unit/irc/message_spec.rb +2 -2
- data/spec/unit/server/event_server_spec.rb +20 -1
- metadata +30 -9
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
= Flamethrower: An irc to campfire gateway
|
2
2
|
|
3
|
+
* Now with ASCII art conversion! (Oooo, shiney!)
|
4
|
+
|
3
5
|
Flamethrower gives you the power to use your awesome irc client to
|
4
6
|
talk in your campfire rooms.
|
5
7
|
|
@@ -23,14 +25,18 @@ Then start flamethrower like so:
|
|
23
25
|
|
24
26
|
flamethrower -c ~/myconfig.yml
|
25
27
|
|
26
|
-
|
28
|
+
By default, flamethrower will use the config file located at ~/.flamethrower/config.yml.
|
29
|
+
|
30
|
+
=== Contributing
|
27
31
|
|
28
|
-
Flamethrower is a work in progress.
|
29
|
-
it still needs a lot of love. If you find it useful and would like to see
|
30
|
-
it do something, please submit a patch (with tests please)!. Bug reports are
|
32
|
+
Flamethrower is a constant work in progress. If you find it useful and would like to see it do something, please submit a patch (with tests please)!. Bug reports are
|
31
33
|
also highly appreciated.
|
32
34
|
|
33
|
-
===
|
35
|
+
=== Authors
|
34
36
|
|
35
37
|
Flamethrower is written by Blake Smith <blakesmith0@gmail.com>
|
36
38
|
|
39
|
+
Contributions by:
|
40
|
+
|
41
|
+
Alexander Rakoczy[https://github.com/toothrot]
|
42
|
+
|
data/Rakefile
CHANGED
@@ -22,6 +22,7 @@ begin
|
|
22
22
|
gemspec.add_dependency('json')
|
23
23
|
gemspec.add_dependency('em-http-request')
|
24
24
|
gemspec.add_dependency('twitter-stream')
|
25
|
+
gemspec.add_dependency('daemons')
|
25
26
|
end
|
26
27
|
rescue LoadError
|
27
28
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/bin/flamethrower
CHANGED
@@ -60,7 +60,7 @@ end
|
|
60
60
|
|
61
61
|
FLAMETHROWER_LOGGER = Logger.new(options['logger'] || STDOUT)
|
62
62
|
|
63
|
-
server = Flamethrower::EventServer.new(options
|
63
|
+
server = Flamethrower::EventServer.new(options)
|
64
64
|
|
65
65
|
trap("INT") do
|
66
66
|
FLAMETHROWER_LOGGER.info("Received shutdown signal, killing connections")
|
data/bin/flamethrowerd
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'daemons'
|
5
|
+
|
6
|
+
flamethrower_dir = File.join(ENV["HOME"], '.flamethrower')
|
7
|
+
config = File.join(flamethrower_dir, 'config.yml')
|
8
|
+
options = {
|
9
|
+
:dir => flamethrower_dir,
|
10
|
+
:dir_mode => :normal,
|
11
|
+
:log_output => true,
|
12
|
+
:backtrace => true
|
13
|
+
}
|
14
|
+
|
15
|
+
if File.exists?(config)
|
16
|
+
script = File.join(File.dirname(__FILE__), 'flamethrower')
|
17
|
+
Daemons.run(script, options)
|
18
|
+
else
|
19
|
+
puts "Unable to find config file! Please create $HOME/.flamethrower/config.yml and specify your domain and campfire API token"
|
20
|
+
end
|
data/flamethrower.gemspec
CHANGED
@@ -5,15 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{flamethrower}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Blake Smith"]
|
12
|
-
s.date = %q{
|
13
|
-
s.default_executable = %q{flamethrower}
|
12
|
+
s.date = %q{2012-04-29}
|
14
13
|
s.description = %q{Flamethrower gives you the power to use your awesome irc client to talk in your campfire rooms.}
|
15
14
|
s.email = %q{blakesmith0@gmail.com}
|
16
|
-
s.executables = ["flamethrower"]
|
15
|
+
s.executables = ["flamethrower", "flamethrowerd"]
|
17
16
|
s.extra_rdoc_files = [
|
18
17
|
"README.rdoc"
|
19
18
|
]
|
@@ -27,34 +26,40 @@ Gem::Specification.new do |s|
|
|
27
26
|
"Rakefile",
|
28
27
|
"VERSION",
|
29
28
|
"bin/flamethrower",
|
29
|
+
"bin/flamethrowerd",
|
30
30
|
"flamethrower.gemspec",
|
31
|
+
"flamethrower.yml.example",
|
31
32
|
"lib/flamethrower.rb",
|
33
|
+
"lib/flamethrower/ascii_imager.rb",
|
32
34
|
"lib/flamethrower/campfire/connection.rb",
|
33
35
|
"lib/flamethrower/campfire/message.rb",
|
34
36
|
"lib/flamethrower/campfire/rest_api.rb",
|
35
37
|
"lib/flamethrower/campfire/room.rb",
|
36
38
|
"lib/flamethrower/campfire/user.rb",
|
39
|
+
"lib/flamethrower/connection.rb",
|
37
40
|
"lib/flamethrower/dispatcher.rb",
|
38
41
|
"lib/flamethrower/irc/channel.rb",
|
39
42
|
"lib/flamethrower/irc/codes.rb",
|
40
43
|
"lib/flamethrower/irc/commands.rb",
|
41
44
|
"lib/flamethrower/irc/message.rb",
|
42
45
|
"lib/flamethrower/irc/user.rb",
|
43
|
-
"lib/flamethrower/server.rb",
|
44
46
|
"lib/flamethrower/server/event_server.rb",
|
45
|
-
"lib/flamethrower/server/
|
47
|
+
"lib/flamethrower/server/mock_connection.rb",
|
46
48
|
"spec/fixtures/enter_message.json",
|
47
49
|
"spec/fixtures/kick_message.json",
|
48
50
|
"spec/fixtures/leave_message.json",
|
49
51
|
"spec/fixtures/message.json",
|
50
52
|
"spec/fixtures/paste_message.json",
|
51
53
|
"spec/fixtures/paste_message_with_pound.json",
|
54
|
+
"spec/fixtures/recent_messages.json",
|
52
55
|
"spec/fixtures/room.json",
|
53
56
|
"spec/fixtures/room_update.json",
|
54
57
|
"spec/fixtures/rooms.json",
|
55
58
|
"spec/fixtures/speak_message.json",
|
59
|
+
"spec/fixtures/streaming_image_message.json",
|
56
60
|
"spec/fixtures/streaming_message.json",
|
57
61
|
"spec/fixtures/timestamp_message.json",
|
62
|
+
"spec/fixtures/tweet_message.json",
|
58
63
|
"spec/fixtures/upload_message.json",
|
59
64
|
"spec/fixtures/upload_url_sample",
|
60
65
|
"spec/fixtures/user.json",
|
@@ -63,12 +68,12 @@ Gem::Specification.new do |s|
|
|
63
68
|
"spec/unit/campfire/message_spec.rb",
|
64
69
|
"spec/unit/campfire/room_spec.rb",
|
65
70
|
"spec/unit/campfire/user_spec.rb",
|
71
|
+
"spec/unit/connection_spec.rb",
|
66
72
|
"spec/unit/dispatcher_spec.rb",
|
67
73
|
"spec/unit/irc/channel_spec.rb",
|
68
74
|
"spec/unit/irc/message_spec.rb",
|
69
75
|
"spec/unit/irc/user_spec.rb",
|
70
|
-
"spec/unit/server/event_server_spec.rb"
|
71
|
-
"spec/unit/server_spec.rb"
|
76
|
+
"spec/unit/server/event_server_spec.rb"
|
72
77
|
]
|
73
78
|
s.homepage = %q{http://github.com/blakesmith/flamethrower}
|
74
79
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -81,12 +86,12 @@ Gem::Specification.new do |s|
|
|
81
86
|
"spec/unit/campfire/message_spec.rb",
|
82
87
|
"spec/unit/campfire/room_spec.rb",
|
83
88
|
"spec/unit/campfire/user_spec.rb",
|
89
|
+
"spec/unit/connection_spec.rb",
|
84
90
|
"spec/unit/dispatcher_spec.rb",
|
85
91
|
"spec/unit/irc/channel_spec.rb",
|
86
92
|
"spec/unit/irc/message_spec.rb",
|
87
93
|
"spec/unit/irc/user_spec.rb",
|
88
|
-
"spec/unit/server/event_server_spec.rb"
|
89
|
-
"spec/unit/server_spec.rb"
|
94
|
+
"spec/unit/server/event_server_spec.rb"
|
90
95
|
]
|
91
96
|
|
92
97
|
if s.respond_to? :specification_version then
|
@@ -98,17 +103,20 @@ Gem::Specification.new do |s|
|
|
98
103
|
s.add_runtime_dependency(%q<json>, [">= 0"])
|
99
104
|
s.add_runtime_dependency(%q<em-http-request>, [">= 0"])
|
100
105
|
s.add_runtime_dependency(%q<twitter-stream>, [">= 0"])
|
106
|
+
s.add_runtime_dependency(%q<daemons>, [">= 0"])
|
101
107
|
else
|
102
108
|
s.add_dependency(%q<eventmachine>, [">= 0.12.10"])
|
103
109
|
s.add_dependency(%q<json>, [">= 0"])
|
104
110
|
s.add_dependency(%q<em-http-request>, [">= 0"])
|
105
111
|
s.add_dependency(%q<twitter-stream>, [">= 0"])
|
112
|
+
s.add_dependency(%q<daemons>, [">= 0"])
|
106
113
|
end
|
107
114
|
else
|
108
115
|
s.add_dependency(%q<eventmachine>, [">= 0.12.10"])
|
109
116
|
s.add_dependency(%q<json>, [">= 0"])
|
110
117
|
s.add_dependency(%q<em-http-request>, [">= 0"])
|
111
118
|
s.add_dependency(%q<twitter-stream>, [">= 0"])
|
119
|
+
s.add_dependency(%q<daemons>, [">= 0"])
|
112
120
|
end
|
113
121
|
end
|
114
122
|
|
data/lib/flamethrower.rb
CHANGED
@@ -9,6 +9,8 @@ require 'twitter/json_stream'
|
|
9
9
|
require 'logger'
|
10
10
|
require 'json'
|
11
11
|
|
12
|
+
require 'ascii_imager'
|
13
|
+
|
12
14
|
require 'irc/codes'
|
13
15
|
require 'irc/commands'
|
14
16
|
require 'irc/user'
|
@@ -21,6 +23,6 @@ require 'campfire/message'
|
|
21
23
|
require 'campfire/connection'
|
22
24
|
require 'campfire/room'
|
23
25
|
|
24
|
-
require '
|
26
|
+
require 'connection'
|
25
27
|
require 'server/event_server'
|
26
28
|
require 'dispatcher'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Flamethrower
|
2
|
+
module AsciiImager
|
3
|
+
DEFAULT_IMAGE_ASCII_SERVICE = "http://skeeter.blakesmith.me"
|
4
|
+
DEFAULT_IMAGE_WIDTH = 80
|
5
|
+
|
6
|
+
def image_get(url)
|
7
|
+
host = config['service'] || DEFAULT_IMAGE_ASCII_SERVICE
|
8
|
+
image_width = config['scale_to_width'] || DEFAULT_IMAGE_WIDTH
|
9
|
+
EventMachine::HttpRequest.new(host).get :query => {'image_url' => url, 'width' => image_width}
|
10
|
+
end
|
11
|
+
|
12
|
+
def config
|
13
|
+
@connection.server.ascii_conversion
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -5,10 +5,10 @@ module Flamethrower
|
|
5
5
|
|
6
6
|
include Flamethrower::Campfire::RestApi
|
7
7
|
|
8
|
-
def initialize(domain, token,
|
8
|
+
def initialize(domain, token, connection)
|
9
9
|
@domain = domain
|
10
10
|
@token = token
|
11
|
-
@
|
11
|
+
@connection = connection
|
12
12
|
end
|
13
13
|
|
14
14
|
def fetch_my_user
|
@@ -17,10 +17,10 @@ module Flamethrower
|
|
17
17
|
case http.response_header.status
|
18
18
|
when 200
|
19
19
|
json = JSON.parse(http.response)
|
20
|
-
old_user = @
|
20
|
+
old_user = @connection.current_user.nickname
|
21
21
|
new_user = Flamethrower::Campfire::User.new(json['user']).to_irc
|
22
|
-
@
|
23
|
-
@
|
22
|
+
@connection.current_user = new_user
|
23
|
+
@connection.send_rename(old_user, new_user.nickname)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -34,18 +34,15 @@ module Flamethrower
|
|
34
34
|
json = JSON.parse(http.response)
|
35
35
|
json['rooms'].each do |room|
|
36
36
|
rooms << Room.new(@domain, @token, room).tap do |r|
|
37
|
-
r.
|
37
|
+
r.connection = @connection
|
38
38
|
end
|
39
39
|
end
|
40
|
-
@
|
41
|
-
@
|
40
|
+
@connection.irc_channels = rooms.map(&:to_irc)
|
41
|
+
@connection.send_channel_list
|
42
42
|
else
|
43
43
|
::FLAMETHROWER_LOGGER.debug http.response
|
44
44
|
end
|
45
45
|
end
|
46
|
-
http.errback do
|
47
|
-
@server.send_message @server.reply(Flamethrower::Irc::Codes::RPL_MOTD, ":ERROR: Unable to fetch room list! Check your connection?")
|
48
|
-
end
|
49
46
|
end
|
50
47
|
end
|
51
48
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Flamethrower
|
2
2
|
module Campfire
|
3
3
|
class Message
|
4
|
-
attr_accessor :body, :user, :room, :message_type, :status, :retry_at, :user_id
|
4
|
+
attr_accessor :body, :user, :room, :direction, :message_type, :status, :retry_at, :image_converted, :user_id
|
5
5
|
|
6
6
|
RETRY_SECONDS = 15
|
7
7
|
|
@@ -9,9 +9,11 @@ module Flamethrower
|
|
9
9
|
@body = params['body']
|
10
10
|
@user = params['user']
|
11
11
|
@room = params['room']
|
12
|
-
@user_id = params
|
12
|
+
@user_id = set_user_id(params)
|
13
13
|
@message_type = params['type']
|
14
|
+
@direction = params['direction']
|
14
15
|
@status = "pending"
|
16
|
+
@image_converted = false
|
15
17
|
end
|
16
18
|
|
17
19
|
def mark_delivered!
|
@@ -23,6 +25,48 @@ module Flamethrower
|
|
23
25
|
@retry_at = Time.now + RETRY_SECONDS
|
24
26
|
end
|
25
27
|
|
28
|
+
def mark_pending!
|
29
|
+
@status = "pending"
|
30
|
+
end
|
31
|
+
|
32
|
+
def failed?
|
33
|
+
@status == "failed"
|
34
|
+
end
|
35
|
+
|
36
|
+
def pending?
|
37
|
+
@status == "pending"
|
38
|
+
end
|
39
|
+
|
40
|
+
def outbound?
|
41
|
+
@direction == "outbound"
|
42
|
+
end
|
43
|
+
|
44
|
+
def inbound?
|
45
|
+
@direction == "inbound"
|
46
|
+
end
|
47
|
+
|
48
|
+
def needs_image_conversion?
|
49
|
+
has_images? && !@image_converted
|
50
|
+
end
|
51
|
+
|
52
|
+
def image_urls
|
53
|
+
if @body
|
54
|
+
@body.scan(/(https?:\/\/.+?\.(?:jpg|jpeg|gif|png))/i).flatten
|
55
|
+
else
|
56
|
+
[]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def has_images?
|
61
|
+
image_urls.size > 0
|
62
|
+
end
|
63
|
+
|
64
|
+
def set_ascii_image(str)
|
65
|
+
@body << "\n#{str}"
|
66
|
+
@message_type = "PasteMessage"
|
67
|
+
@image_converted = true
|
68
|
+
end
|
69
|
+
|
26
70
|
def to_irc
|
27
71
|
case message_type
|
28
72
|
when "TextMessage"
|
@@ -50,6 +94,18 @@ module Flamethrower
|
|
50
94
|
end
|
51
95
|
message.join("\r\n")
|
52
96
|
end
|
97
|
+
|
98
|
+
def set_user_id(params)
|
99
|
+
if params['user_id']
|
100
|
+
params['user_id']
|
101
|
+
elsif params['user'].is_a?(User)
|
102
|
+
params['user'].number
|
103
|
+
elsif params['user'] && params['user'].is_a?(Hash)
|
104
|
+
params['user']['id']
|
105
|
+
else
|
106
|
+
nil
|
107
|
+
end
|
108
|
+
end
|
53
109
|
end
|
54
110
|
end
|
55
111
|
end
|
@@ -6,15 +6,14 @@ module Flamethrower
|
|
6
6
|
"https://#{@domain}.campfirenow.com"
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
def http
|
11
|
-
EventMachine::HttpRequest.new(host)
|
12
|
-
end
|
13
|
-
|
14
|
-
def campfire_get(path)
|
9
|
+
def campfire_get(path, args = {})
|
15
10
|
action_log("get", path, nil)
|
16
11
|
full_path = host << path
|
17
|
-
EventMachine::HttpRequest.new(full_path).get
|
12
|
+
http = EventMachine::HttpRequest.new(full_path).get(
|
13
|
+
:head => {'authorization' => [@token, 'x']},
|
14
|
+
:query => args)
|
15
|
+
http.errback { on_connection_error("get", path) }
|
16
|
+
http
|
18
17
|
end
|
19
18
|
|
20
19
|
def campfire_post(path, json=nil)
|
@@ -23,6 +22,8 @@ module Flamethrower
|
|
23
22
|
params = {:head => {'Content-Type' => 'application/json', 'authorization' => [@token, 'x']}}
|
24
23
|
params[:body] = json if json
|
25
24
|
http = EventMachine::HttpRequest.new(full_path).post params
|
25
|
+
http.errback { on_connection_error("post", path) }
|
26
|
+
http
|
26
27
|
end
|
27
28
|
|
28
29
|
def campfire_put(path, json=nil)
|
@@ -30,7 +31,9 @@ module Flamethrower
|
|
30
31
|
full_path = host << path
|
31
32
|
params = {:head => {'Content-Type' => 'application/json', 'authorization' => [@token, 'x']}}
|
32
33
|
params[:body] = json if json
|
33
|
-
EventMachine::HttpRequest.new(full_path).put params
|
34
|
+
http = EventMachine::HttpRequest.new(full_path).put params
|
35
|
+
http.errback { on_connection_error("put", path) }
|
36
|
+
http
|
34
37
|
end
|
35
38
|
|
36
39
|
private
|
@@ -39,6 +42,10 @@ module Flamethrower
|
|
39
42
|
::FLAMETHROWER_LOGGER.debug "Sending #{action.upcase} #{path} with #{json || 'no'} JSON"
|
40
43
|
end
|
41
44
|
|
45
|
+
def on_connection_error(action, path)
|
46
|
+
@connection.send_message @connection.reply(Flamethrower::Irc::Codes::RPL_MOTD, ":ERROR: Unable to make API call #{action.upcase} #{path}. Check your connection?")
|
47
|
+
end
|
48
|
+
|
42
49
|
end
|
43
50
|
end
|
44
51
|
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
module Flamethrower
|
2
2
|
module Campfire
|
3
3
|
class Room
|
4
|
+
MAX_RECONNECT_TIMOUT_SECONDS = 20
|
4
5
|
POLL_SECONDS = 0.5
|
5
6
|
PERIODIC_UPDATE_SECONDS = 60 * 10
|
6
7
|
|
7
8
|
include Flamethrower::Campfire::RestApi
|
9
|
+
include Flamethrower::AsciiImager
|
8
10
|
|
9
11
|
attr_reader :stream, :token
|
10
12
|
attr_writer :topic
|
11
|
-
attr_accessor :inbound_messages, :outbound_messages, :thread_messages, :number, :name, :users, :
|
13
|
+
attr_accessor :inbound_messages, :outbound_messages, :thread_messages, :number, :name, :users, :connection
|
12
14
|
attr_accessor :failed_messages, :joined
|
13
15
|
|
14
16
|
def initialize(domain, token, params = {})
|
@@ -17,6 +19,7 @@ module Flamethrower
|
|
17
19
|
@inbound_messages = Queue.new
|
18
20
|
@outbound_messages = Queue.new
|
19
21
|
@users_to_fetch = Queue.new
|
22
|
+
@images_to_fetch = Queue.new
|
20
23
|
@failed_messages = []
|
21
24
|
@number = params['id']
|
22
25
|
@name = params['name']
|
@@ -39,8 +42,8 @@ module Flamethrower
|
|
39
42
|
end
|
40
43
|
|
41
44
|
def send_info
|
42
|
-
@
|
43
|
-
@
|
45
|
+
@connection.send_topic(to_irc)
|
46
|
+
@connection.send_userlist(to_irc)
|
44
47
|
end
|
45
48
|
|
46
49
|
def fetch_room_info
|
@@ -55,24 +58,42 @@ module Flamethrower
|
|
55
58
|
@users << Flamethrower::Campfire::User.new(user)
|
56
59
|
end
|
57
60
|
resolve_renames(old_users, @users)
|
58
|
-
|
61
|
+
unless @room_info_sent
|
62
|
+
send_info
|
63
|
+
fetch_recent_messages
|
64
|
+
end
|
59
65
|
@room_info_sent = true
|
60
66
|
end
|
61
67
|
end
|
62
68
|
end
|
63
69
|
|
70
|
+
def fetch_recent_messages
|
71
|
+
http = campfire_get("/room/#{@number}/recent.json", :limit => 10)
|
72
|
+
http.callback do
|
73
|
+
case http.response_header.status
|
74
|
+
when 200
|
75
|
+
json = JSON.parse(http.response)
|
76
|
+
json['messages'].each do |json_message|
|
77
|
+
process_inbound_json_message(json_message)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
64
83
|
def resolve_renames(old_users, new_users)
|
65
84
|
old_users.each do |old_user|
|
66
85
|
user = new_users.detect {|new_user| new_user.number == old_user.number}
|
67
|
-
|
68
|
-
|
86
|
+
if user
|
87
|
+
unless old_user.name == user.name
|
88
|
+
@connection.send_rename(old_user.to_irc.nickname, user.to_irc.nickname)
|
89
|
+
end
|
69
90
|
end
|
70
91
|
end
|
71
92
|
end
|
72
93
|
|
73
94
|
def say(body, message_type='TextMessage')
|
74
|
-
params = {'body' => translate_nicknames(body), 'type' => message_type}
|
75
|
-
|
95
|
+
params = {'body' => translate_nicknames(body), 'type' => message_type, 'direction' => 'outbound'}
|
96
|
+
sort_and_dispatch_message(Flamethrower::Campfire::Message.new(params))
|
76
97
|
end
|
77
98
|
|
78
99
|
def start
|
@@ -88,18 +109,20 @@ module Flamethrower
|
|
88
109
|
EventMachine.cancel_timer(@polling_timer)
|
89
110
|
EventMachine.cancel_timer(@periodic_timer)
|
90
111
|
@room_alive = false
|
112
|
+
@room_info_sent = false
|
91
113
|
end
|
92
114
|
|
93
115
|
def poll
|
94
116
|
unless dead?
|
117
|
+
requeue_failed_messages
|
95
118
|
fetch_messages
|
96
119
|
post_messages
|
97
|
-
requeue_failed_messages
|
98
120
|
fetch_users
|
121
|
+
fetch_images
|
99
122
|
messages_to_send = to_irc.retrieve_irc_messages
|
100
123
|
messages_to_send.each do |m|
|
101
124
|
::FLAMETHROWER_LOGGER.debug "Sending irc message #{m.to_s}"
|
102
|
-
@
|
125
|
+
@connection.send_message(m.to_s)
|
103
126
|
end
|
104
127
|
end
|
105
128
|
end
|
@@ -124,20 +147,29 @@ module Flamethrower
|
|
124
147
|
@stream = Twitter::JSONStream.connect(:path => "/room/#{@number}/live.json",
|
125
148
|
:host => "streaming.campfirenow.com",
|
126
149
|
:auth => "#{@token}:x")
|
150
|
+
setup_stream_callbacks
|
127
151
|
end
|
128
152
|
|
129
153
|
def fetch_messages
|
130
154
|
@stream.each_item do |item|
|
131
155
|
::FLAMETHROWER_LOGGER.debug "Got json message #{item.inspect}"
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
156
|
+
process_inbound_json_message(JSON.parse(item))
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def fetch_images
|
161
|
+
until @images_to_fetch.empty?
|
162
|
+
message = @images_to_fetch.pop
|
163
|
+
message.image_urls.each do |url|
|
164
|
+
http = image_get(url)
|
165
|
+
http.callback do
|
166
|
+
case http.response_header.status
|
167
|
+
when 200
|
168
|
+
message.set_ascii_image(http.response)
|
169
|
+
else
|
170
|
+
message.mark_failed!
|
171
|
+
end
|
172
|
+
sort_and_dispatch_message(message)
|
141
173
|
end
|
142
174
|
end
|
143
175
|
end
|
@@ -154,8 +186,10 @@ module Flamethrower
|
|
154
186
|
user = Flamethrower::Campfire::User.new(json['user'])
|
155
187
|
message.user = user
|
156
188
|
@users << user
|
157
|
-
|
189
|
+
else
|
190
|
+
message.mark_failed!
|
158
191
|
end
|
192
|
+
sort_and_dispatch_message(message)
|
159
193
|
end
|
160
194
|
end
|
161
195
|
end
|
@@ -173,7 +207,7 @@ module Flamethrower
|
|
173
207
|
else
|
174
208
|
::FLAMETHROWER_LOGGER.debug "Failed to post to campfire API with code: #{http.response_header.status} body: #{http.response}"
|
175
209
|
message.mark_failed!
|
176
|
-
|
210
|
+
sort_and_dispatch_message(message)
|
177
211
|
end
|
178
212
|
end
|
179
213
|
end
|
@@ -184,7 +218,7 @@ module Flamethrower
|
|
184
218
|
until @inbound_messages.empty?
|
185
219
|
message = @inbound_messages.pop
|
186
220
|
next unless message
|
187
|
-
unless message.user.to_irc.nickname == @
|
221
|
+
unless message.user.to_irc.nickname == @connection.current_user.nickname
|
188
222
|
new_array << message
|
189
223
|
end
|
190
224
|
end
|
@@ -194,7 +228,8 @@ module Flamethrower
|
|
194
228
|
def requeue_failed_messages
|
195
229
|
@failed_messages.each do |m|
|
196
230
|
if m.retry_at > Time.now
|
197
|
-
|
231
|
+
m.mark_pending!
|
232
|
+
sort_and_dispatch_message(m)
|
198
233
|
@failed_messages.delete(m)
|
199
234
|
end
|
200
235
|
end
|
@@ -209,8 +244,50 @@ module Flamethrower
|
|
209
244
|
end
|
210
245
|
end
|
211
246
|
|
247
|
+
def on_reconnect
|
248
|
+
::FLAMETHROWER_LOGGER.debug "Reconnected to #{name} stream"
|
249
|
+
end
|
250
|
+
|
251
|
+
def on_error
|
252
|
+
::FLAMETHROWER_LOGGER.debug "There was an error connecting to #{name} stream"
|
253
|
+
end
|
254
|
+
|
255
|
+
def on_max_reconnects
|
256
|
+
::FLAMETHROWER_LOGGER.debug "Failed to reconnect to #{name}, restarting room in #{MAX_RECONNECT_TIMOUT_SECONDS} seconds"
|
257
|
+
end
|
258
|
+
|
212
259
|
private
|
213
260
|
|
261
|
+
def sort_and_dispatch_message(message)
|
262
|
+
if message.failed?
|
263
|
+
@failed_messages << message
|
264
|
+
elsif message.inbound?
|
265
|
+
sort_and_dispatch_inbound_message(message)
|
266
|
+
else
|
267
|
+
@outbound_messages << message
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def sort_and_dispatch_inbound_message(message)
|
272
|
+
if !message.user
|
273
|
+
@users_to_fetch << message
|
274
|
+
elsif @connection.server.ascii_conversion['enabled'] && message.needs_image_conversion?
|
275
|
+
@images_to_fetch << message
|
276
|
+
else
|
277
|
+
@inbound_messages << message
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def process_inbound_json_message(json_message)
|
282
|
+
json_message['user'] = @users.find {|u| u.number == json_message['user_id'] }
|
283
|
+
json_message['room'] = self
|
284
|
+
json_message['direction'] = 'inbound'
|
285
|
+
message = Flamethrower::Campfire::Message.new(json_message)
|
286
|
+
unless message.message_type == "TimestampMessage"
|
287
|
+
sort_and_dispatch_message(message)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
214
291
|
def translate_nicknames(message_body)
|
215
292
|
@users.each do |user|
|
216
293
|
if message_body.include?(user.to_irc.nickname)
|
@@ -220,6 +297,12 @@ module Flamethrower
|
|
220
297
|
message_body
|
221
298
|
end
|
222
299
|
|
300
|
+
def setup_stream_callbacks
|
301
|
+
@stream.on_reconnect { self.on_reconnect }
|
302
|
+
@stream.on_error { self.on_error }
|
303
|
+
@stream.on_max_reconnects { self.on_max_reconnects }
|
304
|
+
end
|
305
|
+
|
223
306
|
end
|
224
307
|
end
|
225
308
|
end
|