butler 1.8.0 → 1.8.1

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 (57) hide show
  1. data/CHANGELOG +40 -0
  2. data/README +9 -9
  3. data/Rakefile +15 -71
  4. data/bin/botcontrol +151 -146
  5. data/data/butler/dialogs/botcontrol.rb +8 -3
  6. data/data/butler/dialogs/create.rb +18 -18
  7. data/data/butler/dialogs/create_config.rb +8 -0
  8. data/data/butler/dialogs/en/create_config.yaml +2 -0
  9. data/data/butler/dialogs/en/list.yaml +2 -1
  10. data/data/butler/dialogs/info.rb +2 -2
  11. data/data/butler/dialogs/list.rb +13 -8
  12. data/data/butler/plugins/games/countdown.rb +41 -0
  13. data/data/butler/plugins/games/roll.rb +59 -0
  14. data/lib/access.rb +6 -107
  15. data/lib/access/admin.rb +3 -0
  16. data/lib/access/role.rb +37 -2
  17. data/lib/access/savable.rb +5 -0
  18. data/lib/access/user.rb +21 -2
  19. data/lib/access/yamlbase.rb +4 -0
  20. data/lib/butler.rb +4 -4
  21. data/lib/butler/bot.rb +13 -13
  22. data/lib/butler/irc/client.rb +10 -2
  23. data/lib/butler/irc/parser.rb +7 -2
  24. data/lib/butler/irc/parser/commands.rb +24 -7
  25. data/lib/butler/irc/parser/generic.rb +27 -315
  26. data/lib/butler/irc/parser/rfc2812.rb +328 -0
  27. data/lib/butler/irc/socket.rb +1 -1
  28. data/lib/butler/irc/user.rb +13 -0
  29. data/lib/butler/plugin.rb +1 -1
  30. data/lib/butler/plugin/configproxy.rb +4 -4
  31. data/lib/butler/plugins.rb +1 -1
  32. data/lib/butler/version.rb +1 -1
  33. data/lib/configuration.rb +22 -71
  34. data/lib/dialogline.rb +12 -0
  35. data/lib/event.rb +5 -2
  36. data/lib/installer.rb +52 -24
  37. data/lib/iterator.rb +17 -7
  38. data/lib/log.rb +32 -5
  39. data/lib/log/comfort.rb +33 -16
  40. data/lib/log/entry.rb +25 -5
  41. data/lib/log/fakeio.rb +1 -0
  42. data/lib/log/splitter.rb +6 -2
  43. data/lib/ostructfixed.rb +5 -0
  44. data/lib/ruby/exception/detailed.rb +3 -3
  45. data/lib/scheduler.rb +19 -4
  46. data/lib/scriptfile.rb +9 -2
  47. data/lib/string.rb +176 -0
  48. data/lib/string/ascii.rb +31 -0
  49. data/lib/string/mbencoded.rb +79 -0
  50. data/lib/string/sbencoded.rb +77 -0
  51. data/lib/string/utf8.rb +157 -0
  52. data/lib/templater.rb +68 -10
  53. data/lib/w3validator.rb +86 -0
  54. data/test/irc/serverlistings/test_rpl_hiddenhost.txt +60 -0
  55. data/test/test_access.rb +101 -0
  56. data/test/test_configuration.rb +63 -0
  57. metadata +19 -2
