# Erebus IRC bot - Author: John Runyon
+# vim: fileencoding=utf-8
# module helper functions, see modules/modtest.py for usage
# This file is released into the public domain; see http://unlicense.org/
import sys
+from functools import wraps
if sys.version_info.major < 3:
stringbase = basestring
else:
stringbase = str
+"""Used to return an error to the bot core."""
class error(object):
def __init__(self, desc):
self.errormsg = desc
MANAGER = 99
ADMIN = 75
STAFF = 50
- AUTHED = 0
- ANYONE = -1
- IGNORED = -2
+ KNOWN = 1
+ AUTHED = 0 # Users which have are known to be authed
+ ANYONE = -1 # non-authed users have glevel set to -1
+ IGNORED = -2 # The default reqglevel is ANYONE, so any commands will be ignored from IGNORED users unless the command reglevel=-2
+ glevs = {
+ 'OWNER': OWNER,
+ 'MANAGER': MANAGER,
+ 'ADMIN': ADMIN,
+ 'STAFF': STAFF,
+ 'KNOWN': KNOWN,
+ 'AUTHED': AUTHED,
+ 'ANYONE': ANYONE,
+ 'IGNORED': IGNORED,
+ }
# (channel) access levels
COWNER = 5
MASTER = 4
OP = 3
VOICE = 2
- KNOWN = 1
- PUBLIC = 0 #anyone (use glevel to control auth-needed)
- BANNED = -1
+ #KNOWN = 1 is set above by glevels
+ PUBLIC = 0 # Anyone (use glevel to control whether auth is needed)
+ BANNED = -1 # The default reqclevel is PUBLIC, so any commands which needchan will be ignored from BANNED users unless the command reqclevel=-1
# [ 0 1 2 3 4 5 -1]
clevs = [None, 'Friend', 'Voice', 'Op', 'Master', 'Owner', None]
self.hooks = {}
self.numhooks = {}
self.chanhooks = {}
+ self.exceptionhooks = []
self.helps = []
self.parent = None
#"specified" values will be printed. unspecified values will result in "OK" or "failed"
self.parent = parent
for cmd, func in self.hooks.items():
- self.parent.hook(cmd, func)
- self.parent.hook("%s.%s" % (self.name, cmd), func)
+ parent.hook(cmd, func)
+ parent.hook("%s.%s" % (self.name, cmd), func)
for num, func in self.numhooks.items():
- self.parent.hooknum(num, func)
+ parent.hooknum(num, func)
for chan, func in self.chanhooks.items():
- self.parent.hookchan(chan, func)
+ parent.hookchan(chan, func)
+ for exc, func in self.exceptionhooks:
+ parent.hookexception(exc, func)
for func, args, kwargs in self.helps:
try:
parent.unhooknum(num, func)
for chan, func in self.chanhooks.items():
parent.unhookchan(chan, func)
+ for exc, func in self.exceptionhooks:
+ parent.unhookexception(exc, func)
for func, args, kwargs in self.helps:
try:
pass
return True
+ def hookexception(self, exc):
+ def realhook(func):
+ self.exceptionhooks.append((exc, func))
+ if self.parent is not None:
+ self.parent.hookexception(exc, func)
+ return func
+ return realhook
+
def hooknum(self, num):
def realhook(func):
self.numhooks[str(num)] = func
if isinstance(cmd, stringbase):
cmd = (cmd,)
+ if clevel > self.PUBLIC and not needchan:
+ raise Exception('clevel must be left at default if needchan is False')
+
func.needchan = needchan
func.wantchan = wantchan
func.reqglevel = glevel
def argsEQ(self, num):
def realhook(func):
+ @wraps(func)
def checkargs(bot, user, chan, realtarget, *args):
if len(args) == num:
return func(bot, user, chan, realtarget, *args)
else:
bot.msg(user, self.WRONGARGS)
- checkargs.__name__ = func.__name__
- checkargs.__module__ = func.__module__
return checkargs
return realhook
def argsGE(self, num):
def realhook(func):
+ @wraps(func)
def checkargs(bot, user, chan, realtarget, *args):
if len(args) >= num:
return func(bot, user, chan, realtarget, *args)
else:
bot.msg(user, self.WRONGARGS)
- checkargs.__name__ = func.__name__
- checkargs.__module__ = func.__module__
return checkargs
return realhook