diff --git a/evennia/server/inputfuncs.py b/evennia/server/inputfuncs.py index ea869cf886..d48d70b643 100644 --- a/evennia/server/inputfuncs.py +++ b/evennia/server/inputfuncs.py @@ -159,11 +159,21 @@ def client_options(session, *args, **kwargs): def get_client_options(session, *args, **kwargs): """ - Alias wrapper for getting options + Alias wrapper for getting options. """ client_options(session, get=True) +def get_inputfuncs(session, *args, **kwargs): + """ + Get the keys of all available inputfuncs. Note that we don't get + it from this module alone since multiple modules could be added. + So we get it from the sessionhandler. + """ + inputfuncsdict = dict((key, func.__doc__) for key, func in session.sessionhandler.get_inputfuncs().iterkeys()) + session.msg(get_inputfuncs=inputfuncsdict) + + def login(session, *args, **kwargs): """ Peform a login. This only works if session is currently not logged @@ -212,12 +222,13 @@ def _testrepeat(**kwargs): session (Session): Session to return to. """ import time - kwargs["session"].msg("Repeat called: %s" % time.time()) + kwargs["session"].msg(repeat="Repeat called: %s" % time.time()) _repeatable = {"test1": _testrepeat, # example only "test2": _testrepeat} # " + def repeat(session, *args, **kwargs): """ Call a named function repeatedly. Note that @@ -258,6 +269,7 @@ _monitorable = { "desc": "desc" } + def _on_monitor_change(**kwargs): fieldname = kwargs["fieldname"] obj = kwargs["obj"] @@ -265,6 +277,7 @@ def _on_monitor_change(**kwargs): session = kwargs["session"] session.msg(monitor={"name": name, "value": _GA(obj, fieldname)}) + def monitor(session, *args, **kwargs): """ Adds monitoring to a given property or Attribute. @@ -289,6 +302,7 @@ def monitor(session, *args, **kwargs): MONITOR_HANDLER.add(obj, field_name, _on_monitor_change, idstring=session.sessid, persistent=False, name=name, session=session) + def unmonitor(session, *args, **kwargs): """ Wrapper for turning off monitoring @@ -298,21 +312,20 @@ def unmonitor(session, *args, **kwargs): # aliases for GMCP -core_hello = client_options # Core.Hello -core_supports_set = client_options # Core.Supports.Set -core_supports_get = get_client_options # Core.Supports.Get -char_login = login # Char.Login -char_value_get = get_value # Char.Value.Get -char_repeat_on = repeat # Char.Repeat.On -char_repeat_off = unrepeat # Char.Repeat.Off -char_monitor_on = monitor # Char.Monitor.On -char_monitor_off = unmonitor # Char.Monitor.Off +gmcp_core_hello = client_options # Core.Hello +gmcp_core_supports_set = client_options # Core.Supports.Set +gmcp_core_supports_get = get_client_options # Core.Supports.Get +gmcp_core_commands_get = get_inputfuncs # Core.Commands.Get +gmcp_char_login = login # Char.Login +gmcp_char_value_get = get_value # Char.Value.Get +gmcp_char_repeat_on = repeat # Char.Repeat.On +gmcp_char_repeat_off = unrepeat # Char.Repeat.Off +gmcp_char_monitor_on = monitor # Char.Monitor.On +gmcp_char_monitor_off = unmonitor # Char.Monitor.Off # aliases for MSDP -msdp_send = get_value # SEND -msdp_repeat = repeat # REPEAT -msdp_unrepeat = unrepeat # UNREPEAT -msdp_report = monitor # REPORT -mspd_unreport = unmonitor # UNREPORT - - +SEND = get_value # SEND +REPEAT = repeat # REPEAT +UNREPEAT = unrepeat # UNREPEAT +MONITOR = monitor # REPORT +LIST = get_inputfuncs # LIST diff --git a/evennia/server/portal/telnet_oob.py b/evennia/server/portal/telnet_oob.py index a6b14edb9a..1d2dbe413c 100644 --- a/evennia/server/portal/telnet_oob.py +++ b/evennia/server/portal/telnet_oob.py @@ -61,6 +61,19 @@ msdp_regex_array = re.compile(r"%s\s*(\w*?)\s*%s\s*%s(.*?)%s" % (MSDP_VAR, MSDP_ msdp_regex_var = re.compile(r"%s" % MSDP_VAR) msdp_regex_val = re.compile(r"%s" % MSDP_VAL) +EVENNIA_TO_MSDP = {"client_options": "OPTIONS", + "get_inputfuncs": "LIST", + "get_value": "SEND", + "repeat": "REPEAT", + "monitor": "REPORT"} + +EVENNIA_TO_GMCP = {"client_options": "Core.Supports.Get", + "get_inputfuncs": "Core.Commands.Get", + "get_value": "Char.Value.Get", + "repeat": "Char.Repeat.Update", + "monitor": "Char.Monitor.Update"} + + # MSDP output templates # cmdname @@ -374,6 +387,14 @@ class TelnetOOB(object): args = list(structure) else: args = (structure,) + if cmdname.startswith("Custom.Cmd."): + # if Custom.Cmd.Cmdname, then use Cmdname + cmdname = cmdname[11:] + else: + # not a custom command - convert the input name to a + # Python form such that Core.Supports.Get -> + # gmcp_core_supports_get + cmdname = "gmcp_%s" % "_".join(part.lower() for part in cmdname.split(".")) print "gmcp data in:", {cmdname: [args, kwargs]} self.protocol.data_in(**{cmdname: [args, kwargs]}) @@ -389,10 +410,21 @@ class TelnetOOB(object): """ if self.MSDP: - encoded_oob = self.encode_msdp(cmdname, *args, **kwargs) + if cmdname in EVENNIA_TO_MSDP: + msdp_cmdname = EVENNIA_TO_MSDP[cmdname] + else: + msdp_cmdname = "CUSTOM" + kwargs["cmdname"] = cmdname + encoded_oob = self.encode_msdp(msdp_cmdname, *args, **kwargs) print "sending MSDP:", encoded_oob self.protocol._write(IAC + SB + MSDP + encoded_oob + IAC + SE) + if self.GMCP: - encoded_oob = self.encode_gmcp(cmdname, *args, **kwargs) + if cmdname in EVENNIA_TO_GMCP: + gmcp_cmdname = EVENNIA_TO_GMCP[cmdname] + else: + gmcp_cmdname = "Custom.Cmd" + kwargs["cmdname"] = cmdname + encoded_oob = self.encode_gmcp(gmcp_cmdname, *args, **kwargs) print "sending GMCP:", encoded_oob self.protocol._write(IAC + SB + GMCP + encoded_oob + IAC + SE) diff --git a/evennia/server/sessionhandler.py b/evennia/server/sessionhandler.py index 889292c240..9cfc4d3af1 100644 --- a/evennia/server/sessionhandler.py +++ b/evennia/server/sessionhandler.py @@ -621,6 +621,15 @@ class ServerSessionHandler(SessionHandler): self.server.amp_protocol.send_MsgServer2Portal(session, **kwargs) + def get_inputfuncs(self): + """ + Get all registered inputfuncs (access function) + + Returns: + inputfuncs (dict): A dict of {key:inputfunc,...} + """ + return _INPUT_FUNCS + def data_in(self, session, **kwargs): """ Data Portal -> Server.