Como Corrigir o Erro 40060 do Discord: Interação Já Foi Reconhecida
🔍 WiseChecker

Como Corrigir o Erro 40060 do Discord: Interação Já Foi Reconhecida

O erro 40060 do Discord aparece quando um bot ou aplicativo tenta responder a um comando de barra ou interação de botão que já recebeu uma resposta. Isso acontece porque o Discord impõe uma regra estrita de reconhecimento único para interações. Cada interação, como um comando de barra ou um clique em botão, só pode ser reconhecida uma vez. Quando um bot tenta adiar, atualizar ou dar continuidade a uma interação que já foi reconhecida, o Discord retorna o erro 40060. Este artigo explica a causa técnica desse erro e fornece etapas claras para corrigi-lo ajustando o código do bot ou as configurações do servidor.

Principais Conclusões: Corrigindo o Erro 40060 do Discord para Desenvolvedores de Bots

  • Regras de reconhecimento de interação na API do Discord: Cada interação pode ser reconhecida apenas uma vez usando deferReply(), reply() ou update(). Chamar esses métodos mais de uma vez aciona o erro 40060.
  • Usando a propriedade isAcknowledged no discord.js: Verifique interaction.isAcknowledged antes de chamar métodos de reconhecimento para evitar chamadas duplicadas.
  • Usando editReply() e followUp() corretamente: Após adiar, use editReply() para editar a mensagem adiada e followUp() para enviar mensagens adicionais sem reconhecer novamente.

ADVERTISEMENT

Por que o Erro 40060 do Discord Ocorre

As interações do Discord seguem um ciclo de vida específico. Quando um usuário envia um comando de barra ou clica em um botão, o Discord envia um objeto de interação para o seu bot. Seu bot deve reconhecer essa interação em até 3 segundos usando um destes métodos:

  • interaction.reply() – Envia uma resposta e reconhece a interação.
  • interaction.deferReply() – Reconhece a interação sem enviar uma mensagem ainda, dando até 15 minutos para responder.
  • interaction.update() – Atualiza a mensagem original de uma interação de componente e a reconhece.

Assim que qualquer um desses métodos é chamado, a interação é marcada como reconhecida. Chamar qualquer método de reconhecimento uma segunda vez no mesmo objeto de interação faz com que o Discord rejeite a solicitação e retorne o erro 40060. Os cenários mais comuns que acionam esse erro são:

  • Chamar reply() após já ter chamado deferReply().
  • Chamar deferReply() duas vezes no mesmo manipulador.
  • Chamar update() após já ter reconhecido uma interação de botão com deferUpdate().
  • Usar editReply() antes de reconhecer a interação.

Etapas para Corrigir o Erro 40060 no Código do Seu Bot

A correção depende da biblioteca que você usa. Os exemplos abaixo usam discord.js v14, mas a lógica se aplica a qualquer biblioteca do Discord.

Método 1: Verificar interaction.isAcknowledged Antes de Reconhecer

Antes de chamar qualquer método de reconhecimento, verifique se a interação já foi reconhecida usando a propriedade interna.

  1. Adicione uma condição de guarda no início do manipulador de interação
    Insira esta verificação no topo do seu ouvinte de evento interactionCreate: if (interaction.isAcknowledged) return; Isso impede que qualquer código de reconhecimento adicional seja executado se a interação já foi tratada por outra parte do seu código.
  2. Use a guarda antes de cada chamada de reconhecimento
    Envolva cada chamada de reply(), deferReply() ou update() dentro de um bloco if (!interaction.isAcknowledged). Exemplo: if (!interaction.isAcknowledged) await interaction.deferReply();

Método 2: Usar editReply() Após Adiar

Se você chamar deferReply() primeiro, deve usar editReply() para modificar a resposta adiada. Não chame reply() após adiar.

  1. Chame deferReply() uma vez
    No início do manipulador do comando, chame await interaction.deferReply(); Isso reconhece a interação e dá 15 minutos para responder.
  2. Use editReply() para enviar a resposta final
    Após executar sua lógica, chame await interaction.editReply('Sua mensagem aqui'); Não chame reply() novamente.

Método 3: Usar followUp() para Mensagens Adicionais

Após reconhecer uma interação com reply() ou deferReply(), você pode enviar mensagens extras usando followUp() sem reconhecer novamente.

  1. Reconheça a interação
    Chame await interaction.reply('Primeira resposta'); ou await interaction.deferReply();
  2. Envie mensagens de acompanhamento
    Chame await interaction.followUp('Mensagem adicional'); Isso funciona independentemente de você ter usado reply() ou deferReply() para o reconhecimento inicial.

Método 4: Revise Seu Código em Busca de Reconhecimentos Duplicados

Às vezes, o erro 40060 ocorre porque o mesmo manipulador de interação é executado várias vezes, especialmente em envios de modal ou coletores de botão.

  1. Verifique loops ou chamadas recursivas
    Certifique-se de que seu ouvinte de evento interactionCreate não chame a si mesmo. Se você usar um MessageComponentCollector, verifique se o evento collect do coletor não aciona o mesmo manipulador que criou o coletor.
  2. Adicione uma verificação de identificador único
    Armazene o ID da interação em um Set e pule o processamento se o ID já existir. Exemplo: if (processedInteractions.has(interaction.id)) return; processedInteractions.add(interaction.id);

ADVERTISEMENT

Se o Erro 40060 do Discord Persistir Após as Correções no Código

O Bot Usa uma Versão Desatualizada da Biblioteca

Versões antigas do discord.js ou de outras bibliotecas podem não tratar corretamente os estados de reconhecimento de interação. Atualize sua biblioteca para a versão estável mais recente. Para discord.js, execute npm install discord.js@latest na pasta do projeto do seu bot.

Coletor de Interação Ainda em Execução Após o Reconhecimento

Se você usa awaitInteractionReply() ou um coletor de envio de modal, o coletor pode tentar reconhecer a mesma interação duas vezes. Pare o coletor após o primeiro reconhecimento usando collector.stop() ou defina um filter que rejeite interações já tratadas.

Múltiplas Instâncias do Bot Respondendo à Mesma Interação

Se o seu bot é executado em vários processos ou servidores, duas instâncias podem tentar reconhecer a mesma interação. Use um armazenamento de estado compartilhado como Redis para rastrear qual instância reconheceu cada interação. Alternativamente, use o interaction.token do Discord para desduplicar em um banco de dados central.

Item Abordagem Correta Abordagem Incorreta
Após deferReply() Use editReply() para enviar resposta Chamar reply() novamente
Após reply() Use followUp() para mensagens extras Chamar deferReply() ou reply() novamente
Antes de qualquer reconhecimento Verifique interaction.isAcknowledged Presumir que a interação não foi reconhecida
Múltiplas instâncias do bot Use armazenamento de estado compartilhado Deixar cada instância responder independentemente

Após aplicar essas correções, o erro 40060 não deve mais aparecer nos logs do seu bot. Teste cada comando e interação de botão para confirmar que o fluxo de reconhecimento funciona corretamente. Para depuração avançada, ative os eventos de gateway do Discord para criação de interação e registre o status de reconhecimento em cada etapa. Isso ajuda a identificar chamadas duplicadas inesperadas em cadeias de interação complexas.

ADVERTISEMENT