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 51a6cb9..6bf38ee 100644 Binary files a/Server/src/main/resources/static/images/icon.png and b/Server/src/main/resources/static/images/icon.png differ diff --git a/Server/src/main/resources/static/js/editor.js b/Server/src/main/resources/static/js/editor.js index 77434f6..508744e 100644 --- a/Server/src/main/resources/static/js/editor.js +++ b/Server/src/main/resources/static/js/editor.js @@ -505,7 +505,8 @@ editorOnThemeChange(); document.getElementById("floppyIn").onchange = function () { - //document.getElementById("floppyUp").innerHTML = ""; + 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 @@