def process_cmd(self, client, module, cmd, args): module_instances = get_module_instances() if module in module_instances: try: module_instances[module].process_cmd(client, cmd, args) return except (Exception, RuntimeError) as e: if isinstance(e, UnknownCommandModuleError): client.send("core error-unknown-cmd " + module\ + " :" + cmd) elif isinstance(e, MissingArgumentsModuleError): client.send("core error-missing-arguments " + \ module + " " + cmd) elif isinstance(e, InvalidArgumentModuleError): client.send("core error-invalid-argument " + \ module\ + " " + cmd + " " + str(e.argument) + " :" + \ e.args[0]) else: exc_type, exc_value, exc_traceback = sys.exc_info() lines = traceback.format_exception(exc_type, exc_value, exc_traceback) logging.error('!! Exception when parsing client ' \ + 'command "' + cmd + '" in module "' + \ module + '", this should NOT happen:') logging.error(''.join('!! ' + line for line in \ lines)) logging.error("!! Please file a bug report.") client.send("core error-unknown-error " + module\ + " " + cmd) return # module not found: client.send("core error-invalid-module :" + module) return
def __init__(self, game_path, port, version_str): super(OnlineGame, self).__init__(game_path) self.connections = [] self.port = port self.version_str = version_str self.required_client_version = 1 module_instances = get_module_instances() logging.info("Starting game with " + str(len(module_instances))\ + " module instances available") for module in module_instances.values(): if isinstance(module, OnlineGameBaseModule): module.set_online_game_instance(self) else: module.set_game_instance(self)
def connection_has_data(self, connection, data): data = data.strip() if len(data) == 0: return module = data.split(" ", 1)[0] data = data[len(module)+1:] cmd = data.split(" ", 1)[0] args = self.split_args(data[len(cmd)+1:]) if len(cmd) == 0: connection.send("core error-empty-cmd") return if not module == "core": module_instances = get_module_instances() # forward to appropriate module: if module in module_instances: if not connection.connected_as_client: if not isinstance(module_instances[module], \ OnlineGameBaseModule): connection.send("core error-module-unavailable " +\ module) return self.process_cmd(connection, module, cmd, args) return self.process_cmd(connection.client, module, cmd, args) return # module not found: connection.send("core error-invalid-module :" + module) return else: if cmd == "quit": connection.send("core confirm-quit :Bye!") connection.close() self.connections.remove(connection) elif cmd == "ping": if len(args) == 0: connection.send("core error-missing-arguments core ping") return if len(args[0]) > 64: connection.send("core error-invalid-argument core " +\ "ping 1 :excessive length") return connection.send("core pong :" + args[0]) else: connection.send("core error-unknown-cmd core :" + cmd)