]>
Commit | Line | Data |
---|---|---|
931c88a4 | 1 | # Erebus IRC bot - Author: John Runyon |
2 | # module loading/unloading/tracking code | |
3 | ||
b9c6eb1d | 4 | import sys, time |
e4255e70 | 5 | import modlib |
db50981b | 6 | |
7 | modules = {} | |
e4255e70 | 8 | dependents = {} |
db50981b | 9 | |
10 | def isloaded(modname): return modname in modules | |
d431e543 | 11 | def modhas(modname, attname): return getattr(modules[modname], attname, None) is not None |
db50981b | 12 | |
b9c6eb1d | 13 | def load(parent, modname, dependent=False): |
14 | #wrapper to call _load and print return | |
15 | if dependent: | |
16 | print "Loading dependency %s..." % (modname), | |
17 | else: | |
3d724d3a | 18 | print "%09.3f [MOD] [#] Loading %s... " % (time.time() % 100000, modname), |
b9c6eb1d | 19 | modstatus = _load(parent, modname, dependent) |
20 | if not modstatus: | |
21 | print str(modstatus) | |
22 | elif modstatus == True: | |
23 | if dependent: | |
24 | print "OK. ", | |
25 | else: | |
26 | print "OK." | |
27 | else: | |
28 | print modstatus | |
29 | return modstatus | |
30 | ||
31 | def _load(parent, modname, dependent=False): | |
db50981b | 32 | if not isloaded(modname): |
96d0b31e | 33 | try: |
83ed3882 | 34 | mod = __import__('modules.'+modname, globals(), locals(), ['*'], -1) |
35 | # ^ fromlist doesn't actually do anything(?) but it means we don't have to worry about this returning the top-level "modules" object | |
8ba56606 | 36 | reload(mod) #in case it's been previously loaded. |
83ed3882 | 37 | except Exception as e: |
96d0b31e | 38 | return modlib.error(e) |
20df9fbb | 39 | |
e4255e70 | 40 | |
6b2c681d | 41 | if not hasattr(mod, 'modinfo'): |
42 | return modlib.error('no modinfo') | |
43 | ||
a76c4bd8 | 44 | if parent.APIVERSION not in mod.modinfo['compatible']: |
e4255e70 | 45 | return modlib.error('API-incompatible') |
46 | ||
db50981b | 47 | modules[modname] = mod |
e4255e70 | 48 | dependents[modname] = [] |
49 | ||
50 | for dep in mod.modinfo['depends']: | |
51 | if dep not in modules: | |
b9c6eb1d | 52 | depret = load(parent, dep, dependent=True) |
e4255e70 | 53 | if not depret: |
54 | return | |
55 | dependents[dep].append(modname) | |
56 | ||
57 | ||
db50981b | 58 | ret = mod.modstart(parent) |
e4255e70 | 59 | if ret is not None and not ret: |
db50981b | 60 | del modules[modname] |
e4255e70 | 61 | del dependents[modname] |
62 | for dep in mod.modinfo['depends']: | |
63 | dependents[dep].remove(modname) | |
db50981b | 64 | return ret |
e4255e70 | 65 | else: #if not isloaded...else: |
66 | return modlib.error('already loaded') | |
db50981b | 67 | |
68 | def unload(parent, modname): | |
69 | if isloaded(modname): | |
e4255e70 | 70 | for dependent in dependents[modname]: |
71 | unload(parent, dependent) | |
72 | for dep in dependents[modname]: | |
73 | dependents[dep].remove(modname) | |
5a81c82b | 74 | ret = modules[modname].modstop(parent) |
75 | del modules[modname] | |
76 | return ret | |
db50981b | 77 | else: |
e4255e70 | 78 | return modlib.error('already unloaded') |
db50981b | 79 | |
80 | def reloadmod(parent, modname): | |
81 | if isloaded(modname): | |
d431e543 | 82 | if modhas(modname, 'modrestart'): modules[modname].modrestart(parent) |
83 | else: modules[modname].modstop(parent) | |
db50981b | 84 | |
e3878612 | 85 | try: |
65b86c90 | 86 | reload(modules[modname]) |
96d0b31e | 87 | except BaseException as e: |
e3878612 | 88 | return modlib.error(e) |
db50981b | 89 | |
8ba56606 | 90 | if modhas(modname, 'modrestarted'): ret = modules[modname].modrestarted(parent) |
91 | else: ret = modules[modname].modstart(parent) | |
db50981b | 92 | |
8ba56606 | 93 | return ret |
db50981b | 94 | else: |
e3878612 | 95 | return load(parent, modname) |
96 | ||
db50981b | 97 | |
98 | def loadall(parent, modlist): | |
99 | for m in modlist: load(parent, m) | |
100 | def unloadall(parent, modlist): | |
101 | for m in modlist: unload(parent, m) | |
102 | def reloadall(parent, modlist): | |
103 | for m in modlist: reloadmod(parent, m) |