<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adam</title>
    <description>The latest articles on DEV Community by Adam (@adamcle).</description>
    <link>https://dev.to/adamcle</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4104497%2F603f5bba-2078-412c-bd12-44bed748d55c.png</url>
      <title>DEV Community: Adam</title>
      <link>https://dev.to/adamcle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adamcle"/>
    <language>en</language>
    <item>
      <title>Como proteger um servidor Discord contra spam e raids em 2026</title>
      <dc:creator>Adam</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:48:33 +0000</pubDate>
      <link>https://dev.to/adamcle/como-proteger-um-servidor-discord-contra-spam-e-raids-em-2026-2ke0</link>
      <guid>https://dev.to/adamcle/como-proteger-um-servidor-discord-contra-spam-e-raids-em-2026-2ke0</guid>
      <description>&lt;p&gt;Você cria um servidor Discord, configura os canais, coloca alguns moderadores e fica tudo bom.&lt;/p&gt;

&lt;p&gt;Até começar a crescer.&lt;/p&gt;

&lt;p&gt;Aí aparece conta mandando o mesmo link em 20 canais, cinco usuários com username quase igual entram juntos, alguém resolve mencionar &lt;code&gt;@everyone&lt;/code&gt; várias vezes e no pior caso uma conta de administrador comprometida começa a apagar canal.&lt;/p&gt;

&lt;p&gt;A resposta óbvia é automação.&lt;/p&gt;

&lt;p&gt;Só que tem outro problema: se você configura automação agressiva demais, o bot começa a ser mais irritante que o spam.&lt;/p&gt;

&lt;p&gt;Então a pergunta boa não é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Como eu bloqueio o máximo possível?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Como eu bloqueio comportamento realmente suspeito sem pegar usuário normal junto?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neste artigo vou passar pelas opções que existem hoje, o que o próprio Discord já resolve, como eu penso a arquitetura de antispam e antiraid e onde ferramentas como BetterAntispam entram nisso.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que proteger um servidor Discord realmente importa
&lt;/h2&gt;

&lt;p&gt;Spam não é só alguém mandando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMPRE CRYPTO AQUI
COMPRE CRYPTO AQUI
COMPRE CRYPTO AQUI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso é fácil.&lt;/p&gt;

&lt;p&gt;O problema são os casos menos óbvios.&lt;/p&gt;

&lt;p&gt;Uma conta criada há 20 minutos pode ser raider.&lt;/p&gt;

&lt;p&gt;Também pode ser alguém que acabou de criar Discord.&lt;/p&gt;

&lt;p&gt;Um usuário sem avatar pode ser bot.&lt;/p&gt;

&lt;p&gt;Também pode ser alguém que não colocou foto ainda.&lt;/p&gt;

&lt;p&gt;Dez pessoas entrando juntas pode ser raid.&lt;/p&gt;

&lt;p&gt;Também pode ser um streamer que acabou de divulgar seu servidor.&lt;/p&gt;

&lt;p&gt;Então um bom sistema de moderação não deveria olhar uma informação e decidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conta nova = ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você quer contexto.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conta criada agora
+
sem avatar
+
entrou junto com 30 contas
+
username parecido
+
começou a mandar o mesmo link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora ficou interessante.&lt;/p&gt;

&lt;p&gt;É exatamente aí que separar sinais fracos de sinais fortes começa a fazer diferença.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que dá para proteger automaticamente
&lt;/h2&gt;

&lt;p&gt;Hoje dá para automatizar bastante coisa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spam de mensagem
&lt;/h3&gt;

&lt;p&gt;Você consegue detectar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mensagens rápidas;&lt;/li&gt;
&lt;li&gt;texto repetido;&lt;/li&gt;
&lt;li&gt;excesso de menções;&lt;/li&gt;
&lt;li&gt;links repetidos;&lt;/li&gt;
&lt;li&gt;convites;&lt;/li&gt;
&lt;li&gt;excesso de emoji;&lt;/li&gt;
&lt;li&gt;texto muito grande;&lt;/li&gt;
&lt;li&gt;ghost ping;&lt;/li&gt;
&lt;li&gt;spam de comandos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Raids
&lt;/h3&gt;

&lt;p&gt;Você consegue observar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quantidade de joins;&lt;/li&gt;
&lt;li&gt;velocidade dos joins;&lt;/li&gt;
&lt;li&gt;idade das contas;&lt;/li&gt;
&lt;li&gt;características parecidas entre contas;&lt;/li&gt;
&lt;li&gt;comportamento logo depois do join.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ações destrutivas
&lt;/h3&gt;

&lt;p&gt;Também dá para observar ações administrativas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bans em massa;&lt;/li&gt;
&lt;li&gt;kicks;&lt;/li&gt;
&lt;li&gt;canais apagados;&lt;/li&gt;
&lt;li&gt;cargos apagados;&lt;/li&gt;
&lt;li&gt;webhooks;&lt;/li&gt;
&lt;li&gt;alterações perigosas de permissões.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verificação
&lt;/h3&gt;

&lt;p&gt;Você também pode colocar alguma fricção antes do usuário receber acesso completo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;botão
↓
palavra
↓
matemática
↓
CAPTCHA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas não significa que você deveria ligar tudo no máximo.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que nenhum bot consegue saber perfeitamente
&lt;/h2&gt;

&lt;p&gt;Intenção.&lt;/p&gt;

&lt;p&gt;Esse é o problema.&lt;/p&gt;

&lt;p&gt;O bot sabe que alguém enviou cinco mensagens em cinco segundos.&lt;/p&gt;

&lt;p&gt;Ele não sabe automaticamente por quê.&lt;/p&gt;

&lt;p&gt;Imagina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;não
pera
acho que achei
sim
era isso mesmo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cinco mensagens rápidas.&lt;/p&gt;

&lt;p&gt;Se sua regra for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messagesInFiveSeconds&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;banUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;parabéns, você acabou de banir uma conversa normal.&lt;/p&gt;

&lt;p&gt;Então eu trato comportamento como evidência.&lt;/p&gt;

&lt;p&gt;Não como verdade absoluta.&lt;/p&gt;




&lt;h2&gt;
  
  
  Método 1: usar só o AutoMod do Discord
&lt;/h2&gt;

&lt;p&gt;Antes de instalar qualquer bot, usa as ferramentas que o Discord já oferece.&lt;/p&gt;

&lt;p&gt;É bom.&lt;/p&gt;

