talker 0.0.2 → 0.0.4
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/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
|