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 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