&lt;p&gt;O AutoMod consegue bloquear mensagens com palavras específicas, spam e excesso de menções, além de mandar alertas para moderadores e aplicar timeout dependendo da configuração.&lt;/p&gt;

&lt;p&gt;O próprio Discord também tem proteção contra raids, níveis de verificação e Slowmode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;já está integrado ao Discord;&lt;/li&gt;
&lt;li&gt;não depende de outro serviço;&lt;/li&gt;
&lt;li&gt;bloqueia vários tipos de conteúdo antes da mensagem aparecer;&lt;/li&gt;
&lt;li&gt;configuração simples;&lt;/li&gt;
&lt;li&gt;consegue alertar a staff.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;você tem menos controle sobre lógica customizada;&lt;/li&gt;
&lt;li&gt;nem todo ataque é baseado em mensagem;&lt;/li&gt;
&lt;li&gt;não resolve sozinho uma conta de administrador comprometida;&lt;/li&gt;
&lt;li&gt;algumas comunidades precisam analisar eventos em conjunto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Veredito
&lt;/h3&gt;

&lt;p&gt;Eu ligaria AutoMod mesmo usando outro bot.&lt;/p&gt;

&lt;p&gt;Não tem motivo para recriar tudo que o Discord já faz.&lt;/p&gt;




&lt;h2&gt;
  
  
  Método 2: bot tradicional de moderação
&lt;/h2&gt;

&lt;p&gt;Depois você tem bots gerais de moderação.&lt;/p&gt;

&lt;p&gt;Normalmente eles fazem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;warn;&lt;/li&gt;
&lt;li&gt;timeout;&lt;/li&gt;
&lt;li&gt;mute;&lt;/li&gt;
&lt;li&gt;kick;&lt;/li&gt;
&lt;li&gt;ban;&lt;/li&gt;
&lt;li&gt;logs;&lt;/li&gt;
&lt;li&gt;Slowmode;&lt;/li&gt;
&lt;li&gt;filtros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para muita comunidade isso já resolve.&lt;/p&gt;

&lt;p&gt;O problema aparece quando você quer começar a responder coisas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esses 20 joins têm relação entre si?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esse usuário está repetindo comportamento que já apareceu em outras contas?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aí você começa a sair de uma regra simples e entrar em análise de comportamento.&lt;/p&gt;




&lt;h2&gt;
  
  
  Método 3: proteção em camadas
&lt;/h2&gt;

&lt;p&gt;É o modelo que eu prefiro.&lt;/p&gt;

&lt;p&gt;Em vez de ter um botão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SEGURANÇA = ATIVADA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;separa os problemas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discord AutoMod
      ↓
conteúdo básico

Antispam
      ↓
comportamento de mensagens

Antiraid
      ↓
comportamento de joins

Antinuke
      ↓
ações administrativas

Verificação
      ↓
controle de entrada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa também é basicamente a arquitetura que usamos no BetterAntispam.&lt;/p&gt;

&lt;p&gt;Antispam não deveria tentar resolver nuke.&lt;/p&gt;

&lt;p&gt;Antinuke não deveria decidir se alguém está mandando emoji demais.&lt;/p&gt;

&lt;p&gt;São problemas diferentes.&lt;/p&gt;

&lt;p&gt;Mantém separado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como isso funciona tecnicamente
&lt;/h2&gt;

&lt;p&gt;Vamos pegar antispam.&lt;/p&gt;

&lt;p&gt;Primeiro você precisa de estado.&lt;/p&gt;

&lt;p&gt;Se você só olha a mensagem atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageCreate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;você não sabe se ela é repetida.&lt;/p&gt;

&lt;p&gt;Então guarda um histórico pequeno.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;states&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando chega mensagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageCreate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;guild&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora remove coisa velha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WINDOW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;

&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;WINDOW&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto.&lt;/p&gt;

&lt;p&gt;Agora você consegue saber o que aquele usuário fez nos últimos 30 segundos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Não mistura detecção com punição
&lt;/h2&gt;

&lt;p&gt;Esse ponto é importante.&lt;/p&gt;

&lt;p&gt;Não faz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;detectSpam&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ban&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seu detector agora decide punição também.&lt;/p&gt;

&lt;p&gt;Eu prefiro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detectSignals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você tem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detecção
↓
decisão
↓
ação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora se seu detector está bom mas a punição está agressiva, você muda a punição.&lt;/p&gt;

&lt;p&gt;Não precisa mexer na detecção.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trabalha com vários sinais
&lt;/h2&gt;

&lt;p&gt;Imagina algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isSendingFast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isRepeatingMessages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isMassMentioning&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isRepeatingSuspiciousLinks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;quarantine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os números são exemplo.&lt;/p&gt;

&lt;p&gt;Não pega isso e coloca em produção sem pensar.&lt;/p&gt;

&lt;p&gt;O importante é o modelo.&lt;/p&gt;

&lt;p&gt;Uma coisa moderadamente estranha pode não significar nada.&lt;/p&gt;

&lt;p&gt;Várias coisas estranhas acontecendo juntas significam mais.&lt;/p&gt;




&lt;h2&gt;
  
  
  Similaridade é melhor que igualdade
&lt;/h2&gt;

&lt;p&gt;Spammer não precisa mandar exatamente a mesma string.&lt;/p&gt;

&lt;p&gt;Isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;entra aqui https://site.com/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENTRA AQUI!!! https://site.com/2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;provavelmente são a mesma campanha.&lt;/p&gt;

&lt;p&gt;Mas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;messageA&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;messageB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vai dizer que não.&lt;/p&gt;

&lt;p&gt;Então normaliza.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;!?.,&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode remover URL antes de comparar também.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;removeUrls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/https&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\/\/\S&lt;/span&gt;&lt;span class="sr"&gt;+/gi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você consegue identificar padrões sem depender de igualdade perfeita.&lt;/p&gt;

&lt;p&gt;Só não exagera.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bom dia&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bom dia pessoal&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;também são parecidos.&lt;/p&gt;

&lt;p&gt;Contexto continua importando.&lt;/p&gt;




&lt;h2&gt;
  
  
  Raid não deveria ser só "X joins em Y segundos"
&lt;/h2&gt;

&lt;p&gt;O jeito mais simples de detectar raid é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;joinsLastMinute&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;raid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciona até algum criador de conteúdo mandar 50 pessoas legítimas para seu servidor.&lt;/p&gt;

&lt;p&gt;Quantidade é um sinal.&lt;/p&gt;

