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()ouupdate(). Chamar esses métodos mais de uma vez aciona o erro 40060. - Usando a propriedade
isAcknowledgedno discord.js: Verifiqueinteraction.isAcknowledgedantes de chamar métodos de reconhecimento para evitar chamadas duplicadas. - Usando
editReply()efollowUp()corretamente: Após adiar, useeditReply()para editar a mensagem adiada efollowUp()para enviar mensagens adicionais sem reconhecer novamente.
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 chamadodeferReply(). - Chamar
deferReply()duas vezes no mesmo manipulador. - Chamar
update()após já ter reconhecido uma interação de botão comdeferUpdate(). - 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.
- Adicione uma condição de guarda no início do manipulador de interação
Insira esta verificação no topo do seu ouvinte de eventointeractionCreate: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. - Use a guarda antes de cada chamada de reconhecimento
Envolva cada chamada dereply(),deferReply()ouupdate()dentro de um blocoif (!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.
- Chame
deferReply()uma vez
No início do manipulador do comando, chameawait interaction.deferReply();Isso reconhece a interação e dá 15 minutos para responder. - Use
editReply()para enviar a resposta final
Após executar sua lógica, chameawait interaction.editReply('Sua mensagem aqui');Não chamereply()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.
- Reconheça a interação
Chameawait interaction.reply('Primeira resposta');ouawait interaction.deferReply(); - Envie mensagens de acompanhamento
Chameawait interaction.followUp('Mensagem adicional');Isso funciona independentemente de você ter usadoreply()oudeferReply()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.
- Verifique loops ou chamadas recursivas
Certifique-se de que seu ouvinte de eventointeractionCreatenão chame a si mesmo. Se você usar umMessageComponentCollector, verifique se o eventocollectdo coletor não aciona o mesmo manipulador que criou o coletor. - 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);
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.