GatehouseMC 1.1.0 (forge, Minecraft 1.20.1)
Curse Maven Snippet
What's new
Changelog
All notable changes to GatehouseMC will be documented in this file.
1.1.0 — Native NeoForge and Forge support, multi-loader foundation, and cross-platform hardening
- Added native NeoForge (1.21.1) and Forge (1.20.1) support without requiring Sinytra Connector.
- Added a loader-neutral runtime core shared across Fabric, NeoForge, and Forge.
- Ported the online-mode join crash fix (
GameProfileIdentity.toDomain()non-validating factory and user profile caching) to NeoForge and Forge. - Integrated hardened Discord outbox delivery diagnostics and retry log noise reduction across all loaders.
- Added source-build and clean-server proof targets for Fabric 1.21.1, Forge 1.20.1, and NeoForge 1.21.1.
- Older Fabric downloads remain historical 1.0.1 artifacts until their per-version source builds and live-server gates are restored.
1.0.3 — Discord outbox diagnostics, retry log noise reduction, and online-mode join fix
Fixed
- Hardened Discord channel resolution in
JdaDiscordTransportwith REST fallback (Route.Channels.GET_CHANNEL) when local JDA cache misses. - Supported both standard text channels (
TextChannel) and announcement channels (NewsChannel) viaStandardGuildMessageChannel. - Replaced bare
IllegalStateException("Discord channel is unavailable")with distinct, actionable diagnostic errors distinguishing: bot not in guild, channel not found in guild, unsupported channel type, and missing bot permissions (VIEW_CHANNEL/SEND_MESSAGES). - Added proactive startup reachability and permissions validation on JDA
ReadyEventinDiscordApprovalInterfaceto alert operators at boot time. - Reduced outbox worker log noise on repeated retry failures: logged full
WARNwith failure details on the first attempt (and on cause change or 10-attempt threshold), and downgraded intermediate retries with identical cause toDEBUG. - Verified outbox events never mark complete on failure and recover cleanly when destination is restored.
- Fixed unhandled
IllegalArgumentExceptioninGameProfileIdentity.toDomain()on servers withonline-mode=true, where the connecting player's real Mojang UUID doesn't match the offline-derived UUID thatPlayerIdentity's strict factory required (#57). Whitelist denials now always create a pending request instead of crashing the join path. FabricVanillaWhitelistAdapternow also resolves the server's cached authentic Mojang profile (UserCache) when checking/removing whitelist entries on an online-mode server, andGatehouseModregisters the connecting profile with that cache on denial — so an approved player's real online-mode UUID is recognized correctly on reconnect, not just the offline-derived one.
1.0.2 — Discord and release-gate fixes
Fixed
- Nested the complete pinned JDA runtime dependency set in the distributable jar; a clean dedicated server no longer fails during Discord startup with missing OkHttp classes.
- Kept Discord
STARTINGuntil JDA emitsReadyEvent, so the persistent outbox does not publish during gateway startup and trigger avoidable backoff. - Reused the persisted Discord publication destination when editing a resolved request.
- Declared the E2E harness's pinned
rcon-clientdependency. - Hardened CI to boot a clean Minecraft 1.21.1 Fabric server before running the offline rejection smoke test and to archive its log.
Scope and verification
- This release targets Minecraft 1.21.1, Fabric, and Java 21. Other Minecraft version branches are separate artifacts and are not covered by this jar.
- The live test uses a private test guild containing only the test user and Gatehouse MC Test. Discord direct-message delivery remains subject to Discord's mutual-guild/privacy policy and is not used as the release-gate transport.
1.0.1 — Compatibility and release integrity
- Fixed legacy Fabric startup by bundling the SLF4J API required by older servers and aligned all artifact metadata with the actual Java bytecode.
- Verified clean standalone Fabric server boot for every supported target from Minecraft 1.14.4 through 1.21.4.
- Release publishing now uses target-specific tags and validates the internal
fabric.mod.jsonMinecraft and Java metadata before uploading.
1.0.0 — Initial Release
GatehouseMC Brand & Identity
- Rebranded official mod name to GatehouseMC (mod ID
gatehousemc). - Introduced custom pixel art brand identity: gatehouse tower banner and iron door approval logo.
- Bundled 256×256 mod icon inside the distribution jar (
assets/gatehousemc/icon.png). - Added automatic configuration migration: existing servers running
config/whitelistrequest/automatically migrate files toconfig/gatehousemc/on first startup.
Core Workflow
- Durable SQLite-backed whitelist request workflow with automatic request creation on vanilla whitelist rejection.
- One deduplicated pending request per normalized username; repeat attempts increment attempt counters and refresh last-attempt timestamps.
- Case-variant usernames share a normalized workflow key without replacing the original exact profile.
- Blocked identities create no new requests; denial cooldown is durable.
- Lifecycle states:
PENDING,RESOLVING,APPROVED,DENIED,BLOCKEDwith enforced legal transitions and timestamp ordering. - Crash-aware approval:
PENDING->RESOLVING-> vanilla whitelist mutation ->APPROVED, with automatic startup recovery for interrupted approvals. - Compare-and-set decision semantics ensure exactly one winner for concurrent approve/deny/block decisions across interfaces.
Fabric Integration
- Exact Mixin hook on
PlayerManager#checkCanJoinreturn value, verified against Minecraft 1.21.1 mappings. - Exact denial matching: only
multiplayer.disconnect.not_whitelistedrejections create requests; bans, IP bans, full server, and other rejections pass through untouched. - Vanilla
Whitelist.add(new WhitelistEntry(profile))remains the authoritative mutation path. - Non-blocking architecture: all SQLite and bot operations run off the Minecraft server thread; only whitelist mutations run on the server thread.
- Player-facing rejection messages clearly distinguish first request, pending, denied, blocked, and degraded states.
- Internationalization (i18n): full localization support with English (
en_us) and Romanian (ro_ro) language bundles.
In-Game Commands
- Primary command tree:
/gatehousewith backward-compatible aliases/ghand/wlreq. - Actions supported:
list,show,approve,deny,block,unblock,undo,status,reload. /gatehouse undo <player>allows admins to instantly reopen requests and revert approvals (removing from whitelist) or denys/blocks.- All database queries dispatched asynchronously off the server thread; feedback rendered safely on the server thread.
- Permission-gated (default permission level 3); degraded-mode safety checks prevent NPEs.
Provider Integrations
- Discord: Discord bot integration via JDA with interactive Approve, Deny, and Block button components.
- Telegram: Telegram bot integration via standard Java 21
HttpClientwith inline keyboard callbacks. - Access control based on verified administrator user/role IDs (Discord) and user/chat IDs (Telegram).
- Routing modes:
PRIMARY_FALLBACK(default),FANOUT, andFIRST_SUCCESS. STARTINGproviders skipped until healthy; provider failure never corrupts request business state.- Fake transport test suites for both providers allowing full CI test coverage without live tokens.
Reliability & Outbox
- Persistent transactional outbox with exclusive claim semantics, exponential retry, and uncommitted processing recovery on restart.
- Request creation and outbox event insertion are atomic in SQLite.
- External bot outages never drop or lose player whitelist requests.
- Live
/gatehouse reloadsupports updating bot credentials and settings without server restarts.
Build & Packaging
- Fabric Loader 0.19.5, Fabric API 0.116.17+1.21.1, Loom 1.17.20, Java 21 target.
- Production jar (
gatehousemc-1.0.0.jar) nests SQLite JDBC and JDA dependencies for plug-and-play server installation. - Automated CI and release pipeline supporting GitHub Releases, Modrinth, and CurseForge publishing.
This mod has no additional files
