return
if user.glevel >= callback.reqglevel:
#TODO TODO TODO check reqclevel
- callback(self, user, chan, target, *pieces[1:])
+ cbret = callback(self, user, chan, target, *pieces[1:])
+ if cbret is NotImplemented:
+ self.msg(user, "Command not implemented.")
return
self.msg(user, "No such command, or you don't have access.")
dependents = {}
def isloaded(modname): return modname in modules
-def modhas(modname, attname): return getattr(self.modules[modname], attname, None) is not None
+def modhas(modname, attname): return getattr(modules[modname], attname, None) is not None
def load(parent, modname):
if not isloaded(modname):
unload(parent, dependent)
for dep in dependents[modname]:
dependents[dep].remove(modname)
- self.modules[modname].modstop(parent)
+ return modules[modname].modstop(parent)
else:
return modlib.error('already unloaded')
def reloadmod(parent, modname):
if isloaded(modname):
- if modhas(modname, 'modrestart'): self.modules[modname].modrestart(parent)
- else: self.modules[modname].modstop(parent)
+ if modhas(modname, 'modrestart'): modules[modname].modrestart(parent)
+ else: modules[modname].modstop(parent)
- reload(self.modules[modname])
+ reload(modules[modname])
- if modhas(modname, 'modrestarted'): self.modules[modname].modrestarted(parent)
- else: self.modules[modname].modstart(parent)
+ if modhas(modname, 'modrestarted'): modules[modname].modrestarted(parent)
+ else: modules[modname].modstart(parent)
else:
load(parent, modname)
autoloads = [mod for mod, yes in cfg.items('autoloads') if int(yes) == 1]
for mod in autoloads:
+ print "Loading %s" % (mod)
ctlmod.load(main, mod)
main.db = MySQLdb.connect(host=cfg.dbhost, user=cfg.dbuser, passwd=cfg.dbpass, db=cfg.dbname, cursorclass=MySQLdb.cursors.DictCursor)
class modlib(object):
# default (global) access levels
MANAGER = 100
- ADMIN = 90
- STAFF = 80
+ ADMIN = 75
+ STAFF = 50
AUTHED = 0
ANYONE = -1
KNOWN = -3
PUBLIC = -2 #anyone (use glevel to control auth-needed)
+ # messages
+ WRONGARGS = "Wrong number of arguments."
+
def __init__(self, name):
self.hooks = {}
self.parent = None
self.parent = parent
for cmd, func in self.hooks.iteritems():
self.parent.hook(cmd, func)
+ return True
def modstop(self, parent):
for cmd, func in self.hooks.iteritems():
- self.parent.unhook(cmd, func)
+ self.parent.unhook(cmd)
+ return True
def hook(self, cmd, needchan=True, glevel=ANYONE, clevel=PUBLIC):
def realhook(func):
self.parent.hook(cmd, func)
return func
return realhook
+
+ def argsEQ(self, num):
+ def realhook(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)
+ return checkargs
+ return realhook
+
+ def argsGE(self, num):
+ def realhook(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)
+ return checkargs
+ return realhook
@lib.hook('eval', needchan=False, glevel=lib.MANAGER)
+@lib.argsGE(1)
def cmd_eval(bot, user, chan, realtarget, *args):
if chan is not None: replyto = chan
else: replyto = user
@lib.hook('exec', needchan=False, glevel=lib.MANAGER)
+@lib.argsGE(1)
def cmd_exec(bot, user, chan, realtarget, *args):
if chan is not None: replyto = chan
else: replyto = user
modstop = lib.modstop
# module code
+import ctlmod
+
@lib.hook('test')
def cmd_test(bot, user, chan, realtarget, *args):
bot.msg(chan, "You said: !test %s" % (' '.join([str(arg) for arg in args])))
--- /dev/null
+# Erebus IRC bot - Author: John Runyon
+# simple module example
+# This file is released into the public domain; see http://unlicense.org/
+
+# module info
+modinfo = {
+ 'author': 'John Runyon (DimeCadmium)',
+ 'license': 'public domain',
+ 'compatible': [1], # compatible module API versions
+ 'depends': [], # other modules required to work properly?
+}
+
+# preamble
+import modlib
+lib = modlib.modlib(__name__)
+modstart = lib.modstart
+modstop = lib.modstop
+
+# module code
+import ctlmod
+
+@lib.hook('modload', needchan=False, glevel=lib.MANAGER)
+@lib.argsEQ(1)
+def cmd_modload(bot, user, chan, realtarget, *args):
+ okay = ctlmod.load(bot.parent, args[0])
+ if okay:
+ bot.msg(user, "Loaded %s" % (args[0]))
+ else:
+ bot.msg(user, "Error loading %s: %r" % (args[0], okay))
+
+@lib.hook('modunload', needchan=False, glevel=lib.MANAGER)
+@lib.argsEQ(1)
+def cmd_modunload(bot, user, chan, realtarget, *args):
+ okay = ctlmod.unload(bot.parent, args[0])
+ if okay:
+ bot.msg(user, "Unloaded %s" % (args[0]))
+ else:
+ bot.msg(user, "Error unloading %s: %r" % (args[0], okay))
+
+@lib.hook('modreload', needchan=False, glevel=lib.MANAGER)
+@lib.argsEQ(1)
+def cmd_modreload(bot, user, chan, realtarget, *args):
+ okay = ctlmod.reloadmod(bot.parent, args[0])
+ bot.msg(user, "Reloaded %s" % (args[0]))
+
+@lib.hook('modlist', needchan=False, glevel=lib.STAFF)
+@lib.argsEQ(0)
+def cmd_modlist(bot, user, chan, realtarget, *args):
+ return NotImplemented