From: zonidjan Date: Tue, 3 Dec 2013 10:15:55 +0000 (-0600) Subject: Added a few module featuresm depends needs testing! X-Git-Url: https://jfr.im/git/erebus.git/commitdiff_plain/e4255e706c1531dee26437dd5a1301003dfc01c3?hp=676b2a8513b7f595d987e3124a831ea2e17b29d5 Added a few module featuresm depends needs testing! --- diff --git a/ctlmod.py b/ctlmod.py index 86943d1..25046aa 100644 --- a/ctlmod.py +++ b/ctlmod.py @@ -1,6 +1,8 @@ import sys +import modlib modules = {} +dependents = {} def isloaded(modname): return modname in modules def modhas(modname, attname): return getattr(self.modules[modname], attname, None) is not None @@ -8,19 +10,41 @@ def modhas(modname, attname): return getattr(self.modules[modname], attname, Non def load(parent, modname): if not isloaded(modname): mod = __import__(modname) + reload(mod) + + if 1 not in mod.modinfo['compatible']: + return modlib.error('API-incompatible') + modules[modname] = mod + dependents[modname] = [] + + for dep in mod.modinfo['depends']: + if dep not in modules: + depret = load(parent, dep) + if not depret: + return + dependents[dep].append(modname) + + ret = mod.modstart(parent) - if not ret: + if ret is not None and not ret: del modules[modname] + del dependents[modname] + for dep in mod.modinfo['depends']: + dependents[dep].remove(modname) return ret - else: - return -1 + else: #if not isloaded...else: + return modlib.error('already loaded') def unload(parent, modname): if isloaded(modname): + for dependent in dependents[modname]: + unload(parent, dependent) + for dep in dependents[modname]: + dependents[dep].remove(modname) self.modules[modname].modstop(parent) else: - return -1 + return modlib.error('already unloaded') def reloadmod(parent, modname): if isloaded(modname): diff --git a/erebus.py b/erebus.py index 6e1289e..c75183c 100644 --- a/erebus.py +++ b/erebus.py @@ -109,16 +109,8 @@ class Erebus(object): if bot.conn.state == 0: bot.connect() - #module functions - def modlist(self): pass - def hasmod(self, name): pass - def loadmod(self, name): pass - def unloadmod(self, name): pass - def reloadmod(self, name): pass - #bind functions def hook(self, word, handler): - print "hooked %r to %r" % (word, handler) self.msghandlers[word] = handler def unhook(self, word): del self.msghandlers[word] diff --git a/modlib.py b/modlib.py index 72c9fa2..323ef02 100644 --- a/modlib.py +++ b/modlib.py @@ -1,3 +1,13 @@ +class error(object): + def __init__(self, desc): + self.errormsg = desc + def __nonzero__(self): + return False #object will test to False + def __repr__(self): + return '' % self.errormsg + def __str__(self): + return self.errormsg + class modlib(object): def __init__(self, name): self.hooks = {} diff --git a/modules/eval.py b/modules/eval.py index 04f08fa..ff65cea 100644 --- a/modules/eval.py +++ b/modules/eval.py @@ -1,10 +1,18 @@ +# module info +modinfo = { + 'author': 'John Runyon (DimeCadmium)', + 'license': 'public domain', + 'compatible': [1], + 'depends': [], +} + # preamble import modlib lib = modlib.modlib(__name__) modstart = lib.modstart modstop = lib.modstop -#module code +# module code import sys diff --git a/modules/modtest.py b/modules/modtest.py index 928a834..75417e3 100644 --- a/modules/modtest.py +++ b/modules/modtest.py @@ -1,10 +1,18 @@ +# 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 +# module code @lib.hook('test') def cmd_test(bot, user, chan, *args): bot.msg(chan, "You said: !test %s" % (' '.join([str(arg) for arg in args])))