diff orpg/networking/server_plugins.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children 449a8900f9ac
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orpg/networking/server_plugins.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,188 @@
+import sys
+import os
+from orpg.dirpath import dir_struct
+
+class _SingletonKey(object):
+    def __new__(cls, *args, **kwargs):
+        if not hasattr(cls, '_inst'):
+            cls._inst = super(_SingletonKey, cls).__new__(cls, *args, **kwargs)
+        return cls._inst
+
+class PluginData(object):
+    """A holder class for inactive plugins"""
+    def __init__(self, Name, File, Author="", Help=""):
+        self.File = File
+        self.Name = Name
+        self.Author = Author
+        self.Help = Help
+        self.Activated = False
+
+class BasePluginsClass(object):
+    def __init__(self, ptype):
+        self.__ptype = ptype
+        self.__plugins = {}
+
+    def initBase(self):
+        self._startPlugins()
+
+
+    #Methods
+    def _startPlugins(self):
+        autoload = []
+        #Fill autoload from some file with the Plugin Names
+
+        plugins = []
+        for root, dirs, files in os.walk(dir_struct['plugins'] + self.__ptype):
+            if '__init__.py' in files:
+                files.remove('__init__.py')
+            if 'base_plugin.py' in files:
+                files.remove('base_plugin.py')
+
+            for pfile in files:
+                if pfile[-3:] == '.py':
+                    plugins.append(PluginData('New Plugin', root + os.sep + pfile))
+
+        for plugin in plugins:
+            pdata = self._load(plugin)
+            if pdata != None:
+                if pdata.Name not in autoload:
+                    self._unload(plugin)
+
+    def activatePlugin(self, pluginName):
+        if not self.__plugins.has_key(pluginName):
+            #Print some error about invalid plugin
+            return
+        pluginData = self.__plugins[pluginName]
+        #Unload it first, just incase it is already loaded
+        self._unload(pluginData)
+
+        #Now Load it
+        self._load(pluginData)
+
+        #Write to the autoload file for this plugin
+
+        self.__plugins[pluginName].Activated = True
+        self.__plugins[pluginName].start()
+
+    def deactivatePugin(self, pluginData):
+        if not self.__plugins.has_key(pluginName):
+            #Print some error about invalid plugin
+            return
+        pluginData = self.__plugins[pluginName]
+
+        self.__plugins[pluginName].stop()
+
+        #Unload it
+        self._unload(pluginData)
+
+        #Remove this plugin from the autoload file
+
+    #Private Methods
+    def _findModule(self, pluginFile):
+        s1 = pluginFile.split(os.sep)
+        s2 = s1[-1].split('.')
+        return ('plugins.' + self.__ptype + '.' + s2[0], s2[0])
+
+    def _unload(self, pluginData):
+        self.__plugins[pluginData.Name] = PluginData(pluginData.Name, pluginData.File, pluginData.Author, pluginData.Help)
+        unload = []
+        mod = self._findModule(pluginData.File)[0]
+        for key, module in sys.modules.iteritems():
+            if str(module).find(mod) > -1:
+                unload.append(key)
+
+        for plugin in unload:
+            del sys.modules[plugin]
+
+    def _load(self, pluginData):
+        modinfo = self._findModule(pluginData.File)
+        try:
+            mod = __import__(modinfo[0])
+            mod = getattr(mod,self.__ptype)
+            tmp = getattr(mod, modinfo[1])
+            self.__plugins[pluginData.Name] = tmp.Plugin()
+            print "Loaded Module " + pluginData.File
+            return self.__plugins[pluginData.Name]
+        except Exception, e:
+            print e
+            print "Unable to load module" + pluginData.File
+
+        return None
+
+    #Property Methods
+    def _getPlugins(self):
+        return self.__plugins
+
+    def _getType(self):
+        return self.__ptype
+
+
+    #Properties
+    Plugins = property(_getPlugins, None)
+    Type = property(_getType, None)
+
+class ServerPluginsClass(BasePluginsClass):
+    def __init__(self, singletonKey):
+        if not isinstance(singletonKey, _SingletonKey):
+            raise invalid_argument(_("Use ServerPlugins to get access to singleton"))
+
+        BasePluginsClass.__init__(self, 'server')
+        self.initBase()
+
+    def preParseIncoming(self, xml_dom, data):
+        sent = True
+        errmsg = ""
+
+        for pluginName, pluginData in self.Plugins.iteritems():
+            if pluginData.Activated:
+                xml_dom, data = pluginData.preParseIncoming(xml_dom, data)
+
+        return xml_dom, data
+
+    def postParseIncoming(self, data):
+        for pluginName, pluginData in self.Plugins.iteritems():
+            if pluginData.Activated:
+                data = pluginData.postParseIncoming(data)
+
+        return data
+
+    def getPlayer(self):
+        players = []
+        for pluginName, pluginData in self.Plugins.iteritems():
+            if pluginData.Activated:
+                playerName = pluginData.addPlayer(data)
+                players.append(playerName)
+
+        return players
+
+    def setPlayer(self, playerData):
+        players = []
+        for pluginName, pluginData in self.Plugins.iteritems():
+            if pluginData.Activated:
+                playerName = pluginData.addPlayer(data)
+                players.append(playerName)
+
+        return
+
+    def preParseOutgoing(self):
+        data = []
+        for pluginName, pluginData in self.Plugins.iteritems():
+            if pluginData.Activated:
+                xml = pluginData.preParseOutgoing()
+                for msg in xml:
+                    data.append(msg)
+
+        return data
+
+    def postParseOutgoing(self):
+        data = []
+        for pluginName, pluginData in self.Plugins.iteritems():
+            if pluginData.Activated:
+                xml = pluginData.postParseOutgoing()
+                for msg in xml:
+                    data.append(msg)
+
+        return data
+
+__key = _SingletonKey()
+ServerPlugins = ServerPluginsClass(__key)