]> jfr.im git - erebus.git/blame - modlib.py
update TODO
[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
69071d33 25 OWNER = 5
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 = {}
db50981b 39 self.parent = None
40
6c70d82c 41 self.name = name
42
43 def modstart(self, parent):
44 self.parent = parent
45 for cmd, func in self.hooks.iteritems():
46 self.parent.hook(cmd, func)
61b67f0f 47 for num, func in self.numhooks.iteritems():
48 self.parent.hooknum(num, func)
2a1a69a6 49 for chan, func in self.chanhooks.iteritems():
50 self.parent.hookchan(chan, func)
d431e543 51 return True
db50981b 52 def modstop(self, parent):
53 for cmd, func in self.hooks.iteritems():
e4a4c762 54 self.parent.unhook(cmd, func)
61b67f0f 55 for num, func in self.numhooks.iteritems():
56 self.parent.unhooknum(num, func)
2a1a69a6 57 for chan, func in self.chanhooks.iteritems():
9557ee54 58 self.parent.unhookchan(chan, func)
d431e543 59 return True
6c70d82c 60
61b67f0f 61 def hooknum(self, num):
62 def realhook(func):
36411de9 63 self.numhooks[str(num)] = func
61b67f0f 64 if self.parent is not None:
36411de9 65 self.parent.hooknum(str(num), func)
61b67f0f 66 return func
67 return realhook
68
2a1a69a6 69 def hookchan(self, chan, glevel=ANYONE, clevel=PUBLIC):
70 def realhook(func):
71 self.chanhooks[chan] = func
72 if self.parent is not None:
73 self.parent.hookchan(chan, func)
74 return func
75 return realhook
76
839d2b35 77 def hook(self, cmd, needchan=True, glevel=ANYONE, clevel=PUBLIC):
6c70d82c 78 def realhook(func):
839d2b35 79 func.needchan = needchan
80 func.reqglevel = glevel
81 func.reqclevel = clevel
82
6c70d82c 83 self.hooks[cmd] = func
84 if self.parent is not None:
85 self.parent.hook(cmd, func)
86 return func
87 return realhook
d431e543 88
36411de9 89 def mod(self, modname):
90 if self.parent is not None:
91 return self.parent.module(modname)
92 else:
93 return error('unknown parent')
94
d431e543 95 def argsEQ(self, num):
96 def realhook(func):
97 def checkargs(bot, user, chan, realtarget, *args):
98 if len(args) == num:
99 return func(bot, user, chan, realtarget, *args)
100 else:
101 bot.msg(user, self.WRONGARGS)
102 return checkargs
103 return realhook
104
105 def argsGE(self, num):
106 def realhook(func):
107 def checkargs(bot, user, chan, realtarget, *args):
108 if len(args) >= num:
109 return func(bot, user, chan, realtarget, *args)
110 else:
111 bot.msg(user, self.WRONGARGS)
112 return checkargs
113 return realhook