&lt;p&gt;Analisa a composição também.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateRisk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accountAge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createdTimestamp&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;accountAge&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora imagina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;30 joins em 1 minuto
+
25 contas muito novas
+
20 sem avatar
+
vários usernames parecidos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito mais útil que saber simplesmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;30 pessoas entraram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BetterAntispam usa esse tipo de ideia com análise de padrões de join e perfis suspeitos.&lt;/p&gt;

&lt;p&gt;Mas você consegue implementar o mesmo conceito em qualquer projeto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quarentena é muito útil para falso positivo
&lt;/h2&gt;

&lt;p&gt;Quando você não tem certeza suficiente para banir alguém, não precisa escolher entre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;faz nada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ban permanente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tem um meio.&lt;/p&gt;

&lt;p&gt;Quarentena.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usuário suspeito
↓
remove acesso aos canais
↓
loga o motivo
↓
staff analisa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se depois ficar óbvio que era ataque, escala.&lt;/p&gt;

&lt;p&gt;Se for legítimo, restaura.&lt;/p&gt;

&lt;p&gt;É muito melhor que transformar um score imperfeito em punição permanente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Antinuke é completamente diferente de antispam
&lt;/h2&gt;

&lt;p&gt;Agora imagina que o atacante não é membro novo.&lt;/p&gt;

&lt;p&gt;É um administrador.&lt;/p&gt;

&lt;p&gt;Ou uma conta de bot comprometida.&lt;/p&gt;

&lt;p&gt;Ele não precisa mandar uma mensagem.&lt;/p&gt;

&lt;p&gt;Pode fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;delete channel
delete channel
delete channel
ban member
ban member
delete role
create webhook
change permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seu antispam está olhando &lt;code&gt;messageCreate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ele não vai ajudar.&lt;/p&gt;

&lt;p&gt;Nesse caso você precisa observar eventos administrativos e Audit Logs.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;limits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;channelDelete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;roleDelete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;memberBan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De novo, números de exemplo.&lt;/p&gt;

&lt;p&gt;Não usa o mesmo limite para tudo.&lt;/p&gt;

&lt;p&gt;Apagar um canal não necessariamente tem o mesmo risco de alterar uma permissão crítica.&lt;/p&gt;

&lt;p&gt;Essa separação é o motivo de BetterAntispam tratar antinuke como um sistema diferente do antispam.&lt;/p&gt;




&lt;h2&gt;
  
  
  E quando o bot começa a crescer?
&lt;/h2&gt;

&lt;p&gt;Aqui fica interessante para quem está fazendo isso em Node.&lt;/p&gt;

&lt;p&gt;Esse código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;joins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;funciona enquanto existe um processo.&lt;/p&gt;

&lt;p&gt;Agora você coloca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shard 1
Shard 2
Shard 3
Shard 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada processo tem o próprio array.&lt;/p&gt;

&lt;p&gt;Então você talvez tenha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shard 1 → 8 joins
Shard 2 → 7 joins
Shard 3 → 9 joins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nenhum processo individual vê uma raid enorme.&lt;/p&gt;

&lt;p&gt;Mas globalmente foram 24 joins.&lt;/p&gt;

&lt;p&gt;Se o estado precisa ser compartilhado, move para uma camada compartilhada.&lt;/p&gt;

&lt;p&gt;Redis é uma opção.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discord Gateway
      ↓
processos / shards
      ↓
Redis
      ↓
detecção
      ↓
decisão
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não precisa ser Redis.&lt;/p&gt;

&lt;p&gt;Só entende onde está sua fonte de verdade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rate limit importa justamente quando tudo dá errado
&lt;/h2&gt;

&lt;p&gt;Durante uma raid você recebe mais evento e quer executar mais ação.&lt;/p&gt;

&lt;p&gt;Seu bot começa a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deletar mensagem;&lt;/li&gt;
&lt;li&gt;aplicar timeout;&lt;/li&gt;
&lt;li&gt;mudar cargo;&lt;/li&gt;
&lt;li&gt;banir;&lt;/li&gt;
&lt;li&gt;editar canal;&lt;/li&gt;
&lt;li&gt;ativar Slowmode;&lt;/li&gt;
&lt;li&gt;mandar logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Então não pensa só em detecção.&lt;/p&gt;

&lt;p&gt;Pensa na fila de execução também.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prioridade 1
impedir mais dano

prioridade 2
conter atacante

prioridade 3
lockdown

prioridade 4
limpeza

prioridade 5
logs secundários
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não faz o embed bonito do log atrasar a ação que realmente impede o ataque.&lt;/p&gt;

&lt;p&gt;E não hardcode os rate limits da API.&lt;/p&gt;

&lt;p&gt;O próprio Discord diz que eles podem variar e que aplicações devem respeitar os headers e &lt;code&gt;retry_after&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Raid Mode deveria mudar as regras temporariamente
&lt;/h2&gt;

&lt;p&gt;Se o sistema já detectou raid, não precisa tratar o próximo usuário exatamente como trataria num dia normal.&lt;/p&gt;

&lt;p&gt;Você pode temporariamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aumentar verificação;&lt;/li&gt;
&lt;li&gt;ativar Slowmode;&lt;/li&gt;
&lt;li&gt;bloquear canais;&lt;/li&gt;
&lt;li&gt;aumentar sensibilidade;&lt;/li&gt;
&lt;li&gt;restringir novos usuários;&lt;/li&gt;
&lt;li&gt;avisar moderadores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois volta ao normal.&lt;/p&gt;

&lt;p&gt;É melhor que deixar configuração extremamente agressiva ligada 24 horas por dia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modo normal
→ otimiza para usuário legítimo

modo raid
→ otimiza para contenção
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BetterAntispam tem lockdown automático seguindo essa ideia, mas de novo, o conceito não depende dele.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limpeza faz parte da proteção
&lt;/h2&gt;

&lt;p&gt;Às vezes prevenção falha.&lt;/p&gt;

&lt;p&gt;Já entraram usuários.&lt;/p&gt;

&lt;p&gt;Já mandaram 2.000 mensagens.&lt;/p&gt;

&lt;p&gt;Agora você precisa limpar.&lt;/p&gt;

&lt;p&gt;Então o fluxo completo não é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detectar
↓
fim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detectar
↓
conter
↓
remover atacante
↓
limpar
↓
voltar ao normal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ferramentas de bulk moderation ajudam aqui.&lt;/p&gt;

&lt;p&gt;BetterAntispam tem &lt;code&gt;/nuke&lt;/code&gt; para limpeza de canal e &lt;code&gt;/slowmodebulk&lt;/code&gt; para aplicar Slowmode em massa.&lt;/p&gt;

