From: zonidjan Date: Thu, 23 Jan 2014 20:47:38 +0000 (-0600) Subject: Added !MODLOAD, !MODUNLOAD, !MODRELOAD X-Git-Url: https://jfr.im/git/erebus.git/commitdiff_plain/d431e54309841dcdb50d440e440234200d0de2fc?ds=sidebyside;hp=8af0407d500b8e27e8f3628f1083be30b6d2cf75 Added !MODLOAD, !MODUNLOAD, !MODRELOAD --- diff --git a/bot.py b/bot.py index 603b966..0f2c7e6 100644 --- a/bot.py +++ b/bot.py @@ -111,7 +111,9 @@ class Bot(object): 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.") diff --git a/ctlmod.py b/ctlmod.py index 24dd236..b6fe1a9 100644 --- a/ctlmod.py +++ b/ctlmod.py @@ -8,7 +8,7 @@ modules = {} 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): @@ -45,19 +45,19 @@ def unload(parent, 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) diff --git a/erebus.py b/erebus.py index 7c7dc92..c91e24c 100644 --- a/erebus.py +++ b/erebus.py @@ -164,6 +164,7 @@ def setup(): 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) diff --git a/modlib.py b/modlib.py index 743e36d..717406a 100644 --- a/modlib.py +++ b/modlib.py @@ -15,8 +15,8 @@ class error(object): class modlib(object): # default (global) access levels MANAGER = 100 - ADMIN = 90 - STAFF = 80 + ADMIN = 75 + STAFF = 50 AUTHED = 0 ANYONE = -1 @@ -28,6 +28,9 @@ class modlib(object): 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 @@ -38,9 +41,11 @@ class modlib(object): 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): @@ -53,3 +58,23 @@ class modlib(object): 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 diff --git a/modules/eval.py b/modules/eval.py index 5ac60fd..159635f 100644 --- a/modules/eval.py +++ b/modules/eval.py @@ -20,6 +20,7 @@ import sys @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 @@ -30,6 +31,7 @@ def cmd_eval(bot, user, chan, realtarget, *args): @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 diff --git a/modules/modtest.py b/modules/foo.py similarity index 97% rename from modules/modtest.py rename to modules/foo.py index f2f96d2..f5a69fe 100644 --- a/modules/modtest.py +++ b/modules/foo.py @@ -17,6 +17,8 @@ modstart = lib.modstart 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]))) diff --git a/modules/module.py b/modules/module.py new file mode 100644 index 0000000..3d9b3e1 --- /dev/null +++ b/modules/module.py @@ -0,0 +1,49 @@ +# 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