@@ -0,0 +1,60 @@
1
+ $:.unshift("/Users/stefan/Development/Ruby/Gems/butler/trunk/lib")
2
+ require 'butler/irc/client'; include Butler::IRC; c = Client.new('127.0.0.1'); c.login("mybot1", "mybot", "My Bot")
3
+
4
+ c.irc.privmsg("foo", "bar")
5
+
6
+ :Gameservers.NJ.US.GameSurge.net 001 mybot1 :Welcome to the GameSurge IRC Network via Gameservers.com, mybot1
7
+ PING :1831737435
8
+ :Gameservers.NJ.US.GameSurge.net 396 mybot1 sfoptx.user.gamesurge :is now your hidden host
9
+ PING :1831737435
10
+
11
+ NOTICE AUTH :*** Looking up your hostname
12
+ NOTICE AUTH :*** Found your hostname, cached
13
+ NOTICE AUTH :*** Checking Ident
14
+ NOTICE AUTH :*** No ident response
15
+ PING :1831737435
16
+ :Gameservers.NJ.US.GameSurge.net 001 mybot1 :Welcome to the GameSurge IRC Network via Gameservers.com, mybot1
17
+ :Gameservers.NJ.US.GameSurge.net 002 mybot1 :Your host is Gameservers.NJ.US.GameSurge.net, running version u2.10.11.07.GS(01)
18
+ :Gameservers.NJ.US.GameSurge.net 003 mybot1 :This server was created Tue Mar 20 2007 at 21:16:30 EDT
19
+ :Gameservers.NJ.US.GameSurge.net 004 mybot1 Gameservers.NJ.US.GameSurge.net u2.10.11.07.GS(01) dioswkgxnI biklmnopstvrczCD bklov
20
+ :Gameservers.NJ.US.GameSurge.net 005 mybot1 ANNOUNCE WHOX WALLCHOPS WALLVOICES USERIP CPRIVMSG CNOTICE SILENCE=15 MODES=6 MAXCHANNELS=20 MAXBANS=45 NICKLEN=30 MAXNICKLEN=30 :are supported by this server
21
+ :Gameservers.NJ.US.GameSurge.net 005 mybot1 TOPICLEN=300 AWAYLEN=200 KICKLEN=300 CHANTYPES=#& PREFIX=(ov)@+ CHANMODES=b,k,l,imnpstrDcC CASEMAPPING=rfc1459 NETWORK=GameSurge :are supported by this server
22
+ :Gameservers.NJ.US.GameSurge.net 251 mybot1 :There are 42 users and 24634 invisible on 26 servers
23
+ :Gameservers.NJ.US.GameSurge.net 252 mybot1 63 :operator(s) online
24
+ :Gameservers.NJ.US.GameSurge.net 253 mybot1 3 :unknown connection(s)
25
+ :Gameservers.NJ.US.GameSurge.net 254 mybot1 61662 :channels formed
26
+ :Gameservers.NJ.US.GameSurge.net 255 mybot1 :I have 1 clients and 1 servers
27
+ :Gameservers.NJ.US.GameSurge.net NOTICE mybot1 :Highest connection count: 2 (1 clients)
28
+ :Gameservers.NJ.US.GameSurge.net 375 mybot1 :- Gameservers.NJ.US.GameSurge.net Message of the Day -
29
+ :Gameservers.NJ.US.GameSurge.net 372 mybot1 :.Type /MOTD to read the AUP before continuing using this service..
30
+ :Gameservers.NJ.US.GameSurge.net 372 mybot1 :The message of the day was last changed: 2007-3-22 12:51
31
+ :Gameservers.NJ.US.GameSurge.net 376 mybot1 :End of /MOTD command.
32
+ :Gameservers.NJ.US.GameSurge.net NOTICE mybot1 :on 2 ca 1(4) ft 10(10) tr
33
+ :mybot1!~mybot@c-66-176-77-3.hsd1.fl.comcast.net MODE mybot1 :+iw
34
+ :Global!Global@Services.GameSurge.net NOTICE mybot1 :.------------- MESSAGE(S) OF THE DAY --------------.
35
+ :Global!Global@Services.GameSurge.net NOTICE mybot1 :[.users.] Notice from GameSurge, posted 08:53 PM, 04/09/2007:
36
+ :Global!Global@Services.GameSurge.net NOTICE mybot1 :Interested in the broader gaming community? Remember to check out the GameSurge event calendar and homepage for upcoming events. - http://www.gamesurge.net/calendar/ - Additionally, look out for global notices on the network.
37
+ :Global!Global@Services.GameSurge.net NOTICE mybot1 :[.users.] Notice from GameSurge, posted 09:27 AM, 01/20/2007:
38
+ :Global!Global@Services.GameSurge.net NOTICE mybot1 :Please be familiar with the GameSurge Acceptable Use Policy. All users on the network are required to abide by it. http://www.gamesurge.net/aup/
39
+ :Global!Global@Services.GameSurge.net NOTICE mybot1 :.---------- END OF MESSAGE(S) OF THE DAY ----------.
40
+ :AuthServ!AuthServ@Services.GameSurge.net NOTICE mybot1 :I recognize you.
41
+ :Gameservers.NJ.US.GameSurge.net 396 mybot1 sfoptx.user.gamesurge :is now your hidden host
42
+
43
+
44
+ raw :127.0.0.1 001 apeiros :Welcome to the GameSurge IRC Network via Gameservers.com, apeiros
45
+ raw :127.0.0.1 002 apeiros :Your host is 127.0.0.1, running version u2.10.11.07.GS(01)
46
+ raw :127.0.0.1 003 apeiros :This server was created Tue Mar 20 2007 at 21:16:30 EDT
47
+ raw :127.0.0.1 004 apeiros 127.0.0.1 u2.10.11.07.GS(01) dioswkgxnI biklmnopstvrczCD bklov
48
+ raw :127.0.0.1 005 apeiros ANNOUNCE WHOX WALLCHOPS WALLVOICES USERIP CPRIVMSG CNOTICE SILENCE=15 MODES=6 MAXCHANNELS=20 MAXBANS=45 NICKLEN=30 MAXNICKLEN=30 :are supported by this server
49
+ raw :127.0.0.1 005 apeiros TOPICLEN=300 AWAYLEN=200 KICKLEN=300 CHANTYPES=#& PREFIX=(ov)@+ CHANMODES=b,k,l,imnpstrDcC CASEMAPPING=rfc1459 NETWORK=GameSurge :are supported by this server
50
+ raw :127.0.0.1 251 apeiros :There are 42 users and 24634 invisible on 26 servers
51
+ raw :127.0.0.1 252 apeiros 63 :operator(s) online
52
+ raw :127.0.0.1 253 apeiros 3 :unknown connection(s)
53
+ raw :127.0.0.1 254 apeiros 61662 :channels formed
54
+ raw :127.0.0.1 255 apeiros :I have 1 clients and 1 servers
55
+ raw :127.0.0.1 NOTICE apeiros :Highest connection count: 2 (1 clients)
56
+ raw :127.0.0.1 375 apeiros :- 127.0.0.1 Message of the Day -
57
+ raw :127.0.0.1 372 apeiros :.Type /MOTD to read the AUP before continuing using this service..
58
+ raw :127.0.0.1 372 apeiros :The message of the day was last changed: 2007-3-22 12:51
59
+ raw :127.0.0.1 376 apeiros :End of /MOTD command.
60
+ raw :127.0.0.1 NOTICE apeiros :on 2 ca 1(4) ft 10(10) tr
@@ -0,0 +1,101 @@
1
+ require 'access'
2
+ require 'fileutils'
3
+ require 'test/unit'
4
+
5
+ class TestAccess < Test::Unit::TestCase
6
+ TestDir = "test_access"
7
+ def setup
8
+ #raise "#{TestDir} already exists, aborting test" if File.exist?(TestDir)
9
+ _teardown if File.exist?(TestDir)
10
+ Dir.mkdir(TestDir)
11
+ Dir.mkdir("#{TestDir}/user")
12
+ Dir.mkdir("#{TestDir}/role")
13
+ Dir.mkdir("#{TestDir}/privilege")
14
+ end
15
+
16
+ def _teardown
17
+ FileUtils.rm_r(TestDir)
18
+ end
19
+
20
+ def test_all
21
+ access = Access.new(
22
+ Access::YAMLBase.new(Access::User::Base, "#{TestDir}/user"),
23
+ Access::YAMLBase.new(Access::Role::Base, "#{TestDir}/role"),
24
+ Access::YAMLBase.new(Access::Privilege::Base, "#{TestDir}/privilege")
25
+ #:channel => Access::YAMLBase.new("#{TestDir}/channel", Access::Location)
26
+ )
27
+ assert(!access.user.exists?("test"))
28
+ access.user.create("test", "pass")
29
+ assert(access.user.exists?("test"))
30
+
31
+ %w(news news/read news/create news/edit news/delete banners banners/statistics
32
+ statistics statistics/web statistics/ftp paid_content).each { |priv|
33
+ assert(!access.privilege.exists?(priv))
34
+ access.privilege.create(priv, "test-privilege #{priv}")
35
+ assert(access.privilege.exists?(priv))
36
+ }
37
+
38
+ access.role.create("editor", "testrole description", %w(news/create news/edit statistics))
39
+ access.role.create("chiefeditor", "testrole description 2", %w(news), %w(editor))
40
+
41
+ user = access.login("test", "pass")
42
+ assert(user)
43
+ assert(user.logged?)
44
+ assert(!user.active?)
45
+ assert(user.inactive?)
46
+ user.active = true
47
+ assert(user.active?)
48
+ assert(!user.inactive?)
49
+ user = access.user["test", true]
50
+ assert(user)
51
+ assert(user.active?)
52
+ assert(!user.inactive?)
53
+ assert(!user.logged?)
54
+
55
+ assert(!user.privileged?("foo"))
56
+ assert(!user.privileged?("foo/bar"))
57
+ assert(!user.privileged?("foo/baz"))
58
+ assert(!user.privileged?("bar"))
59
+ assert(!user.privileged?("bar/foo"))
60
+ assert(!user.privileged?("baz"))
61
+
62
+ assert(!user.authorized?("foo"))
63
+ assert(!user.authorized?("foo/bar"))
64
+ assert(!user.authorized?("foo/baz"))
65
+ assert(!user.authorized?("bar"))
66
+ assert(!user.authorized?("bar/foo"))
67
+ assert(!user.authorized?("baz"))
68
+
69
+ user.privileges.add(%w(banners statistics/web paid_content))
70
+
71
+ assert(user.privileged?("banners"))
72
+ assert(user.privileged?("banners/statistics"))
73
+ assert(user.privileged?("statistics/web"))
74
+ assert(!user.privileged?("statistics"))
75
+ assert(user.privileged?("bar/foo"))
76
+ assert(user.privileged?("baz"))
77
+
78
+ assert(!user.authorized?("foo"))
79
+ assert(!user.authorized?("foo/bar"))
80
+ assert(!user.authorized?("foo/baz"))
81
+ assert(!user.authorized?("bar"))
82
+ assert(!user.authorized?("bar/foo"))
83
+ assert(!user.authorized?("baz"))
84
+
85
+ user = access.login("test", "pass")
86
+
87
+ assert(user.privileged?("foo"))
88
+ assert(user.privileged?("foo/bar"))
89
+ assert(user.privileged?("foo/baz"))
90
+ assert(!user.privileged?("bar"))
91
+ assert(user.privileged?("bar/foo"))
92
+ assert(user.privileged?("baz"))
93
+
94
+ assert(user.authorized?("foo"))
95
+ assert(user.authorized?("foo/bar"))
96
+ assert(user.authorized?("foo/baz"))
97
+ assert(!user.authorized?("bar"))
98
+ assert(user.authorized?("bar/foo"))
99
+ assert(user.authorized?("baz"))
100
+ end
101
+ end
@@ -0,0 +1,63 @@
1
+ require 'configuration'
2
+ require 'test/unit'
3
+
4
+ class TestConfiguration < Test::Unit::TestCase
5
+ def setup
6
+ @conf = Configuration.new("./test")
7
+ end
8
+
9
+ def test_setup
10
+ assert(@conf)
11
+ assert(@conf.base)
12
+ assert(File.directory?(@conf.base))
13
+ end
14
+
15
+ def test_accessor
16
+ assert(@conf["file1"] = "bar")
17
+ assert_equal(@conf[[:file1]], "bar")
18
+ assert_equal(@conf[["file1"]], "bar")
19
+ assert_equal(@conf["file1"], "bar")
20
+ assert(File.exist?("#{@conf.base}/file1.yaml"))
21
+
22
+ assert(@conf["file2"] = "foo")
23
+ assert_equal(@conf[:file2], "foo")
24
+ assert_equal(@conf["file2"], "foo")
25
+ assert(File.exist?("#{@conf.base}/file2.yaml"))
26
+
27
+ assert(@conf[[:file3, :sub]] = "baz")
28
+ assert_equal(@conf[[:file3, :sub]], "baz")
29
+ assert_equal(@conf["file3", "sub"], "baz")
30
+ assert(File.exist?("#{@conf.base}/file3.yaml"))
31
+ assert(!File.exist?("#{@conf.base}/file3"))
32
+
33
+ assert(@conf.exist?(:file3))
34
+ assert(!@conf.exist?(:file))
35
+ #assert_raise { @conf
36
+ end
37
+
38
+ def test_nesting
39
+ end
40
+
41
+ def xtest_common_usecase
42
+ @conf.setup(%w(
43
+ main
44
+ plugins
45
+ plugins/demo
46
+ ))
47
+ @conf.merge(
48
+ "main.language" => "de",
49
+ "main.channels" => %w(foo bar baz),
50
+ "plugins.demo.value" => 42
51
+ )
52
+ @conf["plugins.demo.other"] = 24
53
+ @conf["main.language"].replace("en")
54
+ @conf.update
55
+ file, key = @conf.send(:split, "main.language")
56
+ File.open(file, "w") { |fh| fh.write({"language" => "en"}.to_yaml) }
57
+ @conf.rehash
58
+ end
59
+
60
+ def teardown
61
+ FileUtils.rm_r(@conf.base)
62
+ end
63
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: butler
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.8.0
7
- date: 2007-10-07 00:00:00 +02:00
6
+ version: 1.8.1
7
+ date: 2007-10-27 00:00:00 +02:00
8
8
  summary: Butler - the IRC bot with class
