]>
Commit | Line | Data |
---|---|---|
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 | |
6 | modinfo = { | |
7 | 'author': 'Erebus Team', | |
8 | 'license': 'public domain', | |
a62d0d18 | 9 | 'compatible': [1,2], |
10 | 'depends': [], | |
11 | 'softdeps': [], | |
0f8352dd | 12 | } |
13 | ||
14 | # preamble | |
15 | import modlib | |
16 | lib = modlib.modlib(__name__) | |
17 | modstart = lib.modstart | |
18 | modstop = lib.modstop | |
19 | ||
20 | # module code | |
bc68cb5e | 21 | import os.path |
0f8352dd | 22 | helps = {} |
23 | cmds = {} | |
24 | ||
25 | # ! this is part of this module's API, called from modlib.help() | |
0f8352dd | 26 | def 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 | ||
55 | def dereghelp(func, *args, **kwargs): | |
56 | for c in func.cmd: | |
bc68cb5e | 57 | del cmds[c] |
0f8352dd | 58 | del helps[func] |
59 | ||
7d0de55e | 60 | class 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 | 82 | def _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 | ||
91 | def _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>]" | |
109 | def 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) | |
119 | def 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") | |
134 | def 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 | 153 | def 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 | """ |
184 | pass |