]>
jfr.im git - erebus.git/blob - ctlmod.py
1 # Erebus IRC bot - Author: John Runyon
2 # module loading/unloading/tracking code
10 def isloaded(modname
): return modname
in modules
11 def modhas(modname
, attname
): return getattr(modules
[modname
], attname
, None) is not None
13 def load(parent
, modname
):
14 if not isloaded(modname
):
16 mod
= __import__(modname
)
18 except BaseException
as e
: #we don't want even sys.exit() to crash us (in case of malicious module) so use BaseException
19 return modlib
.error(e
)
22 if not hasattr(mod
, 'modinfo'):
23 return modlib
.error('no modinfo')
25 if parent
.APIVERSION
not in mod
.modinfo
['compatible']:
26 return modlib
.error('API-incompatible')
28 modules
[modname
] = mod
29 dependents
[modname
] = []
31 for dep
in mod
.modinfo
['depends']:
32 if dep
not in modules
:
33 depret
= load(parent
, dep
)
36 dependents
[dep
].append(modname
)
39 ret
= mod
.modstart(parent
)
40 if ret
is not None and not ret
:
42 del dependents
[modname
]
43 for dep
in mod
.modinfo
['depends']:
44 dependents
[dep
].remove(modname
)
46 else: #if not isloaded...else:
47 return modlib
.error('already loaded')
49 def unload(parent
, modname
):
51 for dependent
in dependents
[modname
]:
52 unload(parent
, dependent
)
53 for dep
in dependents
[modname
]:
54 dependents
[dep
].remove(modname
)
55 ret
= modules
[modname
].modstop(parent
)
59 return modlib
.error('already unloaded')
61 def reloadmod(parent
, modname
):
63 if modhas(modname
, 'modrestart'): modules
[modname
].modrestart(parent
)
64 else: modules
[modname
].modstop(parent
)
67 reload(modules
[modname
])
68 except BaseException
as e
:
69 return modlib
.error(e
)
71 if modhas(modname
, 'modrestarted'): modules
[modname
].modrestarted(parent
)
72 else: modules
[modname
].modstart(parent
)
75 return load(parent
, modname
)
78 def loadall(parent
, modlist
):
79 for m
in modlist
: load(parent
, m
)
80 def unloadall(parent
, modlist
):
81 for m
in modlist
: unload(parent
, m
)
82 def reloadall(parent
, modlist
):
83 for m
in modlist
: reloadmod(parent
, m
)
85 sys
.path
.append('modules')