From 584d1095adac552ef83d566042bef3718ac41201 Mon Sep 17 00:00:00 2001 From: Griatch Date: Fri, 18 Oct 2013 22:04:53 +0200 Subject: [PATCH] More tweaks to the oob mechanism; renamed oob_defaults to oob_msdp --- src/server/{oob_defaults.py => oob_msdp.py} | 16 +++++++++------- src/server/oobhandler.py | 18 +++++++++++++----- src/settings_default.py | 8 ++++---- 3 files changed, 26 insertions(+), 16 deletions(-) rename src/server/{oob_defaults.py => oob_msdp.py} (94%) diff --git a/src/server/oob_defaults.py b/src/server/oob_msdp.py similarity index 94% rename from src/server/oob_defaults.py rename to src/server/oob_msdp.py index e4a1e2bc96..30cd5cc8a9 100644 --- a/src/server/oob_defaults.py +++ b/src/server/oob_msdp.py @@ -1,5 +1,7 @@ """ -Out-of-band default plugin functions for the OOB handler +Out-of-band default plugin commands available for OOB handler. This +follows the standards defined by the MSDP out-of-band protocol +(http://tintin.sourceforge.net/msdp/) """ from django.conf import settings @@ -187,19 +189,19 @@ def LIST(oobhandler, session, mode, *args, **kwargs): mode = mode.upper() # the first return argument is treated by the msdp protocol as the name of the msdp array to return if mode == "COMMANDS": - session.msg(oob=("list", ("COMMANDS", "LIST", "REPORT", "UNREPORT", "SEND", "RESET"))) + session.msg(oob=("list", ("COMMANDS", "LIST", "REPORT", "UNREPORT", "SEND"))) # RESET elif mode == "LISTS": session.msg(oob=("list", ("LISTS", "REPORTABLE_VARIABLES","REPORTED_VARIABLES", "SENDABLE_VARIABLES"))) #CONFIGURABLE_VARIABLES elif mode == "REPORTABLE_VARIABLES": session.msg(oob=("list", ("REPORTABLE_VARIABLES",) + tuple(key for key in OOB_REPORTABLE.keys()))) elif mode == "REPORTED_VARIABLES": - pass + session.msg(oob=("list", ("REPORTED_VARIABLES",) + tuple(oobhandler.get_all_tracked(session)))) elif mode == "SENDABLE_VARIABLES": - pass - elif mode == "CONFIGURABLE_VARIABLES": - pass + session.msg(oob=("list", ("SENDABLE_VARIABLES",) + tuple(key for key in OOB_REPORTABLE.keys()))) + #elif mode == "CONFIGURABLE_VARIABLES": + # pass else: - session.msg(oob=("list", ("wrong mode",))) + session.msg(oob=("list", ("unsupported mode",))) def send(oobhandler, session, *args, **kwargs): diff --git a/src/server/oobhandler.py b/src/server/oobhandler.py index 2bdaaad234..2dd062beac 100644 --- a/src/server/oobhandler.py +++ b/src/server/oobhandler.py @@ -9,10 +9,10 @@ pieces of functionality: are valid for this use. repeat func execution - the oob protocol can request a given function be executed repeatedly at a regular interval. - tracking - the oob protocol can request Evennia to track changes to fields/properties on + tracking - the oob protocol can request Evennia to track changes to fields on objects, as well as changes in Attributes. This is done by dynamically adding tracker-objects on entities. The behaviour of those objects can be customized - via settings.OOB_PLUGIN_MODULE.OOB_TRACKERS. + via settings.OOB_PLUGIN_MODULE oob functions have the following call signature: function(caller, *args, **kwargs) @@ -278,6 +278,13 @@ class OOBHandler(object): store_key = (pack_dbobj(obj), sessid, fieldname) self.oob_tracker_storage.pop(store_key, None) + def get_all_tracked(session): + """ + Get the names of all variables this session is tracking. + """ + sessid = session.sessid + return [key[2].lstrip("db_") for key in self.oob_tracker_storage.keys() if key[1] == sessid] + def track_field(self, obj, sessid, field_name, trackerclass): """ Shortcut wrapper method for specifically tracking a database field. @@ -328,7 +335,7 @@ class OOBHandler(object): try: obj = obj.dbobj except AttributeError: - pass + passj store_obj = pack_dbobj(obj) store_key = (store_obj, sessid, func_key, interval) # prepare to store @@ -348,13 +355,14 @@ class OOBHandler(object): self.oob_repeat_storage.pop(store_key, None) def msg(self, sessid, funcname, *args, **kwargs): - "Shortcut to relay oob data back to portal" + "Shortcut to relay oob data back to portal. Used by oob functions." session = self.sessionhandler.session_from_sessid(sessid) #print "oobhandler msg:", sessid, session, funcname, args, kwargs if session: session.msg(oob=(funcname, args, kwargs)) - # access method - called from msg() + # access method - called from session.msg() + def execute_cmd(self, session, func_key, *args, **kwargs): """ diff --git a/src/settings_default.py b/src/settings_default.py index ae3c3257d1..8e94cc9c13 100644 --- a/src/settings_default.py +++ b/src/settings_default.py @@ -196,13 +196,13 @@ PORTAL_SERVICES_PLUGIN_MODULES = [] # Module holding MSSP meta data. This is used by MUD-crawlers to determine # what type of game you are running, how many players you have etc. MSSP_META_MODULE = "" -# Module holding OOB (Out of Band) hook objects. This allows for customization -# and expansion of which hooks OOB protocols are allowed to call on the server -# protocols for attaching tracker hooks for when various object field change -OOB_PLUGIN_MODULE = "src.server.oob_defaults" # Tuple of modules implementing lock functions. All callable functions # inside these modules will be available as lock functions. LOCK_FUNC_MODULES = ("src.locks.lockfuncs",) +# Module holding OOB (Out of Band) hook objects. This allows for customization +# and expansion of which hooks OOB protocols are allowed to call on the server +# protocols for attaching tracker hooks for when various object field change +OOB_PLUGIN_MODULE = "src.server.oob_msdp" ###################################################################### # Default command sets