Made the REPORT command work, not surviving a reload yet.

This commit is contained in:
Griatch 2015-02-14 12:20:06 +01:00
parent d5a7908a43
commit 00aa28004c
5 changed files with 38 additions and 28 deletions

View file

@ -15,7 +15,6 @@ transparently through the decorating TypeClass.
""" """
from django.db import models from django.db import models
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from evennia.typeclasses.models import TypedObject from evennia.typeclasses.models import TypedObject
@ -159,11 +158,11 @@ class ObjectDB(TypedObject):
except RuntimeError: except RuntimeError:
errmsg = "Error: %s.location = %s creates a location loop." % (self.key, location) errmsg = "Error: %s.location = %s creates a location loop." % (self.key, location)
logger.log_errmsg(errmsg) logger.log_errmsg(errmsg)
raise RuntimeError(errmsg) raise #RuntimeError(errmsg)
except Exception, e: except Exception, e:
errmsg = "Error (%s): %s is not a valid location." % (str(e), location) errmsg = "Error (%s): %s is not a valid location." % (str(e), location)
logger.log_errmsg(errmsg) logger.log_errmsg(errmsg)
raise Exception(errmsg) raise #Exception(errmsg)
def __location_del(self): def __location_del(self):
"Cleanly delete the location reference" "Cleanly delete the location reference"

View file

@ -215,7 +215,7 @@ class FunctionCall(amp.Command):
# Helper functions # 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)) loads = lambda data: pickle.loads(to_str(data))
# multipart message store # multipart message store
@ -348,10 +348,10 @@ class AMPProtocol(amp.AMP):
data comes in multiple chunks; if so (nparts>1) we buffer the data data comes in multiple chunks; if so (nparts>1) we buffer the data
and wait for the remaining parts to arrive before continuing. 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, ret = self.safe_recv(MsgPortal2Server, sessid, ipart, nparts,
text=msg, data=data) text=msg, data=data)
if ret is not None: if ret is not None:
#print "msg portal -> server (server side):", sessid, msg, loads(ret["data"])
self.factory.server.sessions.data_in(sessid, self.factory.server.sessions.data_in(sessid,
text=ret["text"], text=ret["text"],
**loads(ret["data"])) **loads(ret["data"]))
@ -387,7 +387,7 @@ class AMPProtocol(amp.AMP):
""" """
Access method called by the Server and executed on the Server. 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, return self.safe_send(MsgServer2Portal, sessid,
msg=msg if msg is not None else "", msg=msg if msg is not None else "",
data=dumps(data)) data=dumps(data))

View file

@ -58,9 +58,10 @@ name.
""" """
from django.conf import settings from django.conf import settings
from evennia.utils.utils import to_str
_GA = object.__getattribute__ _GA = object.__getattribute__
_SA = object.__setattr__ _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. management.
""" """
session.msg(oob=("err", ("ERROR " + errmsg,))) session.msg(oob=("error", ("OOB ERROR: %s" % errmsg)))
def oob_echo(oobhandler, session, *args, **kwargs): 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): for name in (a.upper() for a in args if a):
try: try:
print "MSDP SEND inp:", name print "MSDP SEND inp:", name
value = OOB_SENDABLE.get(name, _NA_SEND)(obj) value = OOB_SENDABLE.get(name, _NA)(obj)
ret[name] = value ret[name] = value
except Exception, e: except Exception, e:
ret[name] = str(e) ret[name] = str(e)
# return, make sure to use the right case # return, make sure to use the right case
session.msg(oob=("MSDP_TABLE", (), ret)) session.msg(oob=("MSDP_TABLE", (), ret))
else: 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 # 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() obj = session.get_puppet_or_player()
if obj: if obj:
ret = []
for name in args: for name in args:
propname = OOB_REPORTABLE.get(name, None) propname = OOB_REPORTABLE.get(name, None)
if not propname: 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. # the field_monitors require an oob function as a callback when they report a change.
elif propname.startswith("db_"): elif propname.startswith("db_"):
oobhandler.add_field_monitor(obj, session.sessid, propname, "return_field_report") oobhandler.add_field_monitor(obj, session.sessid, propname, "return_field_report")
ret.append(to_str(_GA(obj, propname), force_string=True))
else: else:
oobhandler.add_attribute_monitor(obj, session.sessid, propname, "return_attribute_report") 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: 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): 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 a callback used by the monitor to format the result before sending
it on. 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): 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 a callback used by the monitor to format the result before sending
it on. 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"} ##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): for name in (a.upper() for a in args if a):
propname = OOB_REPORTABLE.get(name, None) propname = OOB_REPORTABLE.get(name, None)
if not propname: 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_"): elif propname.startswith("db_"):
oobhandler.remove_field_monitor(obj, session.sessid, propname, "oob_return_field_report") oobhandler.remove_field_monitor(obj, session.sessid, propname, "oob_return_field_report")
else: # assume attribute else: # assume attribute
oobhandler.remove_attribute_monitor(obj, session.sessid, propname, "oob_return_attribute_report") oobhandler.remove_attribute_monitor(obj, session.sessid, propname, "oob_return_attribute_report")
else: else:
session.msg(oob=("err", ("You must log in first.",))) oob_error(oobhandler, session, "You must log in first.")
##OOB{"LIST":"COMMANDS"} ##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()))) session.msg(oob=("SENDABLE_VARIABLES", tuple(key for key in OOB_REPORTABLE.keys())))
elif mode == "CONFIGURABLE_VARIABLES": elif mode == "CONFIGURABLE_VARIABLES":
# Not implemented (game specific) # Not implemented (game specific)
session.msg(oob=("err", ("LIST", "Not implemented (game specific)."))) oob_error(oobhandler, session, "Not implemented (game specific)")
else: else:
session.msg(oob=("err", ("LIST", "Unsupported mode",))) oob_error(oobhandler, session, "Unsupported mode")
# #
# Cmd mapping # Cmd mapping

