From 2c856aae803468f0f7060221bc0fbd9a761262df Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 29 Apr 2018 14:00:50 -0400 Subject: [PATCH] Editor upload & reload buttons are now working. Floppy upload & download working. --- .../java/net/simon987/server/GameServer.java | 3 +- .../main/java/net/simon987/server/Main.java | 10 +- .../server/web/FloppyDownloadRoute.java | 36 +++++++ .../server/web/FloppyUploadRoute.java | 67 +++++++++++++ .../net/simon987/server/web/WebServer.java | 10 +- .../server/websocket/FloppyHandler.java | 40 -------- .../server/websocket/FloppyUploadRoute.java | 37 ------- .../server/websocket/SocketServer.java | 1 - Server/src/main/resources/static/css/mar.css | 40 ++++++++ .../src/main/resources/static/images/icon.png | Bin 1231 -> 1131 bytes Server/src/main/resources/static/js/editor.js | 8 +- Server/src/main/resources/static/js/mar.js | 13 --- Server/src/main/resources/templates/header.vm | 2 +- .../main/resources/templates/leaderboard.vm | 1 - Server/src/main/resources/templates/play.vm | 92 ++++++++++-------- Server/src/main/typescript/GameClient.ts | 21 +--- 16 files changed, 217 insertions(+), 164 deletions(-) create mode 100644 Server/src/main/java/net/simon987/server/web/FloppyDownloadRoute.java create mode 100644 Server/src/main/java/net/simon987/server/web/FloppyUploadRoute.java delete mode 100644 Server/src/main/java/net/simon987/server/websocket/FloppyHandler.java delete mode 100644 Server/src/main/java/net/simon987/server/websocket/FloppyUploadRoute.java diff --git a/Server/src/main/java/net/simon987/server/GameServer.java b/Server/src/main/java/net/simon987/server/GameServer.java index d0ce66b..6186b3a 100644 --- a/Server/src/main/java/net/simon987/server/GameServer.java +++ b/Server/src/main/java/net/simon987/server/GameServer.java @@ -154,7 +154,6 @@ public class GameServer implements Runnable { GameEvent event = new TickEvent(gameUniverse.getTime()); eventDispatcher.dispatch(event); //Ignore cancellation - //Process user code for (User user : gameUniverse.getUsers()) { @@ -189,7 +188,7 @@ public class GameServer implements Runnable { save(); } -// socketServer.tick(); + socketServer.tick(); // LogManager.LOGGER.info("Processed " + gameUniverse.getWorldCount() + " worlds (" + updatedWorlds + // " updated)"); diff --git a/Server/src/main/java/net/simon987/server/Main.java b/Server/src/main/java/net/simon987/server/Main.java index a403043..d076cc8 100644 --- a/Server/src/main/java/net/simon987/server/Main.java +++ b/Server/src/main/java/net/simon987/server/Main.java @@ -2,6 +2,7 @@ package net.simon987.server; import net.simon987.server.logging.LogManager; import net.simon987.server.web.WebServer; +import spark.Spark; public class Main { @@ -10,12 +11,15 @@ public class Main { ServerConfiguration config = new ServerConfiguration("config.properties"); LogManager.initialize(config); - //Load GameServer.INSTANCE.load(); - (new Thread(GameServer.INSTANCE)).start(); //Web server - new WebServer(GameServer.INSTANCE.getConfig()); + WebServer webServer = new WebServer(GameServer.INSTANCE.getConfig()); + + Spark.awaitInitialization(); + GameServer.INSTANCE.setSocketServer(webServer.getSocketServer()); + + (new Thread(GameServer.INSTANCE)).start(); } } diff --git a/Server/src/main/java/net/simon987/server/web/FloppyDownloadRoute.java b/Server/src/main/java/net/simon987/server/web/FloppyDownloadRoute.java new file mode 100644 index 0000000..765407e --- /dev/null +++ b/Server/src/main/java/net/simon987/server/web/FloppyDownloadRoute.java @@ -0,0 +1,36 @@ +package net.simon987.server.web; + +import net.simon987.server.GameServer; +import net.simon987.server.logging.LogManager; +import spark.Request; +import spark.Response; +import spark.Route; + +public class FloppyDownloadRoute implements Route { + + @Override + public Object handle(Request request, Response response) { + + String username = request.session().attribute("username"); + + if (username != null) { + + response.header("Content-Type", "application/octet-stream"); + response.header("Content-Disposition", "filename=\"floppy.bin\""); + + try { + return GameServer.INSTANCE.getGameUniverse().getUser(username).getControlledUnit().getFloppyData().getBytes(); + } catch (Exception e) { + String message = "Encountered exception while reading floppy data: " + e.getMessage(); + + LogManager.LOGGER.severe(message); + return message; + } + + } else { + response.status(403); + return "Not logged in"; + } + + } +} diff --git a/Server/src/main/java/net/simon987/server/web/FloppyUploadRoute.java b/Server/src/main/java/net/simon987/server/web/FloppyUploadRoute.java new file mode 100644 index 0000000..c985f3f --- /dev/null +++ b/Server/src/main/java/net/simon987/server/web/FloppyUploadRoute.java @@ -0,0 +1,67 @@ +package net.simon987.server.web; + +import net.simon987.server.GameServer; +import net.simon987.server.logging.LogManager; +import spark.Request; +import spark.Response; +import spark.Route; + +import javax.servlet.MultipartConfigElement; +import javax.servlet.ServletException; +import java.io.IOException; +import java.io.InputStream; + +public class FloppyUploadRoute implements Route { + + @Override + public Object handle(Request request, Response response) { + + String username = request.session().attribute("username"); + + if (username != null) { + try { + request.attribute("org.eclipse.jetty.multipartConfig", + new MultipartConfigElement("/tmp_floppy", 1474560L, -1L, 0)); + + try (InputStream is = request.raw().getPart("floppyData").getInputStream()) { + + if (is.available() == 1474560) { + + byte[] bytes = new byte[1474560]; + int bytesRead = is.read(bytes); + + if (bytesRead == 1474560) { + + try { + GameServer.INSTANCE.getGameUniverse().getUser(username).getControlledUnit().getFloppyData().setBytes(bytes); + return "ok"; + } catch (Exception e) { + String message = "Encountered exception while writing floppy data: " + e.getMessage(); + + LogManager.LOGGER.severe(message); + return message; + } + + } else { + return "Couldn't read floppy file"; + } + + } else { + return "File size must be 1474560 bytes"; + } + + } catch (IOException | ServletException e) { + e.printStackTrace(); + return "Error reading floppy file: " + e.getMessage(); + } + + } catch (IllegalStateException e) { + return "File exceeds maximum size"; + } + } else { + response.status(403); + return "Not logged in"; + } + + } +} diff --git a/Server/src/main/java/net/simon987/server/web/WebServer.java b/Server/src/main/java/net/simon987/server/web/WebServer.java index ded8e95..febd789 100644 --- a/Server/src/main/java/net/simon987/server/web/WebServer.java +++ b/Server/src/main/java/net/simon987/server/web/WebServer.java @@ -2,7 +2,6 @@ package net.simon987.server.web; import net.simon987.server.ServerConfiguration; import net.simon987.server.logging.LogManager; -import net.simon987.server.websocket.FloppyUploadRoute; import net.simon987.server.websocket.SocketServer; import org.apache.velocity.app.VelocityEngine; import spark.Spark; @@ -12,6 +11,8 @@ import java.util.Properties; public class WebServer { + private SocketServer socketServer; + public WebServer(ServerConfiguration config) { //Velocity config @@ -36,7 +37,8 @@ public class WebServer { LogManager.LOGGER.info("(Web) Enabled ssl"); } - Spark.webSocket("/socket", SocketServer.class); + socketServer = new SocketServer(); + Spark.webSocket("/socket", socketServer); Spark.get("/", new HomePage(), templateEngine); Spark.get("/leaderboard", new LeaderBoardPage(), templateEngine); @@ -49,8 +51,12 @@ public class WebServer { Spark.post("/change_password", new ChangePasswordRoute()); Spark.get("/server_info", new ServerInfoRoute()); Spark.post("/floppy_upload", new FloppyUploadRoute()); + Spark.get("/floppy_download", new FloppyDownloadRoute()); Spark.after((request, response) -> response.header("Content-Encoding", "gzip")); } + public SocketServer getSocketServer() { + return socketServer; + } } diff --git a/Server/src/main/java/net/simon987/server/websocket/FloppyHandler.java b/Server/src/main/java/net/simon987/server/websocket/FloppyHandler.java deleted file mode 100644 index 07d1970..0000000 --- a/Server/src/main/java/net/simon987/server/websocket/FloppyHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.simon987.server.websocket; - -import net.simon987.server.GameServer; -import net.simon987.server.logging.LogManager; -import org.json.simple.JSONObject; - -public class FloppyHandler implements MessageHandler { - - SocketServerDatabase db = new SocketServerDatabase(GameServer.INSTANCE.getConfig()); - - @Override - public void handle(OnlineUser user, JSONObject json) { - - if (json.get("t").equals("floppyDown")) { - - LogManager.LOGGER.fine("(WS) Floppy download request from " + user.getUser().getUsername()); - - if (user.getUser().isGuest()) { - return; - } - - if (user.getUser().getControlledUnit().getFloppyData() != null) { - byte[] bytes = user.getUser().getControlledUnit().getFloppyData().getBytes(); - LogManager.LOGGER.severe("TODO FloppyHandler.handle()"); - } - - - } else if (json.get("t").equals("floppyUp")) { - - LogManager.LOGGER.fine("(WS) Floppy upload request from " + user.getUser().getUsername()); - - //Check newly uploaded file on the database - byte[] bytes = db.getFloppy(user.getUser().getUsername()); - - if (bytes != null) { - user.getUser().getControlledUnit().getFloppyData().setBytes(bytes); - } - } - } -} diff --git a/Server/src/main/java/net/simon987/server/websocket/FloppyUploadRoute.java b/Server/src/main/java/net/simon987/server/websocket/FloppyUploadRoute.java deleted file mode 100644 index a504b9c..0000000 --- a/Server/src/main/java/net/simon987/server/websocket/FloppyUploadRoute.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.simon987.server.websocket; - -import spark.Request; -import spark.Response; -import spark.Route; - -import javax.servlet.MultipartConfigElement; -import javax.servlet.ServletException; -import java.io.IOException; -import java.io.InputStream; - -public class FloppyUploadRoute implements Route { - - @Override - public Object handle(Request request, Response response) { - - try { - request.attribute("org.eclipse.jetty.multipartConfig", - new MultipartConfigElement("/tmp_floppy", 1474560L, -1L, 0)); - - try (InputStream is = request.raw().getPart("floppyData").getInputStream()) { - - System.out.println(is.available()); - - // Use the input stream to create a file - } catch (IOException | ServletException e) { - e.printStackTrace(); - } - - } catch (IllegalStateException e) { - System.out.println(e.getMessage()); - return "File exceeds maximum size"; - } - - return "mh"; - } -} diff --git a/Server/src/main/java/net/simon987/server/websocket/SocketServer.java b/Server/src/main/java/net/simon987/server/websocket/SocketServer.java index b749327..698f57a 100644 --- a/Server/src/main/java/net/simon987/server/websocket/SocketServer.java +++ b/Server/src/main/java/net/simon987/server/websocket/SocketServer.java @@ -30,7 +30,6 @@ public class SocketServer { messageDispatcher.addHandler(new CodeUploadHandler()); messageDispatcher.addHandler(new CodeRequestHandler()); messageDispatcher.addHandler(new KeypressHandler()); - messageDispatcher.addHandler(new FloppyHandler()); messageDispatcher.addHandler(new DebugCommandHandler()); } diff --git a/Server/src/main/resources/static/css/mar.css b/Server/src/main/resources/static/css/mar.css index d9b2920..733c54b 100644 --- a/Server/src/main/resources/static/css/mar.css +++ b/Server/src/main/resources/static/css/mar.css @@ -272,4 +272,44 @@ -ms-flex: 0 0 25%; flex: 0 0 25%; max-width: 25%; +} + +/** https://stackoverflow.com/questions/6410730/ */ +@-webkit-keyframes rotating /* Safari and Chrome */ +{ + from { + -webkit-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes rotating { + from { + -ms-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -ms-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.rotating { + -webkit-animation: rotating 2s linear infinite; + -moz-animation: rotating 2s linear infinite; + -ms-animation: rotating 2s linear infinite; + -o-animation: rotating 2s linear infinite; + animation: rotating 2s linear infinite; } \ No newline at end of file diff --git a/Server/src/main/resources/static/images/icon.png b/Server/src/main/resources/static/images/icon.png index 51a6cb9006133d3c741d1dcafccdb732de0df5e4..6bf38ee02165fc53b1c44be2a0a4aee075d0bf4b 100644 GIT binary patch delta 1075 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"; + document.getElementById("floppyUp").innerHTML = 'cached Floppy'; + var formData = new FormData(document.getElementById("floppyForm")); @@ -517,8 +518,6 @@ document.getElementById("floppyIn").onchange = function () { if (xhr.status === 200) { if (xhr.responseText === "ok") { - //Upload ok, notify the game server - mar.client.notifyFloppyUp(); alert("Uploaded floppy disk to the drive!") } else { alert(xhr.responseText) @@ -528,7 +527,8 @@ document.getElementById("floppyIn").onchange = function () { alert("Couldn't upload floppy code (" + xhr.status + ")"); } - document.getElementById("floppyUp").innerHTML = " "; + document.getElementById("floppyUp").innerHTML = 'file_upload Floppy'; + }; xhr.onerror = function (ev) { ev.preventDefault(); diff --git a/Server/src/main/resources/static/js/mar.js b/Server/src/main/resources/static/js/mar.js index ee8ce1d..16ef293 100644 --- a/Server/src/main/resources/static/js/mar.js +++ b/Server/src/main/resources/static/js/mar.js @@ -667,19 +667,6 @@ var GameClient = (function () { this.socket.send(JSON.stringify({ t: "k", k: key })); } }; - GameClient.prototype.requestFloppy = function () { - document.getElementById("floppyDown").innerHTML = ""; - if (DEBUG) { - console.log("[MAR] Requesting floppy"); - } - this.socket.send(JSON.stringify({ t: "floppyDown" })); - }; - GameClient.prototype.notifyFloppyUp = function () { - if (DEBUG) { - console.log("[MAR] Notifying the game server of floppy upload"); - } - this.socket.send(JSON.stringify({ t: "floppyUp" })); - }; GameClient.prototype.requestObjects = function () { if (DEBUG) { console.log("[MAR] Requesting game objects"); diff --git a/Server/src/main/resources/templates/header.vm b/Server/src/main/resources/templates/header.vm index c5ea8ab..bbcf5c7 100644 --- a/Server/src/main/resources/templates/header.vm +++ b/Server/src/main/resources/templates/header.vm @@ -1,6 +1,6 @@