From a1c89d615e1f2e4d2057e80492786022b4e2d2ca Mon Sep 17 00:00:00 2001 From: Griatch Date: Wed, 6 Apr 2016 17:02:28 +0200 Subject: [PATCH] Fixed parsing in option command and inputfunction to properly handle options set in both ways. --- evennia/commands/default/player.py | 3 +++ evennia/server/inputfuncs.py | 39 +++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/evennia/commands/default/player.py b/evennia/commands/default/player.py index 825f61cbd8..b1c4e6bcbb 100644 --- a/evennia/commands/default/player.py +++ b/evennia/commands/default/player.py @@ -463,8 +463,11 @@ class CmdOption(MuxPlayerCommand): name = self.lhs.upper() val = self.rhs.strip() + do_sync = False if val and name in validators: do_sync = update(name, val, validators[name]) + else: + self.session.msg("|rNo option named '|w%s|r'." % name) if do_sync: self.session.sessionhandler.session_portal_sync(self.session) diff --git a/evennia/server/inputfuncs.py b/evennia/server/inputfuncs.py index 7b6126347f..5bc19f36ff 100644 --- a/evennia/server/inputfuncs.py +++ b/evennia/server/inputfuncs.py @@ -23,7 +23,7 @@ from future.utils import viewkeys from django.conf import settings from evennia.commands.cmdhandler import cmdhandler from evennia.utils.logger import log_err -from evennia.utils.utils import to_str +from evennia.utils.utils import to_str, to_unicode _IDLE_COMMAND = settings.IDLE_COMMAND @@ -33,7 +33,6 @@ _NA = lambda o: "N/A" _ERROR_INPUT = "Inputfunc {name}({session}): Wrong/unrecognized input: {inp}" - # All global functions are inputfuncs available to process inputs def text(session, *args, **kwargs): @@ -123,12 +122,26 @@ def client_options(session, *args, **kwargs): # return current settings options = dict((key, flags[key]) for key in flags if key.upper() in ("ANSI", "XTERM256", "MXP", - "UTF-8", "SCREENREADER", + "UTF-8", "SCREENREADER", "ENCODING", "MCCP", "SCREENHEIGHT", "SCREENWIDTH", "INPUTDEBUG")) session.msg(client_options=options) return + def validate_encoding(val): + # helper: change encoding + try: + to_str(to_unicode("test-string"), encoding=val) + except LookupError: + raise RuntimeError("The encoding '|w%s|n' is invalid. " % val) + return val + + def validate_size(val): + return {0: int(val)} + + def validate_bool(val): + return True if val.lower() in ("true", "on", "1") else False + for key, value in kwargs.iteritems(): key = key.lower() if key == "client": @@ -136,24 +149,26 @@ def client_options(session, *args, **kwargs): elif key == "version": if "CLIENTNAME" in flags: flags["CLIENTNAME"] = "%s %s" % (flags["CLIENTNAME"], to_str(value)) + elif key == "ENCODING": + flags["ENCODING"] = validate_encoding(value) elif key == "ansi": - flags["ANSI"] = bool(value) + flags["ANSI"] = validate_bool(value) elif key == "xterm256": - flags["XTERM256"] = bool(value) + flags["XTERM256"] = validate_bool(value) elif key == "mxp": - flags["MXP"] = bool(value) + flags["MXP"] = validate_bool(value) elif key == "utf-8": - flags["UTF-8"] = bool(value) + flags["UTF-8"] = validate_bool(value) elif key == "screenreader": - flags["SCREENREADER"] = bool(value) + flags["SCREENREADER"] = validate_bool(value) elif key == "mccp": - flags["MCCP"] = bool(value) + flags["MCCP"] = validate_bool(value) elif key == "screenheight": - flags["SCREENHEIGHT"] = int(value) + flags["SCREENHEIGHT"] = validate_size(value) elif key == "screenwidth": - flags["SCREENWIDTH"] = int(value) + flags["SCREENWIDTH"] = validate_size(value) elif key == "inputdebug": - flags["INPUTDEBUG"] = bool(value) + flags["INPUTDEBUG"] = validate_bool(value) elif not key == "options": err = _ERROR_INPUT.format( name="client_settings", session=session, inp=key)