What's new?
|
Help
|
Directory
|
Sign in
lingr
Lingr API
Project Home
Downloads
Wiki
Issues
Source
Checkout
|
Browse
|
Changes
|
Source Path:
svn
/
trunk
/
api
/
toolkits
/
ruby
/
infoteria
/
sample_chat_client.rb
r87
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#
# = sample_chat_client.rb
#
# Lingr API sample
#
# $Revision: 35 $
# $Date: 2007-05-02 11:41:25 -0700 (Wed, 02 May 2007) $
#
require 'api_client'
# A simple command-line chat client that uses the Lingr API
#
module Lingr
class SampleChatClient
def initialize(key, email=nil, password=nil, hostname='www.lingr.com')
@c = ApiClient.new(key, 0, hostname)
@c.create_session('automaton')
if email and password
resp = @c.login(email, password)
@user_observe_thread = Thread.new { user_observe_loop(email) } if resp[:succeeded]
end
end
def go
print_help
while true
print_prompt
$stdin.gets
cmd = $_.split
case cmd[0]
when "help", "?"
print_help
when "enter"
if @ticket
puts "already in a room"
else
resp = @c.enter_room(cmd[1], cmd.length > 2 ? cmd[2] : nil)
if resp[:succeeded]
@ticket = resp[:response]["ticket"]
@counter = resp[:response]["room"]["counter"] if resp[:response]["room"]["counter"]
@me = resp[:response]["occupant_id"]
@roster = {}
@high_counter = 0
@room_observe_thread = Thread.new { room_observe_loop(cmd[1]) }
update_room_status resp[:response]
else
puts "enter failed : #{resp[:response].inspect}"
end
end
when "set_nickname"
if cmd.length > 1
resp = @c.set_nickname(@ticket, cmd[1])
puts "set_nickname failed : #{resp[:response].inspect}" if !resp[:succeeded]
else
puts "no nickname provided"
end
when "say"
if cmd.length > 1
resp = @c.say(@ticket, cmd[1..-1].join(' '))
puts "say failed : #{resp[:response].inspect}" if !resp[:succeeded]
else
puts "no message provided"
end
when "pmx"
if cmd.length > 2 and (occupant_id = @roster.index(cmd[1]))
resp = @c.say(@ticket, cmd[2..-1].join(' '), occupant_id)
else
puts "must supply a valid nickname and message"
end
when "get_messages"
resp = @c.get_messages @ticket, @counter
if resp[:succeeded]
@counter = resp[:response]["counter"]
puts
update_room_status resp[:response]
else
puts "get_messages failed : #{resp[:response].inspect}"
end
when "exit"
if @ticket
@room_observe_thread.exit
@c.exit_room @ticket
@ticket = nil
@counter = nil
@room_observe_thread = nil
end
when "get_room_info"
resp = @c.get_room_info(cmd[1], cmd[2])
if resp[:succeeded]
show_room_info resp[:response]
else
puts "get_room_info failed : #{resp[:response].inspect}"
end
when "verbose"
@c.verbosity = 2
when "quiet"
@c.verbosity = 0
when "quit"
@user_observe_thread.exit if @user_observe_thread
@room_observe_thread.exit if @room_observe_thread
@c.destroy_session
break
else
puts "unrecognized command #{cmd[0]}" if cmd[0]
end
end
end
private
def update_room_status(response)
updated = false
if response["messages"] and response["messages"].length > 0
response["messages"].each do |m|
next if m["id"] and m["id"].to_i <= @high_counter
text = m["text"]
type = m["type"]
if type == 'user' or type == 'private'
occupant_id = m["occupant_id"]
if occupant_id != @me or type == 'private'
updated = true
nickname = m["nickname"]
if type == 'private'
puts "PRIVATE MESSAGE from #{nickname}: #{text}"
else
puts "#{nickname} says: #{text}"
end
end
elsif type.index('system:') == 0
updated = true
puts "SYSTEM: #{text}"
else
puts "unknown message type: #{type}, #{text}"
end
@high_counter = m["id"].to_i if m["id"]
end
else
puts
end
roster_present = !response["occupants"].nil?
new_roster = {}
observers = 0
named = 0
if roster_present
response["occupants"].each do |o|
new_roster[o["id"]] = o["nickname"]
if !o["nickname"].nil?
named += 1
else
observers += 1
end
end
if roster_present and @roster != new_roster
updated = true
@roster = new_roster
puts
puts "Room Occupants"
puts "=============="
@roster.each_value {|n| puts n if n }
puts "#{named > 0 ? "And " : ""}#{observers} anonymous observer#{observers > 1 ? "s" : ""}" if observers > 0
end
end
updated
end
def update_user_status(response)
if response["email"]
puts
puts "User was updated"
puts "================"
puts "email: #{response["email"]}"
puts "default nickname: #{response["default_nickname"]}"
puts "#{response["owned_rooms"].length} owned rooms" if response["owned_rooms"]
puts "#{response["favorite_rooms"].length} favorite rooms" if response["favorite_rooms"]
puts "#{response["visited_rooms"].length} visited rooms" if response["visited_rooms"]
puts "#{response["monitored_rooms"].length} monitored rooms" if response["monitored_rooms"]
puts "#{response["occupied_rooms"].length} occupied rooms" if response["occupied_rooms"]
end
true
end
def show_room_info(resp)
puts resp.inspect
end
def room_observe_loop(name)
puts "Starting observe loop for room #{name}"
while true
resp = @c.observe_room @ticket, @counter
if resp[:succeeded]
@counter = resp[:response]["counter"] if resp[:response]["counter"]
print_prompt if update_room_status(resp[:response])
else
puts "observe failed : #{resp[:response].inspect}"
end
end
end
def user_observe_loop(name)
resp = @c.start_observing_user
puts "Couldn't observe user" and return if !resp[:succeeded]
user_ticket = resp[:response]["ticket"]
user_counter = resp[:response]["counter"]
puts "Starting observe loop for user #{name}"
print_prompt
while true
resp = @c.observe_user user_ticket, user_counter
if resp[:succeeded]
user_counter = resp[:response]["counter"] if resp[:response]["counter"]
print_prompt if update_user_status(resp[:response])
else
puts "observe_user failed : #{resp[:response].inspect}"
end
end
end
def print_help
puts "enter <room_id> [nickname]"
puts "set_nickname <nickname>"
puts "say <message>"
puts "pmx <nickname> <message>"
puts "get_messages"
puts "exit"
puts "get_room_info <room_id> [<counter>]"
puts "verbose"
puts "quiet"
puts "quit"
end
def print_prompt
print "> "
$stdout.flush
end
end
if ARGV.length == 0
puts "usage: simple_chat_client <api_key> [email password host]"
else
SampleChatClient.new(ARGV[0], ARGV[1], ARGV[2], ARGV[3] || 'www.lingr.com').go
end
end
Show details
Hide details
Change log
r76
by dburkes on Oct 06, 2008
Diff
move to Google Code repository
Go to:
/trunk/api
/trunk/api/toolkits
/trunk/api/toolkits/javascript
...pi/toolkits/javascript/infoteria
...ts/javascript/infoteria/lingr.js
...pt/infoteria/lingr.js/README.txt
...ript/infoteria/lingr.js/lingr.js
...nfoteria/lingr.js/lingrtest.html
.../infoteria/lingr.js/prototype.js
...kits/javascript/infoteria/simple
...vascript/infoteria/simple/README
...t/infoteria/simple/api_demo.html
/trunk/api/toolkits/ruby
/trunk/api/toolkits/ruby/infoteria
...i/toolkits/ruby/infoteria/README
...its/ruby/infoteria/api_client.rb
...oolkits/ruby/infoteria/botkit.rb
.../ruby/infoteria/botkit_sample.rb
.../infoteria/sample_chat_client.rb
/trunk/plugins
...lugins/multilingual_ferret_tools
...multilingual_ferret_tools/README
...ltilingual_ferret_tools/Rakefile
...ultilingual_ferret_tools/init.rb
...ns/multilingual_ferret_tools/lib
...ols/lib/multilingual_analyzer.rb
...ools/lib/multilingual_chunker.rb
...ools/lib/multilingual_version.rb
...s/multilingual_ferret_tools/test
...st/multilingual_analyzer_test.rb
...est/multilingual_chunker_test.rb
/trunk/plugins/versioned_urls
...lugins/versioned_urls/README.txt
...k/plugins/versioned_urls/init.rb
/trunk/plugins/versioned_urls/lib
...ioned_urls/lib/versioned_urls.rb
/trunk/plugins/versioned_urls/test
...urls/test/versioned_urls_test.rb
Project members,
sign in
to write a code review
Older revisions
All revisions of this file
File info
Size: 7827 bytes, 272 lines
View raw file