pyircbot/pyircbot/core/rpc.py

95 lines
3.0 KiB
Python

"""
.. module:: BotRPC
:synopsis: RPC server
.. moduleauthor:: Dave Pedu <dave@davepedu.com>
"""
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")