9
9
  require_paths:
10
10
  - lib
@@ -42,11 +42,13 @@ files:
42
42
  - data/butler/dialogs/botcontrol.rb
43
43
  - data/butler/dialogs/config.rb
44
44
  - data/butler/dialogs/create.rb
45
+ - data/butler/dialogs/create_config.rb
45
46
  - data/butler/dialogs/delete.rb
46
47
  - data/butler/dialogs/en
47
48
  - data/butler/dialogs/en/backup.yaml
48
49
  - data/butler/dialogs/en/botcontrol.yaml
49
50
  - data/butler/dialogs/en/create.yaml
51
+ - data/butler/dialogs/en/create_config.yaml
50
52
  - data/butler/dialogs/en/delete.yaml
51
53
  - data/butler/dialogs/en/help.yaml
52
54
  - data/butler/dialogs/en/info.yaml
@@ -68,6 +70,7 @@ files:
68
70
  - data/butler/dialogs/sync_plugins.rb
69
71
  - data/butler/dialogs/uninstall.rb
70
72
  - data/butler/dialogs/unknown_command.rb
73
+ - data/butler/ircd_scripts
71
74
  - data/butler/plugins
72
75
  - data/butler/plugins/core
73
76
  - data/butler/plugins/core/logout.rb
@@ -81,8 +84,10 @@ files:
81
84
  - data/butler/plugins/dev/raw.rb
