butler 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/CHANGELOG +4 -0
  2. data/GPL.txt +340 -0
  3. data/LICENSE.txt +52 -0
  4. data/README +37 -0
  5. data/Rakefile +334 -0
  6. data/bin/botcontrol +230 -0
  7. data/data/butler/config_template.yaml +4 -0
  8. data/data/butler/dialogs/backup.rb +19 -0
  9. data/data/butler/dialogs/botcontrol.rb +4 -0
  10. data/data/butler/dialogs/config.rb +1 -0
  11. data/data/butler/dialogs/create.rb +53 -0
  12. data/data/butler/dialogs/delete.rb +3 -0
  13. data/data/butler/dialogs/en/backup.yaml +6 -0
  14. data/data/butler/dialogs/en/botcontrol.yaml +5 -0
  15. data/data/butler/dialogs/en/create.yaml +11 -0
  16. data/data/butler/dialogs/en/delete.yaml +2 -0
  17. data/data/butler/dialogs/en/help.yaml +17 -0
  18. data/data/butler/dialogs/en/info.yaml +13 -0
  19. data/data/butler/dialogs/en/list.yaml +4 -0
  20. data/data/butler/dialogs/en/notyetimplemented.yaml +2 -0
  21. data/data/butler/dialogs/en/rename.yaml +3 -0
  22. data/data/butler/dialogs/en/start.yaml +3 -0
  23. data/data/butler/dialogs/en/sync_plugins.yaml +3 -0
  24. data/data/butler/dialogs/en/uninstall.yaml +5 -0
  25. data/data/butler/dialogs/en/unknown_command.yaml +2 -0
  26. data/data/butler/dialogs/help.rb +11 -0
  27. data/data/butler/dialogs/info.rb +27 -0
  28. data/data/butler/dialogs/interactive.rb +1 -0
  29. data/data/butler/dialogs/list.rb +10 -0
  30. data/data/butler/dialogs/notyetimplemented.rb +1 -0
  31. data/data/butler/dialogs/rename.rb +4 -0
  32. data/data/butler/dialogs/selectbot.rb +2 -0
  33. data/data/butler/dialogs/start.rb +5 -0
  34. data/data/butler/dialogs/sync_plugins.rb +30 -0
  35. data/data/butler/dialogs/uninstall.rb +17 -0
  36. data/data/butler/dialogs/unknown_command.rb +1 -0
  37. data/data/butler/plugins/core/logout.rb +41 -0
  38. data/data/butler/plugins/core/plugins.rb +134 -0
  39. data/data/butler/plugins/core/privilege.rb +103 -0
  40. data/data/butler/plugins/core/user.rb +166 -0
  41. data/data/butler/plugins/dev/eval.rb +64 -0
  42. data/data/butler/plugins/dev/nometa.rb +14 -0
  43. data/data/butler/plugins/dev/onhandlers.rb +93 -0
  44. data/data/butler/plugins/dev/raw.rb +36 -0
  45. data/data/butler/plugins/dev/rawlog.rb +77 -0
  46. data/data/butler/plugins/games/eightball.rb +54 -0
  47. data/data/butler/plugins/games/mastermind.rb +174 -0
  48. data/data/butler/plugins/irc/action.rb +36 -0
  49. data/data/butler/plugins/irc/join.rb +38 -0
  50. data/data/butler/plugins/irc/notice.rb +36 -0
  51. data/data/butler/plugins/irc/part.rb +38 -0
  52. data/data/butler/plugins/irc/privmsg.rb +36 -0
  53. data/data/butler/plugins/irc/quit.rb +36 -0
  54. data/data/butler/plugins/operator/deop.rb +41 -0
  55. data/data/butler/plugins/operator/devoice.rb +41 -0
  56. data/data/butler/plugins/operator/limit.rb +47 -0
  57. data/data/butler/plugins/operator/op.rb +41 -0
  58. data/data/butler/plugins/operator/voice.rb +41 -0
  59. data/data/butler/plugins/public/help.rb +69 -0
  60. data/data/butler/plugins/public/login.rb +72 -0
  61. data/data/butler/plugins/public/usage.rb +49 -0
  62. data/data/butler/plugins/service/clones.rb +56 -0
  63. data/data/butler/plugins/service/define.rb +47 -0
  64. data/data/butler/plugins/service/log.rb +183 -0
  65. data/data/butler/plugins/service/svn.rb +91 -0
  66. data/data/butler/plugins/util/cycle.rb +98 -0
  67. data/data/butler/plugins/util/load.rb +41 -0
  68. data/data/butler/plugins/util/pong.rb +29 -0
  69. data/data/butler/strings/random/acknowledge.en.yaml +5 -0
  70. data/data/butler/strings/random/gratitude.en.yaml +3 -0
  71. data/data/butler/strings/random/hello.en.yaml +4 -0
  72. data/data/butler/strings/random/ignorance.en.yaml +7 -0
  73. data/data/butler/strings/random/ignorance_about.en.yaml +3 -0
  74. data/data/butler/strings/random/insult.en.yaml +3 -0
  75. data/data/butler/strings/random/rejection.en.yaml +12 -0
  76. data/data/man/botcontrol.1 +17 -0
  77. data/lib/access.rb +187 -0
  78. data/lib/access/admin.rb +16 -0
  79. data/lib/access/privilege.rb +122 -0
  80. data/lib/access/role.rb +102 -0
  81. data/lib/access/savable.rb +18 -0
  82. data/lib/access/user.rb +180 -0
  83. data/lib/access/yamlbase.rb +126 -0
  84. data/lib/butler.rb +188 -0
  85. data/lib/butler/bot.rb +247 -0
  86. data/lib/butler/control.rb +93 -0
  87. data/lib/butler/dialog.rb +64 -0
  88. data/lib/butler/initialvalues.rb +40 -0
  89. data/lib/butler/irc/channel.rb +135 -0
  90. data/lib/butler/irc/channels.rb +96 -0
  91. data/lib/butler/irc/client.rb +351 -0
  92. data/lib/butler/irc/hostmask.rb +53 -0
  93. data/lib/butler/irc/message.rb +184 -0
  94. data/lib/butler/irc/parser.rb +125 -0
  95. data/lib/butler/irc/parser/commands.rb +83 -0
  96. data/lib/butler/irc/parser/generic.rb +343 -0
  97. data/lib/butler/irc/socket.rb +378 -0
  98. data/lib/butler/irc/string.rb +186 -0
  99. data/lib/butler/irc/topic.rb +15 -0
  100. data/lib/butler/irc/user.rb +265 -0
  101. data/lib/butler/irc/users.rb +112 -0
  102. data/lib/butler/plugin.rb +249 -0
  103. data/lib/butler/plugin/configproxy.rb +35 -0
  104. data/lib/butler/plugin/mapper.rb +85 -0
  105. data/lib/butler/plugin/matcher.rb +55 -0
  106. data/lib/butler/plugin/onhandlers.rb +70 -0
  107. data/lib/butler/plugin/trigger.rb +58 -0
  108. data/lib/butler/plugins.rb +147 -0
  109. data/lib/butler/version.rb +17 -0
  110. data/lib/cloptions.rb +217 -0
  111. data/lib/cloptions/adapters.rb +24 -0
  112. data/lib/cloptions/switch.rb +132 -0
  113. data/lib/configuration.rb +223 -0
  114. data/lib/dialogline.rb +296 -0
  115. data/lib/dialogline/localizations.rb +24 -0
  116. data/lib/durations.rb +57 -0
  117. data/lib/event.rb +295 -0
  118. data/lib/event/at.rb +64 -0
  119. data/lib/event/every.rb +56 -0
  120. data/lib/event/timed.rb +112 -0
  121. data/lib/installer.rb +75 -0
  122. data/lib/iterator.rb +34 -0
  123. data/lib/log.rb +68 -0
  124. data/lib/log/comfort.rb +85 -0
  125. data/lib/log/converter.rb +23 -0
  126. data/lib/log/entry.rb +152 -0
  127. data/lib/log/fakeio.rb +55 -0
  128. data/lib/log/file.rb +54 -0
  129. data/lib/log/filereader.rb +81 -0
  130. data/lib/log/forward.rb +49 -0
  131. data/lib/log/methods.rb +39 -0
  132. data/lib/log/nolog.rb +18 -0
  133. data/lib/log/splitter.rb +26 -0
  134. data/lib/ostructfixed.rb +26 -0
  135. data/lib/ruby/array/columnize.rb +38 -0
  136. data/lib/ruby/dir/mktree.rb +28 -0
  137. data/lib/ruby/enumerable/join.rb +13 -0
  138. data/lib/ruby/exception/detailed.rb +24 -0
  139. data/lib/ruby/file/append.rb +11 -0
  140. data/lib/ruby/file/write.rb +11 -0
  141. data/lib/ruby/hash/zip.rb +15 -0
  142. data/lib/ruby/kernel/bench.rb +15 -0
  143. data/lib/ruby/kernel/daemonize.rb +42 -0
  144. data/lib/ruby/kernel/non_verbose.rb +17 -0
  145. data/lib/ruby/kernel/safe_fork.rb +18 -0
  146. data/lib/ruby/range/stepped.rb +11 -0
  147. data/lib/ruby/string/arguments.rb +72 -0
  148. data/lib/ruby/string/chunks.rb +15 -0
  149. data/lib/ruby/string/post_arguments.rb +44 -0
  150. data/lib/ruby/string/unescaped.rb +17 -0
  151. data/lib/scheduler.rb +164 -0
  152. data/lib/scriptfile.rb +101 -0
  153. data/lib/templater.rb +86 -0
  154. data/test/cloptions.rb +134 -0
  155. data/test/cv.rb +28 -0
  156. data/test/irc/client.rb +85 -0
  157. data/test/irc/client_login.txt +53 -0
  158. data/test/irc/client_subscribe.txt +8 -0
  159. data/test/irc/message.rb +30 -0
  160. data/test/irc/messages.txt +64 -0
  161. data/test/irc/parser.rb +13 -0
  162. data/test/irc/profile_parser.rb +12 -0
  163. data/test/irc/users.rb +28 -0
  164. metadata +256 -0
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'fastthread'
3
+
4
+ cv = ConditionVariable.new
5
+ mu = Mutex.new
6
+ th1 = Thread.new {
7
+ puts "a1 #{Time.now.sec}"
8
+ mu.synchronize {
9
+ puts "a2 #{Time.now.sec}"
10
+ sleep 2
11
+ cv.wait(mu)
12
+ puts "a3 #{Time.now.sec}"
13
+ }
14
+ puts "a4 #{Time.now.sec}"
15
+ }
16
+ th2 = Thread.new {
17
+ puts "b1 #{Time.now.sec}"
18
+ mu.synchronize {
19
+ puts "b2 #{Time.now.sec}"
20
+ sleep 4
21
+ cv.signal
22
+ puts "b3 #{Time.now.sec}"
23
+ sleep 2
24
+ }
25
+ puts "b4 #{Time.now.sec}"
26
+ }
27
+ th1.join
28
+ th2.join
@@ -0,0 +1,85 @@
1
+ require 'rubygems'
2
+ require 'fastthread'
3
+ require 'test/unit'
4
+
5
+ Thread.abort_on_exception = true
6
+
7
+ class IRCFileServer
8
+ def initialize(file, host="127.0.0.1", port=6667)
9
+ @serv = TCPServer.new(host, port)
10
+ Thread.new {
11
+ conn = @serv.accept
12
+ @thre = Thread.new {
13
+ File.foreach(file) { |line|
14
+ conn.write("#{line.chomp}\r\n")
15
+ }
16
+ }
17
+ while conn.gets("\r\n"); end
18
+ @thre.kill
19
+ conn.close
20
+ }
21
+ end
22
+
23
+ def join
24
+ @thre.join
25
+ end
26
+
27
+ def stop
28
+ @serv.close
29
+ end
30
+ end
31
+
32
+ class TestMessage < Test::Unit::TestCase
33
+ def test_locking
34
+ assert(m = IRC::Client.new("127.0.0.1", :port => 9999))
35
+ th1 = Thread.new {
36
+ assert_equal("bar", m.synchronize(:foo) { sleep 2; "bar" })
37
+ }
38
+ sleep(0.1)
39
+ th2 = Thread.new {
40
+ assert_equal("baz", m.synchronize(:foo) { "baz" })
41
+ }
42
+ th3 = Thread.new {
43
+ assert_equal("quuz", m.synchronize(:quuz) { sleep 3; "quuz" })
44
+ }
45
+ sleep(0.1)
46
+ th4 = Thread.new {
47
+ assert_raise(Timeout::Error) { m.synchronize(:quuz, 1) { "quuz" }}
48
+ }
49
+ assert_equal("sleep", th2.status)
50
+ th1.join
51
+ th2.join
52
+ th3.join
53
+ th4.join
54
+ lock = m.instance_variable_get(:@locks)
55
+ assert(!lock.has_key?(:foo))
56
+ assert(!lock.has_key?(:quuz))
57
+ m.terminate(false)
58
+ end
59
+
60
+ def test_subscribe
61
+ server = IRCFileServer.new("#{File.dirname(__FILE__)}/client_subscribe.txt")
62
+ assert(i = IRC::Client.new("127.0.0.1"))
63
+ catch_all = []
64
+ catch_pm = []
65
+ i.subscribe { |l,e| catch_all << e }
66
+ i.subscribe(:PRIVMSG) { |l,e| catch_pm << e }
67
+ i.login("foo", "bar", "baz")
68
+ server.join
69
+ sleep(0.1)
70
+ i.terminate
71
+ assert_equal(8, catch_all.length)
72
+ assert_equal(2, catch_pm.length)
73
+ server.stop
74
+ end
75
+
76
+ def test_login
77
+ server = IRCFileServer.new("#{File.dirname(__FILE__)}/client_login.txt")
78
+ assert(client = IRC::Client.new("127.0.0.1"))
79
+ assert_nothing_raised {
80
+ client.login("foo", "bar", "baz")
81
+ }
82
+ client.terminate
83
+ server.stop
84
+ end
85
+ end
@@ -0,0 +1,53 @@
1
+ NOTICE AUTH :*** Looking up your hostname...
2
+ NOTICE AUTH :*** Checking ident
3
+ NOTICE AUTH :*** Found your hostname
4
+ NOTICE AUTH :*** No identd (auth) response
5
+ :kornbluth.freenode.net 433 * apeiros :Nickname is already in use.
6
+ :kornbluth.freenode.net 001 apeiros_ :Welcome to the freenode IRC Network apeiros_
7
+ :kornbluth.freenode.net 002 apeiros_ :Your host is kornbluth.freenode.net[freenode.freenode.net/6667], running version hyperion-1.0.2b
8
+ NOTICE apeiros_ :*** Your host is kornbluth.freenode.net[freenode.freenode.net/6667], running version hyperion-1.0.2b
9
+ :kornbluth.freenode.net 003 apeiros_ :This server was created Fri Dec 22 00:08:18 UTC 2006
10
+ :kornbluth.freenode.net 004 apeiros_ kornbluth.freenode.net hyperion-1.0.2b aAbBcCdDeEfFGhHiIjkKlLmMnNopPQrRsStTuUvVwWxXyYzZ01234569*@ bcdefFhiIklmnoPqstv
11
+ :kornbluth.freenode.net 005 apeiros_ IRCD=dancer CAPAB CHANTYPES=# EXCEPTS INVEX CHANMODES=bdeIq,k,lfJD,cgijLmnPQrRstz CHANLIMIT=#:20 PREFIX=(ov)@+ MAXLIST=bdeI:50 MODES=4 STATUSMSG=@ KNOCK NICKLEN=16 :are supported by this server
12
+ :kornbluth.freenode.net 005 apeiros_ SAFELIST CASEMAPPING=ascii CHANNELLEN=30 TOPICLEN=450 KICKLEN=450 KEYLEN=23 USERLEN=10 HOSTLEN=63 SILENCE=50 :are supported by this server
13
+ :kornbluth.freenode.net 251 apeiros_ :There are 16841 listed and 15777 unlisted users on 29 servers
14
+ :kornbluth.freenode.net 252 apeiros_ 40 :flagged staff members
15
+ :kornbluth.freenode.net 254 apeiros_ 13833 :channels formed
16
+ :kornbluth.freenode.net 255 apeiros_ :I have 5551 clients and 0 servers
17
+ :kornbluth.freenode.net 265 apeiros_ :Current local users: 5551 Max: 9700
18
+ :kornbluth.freenode.net 266 apeiros_ :Current global users: 32618 Max: 38201
19
+ :kornbluth.freenode.net 250 apeiros_ :Highest connection count: 9701 (9700 clients) (1932610 since server was (re)started)
20
+ :kornbluth.freenode.net 375 apeiros_ :- kornbluth.freenode.net Message of the Day -
21
+ :kornbluth.freenode.net 372 apeiros_ :- Welcome to kornbluth.freenode.net in Frankfurt, DE, EU.
22
+ :kornbluth.freenode.net 372 apeiros_ :- Thanks to Probe Networks (www.probe-networks.de) for
23
+ :kornbluth.freenode.net 372 apeiros_ :- sponsoring this server!
24
+ :kornbluth.freenode.net 372 apeiros_ :-
25
+ :kornbluth.freenode.net 372 apeiros_ :- KORNBLUTH, CYRIL M. [1923-1958]. Born in New York City and
26
+ :kornbluth.freenode.net 372 apeiros_ :- an active member of the Futurians, Cyril Kornbluth sold his
27
+ :kornbluth.freenode.net 372 apeiros_ :- first story professionally at age 15. By the 1940's his
28
+ :kornbluth.freenode.net 372 apeiros_ :- stories appeared widely under several pennames, including
29
+ :kornbluth.freenode.net 372 apeiros_ :- S.D. Gottesman and Cecil Corman. He left his university
30
+ :kornbluth.freenode.net 372 apeiros_ :- studies in Chicago to serve in the Army in Europe during
31
+ :kornbluth.freenode.net 372 apeiros_ :- WWII, then returned to school and work in Chicago until he
32
+ :kornbluth.freenode.net 372 apeiros_ :- began writing full-time in 1951. The author of .The Marching.
33
+ :kornbluth.freenode.net 372 apeiros_ :- .Morons. and the novels .The Space Merchants. (with Frederik
34
+ :kornbluth.freenode.net 372 apeiros_ :- Pohl) and .The Syndic., he's best known for his biting social
35
+ :kornbluth.freenode.net 372 apeiros_ :- satire and his collaborations with Pohl and with Judith
36
+ :kornbluth.freenode.net 372 apeiros_ :- Merril.
37
+ :kornbluth.freenode.net 372 apeiros_ :-
38
+ :kornbluth.freenode.net 372 apeiros_ :- You're using freenode, a service of Peer-Directed Projects
39
+ :kornbluth.freenode.net 372 apeiros_ :- Center (http://freenode.net/pdpc.shtml).
40
+ :kornbluth.freenode.net 372 apeiros_ :-
41
+ :kornbluth.freenode.net 372 apeiros_ :- Freenode runs an open proxy scanner. Your use of the network
42
+ :kornbluth.freenode.net 372 apeiros_ :- indicates your acceptance of this policy. For details on
43
+ :kornbluth.freenode.net 372 apeiros_ :- freenode network policy, please take a look at our policy
44
+ :kornbluth.freenode.net 372 apeiros_ :- page (http://freenode.net/policy.shtml). Thank you for using
45
+ :kornbluth.freenode.net 372 apeiros_ :- the network!
46
+ :kornbluth.freenode.net 372 apeiros_ :-
47
+ :kornbluth.freenode.net 372 apeiros_ :- Freenode is a service of Peer-Directed Projects Center, an
48
+ :kornbluth.freenode.net 372 apeiros_ :- IRS 501(c)(3) not-for-profit organization. Our yearly
49
+ :kornbluth.freenode.net 372 apeiros_ :- fundraiser will begin soon; if you'd like to donate early,
50
+ :kornbluth.freenode.net 372 apeiros_ :- please see http://freenode.net/pdpc_donations.shtml for more
51
+ :kornbluth.freenode.net 372 apeiros_ :- information. Thank you for using freenode!
52
+ :kornbluth.freenode.net 372 apeiros_ :-
53
+ :kornbluth.freenode.net 376 apeiros_ :End of /MOTD command.
@@ -0,0 +1,8 @@
1
+ :kornbluth.freenode.net 376 apeiros_ :End of /MOTD command.
2
+ :apeiros_!n=apeiros_@80-219-58-122.dclient.hispeed.ch JOIN :#rubygame
3
+ :kornbluth.freenode.net 332 apeiros_ #rubygame :rubygame.sourceforge.net, rubygame.wiki.sourceforge.net || a flexible ruby library for game development || Found a bug? --> http://sourceforge.net/tracker/?group_id=172781&atid=862994 || Want a feature? --> http://sourceforge.net/tracker/?group_id=172781&atid=862997
4
+ :kornbluth.freenode.net 333 apeiros_ #rubygame jacius 1179014790
5
+ :kornbluth.freenode.net 353 apeiros_ = #rubygame :apeiros_ entropy shevy apeiros +jacius @ChanServ kuja
6
+ :kornbluth.freenode.net 366 apeiros_ #rubygame :End of /NAMES list.
7
+ :manveru!n=manveru@pp101.opt2.point.ne.jp PRIVMSG #rubyforce :+?
8
+ :Aw0L_!n=awol@75-105-80-12.cust.wildblue.net PRIVMSG #ruby :-I'll think I'll give ruby a go
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ class TestMessage < Test::Unit::TestCase
3
+ def test_members
4
+ m = IRC::Message.new(nil, nil, "rawmessage", nil, nil, nil)
5
+ assert_equal("rawmessage", m[:raw])
6
+ assert_equal("rawmessage", m.raw)
7
+
8
+ assert_raise(IndexError) { m[:foo] }
9
+ assert_raise(NoMethodError) { m[:foo] = "foo" }
10
+ assert_raise(NoMethodError) { m.foo }
11
+ assert_raise(NoMethodError) { m.foo = "foo" }
12
+
13
+ m.create_member(:foo, "foo")
14
+ assert_equal("foo", m[:foo])
15
+ assert_equal("foo", m.foo)
16
+ assert_raise(NoMethodError) { m[:foo] = "foo" }
17
+ assert_raise(NoMethodError) { m.foo = "foo" }
18
+ assert_raise(IndexError) { m.create_member(:foo, "foo") }
19
+
20
+ m.create_member(:bar, "bar", true)
21
+ assert_equal("bar", m[:bar])
22
+ assert_equal("bar", m.bar)
23
+ assert(m[:bar] = "bar2")
24
+ assert_equal("bar2", m[:bar])
25
+ assert_equal("bar2", m.bar)
26
+ assert(m.bar = "bar")
27
+ assert_equal("bar", m[:bar])
28
+ assert_equal("bar", m.bar)
29
+ end
30
+ end
@@ -0,0 +1,64 @@
1
+ NOTICE AUTH :*** Looking up your hostname...
2
+ NOTICE AUTH :*** Checking ident
3
+ NOTICE AUTH :*** Found your hostname
4
+ NOTICE AUTH :*** No identd (auth) response
5
+ :kornbluth.freenode.net 433 * apeiros :Nickname is already in use.
6
+ :kornbluth.freenode.net 001 apeiros_ :Welcome to the freenode IRC Network apeiros_
7
+ :kornbluth.freenode.net 002 apeiros_ :Your host is kornbluth.freenode.net[freenode.freenode.net/6667], running version hyperion-1.0.2b
8
+ NOTICE apeiros_ :*** Your host is kornbluth.freenode.net[freenode.freenode.net/6667], running version hyperion-1.0.2b
9
+ :kornbluth.freenode.net 003 apeiros_ :This server was created Fri Dec 22 00:08:18 UTC 2006
10
+ :kornbluth.freenode.net 004 apeiros_ kornbluth.freenode.net hyperion-1.0.2b aAbBcCdDeEfFGhHiIjkKlLmMnNopPQrRsStTuUvVwWxXyYzZ01234569*@ bcdefFhiIklmnoPqstv
11
+ :kornbluth.freenode.net 005 apeiros_ IRCD=dancer CAPAB CHANTYPES=# EXCEPTS INVEX CHANMODES=bdeIq,k,lfJD,cgijLmnPQrRstz CHANLIMIT=#:20 PREFIX=(ov)@+ MAXLIST=bdeI:50 MODES=4 STATUSMSG=@ KNOCK NICKLEN=16 :are supported by this server
12
+ :kornbluth.freenode.net 005 apeiros_ SAFELIST CASEMAPPING=ascii CHANNELLEN=30 TOPICLEN=450 KICKLEN=450 KEYLEN=23 USERLEN=10 HOSTLEN=63 SILENCE=50 :are supported by this server
13
+ :kornbluth.freenode.net 251 apeiros_ :There are 16841 listed and 15777 unlisted users on 29 servers
14
+ :kornbluth.freenode.net 252 apeiros_ 40 :flagged staff members
15
+ :kornbluth.freenode.net 254 apeiros_ 13833 :channels formed
16
+ :kornbluth.freenode.net 255 apeiros_ :I have 5551 clients and 0 servers
17
+ :kornbluth.freenode.net 265 apeiros_ :Current local users: 5551 Max: 9700
18
+ :kornbluth.freenode.net 266 apeiros_ :Current global users: 32618 Max: 38201
19
+ :kornbluth.freenode.net 250 apeiros_ :Highest connection count: 9701 (9700 clients) (1932610 since server was (re)started)
20
+ :kornbluth.freenode.net 375 apeiros_ :- kornbluth.freenode.net Message of the Day -
21
+ :kornbluth.freenode.net 372 apeiros_ :- Welcome to kornbluth.freenode.net in Frankfurt, DE, EU.
22
+ :kornbluth.freenode.net 372 apeiros_ :- Thanks to Probe Networks (www.probe-networks.de) for
23
+ :kornbluth.freenode.net 372 apeiros_ :- sponsoring this server!
24
+ :kornbluth.freenode.net 372 apeiros_ :-
25
+ :kornbluth.freenode.net 372 apeiros_ :- KORNBLUTH, CYRIL M. [1923-1958]. Born in New York City and
26
+ :kornbluth.freenode.net 372 apeiros_ :- an active member of the Futurians, Cyril Kornbluth sold his
27
+ :kornbluth.freenode.net 372 apeiros_ :- first story professionally at age 15. By the 1940's his
28
+ :kornbluth.freenode.net 372 apeiros_ :- stories appeared widely under several pennames, including
29
+ :kornbluth.freenode.net 372 apeiros_ :- S.D. Gottesman and Cecil Corman. He left his university
30
+ :kornbluth.freenode.net 372 apeiros_ :- studies in Chicago to serve in the Army in Europe during
31
+ :kornbluth.freenode.net 372 apeiros_ :- WWII, then returned to school and work in Chicago until he
32
+ :kornbluth.freenode.net 372 apeiros_ :- began writing full-time in 1951. The author of .The Marching.
33
+ :kornbluth.freenode.net 372 apeiros_ :- .Morons. and the novels .The Space Merchants. (with Frederik
34
+ :kornbluth.freenode.net 372 apeiros_ :- Pohl) and .The Syndic., he's best known for his biting social
35
+ :kornbluth.freenode.net 372 apeiros_ :- satire and his collaborations with Pohl and with Judith
36
+ :kornbluth.freenode.net 372 apeiros_ :- Merril.
37
+ :kornbluth.freenode.net 372 apeiros_ :-
38
+ :kornbluth.freenode.net 372 apeiros_ :- You're using freenode, a service of Peer-Directed Projects
39
+ :kornbluth.freenode.net 372 apeiros_ :- Center (http://freenode.net/pdpc.shtml).
40
+ :kornbluth.freenode.net 372 apeiros_ :-
41
+ :kornbluth.freenode.net 372 apeiros_ :- Freenode runs an open proxy scanner. Your use of the network
42
+ :kornbluth.freenode.net 372 apeiros_ :- indicates your acceptance of this policy. For details on
43
+ :kornbluth.freenode.net 372 apeiros_ :- freenode network policy, please take a look at our policy
44
+ :kornbluth.freenode.net 372 apeiros_ :- page (http://freenode.net/policy.shtml). Thank you for using
45
+ :kornbluth.freenode.net 372 apeiros_ :- the network!
46
+ :kornbluth.freenode.net 372 apeiros_ :-
47
+ :kornbluth.freenode.net 372 apeiros_ :- Freenode is a service of Peer-Directed Projects Center, an
48
+ :kornbluth.freenode.net 372 apeiros_ :- IRS 501(c)(3) not-for-profit organization. Our yearly
49
+ :kornbluth.freenode.net 372 apeiros_ :- fundraiser will begin soon; if you'd like to donate early,
50
+ :kornbluth.freenode.net 372 apeiros_ :- please see http://freenode.net/pdpc_donations.shtml for more
51
+ :kornbluth.freenode.net 372 apeiros_ :- information. Thank you for using freenode!
52
+ :kornbluth.freenode.net 372 apeiros_ :-
53
+ :kornbluth.freenode.net 376 apeiros_ :End of /MOTD command.
54
+ :NickServ!NickServ@services. NOTICE apeiros_ :This nickname is owned by someone else
55
+ :NickServ!NickServ@services. NOTICE apeiros_ :If this is your nickname, type /msg NickServ .IDENTIFY. <password>
56
+ :freenode-connect!freenode@freenode/bot/connect PRIVMSG apeiros_ :.VERSION.
57
+ :kornbluth.freenode.net 290 apeiros_ :IDENTIFY-MSG
58
+ :NickServ!NickServ@services. NOTICE apeiros_ :+Password accepted - you are now recognized
59
+ :services. MODE apeiros_ :+e
60
+ :apeiros_!n=apeiros_@80-219-58-122.dclient.hispeed.ch JOIN :#rubygame
61
+ :kornbluth.freenode.net 332 apeiros_ #rubygame :rubygame.sourceforge.net, rubygame.wiki.sourceforge.net || a flexible ruby library for game development || Found a bug? --> http://sourceforge.net/tracker/?group_id=172781&atid=862994 || Want a feature? --> http://sourceforge.net/tracker/?group_id=172781&atid=862997
62
+ :kornbluth.freenode.net 333 apeiros_ #rubygame jacius 1179014790
63
+ :kornbluth.freenode.net 353 apeiros_ = #rubygame :apeiros_ entropy shevy apeiros +jacius @ChanServ kuja
64
+ :kornbluth.freenode.net 366 apeiros_ #rubygame :End of /NAMES list.
@@ -0,0 +1,13 @@
1
+ require 'test/unit'
2
+ class TestMessage < Test::Unit::TestCase
3
+ def test_members
4
+ channels = IRC::Channels.new(nil)
5
+ users = IRC::Users.new(nil)
6
+ users.create_myself("apeiros_")
7
+ parser = IRC::Parser.new(nil, users, channels)
8
+ raws = File.readlines("#{File.dirname(__FILE__)}/messages.txt")
9
+ raws.each { |raw|
10
+ assert(message = parser.server_message(raw.chomp))
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ $:.unshift(File.expand_path("#{File.dirname(__FILE__)}/../../lib"))
2
+ require 'irc/parser'
3
+ require 'pp'
4
+
5
+ channels = IRC::Channels.new(nil)
6
+ users = IRC::Users.new(nil)
7
+ users.create_myself("apeiros_")
8
+ parser = IRC::Parser.new(nil, users, channels)
9
+
10
+ 100.to_i.times {
11
+ parser.server_message(":chris2!n=chris@p549D38A5.dip0.t-ipconnect.de PRIVMSG #ruby-lang :+hi apeiros")
12
+ }
@@ -0,0 +1,28 @@
1
+ require 'test/unit'
2
+ class TestUsers < Test::Unit::TestCase
3
+ def test_all
4
+ channels = IRC::Channels.new(nil)
5
+ users = IRC::Users.new(nil)
6
+ users.create_myself("butler")
7
+ myself = users.create("butler")
8
+ assert(users.myself == "butler")
9
+ assert(users.myself == myself)
10
+ assert(myself.add_channel(channels.create("#foo"), :joined))
11
+
12
+ assert(users.create("Nerd"))
13
+ assert(nerd = users.create("Nerd", "user", "host"))
14
+ assert(nerd.add_channel(channels.create("#foo"), :joined))
15
+ assert_equal("Nerd", nerd.nick)
16
+ assert_equal("user", nerd.user)
17
+ assert_equal("host", nerd.host)
18
+ assert(nerd.host)
19
+ assert_equal(:online, nerd.status)
20
+ assert_raise(RuntimeError) { nerd2 = users.create("Nerd", "user2", "host") }
21
+ assert(nerd2 = users.create("Nerd", "user2", "host"))
22
+ assert_equal(:mutated, nerd.status)
23
+ assert(nerd.common_channels?(myself))
24
+ assert(!nerd2.common_channels?(myself))
25
+ assert_equal(["#foo"], nerd.common_channels(myself))
26
+ assert_equal([], nerd2.common_channels(myself))
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,256 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: butler
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.8.0
7
+ date: 2007-10-07 00:00:00 +02:00
8
+ summary: Butler - the IRC bot with class
9
+ require_paths:
10
+ - lib
11
+ email: apeiros@gmx.net
12
+ homepage: http://butler.rubyforge.org/
13
+ rubyforge_project: butler
14
+ description: Butler - the IRC bot with class
15
+ autorequire:
16
+ default_executable: botcontrol
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Stefan Rusterholz
31
+ files:
32
+ - CHANGELOG
33
+ - LICENSE.txt
34
+ - GPL.txt
35
+ - README
36
+ - Rakefile
37
+ - bin/botcontrol
38
+ - data/butler
39
+ - data/butler/config_template.yaml
40
+ - data/butler/dialogs
41
+ - data/butler/dialogs/backup.rb
42
+ - data/butler/dialogs/botcontrol.rb
43
+ - data/butler/dialogs/config.rb
44
+ - data/butler/dialogs/create.rb
45
+ - data/butler/dialogs/delete.rb
46
+ - data/butler/dialogs/en
47
+ - data/butler/dialogs/en/backup.yaml
48
+ - data/butler/dialogs/en/botcontrol.yaml
49
+ - data/butler/dialogs/en/create.yaml
50
+ - data/butler/dialogs/en/delete.yaml
51
+ - data/butler/dialogs/en/help.yaml
52
+ - data/butler/dialogs/en/info.yaml
53
+ - data/butler/dialogs/en/list.yaml
54
+ - data/butler/dialogs/en/notyetimplemented.yaml
55
+ - data/butler/dialogs/en/rename.yaml
56
+ - data/butler/dialogs/en/start.yaml
57
+ - data/butler/dialogs/en/sync_plugins.yaml
58
+ - data/butler/dialogs/en/uninstall.yaml
59
+ - data/butler/dialogs/en/unknown_command.yaml
60
+ - data/butler/dialogs/help.rb
61
+ - data/butler/dialogs/info.rb
62
+ - data/butler/dialogs/interactive.rb
63
+ - data/butler/dialogs/list.rb
64
+ - data/butler/dialogs/notyetimplemented.rb
65
+ - data/butler/dialogs/rename.rb
66
+ - data/butler/dialogs/selectbot.rb
67
+ - data/butler/dialogs/start.rb
68
+ - data/butler/dialogs/sync_plugins.rb
69
+ - data/butler/dialogs/uninstall.rb
70
+ - data/butler/dialogs/unknown_command.rb
71
+ - data/butler/plugins
72
+ - data/butler/plugins/core
73
+ - data/butler/plugins/core/logout.rb
74
+ - data/butler/plugins/core/plugins.rb
75
+ - data/butler/plugins/core/privilege.rb
76
+ - data/butler/plugins/core/user.rb
77
+ - data/butler/plugins/dev
78
+ - data/butler/plugins/dev/eval.rb
79
+ - data/butler/plugins/dev/nometa.rb
80
+ - data/butler/plugins/dev/onhandlers.rb
81
+ - data/butler/plugins/dev/raw.rb
82
+ - data/butler/plugins/dev/rawlog.rb
83
+ - data/butler/plugins/games
84
+ - data/butler/plugins/games/eightball.rb
85
+ - data/butler/plugins/games/mastermind.rb
86
+ - data/butler/plugins/irc
87
+ - data/butler/plugins/irc/action.rb
88
+ - data/butler/plugins/irc/join.rb
89
+ - data/butler/plugins/irc/notice.rb
90
+ - data/butler/plugins/irc/part.rb
91
+ - data/butler/plugins/irc/privmsg.rb
92
+ - data/butler/plugins/irc/quit.rb
93
+ - data/butler/plugins/operator
94
+ - data/butler/plugins/operator/deop.rb
95
+ - data/butler/plugins/operator/devoice.rb
96
+ - data/butler/plugins/operator/limit.rb
97
+ - data/butler/plugins/operator/op.rb
98
+ - data/butler/plugins/operator/voice.rb
99
+ - data/butler/plugins/public
100
+ - data/butler/plugins/public/help.rb
101
+ - data/butler/plugins/public/login.rb
102
+ - data/butler/plugins/public/usage.rb
103
+ - data/butler/plugins/service
104
+ - data/butler/plugins/service/clones.rb
105
+ - data/butler/plugins/service/define.rb
106
+ - data/butler/plugins/service/log.rb
107
+ - data/butler/plugins/service/svn.rb
108
+ - data/butler/plugins/util
109
+ - data/butler/plugins/util/cycle.rb
110
+ - data/butler/plugins/util/load.rb
111
+ - data/butler/plugins/util/pong.rb
112
+ - data/butler/strings
113
+ - data/butler/strings/random
114
+ - data/butler/strings/random/acknowledge.en.yaml
115
+ - data/butler/strings/random/gratitude.en.yaml
116
+ - data/butler/strings/random/hello.en.yaml
117
+ - data/butler/strings/random/ignorance.en.yaml
118
+ - data/butler/strings/random/ignorance_about.en.yaml
119
+ - data/butler/strings/random/insult.en.yaml
120
+ - data/butler/strings/random/rejection.en.yaml
121
+ - data/man
122
+ - data/man/botcontrol.1
123
+ - lib/access
124
+ - lib/access/admin.rb
125
+ - lib/access/privilege.rb
126
+ - lib/access/role.rb
127
+ - lib/access/savable.rb
128
+ - lib/access/user.rb
129
+ - lib/access/yamlbase.rb
130
+ - lib/access.rb
131
+ - lib/butler
132
+ - lib/butler/bot.rb
133
+ - lib/butler/control.rb
134
+ - lib/butler/dialog.rb
135
+ - lib/butler/initialvalues.rb
136
+ - lib/butler/irc
137
+ - lib/butler/irc/channel.rb
138
+ - lib/butler/irc/channels.rb
139
+ - lib/butler/irc/client.rb
140
+ - lib/butler/irc/hostmask.rb
141
+ - lib/butler/irc/message.rb
142
+ - lib/butler/irc/parser
143
+ - lib/butler/irc/parser/commands.rb
144
+ - lib/butler/irc/parser/generic.rb
145
+ - lib/butler/irc/parser.rb
146
+ - lib/butler/irc/socket.rb
147
+ - lib/butler/irc/string.rb
148
+ - lib/butler/irc/topic.rb
149
+ - lib/butler/irc/user.rb
150
+ - lib/butler/irc/users.rb
151
+ - lib/butler/plugin
152
+ - lib/butler/plugin/configproxy.rb
153
+ - lib/butler/plugin/mapper.rb
154
+ - lib/butler/plugin/matcher.rb
155
+ - lib/butler/plugin/onhandlers.rb
156
+ - lib/butler/plugin/trigger.rb
157
+ - lib/butler/plugin.rb
158
+ - lib/butler/plugins.rb
159
+ - lib/butler/version.rb
160
+ - lib/butler.rb
161
+ - lib/cloptions
162
+ - lib/cloptions/adapters.rb
163
+ - lib/cloptions/switch.rb
164
+ - lib/cloptions.rb
165
+ - lib/configuration.rb
166
+ - lib/dialogline
167
+ - lib/dialogline/localizations.rb
168
+ - lib/dialogline.rb
169
+ - lib/durations.rb
170
+ - lib/event
171
+ - lib/event/at.rb
172
+ - lib/event/every.rb
173
+ - lib/event/timed.rb
174
+ - lib/event.rb
175
+ - lib/installer.rb
176
+ - lib/iterator.rb
177
+ - lib/log
178
+ - lib/log/comfort.rb
179
+ - lib/log/converter.rb
180
+ - lib/log/entry.rb
181
+ - lib/log/fakeio.rb
182
+ - lib/log/file.rb
183
+ - lib/log/filereader.rb
184
+ - lib/log/forward.rb
185
+ - lib/log/methods.rb
186
+ - lib/log/nolog.rb
187
+ - lib/log/splitter.rb
188
+ - lib/log.rb
189
+ - lib/ostructfixed.rb
190
+ - lib/ruby
191
+ - lib/ruby/array
192
+ - lib/ruby/array/columnize.rb
193
+ - lib/ruby/dir
194
+ - lib/ruby/dir/mktree.rb
195
+ - lib/ruby/enumerable
196
+ - lib/ruby/enumerable/join.rb
197
+ - lib/ruby/exception
198
+ - lib/ruby/exception/detailed.rb
199
+ - lib/ruby/file
200
+ - lib/ruby/file/append.rb
201
+ - lib/ruby/file/write.rb
202
+ - lib/ruby/hash
203
+ - lib/ruby/hash/zip.rb
204
+ - lib/ruby/kernel
205
+ - lib/ruby/kernel/bench.rb
206
+ - lib/ruby/kernel/daemonize.rb
207
+ - lib/ruby/kernel/non_verbose.rb
208
+ - lib/ruby/kernel/safe_fork.rb
209
+ - lib/ruby/range
210
+ - lib/ruby/range/stepped.rb
211
+ - lib/ruby/string
212
+ - lib/ruby/string/arguments.rb
213
+ - lib/ruby/string/chunks.rb
214
+ - lib/ruby/string/post_arguments.rb
215
+ - lib/ruby/string/unescaped.rb
216
+ - lib/scheduler.rb
217
+ - lib/scriptfile.rb
218
+ - lib/templater.rb
219
+ - test/cloptions.rb
220
+ - test/cv.rb
221
+ - test/irc
222
+ - test/irc/client.rb
223
+ - test/irc/client_login.txt
224
+ - test/irc/client_subscribe.txt
225
+ - test/irc/message.rb
226
+ - test/irc/messages.txt
227
+ - test/irc/parser.rb
228
+ - test/irc/profile_parser.rb
229
+ - test/irc/users.rb
230
+ test_files: []
231
+
232
+ rdoc_options:
233
+ - --quiet
234
+ - --title
235
+ - Butler library API
236
+ - --main
237
+ - README
238
+ - --charset
239
+ - utf-8
240
+ - --inline-source
241
+ - --tab-width
242
+ - "2"
243
+ - --line-numbers
244
+ extra_rdoc_files:
245
+ - README
246
+ - CHANGELOG
247
+ - GPL.txt
248
+ - LICENSE.txt
249
+ executables:
250
+ - botcontrol
251
+ extensions: []
252
+
253
+ requirements: []
254
+
255
+ dependencies: []
256
+