From b3c8a37f89aa7bfc56fcabd7ce913e492f0a9a42 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 15 Feb 2015 11:49:36 +0100 Subject: [PATCH] Updated webclient to use the latest refactored oob syntax. --- evennia/server/oobhandler.py | 3 +- evennia/server/portal/websocket_client.py | 6 +- .../js/evennia_websocket_webclient.js | 95 ++++++++++--------- 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/evennia/server/oobhandler.py b/evennia/server/oobhandler.py index 9fc0a56f49..763925017e 100644 --- a/evennia/server/oobhandler.py +++ b/evennia/server/oobhandler.py @@ -416,7 +416,7 @@ class OOBHandler(TickerHandler): _OOB_ERROR(session, errmsg, *args, **kwargs) errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg) - raise + return # we found an oob command. Execute it. try: @@ -427,7 +427,6 @@ class OOBHandler(TickerHandler): _OOB_ERROR(session, errmsg, *args, **kwargs) errmsg = "OOB ERROR: %s" % errmsg logger.log_trace(errmsg) - raise # access object diff --git a/evennia/server/portal/websocket_client.py b/evennia/server/portal/websocket_client.py index 68541da7d0..d0ddc1d258 100644 --- a/evennia/server/portal/websocket_client.py +++ b/evennia/server/portal/websocket_client.py @@ -86,7 +86,7 @@ class WebSocketClient(Protocol, Session): if mode == "OOB": # an out-of-band command - self.decode_json(data) + self.json_decode(data) elif mode == "CMD": # plain text input self.data_in(text=data) @@ -107,7 +107,7 @@ class WebSocketClient(Protocol, Session): except Exception: log_trace("Websocket malformed OOB request: %s" % data) raise - self.sessionhandler.data_in(oob=(cmdname, args, kwargs)) + self.sessionhandler.data_in(self, oob=(cmdname, args, kwargs)) def json_encode(self, cmdname, *args, **kwargs): """ @@ -143,7 +143,7 @@ class WebSocketClient(Protocol, Session): self.sendLine(str(e)) if "oob" in kwargs: for cmdname, args, okwargs in kwargs["oob"]: - self.encode_json(cmdname, *args, **okwargs) + self.json_encode(cmdname, *args, **okwargs) raw = kwargs.get("raw", False) nomarkup = kwargs.get("nomarkup", False) diff --git a/evennia/web/webclient/static/webclient/js/evennia_websocket_webclient.js b/evennia/web/webclient/static/webclient/js/evennia_websocket_webclient.js index c61871bb0b..caa53470a9 100644 --- a/evennia/web/webclient/static/webclient/js/evennia_websocket_webclient.js +++ b/evennia/web/webclient/static/webclient/js/evennia_websocket_webclient.js @@ -16,7 +16,7 @@ messages sent to the client is one of two modes: // If on, allows client user to send OOB messages to server by // prepending with ##OOB{}, for example ##OOB{"echo":[1,2,3,4]} -var OOB_debug = true +var DEBUG = true // // Custom OOB functions @@ -56,7 +56,7 @@ function err (args, kwargs) { doShow("err", args) } // Map above functions with oob command names -var CMD_MAP = {"ECHO":echo, "LIST":list, "SEND":send, "REPORT":report, "error":err}; +var CMD_MAP = {"echo":echo, "LIST":list, "SEND":send, "REPORT":report, "error":err}; // // Webclient code @@ -96,33 +96,31 @@ function onMessage(evt) { var mode = inmsg.substr(0, 3); var message = inmsg.slice(3); if (mode == "OOB") { - // dynamically call oob methods, if available - // The variables are come on the form [(cmname, [args], {kwargs}), ...] - var oobcmds = JSON.parse(message); - + // dynamically call oob methods if available + // The incoming data is on the form [cmdname, [args], {kwargs}] try { - if (oobcmds instanceof Array == false) { - throw "oob instruction's outermost level must be an Array."; + if (message.length < 1) { + throw "Usage: ##OOB [[commandname, [args], {kwargs}], ...]" } - for (var icmd = 0; i < oobcmds.length; icmd++) { - // call each command tuple in turn - var cmdname = oobcmds[icmd][0]; - var args = oobcmds[icmd][1]; - var kwargs = oobcmds[icmd][2]; - // match cmdname with a command existing in the - // CMD_MAP mapping - if (cmdname in CMD_MAP == false) { - throw "oob command " + cmdname + " is not supported by client."; - } - // we have a matching oob command in CMD_MAP. - // Prepare the error message beforehand - // Execute - try { - CMD_MAP[cmdname](args, kwargs); - } - catch(error) { - doShow("err", "Client could not execute OOB function" + "cmdname" + "(" + args + kwargs + ")."); - } + var oobcmd = JSON.parse(message); + doShow("debug", "Received OOB: " + message + " parsed: " + oobcmd); + // call each command tuple in turn + var cmdname = oobcmd[0]; + var args = oobcmd[1]; + var kwargs = oobcmd[2]; + // match cmdname with a command existing in the + // CMD_MAP mapping + if (cmdname in CMD_MAP == false) { + throw "oob command " + cmdname + " is not supported by client."; + } + // we have a matching oob command in CMD_MAP. + // Prepare the error message beforehand + // Execute + try { + CMD_MAP[cmdname](args, kwargs); + } + catch(error) { + doShow("err", "Client could not execute OOB function" + "cmdname" + "(" + args + kwargs + ")."); } } catch(error) { @@ -154,29 +152,31 @@ function doSend(){ HISTORY_POS = 0; $('#inputform')[0].reset(); // clear input field - if (OOB_debug && outmsg.length > 4 && outmsg.substr(0, 5) == "##OOB") { + if (outmsg.length > 4 && outmsg.substr(0, 5) == "##OOB") { // OOB direct input var outmsg = outmsg.slice(5); if (outmsg == "UNITTEST") { // unittest mode doShow("out", "OOB testing mode ..."); - doOOB(JSON.parse('{"ECHO":"Echo test"}')); - doOOB(JSON.parse('{"LIST":"COMMANDS"}')); - doOOB(JSON.parse('{"SEND":"CHARACTER_NAME"}')); - doOOB(JSON.parse('{"REPORT":"TEST"}')); - doOOB(JSON.parse('{"UNREPORT":"TEST"}')); - doOOB(JSON.parse('{"REPEAT": 1}')); - doOOB(JSON.parse('{"UNREPEAT": 1}')); + doOOB(["ECHO", ["Echo test"]]); + doOOB(["LIST", ["COMMANDS"]]); + doOOB(["SEND", ["CHARACTER_NAME"]]); + doOOB(["REPORT", ["TEST"]]); + doOOB(["UNREPORT", ["TEST"]]); + doOOB(["REPEAT", [1, "ECHO"]]); + doOOB(["UNREPEAT", [1, "ECHO"]]); doShow("out", "... OOB testing mode done."); return } // send a manual OOB instruction try { - doShow("out", "OOB input: " + outmsg); - if (outmsg.length == 5) { - doShow("err", "OOB syntax: ##OOB[\"cmdname\", [args], {kwargs}]"); } + doShow("debug", "OOB input: " + outmsg); + if (outmsg.length == 0) { + throw "Usage: ##OOB [[commandname, [args], {kwargs}], ...]"; + } else { - doOOB(JSON.parse(outmsg.slice(5))); } + doOOB(outmsg); + } } catch(err) { doShow("err", err) @@ -190,6 +190,7 @@ function doSend(){ function doOOB(cmdstring){ // Send OOB data from client to Evennia. // Takes input strings with syntax ["cmdname", args, kwargs] + doShow("debug", "into doOOB... " + cmdstring) try { var cmdtuple = JSON.parse(cmdstring); var oobmsg = ""; @@ -201,7 +202,6 @@ function doOOB(cmdstring){ switch (cmdtuple.length) { case 0: throw "No command given"; - return case 1: // [cmdname] oobmsg = [cmdtuple[0], [], {}]; @@ -215,8 +215,7 @@ function doOOB(cmdstring){ oobmsg = [cmdtuple[0], cmdtuple[1], cmdtuple[2]]; break; default: - errmsg = "Malformed OOB instruction:" + cmdstring - return + throw "Malformed OOB instruction: " + cmdstring; } // convert to string and send it to the server oobmsg = JSON.stringify(oobmsg); @@ -224,7 +223,7 @@ function doOOB(cmdstring){ } } catch(error) { - doSend("err", "OOB output " + cmdtuple + " is not on the right form: " + error); + doShow("err", "OOB output " + cmdtuple + " is not on the right form: " + error); } } @@ -233,6 +232,16 @@ function doShow(type, msg){ // type gives the class of div to use. // The default types are // "out" (normal output) or "err" (red error message) + if (type == "debug") { + if (DEBUG) { + type = "out"; + msg = "DEBUG: " + msg; + } + else { + return; + } + } + // output $("#messagewindow").append( "
"+ msg +"
"); // scroll message window to bottom