]>
jfr.im git - erebus.git/blob - modules/help.py
1 # Erebus IRC bot - Author: Erebus Team
3 # This file is released into the public domain; see http://unlicense.org/
7 'author' : 'Erebus Team' ,
8 'license' : 'public domain' ,
16 lib
= modlib
. modlib ( __name__
)
17 modstart
= lib
. modstart
25 # ! this is part of this module's API, called from modlib.help()
26 def reghelp ( func
, * args
, ** kwargs
):
38 if 'syntax' in kwargs
:
39 syntax
= kwargs
[ 'syntax' ]
40 if 'shorthelp' in kwargs
:
41 shorthelp
= kwargs
[ 'shorthelp' ]
42 if 'longhelps' in kwargs
:
43 longhelps
= kwargs
[ 'longhelps' ]
45 if syntax
is None : syntax
= ""
46 if shorthelp
is None : shorthelp
= ""
49 func
. shorthelp
= shorthelp
50 func
. longhelps
= longhelps
55 def dereghelp ( func
, * args
, ** kwargs
):
60 class HelpLine ( object ):
61 def __init__ ( self
, cmd
, syntax
, shorthelp
, admin
, glevel
, module
, clevel
):
64 self
. shorthelp
= shorthelp
70 def __cmp__ ( self
, other
):
71 if self
. glevel
== other
. glevel
:
72 return cmp ( self
. cmd
, other
. cmd
)
74 return cmp ( self
. glevel
, other
. glevel
)
79 ret
= " %- 35s(%3s) - %- 10s - " % ( self
. cmd
+ ' ' + self
. syntax
, self
. glevel
, self
. module
)
81 ret
= " %- 40s - " % ( self
. cmd
+ ' ' + self
. syntax
)
83 ret
+= "( %s ) " % ( lib
. clevs
[ self
. clevel
])
84 ret
+= str ( self
. shorthelp
)
87 def _mkhelp ( level
, func
):
89 if level
>= func
. reqglevel
:
90 lines
. append ( HelpLine ( func
. cmd
[ 0 ], func
. syntax
, func
. shorthelp
, ( level
> 0 ), func
. reqglevel
, func
. module
, func
. reqclevel
))
92 for c
in func
. cmd
[ 1 :]:
93 lines
. append ( HelpLine ( c
, "" , "Alias of %s " % ( func
. cmd
[ 0 ]), ( level
> 0 ), func
. reqglevel
, func
. module
, func
. reqclevel
))
96 def _genhelp ( bot
, user
, chan
, realtarget
, * args
):
100 filepath
= bot
. parent
. cfg
. get ( 'help' , 'path' , default
= './help/ %d .txt' )
104 elif arg
[ 0 ] == "#" and user
. glevel
>= lib
. OWNER
:
105 minlevel
= maxlevel
= int ( arg
[ 1 :])
108 if minlevel
!= maxlevel
:
110 print " %r %r %r %r " % ( module
, minlevel
, maxlevel
, filepath
)
111 for level
in range ( minlevel
, maxlevel
+ 1 ):
113 filename
= filepath
% ( level
)
116 fo
= open ( filename
, 'w' )
118 for func
in helps
. itervalues ():
119 if module
is not None and func
. module
!= module
:
121 lines
+= _mkhelp ( level
, func
)
122 for line
in sorted ( lines
):
123 fo
. write ( str ( line
)+ " \n " )
127 @lib.hook ( glevel
= 1 , needchan
= False )
128 @lib.help ( "[@<module>] [#<level>] [file]" , "generates help file" , "arguments are all optional and may be specified in any order" , "default file: ./help/<level>.txt" , "config as: [help]" , "path = ./help/ %d .txt" )
129 def genhelp ( bot
, user
, chan
, realtarget
, * args
):
131 _genhelp ( bot
, user
, chan
, realtarget
, * args
)
132 except Exception as e
:
133 bot
. msg ( user
, "Failed writing help. %s " % ( e
))
135 bot
. msg ( user
, "Help written." )
137 @lib.hook ( needchan
= False )
138 @lib.help ( "<command>" , "describes a command" )
140 def help ( bot
, user
, chan
, realtarget
, * args
):
141 cmd
= str ( ' ' . join ( args
)). lower ()
142 if cmd
in cmds
and user
. glevel
>= cmds
[ cmd
]. reqglevel
:
144 bot
. slowmsg ( user
, str ( HelpLine ( func
. cmd
[ 0 ], func
. syntax
, func
. shorthelp
, ( user
. glevel
> 0 ), func
. reqglevel
, func
. module
, func
. reqclevel
)))
145 for line
in func
. longhelps
:
146 bot
. slowmsg ( user
, " %s " % ( line
))
147 bot
. slowmsg ( user
, "End of help for %s ." % ( func
. cmd
[ 0 ]))
148 if len ( func
. cmd
) > 1 :
149 bot
. slowmsg ( user
, " Aliases: %s " % ( ' ' . join ( func
. cmd
[ 1 :])))
151 bot
. slowmsg ( user
, "No help found for %s " % ( cmd
))
153 @lib.hook ( needchan
= False )
154 @lib.help ( None , "provides command list" )
155 def showcommands ( bot
, user
, chan
, realtarget
, * args
):
156 if bool ( int ( bot
. parent
. cfg
. get ( 'help' , 'autogen' , default
= 0 ))):
158 _genhelp ( bot
, user
, chan
, realtarget
, * args
)
161 url
= bot
. parent
. cfg
. get ( 'help' , 'url' , default
= None )
165 myip
= urllib2
. urlopen ( "https://api.ipify.org" ). read ()
166 url
= "http:// %s /help/ %%d .txt (maybe)" % ( myip
)
169 url
= url
% ( user
. glevel
)
170 bot
. msg ( user
, "Help is at: %s " % ( url
))
172 bot
. msg ( user
, "I don't know where help is. Sorry. Contact my owner." )
175 @lib.hook(needchan=False)
176 @lib.help('[@<module>|<command>]', 'lists commands or describes a command', 'with @<module>, lists all commands in <module>')
177 def help(bot, user, chan, realtarget, *args):
178 if len(args) == 0: # list commands
180 for func in helps.itervalues():
181 lines += _mkhelp(user, func)
182 for line in sorted(lines):
183 bot.slowmsg(user, str(line))
184 bot.slowmsg(user, "End of command listing.")
185 elif args[0][0] == "@":
187 mod = args[0][1:].lower()
188 for func in helps.itervalues():
189 if func.module == mod:
190 lines += _mkhelp(user, func)
191 for line in sorted(lines):
192 bot.slowmsg(user, str(line))
193 bot.slowmsg(user, "End of command listing.")
194 else: # help for a specific command/topic
195 cmd = str(' '.join(args)).lower()
196 if cmd in cmds and user.glevel >= cmds[cmd].reqglevel:
198 bot.slowmsg(user, str(HelpLine(func.cmd[0], func.syntax, func.shorthelp, (user.glevel > 0), func.reqglevel, func.module)))
199 for line in func.longhelps:
200 bot.slowmsg(user, " %s " % (line))
201 bot.slowmsg(user, "End of help for %s ." % (func.cmd[0]))
203 if len(func.cmd) > 1:
204 bot.slowmsg(user, " Aliases: %s " % (' '.join(func.cmd[1:])))
206 bot.slowmsg(user, "No help found for %s " % (cmd))