mirror of
https://github.com/evennia/evennia.git
synced 2026-04-03 06:27:17 +02:00
Made the REPORT command work, not surviving a reload yet.
This commit is contained in:
parent
d5a7908a43
commit
00aa28004c
5 changed files with 38 additions and 28 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue