From 98f4f5b82a9f646b11c7b99a05caa25f3a3f7df9 Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #83 - The Compiler)" Date: Mon, 13 Apr 2026 18:14:29 -0500 Subject: [PATCH] =?UTF-8?q?v1.0.5:=20Fix=20console=20path=20=E2=80=94=20wa?= =?UTF-8?q?s=20never=20fetching=20from=20Discord?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Console /rules hit early return before DIAG logs and before any Discord fetch. Now fetches async like the player path. DIAG logs moved before the player/console branch. Co-Authored-By: Claude Opus 4.6 (1M context) --- ...04-13-rules-still-returning-defaults-v2.md | 18 +++++++++++++ services/rules-mod/1.20.1/build.gradle | 2 +- .../firefrostgaming/rules/RulesCommand.java | 24 +++++++++++++----- services/rules-mod/CHANGELOG.md | 11 ++++++++ .../firefrostrules-1.0.5-1.20.1-forge.jar | Bin 0 -> 15078 bytes 5 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults-v2.md create mode 100644 services/rules-mod/firefrostrules-1.0.5-1.20.1-forge.jar diff --git a/docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults-v2.md b/docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults-v2.md new file mode 100644 index 0000000..a8d6a92 --- /dev/null +++ b/docs/code-bridge/responses/RES-2026-04-13-rules-still-returning-defaults-v2.md @@ -0,0 +1,18 @@ +# Response: DIAG lines missing — console path early exit + +**Re:** Follow-up on REQ-2026-04-13-rules-still-returning-defaults +**Date:** 2026-04-13 + +## Root Cause +The DIAG logs were placed AFTER the console/player branch (line 23). The console path exits on line 18-20 — before DIAG ever runs. + +More importantly: the console path NEVER fetched from Discord. It only returned `RulesCache.getRules()` which is the hardcoded fallback (no fetch has ever populated the cache). + +## Fix in v1.0.5 +1. Moved DIAG logging before the branch — fires on every /rules invocation +2. Console path now triggers `DiscordFetcher.fetchRulesAsync()` just like the player path +3. Console output is sent async after fetch completes + +## Deploy +firefrostrules-1.0.5-1.20.1-forge.jar → Otherworld. +Run /rules from console — should see [DIAG] lines AND a real Discord fetch attempt. diff --git a/services/rules-mod/1.20.1/build.gradle b/services/rules-mod/1.20.1/build.gradle index 86bb720..af2f809 100755 --- a/services/rules-mod/1.20.1/build.gradle +++ b/services/rules-mod/1.20.1/build.gradle @@ -10,7 +10,7 @@ buildscript { apply plugin: 'net.minecraftforge.gradle' -version = '1.0.4' +version = '1.0.5' group = 'com.firefrostgaming.rules' archivesBaseName = 'firefrostrules' diff --git a/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java b/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java index 602c85c..936c7dc 100755 --- a/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java +++ b/services/rules-mod/1.20.1/src/main/java/com/firefrostgaming/rules/RulesCommand.java @@ -15,16 +15,28 @@ public class RulesCommand { public static void register(CommandDispatcher dispatcher) { dispatcher.register(Commands.literal("rules").executes(context -> { CommandSourceStack source = context.getSource(); - if (source.getEntity() == null || !(source.getEntity() instanceof ServerPlayer)) { - source.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); - return 1; - } - ServerPlayer player = (ServerPlayer) source.getEntity(); - LOGGER.info("[DIAG] token length={}, channel={}, messageId={}, isValid={}", + LOGGER.info("[DIAG] /rules invoked. isPlayer={}, token length={}, channel={}, messageId={}, isValid={}", + source.getEntity() instanceof ServerPlayer, ServerRulesConfig.BOT_TOKEN.get().length(), ServerRulesConfig.CHANNEL_ID.get(), ServerRulesConfig.MESSAGE_ID.get(), ServerRulesConfig.isMessageIdValid()); + if (source.getEntity() == null || !(source.getEntity() instanceof ServerPlayer)) { + LOGGER.info("[DIAG] Console path — fetching from Discord"); + DiscordFetcher.fetchRulesAsync().thenAccept(fetchedRules -> { + String rulesText; + if (fetchedRules != null) { + RulesCache.updateCache(fetchedRules); + rulesText = fetchedRules; + } else { + LOGGER.warn("Discord fetch failed. Using fallback rules."); + rulesText = RulesCache.getRules(); + } + source.getServer().execute(() -> source.sendSystemMessage(DiscordFormatter.formatRules(rulesText))); + }); + return 1; + } + ServerPlayer player = (ServerPlayer) source.getEntity(); if (!CooldownManager.checkAndUpdateCooldown(player)) return 0; if (RulesCache.isCacheValid()) { player.sendSystemMessage(DiscordFormatter.formatRules(RulesCache.getRules())); diff --git a/services/rules-mod/CHANGELOG.md b/services/rules-mod/CHANGELOG.md index ba3e048..9c1b33d 100644 --- a/services/rules-mod/CHANGELOG.md +++ b/services/rules-mod/CHANGELOG.md @@ -1,5 +1,16 @@ # Rules Mod Changelog +## [1.0.5] - 2026-04-13 *(diagnostic + fix — 1.20.1 only)* + +### Fixed +- **Console path never fetched from Discord** — `/rules` from server console hit early return that only read from cache/fallback, never triggered `DiscordFetcher`. Console now fetches async like the player path. +- **DIAG logs placed after early exit** — moved `[DIAG]` logging before the player/console branch so it fires on every invocation regardless of source + +### Note +- Only `firefrostrules-1.0.5-1.20.1-forge.jar` was built. Other versions remain at 1.0.3. + +--- + ## [1.0.4] - 2026-04-13 *(diagnostic build — 1.20.1 only)* ### Added diff --git a/services/rules-mod/firefrostrules-1.0.5-1.20.1-forge.jar b/services/rules-mod/firefrostrules-1.0.5-1.20.1-forge.jar new file mode 100644 index 0000000000000000000000000000000000000000..d93d5a07e64fe34e24e38684fb3c1d8b0ab5aef9 GIT binary patch literal 15078 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 wC-Cp7`15c5I|BPlZhy`Dzn_Xffd7ogvp@&Et; literal 0 HcmV?d00001