82
85
  - data/butler/plugins/dev/rawlog.rb
83
86
  - data/butler/plugins/games
87
+ - data/butler/plugins/games/countdown.rb
84
88
  - data/butler/plugins/games/eightball.rb
85
89
  - data/butler/plugins/games/mastermind.rb
90
+ - data/butler/plugins/games/roll.rb
86
91
  - data/butler/plugins/irc
87
92
  - data/butler/plugins/irc/action.rb
88
93
  - data/butler/plugins/irc/join.rb
@@ -142,6 +147,7 @@ files:
142
147
  - lib/butler/irc/parser
143
148
  - lib/butler/irc/parser/commands.rb
144
149
  - lib/butler/irc/parser/generic.rb
150
+ - lib/butler/irc/parser/rfc2812.rb
145
151
  - lib/butler/irc/parser.rb
146
152
  - lib/butler/irc/socket.rb
147
153
  - lib/butler/irc/string.rb
@@ -215,7 +221,14 @@ files:
215
221
  - lib/ruby/string/unescaped.rb
216
222
  - lib/scheduler.rb
217
223
  - lib/scriptfile.rb
224
+ - lib/string
225
+ - lib/string/ascii.rb
226
+ - lib/string/mbencoded.rb
227
+ - lib/string/sbencoded.rb
228
+ - lib/string/utf8.rb
229
+ - lib/string.rb
218
230
  - lib/templater.rb
231
+ - lib/w3validator.rb
219
232
  - test/cloptions.rb
220
233
  - test/cv.rb
221
234
  - test/irc
@@ -226,7 +239,11 @@ files:
226
239
  - test/irc/messages.txt
227
240
  - test/irc/parser.rb
228
241
  - test/irc/profile_parser.rb
242
+ - test/irc/serverlistings
243
+ - test/irc/serverlistings/test_rpl_hiddenhost.txt
229
244
  - test/irc/users.rb
245
+ - test/test_access.rb
246
+ - test/test_configuration.rb
230
247
  test_files: []
231
248
 
232
249
  rdoc_options: