butler 1.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 (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,36 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "action"
10
+
11
+ def on_trigger
12
+ return answer(usage) if @message.arguments.length < 3
13
+ @butler.irc.action(@message.post_arguments[2], @message.arguments[1])
14
+ answer(:sent)
15
+ end
16
+
17
+ __END__
18
+ ---
19
+ :revision:
20
+ :plugin: 1
21
+ :summary:
22
+ en: Lets butler perform an action in a channel or query (like a /me or /action message)
23
+ :about:
24
+ :mail: "apeiros@gmx.net"
25
+ :version: "1.0.0"
26
+ :author: "Stefan Rusterholz"
27
+ :strings:
28
+ :sent:
29
+ en: Performed action
30
+ :usage:
31
+ en: |
32
+ ![b]action![o] (![c(green)]nick![o] | ![c(green)]channel![o]) *![c(blue)]text![o])
33
+ :help:
34
+ en:
35
+ "": |
36
+ Lets butler perform an action in a channel or query (like a /me or /action message)
@@ -0,0 +1,38 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "join"
10
+
11
+ def on_trigger
12
+ return answer(usage) unless @message.arguments[1]
13
+ answer(:joining, :name => @message.arguments[1])
14
+ @butler.join(@message.arguments[1])
15
+ end
16
+
17
+ __END__
18
+ ---
19
+ :revision:
20
+ :plugin: 1
21
+ :summary:
22
+ en: Let Butler join channels
23
+ :about:
24
+ :mail: "apeiros@gmx.net"
25
+ :version: "1.0.0"
26
+ :author: "Stefan Rusterholz"
27
+ :strings:
28
+ :joining:
29
+ en: Joining channel <%= name %>.
30
+ :usage:
31
+ en: |
32
+ ![b]join![o] ![c(green)]channel![o]
33
+ :help:
34
+ en:
35
+ "": |
36
+ You can use 'join' to let butler join other channels.
37
+ "related": |
38
+ Related triggers: part.
@@ -0,0 +1,36 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "notice"
10
+
11
+ def on_trigger
12
+ return answer(usage) if @message.arguments.length < 3
13
+ @butler.irc.notice(@message.post_arguments[2], @message.arguments[1])
14
+ answer(:sent)
15
+ end
16
+
17
+ __END__
18
+ ---
19
+ :revision:
20
+ :plugin: 1
21
+ :summary:
22
+ en: Let butler send a notice to a user or channel
23
+ :about:
24
+ :mail: "apeiros@gmx.net"
25
+ :version: "1.0.0"
26
+ :author: "Stefan Rusterholz"
27
+ :strings:
28
+ :sent:
29
+ en: Sent the message
30
+ :usage:
31
+ en: |
32
+ ![b]notice![o] (![c(green)]nick![o] | ![c(green)]channel![o])
33
+ :help:
34
+ "":
35
+ en: |
36
+ Let butler send a notice to a user or channel.
@@ -0,0 +1,38 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "part"
10
+
11
+ def on_trigger
12
+ return answer(usage) unless @message.arguments[1]
13
+ answer(:parting, :name => @message.arguments[1])
14
+ @butler.irc.part(@message.arguments[1])
15
+ end
16
+
17
+ __END__
18
+ ---
19
+ :revision:
20
+ :plugin: 1
21
+ :summary:
22
+ en: Let Butler part from channels
23
+ :about:
24
+ :mail: "apeiros@gmx.net"
25
+ :version: "1.0.0"
26
+ :author: "Stefan Rusterholz"
27
+ :strings:
28
+ :parting:
29
+ en: Parting channel <%= name %>.
30
+ :usage:
31
+ en: |
32
+ ![b]part![o] ![c(green)]channel![o]
33
+ :help:
34
+ en:
35
+ "": |
36
+ You can use 'join' to let butler part from channels.
37
+ "related": |
38
+ Related triggers: join.
@@ -0,0 +1,36 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "privmsg"
10
+
11
+ def on_trigger
12
+ return answer(usage) if @message.arguments.length < 3
13
+ @butler.irc.privmsg(@message.post_arguments[2], @message.arguments[1])
14
+ answer(:sent)
15
+ end
16
+
17
+ __END__
18
+ ---
19
+ :revision:
20
+ :plugin: 1
21
+ :summary:
22
+ en: Let butler send a private message to a user or channel
23
+ :about:
24
+ :mail: "apeiros@gmx.net"
25
+ :version: "1.0.0"
26
+ :author: "Stefan Rusterholz"
27
+ :strings:
28
+ :sent:
29
+ en: Sent the message
30
+ :usage:
31
+ en: |
32
+ ![b]privmsg![o] (![c(green)]nick![o] | ![c(green)]channel![o])
33
+ :help:
34
+ en:
35
+ "": |
36
+ Let butler send a private message to a user or channel.
@@ -0,0 +1,36 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "quit"
10
+
11
+ def on_trigger
12
+ @butler.irc.quit(@message.post_arguments[1] || localize(:default_reason))
13
+ end
14
+
15
+ __END__
16
+ ---
17
+ :revision:
18
+ :plugin: 1
19
+ :summary:
20
+ en: Lets Butler quit from IRC and disconnect from the server.
21
+ :about:
22
+ :mail: "apeiros@gmx.net"
23
+ :version: "1.0.0"
24
+ :author: "Stefan Rusterholz"
25
+ :strings:
26
+ :default_reason:
27
+ en: I was terminated! Bye!
28
+ :usage:
29
+ en: |
30
+ ![b]quit![o] [*![c(blue)]reason![o]]
31
+ :help:
32
+ en:
33
+ "": |
34
+ You can use 'quit' to let butler quit from irc and disconnect.
35
+ "related": |
36
+ Related triggers: reconnect.
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "deop"
10
+
11
+ def on_trigger
12
+ channels, nicks = [], message.arguments[1..-1]
13
+ channames = @butler.channels.channel_names
14
+
15
+ channels << nicks.pop while channames.include?(nicks.last.downcase)
16
+ nicks << @message.from.nick if nicks.empty?
17
+ channels << @message.channel.to_str if channels.empty?
18
+
19
+ channels.each { |channel|
20
+ @butler.irc.deop(channel, *nicks)
21
+ }
22
+ end
23
+
24
+ __END__
25
+ ---
26
+ :revision:
27
+ :plugin: 1
28
+ :summary:
29
+ en: Revoke a users op via butler.
30
+ :about:
31
+ :mail: "apeiros@gmx.net"
32
+ :version: "1.0.0"
33
+ :author: "Stefan Rusterholz"
34
+ :strings:
35
+ :usage:
36
+ en: |
37
+ ![b]deop![o] [![c(green)]nick![o] ...] [![c(green)]channel![o] ...]
38
+ :help:
39
+ en:
40
+ "": |
41
+ Revoke a users op via butler.
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "devoice"
10
+
11
+ def on_trigger
12
+ channels, nicks = [], message.arguments[1..-1]
13
+ channames = @butler.channels.channel_names
14
+
15
+ channels << nicks.pop while channames.include?(nicks.last.downcase)
16
+ nicks << @message.from.nick if nicks.empty?
17
+ channels << @message.channel.to_str if channels.empty?
18
+
19
+ channels.each { |channel|
20
+ @butler.irc.devoice(channel, *nicks)
21
+ }
22
+ end
23
+
24
+ __END__
25
+ ---
26
+ :revision:
27
+ :plugin: 1
28
+ :summary:
29
+ en: Revoke a users voice via butler.
30
+ :about:
31
+ :mail: "apeiros@gmx.net"
32
+ :version: "1.0.0"
33
+ :author: "Stefan Rusterholz"
34
+ :strings:
35
+ :usage:
36
+ en: |
37
+ ![b]devoice![o] [![c(green)]nick![o] ...] [![c(green)]channel![o] ...]
38
+ :help:
39
+ en:
40
+ "": |
41
+ Revoke a users voice via butler.
@@ -0,0 +1,47 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ extend OnHandlers
10
+
11
+ trigger "limit"
12
+
13
+ configuration(
14
+ "channels" => []
15
+ )
16
+
17
+ def on_mode(*args)
18
+ end
19
+
20
+ def on_trigger
21
+ limit = @message.arguments[1].downcase
22
+ limit = limit == "off" ? nil : Integer(limit)
23
+ rescue
24
+ answer(:invalid_limit, :limit => limit)
25
+ end
26
+
27
+ __END__
28
+ ---
29
+ :revision:
30
+ :plugin: 1
31
+ :summary:
32
+ en: A slowly shifting channel-limit to avoid join-floods.
33
+ :about:
34
+ :mail: "apeiros@gmx.net"
35
+ :version: "1.0.0"
36
+ :author: "Stefan Rusterholz"
37
+ :strings:
38
+ :invalid_limit:
39
+ en: |
40
+ <%= limit %> is not a valid limit, use either 'off' or a positive number.
41
+ :usage:
42
+ en: |
43
+ ![b]limit![o] ('off' | ![c(green)]int![o]) *![c(green)]channel![o] ...
44
+ :help:
45
+ en:
46
+ "": |
47
+ A slowly shifting channel-limit to avoid join-floods.
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "op"
10
+
11
+ def on_trigger
12
+ channels, nicks = [], message.arguments[1..-1]
13
+ channames = @butler.channels.channel_names
14
+
15
+ channels << nicks.pop while channames.include?(nicks.last.downcase)
16
+ nicks << @message.from.nick if nicks.empty?
17
+ channels << @message.channel.to_str if channels.empty?
18
+
19
+ channels.each { |channel|
20
+ @butler.irc.op(channel, *nicks)
21
+ }
22
+ end
23
+
24
+ __END__
25
+ ---
26
+ :revision:
27
+ :plugin: 1
28
+ :summary:
29
+ en: Grant a user op via butler.
30
+ :about:
31
+ :mail: "apeiros@gmx.net"
32
+ :version: "1.0.0"
33
+ :author: "Stefan Rusterholz"
34
+ :strings:
35
+ :usage:
36
+ en: |
37
+ ![b]op![o] [![c(green)]nick![o] ...] [![c(green)]channel![o] ...]
38
+ :help:
39
+ en:
40
+ "": |
41
+ Grant a user op via butler.
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "voice"
10
+
11
+ def on_trigger
12
+ channels, nicks = [], message.arguments[1..-1]
13
+ channames = @butler.channels.channel_names
14
+
15
+ channels << nicks.pop while channames.include?(nicks.last.downcase)
16
+ nicks << @message.from.nick if nicks.empty?
17
+ channels << @message.channel.to_str if channels.empty?
18
+
19
+ channels.each { |channel|
20
+ @butler.irc.voice(channel, *nicks)
21
+ }
22
+ end
23
+
24
+ __END__
25
+ ---
26
+ :revision:
27
+ :plugin: 1
28
+ :summary:
29
+ en: Grant a user voice via butler.
30
+ :about:
31
+ :mail: "apeiros@gmx.net"
32
+ :version: "1.0.0"
33
+ :author: "Stefan Rusterholz"
34
+ :strings:
35
+ :usage:
36
+ en: |
37
+ ![b]voice![o] [![c(green)]nick![o] ...] [![c(green)]channel![o] ...]
38
+ :help:
39
+ en:
40
+ "": |
41
+ Grant a user voice via butler.
@@ -0,0 +1,69 @@
1
+ #--
2
+ # Copyright 2007 by Stefan Rusterholz.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #++
6
+
7
+
8
+
9
+ trigger "help"
10
+
11
+ def on_trigger
12
+ if @message.arguments[1] then
13
+ plugin = plugin = @butler.plugins.identify(@message.arguments[1])
14
+ if plugin then
15
+ help = @butler.plugins[plugin].help
16
+ help = help[@message.language] || help["en"]
17
+ if @message.arguments.last == "+" then
18
+ topics = help.keys.sort[1..-1].map { |t| "'#{t}'" }.columnize(5)
19
+ answer(:topics, :topics => topics)
20
+ else
21
+ key = @message.arguments[2..-1].join(" ")
22
+ if help = help[key] then
23
+ answer(help.result(self))
24
+ else
25
+ answer(key.empty? ? :nohelp : :notopic, :topic => key)
26
+ end
27
+ end
28
+ else
29
+ answer :noplugin
30
+ end
31
+ else
32
+ help = plugin().help
33
+ help = help[@message.language] || help["en"]
34
+ answer(help[""].result(self))
35
+ end
36
+ end
37
+
38
+ __END__
39
+ ---
40
+ :revision:
41
+ :plugin: 1
42
+ :summary:
43
+ en: Displays helping information about other plugins
44
+ :about:
45
+ :mail: "apeiros@gmx.net"
46
+ :version: "1.0.0"
47
+ :author: "Stefan Rusterholz"
48
+ :description:
49
+ :strings:
50
+ :noplugin:
51
+ en: "No plugin with that name loaded."
52
+ :nohelp:
53
+ en: "Plugin doesn't provide any help."
54
+ :notopic:
55
+ en: "Plugin doesn't provide help for '<%= topic %>'."
56
+ :nolang:
57
+ en: "Plugin doesn't provide help for '<%= topic %>' in that language."
58
+ :topics:
59
+ en: |
60
+ Topics for the plugin:
61
+ <%= topics %>
62
+ :usage:
63
+ en: "![b]help![o] [![c(green)]plugin![o] [*![c(blue)]topic![o]]] [+]"
64
+ :help:
65
+ en:
66
+ "": |
67
+ help gives help about itself or a command.
68
+ If + is the last argument, it will list the available help topics.
69
+ Use 'plugins list' to get a list of available commands.