net-irc 0.0.7 → 0.0.8

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.
@@ -68,12 +68,12 @@ class Net::IRC::Server
68
68
  end
69
69
 
70
70
  # Override subclass.
71
- def avaiable_user_modes
71
+ def available_user_modes
72
72
  "eixwy"
73
73
  end
74
74
 
75
75
  # Override subclass.
76
- def avaiable_channel_modes
76
+ def available_channel_modes
77
77
  "spknm"
78
78
  end
79
79
 
@@ -126,12 +126,14 @@ class Net::IRC::Server
126
126
  # Set @nick.
127
127
  def on_nick(m)
128
128
  @nick = m.params[0]
129
+ @prefix = Prefix.new("#{@nick}!#{@user}@#{@host}") if defined? @prefix
129
130
  end
130
131
 
131
132
  # Default USER callback.
132
133
  # Set @user, @real, @host and call initial_message.
133
134
  def on_user(m)
134
135
  @user, @real = m.params[0], m.params[3]
136
+ @nick ||= @user
135
137
  @host = @socket.peeraddr[2]
136
138
  @prefix = Prefix.new("#{@nick}!#{@user}@#{@host}")
137
139
  initial_message
@@ -164,11 +166,12 @@ class Net::IRC::Server
164
166
  private
165
167
  # Post message to server.
166
168
  #
167
- # include Net::IRC::Constans
169
+ # include Net::IRC::Constants
168
170
  # post prefix, PRIVMSG, "#channel", "foobar"
169
171
  def post(prefix, command, *params)
170
172
  m = Message.new(prefix, command, params.map {|s|
171
- s.gsub(/[\r\n]/, " ")
173
+ #s.gsub(/\r\n|[\r\n]/, " ")
174
+ s.tr("\r\n", " ")
172
175
  })
173
176
  @log.debug "SEND: #{m.to_s.chomp}"
174
177
  @socket << m
@@ -182,7 +185,7 @@ class Net::IRC::Server
182
185
  post server_name, RPL_WELCOME, @nick, "Welcome to the Internet Relay Network #{@prefix}"
183
186
  post server_name, RPL_YOURHOST, @nick, "Your host is #{server_name}, running version #{server_version}"
184
187
  post server_name, RPL_CREATED, @nick, "This server was created #{Time.now}"
185
- post server_name, RPL_MYINFO, @nick, "#{server_name} #{server_version} #{avaiable_user_modes} #{avaiable_channel_modes}"
188
+ post server_name, RPL_MYINFO, @nick, "#{server_name} #{server_version} #{available_user_modes} #{available_channel_modes}"
186
189
  end
187
190
  end
188
191
  end # Server
@@ -168,25 +168,25 @@ describe Net::IRC::Prefix, "" do
168
168
  end
169
169
 
170
170
  describe Net::IRC, "utilities" do
171
- it "has ctcp_encoding method" do
172
- message = ctcp_encoding "ACTION hehe"
171
+ it "has ctcp_encode method" do
172
+ message = ctcp_encode "ACTION hehe"
173
173
  message.should == "\x01ACTION hehe\x01"
174
174
 
175
- message = ctcp_encoding "ACTION \x01 \x5c "
175
+ message = ctcp_encode "ACTION \x01 \x5c "
176
176
  message.should == "\x01ACTION \x5c\x61 \x5c\x5c \x01"
177
177
 
178
- message = ctcp_encoding "ACTION \x00 \x0a \x0d \x10 "
178
+ message = ctcp_encode "ACTION \x00 \x0a \x0d \x10 "
179
179
  message.should == "\x01ACTION \x100 \x10n \x10r \x10\x10 \x01"
180
180
  end
181
181
 
182
- it "has ctcp_decoding method" do
183
- message = ctcp_decoding "\x01ACTION hehe\x01"
182
+ it "has ctcp_decode method" do
183
+ message = ctcp_decode "\x01ACTION hehe\x01"
184
184
  message.should == "ACTION hehe"
185
185
 
