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 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) Find the Room ID you want to connect to. This is the last part of the URL:
9
+ 3) Serve hot and enjoy
10
10
 
11
- https://myaccount.talkerapp.com/rooms/<room_id>
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 <room_id>
9
+ usage: echo 'something' | talker-cat <room name>
10
10
 
11
- Send a message to a room:
11
+ Send the result of a command to a room:
12
12
 
13
- echo 'something' | talker-cat 1
13
+ ls lolcats/*.jpg | talker-cat Main
14
14
 
15
15
  Send a file to a room:
16
16
 
17
- talker-cat 1 < site_fixer.rb
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.to_i, :token => token) do |client|
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 <room_id> <command> [name]
10
+ usage: talker-shell <room name> <command> [name]
11
+
11
12
  Launch an irb session connected to a room:
12
13
 
13
- talker-shell 1 irb
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.to_i, :token => token) do |client|
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
- require "eventmachine"
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
- host = options.delete(:host) || "talkerapp.com"
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
@@ -1,4 +1,4 @@
1
- class Talker
1
+ module Talker
2
2
  class CLI
3
3
  def self.load_token
4
4
  token_path = File.join(ENV['HOME'], '.talker')
@@ -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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "talker"
3
- s.version = "0.0.2"
3
+ s.version = "0.0.4"
4
4
 
5
5
  s.authors = ["Marc-Andre Cournoyer"]
6
6
  s.email = "macournoyer@talkerapp.com"
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.2
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: 2009-12-14 00:00:00 -05:00
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