]> jfr.im git - erebus.git/blame - ctlmod.py
Fixed header
[erebus.git] / ctlmod.py
CommitLineData
db75daab
JR
1# Erebus IRC bot - Author: John Runyon
2# module loading/unloading/tracking code
3
d1ea05b0 4import sys
28d7d32f 5import modlib
d1ea05b0
JR
6
7modules = {}
28d7d32f 8dependents = {}
d1ea05b0
JR
9
10def isloaded(modname): return modname in modules
32cabc3d 11def modhas(modname, attname): return getattr(modules[modname], attname, None) is not None
d1ea05b0
JR
12
13def load(parent, modname):
14 if not isloaded(modname):
15 mod = __import__(modname)
28d7d32f
JR
16 reload(mod)
17
7500b48c
JR
18 if not hasattr(mod, 'modinfo'):
19 return modlib.error('no modinfo')
20
28d7d32f
JR
21 if 1 not in mod.modinfo['compatible']:
22 return modlib.error('API-incompatible')
23
d1ea05b0 24 modules[modname] = mod
28d7d32f
JR
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
d1ea05b0 35 ret = mod.modstart(parent)
28d7d32f 36 if ret is not None and not ret:
d1ea05b0 37 del modules[modname]
28d7d32f
JR
38 del dependents[modname]
39 for dep in mod.modinfo['depends']:
40 dependents[dep].remove(modname)
d1ea05b0 41 return ret
28d7d32f
JR
42 else: #if not isloaded...else:
43 return modlib.error('already loaded')
d1ea05b0
JR
44
45def unload(parent, modname):
46 if isloaded(modname):
28d7d32f
JR
47 for dependent in dependents[modname]:
48 unload(parent, dependent)
49 for dep in dependents[modname]:
50 dependents[dep].remove(modname)
32cabc3d 51 return modules[modname].modstop(parent)
d1ea05b0 52 else:
28d7d32f 53 return modlib.error('already unloaded')
d1ea05b0
JR
54
55def reloadmod(parent, modname):
56 if isloaded(modname):
32cabc3d
JR
57 if modhas(modname, 'modrestart'): modules[modname].modrestart(parent)
58 else: modules[modname].modstop(parent)
d1ea05b0 59
32cabc3d 60 reload(modules[modname])
d1ea05b0 61
32cabc3d
JR
62 if modhas(modname, 'modrestarted'): modules[modname].modrestarted(parent)
63 else: modules[modname].modstart(parent)
d1ea05b0
JR
64
65 else:
66 load(parent, modname)
67
68def loadall(parent, modlist):
69 for m in modlist: load(parent, m)
70def unloadall(parent, modlist):
71 for m in modlist: unload(parent, m)
72def reloadall(parent, modlist):
73 for m in modlist: reloadmod(parent, m)
74
75sys.path.append('modules')