Discord Bot
The Zander Discord bot is built into zander-web and runs alongside the API and web dashboard. It gives your community intuitive slash commands for everyday tasks and provides your staff with 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
Community Commands
These commands are available to all members of the Discord server:
| 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 |
Most community commands respond only to the user who ran them (ephemeral), keeping channels tidy.
Staff Commands
Staff commands require the caller to have a linked Minecraft account with the appropriate LuckPerms permission node.
📸 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).
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 |
/nicknamecheck | zander.web.nicknamecheck | Manually scan for members whose Discord nickname doesn't match their Minecraft username |
/staff-audit-report | zander.web.audit | Manually trigger the staff activity audit report |
Bridge (/bridge)
Requires zander.web.bridge. Used to interact with the 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 | 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 listens to the following Discord gateway events:
| Listener | Event | What It Does |
|---|---|---|
guildMemberAdd | Member joins | Triggers welcome message and verification flow |
guildMemberRemove | Member leaves | Logs departure |
guildMemberUpdate | Member profile changes | Detects role and nickname changes |
guildMemberBoostUpdate | Boost changes | Acknowledges new server boosts |
guildBanAdd | Member banned | Logs Discord bans |
message | New message | Routes to content filter and audit logging |
messageDelete | Message deleted | Logs deleted messages to the audit channel |
messageUpdate | Message edited | Logs edited messages to the audit channel |
filter | New message | Runs phrase and link filtering; notifies staff if content is flagged |
nicknameCheck | Member update | Validates nickname matches linked Minecraft username |
ipDetection | Member joins | Checks for suspicious join patterns |
voiceStateUpdate | Voice channel change | Tracks voice channel activity |
supportTicketInteractions | Button/select interactions | Handles ticket creation button clicks |
supportTicketMessage | Message in ticket channel | Routes replies and notes to the ticket system |
chatInputCommandError | Command error | Global slash command error handler |
ready | Bot starts | Initialises bot state and logs startup |
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 |