# 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
def __nonzero__(self):
return False #object will test to False
+ __bool__ = __nonzero__ #py3 compat
def __repr__(self):
return '<modlib.error %r>' % self.errormsg
def __str__(self):
MANAGER = 99
ADMIN = 75
STAFF = 50
- AUTHED = 0
- ANYONE = -1
- IGNORED = -2
+ 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
# (channel) access levels
COWNER = 5
OP = 3
VOICE = 2
KNOWN = 1
- PUBLIC = 0 #anyone (use glevel to control auth-needed)
- BANNED = -1
+ 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]
# non-empty string (or anything else True-y): specified success
#"specified" values will be printed. unspecified values will result in "OK" or "failed"
self.parent = parent
- for cmd, func in self.hooks.iteritems():
+ for cmd, func in self.hooks.items():
self.parent.hook(cmd, func)
self.parent.hook("%s.%s" % (self.name, cmd), func)
- for num, func in self.numhooks.iteritems():
+ for num, func in self.numhooks.items():
self.parent.hooknum(num, func)
- for chan, func in self.chanhooks.iteritems():
+ for chan, func in self.chanhooks.items():
self.parent.hookchan(chan, func)
for func, args, kwargs in self.helps:
pass
return True
def modstop(self, parent):
- for cmd, func in self.hooks.iteritems():
+ for cmd, func in self.hooks.items():
parent.unhook(cmd, func)
parent.unhook("%s.%s" % (self.name, cmd), func)
- for num, func in self.numhooks.iteritems():
+ for num, func in self.numhooks.items():
parent.unhooknum(num, func)
- for chan, func in self.chanhooks.iteritems():
+ for chan, func in self.chanhooks.items():
parent.unhookchan(chan, func)
for func, args, kwargs in self.helps:
cmd = _cmd #...and restore it
if cmd is None:
cmd = func.__name__ # default to function name
- if isinstance(cmd, basestring):
+ 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
self.mod('help').reghelp(func, *args, **kwargs)
except:
pass
- self.helps.append((func,args,kwargs))
+ self.helps.append((func, args, kwargs))
return func
return realhook