Trap channel

Set up a channel nobody should ever post in, and punish the self-bots and spam accounts that do.

A trap channel is a channel with a standing warning in it and nothing else. Real members read the warning and leave it alone. Automated accounts that post into every channel the moment they join do not, and get punished immediately. It costs nothing to run and catches the kind of account that arrives faster than a moderator can react. Every trap command needs the Manage Guild permission.

Set the trap

Create it

Run ,trap setup to have the bot make a channel for you, or ,trap setup #channel to designate one you already have. Creating one needs Manage Channels.

Choose the punishment

Run ,trap action <action>. The default is softban.

Whitelist anyone who must be able to post there

Check it

Run ,trap settings to see the whole configuration in one embed.

Leave the channel visible. A trap nobody can see is a trap nothing walks into. The bot posts a standing embed in it saying not to send messages, so a member who wanders in has been told.

Threads inside a trap channel count as part of the trap. A message posted in one is treated the same as a message in the channel itself.

Choose what happens to whoever posts

,trap action sets the punishment.

ActionBot needsEffect
softbanBan MembersBans with a message purge, then immediately unbans. The default
banBan MembersPermanent
kickKick MembersThey can rejoin
timeoutModerate MembersReversible. Takes an optional duration, one hour by default
muteManage RolesNeeds a mute role set with ,config muterole
jailManage RolesNeeds a jail role set with ,config jailrole

,trap action timeout 2h sets the action and its duration together.

Every catch is deleted before anything else happens, and the caught message never reaches your snipe cache or your delete and edit logs. One trap embed goes to the log channel from ,config logchannel.

Staff are not immune

Only the server owner and whitelisted users and roles are immune. An Administrator who is not whitelisted gets caught and punished like anybody else. That is deliberate — permission-based immunity made the trap a silent no-op for every moderator who tried to test it.

It also means you cannot run ,trap commands inside a trap channel. Configure it from somewhere else, or whitelist your staff role.

Punish repeat offenders harder

,trap escalation on [action] applies a harsher punishment to anybody caught more than once. It is off by default and escalates to ban unless you name something else.

Offence counts come from a member's punishment history, so clearing their history with ,punishmenthistory clear resets their count.

,trap joingate on [days] applies the escalation action on a member's first catch when their account or their membership is newer than the number of days you set. It accepts 1 to 90 days and defaults to 7, and it is off by default.

The join gate uses the escalation action whether or not escalation itself is on, and that action is ban until you change it. ,trap escalation sets it either way, so ,trap escalation off timeout gives the gate a gentler action while leaving repeat escalation switched off.

Manage the warning embed

The standing embed in a trap channel is controlled by two separate commands, and they do different things.

,trap counter controls whether the embed exists at all and what number it shows.

ArgumentDoes
on / offShows or hides the embed. off gives you a silent trap with nothing posted in it
resetSets the displayed count back to zero
set <count>Corrects the displayed count

,trap embed controls what it looks like.

ArgumentDoes
viewReturns the current embed code, or the default one if you have not set anything
set <code>Replaces it
removeGoes back to the default
resendDeletes the current embed and posts a fresh one

Turning the counter off does not delete your custom code, and setting a code does not turn the counter on. A custom code must produce a real embed — plain text alone is refused, because a standing message with no embed cannot be posted.

Four tokens are available in the counter embed on top of the usual ones:

TokenBecomes
{trap.counter}how many accounts the trap has caught
{trap.action}the punishment, written out
{trap.channel}the trap channel's name, written #name
{trap.escalation}the escalation punishment, or nothing when escalation is off

Tell the person what happened

,trap dm controls the message a caught account receives. It is on by default.

ArgumentDoes
on / offSends or does not send a DM
invite <on/off>Includes a single-use rejoin invite, valid for a day, to a channel that is not the trap
embed <code>Replaces the default DM with your own embed code
embed checkShows the code currently set
embed resetGoes back to the default DM

The DM is sent before a ban or kick, which is the only moment it can still be delivered. A custom DM code can carry text, an embed and buttons at once, and {action} and {trap.channel} work inside it.

Run more than one trap

,trap channels takes add, remove and list, up to five channels. Each gets its own warning embed. The channel you named during setup is the primary one and cannot be removed — re-run ,trap setup to change it, which resets the list.

The catch count is shared across the whole server, so a catch anywhere updates every trap channel's embed.

,trap randomize on [hours] periodically renames your trap channels so a fixed name cannot be learned and skipped. It accepts 1 to 168 hours, defaults to 24, is off by default, and needs Manage Channels. Channels the bot cannot rename are left alone.

Review and remove

,trap settings prints the whole configuration. ,trap stats reports what the trap has actually caught — totals by action, unique accounts, how many were repeats, and the busiest days. ,trap disable removes the trap.

Common issues

A moderator got banned by the trap. Whitelist them or their role with ,trap whitelist add. Permissions never grant immunity.

My ,trap command did nothing. You ran it inside a trap channel, so the message was deleted before it could be read as a command. Run it somewhere else.

Someone posted in the trap and nothing happened. The bot could not apply the punishment — usually a missing permission, a member above it in the role hierarchy, or a mute or jail role that is not set. It reports the failure in your log channel rather than recording a catch that never happened.

Nothing is logged. Set a log channel with ,config logchannel.

The warning embed disappeared. Run ,trap embed resend.

My custom embed was refused. A counter embed has to be an actual embed. A code containing only text or only buttons cannot be posted as a standing message.