&lt;p&gt;O ponto não é o comando.&lt;/p&gt;

&lt;p&gt;É pensar em recuperação antes de precisar dela.&lt;/p&gt;




&lt;h2&gt;
  
  
  Melhores práticas para proteger um Discord em 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Liga AutoMod primeiro
&lt;/h3&gt;

&lt;p&gt;Não recria tudo.&lt;/p&gt;

&lt;p&gt;O Discord já consegue resolver bastante coisa.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Não confia em um único sinal
&lt;/h3&gt;

&lt;p&gt;Conta nova não significa atacante.&lt;/p&gt;

&lt;p&gt;Sem avatar não significa bot.&lt;/p&gt;

&lt;p&gt;Join rápido não significa raid.&lt;/p&gt;

&lt;p&gt;Combinação de comportamento é mais útil.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Separa detecção de ação
&lt;/h3&gt;

&lt;p&gt;Seu detector deveria produzir informação.&lt;/p&gt;

&lt;p&gt;Outra parte decide a punição.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Usa quarentena quando existe dúvida
&lt;/h3&gt;

&lt;p&gt;É muito mais fácil recuperar uma quarentena errada que um ban permanente errado.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Configura exceções
&lt;/h3&gt;

&lt;p&gt;Bots, staff e canais especiais podem ter comportamento diferente.&lt;/p&gt;

&lt;p&gt;Não desliga o sistema inteiro porque um webhook legítimo manda links.&lt;/p&gt;

&lt;p&gt;Exime aquele webhook.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Protege contra conta de staff comprometida
&lt;/h3&gt;

&lt;p&gt;Antispam não resolve administrador malicioso.&lt;/p&gt;

&lt;p&gt;Antinuke é outra camada.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Faz um modo de emergência
&lt;/h3&gt;

&lt;p&gt;Não tenta configurar 30 coisas manualmente enquanto a raid já está acontecendo.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Testa falso positivo
&lt;/h3&gt;

&lt;p&gt;Não testa só:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;o spammer foi bloqueado?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testa também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;o usuário normal continuou funcionando?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse segundo teste é igualmente importante.&lt;/p&gt;




&lt;h2&gt;
  
  
  Guia rápido de configuração
&lt;/h2&gt;

&lt;p&gt;Se eu fosse configurar um servidor hoje, faria nessa ordem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1 — AutoMod
&lt;/h3&gt;

&lt;p&gt;Liga:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proteção de spam;&lt;/li&gt;
&lt;li&gt;menções;&lt;/li&gt;
&lt;li&gt;palavras relevantes;&lt;/li&gt;
&lt;li&gt;alertas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não precisa banir automaticamente todo mundo que dispara regra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 2 — nível de verificação
&lt;/h3&gt;

&lt;p&gt;Escolhe baseado no risco real da comunidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 3 — camada adicional de moderação
&lt;/h3&gt;

&lt;p&gt;Pode ser seu próprio bot, BetterAntispam ou outra ferramenta.&lt;/p&gt;

&lt;p&gt;Só não instala cinco bots fazendo exatamente a mesma coisa sem saber qual deles tomou a ação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 4 — antispam
&lt;/h3&gt;

&lt;p&gt;Começa conservador.&lt;/p&gt;

&lt;p&gt;Olha logs.&lt;/p&gt;

&lt;p&gt;Ajusta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 5 — exceções
&lt;/h3&gt;

&lt;p&gt;Configura usuários, cargos, bots e canais legítimos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 6 — antiraid
&lt;/h3&gt;

&lt;p&gt;Primeiro entende como joins normais do seu servidor se comportam.&lt;/p&gt;

&lt;p&gt;Depois define thresholds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 7 — antinuke
&lt;/h3&gt;

&lt;p&gt;Define limites separados para ações realmente destrutivas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 8 — testa tudo
&lt;/h3&gt;

&lt;p&gt;Cria um canal de teste.&lt;/p&gt;

&lt;p&gt;Manda spam.&lt;/p&gt;

&lt;p&gt;Testa link.&lt;/p&gt;

&lt;p&gt;Testa menção.&lt;/p&gt;

&lt;p&gt;Testa role exempt.&lt;/p&gt;

&lt;p&gt;Testa quarentena.&lt;/p&gt;

&lt;p&gt;Run whatever tests you want, é bom. Melhor quebrar a configuração no canal de teste que descobrir o problema quando tiver 100 contas entrando.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que procurar em uma solução de moderação
&lt;/h2&gt;

&lt;p&gt;Se você não quer construir tudo manualmente, eu olharia isso antes de escolher uma ferramenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thresholds configuráveis
&lt;/h3&gt;

&lt;p&gt;Seu servidor não é igual ao servidor de outra pessoa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exceções granulares
&lt;/h3&gt;

&lt;p&gt;Usuário, cargo, canal e bot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Punições progressivas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;log
↓
timeout
↓
quarentena
↓
kick
↓
ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Antiraid separado
&lt;/h3&gt;

&lt;p&gt;Raid não é simplesmente spam mais rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antinuke
&lt;/h3&gt;

&lt;p&gt;Conta de administrador comprometida é outra classe de ameaça.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lockdown
&lt;/h3&gt;

&lt;p&gt;Você precisa conseguir mudar o estado do servidor rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logs que explicam a decisão
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Usuário punido&lt;/code&gt; não é log bom.&lt;/p&gt;

&lt;p&gt;Você quer saber qual sinal disparou.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ferramentas de recuperação
&lt;/h3&gt;

&lt;p&gt;Quando prevenção falhar, staff precisa conseguir limpar rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verificação configurável
&lt;/h3&gt;

&lt;p&gt;Nem toda comunidade precisa de CAPTCHA pesado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Onde o BetterAntispam entra nisso
&lt;/h2&gt;

&lt;p&gt;Eu trabalho no BetterAntispam e ele foi basicamente construído em volta dessa separação.&lt;/p&gt;

&lt;p&gt;Hoje ele tem antispam, antiraid, antinuke, verificação, lockdown e ferramentas de limpeza.&lt;/p&gt;

&lt;p&gt;O motivo de citar ele aqui não é falar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;esse é o melhor bot, instala agora&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso não ajuda muito quem está lendo.&lt;/p&gt;

&lt;p&gt;O interessante é que ele é uma implementação real das ideias acima.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spam
→ detector próprio

raid
→ análise de joins/perfis

nuke
→ ações administrativas

verificação
→ camada antes do acesso

