nadoka 0.8.0

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.
Files changed (54) hide show
  1. data/.gitignore +5 -0
  2. data/ChangeLog.old +1553 -0
  3. data/Gemfile +4 -0
  4. data/README.org +31 -0
  5. data/Rakefile +1 -0
  6. data/bin/nadoka +13 -0
  7. data/lib/rss_check.rb +206 -0
  8. data/lib/tagparts.rb +206 -0
  9. data/nadoka.gemspec +29 -0
  10. data/nadoka.rb +123 -0
  11. data/nadokarc +267 -0
  12. data/ndk/bot.rb +241 -0
  13. data/ndk/client.rb +288 -0
  14. data/ndk/config.rb +571 -0
  15. data/ndk/error.rb +61 -0
  16. data/ndk/logger.rb +311 -0
  17. data/ndk/server.rb +784 -0
  18. data/ndk/server_state.rb +324 -0
  19. data/ndk/version.rb +44 -0
  20. data/plugins/autoawaybot.nb +66 -0
  21. data/plugins/autodumpbot.nb +227 -0
  22. data/plugins/autoop.nb +56 -0
  23. data/plugins/backlogbot.nb +88 -0
  24. data/plugins/checkbot.nb +64 -0
  25. data/plugins/cronbot.nb +20 -0
  26. data/plugins/dictbot.nb +53 -0
  27. data/plugins/drbcl.rb +39 -0
  28. data/plugins/drbot.nb +93 -0
  29. data/plugins/evalbot.nb +49 -0
  30. data/plugins/gonzuibot.nb +41 -0
  31. data/plugins/googlebot.nb +345 -0
  32. data/plugins/identifynickserv.nb +43 -0
  33. data/plugins/mailcheckbot.nb +0 -0
  34. data/plugins/marldiabot.nb +99 -0
  35. data/plugins/messagebot.nb +96 -0
  36. data/plugins/modemanager.nb +150 -0
  37. data/plugins/opensearchbot.nb +156 -0
  38. data/plugins/opshop.nb +23 -0
  39. data/plugins/pastebot.nb +46 -0
  40. data/plugins/roulettebot.nb +33 -0
  41. data/plugins/rss_checkbot.nb +121 -0
  42. data/plugins/samplebot.nb +24 -0
  43. data/plugins/sendpingbot.nb +17 -0
  44. data/plugins/shellbot.nb +59 -0
  45. data/plugins/sixamobot.nb +77 -0
  46. data/plugins/tenkibot.nb +111 -0
  47. data/plugins/timestampbot.nb +62 -0
  48. data/plugins/titlebot.nb +226 -0
  49. data/plugins/translatebot.nb +301 -0
  50. data/plugins/twitterbot.nb +138 -0
  51. data/plugins/weba.nb +209 -0
  52. data/plugins/xibot.nb +113 -0
  53. data/rice/irc.rb +780 -0
  54. metadata +102 -0