186
- message = ctcp_decoding "\x01ACTION \x5c\x61 \x5c\x5c \x01"
186
+ message = ctcp_decode "\x01ACTION \x5c\x61 \x5c\x5c \x01"
187
187
  message.should == "ACTION \x01 \x5c "
188
188
 
189
- message = ctcp_decoding "\x01ACTION \x100 \x10n \x10r \x10\x10 \x01"
189
+ message = ctcp_decode "\x01ACTION \x100 \x10n \x10r \x10\x10 \x01"
190
190
  message.should == "ACTION \x00 \x0a \x0d \x10 "
191
191
  end
192
192
  end
@@ -283,6 +283,31 @@ describe Net::IRC, "server and client" do
283
283
  message.to_s.should == "PRIVMSG #channel :message a b c\r\n"
284
284
  end
285
285
 
286
+ if defined? Encoding
287
+ it "dummy encoding: client posts PRIVMSG and server receives it." do
288
+ @client.instance_eval do
289
+ s = "てすと".force_encoding("UTF-8")
290
+ post PRIVMSG, "#channel", s
291
+ end
292
+
293
+ message = server_q.pop
294
+ message.should be_a_kind_of(Net::IRC::Message)
295
+ message.to_s.should == "PRIVMSG #channel てすと\r\n"
296
+ end
297
+
298
+ it "dummy encoding: client posts PRIVMSG and server receives it." do
299
+ @client.instance_eval do
300
+ s = "てすと".force_encoding("UTF-8")
301
+ s.encode!("ISO-2022-JP")
302
+ post PRIVMSG, "#channel", s
303
+ end
304
+
305
+ message = server_q.pop
306
+ message.should be_a_kind_of(Net::IRC::Message)
307
+ message.to_s.should == "PRIVMSG #channel \e$B$F$9$H\e(B\r\n"
308
+ end
309
+ end
310
+
286
311
  it "should allow lame RPL_WELCOME (not prefix but nick)" do
287
312
  client = @client
288
313
  TestServerSession.instance.instance_eval do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-irc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - cho45
@@ -9,7 +9,7 @@ autorequire: ""
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-19 00:00:00 +09:00
12
+ date: 2009-08-08 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,36 +26,34 @@ files:
26
26
  - README
27
27
  - ChangeLog
28
28
  - Rakefile
29
+ - spec/channel_manager_spec.rb
29
30
  - spec/modeparser_spec.rb
30
31
  - spec/net-irc_spec.rb
31
32
  - spec/spec.opts
32
- - spec/channel_manager_spec.rb
33
33
  - lib/net
34
- - lib/net/irc.rb
35
34
  - lib/net/irc
36
35
  - lib/net/irc/client
37
36
  - lib/net/irc/client/channel_manager.rb
38
- - lib/net/irc/constants.rb
39
- - lib/net/irc/pattern.rb
40
37
  - lib/net/irc/client.rb
41
- - lib/net/irc/server.rb
42
- - lib/net/irc/message.rb
38
+ - lib/net/irc/constants.rb
43
39
  - lib/net/irc/message
44
- - lib/net/irc/message/serverconfig.rb
45
40
  - lib/net/irc/message/modeparser
46
41
  - lib/net/irc/message/modeparser.rb
47
- - examples/gmail.rb
48
- - examples/hatena-star-stream.rb
49
- - examples/sig.rb
50
- - examples/tig.rb
51
- - examples/iig.rb
52
- - examples/lingr.rb
42
+ - lib/net/irc/message/serverconfig.rb
43
+ - lib/net/irc/message.rb
44
+ - lib/net/irc/pattern.rb
45
+ - lib/net/irc/server.rb
46
+ - lib/net/irc.rb
53
47
  - examples/client.rb
54
48
  - examples/echo_bot.rb
49
+ - examples/gmail.rb
50
+ - examples/hatena-star-stream.rb
55
51
  - examples/hig.rb
56
- - examples/nig.rb
52
+ - examples/iig.rb
53
+ - examples/ircd.rb
57
54
  - examples/mixi.rb
58
- - examples/lig.rb
55
+ - examples/sig.rb
56
+ - examples/tig.rb
59
57
  - examples/wig.rb
60
58
  has_rdoc: true
