Moderation is a compound plugin: one master switch, several tabs. This page covers everything except AutoMod, which is large enough to have its own page.
| License | Premium |
| Tabs | Logging · AutoMod · Protection · Cases · Channel Locks · Feedback · Sticky · Commands |
Every moderation action Cloudy performs is written to a numbered case: #1, #2, #3, counting
up per server and never reused. A case records who was acted on, who acted, the reason, the time and
— for temporary punishments — when it expires.
This is the difference between "I think we banned them for spam last spring" and /case 47.
| Recorded | Types |
|---|---|
| Notes | note |
| Warnings | warn |
| Timeouts | timeout, untimeout |
| Removals | kick, ban, tempban, softban, unban |
| Automatic | automod |
A case is an action against one member. /massban therefore books a ban case for every user it
banned (and ends any tempban they were on, so its expiry cannot unban them later), with one summary
line in the mod log instead of up to 200. Server-wide actions — /purge, /lockdown and switching
raid mode on by hand — are mod-log lines without a case, so they no longer show up in the
moderator's own /modlogs. Older purge and massban cases stay readable through /case.
Punishments nobody typed are on the record too: an AutoMod timeout, an escalation step, and a raid
kick or ban each get a case, credited to AutoMod. So does a honeypot
catch — an ordinary ban, tempban, kick or timeout case, credited to the honeypot, whose reason names
the honeypot channel.
Reasons Cloudy writes itself ("AutoMod: Spam", "Tempban expired", the account-age gate, a
honeypot …) are shown in your server's language in the mod log, /case, /modlogs, /warnings and
the member's DM; a reason a moderator typed is shown as typed.
/case <number> shows one case in full; pass a new reason with it to replace the recorded reason
(the mod-log embed is updated too). /modlogs <member> shows that member's history, newest first.
/warnings <member> shows only their active warnings — manual and AutoMod ones, within the decay
window, the same strikes the count above the list is made of.
The dashboard shows the same history with a member filter and a type filter, and it is read-only there — cases are created by moderation actions, not by hand.
A warning does two things at once: it creates a case and adds a strike to the member's escalation ledger. The ledger is what AutoMod escalation counts, and strikes can decay after a configurable number of days.
Escalation steps are evaluated for every strike: an AutoMod warning and a /warn alike. The
moderator's reply says when their warning fired a step.
/delwarn <case> removes the strike and marks the case as reverted, but the case stays in the
history. That is deliberate: forgiving someone should not erase the record that it happened.
Punitive actions — warn, timeout, kick, ban, tempban, softban — DM the member by default, so nobody is left guessing. Notes never do; they are an internal staff annotation the member never sees.
Set an appeal URL in the settings and Cloudy attaches it to the DM for kicks, bans, tempbans and
softbans. It must be an http(s) link — a form, a second server's invite, anything reachable by
someone who has just lost access to yours. A DM has to fit into one Discord message (2000
characters); an appeal URL so long that it would not fit is left out whole rather than cut in half.
Cloudy watches the join rate. When at least n members join within m seconds, raid mode
switches on automatically. Staff can also switch it on and off by hand with /lockdown raid-on and
/lockdown raid-off; raid-on takes an optional minutes value (0–1440) that overrides the
auto-lift for that activation.
| Setting | Range | Default | Meaning |
|---|---|---|---|
| Join threshold | 2–200 | 10 | Joins needed to trigger |
| Window | 5–600 s | 60 s | The span they must fall within |
| Auto-lift | 0–180 min | 30 min | Raid mode ends by itself after this; 0 keeps it on until /lockdown raid-off |
The defaults suit a mid-sized server. A server that regularly runs advertised events should raise the threshold; a small private server can lower it considerably.
| Action | Effect |
|---|---|
| Alert | Nothing is done to them — staff is notified only |
| Quarantine | A role is applied that removes their access |
| Kick | They are removed and can return later |
| Ban | They are removed permanently (their last hour of messages is deleted) |
Quarantine is the default, and the right choice for almost every server. It is the only reversible option: a genuine member caught by a false positive gets their role removed and is fine. A ban issued to fifty real members during a false positive is fifty apologies.
Quarantine requires a role to apply — the dashboard refuses to save without one. Create one with no permissions and deny it View Channel in your public categories.
Raid mode posts to an alert channel and can ping an alert role — this is the one notification you want to reach a phone at 3 a.m. With no alert channel set, the alert goes to the mod-actions log channel instead.
With raise verification level on, Cloudy also sets the server's own verification level to the
highest setting for the duration and restores your original level when raid mode lifts.
/lockdown raid-on during a raid that is already running keeps the level from before the raid —
it never mistakes its own "highest" for yours.
/lockdown raid-off tells you when that is the case.
/lockdown raid-off itself also works with the plugin off or the licence lapsed — a raid started
with minutes: 0 has no lift time of its own.Independent of raid mode: reject or flag accounts that are too new. The two do not hide each other — a wave of fresh accounts still switches raid mode on (alert, verification level), while the gate deals with each account; a member the gate left in the server then also gets the raid action.
Set a minimum account age in days — 0 disables the check, the slider goes up to 90 — and
choose what happens to accounts below it:
| Action | Effect |
|---|---|
| Alert | Staff is notified in the alert channel, the member joins normally |
| Role | A role is applied, e.g. a restricted "new account" role |
| Kick | The account is removed and can return once it ages — told by DM first, recorded as a case |
| Ban | The account is removed permanently — told by DM first, recorded as a case |
Seven days stops most throwaway spam accounts. Thirty is aggressive and will catch real people who made an account to join your server — pair a high value with Alert or Role rather than Kick.
A member the gate or raid mode acted on — quarantined, given the new-account role, kicked or banned — receives no welcome message. With Alert the member joins normally and is greeted as usual.
With this on, Cloudy mirrors some of its rules into Discord's own AutoMod, so they are enforced by Discord at the moment a message is sent rather than by a bot reading it afterwards.
Cloudy creates and maintains these rules itself and reconciles them every 30 minutes; do not edit them by hand in server settings, as the next sync overwrites your changes. A mirrored rule you set to Disabled is removed from Discord on the next sync. Switching the option itself off stops the sync but leaves the rules Cloudy already created in place — disable the rules first, or delete them in server settings. With the moderation plugin switched off, or the licence expired, the next sync removes the mirrored rules.
See AutoMod for what is mirrored and what is not.
Eight independent categories. Each has a toggle and its own channel — the toggle decides whether the category is written at all, the channel decides where. A category that is on without a channel logs nothing.
One embed per new member, with avatar, account creation date and the new member count. The account age is the single most useful field here: a wave of accounts created the same day is a raid.
Logged when a member leaves or is kicked, with their join date, the new member count and the roles they held. Discord does not distinguish leaving from being kicked in this event, so pair it with mod-action logging if you need to tell voluntary leaves from kicks.
Every case Cloudy opens — bans, kicks, timeouts, warnings, notes — including the moderator, the
reason and the case number, plus server-wide actions without a case (purges, lockdowns, raid mode
switched on by hand, one summary per /massban). AutoMod hits are mirrored here too, with the rule that fired. Kicks,
bans, unbans and timeouts that staff perform directly in Discord are picked up from the audit log and
logged here as well.
Edited and deleted messages with content, author and channel, plus bulk deletions. The highest-volume category, and the most sensitive one — put it in a staff-only channel.
Channels created, deleted and renamed, and roles created, deleted or changed (name, colour, permissions).
Joins, leaves and channel switches in voice. Noisy on active servers; give it its own channel or leave it off.
A thank-you embed whenever a member boosts, with the new boost total. While this category has no channel of its own, boosts fall back to the mod-actions channel.
Nicknames renamed and roles given to or taken from a member, with who did it. Read from the audit log, so Cloudy needs View Audit Log; changes Cloudy itself makes (level rewards, reaction roles) are left out.
Up to 50 excluded channels and 50 excluded roles. Nothing that happens in an excluded channel reaches the logs, and excluding a category excludes every channel under it. Members holding an excluded role are not logged where the event carries the member — messages and voice.
/channel lock denies Send Messages in the current channel for @everyone and for every role that
has its own permission overwrite there (roles with Administrator are skipped). Cloudy remembers the
previous state so /channel unlock restores it exactly. Pass a duration in hours and the channel
unlocks itself.
The bot needs Manage Channels and Manage Roles for this. Cloudy writes every overwrite of
the channel in one single request, so a lock is never half applied and a server-wide lockdown stays
fast. That request is a channel edit, and Discord asks for both permissions there. A Cloudy without
Administrator also adds a Send Messages overwrite for itself while the lock is active, so it can
still post the lock notice and lift the lock again. /channel unlock removes that overwrite.
Every new lock replaces a pending auto-unlock, so an older timed lock can never lift a newer one early. If an auto-unlock keeps failing (Cloudy lost its permissions in that channel), Cloudy retries for a few hours and then says so in the mod-actions log.
/lockdown lock does the same for every text channel at once (up to 100), /lockdown unlock
reverses it — the button to reach for while a raid is in progress, not afterwards. The same command
switches raid mode on and off.
Unlocking is cleanup: /channel unlock, /lockdown unlock and /lockdown raid-off keep working
when the moderation plugin is switched off or its licence has lapsed, so nothing stays locked
because of that. They still need the moderator permissions listed below. Locking stays part of the
plugin.
Locks survive a bot restart and a server reset: the overwrites live in Discord, and the state needed to unlock again is deliberately kept.
The Channel Locks tab in the dashboard is currently a placeholder — locks are managed with the commands.
Send Feedback in a user's context menu (right-click → Apps) asks you — the person who opened it — how your experience with that user was: an ephemeral prompt with three buttons, Very Good, Good and Not Good. The rating is tallied against the user you rated, so it is a way for members to grade the staff member who just helped them. Only the person who opened the prompt can answer, once, within 24 hours — a double click or two clicks at the same time count once; bots and yourself cannot be rated. Opening the prompt is rate-limited like a command, and requests nobody answered within the 24 hours are cleaned up. The Feedback tab in the dashboard is currently a placeholder.
A sticky message is pinned to the bottom of a channel: whenever someone posts, the bot deletes its own previous copy and reposts it underneath (a few seconds after the last message, so a burst of chat does not produce a burst of reposts). Ideal for channel rules that must stay visible in a busy chat.
One sticky per channel. Creating a second one for the same channel replaces the first.
Required · fixed after creation
The channel this sticky stays pinned to.
Up to 256 characters · optional
Optional heading above the message body.
1–2000 characters · required
The body. Supports Markdown; reposted to the bottom of the channel on activity. The sticky is always posted as an embed, and you can design it fully with the embed builder.
Sticky changes are pushed to the bot immediately, not on a poll — a saved sticky is live within seconds. Editing a sticky updates the copy already in the channel in place; if that copy is gone (or was posted by Cloudy before a Custom Bot took over), a fresh one is posted.
A sticky whose channel was deleted is removed. One Cloudy may not post in yet is retried with growing gaps (up to an hour) rather than every 30 seconds. The same goes for reposting on activity: when Discord refuses the repost, that channel's reposting pauses with growing gaps instead of trying again on every message.
Removing a sticky from the dashboard stops the reposting. /sticky-remove-msg does the same from
inside Discord, and so does deleting the sticky message itself.
| Command | Does | Requires |
|---|---|---|
/warn | Warn a member — case plus a strike; a reason is required | Moderate Members |
/delwarn | Remove a strike by case number, keep the case | Moderate Members |
/note | Add a private staff note, no DM | Moderate Members |
/timeout | Put a member in timeout, 1 minute – 28 days | Moderate Members |
/untimeout | End a timeout that is still running; the role hierarchy applies as for /timeout | Moderate Members |
/kick | Kick a member | Kick Members |
/ban | Ban a member from the server, optionally deleting 0–7 days of messages | Ban Members |
/tempban | Ban for a set duration (30m, 12h, 7d, 2w, up to a year), lifted automatically — even with the plugin off; a ban or unban done by hand in Discord ends it early; refuses a user who is already banned permanently (/unban first); optionally deletes 0–7 days of messages | Ban Members |
/softban | Ban and immediately unban — clears 1–7 days of their messages | Ban Members |
/unban | Lift a ban by user id | Ban Members |
/massban | Ban up to 200 IDs at once; members ranked at or above you (or Cloudy) are skipped; every banned user gets their own case | Administrator |
| Command | Does | Requires |
|---|---|---|
/case | Show one case by number, optionally replacing its reason | Moderate Members |
/modlogs | History for one member | Moderate Members |
/warnings | Active warnings for one member | Moderate Members |
| Command | Does | Requires |
|---|---|---|
/purge | Delete up to 100 recent messages, filtered by member, text or bots (Discord only bulk-deletes messages under 14 days old) | Manage Messages |
/del-msg | Delete the last 1–100 messages before the command (pinned messages are kept) | Manage Messages |
/slowmode | Set slowmode on a channel (0–21600 s) | Manage Channels |
/channel lock | Lock the current channel, optionally for a set number of hours | Manage Channels |
/channel unlock | Unlock the current channel — also with the plugin off | Manage Channels |
/lockdown | Lock or unlock every text channel, or switch raid mode on and off | Manage Server |
/sticky-remove-msg | Remove the sticky message from the current channel | Manage Messages |
/new-changelog | Post a changelog entry | Manage Server |
Two more actions live in the user context menu (right-click a member → Apps): Lookup User (Moderate Members) and Send Feedback (Manage Messages).
/massban deliberately requires Administrator rather than Ban Members: it is the most
destructive command Cloudy has, and Ban Members is a permission plenty of servers hand to junior
staff. It applies the role hierarchy like a single ban: members of the list whose highest role is at
or above yours (or Cloudy's) are skipped and reported, and the server owner is never banned.
If a tempban cannot be lifted because Discord refuses the unban (Cloudy lost Ban Members), Cloudy posts one notice in the mod-actions log and keeps retrying with growing gaps.
The permission column is what the member running the command needs. Cloudy additionally needs the same permission itself, and its role must sit above the target's highest role — as must the moderator's, unless they own the server. See Permissions.