Skip to main content

Scheduler

The Scheduler lets staff queue a Discord embed message to post automatically to a chosen channel at a future date and time, instead of someone needing to be online to send it manually. It's built for planned announcements - events, maintenance windows, and the like - that need to go out on schedule. This is an admin-only tool; there is no player-facing surface.

note

📸 Screenshot: The scheduler dashboard showing a list of pending scheduled messages alongside available Discord channels


For Staff​

The Scheduler lives at Dashboard → Scheduler (requires zander.web.scheduler, and rides on the Discord feature flag).

note

📸 Screenshot: The create scheduled message form with channel selector, date/time picker, and embed preview

Scheduling a Message​

FieldDescription
ChannelTarget text or announcement channel, pulled live from the Discord guild
Scheduled ForDate/time the message should post (adjusted for your browser's timezone) - must be in the future
Embed TitleTitle of the Discord embed
Embed DescriptionBody text of the embed
Embed ColorAccent color of the embed

Pending scheduled messages can be deleted before they go out. The same dashboard page also surfaces the existing Announcements list for context, though announcement management itself is a separate module.


Delivery​

You don't need to have the dashboard open for a message to go out - delivery happens automatically in the background. Every minute, Zander checks whether any scheduled messages are due, sends them to Discord through the bot (with a footer crediting the staff member who created it), and marks each one as sent or failed. This keeps running around the clock, but it can only actually post messages while the Discord bot itself is online and connected.


Feature Toggle​

Scheduler has no dedicated feature flag - it rides on the Discord integration flag:

"discord": false

Both the dashboard page and its underlying API are gated on features.discord.

warning

Behind the scenes, the actions that create or delete a scheduled message don't check permissions on their own - right now they're only protected because the dashboard page that calls them already requires zander.web.scheduler. In practice this means access is safe as long as staff only reach the scheduler through the dashboard, but it's flagged as a gap worth closing so the underlying action is checked directly too, not just the page in front of it.