lockdown
→ resposta global
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode implementar exatamente a mesma arquitetura no seu próprio bot com Node.js e discord.js.&lt;/p&gt;

&lt;p&gt;Na verdade detecta a biblioteca automaticamente dentro da sua própria aplicação se você tiver uma camada abstrata, usa os eventos que o wrapper já resolve e manda só os dados normalizados para os detectores.&lt;/p&gt;

&lt;p&gt;O detector não deveria precisar saber se o evento veio diretamente de discord.js ou de outra biblioteca.&lt;/p&gt;

&lt;p&gt;Ele só precisa receber:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;guildId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;timestamp&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa separação deixa muito mais fácil trocar implementação depois.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O objetivo de moderação automática não deveria ser bloquear o maior número possível de usuários.&lt;/p&gt;

&lt;p&gt;Isso é fácil.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ban todo mundo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, zero spam.&lt;/p&gt;

&lt;p&gt;Também zero comunidade.&lt;/p&gt;

&lt;p&gt;O problema interessante é pegar comportamento ruim enquanto usuário normal quase não percebe que o sistema existe.&lt;/p&gt;

&lt;p&gt;Usa AutoMod para o básico.&lt;/p&gt;

&lt;p&gt;Combina sinais em vez de confiar em um campo.&lt;/p&gt;

&lt;p&gt;Separa antispam de antiraid.&lt;/p&gt;

&lt;p&gt;Separa os dois de antinuke.&lt;/p&gt;

&lt;p&gt;Usa quarentena quando ainda existe dúvida.&lt;/p&gt;

&lt;p&gt;Mantém estado compartilhado se sua aplicação estiver distribuída.&lt;/p&gt;

&lt;p&gt;Respeita rate limits.&lt;/p&gt;

&lt;p&gt;E mede falso positivo.&lt;/p&gt;

&lt;p&gt;Porque uma ferramenta de segurança só é boa enquanto as pessoas legítimas conseguem continuar usando o sistema normalmente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.com/safety/auto-moderation-in-discord" rel="noopener noreferrer"&gt;Discord — Auto Moderation in Discord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.discord.com/hc/en-us/articles/10989121220631-How-to-Protect-Your-Server-from-Raids-101" rel="noopener noreferrer"&gt;Discord — How to Protect Your Server from Raids 101&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.discord.com/developers/topics/rate-limits" rel="noopener noreferrer"&gt;Discord Developer Documentation — Rate Limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.discord.com/developers/resources/audit-log" rel="noopener noreferrer"&gt;Discord Developer Documentation — Audit Logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://betterantispam.com" rel="noopener noreferrer"&gt;BetterAntispam&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Transparência:&lt;/strong&gt; eu trabalho no BetterAntispam, citado neste artigo como exemplo de implementação. O artigo foi produzido com assistência de IA e revisado para publicação. As ideias técnicas acima não dependem do BetterAntispam e podem ser aplicadas em qualquer bot ou sistema de moderação para Discord.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>discord</category>
      <category>node</category>
      <category>security</category>
    </item>
    <item>
      <title>How to Stop Spam and Raids in a Discord Server in 2026 (Without False Positives)</title>
      <dc:creator>Adam</dc:creator>
      <pubDate>Tue, 01 Sep 2026 13:55:36 +0000</pubDate>
      <link>https://dev.to/adamcle/how-to-stop-spam-and-raids-in-a-discord-server-in-2026-without-false-positives-39le</link>
      <guid>https://dev.to/adamcle/how-to-stop-spam-and-raids-in-a-discord-server-in-2026-without-false-positives-39le</guid>
      <description>&lt;h1&gt;
  
  
  How to Stop Spam and Raids in a Discord Server in 2026 (Without False Positives)
&lt;/h1&gt;

&lt;p&gt;Running a Discord server is easy until people actually start joining it.&lt;/p&gt;

&lt;p&gt;Then somebody sends the same crypto link 30 times, five new accounts join with basically the same username, somebody pings 40 members, and one compromised moderator decides deleting channels is a good idea.&lt;/p&gt;

&lt;p&gt;The obvious answer is automation. The problem is if you make automation too aggressive it starts punishing the people you're trying to protect.&lt;/p&gt;

&lt;p&gt;This guide covers how I think Discord antispam and antiraid should actually be configured in 2026 — what Discord already gives you, what should be automated, what shouldn't, and how to make multiple weak signals work together instead of banning somebody because they created their account yesterday.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Discord Moderation Gets Hard Once a Server Grows
&lt;/h2&gt;

&lt;p&gt;Spam isn't one thing.&lt;/p&gt;

&lt;p&gt;Someone sending:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;check this out&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;three times could be spam.&lt;/p&gt;

&lt;p&gt;Or they're just having a normal conversation.&lt;/p&gt;

&lt;p&gt;Someone joining with a Discord account created 20 minutes ago could be a raider.&lt;/p&gt;

&lt;p&gt;Or they literally just downloaded Discord.&lt;/p&gt;

&lt;p&gt;Someone having no profile picture could be suspicious.&lt;/p&gt;

&lt;p&gt;Or they didn't bother uploading one.&lt;/p&gt;

&lt;p&gt;That's the problem with moderation automation: most individual signals suck by themselves.&lt;/p&gt;

&lt;p&gt;What matters is what happens when several signals show up together.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;account created 15 minutes ago&lt;/li&gt;
&lt;li&gt;no avatar&lt;/li&gt;
&lt;li&gt;username similar to three other accounts&lt;/li&gt;
&lt;li&gt;joins during a sudden join spike&lt;/li&gt;
&lt;li&gt;immediately sends the same link&lt;/li&gt;
&lt;li&gt;repeats the message across several channels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you have something useful.&lt;/p&gt;

&lt;p&gt;Do not build your whole moderation strategy around one checkbox like "ban new accounts."&lt;/p&gt;

&lt;p&gt;Use signals together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Possible With Discord Already
&lt;/h2&gt;

&lt;p&gt;Discord's built-in AutoMod is actually good and you should use it.&lt;/p&gt;

&lt;p&gt;You can block keywords, excessive mentions and different forms of spam. You can also send alerts to your moderators instead of automatically punishing everybody.&lt;/p&gt;

&lt;p&gt;That last part matters.&lt;/p&gt;

&lt;p&gt;Not every rule needs to be:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;trigger → ban&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Some should be:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;trigger → block message&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Others:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;trigger → alert staff&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And stronger combinations:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;multiple triggers → quarantine&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Discord also has Slowmode, verification levels and its own raid detection systems.&lt;/p&gt;

