From 36d433fdce235d3b859d2ca469a337420e83a952 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 4 Nov 2017 14:37:33 -0400 Subject: [PATCH] Unregistered users can login on the game server (read-only) --- Server/src/net/simon987/server/Main.java | 5 +++ .../simon987/server/game/GameUniverse.java | 25 ++++++++++- .../server/webserver/CodeRequestHandler.java | 22 ++++++++-- .../server/webserver/CodeUploadHandler.java | 25 +++++++---- .../server/webserver/KeypressHandler.java | 11 +++-- .../simon987/server/webserver/OnlineUser.java | 10 +++++ .../server/webserver/SocketServer.java | 43 +++++++++++++------ .../webserver/UserInfoRequestHandler.java | 32 ++++++++++---- config.properties | 2 - 9 files changed, 132 insertions(+), 43 deletions(-) diff --git a/Server/src/net/simon987/server/Main.java b/Server/src/net/simon987/server/Main.java index 0746370..d81db52 100644 --- a/Server/src/net/simon987/server/Main.java +++ b/Server/src/net/simon987/server/Main.java @@ -10,6 +10,11 @@ import java.net.InetSocketAddress; public class Main { public static void main(String[] args){ + //TODO: Confirmation on code upload + //TODO: Copper/Iron/Biomass: on hover only + //TODO: Docs + //TODO: + LogManager.initialize(); ServerConfiguration config = new ServerConfiguration(new File("config.properties")); diff --git a/Server/src/net/simon987/server/game/GameUniverse.java b/Server/src/net/simon987/server/game/GameUniverse.java index 181767f..dc14918 100644 --- a/Server/src/net/simon987/server/game/GameUniverse.java +++ b/Server/src/net/simon987/server/game/GameUniverse.java @@ -86,7 +86,7 @@ public class GameUniverse implements JSONSerialisable{ return null; } - public User getOrCreateUser(String username){ + public User getOrCreateUser(String username, boolean makeControlledUnit){ User user = getUser(username); if(user != null) { @@ -96,7 +96,12 @@ public class GameUniverse implements JSONSerialisable{ LogManager.LOGGER.info("Creating new User: " + username); try { - user = new User(); + if(makeControlledUnit) { + user = new User(); + } else { + user = new User(null); + } + user.setUsername(username); user.setCpu(new CPU(GameServer.INSTANCE.getConfig(), user)); user.setUserCode(GameServer.INSTANCE.getConfig().getString("new_user_code")); @@ -209,4 +214,20 @@ public class GameUniverse implements JSONSerialisable{ public int getNextObjectId() { return ++nextObjectId; } + + public String getGuestUsername() { + int i = 1; + + while (i < 1000) { //todo get Max guest user cap from config + if(getUser("guest" + String.valueOf(i)) != null) { + i++; + continue; + } + + return "guest" + String.valueOf(i); + } + + return null; + + } } diff --git a/Server/src/net/simon987/server/webserver/CodeRequestHandler.java b/Server/src/net/simon987/server/webserver/CodeRequestHandler.java index a0ffd62..33939da 100644 --- a/Server/src/net/simon987/server/webserver/CodeRequestHandler.java +++ b/Server/src/net/simon987/server/webserver/CodeRequestHandler.java @@ -11,12 +11,26 @@ public class CodeRequestHandler implements MessageHandler { LogManager.LOGGER.info("(WS) Code request from " + user.getUser().getUsername()); - JSONObject response = new JSONObject(); + if(user.isGuest()) { + + JSONObject response = new JSONObject(); + + response.put("t", "code"); + response.put("code", "; Create a free account to control your own Cubot with assembly language!"); //todo load from config + + user.getWebSocket().send(response.toJSONString()); + + } else { + + JSONObject response = new JSONObject(); + + response.put("t", "code"); + response.put("code", user.getUser().getUserCode()); + + user.getWebSocket().send(response.toJSONString()); + } - response.put("t", "code"); - response.put("code", user.getUser().getUserCode()); - user.getWebSocket().send(response.toJSONString()); } } diff --git a/Server/src/net/simon987/server/webserver/CodeUploadHandler.java b/Server/src/net/simon987/server/webserver/CodeUploadHandler.java index 09f91ec..41a3fa0 100644 --- a/Server/src/net/simon987/server/webserver/CodeUploadHandler.java +++ b/Server/src/net/simon987/server/webserver/CodeUploadHandler.java @@ -14,18 +14,25 @@ public class CodeUploadHandler implements MessageHandler { LogManager.LOGGER.info("(WS) Code upload from " + user.getUser().getUsername()); - //TODO Should we wait at the end of the tick to modify the CPU ? - user.getUser().setUserCode((String)json.get("code")); + if(user.isGuest()) { + //Ignore - AssemblyResult ar = new Assembler(user.getUser().getCpu().getInstructionSet(), - user.getUser().getCpu().getRegisterSet(), - GameServer.INSTANCE.getConfig()).parse(user.getUser().getUserCode()); + } else { + //TODO Should we wait at the end of the tick to modify the CPU ? + user.getUser().setUserCode((String)json.get("code")); + + AssemblyResult ar = new Assembler(user.getUser().getCpu().getInstructionSet(), + user.getUser().getCpu().getRegisterSet(), + GameServer.INSTANCE.getConfig()).parse(user.getUser().getUserCode()); + + user.getUser().getCpu().getMemory().clear(); + + //Write assembled code to mem + user.getUser().getCpu().getMemory().write((char) ar.origin, ar.bytes, ar.bytes.length); + user.getUser().getCpu().setCodeSegmentOffset(ar.origin); + } - user.getUser().getCpu().getMemory().clear(); - //Write assembled code to mem - user.getUser().getCpu().getMemory().write((char) ar.origin, ar.bytes, ar.bytes.length); - user.getUser().getCpu().setCodeSegmentOffset(ar.origin); } } diff --git a/Server/src/net/simon987/server/webserver/KeypressHandler.java b/Server/src/net/simon987/server/webserver/KeypressHandler.java index 19ad220..9a2d395 100644 --- a/Server/src/net/simon987/server/webserver/KeypressHandler.java +++ b/Server/src/net/simon987/server/webserver/KeypressHandler.java @@ -8,13 +8,16 @@ public class KeypressHandler implements MessageHandler { @Override public void handle(OnlineUser user, JSONObject json) { - if(json.get("t").equals("k")){ - LogManager.LOGGER.info("(WS) Received keypress"); + if(!user.isGuest()) { + if(json.get("t").equals("k")){ - int key = (int)(long)json.get("k"); + LogManager.LOGGER.info("(WS) Received keypress"); - user.getUser().getControlledUnit().getKeyboardBuffer().add(key); + int key = (int)(long)json.get("k"); + + user.getUser().getControlledUnit().getKeyboardBuffer().add(key); + } } } } diff --git a/Server/src/net/simon987/server/webserver/OnlineUser.java b/Server/src/net/simon987/server/webserver/OnlineUser.java index bb23326..be24b1f 100644 --- a/Server/src/net/simon987/server/webserver/OnlineUser.java +++ b/Server/src/net/simon987/server/webserver/OnlineUser.java @@ -10,6 +10,8 @@ public class OnlineUser { private WebSocket webSocket; + private boolean guest; + /** * Associated game user (if authenticated) */ @@ -39,4 +41,12 @@ public class OnlineUser { public void setAuthenticated(boolean authenticated) { this.authenticated = authenticated; } + + public void setGuest(boolean guest) { + this.guest = guest; + } + + public boolean isGuest() { + return guest; + } } diff --git a/Server/src/net/simon987/server/webserver/SocketServer.java b/Server/src/net/simon987/server/webserver/SocketServer.java index 0c3c982..e897332 100644 --- a/Server/src/net/simon987/server/webserver/SocketServer.java +++ b/Server/src/net/simon987/server/webserver/SocketServer.java @@ -68,7 +68,7 @@ public class SocketServer extends WebSocketServer { String username = database.validateAuthToken(message); if (username != null) { - User user = GameServer.INSTANCE.getGameUniverse().getOrCreateUser(username); + User user = GameServer.INSTANCE.getGameUniverse().getOrCreateUser(username, true); LogManager.LOGGER.info("(WS) User was successfully authenticated: " + user.getUsername()); @@ -78,13 +78,19 @@ public class SocketServer extends WebSocketServer { conn.send("{\"t\":\"auth\", \"m\":\"ok\"}"); } else { - LogManager.LOGGER.info("(WS) Unsuccessful authentication attempt " + conn.getRemoteSocketAddress()); - conn.send("{\"t\":\"auth\", \"m\":\"failed\"}"); - conn.close(); + + User user = GameServer.INSTANCE.getGameUniverse().getOrCreateUser(GameServer.INSTANCE.getGameUniverse().getGuestUsername(), false); + onlineUser.setUser(user); + onlineUser.setAuthenticated(true); + onlineUser.setGuest(true); + + LogManager.LOGGER.info("(WS) Created guest user " + + onlineUser.getUser().getUsername() + conn.getRemoteSocketAddress()); + + conn.send("{\"t\":\"auth\", \"m\":\"ok\"}"); } } - } } else { @@ -125,18 +131,27 @@ public class SocketServer extends WebSocketServer { for (OnlineUser user : userManager.getOnlineUsers()) { if (user.getWebSocket().isOpen()) { - //Send keyboard updated buffer - try{ - ArrayList kbBuffer = user.getUser().getControlledUnit().getKeyboardBuffer(); - JSONArray keys = new JSONArray(); - keys.addAll(kbBuffer); - json.put("keys", keys); - //Send tick message + + if(user.isGuest()) { + user.getWebSocket().send(json.toJSONString()); - } catch (NullPointerException e){ - //User is online but not completely initialised + + } else { + //Send keyboard updated buffer + try{ + ArrayList kbBuffer = user.getUser().getControlledUnit().getKeyboardBuffer(); + JSONArray keys = new JSONArray(); + keys.addAll(kbBuffer); + json.put("keys", keys); + //Send tick message + user.getWebSocket().send(json.toJSONString()); + } catch (NullPointerException e){ + //User is online but not completely initialised + } } + + } } diff --git a/Server/src/net/simon987/server/webserver/UserInfoRequestHandler.java b/Server/src/net/simon987/server/webserver/UserInfoRequestHandler.java index 218b35a..47ef249 100644 --- a/Server/src/net/simon987/server/webserver/UserInfoRequestHandler.java +++ b/Server/src/net/simon987/server/webserver/UserInfoRequestHandler.java @@ -1,5 +1,6 @@ package net.simon987.server.webserver; +import net.simon987.server.GameServer; import net.simon987.server.game.GameObject; import net.simon987.server.logging.LogManager; import org.json.simple.JSONObject; @@ -11,18 +12,33 @@ public class UserInfoRequestHandler implements MessageHandler { public void handle(OnlineUser user, JSONObject message) { if (message.get("t").equals("userInfo")) { + LogManager.LOGGER.info("(WS) User info request from " + user.getUser().getUsername()); - GameObject object = (GameObject)user.getUser().getControlledUnit(); + if(user.isGuest()) { + JSONObject json = new JSONObject(); + json.put("t", "userInfo"); + json.put("worldX", GameServer.INSTANCE.getConfig().getInt("new_user_worldX")); + json.put("worldY", GameServer.INSTANCE.getConfig().getInt("new_user_worldY")); + json.put("x", 1); + json.put("y", 1); + + user.getWebSocket().send(json.toJSONString()); + } else { + GameObject object = (GameObject)user.getUser().getControlledUnit(); + + JSONObject json = new JSONObject(); + json.put("t", "userInfo"); + json.put("worldX", object.getWorld().getX()); + json.put("worldY", object.getWorld().getY()); + json.put("x", object.getX()); + json.put("y", object.getY()); + + user.getWebSocket().send(json.toJSONString()); + } + - JSONObject json = new JSONObject(); - json.put("t", "userInfo"); - json.put("worldX", object.getWorld().getX()); - json.put("worldY", object.getWorld().getY()); - json.put("x", object.getX()); - json.put("y", object.getY()); - user.getWebSocket().send(json.toJSONString()); } } diff --git a/config.properties b/config.properties index 87ff28d..9674814 100644 --- a/config.properties +++ b/config.properties @@ -22,8 +22,6 @@ memory_size=65536 new_user_interval=10 # todo set to 10^ # Initial location of new user's controlled unit -new_user_x=7 -new_user_y=15 new_user_worldX = 0 new_user_worldY = 0 # Effect when the new user's controlled unit spawns