From 3995fdd1beeae324d5329c08a369ae9f6a66c72b Mon Sep 17 00:00:00 2001 From: Hao Teng Date: Sat, 27 Dec 2025 01:00:29 -0500 Subject: [PATCH 1/2] Enhance ConvexResponseParser with improved error handling and logging - Added checks for null or empty response bodies in parseObject and parseArray methods, returning appropriate error messages. - Implemented handling for HTML responses to identify potential error pages, logging warnings for better debugging. - Enhanced logging of response bodies in case of parsing errors, truncating long responses for safety. --- .../beacon/util/ConvexResponseParser.java | 36 +++++++++++++++++++ .../events/PlayerEventListener.java | 6 ++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java index f2eb2d0..4244e21 100644 --- a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java +++ b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java @@ -113,6 +113,19 @@ public static ArrayResult error(String error) { * @return ObjectResult containing the parsed data or error */ public static ObjectResult parseObject(String responseBody, String context) { + // Handle null or empty response + if (responseBody == null || responseBody.trim().isEmpty()) { + LOGGER.warning(context + " - Response body is empty or null"); + return ObjectResult.error("Empty response from server"); + } + + // Check for HTML responses (common error pages) + String trimmed = responseBody.trim(); + if (trimmed.startsWith("<") || trimmed.startsWith(" 200 + ? responseBody.substring(0, 200) + "..." + : responseBody; + LOGGER.warning(context + " - Response body: " + preview); return ObjectResult.error(error); } } @@ -163,6 +181,19 @@ public static ObjectResult parseObject(String responseBody, String context) { * @return ArrayResult containing the parsed array or error */ public static ArrayResult parseArray(String responseBody, String context) { + // Handle null or empty response + if (responseBody == null || responseBody.trim().isEmpty()) { + LOGGER.warning(context + " - Response body is empty or null"); + return ArrayResult.error("Empty response from server"); + } + + // Check for HTML responses (common error pages) + String trimmed = responseBody.trim(); + if (trimmed.startsWith("<") || trimmed.startsWith(" 200 + ? responseBody.substring(0, 200) + "..." + : responseBody; + LOGGER.warning(context + " - Response body: " + preview); return ArrayResult.error(error); } } diff --git a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java index 448858e..cdba3f8 100644 --- a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java +++ b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java @@ -210,11 +210,9 @@ private void clearPlayerToken(Plugin plugin, String playerId, String matchId) { JSONObject data = result.optJSONObject("data"); if (data != null && data.optBoolean("success", false)) { LOGGER.info("Cleared token for player " + playerId + " in match " + matchId); - } else { - // Token not cleared (likely match not in "Waiting" status) - this is expected - String error = data != null ? data.optString("error", "") : ""; - LOGGER.info("Token not cleared for player " + playerId + ": " + error); } + // If token wasn't cleared, it's expected (match not in "Waiting" status) + // No need to log - this is normal for finished/playing matches } } else { LOGGER.warning("Failed to clear token: HTTP " + responseCode); From 1f0c778709d50855b1e098afe834914793a85349 Mon Sep 17 00:00:00 2001 From: Hao Teng Date: Sat, 27 Dec 2025 01:04:58 -0500 Subject: [PATCH 2/2] Add flat world generator settings to CreateMatchCommand - Specified generator settings for flat worlds to prevent "No key layers" warning. - Updated comments for clarity on the format of the generator settings. --- .../ai/blockwarriors/commands/debug/CreateMatchCommand.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java index 39760df..3bc7416 100644 --- a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java +++ b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java @@ -34,6 +34,9 @@ public static String createMatch(Player player1, Player player2) { WorldCreator creator = new WorldCreator(worldName); creator.type(WorldType.FLAT); creator.generateStructures(false); // No structures like villages + // Specify flat world generator settings to avoid "No key layers" warning + // Format: minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;minecraft:plains + creator.generatorSettings("{\"layers\":[{\"block\":\"minecraft:bedrock\",\"height\":1},{\"block\":\"minecraft:stone\",\"height\":2},{\"block\":\"minecraft:grass_block\",\"height\":1}],\"biome\":\"minecraft:plains\"}"); World world = creator.createWorld();