]> jfr.im git - erebus.git/blame - modlib.py
trivia - updated example json
[erebus.git] / modlib.py
CommitLineData
931c88a4 1# Erebus IRC bot - Author: John Runyon
2# module helper functions, see modules/modtest.py for usage
3# This file is released into the public domain; see http://unlicense.org/
4
e4255e70 5class error(object):
6 def __init__(self, desc):
7 self.errormsg = desc
8 def __nonzero__(self):
9 return False #object will test to False
10 def __repr__(self):
11 return '<modlib.error %r>' % self.errormsg
12 def __str__(self):
e3878612 13 return str(self.errormsg)
e4255e70 14
6c70d82c 15class modlib(object):
839d2b35 16 # default (global) access levels
69071d33 17 OWNER = 100
18 MANAGER = 99
19 ADMIN = 75
20 STAFF = 50
21 AUTHED = 0
22 ANYONE = -1
931c88a4 23
839d2b35 24 # (channel) access levels
a290635a 25 COWNER = 5
69071d33 26 MASTER = 4
27 OP = 3
28 VOICE = 2
29 KNOWN = 1
30 PUBLIC = 0 #anyone (use glevel to control auth-needed)
839d2b35 31
d431e543 32 # messages
33 WRONGARGS = "Wrong number of arguments."
34
6c70d82c 35 def __init__(self, name):
db50981b 36 self.hooks = {}
61b67f0f 37 self.numhooks = {}
2a1a69a6 38 self.chanhooks = {}
0f8352dd 39 self.helps = []
db50981b 40 self.parent = None
41
a8553c45 42 self.name = (name.split("."))[-1]
6c70d82c 43
44 def modstart(self, parent):
45 self.parent = parent
46 for cmd, func in self.hooks.iteritems():
47 self.parent.hook(cmd, func)
a290635a 48 self.parent.hook("%s.%s" % (self.name, cmd), func)
61b67f0f 49 for num, func in self.numhooks.iteritems():
50 self.parent.hooknum(num, func)
2a1a69a6 51 for chan, func in self.chanhooks.iteritems():
52 self.parent.hookchan(chan, func)
0f8352dd 53
54 for func, args, kwargs in self.helps:
55 try:
56 self.mod('help').reghelp(func, *args, **kwargs)
57 except:
58 pass
d431e543 59 return True
db50981b 60 def modstop(self, parent):
61 for cmd, func in self.hooks.iteritems():
e4a4c762 62 self.parent.unhook(cmd, func)
a290635a 63 self.parent.unhook("%s.%s" % (self.name, cmd), func)
61b67f0f 64 for num, func in self.numhooks.iteritems():
65 self.parent.unhooknum(num, func)
2a1a69a6 66 for chan, func in self.chanhooks.iteritems():
9557ee54 67 self.parent.unhookchan(chan, func)
0f8352dd 68
69 for func, args, kwargs in self.helps:
70 try:
71 self.mod('help').dereghelp(func, *args, **kwargs)
72 except:
73 pass
d431e543 74 return True
6c70d82c 75
61b67f0f 76 def hooknum(self, num):
77 def realhook(func):
36411de9 78 self.numhooks[str(num)] = func
61b67f0f 79 if self.parent is not None:
36411de9 80 self.parent.hooknum(str(num), func)
61b67f0f 81 return func
82 return realhook
83
2a1a69a6 84 def hookchan(self, chan, glevel=ANYONE, clevel=PUBLIC):
85 def realhook(func):
86 self.chanhooks[chan] = func
87 if self.parent is not None:
88 self.parent.hookchan(chan, func)
89 return func
90 return realhook
91
3a8b7b5f 92 def hook(self, cmd=None, needchan=True, glevel=ANYONE, clevel=PUBLIC):
93 _cmd = cmd #save this since it gets wiped out...
6c70d82c 94 def realhook(func):
3a8b7b5f 95 cmd = _cmd #...and restore it
96 if cmd is None:
97 cmd = func.__name__ # default to function name
0f8352dd 98 if isinstance(cmd, basestring):
99 cmd = (cmd,)
3a8b7b5f 100
839d2b35 101 func.needchan = needchan
102 func.reqglevel = glevel
103 func.reqclevel = clevel
0f8352dd 104 func.cmd = cmd
839d2b35 105
9ea2be43 106 for c in cmd:
107 self.hooks[c] = func
108 if self.parent is not None:
109 self.parent.hook(c, func)
a290635a 110 self.parent.hook("%s.%s" % (self.name, c), func)
6c70d82c 111 return func
112 return realhook
d431e543 113
36411de9 114 def mod(self, modname):
115 if self.parent is not None:
116 return self.parent.module(modname)
117 else:
118 return error('unknown parent')
119
d431e543 120 def argsEQ(self, num):
121 def realhook(func):
122 def checkargs(bot, user, chan, realtarget, *args):
123 if len(args) == num:
124 return func(bot, user, chan, realtarget, *args)
125 else:
126 bot.msg(user, self.WRONGARGS)
3a8b7b5f 127 checkargs.__name__ = func.__name__
11ef6fed 128 checkargs.__module__ = func.__module__
d431e543 129 return checkargs
130 return realhook
131
132 def argsGE(self, num):
133 def realhook(func):
134 def checkargs(bot, user, chan, realtarget, *args):
135 if len(args) >= num:
136 return func(bot, user, chan, realtarget, *args)
137 else:
138 bot.msg(user, self.WRONGARGS)
3a8b7b5f 139 checkargs.__name__ = func.__name__
11ef6fed 140 checkargs.__module__ = func.__module__
d431e543 141 return checkargs
142 return realhook
b670c2f4 143
984fc310 144 def help(self, *args, **kwargs):
0f8352dd 145 """help(syntax, shorthelp, longhelp?, more lines longhelp?, cmd=...?)
b670c2f4 146 Example:
147 help("<user> <pass>", "login")
148 ^ Help will only be one line. Command name determined based on function name.
149 help("<user> <level>", "add a user", cmd=("adduser", "useradd"))
150 ^ Help will be listed under ADDUSER; USERADD will say "alias for adduser"
151 help(None, "do stuff", "This command is really complicated.")
152 ^ Command takes no args. Short description (in overall HELP listing) is "do stuff".
153 Long description (HELP <command>) will say "<command> - do stuff", newline, "This command is really complicated."
154 """
0f8352dd 155 def realhook(func):
156 if self.parent is not None:
157 try:
158 self.mod('help').reghelp(func, *args, **kwargs)
159 except:
160 pass
161 self.helps.append((func,args,kwargs))
162 return func
163 return realhook