&lt;p&gt;Use them.&lt;/p&gt;

&lt;p&gt;A third-party moderation bot shouldn't replace Discord's native protection for no reason. It should cover the stuff that needs more context, more customization or a server-wide response.&lt;/p&gt;

&lt;h2&gt;
  
  
  What No Moderation Bot Can Do Perfectly
&lt;/h2&gt;

&lt;p&gt;No bot can know somebody's intent with 100% certainty.&lt;/p&gt;

&lt;p&gt;It can know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how fast they are sending messages&lt;/li&gt;
&lt;li&gt;whether messages are similar&lt;/li&gt;
&lt;li&gt;when the account was created&lt;/li&gt;
&lt;li&gt;whether several accounts joined together&lt;/li&gt;
&lt;li&gt;what permissions somebody is using&lt;/li&gt;
&lt;li&gt;whether channels are suddenly being deleted&lt;/li&gt;
&lt;li&gt;whether the same links keep appearing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It cannot read somebody's mind.&lt;/p&gt;

&lt;p&gt;This is why I don't like moderation systems where one weak signal immediately causes a permanent punishment.&lt;/p&gt;

&lt;p&gt;A better model is basically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weak signal
+ weak signal
+ stronger signal
+ suspicious behavior
= take action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;new account
= ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Methods Compared: Three Ways to Handle Discord Spam and Raids
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Discord AutoMod Only
&lt;/h3&gt;

&lt;p&gt;For smaller servers this can honestly be enough.&lt;/p&gt;

&lt;p&gt;Turn on keyword filtering, mention spam protection and content spam protection. Add rules for whatever garbage regularly gets posted in your community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;built directly into Discord&lt;/li&gt;
&lt;li&gt;simple setup&lt;/li&gt;
&lt;li&gt;no additional bot dependency&lt;/li&gt;
&lt;li&gt;can block messages before members see them&lt;/li&gt;
&lt;li&gt;exemptions can be configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mostly focused on message-level behavior&lt;/li&gt;
&lt;li&gt;limited context between different kinds of suspicious behavior&lt;/li&gt;
&lt;li&gt;doesn't solve every raid situation&lt;/li&gt;
&lt;li&gt;doesn't protect you from a compromised moderator deleting everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Start here regardless of what other bot you use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2: Generic Moderation Bot
&lt;/h3&gt;

&lt;p&gt;The next option is a general moderation bot.&lt;/p&gt;

&lt;p&gt;These usually add warnings, bans, mutes, logs, slowmode commands and some form of antispam.&lt;/p&gt;

&lt;p&gt;This is fine if your problem is basic moderation.&lt;/p&gt;

&lt;p&gt;The issue starts when you want the bot to understand that ten suspicious joins, similar usernames, fresh accounts and repeated messages are probably connected instead of treating all of those events separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;convenient moderation commands&lt;/li&gt;
&lt;li&gt;usually easy to configure&lt;/li&gt;
&lt;li&gt;good for normal staff workflows&lt;/li&gt;
&lt;li&gt;logging and punishment history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;anti-raid may be basic&lt;/li&gt;
&lt;li&gt;antispam may just be message counting&lt;/li&gt;
&lt;li&gt;destructive staff actions may not be watched&lt;/li&gt;
&lt;li&gt;limited server-wide response when something actually goes wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Good for moderation. Not automatically good for security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 3: Layered Moderation
&lt;/h3&gt;

&lt;p&gt;This is what I prefer.&lt;/p&gt;

&lt;p&gt;Keep Discord AutoMod enabled and then put another moderation/security layer on top of it.&lt;/p&gt;

&lt;p&gt;BetterAntispam is one implementation of this idea.&lt;/p&gt;

&lt;p&gt;For example its antispam can look at similar messages and other spam behavior, while antiraid can look at join patterns and suspicious account characteristics.&lt;/p&gt;

&lt;p&gt;Then there is a separate antinuke system watching destructive actions like mass bans, channel deletion, role changes, webhooks and dangerous permission changes.&lt;/p&gt;

&lt;p&gt;Those are different problems so don't treat them as one giant "security" switch.&lt;/p&gt;

&lt;p&gt;You want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AutoMod
    ↓
message filtering

Antispam
    ↓
behavior across messages

Antiraid
    ↓
behavior across joins/accounts

Antinuke
    ↓
behavior from trusted/staff accounts

Verification
    ↓
friction before new members get access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives you separate controls for separate failure modes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Antiraid Should Actually Work
&lt;/h2&gt;

&lt;p&gt;I would not automatically ban somebody just because their account is new.&lt;/p&gt;

&lt;p&gt;Treat stuff like this as signals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fresh account             +10
No avatar                  +5
Similar username           +10
Rapid join wave            +20
Repeated spam              +25
Suspicious link behavior   +30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those numbers are just an example. The point is the structure.&lt;/p&gt;

&lt;p&gt;One weak signal doesn't matter much.&lt;/p&gt;

&lt;p&gt;Several signals together do.&lt;/p&gt;

&lt;p&gt;Then have response levels.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0-20
Allow

20-40
Watch / log

40-60
Quarantine

60+
Kick or ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact thresholds should depend on the server.&lt;/p&gt;

&lt;p&gt;A developer community where people frequently create new Discord accounts might need completely different thresholds from a crypto server getting hammered by scam accounts every day.&lt;/p&gt;

&lt;p&gt;Do not copy somebody else's threshold because they said it works.&lt;/p&gt;

&lt;p&gt;Tune it against your own traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quarantine Is Underrated
&lt;/h2&gt;

&lt;p&gt;Permanent bans are expensive when you're wrong.&lt;/p&gt;

&lt;p&gt;Quarantine is much easier.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;suspicious user → ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;suspicious user → remove dangerous access → log → staff review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then if the account starts clearly spamming you can escalate.&lt;/p&gt;

&lt;p&gt;This gives the system room to be slightly more sensitive without every false positive becoming a support problem.&lt;/p&gt;

&lt;p&gt;BetterAntispam has quarantine available across its antispam, antiraid and antinuke systems for basically this reason.&lt;/p&gt;

&lt;p&gt;You can catch something suspicious without immediately deciding that person should never be allowed back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antispam Needs Different Rules for Different Spam
&lt;/h2&gt;

&lt;p&gt;Do not use one number for everything.&lt;/p&gt;

&lt;p&gt;Ten emoji is not the same as ten links.&lt;/p&gt;

&lt;p&gt;Five messages in five seconds isn't necessarily the same as five nearly identical messages in five seconds.&lt;/p&gt;

