The architecture decision
The game server dials out to the bot. The bot listens and never initiates. One WebSocket connection, authenticated on the upgrade, carrying a small typed envelope in both directions.
The alternative is a game server that accepts inbound connections, which means a port to open, an attack surface to defend and a firewall rule to get wrong. Making the connection outbound removes all three at once, and it means a restart on either side heals itself instead of needing intervention.
What it does
16 commands and 12 features spanning both sides: in-game events surface in Discord, and Discord actions reach into the game. It runs in a real community with real players, which is a different quality bar from a bot in a test server.
Tested, because it talks to production
194 tests. Anything that can write to a live game server on behalf of a chat message needs to be wrong in a controlled environment first, and a bot is unusually easy to test badly: the happy path is trivial and every interesting case is a disconnect, a restart or a malformed message.

