From 00aa28004c23d168c5ac6bffa22cbcaf0a4df7d3 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 14 Feb 2015 12:20:06 +0100 Subject: [PATCH] Made the REPORT command work, not surviving a reload yet. --- evennia/objects/models.py | 5 ++--- evennia/server/amp.py | 6 +++--- evennia/server/oob_cmds.py | 33 +++++++++++++++++++------------- evennia/server/oobhandler.py | 21 ++++++++++++-------- evennia/server/sessionhandler.py | 1 - 5 files changed, 38 insertions(+), 28 deletions(-) diff --git a/evennia/objects/models.py b/evennia/objects/models.py index 7e5ea54c31..b532226647 100644 --- a/evennia/objects/models.py +++ b/evennia/objects/models.py @@ -15,7 +15,6 @@ transparently through the decorating TypeClass. """ from django.db import models -from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from evennia.typeclasses.models import TypedObject @@ -159,11 +158,11 @@ class ObjectDB(TypedObject): except RuntimeError: errmsg = "Error: %s.location = %s creates a location loop." % (self.key, location) logger.log_errmsg(errmsg) - raise RuntimeError(errmsg) + raise #RuntimeError(errmsg) except Exception, e: errmsg = "Error (%s): %s is not a valid location." % (str(e), location) logger.log_errmsg(errmsg) - raise Exception(errmsg) + raise #Exception(errmsg) def __location_del(self): "Cleanly delete the location reference" diff --git a/evennia/server/amp.py b/evennia/server/amp.py index 8c159611e8..bd5fc04a61 100644 --- a/evennia/server/amp.py +++ b/evennia/server/amp.py @@ -215,7 +215,7 @@ class FunctionCall(amp.Command): # Helper functions -dumps = lambda data: to_str(pickle.dumps(data, pickle.HIGHEST_PROTOCOL)) +dumps = lambda data: to_str(pickle.dumps(to_str(data), pickle.HIGHEST_PROTOCOL)) loads = lambda data: pickle.loads(to_str(data)) # multipart message store @@ -348,10 +348,10 @@ class AMPProtocol(amp.AMP): data comes in multiple chunks; if so (nparts>1) we buffer the data and wait for the remaining parts to arrive before continuing. """ - #print "msg portal -> server (server side):", sessid, msg, data ret = self.safe_recv(MsgPortal2Server, sessid, ipart, nparts, text=msg, data=data) if ret is not None: + #print "msg portal -> server (server side):", sessid, msg, loads(ret["data"]) self.factory.server.sessions.data_in(sessid, text=ret["text"], **loads(ret["data"])) @@ -387,7 +387,7 @@ class AMPProtocol(amp.AMP): """ Access method called by the Server and executed on the Server. """ - #print "msg server->portal (server side):", sessid, msg, data + print "msg server->portal (server side):", sessid, msg, data return self.safe_send(MsgServer2Portal, sessid, msg=msg if msg is not None else "", data=dumps(data)) diff --git a/evennia/server/oob_cmds.py b/evennia/server/oob_cmds.py index 95a733aea1..19d9f2ce8d 100644 --- a/evennia/server/oob_cmds.py +++ b/evennia/server/oob_cmds.py @@ -58,9 +58,10 @@ name. """ from django.conf import settings +from evennia.utils.utils import to_str _GA = object.__getattribute__ _SA = object.__setattr__ -_NA_SEND = lambda o: "N/A" +_NA = lambda o: "N/A" #------------------------------------------------------------ @@ -88,7 +89,7 @@ def oob_error(oobhandler, session, errmsg, *args, **kwargs): management. """ - session.msg(oob=("err", ("ERROR " + errmsg,))) + session.msg(oob=("error", ("OOB ERROR: %s" % errmsg))) def oob_echo(oobhandler, session, *args, **kwargs): """ @@ -194,14 +195,14 @@ def oob_send(oobhandler, session, *args, **kwargs): for name in (a.upper() for a in args if a): try: print "MSDP SEND inp:", name - value = OOB_SENDABLE.get(name, _NA_SEND)(obj) + value = OOB_SENDABLE.get(name, _NA)(obj) ret[name] = value except Exception, e: ret[name] = str(e) # return, make sure to use the right case session.msg(oob=("MSDP_TABLE", (), ret)) else: - session.msg(oob=("err", ("You must log in first.",))) + oob_error(oobhandler, session, "You must log in first.") # mapping standard MSDP keys to Evennia field names @@ -240,17 +241,22 @@ def oob_report(oobhandler, session, *args, **kwargs): """ obj = session.get_puppet_or_player() if obj: + ret = [] for name in args: propname = OOB_REPORTABLE.get(name, None) if not propname: - session.msg(oob=("err", ("No Reportable property '%s'. Use LIST REPORTABLE_VARIABLES." % propname,))) + oob_error(oobhandler, session, "No Reportable property '%s'. Use LIST REPORTABLE_VARIABLES." % propname) # the field_monitors require an oob function as a callback when they report a change. elif propname.startswith("db_"): oobhandler.add_field_monitor(obj, session.sessid, propname, "return_field_report") + ret.append(to_str(_GA(obj, propname), force_string=True)) else: oobhandler.add_attribute_monitor(obj, session.sessid, propname, "return_attribute_report") + ret.append(_GA(obj, "db_value")) + print "ret:", ret + session.msg(oob=("MSDP_ARRAY", ret)) else: - session.msg(oob=("err", ("You must log in first.",))) + oob_error(oobhandler, session, "You must log in first.") def oob_return_field_report(oobhandler, session, fieldname, obj, *args, **kwargs): @@ -260,7 +266,8 @@ def oob_return_field_report(oobhandler, session, fieldname, obj, *args, **kwargs a callback used by the monitor to format the result before sending it on. """ - session.msg(oob=("MSDP_TABLE", (), {fieldname, getattr(obj, fieldname)})) + session.msg(oob=("MSDP_TABLE", (), + {fieldname: to_str(getattr(obj, fieldname), force_string=True)})) def oob_return_attribute_report(oobhandler, session, fieldname, obj, *args, **kwargs): @@ -274,7 +281,8 @@ def oob_return_attribute_report(oobhandler, session, fieldname, obj, *args, **kw a callback used by the monitor to format the result before sending it on. """ - session.msg(oob=("MSDP_TABLE", (), {obj.db_key, getattr(obj, fieldname)})) + session.msg(oob=("MSDP_TABLE", (), + {obj.db_key: to_str(getattr(obj, fieldname), force_string=True)})) ##OOB{"UNREPORT": "TEST"} @@ -287,13 +295,13 @@ def oob_unreport(oobhandler, session, *args, **kwargs): for name in (a.upper() for a in args if a): propname = OOB_REPORTABLE.get(name, None) if not propname: - session.msg(oob=("err", ("No Un-Reportable property '%s'. Use LIST REPORTED_VALUES." % name,))) + oob_error(oobhandler, session, "No Un-Reportable property '%s'. Use LIST REPORTABLE_VARIABLES." % propname) elif propname.startswith("db_"): oobhandler.remove_field_monitor(obj, session.sessid, propname, "oob_return_field_report") else: # assume attribute oobhandler.remove_attribute_monitor(obj, session.sessid, propname, "oob_return_attribute_report") else: - session.msg(oob=("err", ("You must log in first.",))) + oob_error(oobhandler, session, "You must log in first.") ##OOB{"LIST":"COMMANDS"} @@ -346,10 +354,9 @@ def oob_list(oobhandler, session, mode, *args, **kwargs): session.msg(oob=("SENDABLE_VARIABLES", tuple(key for key in OOB_REPORTABLE.keys()))) elif mode == "CONFIGURABLE_VARIABLES": # Not implemented (game specific) - session.msg(oob=("err", ("LIST", "Not implemented (game specific)."))) + oob_error(oobhandler, session, "Not implemented (game specific)") else: - session.msg(oob=("err", ("LIST", "Unsupported mode",))) - + oob_error(oobhandler, session, "Unsupported mode") # # Cmd mapping diff --git a/evennia/server/oobhandler.py b/evennia/server/oobhandler.py index 7c65352e43..d03b679b7e 100644 --- a/evennia/server/oobhandler.py +++ b/evennia/server/oobhandler.py @@ -91,8 +91,12 @@ class OOBFieldMonitor(object): Called by the save() mechanism when the given field has updated. """ - for sessid, (oobfuncname, args, kwargs) in self.subscribers.items(): - OOB_HANDLER.execute_cmd(sessid, oobfuncname, fieldname, obj, *args, **kwargs) + for sessid, oobtuples in self.subscribers.items(): + # oobtuples is a list [(oobfuncname, args, kwargs), ...], + # a potential list of oob commands to call when this + # field changes. + for (oobfuncname, args, kwargs) in oobtuples: + OOB_HANDLER.execute_cmd(sessid, oobfuncname, fieldname, obj, *args, **kwargs) def add(self, sessid, oobfuncname, *args, **kwargs): """ @@ -167,7 +171,7 @@ class OOBHandler(TickerHandler): Create a fieldmonitor and store it on the object. This tracker will be updated whenever the given field changes. """ - fieldmonitorname = self._get_fieldtracker_name(fieldname) + fieldmonitorname = self._get_fieldmonitor_name(fieldname) if not hasattr(obj, fieldmonitorname): # assign a new fieldmonitor to the object _SA(obj, fieldmonitorname, OOBFieldMonitor()) @@ -184,7 +188,7 @@ class OOBHandler(TickerHandler): Remove the OOB from obj. If oob implements an at_delete hook, this will be called with args, kwargs """ - fieldmonitorname = self._get_fieldtracker_name(fieldname) + fieldmonitorname = self._get_fieldmonitor_name(fieldname) try: _GA(obj, fieldmonitorname).remove(sessid, oobfuncname=oobfuncname) if not _GA(obj, fieldmonitorname).subscribers: @@ -313,7 +317,7 @@ class OOBHandler(TickerHandler): sessid = sessid.sessid # all database field names starts with db_* field_name = field_name if field_name.startswith("db_") else "db_%s" % field_name - self._add_monitor(obj, sessid, field_name, field_name, oobfuncname=None) + self._add_monitor(obj, sessid, field_name, oobfuncname, *args, **kwargs) def remove_field_monitor(self, obj, sessid, field_name, oobfuncname=None): """ @@ -408,7 +412,7 @@ class OOBHandler(TickerHandler): """ if isinstance(session, int): # a sessid. Convert to a session - session = SESSIONS.session_from_sessid(self.sessid) + session = SESSIONS.session_from_sessid(session) if not session: errmsg = "OOB Error: execute_cmd(%s,%s,%s,%s) - no valid session" % \ (session, oobfuncname, args, kwargs) @@ -423,11 +427,12 @@ class OOBHandler(TickerHandler): #print "OOB execute_cmd:", session, func_key, args, kwargs, _OOB_FUNCS.keys() oobfunc(self, session, *args, **kwargs) except Exception, err: - errmsg = "OOB Error: Exception in '%s'(%s, %s):\n%s" % (oobfuncname, args, kwargs, err) + errmsg = "Exception in %s(*%s, **%s):\n%s" % (oobfuncname, args, kwargs, err) if _OOB_ERROR: _OOB_ERROR(self, session, errmsg, *args, **kwargs) + errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg) - raise Exception(errmsg) + raise # access object diff --git a/evennia/server/sessionhandler.py b/evennia/server/sessionhandler.py index 67608da5a9..d26f619b16 100644 --- a/evennia/server/sessionhandler.py +++ b/evennia/server/sessionhandler.py @@ -438,7 +438,6 @@ class ServerSessionHandler(SessionHandler): if not _OOB_HANDLER: from evennia.server.oobhandler import OOB_HANDLER as _OOB_HANDLER funcname, args, kwargs = kwargs.pop("oob") - print "OOB sessionhandler.data_in:", funcname, args, kwargs if funcname: _OOB_HANDLER.execute_cmd(session, funcname, *args, **kwargs)