Scenarios
LiveWhen this happens, do that.
Triggers
A scenario starts from an event, filters it, then chains up to five actions. Beyond that it becomes impossible to read back — and chaining two scenarios covers the cases that truly need it.
| Trigger | Available filters |
|---|---|
member.join | Minimum account age |
member.leave | None |
message.create | Channels, member roles, text fragment |
role.added | Tracked role |
role.removed | Tracked role |
Actions
| Action | Effect |
|---|---|
send_message | Sends a message, in a chosen channel or the trigger’s channel |
send_dm | Sends a direct message to the member concerned |
add_role | Adds a role |
remove_role | Removes a role |
webhook | Posts the server, the member and the message to an HTTPS address |
Each action can wait up to one hour before running. Beyond that it would need a persistent queue: a restart would lose the action in flight without anyone noticing.
Safeguards
- A scenario is validated data, never code: it cannot do anything the schemas above do not allow.
- Only the triggering member can be mentioned. A template containing
@everyonedoes not turn a scenario into a spam tool. - Each scenario is rate-limited. Otherwise a scenario triggered on messages could flood a channel during a raid — that is, help the raid.
- The last twenty runs are kept, with the detail action by action.
- The
webhookaction only accepts HTTPS, follows no redirect, and refuses any private address — loopback, internal network, host metadata. The check sits in the DNS resolver of the connection itself: the address checked is the one the socket opens to, there is no gap to exploit.
From Discord
A scenario is written in the dashboard — it is a form, it belongs there — but two moments call for being in Discord. /automation covers both.
| Subcommand | What it does |
|---|---|
/automation list | Every scenario, active or paused, with its last error |
/automation test | Runs a scenario right now, on you |
/automation toggle | Turns a scenario on or off |
Testing is the first. A scenario triggered when a member leaves can only be checked by waiting for a member to leave: test runs it without waiting, without checking the trigger, and without honouring declared delays — an action delayed by an hour would outlive the interaction.
Emergencies are the second. A runaway scenario is switched off in three seconds from a phone, without opening a browser or logging in again.