&lt;p&gt;I would separate at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fast messages&lt;/li&gt;
&lt;li&gt;repeated messages&lt;/li&gt;
&lt;li&gt;excessive mentions&lt;/li&gt;
&lt;li&gt;links&lt;/li&gt;
&lt;li&gt;invites&lt;/li&gt;
&lt;li&gt;excessive capitalization&lt;/li&gt;
&lt;li&gt;extremely long messages&lt;/li&gt;
&lt;li&gt;ghost pings&lt;/li&gt;
&lt;li&gt;repeated bot commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then give the more dangerous behavior stronger responses.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Emoji spam
→ delete / warn

Repeated message spam
→ delete / timeout

Repeated suspicious links
→ block / quarantine

Mass mention spam
→ block immediately
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Context matters more than the raw count.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemptions Matter More Than People Think
&lt;/h2&gt;

&lt;p&gt;This is where a lot of antispam bots become annoying.&lt;/p&gt;

&lt;p&gt;Your logging bot might send ten similar messages.&lt;/p&gt;

&lt;p&gt;A ticket bot might repeatedly post the same template.&lt;/p&gt;

&lt;p&gt;A staff channel might intentionally contain links that would never be allowed in general chat.&lt;/p&gt;

&lt;p&gt;So exemptions need to work at several levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;li&gt;roles&lt;/li&gt;
&lt;li&gt;channels&lt;/li&gt;
&lt;li&gt;trusted domains&lt;/li&gt;
&lt;li&gt;bots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't turn protection off globally because one legitimate integration keeps triggering it.&lt;/p&gt;

&lt;p&gt;Exempt the integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antinuke Is a Different Problem
&lt;/h2&gt;

&lt;p&gt;Most moderation setups spend all their time worrying about random members.&lt;/p&gt;

&lt;p&gt;Meanwhile the account capable of doing the most damage is an administrator.&lt;/p&gt;

&lt;p&gt;If an admin account gets compromised, normal antispam does basically nothing.&lt;/p&gt;

&lt;p&gt;The account isn't spamming.&lt;/p&gt;

&lt;p&gt;It's doing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;delete channel
delete channel
delete channel
delete role
ban member
ban member
create webhook
change permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That needs completely different detection.&lt;/p&gt;

&lt;p&gt;Watch destructive actions over time and put limits on them.&lt;/p&gt;

&lt;p&gt;For example, somebody deleting one channel might be normal.&lt;/p&gt;

&lt;p&gt;Deleting fifteen channels in twenty seconds probably isn't.&lt;/p&gt;

&lt;p&gt;Same thing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bans&lt;/li&gt;
&lt;li&gt;kicks&lt;/li&gt;
&lt;li&gt;channel deletion&lt;/li&gt;
&lt;li&gt;role deletion&lt;/li&gt;
&lt;li&gt;bot additions&lt;/li&gt;
&lt;li&gt;webhook creation&lt;/li&gt;
&lt;li&gt;dangerous permission changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And again, different actions should have different limits.&lt;/p&gt;

&lt;p&gt;Granting Administrator can be more serious than deleting a temporary channel.&lt;/p&gt;

&lt;p&gt;Configure them separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Raid Mode Should Change the Whole Server
&lt;/h2&gt;

&lt;p&gt;Once you know a raid is actually happening, stop evaluating everything like normal traffic.&lt;/p&gt;

&lt;p&gt;You already know the environment changed.&lt;/p&gt;

&lt;p&gt;A good raid mode can temporarily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;increase antispam sensitivity&lt;/li&gt;
&lt;li&gt;restrict new members&lt;/li&gt;
&lt;li&gt;enable stronger verification&lt;/li&gt;
&lt;li&gt;apply Slowmode&lt;/li&gt;
&lt;li&gt;lock vulnerable channels&lt;/li&gt;
&lt;li&gt;quarantine suspicious joins&lt;/li&gt;
&lt;li&gt;alert staff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then return the server to normal once the event ends.&lt;/p&gt;

&lt;p&gt;This is better than leaving extremely strict settings enabled 24/7 because you're scared of the 10 minutes per month where somebody actually attacks the server.&lt;/p&gt;

&lt;p&gt;Normal mode should optimize for users.&lt;/p&gt;

&lt;p&gt;Raid mode should optimize for survival.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup Is Part of Raid Protection
&lt;/h2&gt;

&lt;p&gt;Stopping the raid isn't always the end.&lt;/p&gt;

&lt;p&gt;Sometimes you show up after 4,000 messages have already been dumped into three channels.&lt;/p&gt;

&lt;p&gt;Now somebody has to clean it.&lt;/p&gt;

&lt;p&gt;Discord itself describes raid cleanup as part of the moderation problem, and this is where bulk tools matter.&lt;/p&gt;

&lt;p&gt;BetterAntispam has &lt;code&gt;/nuke&lt;/code&gt; for channel cleanup and &lt;code&gt;/slowmodebulk&lt;/code&gt; for applying Slowmode across multiple channels.&lt;/p&gt;

&lt;p&gt;The important part isn't really the command name.&lt;/p&gt;

&lt;p&gt;The important part is having an emergency workflow where staff can go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detect raid
→ lock down
→ remove attackers
→ clean affected channels
→ return to normal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of manually deleting messages for two hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification Should Match the Threat
&lt;/h2&gt;

&lt;p&gt;Not every Discord server needs somebody solving a CAPTCHA before they can say hello.&lt;/p&gt;

&lt;p&gt;Adding friction for no reason hurts onboarding.&lt;/p&gt;

&lt;p&gt;But verification is useful when the server is regularly targeted.&lt;/p&gt;

&lt;p&gt;You can use increasingly stronger methods depending on what is happening:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Button
↓
Word challenge
↓
Math challenge
↓
Image CAPTCHA
↓
Web CAPTCHA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BetterAntispam supports those kinds of verification methods, but the bigger point is don't use the strongest verification just because it exists.&lt;/p&gt;

&lt;p&gt;Use enough friction to stop the attack you're actually seeing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Discord Moderation in 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Turn Discord AutoMod on first
&lt;/h3&gt;

&lt;p&gt;It's built into Discord. Use it.&lt;/p&gt;

&lt;p&gt;Let Discord handle obvious keyword and mention spam before asking another bot to solve everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Don't trust one signal
&lt;/h3&gt;

&lt;p&gt;Fresh account doesn't mean raider.&lt;/p&gt;

&lt;p&gt;No avatar doesn't mean raider.&lt;/p&gt;

