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.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"

View file

@ -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))

View file

@ -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

View file

@ -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

View file

@ -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)