forked from Old55/s2wrapper
-
Notifications
You must be signed in to change notification settings - Fork 1
/
PluginsManager.py
125 lines (93 loc) · 2.33 KB
/
PluginsManager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# -*- coding: utf-8 -*-
import traceback
import sys
import os
import imp
import re
from S2Wrapper import ConsoleParser
class Plugin(object):
def onPluginLoad(self, config):
pass
pass
class ConsolePlugin(Plugin, ConsoleParser, object):
pass
_imports = []
_instances = []
_path = None
def discover(path = None):
global _path
if path:
_path = path
if not _path:
print("%s: _path is not set" % (__name__))
return
print("%s: search path: %s" % (__name__, _path))
plugins = [x[:-3] for x in os.listdir(_path) if x.endswith(".py")]
sys.path.insert(0, _path)
for name in plugins:
try:
_imports.append(__import__(name))
except Exception as e:
print("%s: %s produced an error: %s" % (__name__, name , e))
return
def getEnabled(type):
return _instances
def reload(name):
mod = None
for module in _imports:
if module.__name__ == name:
mod = module
break
if not mod:
print("%s: %s not found" % (__name__, name))
return
disable(name)
try:
imp.reload(mod)
except:
traceback.print_exc()
return
return enable(name)
def disable(name):
for inst in _instances:
if inst.__class__.__name__ == name:
plugin = find (name)
if plugin is not None:
del plugin
_instances.remove (inst)
del inst
print("%s: %s has been disabled" % (__name__, name))
return True
print("%s: %s is not enabled" % (__name__, name))
return False
# Yeah so.., as I can't seem to find out, how to delete modules from __subclasses__..
# I Made this nasty hack, which just takes the latest module, instead of the first.
# This means on each enable/reload this list increases in size, infinitely...
def find (pluginName):
_plugin = None
for type in Plugin.__subclasses__():
for plugin in type.__subclasses__():
if pluginName == plugin.__name__:
_plugin = plugin
return _plugin
def enable(name):
cls = find(name)
if not cls:
print("%s: %s not found" % (__name__, name))
return False
try:
inst = cls()
_instances.append(inst)
config = "%s.ini" % os.path.join(_path, name)
print("%s: %s config: %s" % (__name__, name, config))
inst.onPluginLoad(config)
except Exception as e:
print("%s: %s error: %s" % (__name__, name , e))
return False
print("%s: %s has been enabled" % (__name__, name))
return True
def list():
rtn = []
for plugin in _imports:
rtn.append(plugin.__name__)
return rtn