nadoka 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ndk/config.rb +12 -2
- data/ndk/server.rb +8 -3
- data/ndk/version.rb +1 -1
- data/plugins/dictbot.nb +7 -7
- data/plugins/googlebot.nb +14 -7
- data/plugins/messagebot.nb +8 -8
- data/plugins/rss_checkbot.nb +6 -6
- data/plugins/tenkibot.nb +39 -18
- data/rice/irc.rb +18 -6
- metadata +2 -2
data/ndk/config.rb
CHANGED
@@ -420,7 +420,7 @@ module Nadoka
|
|
420
420
|
# use 4 gsub() because of the compatibility of RFC2813(3.2)
|
421
421
|
ch = ch.toeuc.downcase.tr('[]\\~', '{}|^').tojis
|
422
422
|
if ch.respond_to?(:force_encoding)
|
423
|
-
ch.force_encoding(
|
423
|
+
ch.force_encoding(Encoding::ASCII_8BIT)
|
424
424
|
end
|
425
425
|
ch
|
426
426
|
end
|
@@ -478,11 +478,18 @@ module Nadoka
|
|
478
478
|
if format.kind_of? Proc
|
479
479
|
text = format.call(params)
|
480
480
|
elsif format
|
481
|
+
if format.respond_to?(:force_encoding)
|
482
|
+
format.force_encoding(Encoding::ASCII_8BIT)
|
483
|
+
end
|
481
484
|
text = format.gsub(/\{([a-z]+)\}|\{prefix\:([a-z]+)\}/){|key|
|
482
485
|
if $2
|
483
486
|
method = $2.intern
|
484
487
|
if msgobj[:orig].respond_to?(:prefix)
|
485
|
-
|
488
|
+
prefix = msgobj[:orig].prefix || ''
|
489
|
+
if prefix.respond_to?(:force_encoding)
|
490
|
+
prefix.force_encoding(Encoding::ASCII_8BIT)
|
491
|
+
end
|
492
|
+
/^(.+?)\!(.+?)@(.+)/ =~ prefix
|
486
493
|
case method
|
487
494
|
when :nick
|
488
495
|
$1
|
@@ -496,6 +503,9 @@ module Nadoka
|
|
496
503
|
end
|
497
504
|
else
|
498
505
|
if m = msgobj[$1.intern]
|
506
|
+
if m.respond_to?(:force_encoding)
|
507
|
+
m.force_encoding(Encoding::ASCII_8BIT)
|
508
|
+
end
|
499
509
|
m
|
500
510
|
else
|
501
511
|
"!!unknown attribute: #{$1}!!"
|
data/ndk/server.rb
CHANGED
@@ -93,7 +93,7 @@ module Nadoka
|
|
93
93
|
@logger.slog "Connection closed by server. Trying to reconnect."
|
94
94
|
|
95
95
|
sleep @config.reconnect_delay
|
96
|
-
retry
|
96
|
+
retry unless @exitting
|
97
97
|
|
98
98
|
rescue NDK_ReconnectToServer
|
99
99
|
@connected = false
|
@@ -107,7 +107,7 @@ module Nadoka
|
|
107
107
|
@logger.slog "Reconnect request (no server response, or client request)."
|
108
108
|
|
109
109
|
sleep @config.reconnect_delay
|
110
|
-
retry
|
110
|
+
retry unless @exitting
|
111
111
|
|
112
112
|
rescue Exception => e
|
113
113
|
ndk_error e
|
@@ -173,6 +173,8 @@ module Nadoka
|
|
173
173
|
when 'ERROR'
|
174
174
|
msg = "Server login fail!(#{q})"
|
175
175
|
@server_thread.raise NDK_ReconnectToServer
|
176
|
+
when '020'
|
177
|
+
# ignore
|
176
178
|
else
|
177
179
|
msg = "Server login fail!(#{q})"
|
178
180
|
@logger.slog msg
|
@@ -419,9 +421,12 @@ module Nadoka
|
|
419
421
|
}
|
420
422
|
|
421
423
|
begin
|
422
|
-
|
424
|
+
sleep
|
423
425
|
rescue Interrupt
|
424
426
|
@exitting = true
|
427
|
+
rescue Nadoka::NDK_Error
|
428
|
+
@exitting = true
|
429
|
+
raise
|
425
430
|
ensure
|
426
431
|
@server_thread.kill if @server_thread && @server_thread.alive?
|
427
432
|
@clients_thread.kill if @clients_thread && @clients_thread.alive?
|
data/ndk/version.rb
CHANGED
data/plugins/dictbot.nb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- ruby; coding: utf-8 -*- vim:set ft=ruby:
|
1
2
|
=begin
|
2
3
|
|
3
4
|
This plugin is test version.
|
@@ -11,15 +12,16 @@ require 'kconv'
|
|
11
12
|
class DictBot < Nadoka::NDK_Bot
|
12
13
|
def bot_initialize
|
13
14
|
@available_channel = @bot_config[:ch] || /.*/
|
14
|
-
|
15
|
+
@nkf = @bot_config[:nkf] || "-Wj"
|
15
16
|
end
|
16
17
|
|
17
18
|
|
18
19
|
def on_privmsg prefix, ch, msg
|
19
20
|
if @available_channel === ch
|
21
|
+
msg = msg.toutf8
|
20
22
|
if /\Adic(.)>\s*(.+)\s*/ =~ msg
|
21
|
-
res = yahoo_dict $1, $2
|
22
|
-
send_notice(ch, res)
|
23
|
+
res = yahoo_dict $1, $2
|
24
|
+
send_notice(ch, NKF.nkf(@nkf, res))
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -36,10 +38,10 @@ class DictBot < Nadoka::NDK_Bot
|
|
36
38
|
"dict bot> " +
|
37
39
|
if type = YAHOO_DICT_TYPE[type]
|
38
40
|
word = URI.encode(word)
|
39
|
-
uri = "http://dic.yahoo.co.jp/dsearch?p=#{word}&stype=0&dtype=#{type}"
|
41
|
+
uri = "http://dic.yahoo.co.jp/dsearch?ei=UTF-8&p=#{word}&stype=0&dtype=#{type}"
|
40
42
|
open(uri){|f|
|
41
43
|
if /<meta name="description" content=\"(.+?)\">/ =~ f.read
|
42
|
-
"#{$1
|
44
|
+
"#{$1} - #{uri}"
|
43
45
|
else
|
44
46
|
uri
|
45
47
|
end
|
@@ -49,5 +51,3 @@ class DictBot < Nadoka::NDK_Bot
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
52
|
-
|
53
|
-
|
data/plugins/googlebot.nb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# -*-ruby-*-
|
1
|
+
# -*-ruby; coding: utf-8 -*- vim:set ft=ruby:
|
2
2
|
#
|
3
3
|
# Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
|
4
4
|
# Copyright (c) 2009, 2010 Kazuhiro NISHIYAMA
|
@@ -82,8 +82,9 @@ class GoogleBot < Nadoka::NDK_Bot
|
|
82
82
|
def on_privmsg prefix, ch, msg
|
83
83
|
return unless @available_channel === ch
|
84
84
|
return if same_bot?(ch)
|
85
|
+
msg = NKF.nkf('-w', msg)
|
85
86
|
if response = dispatch_command(msg)
|
86
|
-
send_notice(ch, response)
|
87
|
+
send_notice(ch, response.send(@ch_kcode))
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
@@ -181,7 +182,7 @@ class GoogleBot < Nadoka::NDK_Bot
|
|
181
182
|
result.gsub!(/<sup>(.+?)<\/sup>/u) { "^(#{$1})" }
|
182
183
|
result.gsub!(/<.+?>/u, '')
|
183
184
|
result.gsub!(/&\#215;/u, "\303\227")
|
184
|
-
result
|
185
|
+
result
|
185
186
|
else
|
186
187
|
"response error"
|
187
188
|
end
|
@@ -201,7 +202,7 @@ class GoogleBot < Nadoka::NDK_Bot
|
|
201
202
|
result = open(uri, @headers) do |f|
|
202
203
|
JSON.parse(f.read)
|
203
204
|
end
|
204
|
-
result[1].join(", ")
|
205
|
+
result[1].join(", ")
|
205
206
|
end
|
206
207
|
|
207
208
|
def google_code key
|
@@ -310,15 +311,18 @@ class GoogleBot < Nadoka::NDK_Bot
|
|
310
311
|
end
|
311
312
|
|
312
313
|
def show_char_code_and_erase_tag str
|
313
|
-
|
314
|
+
if str.respond_to?(:encode)
|
315
|
+
return CGI.unescapeHTML(erase_tag(str.toutf8))
|
316
|
+
end
|
317
|
+
return CGI.unescapeHTML(erase_tag(str.toeuc))
|
314
318
|
|
315
319
|
case $KCODE
|
316
320
|
when 'EUC', 'SJIS'
|
317
|
-
CGI.unescapeHTML(str.gsub(/\<.+?\>/, ''))
|
321
|
+
CGI.unescapeHTML(str.gsub(/\<.+?\>/, ''))
|
318
322
|
when 'NONE', 'UTF-8'
|
319
323
|
begin
|
320
324
|
str = Iconv.conv("EUC-JP", "UTF-8", str)
|
321
|
-
CGI.unescapeHTML(str.gsub(/\<.+?\>/, ''))
|
325
|
+
CGI.unescapeHTML(str.gsub(/\<.+?\>/, ''))
|
322
326
|
rescue => e
|
323
327
|
"(char code problem: #{e.class}[#{e.message.dump}])"
|
324
328
|
end
|
@@ -328,6 +332,9 @@ class GoogleBot < Nadoka::NDK_Bot
|
|
328
332
|
end
|
329
333
|
|
330
334
|
def search_char_code str
|
335
|
+
if str.respond_to?(:encode)
|
336
|
+
return str.toutf8
|
337
|
+
end
|
331
338
|
case $KCODE
|
332
339
|
when 'EUC', 'SJIS'
|
333
340
|
str.toeuc
|
data/plugins/messagebot.nb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# -*-ruby-*-
|
1
|
+
# -*-ruby; coding: utf-8 -*- vim:set ft=ruby:
|
2
2
|
#
|
3
3
|
# Copyright (C) 2004 Kazuhiro NISHIYAMA
|
4
4
|
# All rights reserved.
|
@@ -14,6 +14,7 @@ BotConfig = [
|
|
14
14
|
:message_file => 'message.yaml',
|
15
15
|
:root_key => Setting_name,
|
16
16
|
:channels => %w[#nadoka #Ruby:*.jp],
|
17
|
+
:nkf => "-Ww",
|
17
18
|
},
|
18
19
|
]
|
19
20
|
=end
|
@@ -29,6 +30,7 @@ class MessageBot < Nadoka::NDK_Bot
|
|
29
30
|
@store = YAML::Store.new(@bot_config[:message_file])
|
30
31
|
@root_key = @bot_config[:root_key]
|
31
32
|
@channels = @bot_config[:channels].collect{|ch| ch.downcase }
|
33
|
+
@nkf = @bot_config[:nkf] || "-WjXm0"
|
32
34
|
load_message
|
33
35
|
end
|
34
36
|
|
@@ -56,7 +58,7 @@ class MessageBot < Nadoka::NDK_Bot
|
|
56
58
|
|
57
59
|
def on_privmsg prefix, ch, msg
|
58
60
|
user = prefix.nick
|
59
|
-
c = NKF.nkf('-
|
61
|
+
c = NKF.nkf('-w', ch.to_s).downcase
|
60
62
|
return unless @channels.include?(c)
|
61
63
|
u = user.downcase
|
62
64
|
now = Time.now
|
@@ -67,14 +69,14 @@ class MessageBot < Nadoka::NDK_Bot
|
|
67
69
|
message_id_list.each do |message_id|
|
68
70
|
h = @message[message_id]
|
69
71
|
next if h.key?('delivered')
|
70
|
-
message = "#{h['from']}
|
71
|
-
send_notice(ch, NKF.nkf(
|
72
|
+
message = "#{h['from']}さんから#{h['to']}さんへ伝言「#{h['body']}」"
|
73
|
+
send_notice(ch, NKF.nkf(@nkf, message))
|
72
74
|
@message[message_id]['delivered'] = now
|
73
75
|
end
|
74
76
|
@list.delete(key)
|
75
77
|
save_message
|
76
78
|
end
|
77
|
-
if
|
79
|
+
if /^伝言 (\S+) (.+)$/ =~ NKF.nkf('-w', msg.to_s)
|
78
80
|
to_nick, body = $1, $2
|
79
81
|
@message[message_id] = {
|
80
82
|
'from' => user,
|
@@ -87,10 +89,8 @@ class MessageBot < Nadoka::NDK_Bot
|
|
87
89
|
@list[key] ||= []
|
88
90
|
@list[key].push(message_id)
|
89
91
|
save_message
|
90
|
-
send_notice(ch, NKF.nkf(
|
92
|
+
send_notice(ch, NKF.nkf(@nkf, "#{$1}さんへの伝言を承りました > #{u}さん"))
|
91
93
|
end
|
92
94
|
end
|
93
95
|
|
94
96
|
end
|
95
|
-
|
96
|
-
|
data/plugins/rss_checkbot.nb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# -*-ruby-*-
|
1
|
+
# -*-ruby; coding: utf-8 -*- vim:set ft=ruby:
|
2
2
|
#
|
3
3
|
# Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
|
4
4
|
#
|
@@ -58,11 +58,11 @@ class RSS_CheckBot < Nadoka::NDK_Bot
|
|
58
58
|
def send_notice(ch, msg)
|
59
59
|
if ch.respond_to? :each
|
60
60
|
ch.each{|c|
|
61
|
-
super(c, msg)
|
61
|
+
super(c, msg.tojis)
|
62
62
|
sleep 5 # Flood Protection
|
63
63
|
}
|
64
64
|
else
|
65
|
-
super(ch, msg)
|
65
|
+
super(ch, msg.tojis)
|
66
66
|
sleep 5 # Flood Protection
|
67
67
|
end
|
68
68
|
end
|
@@ -97,14 +97,15 @@ class RSS_CheckBot < Nadoka::NDK_Bot
|
|
97
97
|
items.each{|e|
|
98
98
|
if e[:ccode] == 'UTF-8'
|
99
99
|
begin
|
100
|
+
# convert from U+FF5E FULLWIDTH TILDE to U+301C WAVE DASH
|
100
101
|
title = e[:title].gsub(/\357\275\236/u, "\343\200\234")
|
101
|
-
title = @ic.iconv(title)
|
102
|
+
title = @ic.iconv(title)
|
102
103
|
rescue Exception
|
103
104
|
# maybe, char code translation error
|
104
105
|
next
|
105
106
|
end
|
106
107
|
else
|
107
|
-
title = e[:title]
|
108
|
+
title = e[:title]
|
108
109
|
end
|
109
110
|
|
110
111
|
send_notice(@ch, "rss bot: #{title} - #{e[:about]}")
|
@@ -118,4 +119,3 @@ class RSS_CheckBot < Nadoka::NDK_Bot
|
|
118
119
|
end
|
119
120
|
|
120
121
|
end
|
121
|
-
|
data/plugins/tenkibot.nb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# -*-ruby-*-
|
1
|
+
# -*-ruby; coding: utf-8 -*- vim:set ft=ruby:
|
2
2
|
#
|
3
3
|
# Copyright (c) 2004-2006 SASADA Koichi <ko1 at atdot.net>
|
4
4
|
#
|
@@ -45,18 +45,14 @@ require 'kconv'
|
|
45
45
|
require 'rexml/document'
|
46
46
|
require 'date'
|
47
47
|
|
48
|
-
|
49
|
-
class TenkiBot < Nadoka::NDK_Bot
|
50
|
-
|
48
|
+
module Tenki
|
51
49
|
CityIDs = {}
|
52
50
|
|
53
|
-
def
|
54
|
-
bot_init_utils
|
55
|
-
|
51
|
+
def init_tenki
|
56
52
|
open('http://weather.livedoor.com/forecast/rss/forecastmap.xml'){|f|
|
57
53
|
f.each{|line|
|
58
54
|
if /city title="(.+?)" id="(\d+)"/ =~ line
|
59
|
-
CityIDs[$1.
|
55
|
+
CityIDs[$1.toutf8] = $2.to_i
|
60
56
|
end
|
61
57
|
}
|
62
58
|
}
|
@@ -69,10 +65,10 @@ class TenkiBot < Nadoka::NDK_Bot
|
|
69
65
|
REXML::Document.new f.read
|
70
66
|
}
|
71
67
|
|
72
|
-
title = doc.elements['/lwws/title/'].text.
|
73
|
-
telop = doc.elements['/lwws/telop/'].text.
|
74
|
-
link = doc.elements['/lwws/link/'].text.
|
75
|
-
desc = doc.elements['/lwws/description/'].text.
|
68
|
+
title = doc.elements['/lwws/title/'].text.toutf8
|
69
|
+
telop = doc.elements['/lwws/telop/'].text.toutf8
|
70
|
+
link = doc.elements['/lwws/link/'].text.toutf8
|
71
|
+
desc = doc.elements['/lwws/description/'].text.toutf8
|
76
72
|
max = doc.elements['/lwws/temperature/max/celsius/'].text
|
77
73
|
min = doc.elements['/lwws/temperature/min/celsius/'].text
|
78
74
|
date = Date.parse(doc.elements['/lwws/forecastdate/'].text)
|
@@ -86,15 +82,42 @@ class TenkiBot < Nadoka::NDK_Bot
|
|
86
82
|
unless celsius.empty?
|
87
83
|
celsius = "(#{celsius.join(', ')}) "
|
88
84
|
end
|
89
|
-
"#{title} (#{datestr}): #{telop} - #{celsius}#{desc} - #{link}"
|
85
|
+
"#{title} (#{datestr}): #{telop} - #{celsius}#{desc} - #{link}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
if __FILE__ == $0
|
90
|
+
include Tenki
|
91
|
+
city = ARGV.shift
|
92
|
+
timing = ARGV.shift || 'today'
|
93
|
+
if city.nil?
|
94
|
+
puts "#$0 city [today|tomorrow|dayaftertomorrow]"
|
95
|
+
else
|
96
|
+
init_tenki
|
97
|
+
begin
|
98
|
+
puts tenki(city, timing)
|
99
|
+
rescue IndexError
|
100
|
+
puts "Unknown city. Check city title on http://weather.livedoor.com/forecast/rss/forecastmap.xml"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
exit
|
104
|
+
end
|
105
|
+
|
106
|
+
class TenkiBot < Nadoka::NDK_Bot
|
107
|
+
include Tenki
|
108
|
+
|
109
|
+
def bot_initialize
|
110
|
+
bot_init_utils
|
111
|
+
init_tenki
|
112
|
+
@nkf = @bot_config[:nkf] || "-Wj"
|
90
113
|
end
|
91
114
|
|
92
115
|
def on_privmsg prefix, ch, msg
|
93
116
|
return unless @available_channel === ch
|
94
117
|
return if same_bot?(ch)
|
95
|
-
|
118
|
+
msg = NKF.nkf('-w', msg)
|
96
119
|
if /\Atenki(|:(today|tomorrow|dayaftertomorrow))>(.+)/ =~ msg
|
97
|
-
city = $3.strip.
|
120
|
+
city = $3.strip.toutf8
|
98
121
|
timing = ($2 || 'today').strip
|
99
122
|
begin
|
100
123
|
result = tenki(city, timing).gsub(/\n/, ' ')
|
@@ -103,9 +126,7 @@ class TenkiBot < Nadoka::NDK_Bot
|
|
103
126
|
rescue => e
|
104
127
|
result = "#{e}"
|
105
128
|
end
|
106
|
-
send_notice ch, "tenki bot: #{result}"
|
129
|
+
send_notice ch, NKF.nkf(@nkf, "tenki bot: #{result}")
|
107
130
|
end
|
108
131
|
end
|
109
132
|
end
|
110
|
-
|
111
|
-
|
data/rice/irc.rb
CHANGED
@@ -555,15 +555,17 @@ module RICE
|
|
555
555
|
str << @command
|
556
556
|
|
557
557
|
if @params
|
558
|
-
f = false
|
559
558
|
@params.each do |param|
|
560
559
|
str << ' '
|
561
|
-
|
560
|
+
param_s = param.to_s
|
561
|
+
if param_s.respond_to?(:force_encoding)
|
562
|
+
param_s = param_s.dup.force_encoding(Encoding::ASCII_8BIT)
|
563
|
+
end
|
564
|
+
if (param == @params[-1]) && (param_s.size == 0 || /\A:|\s/ =~ param_s)
|
562
565
|
str << ':'
|
563
|
-
str <<
|
564
|
-
f = true
|
566
|
+
str << param_s
|
565
567
|
else
|
566
|
-
str <<
|
568
|
+
str << param_s
|
567
569
|
end
|
568
570
|
end
|
569
571
|
end
|
@@ -658,7 +660,13 @@ E
|
|
658
660
|
str << @params[0]
|
659
661
|
|
660
662
|
str << ' :'
|
661
|
-
|
663
|
+
if "".respond_to?(:force_encoding)
|
664
|
+
str << @params[1..-1].map{|param|
|
665
|
+
param.force_encoding(Encoding::ASCII_8BIT)
|
666
|
+
}.join(' ')
|
667
|
+
else
|
668
|
+
str << @params[1..-1].join(' ')
|
669
|
+
end
|
662
670
|
|
663
671
|
str << "\x0D\x0A"
|
664
672
|
str
|
@@ -695,7 +703,11 @@ E
|
|
695
703
|
003,RPL_CREATED
|
696
704
|
004,RPL_MYINFO
|
697
705
|
005,RPL_BOUNCE
|
706
|
+
010,RPL_REDIR
|
707
|
+
015,RPL_MAP 016,RPL_MAPMORE 017,RPL_MAPEND 018,RPL_MAPSTART
|
708
|
+
020,RPL_HELLO 042,RPL_YOURID 043,RPL_SAVENICK
|
698
709
|
302,RPL_USERHOST 303,RPL_ISON 301,RPL_AWAY
|
710
|
+
304,RPL_TEXT
|
699
711
|
305,RPL_UNAWAY 306,RPL_NOWAWAY 311,RPL_WHOISUSER
|
700
712
|
312,RPL_WHOISSERVER 313,RPL_WHOISOPERATOR
|
701
713
|
317,RPL_WHOISIDLE 318,RPL_ENDOFWHOIS
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nadoka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-06-29 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Nadoka is a tool for monitoring and logging IRC conversations and responding
|
16
16
|
to specially formatted requests. You define and customize these responses in Ruby.
|