&lt;p&gt;Joining quickly doesn't automatically mean raider.&lt;/p&gt;

&lt;p&gt;Several suspicious signals happening together is much more useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Quarantine before permanent punishment
&lt;/h3&gt;

&lt;p&gt;If your confidence isn't high enough for a ban then don't ban.&lt;/p&gt;

&lt;p&gt;Contain first.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Tune around false positives
&lt;/h3&gt;

&lt;p&gt;Keep logs.&lt;/p&gt;

&lt;p&gt;If legitimate users repeatedly trigger something, figure out why.&lt;/p&gt;

&lt;p&gt;Don't just tell everyone your moderation bot is never wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Separate antispam, antiraid and antinuke
&lt;/h3&gt;

&lt;p&gt;They're different attacks.&lt;/p&gt;

&lt;p&gt;Configure them differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Protect against your own staff accounts
&lt;/h3&gt;

&lt;p&gt;Compromised staff can destroy more than random spammers.&lt;/p&gt;

&lt;p&gt;Use 2FA and keep Administrator access limited.&lt;/p&gt;

&lt;p&gt;Then monitor destructive actions anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Have an emergency mode
&lt;/h3&gt;

&lt;p&gt;You shouldn't be changing 25 moderation settings manually while 100 accounts are joining.&lt;/p&gt;

&lt;p&gt;Have one raid mode or lockdown workflow ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Test everything
&lt;/h3&gt;

&lt;p&gt;Make a test channel.&lt;/p&gt;

&lt;p&gt;Send repeated messages.&lt;/p&gt;

&lt;p&gt;Try links.&lt;/p&gt;

&lt;p&gt;Try excessive mentions.&lt;/p&gt;

&lt;p&gt;Test exemptions.&lt;/p&gt;

&lt;p&gt;Test quarantine.&lt;/p&gt;

&lt;p&gt;Check what the logs actually look like.&lt;/p&gt;

&lt;p&gt;Run whatever tests you want it's good, just don't discover during an actual raid that your trusted role exemption doesn't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Setup Guide
&lt;/h2&gt;

&lt;p&gt;This is roughly the order I would configure a new server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Configure Discord AutoMod
&lt;/h3&gt;

&lt;p&gt;Turn on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mention spam protection&lt;/li&gt;
&lt;li&gt;content spam protection&lt;/li&gt;
&lt;li&gt;relevant keyword rules&lt;/li&gt;
&lt;li&gt;moderator alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't make every rule automatically punish users.&lt;/p&gt;

&lt;p&gt;Some should just alert you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Set your verification level
&lt;/h3&gt;

&lt;p&gt;Decide whether normal Discord verification is enough or whether your threat model justifies a challenge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add your moderation layer
&lt;/h3&gt;

&lt;p&gt;If you're using BetterAntispam, &lt;code&gt;/setup&lt;/code&gt; handles the main starting configuration and then open the individual settings for whatever needs tuning.&lt;/p&gt;

&lt;p&gt;Don't stop at the preset.&lt;/p&gt;

&lt;p&gt;Presets are starting points.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Configure antispam
&lt;/h3&gt;

&lt;p&gt;Set realistic limits for your community.&lt;/p&gt;

&lt;p&gt;Then exempt trusted roles, bots and channels that naturally behave differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Configure antiraid
&lt;/h3&gt;

&lt;p&gt;Start less aggressive.&lt;/p&gt;

&lt;p&gt;Log what would have triggered.&lt;/p&gt;

&lt;p&gt;Then increase enforcement once you know your normal join behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Configure antinuke
&lt;/h3&gt;

&lt;p&gt;This is the one I wouldn't skip.&lt;/p&gt;

&lt;p&gt;Set limits around destructive actions and allowlist the bots or staff accounts that legitimately perform bulk operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Test the response
&lt;/h3&gt;

&lt;p&gt;You should know exactly what happens when something triggers.&lt;/p&gt;

&lt;p&gt;Does the user get muted?&lt;/p&gt;

&lt;p&gt;Quarantined?&lt;/p&gt;

&lt;p&gt;Banned?&lt;/p&gt;

&lt;p&gt;Does staff receive a useful log?&lt;/p&gt;

&lt;p&gt;Can the action be reversed?&lt;/p&gt;

&lt;p&gt;Find out before you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Look for in a Discord Moderation Bot
&lt;/h2&gt;

&lt;p&gt;If you're comparing moderation bots I would care about this stuff more than the size of the feature list:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurable thresholds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your server isn't everybody else's server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role, channel and user exemptions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Otherwise legitimate automation becomes a false-positive machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Progressive punishments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Warn, timeout, quarantine, kick and ban should not all be treated like the same action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Join-pattern detection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Raids are usually bigger than one account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antinuke&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Member moderation doesn't protect you from compromised administrators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server lockdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need a way to change behavior quickly once an attack is confirmed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Useful logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"User punished" isn't enough.&lt;/p&gt;

&lt;p&gt;Tell staff what triggered it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleanup tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prevention will eventually fail somewhere. Have recovery commands ready.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Different servers need different amounts of friction.&lt;/p&gt;

&lt;p&gt;That is basically the list I would start with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The best Discord moderation setup isn't the one that bans the most people.&lt;/p&gt;

&lt;p&gt;It's the one that catches obviously malicious behavior while normal users barely notice it's running.&lt;/p&gt;

&lt;p&gt;Use Discord's native tools.&lt;/p&gt;

&lt;p&gt;Add another moderation layer when you actually need more context.&lt;/p&gt;

&lt;p&gt;Let weak signals combine instead of pretending one field tells you everything.&lt;/p&gt;

&lt;p&gt;Quarantine when you're unsure.&lt;/p&gt;

&lt;p&gt;Ban when you're sure.&lt;/p&gt;

&lt;p&gt;And have raid mode, antinuke and cleanup ready before the day you actually need them.&lt;/p&gt;

&lt;p&gt;If you're using BetterAntispam, &lt;code&gt;/setup&lt;/code&gt; is a reasonable starting point, but go through the individual antispam, antiraid and antinuke settings afterward. The defaults can't know what normal behavior looks like inside your server.&lt;/p&gt;

&lt;p&gt;That part is still your job.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I work on BetterAntispam. I used it here as an implementation example because these are the moderation problems we're actively working on. The general configuration advice applies whether you use BetterAntispam, another moderation bot or just Discord's built-in tools.&lt;/p&gt;

</description>
      <category>discord</category>
      <category>security</category>
      <category>discordbots</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