61
59
  homepage: http://lowreal.rubyforge.org
@@ -90,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
88
  requirements: []
91
89
 
92
90
  rubyforge_project: lowreal
93
- rubygems_version: 1.2.0
91
+ rubygems_version: 1.3.1
94
92
  signing_key:
95
93
  specification_version: 2
96
94
  summary: library for implementing IRC server and client
@@ -1,551 +0,0 @@
1
- #!/usr/bin/env ruby
2
- =begin
3
-
4
- # lig.rb
5
-
6
- Lingr IRC Gateway - IRC Gateway to Lingr ( http://www.lingr.com/ )
7
-
8
- ## Launch
9
-
10
- $ ruby lig.rb # daemonized
11
-
12
- If you want to help:
13
-
14
- $ ruby lig.rb --help
15
- Usage: examples/lig.rb [opts]
16
-
17
-
18
- Options:
19
- -p, --port [PORT=16669] port number to listen
20
- -h, --host [HOST=localhost] host name or IP address to listen
21
- -l, --log LOG log file
22
- -a, --api_key API_KEY Your api key on Lingr
23
- --debug Enable debug mode
24
-
25
- ## Configuration
26
-
27
- Configuration example for Tiarra ( http://coderepos.org/share/wiki/Tiarra ).
28
-
29
- lingr {
30
- host: localhost
31
- port: 16669
32
- name: username@example.com (Email on Lingr)
33
- password: password on Lingr
34
- in-encoding: utf8
35
- out-encoding: utf8
36
- }
37
-
38
- Set your email as IRC 'real name' field, and password as server password.
39
- This does not allow anonymous connection to Lingr.
40
- You must create a account on Lingr and get API key (ask it first time).
41
-
42
- ## Client
43
-
44
- This gateway sends multibyte nicknames at Lingr rooms as-is.
45
- So you should use a client which treats it correctly.
46
-
47
- Recommended:
48
-
49
- * LimeChat for OSX ( http://limechat.sourceforge.net/ )
50
- * Irssi ( http://irssi.org/ )
51
- * (gateway) Tiarra ( http://coderepos.org/share/wiki/Tiarra )
52
-
53
- ## Nickname/Mask
54
-
55
- nick -> nickname in a room.
56
- o_id -> occupant_id (unique id in a room)
57
- u_id -> user_id (unique user id in Lingr)
58
-
59
- * Anonymous User: <nick>|<o_id>!anon@lingr.com
60
- * Logged-in User: <nick>|<o_id>!<u_id>@lingr.com
61
- * Your: <nick>|<u_id>!<u_id>@lingr.com
62
-
63
- So you can see some nicknames in same user, but it is needed for
64
- nickname management on client.
65
-
66
- (Lingr allows different nicknames between rooms in a same user, but IRC not)
67
-
68
- ## Licence
69
-
70
- Ruby's by cho45
71
-
72
- ## 備考
73
-
74
- このクライアントで 1000speakers への応募はできません。lingr.com から行ってください。
75
-
76
- =end
77
-
78
- $LOAD_PATH << File.dirname(__FILE__)
79
- $LOAD_PATH << "lib"
80
- $LOAD_PATH << "../lib"
81
-
82
- require "rubygems"
83
- require "lingr"
84
- require "net/irc"
85
- require "pit"
86
- require "mutex_m"
87
-
88
-
89
- class LingrIrcGateway < Net::IRC::Server::Session
90
- def server_name
91
- "lingrgw"
92
- end
93
-
94
- def server_version
95
- "0.0.0"
96
- end
97
-
98
- def initialize(*args)
99
- super
100
- @channels = {}
101
- @channels.extend(Mutex_m)
102
- end
103
-
104
- def on_user(m)
105
- super
106
- @real, *@copts = @real.split(/\s+/)
107
- @copts ||= []
108
-
109
- # Tiarra sends prev nick when reconnects.
110
- @nick.sub!(/\|.+$/, "")
111
-
112
- log "Hello #{@nick}, this is Lingr IRC Gateway."
113
- log "Client Option: #{@copts.join(", ")}"
114
- @log.info "Client Option: #{@copts.join(", ")}"
115
- @log.info "Client initialization is completed."
116
-
117
- @lingr = Lingr::Client.new(@opts.api_key)
118
- @lingr.create_session('human')
119
- @lingr.login(@real, @pass)
120
- @session_observer = Thread.start do
121
- loop do
122
- begin
123
- @log.info "Verifying session..."
124
- @log.info "Verifed session => #{@lingr.verify_session.inspect}"
125
- rescue Lingr::Client::APIError => e
126
- @log.info "Verify session raised APIError<#{e.code}:#{e.message}>. Try to re-create session."
127
- @lingr.create_session('human')
128
- @lingr.login(@real, @pass)
129
- rescue Exception => e
130
- @log.info "Error on verify_session: #{e.inspect}"
131
- end
132
- sleep 9 * 60
133
- end
134
- end
135
- @user_info = @lingr.get_user_info
136
-
137
- prefix = make_ids(@user_info)
138
- @user_info["prefix"] = prefix
139
- post @prefix, NICK, prefix.nick
140
-
141
- rescue Lingr::Client::APIError => e
142
- case e.code
143
- when 105
144
- post nil, ERR_PASSWDMISMATCH, @nick, "Password incorrect"
145
- else
146
- log "Error: #{e.code}: #{e.message}"
147
- end
148
- finish
149
- end
150
-
151
- def on_privmsg(m)
152
- target, message = *m.params
153
- if @channels.key?(target.downcase)
154
- @lingr.say(@channels[target.downcase][:ticket], message)
155
- else
156
- post nil, ERR_NOSUCHNICK, @user_info["prefix"].nick, target, "No such nick/channel"
157
- end
158
- rescue Lingr::Client::APIError => e
159
- log "Error: #{e.code}: #{e.message}"
160
- log "Coundn't say to #{target}."
161
- on_join(Message.new(nil, "JOIN", [target])) if e.code == 102 # invalid session
162
- end
163
-
164
- def on_notice(m)
165
- on_privmsg(m)
166
- end
167
-
168
- def on_whois(m)
169
- nick = m.params[0]
170
- chan = nil
171
- info = nil
172
-
173
- @channels.each do |k, v|
174
- if v[:users].key?(nick)
175
- chan = k
176
- info = v[:users][nick]
177
- break
178
- end
179
- end
180
-
181
- if chan
182
- prefix = info["prefix"]
183
- real_name = info["description"].to_s
184
- server_info = "Lingr: type:#{info["client_type"]} source:#{info["source"]}"
185
- channels = [info["client_type"] == "human" ? "@#{chan}" : chan]
186
- me = @user_info["prefix"]
187
-
188
- post nil, RPL_WHOISUSER, me.nick, prefix.nick, prefix.user, prefix.host, "*", real_name
189
- post nil, RPL_WHOISSERVER, me.nick, prefix.nick, prefix.host, server_info
190
- # post nil, RPL_WHOISOPERATOR, me.nick, prefix.nick, "is an IRC operator"
191
- # post nil, RPL_WHOISIDLE, me.nick, prefix.nick, idle, "seconds idle"
192
- post nil, RPL_WHOISCHANNELS, me.nick, prefix.nick, channels.join(" ")
193
- post nil, RPL_ENDOFWHOIS, me.nick, prefix.nick, "End of WHOIS list"
194
- else
195
- post nil, ERR_NOSUCHNICK, me.nick, nick, "No such nick/channel"
196
- end
197
- rescue Exception => e
198
- @log.error e.inspect
199
- e.backtrace.each do |l|
200
- @log.error "\t#{l}"
201
- end
202
- end
203
-
204
- def on_who(m)
205
- channel = m.params[0]
206
- return unless channel
207
-
208
- info = @channels.synchronize { @channels[channel.downcase] }
209
- me = @user_info["prefix"]
210
- res = @lingr.get_room_info(info[:chan_id], nil, info[:password])
211
- res["occupants"].each do |o|
212
- next unless o["nickname"]
213
- u_id, o_id, prefix = *make_ids(o, true)
214
- op = (o["client_type"] == "human") ? "@" : ""
215
- post nil, RPL_WHOREPLY, me.nick, channel, o_id, "lingr.com", "lingr.com", prefix.nick, "H*#{op}", "0 #{o["description"].to_s.gsub(/\s+/, " ")}"
216
- end
217
- post nil, RPL_ENDOFWHO, me.nick, channel
218
- rescue Lingr::Client::APIError => e
219
- log "Maybe gateway don't know password for channel #{channel}. Please part and join."
220
- end
221
-
222
- def on_join(m)
223
- channels = m.params[0].split(/\s*,\s*/)
224
- password = m.params[1]
225
- channels.each do |channel|
226
- next if @channels.key? channel.downcase
227
- begin
228
- @log.debug "Enter room -> #{channel}"
229
- res = @lingr.enter_room(channel.sub(/^#/, ""), @nick, password)
230
- res["password"] = password
231
-
232
- @channels.synchronize do
233
- create_observer(channel, res)
234
- end
235
- rescue Lingr::Client::APIError => e
236
- log "Error: #{e.code}: #{e.message}"
237
- log "Coundn't join to #{channel}."
238
- if e.code == 102
239
- log "Invalid session... prompt the client to reconnect"
240
- finish
241
- end
242
- rescue Exception => e
243
- @log.error e.inspect
244
- e.backtrace.each do |l|
245
- @log.error "\t#{l}"
246
- end
247
- end
248
- end
249
- end
250
-
251
- def on_part(m)
252
- channel = m.params[0]
253
- info = @channels[channel.downcase]
254
- prefix = @user_info["prefix"]
255
-
256
- if info
257
- info[:observer].kill
258
- @lingr.exit_room(info[:ticket])
259
- @channels.delete(channel.downcase)
260
-
261
- post prefix, PART, channel, "Parted"
262
- else
263
- post nil, ERR_NOSUCHCHANNEL, prefix.nick, channel, "No such channel"
264
- end
265
- rescue Lingr::Client::APIError => e
266
- unless e.code == 102
267
- log "Error: #{e.code}: #{e.message}"
268
- log "Coundn't say to #{target}."
269
-
270
- @channels.delete(channel.downcase)
271
- post prefix, PART, channel, "Parted"
272
- end
273
- end
274
-
275
- def on_disconnected
276
- @channels.each do |k, info|
277
- info[:observer].kill
278
- end
279
- @session_observer.kill rescue nil
280
- begin
281
- @lingr.destroy_session
282
- rescue
283
- end
284
- end
285
-
286
- private
287
-
288
- def create_observer(channel, response)
289
- Thread.start(channel, response) do |chan, res|
290
- myprefix = @user_info["prefix"]
291
- if @channels[chan.downcase]
292
- @channels[chan.downcase][:observer].kill rescue nil
293
- end
294
- @channels[chan.downcase] = {
295
- :ticket => res["ticket"],
296
- :counter => res["room"]["counter"],
297
- :o_id => res["occupant_id"],
298
- :chan_id => res["room"]["id"],
299
- :password => res["password"],
300
- :users => res["occupants"].reject {|i| i["nickname"].nil? }.inject({}) {|r,i|
301
- i["prefix"] = make_ids(i)
302
- r.update(i["prefix"].nick => i)
303
- },
304
- :hcounter => 0,
305
- :observer => Thread.current,
306
- }
307
-
308
- post server_name, TOPIC, chan, "#{res["room"]["url"]} #{res["room"]["description"]}"
309
- post myprefix, JOIN, channel
310
- post server_name, MODE, channel, "+o", myprefix.nick
311
- post nil, RPL_NAMREPLY, myprefix.nick, "=", chan, @channels[chan.downcase][:users].map{|k,v|
312
- v["client_type"] == "human" ? "@#{k}" : k
313
- }.join(" ")
314
- post nil, RPL_ENDOFNAMES, myprefix.nick, chan, "End of NAMES list"
315
-
316
- info = @channels[chan.downcase]
317
- while true
318
- begin
319
- @log.debug "observe_room<#{info[:counter]}><#{chan}> start <- #{myprefix}"
320
- res = @lingr.observe_room info[:ticket], info[:counter]
321
-
322
- info[:counter] = res["counter"] if res["counter"]
323
-
324
- (res["messages"] || []).each do |m|
325
- next if m["id"].to_i <= info[:hcounter]
326
-
327
- u_id, o_id, prefix = *make_ids(m, true)
328
-
329
- case m["type"]
330
- when "user"
331
- # Don't send my messages.
332
- unless info[:o_id] == o_id
333
- post prefix, PRIVMSG, chan, m["text"]
334
- end
335
- when "private"
336
- # TODO not sent from lingr?
337
- post prefix, PRIVMSG, chan, ctcp_encoding("ACTION Sent private: #{m["text"]}")
338
-
339
- # system:{enter,leave,nickname_changed} should not be used for nick management.
340
- # when "system:enter"
341
- # post prefix, PRIVMSG, chan, ctcp_encoding("ACTION #{m["text"]}")
342
- # when "system:leave"
343
- # post prefix, PRIVMSG, chan, ctcp_encoding("ACTION #{m["text"]}")
344
- # when "system:nickname_change"
345
- # post prefix, PRIVMSG, chan, ctcp_encoding("ACTION #{m["text"]}")
346
- when "system:broadcast"
347
- post "system.broadcast", NOTICE, chan, m["text"]
348
- end
349
-
350
- info[:hcounter] = m["id"].to_i if m["id"]
351
- end
352
-
353
- if res["occupants"]
354
- enter = [], leave = []
355
- newusers = res["occupants"].reject {|i| i["nickname"].nil? }.inject({}) {|r,i|
356
- i["prefix"] = make_ids(i)
357
- r.update(i["prefix"].nick => i)
358
- }
359
-
360
-
361
- nickchange = newusers.inject({:new => [], :old => []}) {|r,(k,new)|
362
- old = info[:users].find {|l,old|
363
- # same occupant_id and different nickname
364
- # when nickname was changed and when un-authed user promoted to authed user.
365
- new["prefix"] != old["prefix"] && new["id"] == old["id"]
366
- }
367
- if old
368
- old = old[1]
369
- post old["prefix"], NICK, new["prefix"].nick
370
- r[:old] << old["prefix"].nick
371
- r[:new] << new["prefix"].nick
372
- end
373
- r
374
- }
375
-
376
- entered = newusers.keys - info[:users].keys - nickchange[:new]
377
- leaved = info[:users].keys - newusers.keys - entered - nickchange[:old]
378
-
379
- leaved.each do |leave|
380
- leave = info[:users][leave]
381
- post leave["prefix"], PART, chan, ""
382
- end
383
-
384
- entered.each do |enter|
385
- enter = newusers[enter]
386
- prefix = enter["prefix"]
387
- post prefix, JOIN, chan
388
- if enter["client_type"] == "human"
389
- post server_name, MODE, chan, "+o", prefix.nick
390
- end
391
- end
392
-
393
- info[:users] = newusers
394
- end
395
-
396
-
397
- rescue Lingr::Client::APIError => e
398
- case e.code
399
- when 100
400
- @log.fatal "BUG: API returns invalid HTTP method"
401
- exit 1
402
- when 102
403
- @log.error "BUG: API returns invalid session. Prompt the client to reconnect."
404
- finish
405
- when 104
406
- @log.fatal "BUG: API returns invalid response format. JSON is unsupported?"
407
- exit 1
408
- when 109
409
- @log.error "Error: API returns invalid ticket. Rejoin this channel..."
410
- on_part(Message.new(nil, PART, [chan, res["error"]["message"]]))
411
- on_join(Message.new(nil, JOIN, [chan, info["password"]]))
412
- when 114
413
- @log.fatal "BUG: API returns no counter parameter."
414
- exit 1
415
- when 120
416
- @log.error "Error: API returns invalid encoding. But continues."
417
- when 122
418
- @log.error "Error: API returns repeated counter. But continues."
419
- info[:counter] += 10
420
- log "Error: repeated counter. Some message may be ignored..."
421
- else
422
- # may be socket error?
423
- @log.debug "observe failed : #{res.inspect}"
424
- log "Error: #{e.code}: #{e.message}"
425
- end
426
- rescue Timeout::Error
427
- # pass
428
- rescue JSON::ParserError => e
429
- @log.error e
430
- info[:counter] += 10
431
- log "Error: JSON::ParserError Some message may be ignored..."
432
- rescue Exception => e
433
- @log.error e.inspect
434
- e.backtrace.each do |l|
435
- @log.error "\t#{l}"
436
- end
437
- end
438
- sleep 1
439
- end
440
- end
441
- end
442
-
443
- def log(str)
444
- str.gsub!(/\s/, " ")
445
- begin
446
- post nil, NOTICE, @user_info["prefix"].nick, str
447
- rescue
448
- post nil, NOTICE, @nick, str
449
- end
450
- end
451
-
452
- def make_ids(o, ext=false)
453
- u_id = o["user_id"] || "anon"
454
- o_id = o["occupant_id"] || o["id"]
455
- nick = (o["default_nickname"] || o["nickname"]).gsub(/\s+/, "")
456
- if o["user_id"] == @user_info["user_id"]
457
- nick << "|#{o["user_id"]}"
458
- else
459
- nick << "|#{o["user_id"] ? o_id : "_"+o_id}"
460
- end
461
- pref = Prefix.new("#{nick}!#{u_id}@lingr.com")
462
- ext ? [u_id, o_id, pref] : pref
463
- end
464
- end
465
-
466
-
467
- if __FILE__ == $0
468
- require "rubygems"
469
- require "optparse"
470
- require "pit"
471
-
472
- opts = {
473
- :port => 16669,
474
- :host => "localhost",
475
- :log => nil,
476
- :debug => false,
477
- :foreground => false,
478
- }
479
-
480
- OptionParser.new do |parser|
481
- parser.instance_eval do
482
- self.banner = <<-EOB.gsub(/^\t+/, "")
483
- Usage: #{$0} [opts]
484
-
485
- EOB
486
-
487
- separator ""
488
-
489
- separator "Options:"
490
- on("-p", "--port [PORT=#{opts[:port]}]", "port number to listen") do |port|
491
- opts[:port] = port
492
- end
493
-
494
- on("-h", "--host [HOST=#{opts[:host]}]", "host name or IP address to listen") do |host|
495
- opts[:host] = host
496
- end
497
-
498
- on("-l", "--log LOG", "log file") do |log|
499
- opts[:log] = log
500
- end
501
-
502
- on("-a", "--api_key API_KEY", "Your api key on Lingr") do |key|
503
- opts[:api_key] = key
504
- end
505
-
506
- on("--debug", "Enable debug mode") do |debug|
507
- opts[:log] = $stdout
508
- opts[:debug] = true
509
- end
510
-
511
- on("-f", "--foreground", "run foreground") do |foreground|
512
- opts[:log] = $stdout
513
- opts[:foreground] = true
514
- end
515
-
516
- parse!(ARGV)
517
- end
518
- end
519
-
520
- opts[:logger] = Logger.new(opts[:log], "daily")
521
- opts[:logger].level = opts[:debug] ? Logger::DEBUG : Logger::INFO
522
-
523
- def daemonize(foreground=false)
524
- [:INT, :TERM, :HUP].each do |sig|
525
- Signal.trap sig, "EXIT"
526
- end
527
- return yield if $DEBUG || foreground
528
- Process.fork do
529
- Process.setsid
530
- Dir.chdir "/"
531
- File.open("/dev/null") {|f|
532
- STDIN.reopen f
533
- STDOUT.reopen f, "w"
534
- STDERR.reopen f, "w"
535
- }
536
- yield
537
- end
538
- exit! 0
539
- end
540
-
541
- opts[:api_key] = Pit.get("lig.rb", :require => {
542
- "api_key" => "API key of Lingr"
543
- })["api_key"] unless opts[:api_key]
544
-
545
- daemonize(opts[:debug] || opts[:foreground]) do
546
- Net::IRC::Server.new(opts[:host], opts[:port], LingrIrcGateway, opts).start
547
- end
548
-
549
- end
550
-
551
-