X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/d431e54309841dcdb50d440e440234200d0de2fc..5f42c250f797d8cf1bca89d431134764d97c63fd:/ctlmod.py diff --git a/ctlmod.py b/ctlmod.py index b6fe1a9..ab9145a 100644 --- a/ctlmod.py +++ b/ctlmod.py @@ -1,7 +1,7 @@ # Erebus IRC bot - Author: John Runyon # module loading/unloading/tracking code -import sys +import sys, time import modlib modules = {} @@ -10,12 +10,40 @@ dependents = {} def isloaded(modname): return modname in modules def modhas(modname, attname): return getattr(modules[modname], attname, None) is not None -def load(parent, modname): +def load(parent, modname, dependent=False): + #wrapper to call _load and print return + if dependent: + print "Loading dependency %s..." % (modname), + else: + print "%05.3f [MOD] [#] Loading %s... " % (time.time() % 100000, modname), + modstatus = _load(parent, modname, dependent) + if not modstatus: + print str(modstatus) + elif modstatus == True: + if dependent: + print "OK. ", + else: + print "OK." + else: + print modstatus + return modstatus + +def _load(parent, modname, dependent=False): if not isloaded(modname): - mod = __import__(modname) - reload(mod) + sys.path.insert(0, 'modules') + try: + mod = __import__(modname) + reload(mod) #in case it's been previously loaded. + except BaseException as e: #we don't want even sys.exit() to crash us (in case of malicious module) so use BaseException + return modlib.error(e) + finally: + del sys.path[0] #remove ./modules from path, in case there's a name conflict + - if 1 not in mod.modinfo['compatible']: + if not hasattr(mod, 'modinfo'): + return modlib.error('no modinfo') + + if parent.APIVERSION not in mod.modinfo['compatible']: return modlib.error('API-incompatible') modules[modname] = mod @@ -23,7 +51,7 @@ def load(parent, modname): for dep in mod.modinfo['depends']: if dep not in modules: - depret = load(parent, dep) + depret = load(parent, dep, dependent=True) if not depret: return dependents[dep].append(modname) @@ -45,7 +73,9 @@ def unload(parent, modname): unload(parent, dependent) for dep in dependents[modname]: dependents[dep].remove(modname) - return modules[modname].modstop(parent) + ret = modules[modname].modstop(parent) + del modules[modname] + return ret else: return modlib.error('already unloaded') @@ -54,13 +84,18 @@ def reloadmod(parent, modname): if modhas(modname, 'modrestart'): modules[modname].modrestart(parent) else: modules[modname].modstop(parent) - reload(modules[modname]) + try: + reload(modules[modname]) + except BaseException as e: + return modlib.error(e) - if modhas(modname, 'modrestarted'): modules[modname].modrestarted(parent) - else: modules[modname].modstart(parent) + if modhas(modname, 'modrestarted'): ret = modules[modname].modrestarted(parent) + else: ret = modules[modname].modstart(parent) + return ret else: - load(parent, modname) + return load(parent, modname) + def loadall(parent, modlist): for m in modlist: load(parent, m)