diff --git a/modules/XmlRpcServer.py b/modules/XmlRpcServer.py new file mode 100644 index 0000000..fc61fbd --- /dev/null +++ b/modules/XmlRpcServer.py @@ -0,0 +1,112 @@ +""" +XmlRpcServer - access dr.botzo functionality via XML-RPC +Copyright (C) 2012 Brian S. Stephan + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +import thread +from SimpleXMLRPCServer import SimpleXMLRPCServer + +from extlib import irclib + +from Module import Module + +class DrBotzoMethods: + + """Methods to expose to the XML-RPC server.""" + + def __init__(self, irc, config, server): + """Store the same stuff the core module would, since we'll probably need it.""" + + self.irc = irc + self.config = config + self.server = server + + def echo(self, message): + """ + Just reply to the client, for testing purposes. + Arguments: message - the message to echo + """ + + return message + + def say(self, target, message): + """ + Say a message in a channel/to a nick. + Arguments: target - the nick/channel to privmsg + message - the message to send + """ + + self.irc.server.privmsg(target, message) + return "OK" + + def execute_module_method(self, modname, method, args): + """ + Execute the method (with arguments) of the specified module. + Arguments: modname - the loaded module to retrieve + method - the method to call from that module + args - the arguments to provide to the method as a pythonic tuple + """ + + for module in self.irc.modlist: + if modname == module.__class__.__name__: + try: + func = getattr(module, method) + except AttributeError: + return "couldn't find " + method + " in found module " + modname + + if hasattr(func, '__call__'): + return func(*args) + else: + return method + " in found module " + modname + " is not callable" + + return "couldn't find " + modname + +class XmlRpcServer(Module): + + """A module to expose an XML-RPC service, to achieve various things.""" + + def __init__(self, irc, config, server): + """Create the XML-RPC server.""" + + Module.__init__(self, irc, config, server) + + self.xmlrpc = None + self.funcs = DrBotzoMethods(irc, config, server) + + self.xmlrpc = SimpleXMLRPCServer(("localhost", 8180)) + self.xmlrpc.register_introspection_functions() + self.xmlrpc.register_instance(self.funcs) + + thread.start_new_thread(self._listen, ()) + + def _listen(self): + """Begin listening. Hopefully this was called in a new thread.""" + + self.xmlrpc.serve_forever() + + def do(self, connection, event, nick, userhost, what, admin_unlocked): + """Do nothing.""" + + return + + def shutdown(self): + """Shut down the XML-RPC server.""" + + if self.xmlrpc is not None: + self.xmlrpc.shutdown() + self.xmlrpc.server_close() + +# vi:tabstop=4:expandtab:autoindent