]>
Commit | Line | Data |
---|---|---|
931c88a4 | 1 | # Erebus IRC bot - Author: John Runyon |
2 | # module loading/unloading/tracking code | |
3 | ||
db50981b | 4 | import sys |
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 | |
13 | def load(parent, modname): | |
14 | if not isloaded(modname): | |
15 | mod = __import__(modname) | |
e4255e70 | 16 | reload(mod) |
17 | ||
6b2c681d | 18 | if not hasattr(mod, 'modinfo'): |
19 | return modlib.error('no modinfo') | |
20 | ||
e4255e70 | 21 | if 1 not in mod.modinfo['compatible']: |
22 | return modlib.error('API-incompatible') | |
23 | ||
db50981b | 24 | modules[modname] = mod |
e4255e70 | 25 | dependents[modname] = [] |
26 | ||
27 | for dep in mod.modinfo['depends']: | |
28 | if dep not in modules: | |
29 | depret = load(parent, dep) | |
30 | if not depret: | |
31 | return | |
32 | dependents[dep].append(modname) | |
33 | ||
34 | ||
db50981b | 35 | ret = mod.modstart(parent) |
e4255e70 | 36 | if ret is not None and not ret: |
db50981b | 37 | del modules[modname] |
e4255e70 | 38 | del dependents[modname] |
39 | for dep in mod.modinfo['depends']: | |
40 | dependents[dep].remove(modname) | |
db50981b | 41 | return ret |
e4255e70 | 42 | else: #if not isloaded...else: |
43 | return modlib.error('already loaded') | |
db50981b | 44 | |
45 | def unload(parent, modname): | |
46 | if isloaded(modname): | |
e4255e70 | 47 | for dependent in dependents[modname]: |
48 | unload(parent, dependent) | |
49 | for dep in dependents[modname]: | |
50 | dependents[dep].remove(modname) | |
d431e543 | 51 | return modules[modname].modstop(parent) |
db50981b | 52 | else: |
e4255e70 | 53 | return modlib.error('already unloaded') |
db50981b | 54 | |
55 | def reloadmod(parent, modname): | |
56 | if isloaded(modname): | |
d431e543 | 57 | if modhas(modname, 'modrestart'): modules[modname].modrestart(parent) |
58 | else: modules[modname].modstop(parent) | |
db50981b | 59 | |
d431e543 | 60 | reload(modules[modname]) |
db50981b | 61 | |
d431e543 | 62 | if modhas(modname, 'modrestarted'): modules[modname].modrestarted(parent) |
63 | else: modules[modname].modstart(parent) | |
db50981b | 64 | |
65 | else: | |
66 | load(parent, modname) | |
67 | ||
68 | def loadall(parent, modlist): | |
69 | for m in modlist: load(parent, m) | |
70 | def unloadall(parent, modlist): | |
71 | for m in modlist: unload(parent, m) | |
72 | def reloadall(parent, modlist): | |
73 | for m in modlist: reloadmod(parent, m) | |
74 | ||
75 | sys.path.append('modules') |