Plugins

Moderation

Premium
The all-in-one mod toolkit — slash commands, a numbered case history, raid protection, eight logging categories, channel locks and sticky messages.

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.

LicensePremium
TabsLogging · AutoMod · Protection · Cases · Channel Locks · Feedback · Sticky · Commands

Cases

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.

RecordedTypes
Notesnote
Warningswarn
Timeoutstimeout, untimeout
Removalskick, ban, tempban, softban, unban
Automaticautomod

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.

Looking things up

/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.

Warnings and escalation

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.

Member notifications

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.

An appeal link removes most of the "I got banned and nobody will talk to me" DMs your staff receives. It is one field and it pays for itself in a week.

Raid protection

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.

Thresholds

SettingRangeDefaultMeaning
Join threshold2–20010Joins needed to trigger
Window5–600 s60 sThe span they must fall within
Auto-lift0–180 min30 minRaid 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.

What happens to members who join during a raid

ActionEffect
AlertNothing is done to them — staff is notified only
QuarantineA role is applied that removes their access
KickThey are removed and can return later
BanThey 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.

Alerts and verification

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.

Raid mode ends by itself after the auto-lift period — also after a bot restart, within a minute, and also while the moderation plugin is switched off: lifting is cleanup and always runs. If Discord refuses to restore your verification level (Cloudy lost Manage Server), Cloudy keeps the level it owes you and retries on its own until it succeeds; /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.

Account age gate

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:

ActionEffect
AlertStaff is notified in the alert channel, the member joins normally
RoleA role is applied, e.g. a restricted "new account" role
KickThe account is removed and can return once it ages — told by DM first, recorded as a case
BanThe 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.

Native AutoMod sync

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.

Logging

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.

Joins

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.

Leaves

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.

Mod actions

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.

If you only enable one category, make it this one. It is what turns "the bot muted me for nothing" into a two-second lookup.

Messages

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.

Channel changes

Channels created, deleted and renamed, and roles created, deleted or changed (name, colour, permissions).

Voice activity

Joins, leaves and channel switches in voice. Noisy on active servers; give it its own channel or leave it off.

Server boosts

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.

Nickname & role changes

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.

If Cloudy may not post into a log channel (missing View Channel, Send Messages or Embed Links), that channel's logging pauses for ten minutes and then tries again, instead of costing a refused request per event. Fix the permission and logging resumes on its own. A log channel that was deleted switches its category off.

Exclusions

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.

All eight channel fields accept only channels from this server. Sensitive categories (mod actions, messages) belong somewhere members cannot read.

Channel Locks

/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.

Feedback

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.

Sticky messages

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.

Channel

Required · fixed after creation

The channel this sticky stays pinned to.

Title

Up to 256 characters · optional

Optional heading above the message body.

Content

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.

The bot needs Read Message History in that channel. Without it, it can post the sticky but not find its previous copy to remove it, and the channel fills with duplicates.

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.

Commands

Punishments

CommandDoesRequires
/warnWarn a member — case plus a strike; a reason is requiredModerate Members
/delwarnRemove a strike by case number, keep the caseModerate Members
/noteAdd a private staff note, no DMModerate Members
/timeoutPut a member in timeout, 1 minute – 28 daysModerate Members
/untimeoutEnd a timeout that is still running; the role hierarchy applies as for /timeoutModerate Members
/kickKick a memberKick Members
/banBan a member from the server, optionally deleting 0–7 days of messagesBan Members
/tempbanBan 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 messagesBan Members
/softbanBan and immediately unban — clears 1–7 days of their messagesBan Members
/unbanLift a ban by user idBan Members
/massbanBan up to 200 IDs at once; members ranked at or above you (or Cloudy) are skipped; every banned user gets their own caseAdministrator

History

CommandDoesRequires
/caseShow one case by number, optionally replacing its reasonModerate Members
/modlogsHistory for one memberModerate Members
/warningsActive warnings for one memberModerate Members

Channels and messages

CommandDoesRequires
/purgeDelete up to 100 recent messages, filtered by member, text or bots (Discord only bulk-deletes messages under 14 days old)Manage Messages
/del-msgDelete the last 1–100 messages before the command (pinned messages are kept)Manage Messages
/slowmodeSet slowmode on a channel (0–21600 s)Manage Channels
/channel lockLock the current channel, optionally for a set number of hoursManage Channels
/channel unlockUnlock the current channel — also with the plugin offManage Channels
/lockdownLock or unlock every text channel, or switch raid mode on and offManage Server
/sticky-remove-msgRemove the sticky message from the current channelManage Messages
/new-changelogPost a changelog entryManage 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.

  • AutoMod — automatic message rules and warn escalation
  • Verification — a gate members pass before they can talk
  • Audit log — Discord's own log, for actions Cloudy did not perform