π€ Discord
Discord module connects Voidium to your Discord server: whitelist/linking, chat bridge, console streaming, status/topic updates and tickets.
GUILD_MEMBERS and MESSAGE_CONTENT.
Jump to
β Setup
You need:
- A Discord bot (Developer Portal) invited to your guild
- Enabled intents:
GUILD_MEMBERSandMESSAGE_CONTENT - Channels (recommended): chat, link, console, status, plus a ticket category
Minimal first-run checklist:
- Edit
config/voidium/discord.json - Set
enableDiscord: true,botToken,guildId - Configure channel IDs:
chatChannelId(required for chat bridge)linkChannelId(recommended; see note below)
- Restart the server (for token changes), or try
/voidium reloadfor small edits
MESSAGE_CONTENT intent enabled so the bot can read Discord messages for the chat bridge.
βοΈ Configuration
Voidium uses two Discord-related config files:
config/voidium/discord.json(bot, channels, whitelist, chat bridge, status/topic, ban sync)config/voidium/tickets.json(ticket system)
discord.json (key fields)
Basics
enableDiscord,botToken,guildId
Channels
chatChannelIdβ Discord β MC chat bridge channelconsoleChannelIdβ console log streaming targetlinkChannelIdβ channel where users can paste verification codes (messages are deleted)statusChannelIdβ status messages; if empty, Voidium useschatChannelId
Whitelist & linking
enableWhitelistkickMessage,verificationHintMessagelinkSuccessMessage,alreadyLinkedMessage,maxAccountsPerDiscord
Chat bridge
enableChatBridgeminecraftToDiscordFormat,discordToMinecraftFormatchatWebhookUrl(optional; MC β Discord webhook with skin avatar)
:aliases: for Voidium client rendering. The translateEmojis toggle is currently only used for ticket-message forwarding (and may have limited effect depending on mappings).
Status / topic
enableStatusMessages+ status text fieldsenableTopicUpdate,channelTopicFormat,uptimeFormat
Ban sync
syncBansDiscordToMc,syncBansMcToDiscord- Ban sync uses Mixin injection (
UserBanListMixin) for automatic detection β no polling
Bot responses
invalidCodeMessage,notLinkedMessagealreadyLinkedSingleMessage(%uuid%),alreadyLinkedMultipleMessage(%count%)unlinkSuccessMessage,wrongGuildMessageticketCreatedMessage,ticketClosingMessage,textChannelOnlyMessage
Roles & prefixes
linkedRoleIdβ role assigned after successful linking (link-channel flow)rolePrefixes+useHexColors
tickets.json (TicketConfig)
File: config/voidium/tickets.json
enableTicketsticketCategoryId,supportRoleIdticketChannelTopic(placeholders:%user%,%reason%)maxTicketsPerUser- Messages:
ticketCreatedMessage,ticketWelcomeMessage,ticketCloseMessage,noPermissionMessage,ticketLimitReachedMessage,ticketAlreadyClosedMessage - Transcript:
enableTranscript,transcriptFormat(TXT/JSON),transcriptFilename(supports%user%,%date%,%reason%) - In-game messages (color codes via
&):mcBotNotConnectedMessage,mcGuildNotFoundMessage,mcCategoryNotFoundMessage,mcTicketCreatedMessage,mcDiscordNotFoundMessage
π Whitelist & Linking
In-game (whitelist flow)
When whitelist is enabled and a player is not linked:
- The player joins and is frozen in place (not kicked).
- They receive a 6-digit code in chat (
kickMessage+verificationHintMessage). - The code expires after 10 minutes.
- After linking, the player is unfrozen.
On Discord
- Slash commands:
/link code:<code>/unlink
- Link channel:
- User posts the code into
linkChannelId - Bot deletes the message and replies (auto-deletes the reply after a few seconds)
- Optional: assigns
linkedRoleId
- User posts the code into
Data is stored in config/voidium/storage/links.json.
π¬ Chat bridge
MC β Discord
- Triggered by normal chat +
/say - Sent into
chatChannelId - Uses
minecraftToDiscordFormat - If
chatWebhookUrlis set, messages are sent via webhook (skin-based avatar)
Discord β MC
- Messages from
chatChannelIdare forwarded into Minecraft when chat bridge is enabled - Basic Markdown is converted to MC formatting (bold/italic/underline/strike)
- Some Unicode emoji are converted to
:aliases:for Voidium client rendering
Join / leave / death
When chat bridge is enabled, join/leave/death events are posted to Discord as colored embeds with the playerβs skin thumbnail:
- Join β green embed
- Leave β red embed
- Death β gray embed
π« Tickets
Discord slash commands
/ticket create reason:<reason>/ticket close
Ticket creation is rate-limited (global cooldown ~60 seconds) to avoid Discord 429 errors.
In-game
/ticket <reason> <message...>/reply <message...>
See the full command reference here: Commands.
Transcripts
If transcripts are enabled:
- Voidium fetches up to the last ~100 messages
- Uploads a TXT/JSON transcript file into the ticket channel
- Then deletes the channel a few seconds after closing
π§― Troubleshooting
Bot wonβt start
- Verify
botTokenandguildId - Check that the intents are enabled in Developer Portal
Discord β MC messages do not arrive
- Ensure
enableDiscordandenableChatBridgeare true - Check
chatChannelId - Ensure
MESSAGE_CONTENTintent is enabled
Linking doesnβt work
- Code is valid for ~10 minutes
- Check
linkChannelIdpermissions (send + delete)
Ticket not created
- Check
ticketCategoryIdand bot permissions - Remember the global ~60s cooldown between ticket creations