Discord Bot
The Zander Discord bot ships as part of the same system that runs your website and dashboard, so everything stays in sync automatically. It gives your community easy-to-use slash commands (the /command options you see when you type / in Discord) for everyday tasks, and gives your staff powerful moderation and management tools - all without leaving Discord.
📸 Screenshot: The Discord bot responding to a /play command, showing an embed with available network servers
One System, Kept in Sync
The Discord bot and the website aren't two separate things bolted together - they share the same underlying data and logic. That means whatever happens on one side is reflected on the other, automatically. New commands and behaviors are picked up without any extra setup work on your part. A few concrete examples of what this means in practice:
- The profile picture shown on a player's website profile is the exact same one the
/profilecommand shows in Discord - update it once, and it's correct everywhere. - If a player's Discord nickname doesn't match their linked Minecraft username, Zander catches that both when their Discord profile changes and right after they link their account on the website - so mismatches don't slip through either path.
- Linking a Discord account can also update related Discord settings (like ticket-channel access) right away, since the bot and website can act on the same Discord connection.
Community Commands
These commands are available to all members of the Discord server (no permission check):
| Command | Options | Description |
|---|---|---|
/apply | - | Shows information about open staff and player applications |
/play | - | Lists all available network servers to join |
/ranks | - | Links to the rank perks and donation page |
/rules | - | Posts a link to the server rules |
/policy | - | Displays links to all four server policies (Rules, Terms, Privacy, Refund) |
/poll <question> | question (required) | Creates a community poll with ⬆️/⬇️ reactions |
/vault | - | Links to the resource and map vault |
/watch | - | Links to the community Watch page for streams and videos |
/website | - | Posts a link to the network website |
/shopdirectory <material> [type] | material (required), type (buying/selling) | Browse in-game shop listings by item type |
/profile | username, discord_user, or discord_tag (at least one) | Shows a player's linked profile with stats and join date |
/report <user> <reason> | Both required | Report a Discord member to staff |
/staffhelp <query> | query (required) | Send a direct message to staff for help or assistance |
/support | - | Ticket creation/management (create, submit, panel setup, add participant) |
Most community commands respond only to the user who ran them (ephemeral), keeping channels tidy.
Staff Commands
Staff commands don't check Discord roles directly. Instead, the bot looks up the Discord user's linked website account and checks the same staff permissions the dashboard uses. This means a Discord user won't be able to run staff commands unless their Discord account is linked to a website account that has the right permission - having a matching Discord server role isn't enough on its own.
📸 Screenshot: A staff member using /punish to issue a warning, with the punishment embed showing in the channel
Punishments (/punish)
| Subcommand | Options | Permission | Description |
|---|---|---|---|
warn <user> <reason> | evidence, silent (optional) | zander.discord.punish.warn | Issue a formal warning |
kick <user> <reason> | evidence, silent (optional) | zander.discord.punish.kick | Kick from the guild |
ban <user> <reason> | evidence, silent (optional) | zander.discord.punish.ban | Permanent ban |
tempban <user> <reason> <duration> | evidence, silent (optional) | zander.discord.punish.ban | Temporary ban |
mute <user> <reason> | evidence, silent (optional) | zander.discord.punish.mute | Permanent mute (chat + voice) |
tempmute <user> <reason> <duration> | evidence, silent (optional) | zander.discord.punish.mute | Temporary mute |
unban <user> <reason> | - | zander.discord.punish.ban | Lift an active ban |
unmute <user> <reason> | - | zander.discord.punish.mute | Lift an active mute |
history | user, username, or discord_tag (at least one) | zander.discord.punish.history | View cross-platform punishment history |
Duration format: <number><unit> - e.g. 1h (1 hour), 7d (7 days), 2w (2 weeks).
Profile / Identity
| Command | Permission | Description |
|---|---|---|
/forcelink | zander.discord.forcelink | Force-links a Discord user to a Minecraft account |
/nicknamecheck | zander.web.nicknamecheck | Manually scan for members whose Discord nickname doesn't match their Minecraft username |
Management & Auditing
| Command | Permission | Description |
|---|---|---|
/audit | zander.web.audit | View a linked user's activity across all platforms |
/lp-audit [scope] [export] | zander.discord.lpaudit | Read-only audit comparing LuckPerms groups to Discord roles |
/staff-audit-report | zander.web.audit | Manually trigger the staff activity audit report |
Bridge (/bridge)
Requires zander.web.bridge. Used to interact with the cross-server command bridge executor.
| Subcommand | Description |
|---|---|
status [status] [slug] [limit] [claim] | View the executor task queue |
add <command> <slug> | Queue a command for execution on a server |
routine <slug> | Trigger a saved multi-step routine |
report <taskid> <status> | Report task execution results |
reset <taskid> | Reset a task back to pending |
clear [filters] | Remove tasks from the queue |
Support Ticket Commands (/ticket)
The /ticket command manages support tickets from within Discord:
| Subcommand | Who Can Use | Description |
|---|---|---|
create | Anyone | Opens the ticket creation flow |
submit | Anyone | Submits a new ticket |
panel [channel] [category] | Staff (ManageChannels) | Posts a "Create Ticket" button in a channel |
add <user|role> | Staff (zander.web.tickets.manageparticipants) | Adds a participant to the current ticket |
remove <user|role> | Staff | Removes a participant from the current ticket |
status <status> | Staff or category staff role | Updates ticket status |
close | Staff or ticket owner | Closes the ticket |
manual <user> <subject> <description> | Staff (ManageChannels) | Opens a ticket on behalf of a user |
📸 Screenshot: A Discord ticket channel with the ticket info embed, status, and staff reply
Event Listeners
The bot automatically reacts to things happening in your Discord server - messages, member joins, role changes, and more - listed below:
| Listener | Event | What It Does |
|---|---|---|
ready | client ready | Startup logging/init |
message, filter, generalKenobi, special-may4th, ipDetection | messageCreate | Chat filtering, Easter-egg replies, IP-sharing detection |
messageUpdate | messageUpdate | Logs edited messages to the audit channel |
messageDelete | messageDelete | Logs deleted messages to the audit channel |
guildMemberAdd | Member joins | Triggers welcome message and verification flow |
guildMemberRemove | Member leaves | Logs departure |
guildMemberUpdate, guildMemberBoostUpdate, nicknameCheck | Member profile changes | Detects role/boost changes; nickname enforcement (also triggered directly right after a Discord account link on the website) |
guildBanAdd | Member banned | Syncs Discord bans into the punishments system |
voiceStateUpdate | Voice channel change | Tracks voice channel activity |
supportTicketInteractions | Button/select interactions | Handles ticket creation button clicks |
supportTicketMessage | Message in ticket channel | Relays replies and notes to the ticket system |
chatInputCommandError | Command error | Central error handler for failed slash commands |
Automated Tasks (Cron)
Background jobs run on a schedule to keep your network running smoothly:
| Job | Schedule | Description |
|---|---|---|
announcementExpiryCron | Periodic | Disables announcements past their end date |
bridgeCleanupCron | Periodic | Purges completed or stale bridge executor tasks |
cakeDayUserCheck | Daily | Celebrates user account anniversaries |
eventAnnouncementCron | Every minute | Sends scheduled event announcements to Discord |
eventTemplateCron | Hourly | Auto-generates event drafts from active templates |
nicknameCheckCron | Periodic | Scans all linked members for nickname mismatches |
punishmentExpiryCron | Periodic | Lifts punishments that have reached their expiry date |
schedulerCron | Periodic | Delivers scheduled Discord messages |
staffAuditReportCron | Weekly (configurable) | Generates and posts the staff activity audit report |
unverifiedReminderCron | Periodic | Sends reminders to unverified guild members |
userCodeExpiryCron | Periodic | Expires unused Discord linking verification codes |
voteMonthlyRewardCron | 1st of each month at 00:05 UTC | Processes monthly vote rewards |
watchTwitchCron | Periodic | Polls Twitch for new creator streams |
watchYoutubeCron | Periodic | Polls YouTube for new creator videos |