View file

@ -91,8 +91,12 @@ class OOBFieldMonitor(object):
Called by the save() mechanism when the given Called by the save() mechanism when the given
field has updated. field has updated.
""" """
for sessid, (oobfuncname, args, kwargs) in self.subscribers.items(): for sessid, oobtuples in self.subscribers.items():
OOB_HANDLER.execute_cmd(sessid, oobfuncname, fieldname, obj, *args, **kwargs) # 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): 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 Create a fieldmonitor and store it on the object. This tracker
will be updated whenever the given field changes. 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): if not hasattr(obj, fieldmonitorname):
# assign a new fieldmonitor to the object # assign a new fieldmonitor to the object
_SA(obj, fieldmonitorname, OOBFieldMonitor()) _SA(obj, fieldmonitorname, OOBFieldMonitor())
@ -184,7 +188,7 @@ class OOBHandler(TickerHandler):
Remove the OOB from obj. If oob implements an Remove the OOB from obj. If oob implements an
at_delete hook, this will be called with args, kwargs at_delete hook, this will be called with args, kwargs
""" """
fieldmonitorname = self._get_fieldtracker_name(fieldname) fieldmonitorname = self._get_fieldmonitor_name(fieldname)
try: try:
_GA(obj, fieldmonitorname).remove(sessid, oobfuncname=oobfuncname) _GA(obj, fieldmonitorname).remove(sessid, oobfuncname=oobfuncname)
if not _GA(obj, fieldmonitorname).subscribers: if not _GA(obj, fieldmonitorname).subscribers:
@ -313,7 +317,7 @@ class OOBHandler(TickerHandler):
sessid = sessid.sessid sessid = sessid.sessid
# all database field names starts with db_* # all database field names starts with db_*
field_name = field_name if field_name.startswith("db_") else "db_%s" % field_name 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): def remove_field_monitor(self, obj, sessid, field_name, oobfuncname=None):
""" """
@ -408,7 +412,7 @@ class OOBHandler(TickerHandler):
""" """
if isinstance(session, int): if isinstance(session, int):
# a sessid. Convert to a session # a sessid. Convert to a session
session = SESSIONS.session_from_sessid(self.sessid) session = SESSIONS.session_from_sessid(session)
if not session: if not session:
errmsg = "OOB Error: execute_cmd(%s,%s,%s,%s) - no valid session" % \ errmsg = "OOB Error: execute_cmd(%s,%s,%s,%s) - no valid session" % \
(session, oobfuncname, args, kwargs) (session, oobfuncname, args, kwargs)
@ -423,11 +427,12 @@ class OOBHandler(TickerHandler):
#print "OOB execute_cmd:", session, func_key, args, kwargs, _OOB_FUNCS.keys() #print "OOB execute_cmd:", session, func_key, args, kwargs, _OOB_FUNCS.keys()
oobfunc(self, session, *args, **kwargs) oobfunc(self, session, *args, **kwargs)
except Exception, err: 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: if _OOB_ERROR:
_OOB_ERROR(self, session, errmsg, *args, **kwargs) _OOB_ERROR(self, session, errmsg, *args, **kwargs)
errmsg = "OOB ERROR: %s" % errmsg
logger.log_trace(errmsg) logger.log_trace(errmsg)
raise Exception(errmsg) raise
# access object # access object

View file

@ -438,7 +438,6 @@ class ServerSessionHandler(SessionHandler):
if not _OOB_HANDLER: if not _OOB_HANDLER:
from evennia.server.oobhandler import OOB_HANDLER as _OOB_HANDLER from evennia.server.oobhandler import OOB_HANDLER as _OOB_HANDLER
funcname, args, kwargs = kwargs.pop("oob") funcname, args, kwargs = kwargs.pop("oob")
print "OOB sessionhandler.data_in:", funcname, args, kwargs
if funcname: if funcname:
_OOB_HANDLER.execute_cmd(session, funcname, *args, **kwargs) _OOB_HANDLER.execute_cmd(session, funcname, *args, **kwargs)