]> jfr.im git - erebus.git/blame - modules/help.py
chanops - remove extra hook, add shorthelp to voice/devoice
[erebus.git] / modules / help.py
CommitLineData
0f8352dd 1# Erebus IRC bot - Author: Erebus Team
2# help module
3# This file is released into the public domain; see http://unlicense.org/
4
5# module info
6modinfo = {
7 'author': 'Erebus Team',
8 'license': 'public domain',
a62d0d18 9 'compatible': [1,2],
10 'depends': [],
11 'softdeps': [],
0f8352dd 12}
13
14# preamble
15import modlib
16lib = modlib.modlib(__name__)
17modstart = lib.modstart
18modstop = lib.modstop
19
20# module code
bc68cb5e 21import os.path
0f8352dd 22helps = {}
23cmds = {}
24
25# ! this is part of this module's API, called from modlib.help()
0f8352dd 26def reghelp(func, *args, **kwargs):
27 syntax = None
28 shorthelp = None
29 longhelps = []
30
31 if len(args) > 0:
32 syntax = args[0]
33 if len(args) > 1:
34 shorthelp = args[1]
35 if len(args) > 2:
36 longhelps = args[2:]
37
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']
44
45 if syntax is None: syntax = ""
46 if shorthelp is None: shorthelp = ""
47
48 func.syntax = syntax
49 func.shorthelp = shorthelp
50 func.longhelps = longhelps
51 helps[func] = func
52 for c in func.cmd:
53 cmds[c] = func
54
55def dereghelp(func, *args, **kwargs):
56 for c in func.cmd:
bc68cb5e 57 del cmds[c]
0f8352dd 58 del helps[func]
59
7d0de55e 60class HelpLine(object):
58401d09 61 def __init__(self, cmd, syntax, shorthelp, admin, level, module):
7d0de55e 62 self.cmd = cmd
63 self.syntax = syntax
64 self.shorthelp = shorthelp
58401d09 65 self.admin = admin
7d0de55e 66 self.level = level
58401d09 67 self.module = module
7d0de55e 68
69 def __cmp__(self, other):
70 if self.level == other.level:
71 return cmp(self.cmd, other.cmd)
72 else:
73 return cmp(self.level, other.level)
74
75
76 def __str__(self):
58401d09 77 if self.admin:
78 return "%-35s(%3s) - %-10s - %-50s" % (self.cmd+' '+self.syntax, self.level, self.module, self.shorthelp)
7d0de55e 79 else:
58401d09 80 return "%-40s - %-50s" % (self.cmd+' '+self.syntax, self.shorthelp)
7d0de55e 81
bc68cb5e 82def _mkhelp(level, func):
83 lines = []
84 if level >= func.reqglevel:
85 lines.append(HelpLine(func.cmd[0], func.syntax, func.shorthelp, (level > 0), func.reqglevel, func.module))
86 if len(func.cmd) > 1:
87 for c in func.cmd[1:]:
88 lines.append(HelpLine(c, "", "Alias of %s" % (func.cmd[0]), (level > 0), func.reqglevel, func.module))
89 return lines
90
91def _genhelp(bot, user, chan, realtarget, *args):
92 try:
93 filepath = bot.parent.cfg.get('help', 'path', default='./help/%d.txt')
94 for level in range(-1, 101):
95 filename = filepath % (level)
96 fo = open(filename, 'w')
97 lines = []
98 for func in helps.itervalues():
99 lines += _mkhelp(level, func)
100 for line in sorted(lines):
101 fo.write(str(line)+"\n")
102 except Exception as e:
103 return e
104 return True
105
106@lib.hook(glevel=1, needchan=False)
107@lib.help(None, "generates help file", "default path: ./help/<level>.txt", "config as: [help]", "path = ./help/%d.txt")
108#TODO: use args... "[@<module>] [#<level>] [<file>]"
109def genhelp(bot, user, chan, realtarget, *args):
110 ret = _genhelp(bot, user, chan, realtarget, *args)
111 if not isinstance(ret, BaseException):
112 bot.msg(user, "Help written.")
113 else:
114 bot.msg(user, "Failed writing help. %s" % (ret))
115
0f8352dd 116@lib.hook(needchan=False)
bc68cb5e 117@lib.help("<command>", "describes a command")
118@lib.argsGE(1)
119def help(bot, user, chan, realtarget, *args):
120 cmd = str(' '.join(args)).lower()
121 if cmd in cmds and user.glevel >= cmds[cmd].reqglevel:
122 func = cmds[cmd]
123 bot.slowmsg(user, str(HelpLine(func.cmd[0], func.syntax, func.shorthelp, (user.glevel > 0), func.reqglevel, func.module)))
124 for line in func.longhelps:
125 bot.slowmsg(user, " %s" % (line))
126 bot.slowmsg(user, "End of help for %s." % (func.cmd[0]))
127 if len(func.cmd) > 1:
128 bot.slowmsg(user, " Aliases: %s" % (' '.join(func.cmd[1:])))
129 else:
130 bot.slowmsg(user, "No help found for %s" % (cmd))
131
132@lib.hook(needchan=False)
133@lib.help(None, "provides command list")
134def showcommands(bot, user, chan, realtarget, *args):
135 if bool(int(bot.parent.cfg.get('help', 'autogen', default=0))):
136 _genhelp(bot, user, chan, realtarget, *args)
137 url = bot.parent.cfg.get('help', 'url', default=None)
138 if url is None:
139 try:
140 import urllib2
141 myip = urllib2.urlopen("https://api.ipify.org").read()
142 url = "http://%s/help/%%d.txt (maybe)" % (myip)
143 except: url = None
144 if url is not None:
145 url = url % (user.glevel)
146 bot.msg(user, "Help is at: %s" % (url))
147 else:
148 bot.msg(user, "I don't know where help is. Sorry. Contact my owner.")
149
150"""#DISABLED
151@lib.hook(needchan=False)
152@lib.help('[@<module>|<command>]', 'lists commands or describes a command', 'with @<module>, lists all commands in <module>')
163cc00a 153def help(bot, user, chan, realtarget, *args):
5f03d045 154 if len(args) == 0: # list commands
7d0de55e 155 lines = []
0f8352dd 156 for func in helps.itervalues():
bc68cb5e 157 lines += _mkhelp(user, func)
158 for line in sorted(lines):
159 bot.slowmsg(user, str(line))
160 bot.slowmsg(user, "End of command listing.")
161 elif args[0][0] == "@":
162 lines = []
163 mod = args[0][1:].lower()
164 for func in helps.itervalues():
165 if func.module == mod:
166 lines += _mkhelp(user, func)
7d0de55e 167 for line in sorted(lines):
168 bot.slowmsg(user, str(line))
954cae0b 169 bot.slowmsg(user, "End of command listing.")
5f03d045 170 else: # help for a specific command/topic
bc68cb5e 171 cmd = str(' '.join(args)).lower()
0f8352dd 172 if cmd in cmds and user.glevel >= cmds[cmd].reqglevel:
173 func = cmds[cmd]
bc68cb5e 174 bot.slowmsg(user, str(HelpLine(func.cmd[0], func.syntax, func.shorthelp, (user.glevel > 0), func.reqglevel, func.module)))
0f8352dd 175 for line in func.longhelps:
176 bot.slowmsg(user, " %s" % (line))
954cae0b 177 bot.slowmsg(user, "End of help for %s." % (func.cmd[0]))
0f8352dd 178
179 if len(func.cmd) > 1:
180 bot.slowmsg(user, " Aliases: %s" % (' '.join(func.cmd[1:])))
181 else:
182 bot.slowmsg(user, "No help found for %s" % (cmd))
bc68cb5e 183"""
184pass