88 lines
3.0 KiB
Python
88 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
import traceback
|
|
import logging
|
|
from core import jsonrpc
|
|
from threading import Thread
|
|
|
|
class BotRPC(Thread):
|
|
def __init__(self, main):
|
|
Thread.__init__(self)
|
|
self.bot = main
|
|
self.log = logging.getLogger('RPC')
|
|
self.server = jsonrpc.Server(jsonrpc.JsonRpc20(), jsonrpc.TransportTcpIp(addr=(self.bot.botconfig["bot"]["rpcbind"], self.bot.botconfig["bot"]["rpcport"])))
|
|
|
|
self.server.register_function( self.importModule )
|
|
self.server.register_function( self.deportModule )
|
|
self.server.register_function( self.loadModule )
|
|
self.server.register_function( self.unloadModule )
|
|
self.server.register_function( self.reloadModule )
|
|
self.server.register_function( self.redoModule )
|
|
self.server.register_function( self.getLoadedModules )
|
|
self.server.register_function( self.pluginCommand )
|
|
self.server.register_function( self.setPluginVar )
|
|
self.server.register_function( self.getPluginVar )
|
|
|
|
self.start()
|
|
|
|
def run(self):
|
|
self.server.serve()
|
|
|
|
def importModule(self, moduleName):
|
|
self.log.info("RPC: calling importModule(%s)"%moduleName)
|
|
return self.bot.importmodule(moduleName)
|
|
|
|
def deportModule(self, moduleName):
|
|
self.log.info("RPC: calling deportModule(%s)"%moduleName)
|
|
self.bot.deportmodule(moduleName)
|
|
|
|
def loadModule(self, moduleName):
|
|
self.log.info("RPC: calling loadModule(%s)"%moduleName)
|
|
return self.bot.loadmodule(moduleName)
|
|
|
|
def unloadModule(self, moduleName):
|
|
self.log.info("RPC: calling unloadModule(%s)"%moduleName)
|
|
self.bot.unloadmodule(moduleName)
|
|
|
|
def reloadModule(self, moduleName):
|
|
self.log.info("RPC: calling reloadModule(%s)"%moduleName)
|
|
self.bot.unloadmodule(moduleName)
|
|
return self.bot.loadmodule(moduleName)
|
|
|
|
def redoModule(self, moduleName):
|
|
self.log.info("RPC: calling redoModule(%s)"%moduleName)
|
|
return self.bot.redomodule(moduleName)
|
|
|
|
def getLoadedModules(self):
|
|
self.log.info("RPC: calling getLoadedModules()")
|
|
return list(self.bot.moduleInstances.keys())
|
|
|
|
def pluginCommand(self, pluginName, methodName, argList):
|
|
plugin = self.bot.getmodulebyname(pluginName)
|
|
if not plugin:
|
|
return (False, "Plugin not found")
|
|
method = getattr(plugin, methodName)
|
|
if not method:
|
|
return (False, "Method not found")
|
|
self.log.info("RPC: calling %s.%s(%s)" % (pluginName, methodName, argList))
|
|
return (True, method(*argList))
|
|
|
|
def getPluginVar(self, pluginName, pluginVarName):
|
|
plugin = self.bot.getmodulebyname(pluginName)
|
|
if pluginName == "_core":
|
|
plugin = self.bot
|
|
if not plugin:
|
|
return (False, "Plugin not found")
|
|
self.log.info("RPC: getting %s.%s" % (pluginName, pluginVarName))
|
|
return (True, getattr(plugin, pluginVarName))
|
|
|
|
def setPluginVar(self, pluginName, pluginVarName, value):
|
|
plugin = self.bot.getmodulebyname(pluginName)
|
|
if pluginName == "_core":
|
|
plugin = self.bot
|
|
if not plugin:
|
|
return (False, "Plugin not found")
|
|
self.log.info("RPC: setting %s.%s = %s )" % (pluginName, pluginVarName, value))
|
|
setattr(plugin, pluginVarName, value)
|
|
return (True, "Var set")
|
|
|