talker 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -6
- data/bin/talker-cat +6 -9
- data/bin/talker-shell +5 -7
- data/lib/talker.rb +2 -144
- data/lib/talker/cli.rb +1 -1
- data/lib/talker/client.rb +151 -0
- data/spec/spec_helper.rb +2 -2
- data/talker.gemspec +1 -1
- metadata +3 -2
data/README.md
CHANGED
@@ -6,13 +6,9 @@ A real-time Talker Ruby client.
|
|
6
6
|
|
7
7
|
2) Get your Talker Token on https://myaccount.talkerapp.com/settings
|
8
8
|
|
9
|
-
3)
|
9
|
+
3) Serve hot and enjoy
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
4) Serve hot and enjoy
|
14
|
-
|
15
|
-
Talker.connect(:room => ROOM_ID, :token => YOUR_TALKER_TOKEN) do |client|
|
11
|
+
Talker.connect(:room => "Room name", :token => YOUR_TALKER_TOKEN) do |client|
|
16
12
|
client.on_connected do
|
17
13
|
client.send_message "hello!"
|
18
14
|
end
|
data/bin/talker-cat
CHANGED
@@ -1,23 +1,20 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require "talker"
|
2
|
+
require "talker/client"
|
3
3
|
require "talker/cli"
|
4
4
|
|
5
5
|
token = Talker::CLI.load_token
|
6
6
|
room = ARGV.first
|
7
7
|
|
8
8
|
abort <<-EOS unless room
|
9
|
-
usage: echo 'something' | talker-cat <
|
9
|
+
usage: echo 'something' | talker-cat <room name>
|
10
10
|
|
11
|
-
Send a
|
11
|
+
Send the result of a command to a room:
|
12
12
|
|
13
|
-
|
13
|
+
ls lolcats/*.jpg | talker-cat Main
|
14
14
|
|
15
15
|
Send a file to a room:
|
16
16
|
|
17
|
-
talker-cat
|
18
|
-
|
19
|
-
Room ID is the last part of the URL:
|
20
|
-
https://myaccount.talkerapp.com/rooms/<room_id>
|
17
|
+
talker-cat Main < site_fixer.rb
|
21
18
|
|
22
19
|
EOS
|
23
20
|
|
@@ -36,7 +33,7 @@ module Reader
|
|
36
33
|
end
|
37
34
|
end
|
38
35
|
|
39
|
-
Talker.connect(:room => room
|
36
|
+
Talker::Client.connect(:room => room, :token => token) do |client|
|
40
37
|
client.on_connected do
|
41
38
|
conn = EM.watch STDIN, Reader
|
42
39
|
conn.client = client
|
data/bin/talker-shell
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require "talker"
|
2
|
+
require "talker/client"
|
3
3
|
require "talker/cli"
|
4
4
|
|
5
5
|
token = Talker::CLI.load_token
|
@@ -7,13 +7,11 @@ room, cmd, process_name = *ARGV
|
|
7
7
|
process_name ||= cmd
|
8
8
|
|
9
9
|
abort <<-EOS unless room && cmd
|
10
|
-
usage: talker-shell <
|
10
|
+
usage: talker-shell <room name> <command> [name]
|
11
|
+
|
11
12
|
Launch an irb session connected to a room:
|
12
13
|
|
13
|
-
talker-shell
|
14
|
-
|
15
|
-
Room ID is the last part of the URL:
|
16
|
-
https://myaccount.talkerapp.com/rooms/<room_id>
|
14
|
+
talker-shell Main irb
|
17
15
|
|
18
16
|
EOS
|
19
17
|
|
@@ -38,7 +36,7 @@ end
|
|
38
36
|
|
39
37
|
|
40
38
|
EM.run do
|
41
|
-
Talker.connect(:room => room
|
39
|
+
Talker::Client.connect(:room => room, :token => token) do |client|
|
42
40
|
@process = nil
|
43
41
|
|
44
42
|
client.on_connected do
|
data/lib/talker.rb
CHANGED
@@ -1,147 +1,5 @@
|
|
1
|
-
|
2
|
-
require "yajl"
|
3
|
-
|
4
|
-
class Talker < EM::Connection
|
5
|
-
CALLBACKS = %w( connected message private_message join idle back leave presence error close event )
|
6
|
-
|
7
|
-
class Error < RuntimeError; end
|
8
|
-
|
9
|
-
attr_accessor :connect_options, :thread, :current_user
|
10
|
-
|
1
|
+
module Talker
|
11
2
|
def self.connect(options={})
|
12
|
-
|
13
|
-
port = (options.delete(:port) || 8500).to_i
|
14
|
-
|
15
|
-
thread = Thread.new { EM.run } unless EM.reactor_running?
|
16
|
-
|
17
|
-
connection = EM.connect host, port, self do |c|
|
18
|
-
c.thread = thread
|
19
|
-
c.connect_options = options
|
20
|
-
yield c if block_given?
|
21
|
-
end
|
22
|
-
|
23
|
-
thread.join if thread
|
24
|
-
|
25
|
-
connection
|
3
|
+
Client.connect(options)
|
26
4
|
end
|
27
|
-
|
28
|
-
def initialize
|
29
|
-
@users = {}
|
30
|
-
end
|
31
|
-
|
32
|
-
# Callbacks
|
33
|
-
CALLBACKS.each do |method|
|
34
|
-
class_eval <<-EOS
|
35
|
-
def on_#{method}(&block)
|
36
|
-
@on_#{method} = block
|
37
|
-
end
|
38
|
-
EOS
|
39
|
-
end
|
40
|
-
|
41
|
-
def users
|
42
|
-
@users.values
|
43
|
-
end
|
44
|
-
|
45
|
-
def send_message(message, attributes={})
|
46
|
-
send({ :type => "message", :content => message }.merge(attributes))
|
47
|
-
end
|
48
|
-
|
49
|
-
def find_user!(user_name)
|
50
|
-
@users.values.detect { |user| user["name"] == user_name } || raise(Error, "User #{user_name} not found")
|
51
|
-
end
|
52
|
-
|
53
|
-
def send_private_message(to, message)
|
54
|
-
if to.is_a?(String)
|
55
|
-
user_id = find_user!(to)["id"]
|
56
|
-
else
|
57
|
-
user_id = to
|
58
|
-
end
|
59
|
-
send_message message, :to => user_id
|
60
|
-
end
|
61
|
-
|
62
|
-
def leave
|
63
|
-
send :type => "close"
|
64
|
-
close
|
65
|
-
end
|
66
|
-
|
67
|
-
def close
|
68
|
-
close_connection_after_writing
|
69
|
-
end
|
70
|
-
|
71
|
-
|
72
|
-
## EventMachine callbacks
|
73
|
-
|
74
|
-
def connection_completed
|
75
|
-
send @connect_options.merge(:type => "connect")
|
76
|
-
EM.add_periodic_timer(20) { send :type => "ping" }
|
77
|
-
end
|
78
|
-
|
79
|
-
def post_init
|
80
|
-
@parser = Yajl::Parser.new
|
81
|
-
@parser.on_parse_complete = method(:event_parsed)
|
82
|
-
end
|
83
|
-
|
84
|
-
def receive_data(data)
|
85
|
-
@parser << data
|
86
|
-
end
|
87
|
-
|
88
|
-
def unbind
|
89
|
-
trigger :close
|
90
|
-
@thread.kill if @thread
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
private
|
95
|
-
def event_parsed(event)
|
96
|
-
trigger :event, event
|
97
|
-
|
98
|
-
case event["type"]
|
99
|
-
when "connected"
|
100
|
-
@current_user = event["user"]
|
101
|
-
trigger :connected, event["user"]
|
102
|
-
when "error"
|
103
|
-
if @on_error
|
104
|
-
@on_error.call(event["message"])
|
105
|
-
else
|
106
|
-
raise Error, event["message"]
|
107
|
-
end
|
108
|
-
when "users"
|
109
|
-
event["users"].each do |user|
|
110
|
-
@users[user["id"]] = user
|
111
|
-
end
|
112
|
-
trigger :presence, @users.values
|
113
|
-
when "join"
|
114
|
-
@users[event["user"]["id"]] = event["user"]
|
115
|
-
trigger :join, event["user"]
|
116
|
-
when "leave"
|
117
|
-
@users.delete(event["user"]["id"])
|
118
|
-
trigger :leave, event["user"]
|
119
|
-
when "idle"
|
120
|
-
trigger :idle, event["user"]
|
121
|
-
when "back"
|
122
|
-
trigger :back, event["user"]
|
123
|
-
when "message"
|
124
|
-
@users[event["user"]["id"]] ||= event["user"]
|
125
|
-
if event["private"]
|
126
|
-
trigger :private_message, event["user"], event["content"]
|
127
|
-
else
|
128
|
-
trigger :message, event["user"], event["content"]
|
129
|
-
end
|
130
|
-
else
|
131
|
-
raise Error, "unknown event type received from server: " + event["type"]
|
132
|
-
end
|
133
|
-
|
134
|
-
rescue
|
135
|
-
close
|
136
|
-
raise
|
137
|
-
end
|
138
|
-
|
139
|
-
def trigger(callback, *args)
|
140
|
-
callback = instance_variable_get(:"@on_#{callback}")
|
141
|
-
callback.call(*args) if callback
|
142
|
-
end
|
143
|
-
|
144
|
-
def send(data)
|
145
|
-
send_data Yajl::Encoder.encode(data) + "\n"
|
146
|
-
end
|
147
5
|
end
|
data/lib/talker/cli.rb
CHANGED
@@ -0,0 +1,151 @@
|
|
1
|
+
require "eventmachine"
|
2
|
+
require "yajl"
|
3
|
+
|
4
|
+
module Talker
|
5
|
+
class Client < EM::Connection
|
6
|
+
CALLBACKS = %w( connected message private_message join idle back leave presence error close event )
|
7
|
+
|
8
|
+
class Error < RuntimeError; end
|
9
|
+
|
10
|
+
attr_accessor :connect_options, :thread, :current_user
|
11
|
+
|
12
|
+
def self.connect(options={})
|
13
|
+
host = options.delete(:host) || "talkerapp.com"
|
14
|
+
port = (options.delete(:port) || 8500).to_i
|
15
|
+
ssl = options[:ssl] != false
|
16
|
+
|
17
|
+
thread = Thread.new { EM.run } unless EM.reactor_running?
|
18
|
+
|
19
|
+
connection = EM.connect host, port, self do |c|
|
20
|
+
c.start_tls if ssl
|
21
|
+
c.thread = thread
|
22
|
+
c.connect_options = options
|
23
|
+
yield c if block_given?
|
24
|
+
end
|
25
|
+
|
26
|
+
thread.join if thread
|
27
|
+
|
28
|
+
connection
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@users = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
# Callbacks
|
36
|
+
CALLBACKS.each do |method|
|
37
|
+
class_eval <<-EOS
|
38
|
+
def on_#{method}(&block)
|
39
|
+
@on_#{method} = block
|
40
|
+
end
|
41
|
+
EOS
|
42
|
+
end
|
43
|
+
|
44
|
+
def users
|
45
|
+
@users.values
|
46
|
+
end
|
47
|
+
|
48
|
+
def send_message(message, attributes={})
|
49
|
+
send({ :type => "message", :content => message }.merge(attributes))
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_user!(user_name)
|
53
|
+
@users.values.detect { |user| user["name"] == user_name } || raise(Error, "User #{user_name} not found")
|
54
|
+
end
|
55
|
+
|
56
|
+
def send_private_message(to, message)
|
57
|
+
if to.is_a?(String)
|
58
|
+
user_id = find_user!(to)["id"]
|
59
|
+
else
|
60
|
+
user_id = to
|
61
|
+
end
|
62
|
+
send_message message, :to => user_id
|
63
|
+
end
|
64
|
+
|
65
|
+
def leave
|
66
|
+
send :type => "close"
|
67
|
+
close
|
68
|
+
end
|
69
|
+
|
70
|
+
def close
|
71
|
+
close_connection_after_writing
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
## EventMachine callbacks
|
76
|
+
|
77
|
+
def connection_completed
|
78
|
+
send @connect_options.merge(:type => "connect")
|
79
|
+
EM.add_periodic_timer(20) { send :type => "ping" }
|
80
|
+
end
|
81
|
+
|
82
|
+
def post_init
|
83
|
+
@parser = Yajl::Parser.new
|
84
|
+
@parser.on_parse_complete = method(:event_parsed)
|
85
|
+
end
|
86
|
+
|
87
|
+
def receive_data(data)
|
88
|
+
@parser << data
|
89
|
+
end
|
90
|
+
|
91
|
+
def unbind
|
92
|
+
trigger :close
|
93
|
+
@thread.kill if @thread
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
private
|
98
|
+
def event_parsed(event)
|
99
|
+
trigger :event, event
|
100
|
+
|
101
|
+
case event["type"]
|
102
|
+
when "connected"
|
103
|
+
@current_user = event["user"]
|
104
|
+
trigger :connected, event["user"]
|
105
|
+
when "error"
|
106
|
+
if @on_error
|
107
|
+
@on_error.call(event["message"])
|
108
|
+
else
|
109
|
+
raise Error, event["message"]
|
110
|
+
end
|
111
|
+
when "users"
|
112
|
+
event["users"].each do |user|
|
113
|
+
@users[user["id"]] = user
|
114
|
+
end
|
115
|
+
trigger :presence, @users.values
|
116
|
+
when "join"
|
117
|
+
@users[event["user"]["id"]] = event["user"]
|
118
|
+
trigger :join, event["user"]
|
119
|
+
when "leave"
|
120
|
+
@users.delete(event["user"]["id"])
|
121
|
+
trigger :leave, event["user"]
|
122
|
+
when "idle"
|
123
|
+
trigger :idle, event["user"]
|
124
|
+
when "back"
|
125
|
+
trigger :back, event["user"]
|
126
|
+
when "message"
|
127
|
+
@users[event["user"]["id"]] ||= event["user"]
|
128
|
+
if event["private"]
|
129
|
+
trigger :private_message, event["user"], event["content"]
|
130
|
+
else
|
131
|
+
trigger :message, event["user"], event["content"]
|
132
|
+
end
|
133
|
+
else
|
134
|
+
raise Error, "unknown event type received from server: " + event["type"]
|
135
|
+
end
|
136
|
+
|
137
|
+
rescue
|
138
|
+
close
|
139
|
+
raise
|
140
|
+
end
|
141
|
+
|
142
|
+
def trigger(callback, *args)
|
143
|
+
callback = instance_variable_get(:"@on_#{callback}")
|
144
|
+
callback.call(*args) if callback
|
145
|
+
end
|
146
|
+
|
147
|
+
def send(data)
|
148
|
+
send_data Yajl::Encoder.encode(data) + "\n"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,7 @@ require "rubygems"
|
|
2
2
|
require "yaml"
|
3
3
|
require 'spec'
|
4
4
|
$:.unshift File.dirname(__FILE__) + "/../lib"
|
5
|
-
require "talker"
|
5
|
+
require "talker/client"
|
6
6
|
|
7
7
|
# Installing em-spec from http://github.com/macournoyer/em-spec
|
8
8
|
require 'em/spec'
|
@@ -13,7 +13,7 @@ TALKER_CONFIG = YAML.load_file(File.dirname(__FILE__) + "/talker.yml")
|
|
13
13
|
|
14
14
|
module Helpers
|
15
15
|
def connect(&callback)
|
16
|
-
Talker.connect :room => TALKER_CONFIG["room"].to_i, :token => TALKER_CONFIG["token"], &callback
|
16
|
+
Talker::Client.connect :room => TALKER_CONFIG["room"].to_i, :token => TALKER_CONFIG["token"], &callback
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
data/talker.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: talker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc-Andre Cournoyer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-04 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- bin/talker-cat
|
46
46
|
- bin/talker-shell
|
47
47
|
- lib/talker/cli.rb
|
48
|
+
- lib/talker/client.rb
|
48
49
|
- lib/talker.rb
|
49
50
|
- Rakefile
|
50
51
|
- README.md
|