@@ -0,0 +1,33 @@
1
+ =begin
2
+
3
+ This plugin is test version.
4
+
5
+ =end
6
+
7
+ require 'shellwords'
8
+ require 'kconv'
9
+
10
+ class RouletteBot < Nadoka::NDK_Bot
11
+ def bot_initialize
12
+ @available_channel = @bot_config[:ch] || /.*/
13
+ end
14
+
15
+ def on_privmsg prefix, ch, msg
16
+ if @available_channel === ch
17
+ if /\Aroulette>\s*(.+)\s*/ =~ msg
18
+ send_notice(ch, "roulette bot: #{randomize($1)[0].tojis}")
19
+ elsif /\Ashuffle>\s*(.+)\s*/ =~ msg
20
+ send_notice(ch, "shuffle bot: #{ randomize($1).join(' ').tojis}")
21
+ elsif /\Arandom>\s*((\d+)|)/ =~ msg
22
+ num = $2 ? $2.to_i : 1000
23
+ send_notice(ch, "random bot: #{prefix.nick} -> #{rand num}")
24
+ end
25
+ end
26
+ end
27
+
28
+ def randomize msgs
29
+ res = Shellwords.shellwords(msgs.toeuc).sort_by{rand}
30
+ end
31
+ end
32
+
33
+
@@ -0,0 +1,121 @@
1
+ # -*-ruby-*-
2
+ #
3
+ # Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
4
+ #
5
+ # This program is free software with ABSOLUTELY NO WARRANTY.
6
+ # You can re-distribute and/or modify this program under
7
+ # the same terms of the Ruby's license.
8
+ #
9
+ #
10
+ # $Id$
11
+ #
12
+
13
+ =begin
14
+ configuration like follows:
15
+
16
+ BotConfig = [
17
+ {
18
+ :name => :RSS_CheckBot,
19
+ :rss_paths =>
20
+ [
21
+ 'http://www.ruby-lang.org/ja/index.rdf',
22
+ ],
23
+ :cache => "./rss-cache",
24
+ :ch => '#nadoka_check',
25
+ :tm => 30 # check interval time(minute)
26
+ :over_message => nil #
27
+ }
28
+
29
+ =end
30
+
31
+ require 'lib/rss_check'
32
+ require 'iconv'
33
+ require 'kconv'
34
+
35
+ class RSS_CheckBot < Nadoka::NDK_Bot
36
+ def bot_initialize
37
+ @cache = File.expand_path(@bot_config.fetch(:cache, '~/.rss_check'))
38
+ @paths = @bot_config.fetch(:rss_paths, ['http://www.ruby-lang.org/ja/index.rdf'])
39
+ @ch = @bot_config.fetch(:ch, '#nadoka_check')
40
+ @tm = @bot_config.fetch(:tm,30) # min
41
+ @over = @bot_config.fetch(:over_message, nil)
42
+ @rssc = RSS_Check.new(@paths, @cache, true)
43
+ @ic = Iconv.open("EUC-JP", "UTF-8")
44
+ @prevtm= Time.now
45
+ end
46
+
47
+ def bot_state
48
+ nt = Time.at(@prevtm.to_i + @tm * 60)
49
+ "<#{self.class}: next check at #{nt.asctime}@#{@ch}>"
50
+ end
51
+
52
+ def __on_privmsg prefix, ch, msg
53
+ if /^rss> check/ =~ msg && ch == @ch && prefix.nick == @state.nick
54
+ make_notice Time.now
55
+ end
56
+ end
57
+
58
+ def send_notice(ch, msg)
59
+ if ch.respond_to? :each
60
+ ch.each{|c|
61
+ super(c, msg)
62
+ sleep 5 # Flood Protection
63
+ }
64
+ else
65
+ super(ch, msg)
66
+ sleep 5 # Flood Protection
67
+ end
68
+ end
69
+
70
+ def on_timer tm
71
+ check
72
+ end
73
+
74
+ def check
75
+ tm = Time.now
76
+ if tm.to_i - @tm * 60 > @prevtm.to_i
77
+ make_notice tm
78
+ end
79
+ end
80
+
81
+ def make_notice tm
82
+ @prevtm = tm
83
+ begin
84
+ items = @rssc.check
85
+ @rssc.save
86
+ rescue => e
87
+ send_notice(@ch, "rss bot error: #{e}")
88
+ @manager.ndk_error e
89
+ return
90
+ end
91
+ make_notice_thread items
92
+ end
93
+
94
+ def make_notice_thread items
95
+ Thread.new{
96
+ begin
97
+ items.each{|e|
98
+ if e[:ccode] == 'UTF-8'
99
+ begin
100
+ title = e[:title].gsub(/\357\275\236/u, "\343\200\234")
101
+ title = @ic.iconv(title).tojis
102
+ rescue Exception
103
+ # maybe, char code translation error
104
+ next
105
+ end
106
+ else
107
+ title = e[:title].tojis
108
+ end
109
+
110
+ send_notice(@ch, "rss bot: #{title} - #{e[:about]}")
111
+ }
112
+ rescue Exception => e
113
+ send_notice(@ch, "rss bot error: #{e}")
114
+ @manager.ndk_error e
115
+ end
116
+ send_notice(@ch, "rss bot: #{@over}") if @over
117
+ }
118
+ end
119
+
120
+ end
121
+
@@ -0,0 +1,24 @@
1
+ # -*-ruby-*-
2
+ #
3
+ # Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
4
+ #
5
+ # This program is free software with ABSOLUTELY NO WARRANTY.
6
+ # You can re-distribute and/or modify this program under
7
+ # the same terms of the Ruby's license.
8
+ #
9
+ #
10
+ # $Id$
11
+ #
12
+
13
+ # bot_file_name and BotClassName must be same name
14
+ # (BotClassName.downcase == bot_file_name)
15
+
16
+ class SampleBot < Nadoka::NDK_Bot
17
+
18
+ # Yes person
19
+ def on_privmsg prefix, ch, msg
20
+ send_notice(ch, "Yes, #{prefix.nick}!")
21
+ end
22
+
23
+ end
24
+
@@ -0,0 +1,17 @@
1
+ # -*-ruby-*-
2
+ #
3
+ # Copyright (c) 2004-2006 SASADA Koichi <ko1 at atdot.net>
4
+ #
5
+ # This program is free software with ABSOLUTELY NO WARRANTY.
6
+ # You can re-distribute and/or modify this program under
7
+ # the same terms of the Ruby's license.
8
+ #
9
+ #
10
+ #
11
+
12
+ class SendPingBot < Nadoka::NDK_Bot
13
+ def on_timer *args
14
+ @manager.ping_to_clients
15
+ end
16
+ end
17
+
@@ -0,0 +1,59 @@
1
+ # -*-ruby-*-
2
+ #
3
+ # Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
4
+ #
5
+ # This program is free software with ABSOLUTELY NO WARRANTY.
6
+ # You can re-distribute and/or modify this program under
7
+ # the same terms of the Ruby's license.
8
+ #
9
+ #
10
+ # shell command bot
11
+ #
12
+ # $Id$
13
+ #
14
+
15
+ require 'timeout'
16
+ require 'kconv'
17
+
18
+ class ShellBot < Nadoka::NDK_Bot
19
+ ShellNick = 'nadoka_shell'
20
+
21
+ def on_client_privmsg client, ch, message
22
+
23
+ if ch == ShellNick
24
+ ans = exec_shell(message)
25
+ ans.each{|line|
26
+ msg = Cmd.privmsg(@state.nick, 'ans: ' + line)
27
+ client.send_to_client client.add_prefix(msg, ShellNick)
28
+ }
29
+ raise ::Nadoka::NDK_BotSendCancel
30
+ end
31
+ end
32
+
33
+ def on_nadoka_command client, command, *params
34
+ if command == 'shell'
35
+ msg = Cmd.privmsg(@state.nick, 'Hello, this is shell command executor')
36
+ client.send_to_client client.add_prefix(msg, ShellNick)
37
+ raise ::Nadoka::NDK_BotSendCancel
38
+ end
39
+ end
40
+
41
+ def exec_shell message
42
+ begin
43
+ ans = Thread.new{
44
+ begin
45
+ timeout(3){
46
+ str = `#{message}`.to_s
47
+ str.tojis
48
+ }
49
+ rescue Exception => e
50
+ e.message
51
+ end
52
+ }.value
53
+ rescue Exception => e
54
+ ans = e.message
55
+ end
56
+ end
57
+ end
58
+
59
+
@@ -0,0 +1,77 @@
1
+ #-*-ruby-*-
2
+ #
3
+ # Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
4
+ #
5
+ # This program is free software with ABSOLUTELY NO WARRANTY.
6
+ # You can re-distribute and/or modify this program under
7
+ # the same terms of the Ruby's license.
8
+ #
9
+ #
10
+ # Sixamo bot
11
+ #
12
+ # add config like this:
13
+ #
14
+ =begin
15
+ BotConfig = [
16
+ {
17
+ :name => :SixamoBot,
18
+ :dir => '~/sixamo',
19
+ :ch => '#nadoka',
20
+ :tm => 10,
21
+ :id => /(sixamo)|(�������)/,
22
+ :rt => [10, 5, 4, 4, 3, 2],
23
+ }
24
+ =end
25
+ #
26
+ # $Id$
27
+ #
28
+
29
+ require 'sixamo'
30
+ require 'kconv'
31
+ class SixamoBot < Nadoka::NDK_Bot
32
+ def bot_initialize
33
+ @sixamo_dir = @bot_config[:dir] || '~/sixamo'
34
+ @sixamo_ch = @bot_config[:ch] || '#nadoka'
35
+ @sixamo_tm = @bot_config[:tm] || 10
36
+ @sixamo_id = @bot_config[:id] || /(sixamo)|(�������)/
37
+ @sixamo_rt = @bot_config[:rt] || [10, 5, 4, 4, 3, 2]
38
+ @prev = Time.now
39
+ make_sixamo
40
+ end
41
+
42
+ def make_sixamo
43
+ @sixamo = Sixamo.new(File.expand_path(@sixamo_dir))
44
+ end
45
+
46
+ def on_privmsg prefix, ch, msg
47
+ return unless @sixamo_ch === ch
48
+
49
+ begin
50
+ msg = Kconv.toeuc(msg)
51
+ @sixamo.memorize msg
52
+
53
+ unless @sixamo_id === msg
54
+ rnd = case Time.now - @prev
55
+ when 0..10; @sixamo_rt[0]
56
+ when 10..20; @sixamo_rt[1]
57
+ when 20..30; @sixamo_rt[2]
58
+ when 30..60; @sixamo_rt[3]
59
+ when 60..120;@sixamo_rt[4]
60
+ else ; @sixamo_rt[5]
61
+ end
62
+
63
+ return if Kernel.rand(rnd) != 1
64
+ end
65
+ @prev = Time.now
66
+
67
+ talk = @sixamo.talk(msg)
68
+ @sixamo.memorize talk
69
+
70
+ send_notice ch, 'sixamo: ' + talk.tojis
71
+ rescue
72
+ make_sixamo
73
+ end
74
+
75
+ end
76
+ end
77
+
@@ -0,0 +1,111 @@
1
+ # -*-ruby-*-
2
+ #
3
+ # Copyright (c) 2004-2006 SASADA Koichi <ko1 at atdot.net>
4
+ #
5
+ # This program is free software with ABSOLUTELY NO WARRANTY.
6
+ # You can re-distribute and/or modify this program under
7
+ # the same terms of the Ruby's license.
8
+ #
9
+
10
+ =begin
11
+
12
+ == Abstract
13
+
14
+ Answer weather information using "Livedoor Weather Web Service / LWWS".
15
+
16
+ LWWS: http://weather.livedoor.com/weather_hacks/webservice.html
17
+
18
+
19
+ == Usage
20
+
21
+ tenki> [CITY]
22
+ tenki:[today|tomorrow|dayaftertomorrow]> [CITY]
23
+
24
+ [CITY] should be city name in Kanji listed on following table.
25
+ http://weather.livedoor.com/forecast/rss/forecastmap.xml
26
+
27
+ If timing is not specified, show today's information.
28
+
29
+
30
+ == Configuration
31
+
32
+ BotConfig = [
33
+ {
34
+ :name => :TenkiBot,
35
+ :ch => /nadoka/, # default: /.*/
36
+ }
37
+ ]
38
+
39
+
40
+ =end
41
+
42
+ require 'open-uri'
43
+ require 'pp'
44
+ require 'kconv'
45
+ require 'rexml/document'
46
+ require 'date'
47
+
48
+
49
+ class TenkiBot < Nadoka::NDK_Bot
50
+
51
+ CityIDs = {}
52
+
53
+ def bot_initialize
54
+ bot_init_utils
55
+
56
+ open('http://weather.livedoor.com/forecast/rss/forecastmap.xml'){|f|
57
+ f.each{|line|
58
+ if /city title="(.+?)" id="(\d+)"/ =~ line
59
+ CityIDs[$1.toeuc] = $2.to_i
60
+ end
61
+ }
62
+ }
63
+ end
64
+
65
+ def tenki city, timing
66
+ doc = open(
67
+ "http://weather.livedoor.com/forecast/webservice/rest/v1?" \
68
+ "city=#{CityIDs.fetch(city)}&day=#{timing}"){|f|
69
+ REXML::Document.new f.read
70
+ }
71
+
72
+ title = doc.elements['/lwws/title/'].text.toeuc
73
+ telop = doc.elements['/lwws/telop/'].text.toeuc
74
+ link = doc.elements['/lwws/link/'].text.toeuc
75
+ desc = doc.elements['/lwws/description/'].text.toeuc
76
+ max = doc.elements['/lwws/temperature/max/celsius/'].text
77
+ min = doc.elements['/lwws/temperature/min/celsius/'].text
78
+ date = Date.parse(doc.elements['/lwws/forecastdate/'].text)
79
+ datestr = date.strftime('%m/%d')
80
+
81
+ desc.sub!(/\.\.\..*/m, '...')
82
+
83
+ celsius = []
84
+ celsius << "max: #{max}" if max
85
+ celsius << "min: #{min}" if min
86
+ unless celsius.empty?
87
+ celsius = "(#{celsius.join(', ')}) "
88
+ end
89
+ "#{title} (#{datestr}): #{telop} - #{celsius}#{desc} - #{link}".tojis
90
+ end
91
+
92
+ def on_privmsg prefix, ch, msg
93
+ return unless @available_channel === ch
94
+ return if same_bot?(ch)
95
+
96
+ if /\Atenki(|:(today|tomorrow|dayaftertomorrow))>(.+)/ =~ msg
97
+ city = $3.strip.toeuc
98
+ timing = ($2 || 'today').strip
99
+ begin
100
+ result = tenki(city, timing).gsub(/\n/, ' ')
101
+ rescue IndexError
102
+ result = "Unknown city. Check city title on http://weather.livedoor.com/forecast/rss/forecastmap.xml"
103
+ rescue => e
104
+ result = "#{e}"
105
+ end
106
+ send_notice ch, "tenki bot: #{result}"
107
+ end
108
+ end
109
+ end
110
+
111
+