]> jfr.im git - irc/rizon/acid.git/blob - pyva/pyva/src/main/python/plugin.py
Merge branch 'internets/fixshowingnone' into 'master'
[irc/rizon/acid.git] / pyva / pyva / src / main / python / plugin.py
1 import traceback
2 import logging
3 import task
4 import importlib
5 import core
6 import sys
7
8 class AcidPlugin(object):
9 def __init__(self):
10 super(AcidPlugin, self).__init__()
11
12 self.prefix = core.config.get('control').get('prefix')
13 self.logchan = core.config.get('control').get('channel')
14 self.log = logging.getLogger(__name__)
15 self.config = core.config
16 self.dbp = core.dbx.cursor() # do these have to be closed?
17
18 def start(self):
19 pass
20
21 def stop(self):
22 pass
23
24 def getCommands(self):
25 pass
26
27 modules = {}
28 plugin_to_modname = lambda x: '%s.%s' % (x, x)
29
30 def loadPlugin(plugin):
31 global modules
32
33 modname = plugin_to_modname(plugin)
34
35 mod = importlib.import_module(modname)
36 try:
37 obj = getattr(mod, plugin)()
38
39 obj.start()
40 except:
41 # initialization failed, remove from sys.modules so it can be reloaded
42 deps = [module for module in sys.modules if module.startswith(plugin + '.')]
43 for dep in deps:
44 del sys.modules[dep]
45
46 raise
47
48 modules[plugin] = obj
49
50 def unloadPlugin(plugin):
51 global modules
52
53 obj = modules[plugin]
54 obj.stop()
55
56 deps = [module for module in sys.modules if module.startswith(plugin + '.')]
57 for dep in deps:
58 del sys.modules[dep]
59
60 del modules[plugin]
61
62 def getPlugins():
63 return modules.keys()
64
65 def call(name, *args):
66 task.Run()
67
68 for m in modules.itervalues():
69 try:
70 func = getattr(m, name)
71 except:
72 continue
73
74 try:
75 func(*args)
76 except:
77 traceback.print_exc()
78 raise