]> jfr.im git - erebus.git/blame - ctlmod.py
Added extra parameter to callbacks, "realtarget"
[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
11def modhas(modname, attname): return getattr(self.modules[modname], attname, None) is not None
12
13def load(parent, modname):
14 if not isloaded(modname):
15 mod = __import__(modname)
28d7d32f
JR
16 reload(mod)
17
18 if 1 not in mod.modinfo['compatible']:
19 return modlib.error('API-incompatible')
20
d1ea05b0 21 modules[modname] = mod
28d7d32f
JR
22 dependents[modname] = []
23
24 for dep in mod.modinfo['depends']:
25 if dep not in modules:
26 depret = load(parent, dep)
27 if not depret:
28 return
29 dependents[dep].append(modname)
30
31
d1ea05b0 32 ret = mod.modstart(parent)
28d7d32f 33 if ret is not None and not ret:
d1ea05b0 34 del modules[modname]
28d7d32f
JR
35 del dependents[modname]
36 for dep in mod.modinfo['depends']:
37 dependents[dep].remove(modname)
d1ea05b0 38 return ret
28d7d32f
JR
39 else: #if not isloaded...else:
40 return modlib.error('already loaded')
d1ea05b0
JR
41
42def unload(parent, modname):
43 if isloaded(modname):
28d7d32f
JR
44 for dependent in dependents[modname]:
45 unload(parent, dependent)
46 for dep in dependents[modname]:
47 dependents[dep].remove(modname)
d1ea05b0
JR
48 self.modules[modname].modstop(parent)
49 else:
28d7d32f 50 return modlib.error('already unloaded')
d1ea05b0
JR
51
52def reloadmod(parent, modname):
53 if isloaded(modname):
54 if modhas(modname, 'modrestart'): self.modules[modname].modrestart(parent)
55 else: self.modules[modname].modstop(parent)
56
57 reload(self.modules[modname])
58
59 if modhas(modname, 'modrestarted'): self.modules[modname].modrestarted(parent)
60 else: self.modules[modname].modstart(parent)
61
62 else:
63 load(parent, modname)
64
65def loadall(parent, modlist):
66 for m in modlist: load(parent, m)
67def unloadall(parent, modlist):
68 for m in modlist: unload(parent, m)
69def reloadall(parent, modlist):
70 for m in modlist: reloadmod(parent, m)
71
72sys.path.append('modules')