diff --git a/mod/build.gradle b/mod/build.gradle index 9148150..d11c99a 100644 --- a/mod/build.gradle +++ b/mod/build.gradle @@ -89,6 +89,12 @@ neoForge { sourceSet(sourceSets.main) } } + tasks.named('processResources', ProcessResources) { + from ('../website') { + + into 'assets/livechat/web' + } + } } // Include resources generated by data generators. diff --git a/mod/gradle.properties b/mod/gradle.properties index 0d0be3e..7e7cfa3 100644 --- a/mod/gradle.properties +++ b/mod/gradle.properties @@ -29,7 +29,7 @@ mod_name=LiveChat # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=GNU AGPL 3.0 # The mod version. See https://semver.org/ -mod_version=1.0 +mod_version=1.1 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/mod/src/main/java/dev/kubabin/livechat/Livechat.java b/mod/src/main/java/dev/kubabin/livechat/Livechat.java index f46a940..3f73fe5 100644 --- a/mod/src/main/java/dev/kubabin/livechat/Livechat.java +++ b/mod/src/main/java/dev/kubabin/livechat/Livechat.java @@ -14,6 +14,7 @@ import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; import org.slf4j.Logger; +import java.io.InputStream; import java.time.Clock; import java.util.ArrayDeque; @@ -56,6 +57,29 @@ public void onServerStarting(ServerStartingEvent event) { exchange.getResponseBody().write(response.getBytes()); exchange.close(); }); + httpServer.createContext("/api/chat", exchange -> { + String response = gson.toJson(messageQueue); + exchange.getResponseHeaders().add("Content-Type", "application/json"); + exchange.sendResponseHeaders(200, response.getBytes().length); + exchange.getResponseBody().write(response.getBytes()); + exchange.close(); + }); + // Serve other static files if needed + httpServer.createContext("/", exchange -> { + String path = exchange.getRequestURI().getPath(); + InputStream is = Livechat.class.getResourceAsStream("/assets/livechat/web" + path); + LOGGER.info("Serving static file: {}", path); + if (is == null) { + exchange.sendResponseHeaders(404, -1); + exchange.close(); + return; + } + byte[] response = is.readAllBytes(); + //exchange.getResponseHeaders().add("Content-Type", "text/plain"); + exchange.sendResponseHeaders(200, response.length); + exchange.getResponseBody().write(response); + exchange.close(); + }); httpServer.start(); LOGGER.info("Server socket started on port {}", Config.socketPort); } catch (Exception e) { diff --git a/server.py b/server.py index c658618..32a6924 100644 --- a/server.py +++ b/server.py @@ -255,6 +255,34 @@ def serve_analytics_proxy(self, site, table_name): except (BrokenPipeError, ConnectionResetError): return + def serve_analytics_proxy(self, table_name): + try: + req = urllib.request.Request( + f"https://raspi.kubabin.dev/api/{table_name}", + headers={"User-Agent": "Mozilla/5.0"}, + ) + with urllib.request.urlopen(req, timeout=15) as response: + body = response.read() + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Access-Control-Allow-Origin", "*") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + except (BrokenPipeError, ConnectionResetError): + return + except Exception as exc: + error_body = str(exc).encode("utf-8") + try: + self.send_response(502) + self.send_header("Content-Type", "text/plain; charset=utf-8") + self.send_header("Access-Control-Allow-Origin", "*") + self.send_header("Content-Length", str(len(error_body))) + self.end_headers() + self.wfile.write(error_body) + except (BrokenPipeError, ConnectionResetError): + return + print(f"Serving s1 from: {SITES['s1']['dir']}") print(f"Serving s2 from: {SITES['s2']['dir']}")