From 2ad47b27beaf24087dd9ad87e2c4ebe6512b1136 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 17 Feb 2019 13:06:19 -0500 Subject: [PATCH] Rewrite web component --- .../acomputerdog/webchat/net/WebServer.java | 13 +- .../webchat/net/handler/ChatHandler.java | 42 ----- .../webchat/net/handler/SendHandler.java | 4 - .../webchat/net/handler/SimpleHandler.java | 2 +- src/main/resources/main.html | 161 ------------------ src/main/resources/web/css/main.css | 42 +++++ src/main/resources/web/js/chatClient.js | 81 +++++++++ src/main/resources/web/main.html | 19 +++ 8 files changed, 151 insertions(+), 213 deletions(-) delete mode 100644 src/main/java/net/acomputerdog/webchat/net/handler/ChatHandler.java delete mode 100644 src/main/resources/main.html create mode 100644 src/main/resources/web/css/main.css create mode 100644 src/main/resources/web/js/chatClient.js create mode 100644 src/main/resources/web/main.html diff --git a/src/main/java/net/acomputerdog/webchat/net/WebServer.java b/src/main/java/net/acomputerdog/webchat/net/WebServer.java index caaed2c..ef695d4 100644 --- a/src/main/java/net/acomputerdog/webchat/net/WebServer.java +++ b/src/main/java/net/acomputerdog/webchat/net/WebServer.java @@ -2,11 +2,13 @@ import com.sun.net.httpserver.HttpServer; import net.acomputerdog.webchat.PluginWebChat; -import net.acomputerdog.webchat.net.handler.*; +import net.acomputerdog.webchat.net.handler.ChatUpdateHandler; +import net.acomputerdog.webchat.net.handler.ChatVersionHandler; +import net.acomputerdog.webchat.net.handler.SendHandler; +import net.acomputerdog.webchat.net.handler.SimpleHandler; import java.io.IOException; import java.net.InetSocketAddress; -import java.net.URISyntaxException; import java.util.logging.Level; import java.util.logging.Logger; @@ -19,7 +21,7 @@ public class WebServer { private final Logger logger; private final PluginWebChat plugin; - public WebServer(PluginWebChat plugin) throws IOException, URISyntaxException { + public WebServer(PluginWebChat plugin) throws IOException { this.plugin = plugin; this.logger = plugin.getLogger(); //set timeouts. Is either 10 or 100 seconds (unsure do to closed source/undocumented code) @@ -36,10 +38,11 @@ public WebServer(PluginWebChat plugin) throws IOException, URISyntaxException { } }); serverThread.setName("web_server"); - SimpleHandler main = new SimpleHandler(this, "/main.html"); + SimpleHandler main = new SimpleHandler(this, "/web/main.html"); server.createContext("/", main); server.createContext("/main.html", main); - server.createContext("/chat", new ChatHandler(this, plugin)); + server.createContext("/js/chatClient.js", new SimpleHandler(this, "/web/js/chatClient.js")); + server.createContext("/css/main", new SimpleHandler(this, "/web/css/main.css")); server.createContext("/updatechat", new ChatUpdateHandler(this, plugin)); server.createContext("/chatversion", new ChatVersionHandler(this, plugin)); server.createContext("/send", new SendHandler(this, logger, plugin)); diff --git a/src/main/java/net/acomputerdog/webchat/net/handler/ChatHandler.java b/src/main/java/net/acomputerdog/webchat/net/handler/ChatHandler.java deleted file mode 100644 index 24d1c12..0000000 --- a/src/main/java/net/acomputerdog/webchat/net/handler/ChatHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.acomputerdog.webchat.net.handler; - -import com.sun.net.httpserver.HttpExchange; -import net.acomputerdog.webchat.PluginWebChat; -import net.acomputerdog.webchat.chat.ChatList; -import net.acomputerdog.webchat.net.WebServer; - -import java.io.IOException; - -/** - * Outdated endpoint to retrieve entire chat log - * - * TODO why is this still here? - * - * @deprecated Inefficient, use ChatUpdateHandler instead - */ -@Deprecated -public class ChatHandler extends WebHandler { - private final PluginWebChat plugin; - private String page = null; - private int lastVersion = -1; - - public ChatHandler(WebServer server, PluginWebChat plugin) { - super(server); - this.plugin = plugin; - } - - @Override - public void handleExchange(HttpExchange exchange) throws IOException { - if (!exchange.getRequestMethod().equals("GET")) { - sendResponse(exchange, "405 Method not allowed: only GET is accepted.", 405); - return; - } - ChatList chat = plugin.getChatList(); - int version = chat.getVersion(); - if (page == null || lastVersion != version) { //only rebuild if page changes - lastVersion = chat.getVersion(); - page = chat.toString(); - } - sendResponse(exchange, page); - } -} diff --git a/src/main/java/net/acomputerdog/webchat/net/handler/SendHandler.java b/src/main/java/net/acomputerdog/webchat/net/handler/SendHandler.java index ea0c49f..c80ad9f 100644 --- a/src/main/java/net/acomputerdog/webchat/net/handler/SendHandler.java +++ b/src/main/java/net/acomputerdog/webchat/net/handler/SendHandler.java @@ -45,10 +45,6 @@ public void handleExchange(HttpExchange exchange) throws IOException { sendResponse(exchange, "

405 Method not allowed: only POST is accepted.

", 405); return; } - if (!"application/x-www-form-urlencoded".equals(exchange.getRequestHeaders().get("Content-Type").get(0))) { - sendResponse(exchange, "

406 Not acceptable: wrong Content-Type.

", 406); - return; - } if (!checkAndUpdateTimeout(exchange.getRemoteAddress())) { sendResponse(exchange, "

429 Too many requests: please wait to send multiple messages.

", 429); return; diff --git a/src/main/java/net/acomputerdog/webchat/net/handler/SimpleHandler.java b/src/main/java/net/acomputerdog/webchat/net/handler/SimpleHandler.java index 3ad770f..a549704 100644 --- a/src/main/java/net/acomputerdog/webchat/net/handler/SimpleHandler.java +++ b/src/main/java/net/acomputerdog/webchat/net/handler/SimpleHandler.java @@ -10,7 +10,7 @@ import java.util.stream.Collectors; /** - * API endpoint that returns a hard-coded string reponse + * API endpoint that returns a hard-coded string response */ public class SimpleHandler extends WebHandler { private final String page; diff --git a/src/main/resources/main.html b/src/main/resources/main.html deleted file mode 100644 index c47777f..0000000 --- a/src/main/resources/main.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - WebChat - - - - - - - - - -
- - - - - -
- - - - - -
-
-
- -
- - \ No newline at end of file diff --git a/src/main/resources/web/css/main.css b/src/main/resources/web/css/main.css new file mode 100644 index 0000000..d3b919d --- /dev/null +++ b/src/main/resources/web/css/main.css @@ -0,0 +1,42 @@ +body { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + + padding: 10px; + margin: 0; + + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +#sendContainer { + display: flex; + flex-direction: row; + justify-content: stretch; + align-items: flex-start; + + padding: 0; + margin: 10px 0 0; + +} + +#sendText { + flex-grow: 1; + flex-shrink: 1; +} + +#sendButton { + margin-left: 10px; +} + +#chatbox { + flex-grow: 1; + flex-shrink: 1; + + resize: none; +} \ No newline at end of file diff --git a/src/main/resources/web/js/chatClient.js b/src/main/resources/web/js/chatClient.js new file mode 100644 index 0000000..c795605 --- /dev/null +++ b/src/main/resources/web/js/chatClient.js @@ -0,0 +1,81 @@ +const DEFAULT_TIMEOUT = 500; +const MAX_TIMEOUT = 5000; +const TIMEOUT_INCREASE = 100; + +let chatTimer; +let version = 0; +let timeout = DEFAULT_TIMEOUT; + +function sendChat() { + let sendBox = document.getElementById("sendText"); + if (sendBox) { + let http = new XMLHttpRequest(); + http.open("POST", "send", true); + http.send("message=" + sendBox.value); + + sendBox.value = ""; + + clearTimeout(chatTimer); + timeout = DEFAULT_TIMEOUT; + setTimeout(refreshChat, timeout); + } +} + +function updateChat(response) { + let chatbox = document.getElementById("chatbox"); + if (chatbox) { + chatbox.value = response; + } +} + +function refreshChat() { + let http = new XMLHttpRequest(); + http.onreadystatechange = function () { + if (http.readyState === 4) { + if (http.status === 200) { + timeout = DEFAULT_TIMEOUT; + updateChat(http.responseText); + refreshVersion(); + } else if (timeout < MAX_TIMEOUT) { + timeout += TIMEOUT_INCREASE; + } + //set timeout for next chat query + chatTimer = window.setTimeout(refreshChat, timeout); + } + }; + http.open("GET", "updatechat" + "?version=" + version, true); // true for asynchronous + http.send(); +} + +function refreshVersion() { + let http = new XMLHttpRequest(); + http.onreadystatechange = function () { + if (http.readyState === 4 && http.status === 200) { + version = http.responseText; + } + }; + http.open("GET", "chatversion", true); + http.send(); +} + +function onPost() { + setTimeout(function () { + let messageBox = document.getElementById("message"); + if (messageBox) { + messageBox.value = ""; + } + }, 100); + clearTimeout(chatTimer); + timeout = DEFAULT_TIMEOUT; + setTimeout(refreshChat, 100); + return true; +} + +function onSendKey(key) { + if (key === 13) { + sendChat() + } +} + +//start everything going +refreshChat(); \ No newline at end of file diff --git a/src/main/resources/web/main.html b/src/main/resources/web/main.html new file mode 100644 index 0000000..cb32a7e --- /dev/null +++ b/src/main/resources/web/main.html @@ -0,0 +1,19 @@ + + + + + + WebChat + + + + + +
+ + +
+ + + + \ No newline at end of file