mirror of
https://github.com/evennia/evennia.git
synced 2026-03-27 02:06:32 +01:00
Forgot to add oob_defaults.py to commit.
This commit is contained in:
parent
b6ece2af10
commit
213be7aec4
1 changed files with 251 additions and 0 deletions
251
src/server/oob_defaults.py
Normal file
251
src/server/oob_defaults.py
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
"""
|
||||
Out-of-band default plugin functions for the OOB handler
|
||||
|
||||
"""
|
||||
from django.conf import settings
|
||||
from src.utils.utils import to_str
|
||||
_GA = object.__getattribute__
|
||||
_SA = object.__setattr__
|
||||
_NA = lambda o: (None, "N/A") # not implemented
|
||||
|
||||
# mapper for which properties may be requested/sent to the client and how to do so.
|
||||
# Each entry should define a function that returns two values - the name of the
|
||||
# propertye being returned (a string) and the value. If tracking database fields,
|
||||
# make sure to enter the full database field name (e.g. db_key rather than just key)
|
||||
# since the db_ prefix is used by trackers to know which tracking mechanism to activate.
|
||||
|
||||
OOB_SENDABLE = {
|
||||
## General
|
||||
"CHARACTER_NAME": lambda o: ("db_key", o.key),
|
||||
"SERVER_ID": lambda o: ("settings.SERVERNAME", settings.SERVERNAME),
|
||||
#"SERVER_TIME": _NA,
|
||||
## Character
|
||||
#"AFFECTS": _NA,
|
||||
#"ALIGNMENT": _NA,
|
||||
#"EXPERIENCE": _NA,
|
||||
#"EXPERIENCE_MAX": _NA,
|
||||
#"EXPERIENCE_TNL": _NA,
|
||||
#"HEALTH": _NA,
|
||||
#"HEALTH_MAX": _NA,
|
||||
#"LEVEL": _NA,
|
||||
#"RACE": _NA,
|
||||
#"CLASS": _NA,
|
||||
#"MANA": _NA,
|
||||
#"MANA_MAX": _NA,
|
||||
#"WIMPY": _NA,
|
||||
#"PRACTICE": _NA,
|
||||
#"MONEY": _NA,
|
||||
#"MOVEMENT": _NA,
|
||||
#"MOVEMENT_MAX": _NA,
|
||||
#"HITROLL": _NA,
|
||||
#"DAMROLL": _NA,
|
||||
#"AC": _NA,
|
||||
#"STR": _NA,
|
||||
#"INT": _NA,
|
||||
#"WIS": _NA,
|
||||
#"DEX": _NA,
|
||||
#"CON": _NA,
|
||||
## Combat
|
||||
#"OPPONENT_HEALTH": _NA,
|
||||
#"OPPONENT_HEALTH_MAX": _NA,
|
||||
#"OPPONENT_LEVEL": _NA,
|
||||
#"OPPONENT_NAME": _NA,
|
||||
## World
|
||||
#"AREA_NAME": _NA,
|
||||
#"ROOM_EXITS": _NA,
|
||||
#"ROOM_VNUM": _NA,
|
||||
"ROOM_NAME": lambda o: ("db_location", o.db_location.key),
|
||||
#"WORLD_TIME": _NA,
|
||||
## Configurable variables
|
||||
#"CLIENT_ID": _NA,
|
||||
#"CLIENT_VERSION": _NA,
|
||||
#"PLUGIN_ID": _NA,
|
||||
#"ANSI_COLORS": _NA,
|
||||
#"XTERM_256_COLORS": _NA,
|
||||
#"UTF_8": _NA,
|
||||
#"SOUND": _NA,
|
||||
#"MXP": _NA,
|
||||
## GUI variables
|
||||
#"BUTTON_1": _NA,
|
||||
#"BUTTON_2": _NA,
|
||||
#"BUTTON_3": _NA,
|
||||
#"BUTTON_4": _NA,
|
||||
#"BUTTON_5": _NA,
|
||||
#"GAUGE_1": _NA,
|
||||
#"GAUGE_2": _NA,
|
||||
#"GAUGE_3": _NA,
|
||||
#"GAUGE_4": _NA,
|
||||
#"GAUGE_5": _NA
|
||||
}
|
||||
# mapping for which properties may be tracked
|
||||
OOB_REPORTABLE = OOB_SENDABLE
|
||||
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Tracker classes
|
||||
#
|
||||
# Trackers are added to a given object's trackerhandler and
|
||||
# reports back changes when they happen. They are managed using
|
||||
# the oobhandler's track/untrack mechanism
|
||||
#------------------------------------------------------------
|
||||
|
||||
class TrackerBase(object):
|
||||
"""
|
||||
Base class for OOB Tracker objects.
|
||||
"""
|
||||
def __init__(self, oobhandler, *args, **kwargs):
|
||||
self.oobhandler = oobhandler
|
||||
def update(self, *args, **kwargs):
|
||||
"Called by tracked objects"
|
||||
pass
|
||||
def at_remove(self, *args, **kwargs):
|
||||
"Called when tracker is removed"
|
||||
pass
|
||||
|
||||
class OOBFieldTracker(TrackerBase):
|
||||
"""
|
||||
Tracker that passively sends data to a stored sessid whenever
|
||||
a named database field changes. The TrackerHandler calls this with
|
||||
the correct arguments.
|
||||
"""
|
||||
def __init__(self, oobhandler, fieldname, sessid, *args, **kwargs):
|
||||
"""
|
||||
name - name of entity to track, such as "db_key"
|
||||
sessid - sessid of session to report to
|
||||
"""
|
||||
self.oobhandler = oobhandler
|
||||
self.fieldname = fieldname
|
||||
self.sessid = sessid
|
||||
|
||||
def update(self, new_value, *args, **kwargs):
|
||||
"Called by cache when updating the tracked entitiy"
|
||||
# use oobhandler to relay data
|
||||
try:
|
||||
# we must never relay objects across the amp, only text data.
|
||||
new_value = new_value.key
|
||||
except AttributeError:
|
||||
new_value = to_str(new_value, force_string=True)
|
||||
self.oobhandler.msg(self.sessid, "report", self.fieldname, new_value, *args, **kwargs)
|
||||
|
||||
class OOBAttributeTracker(TrackerBase):
|
||||
"""
|
||||
Tracker that passively sends data to a stored sessid whenever
|
||||
the Attribute updates. Since the field here is always "db_key",
|
||||
we instead store the name of the attribute to return.
|
||||
"""
|
||||
def __init__(self, oobhandler, fieldname, sessid, attrname, *args, **kwargs):
|
||||
"""
|
||||
attrname - name of attribute to track
|
||||
sessid - sessid of session to report to
|
||||
"""
|
||||
self.oobhandler = oobhandler
|
||||
self.attrname = attrname
|
||||
self.sessid = sessid
|
||||
|
||||
def update(self, new_value, *args, **kwargs):
|
||||
"Called by cache when attribute's db_value field updates"
|
||||
try:
|
||||
new_value = new_value.dbobj
|
||||
except AttributeError:
|
||||
new_value = to_str(new_value, force_string=True)
|
||||
self.oobhandler.msg(self.sessid, "report", self.attrname, new_value, *args, **kwargs)
|
||||
|
||||
#------------------------------------------------------------
|
||||
# OOB commands
|
||||
# This defines which internal server commands the OOB handler
|
||||
# makes available to the client. These commands are called
|
||||
# automatically by the OOB mechanism by triggering the
|
||||
# oobhandlers's execute_cmd method with the cmdname and
|
||||
# eventual args/kwargs. All functions defined globally in this
|
||||
# module will be made available to call by the oobhandler. Use
|
||||
# _funcname if you want to exclude one. To allow for python-names
|
||||
# like "list" here, these properties are read as being case-insensitive.
|
||||
#
|
||||
# All OOB commands must be on the form
|
||||
# cmdname(oobhandler, session, *args, **kwargs)
|
||||
#------------------------------------------------------------
|
||||
|
||||
def oob_error(oobhandler, session, errmsg, *args, **kwargs):
|
||||
"""
|
||||
This is a special function called by the oobhandler when an error
|
||||
occurs already at the execution stage (such as the oob function
|
||||
not being recognized or having the wrong args etc).
|
||||
"""
|
||||
session.msg(oob=("send", {"ERROR":errmsg}))
|
||||
|
||||
def LIST(oobhandler, session, mode, *args, **kwargs):
|
||||
"""
|
||||
List available properties. Mode is the type of information
|
||||
desired:
|
||||
"COMMANDS" Request an array of commands supported by the server.
|
||||
"LISTS" Request an array of lists supported by the server.
|
||||
"CONFIGURABLE_VARIABLES" Request an array of variables the client can configure.
|
||||
"REPORTABLE_VARIABLES" Request an array of variables the server will report.
|
||||
"REPORTED_VARIABLES" Request an array of variables currently being reported.
|
||||
"SENDABLE_VARIABLES" Request an array of variables the server will send.
|
||||
"""
|
||||
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")))
|
||||
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
|
||||
elif mode == "SENDABLE_VARIABLES":
|
||||
pass
|
||||
elif mode == "CONFIGURABLE_VARIABLES":
|
||||
pass
|
||||
else:
|
||||
session.msg(oob=("list", ("wrong mode",)))
|
||||
|
||||
|
||||
def send(oobhandler, session, *args, **kwargs):
|
||||
"""
|
||||
This function directly returns the value of the given variable to the
|
||||
session. vartype can be one of
|
||||
"""
|
||||
obj = session.get_puppet_or_player()
|
||||
ret = {}
|
||||
if obj:
|
||||
for name in (a.upper() for a in args if a):
|
||||
try:
|
||||
key, value = OOB_SENDABLE.get(name, _NA)(obj)
|
||||
ret[name] = value
|
||||
except Exception, e:
|
||||
ret[name] = str(e)
|
||||
# return result
|
||||
session.msg(oob=("send", ret))
|
||||
|
||||
def report(oobhandler, session, *args, **kwargs):
|
||||
"""
|
||||
This creates a tracker instance to track the data given in *args.
|
||||
vartype is one of "prop" (database fields) or "attr" (attributes)
|
||||
"""
|
||||
obj = session.get_puppet_or_player()
|
||||
if obj:
|
||||
for name in (a.upper() for a in args if a):
|
||||
key, val = OOB_REPORTABLE.get(name, _NA)(obj)
|
||||
if key:
|
||||
if key.startswith("db_"):
|
||||
oobhandler.track_field(obj, session.sessid, key, OOBFieldTracker)
|
||||
else: # assume attribute
|
||||
oobhandler.track_attribute(obj, session.sessid, key, OOBAttributeTracker)
|
||||
|
||||
def unreport(oobhandler, session, vartype="prop", *args, **kwargs):
|
||||
"""
|
||||
This removes tracking for the given data given in *args.
|
||||
vartype is one of of "prop" or "attr".
|
||||
"""
|
||||
obj = session.get_puppet_or_player()
|
||||
if obj:
|
||||
for name in (a.upper() for a in args if a):
|
||||
key, val = OOB_REPORTABLE.get(name, _NA)
|
||||
if key:
|
||||
if key.startswith("db_"):
|
||||
oobhandler.untrack_field(obj, session.sessid, key)
|
||||
else: # assume attribute
|
||||
oobhandler.untrack_attribute(obj, session.sessid, key)
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue