]>
jfr.im git - erebus.git/blob - modules/help.py
dc4e1b287bf997816f78c4d8893768dc97f9ac2c
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 def modstart ( parent
, * args
, ** kwargs
):
18 if parent
. cfg
. getboolean ( 'erebus' , 'nofakelag' ):
19 lib
. hook ( 'help' , needchan
= False )( lib
. help ( '[@<module>|<command>]' , 'lists commands or describes a command' , 'with @<module>, lists all commands in <module>' )( help_nolag
))
21 lib
. hook ( needchan
= False )( lib
. help ( "<command>" , "describes a command" )( help ))
22 return lib
. modstart ( parent
, * args
, ** kwargs
)
30 # ! this is part of this module's API, called from modlib.help()
31 def reghelp ( func
, * args
, ** kwargs
):
43 if 'syntax' in kwargs
:
44 syntax
= kwargs
[ 'syntax' ]
45 if 'shorthelp' in kwargs
:
46 shorthelp
= kwargs
[ 'shorthelp' ]
47 if 'longhelps' in kwargs
:
48 longhelps
= kwargs
[ 'longhelps' ]
50 if syntax
is None : syntax
= ""
51 if shorthelp
is None : shorthelp
= ""
54 func
. shorthelp
= shorthelp
55 func
. longhelps
= longhelps
60 def dereghelp ( func
, * args
, ** kwargs
):
65 class HelpLine ( object ):
66 def __init__ ( self
, cmd
, syntax
, shorthelp
, admin
, glevel
, module
, clevel
):
69 self
. shorthelp
= shorthelp
75 def __cmp__ ( self
, other
):
76 if self
. glevel
== other
. glevel
:
77 return cmp ( self
. cmd
, other
. cmd
)
79 return cmp ( self
. glevel
, other
. glevel
)
84 ret
= " %- 25s(%3s) - %- 10s - " % ( self
. cmd
+ ' ' + self
. syntax
, self
. glevel
, self
. module
)
86 ret
= " %- 30s - " % ( self
. cmd
+ ' ' + self
. syntax
)
88 ret
+= "( %s ) " % ( lib
. clevs
[ self
. clevel
])
89 ret
+= str ( self
. shorthelp
)
92 def _mkhelp ( level
, func
):
94 if level
>= func
. reqglevel
:
95 lines
. append ( HelpLine ( func
. cmd
[ 0 ], func
. syntax
, func
. shorthelp
, ( level
> 0 ), func
. reqglevel
, func
. module
, func
. reqclevel
))
97 for c
in func
. cmd
[ 1 :]:
98 lines
. append ( HelpLine ( c
, "" , "Alias of %s " % ( func
. cmd
[ 0 ]), ( level
> 0 ), func
. reqglevel
, func
. module
, func
. reqclevel
))
101 def _genhelp ( bot
, user
, chan
, realtarget
, * args
):
105 filepath
= bot
. parent
. cfg
. get ( 'help' , 'path' , default
= './help/ %d .txt' )
107 if arg
. startswith ( "@" ):
109 elif arg
. startswith ( "#" ) and user
. glevel
>= lib
. ADMIN
:
110 minlevel
= maxlevel
= int ( arg
[ 1 :])
113 if minlevel
!= maxlevel
:
115 for level
in range ( minlevel
, maxlevel
+ 1 ):
117 filename
= filepath
% ( level
)
120 fo
= open ( filename
, 'w' )
122 for func
in helps
. itervalues ():
123 if module
is not None and func
. module
!= module
:
125 lines
+= _mkhelp ( level
, func
)
126 for line
in sorted ( lines
):
127 fo
. write ( str ( line
)+ " \n " )
131 @lib.hook ( glevel
= 1 , needchan
= False )
132 @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" )
133 def genhelp ( bot
, user
, chan
, realtarget
, * args
):
135 _genhelp ( bot
, user
, chan
, realtarget
, * args
)
136 except Exception as e
:
137 bot
. msg ( user
, "Failed writing help. %s " % ( e
))
139 bot
. msg ( user
, "Help written." )
141 #@lib.hook(needchan=False)
142 #@lib.help("<command>", "describes a command")
144 def help ( bot
, user
, chan
, realtarget
, * args
):
145 cmd
= str ( ' ' . join ( args
)). lower ()
146 if cmd
in cmds
and user
. glevel
>= cmds
[ cmd
]. reqglevel
:
148 bot
. slowmsg ( user
, str ( HelpLine ( func
. cmd
[ 0 ], func
. syntax
, func
. shorthelp
, ( user
. glevel
> 0 ), func
. reqglevel
, func
. module
, func
. reqclevel
)))
149 for line
in func
. longhelps
:
150 bot
. slowmsg ( user
, " %s " % ( line
))
151 if len ( func
. cmd
) > 1 :
152 bot
. slowmsg ( user
, " Aliases: %s " % ( ' ' . join ( func
. cmd
[ 1 :])))
154 bot
. slowmsg ( user
, "No help found for %s " % ( cmd
))
156 @lib.hook ( needchan
= False )
157 @lib.help ( None , "provides command list" )
158 def showcommands ( bot
, user
, chan
, realtarget
, * args
):
159 if bot
. parent
. cfg
. getboolean ( 'help' , 'autogen' ):
161 _genhelp ( bot
, user
, chan
, realtarget
, * args
)
164 url
= bot
. parent
. cfg
. get ( 'help' , 'url' , default
= None )
168 myip
= urllib2
. urlopen ( "https://api.ipify.org" ). read ()
169 url
= "http:// %s /help/ %%d .txt (maybe)" % ( myip
)
172 url
= url
% ( user
. glevel
)
173 bot
. msg ( user
, "Help is at: %s " % ( url
))
175 bot
. msg ( user
, "I don't know where help is. Sorry. Contact my owner." )
177 #@lib.hook(needchan=False)
178 #@lib.help('[@<module>|<command>]', 'lists commands or describes a command', 'with @<module>, lists all commands in <module>')
179 def help_nolag ( bot
, user
, chan
, realtarget
, * args
):
180 if len ( args
) == 0 : # list commands
182 for func
in helps
. itervalues ():
183 lines
+= _mkhelp ( user
, func
)
184 for line
in sorted ( lines
):
185 bot
. slowmsg ( user
, str ( line
))
186 bot
. slowmsg ( user
, "End of command listing." )
187 elif args
[ 0 ]. startswith ( "@" ):
189 mod
= args
[ 0 ][ 1 :]. lower ()
190 for func
in helps
. itervalues ():
191 if func
. module
== mod
:
192 lines
+= _mkhelp ( user
, func
)
193 for line
in sorted ( lines
):
194 bot
. slowmsg ( user
, str ( line
))
195 bot
. slowmsg ( user
, "End of command listing." )
196 else : # help for a specific command/topic
197 cmd
= str ( ' ' . join ( args
)). lower ()
198 if cmd
in cmds
and user
. glevel
>= cmds
[ cmd
]. reqglevel
:
200 bot
. slowmsg ( user
, str ( HelpLine ( func
. cmd
[ 0 ], func
. syntax
, func
. shorthelp
, ( user
. glevel
> 0 ), func
. reqglevel
, func
. module
)))
201 for line
in func
. longhelps
:
202 bot
. slowmsg ( user
, " %s " % ( line
))
203 bot
. slowmsg ( user
, "End of help for %s ." % ( func
. cmd
[ 0 ]))
205 if len ( func
. cmd
) > 1 :
206 bot
. slowmsg ( user
, " Aliases: %s " % ( ' ' . join ( func
. cmd
[ 1 :])))
208 bot
. slowmsg ( user
, "No help found for %s " % ( cmd
))