Corrigir Menu de Seleção do Bot do Discord Sem Opções Mesmo com Escolhas Definidas
🔍 WiseChecker

Corrigir Menu de Seleção do Bot do Discord Sem Opções Mesmo com Escolhas Definidas

Você criou um bot do Discord com um componente de menu de seleção, definiu as escolhas no código, mas quando os usuários interagem com o menu, ele não mostra opções. Esse problema geralmente ocorre devido a uma incompatibilidade entre o ID personalizado que seu código envia e o que o manipulador de interação escuta, ou porque o array de opções não está formatado corretamente para a API do Discord. Este artigo explica as causas raiz desse problema e fornece correções passo a passo para os cenários mais comuns.

Principais Conclusões: Corrigindo um Menu de Seleção do Bot do Discord Sem Opções

  • Incompatibilidade de ID Personalizado no Componente e no Coletor: Certifique-se de que o custom_id no seu menu de seleção corresponda exatamente no construtor do componente e no coletor de interação.
  • Erro de Formatação do Array de Opções: Cada opção deve incluir os campos label, value e description; a falta de qualquer campo faz com que o Discord descarte todo o menu.
  • Coletor Não Está Ouvindo o Tipo de Componente Correto: Use ComponentType.SelectMenu ou a string ‘select_menu’ ao configurar o filtro do coletor.

ADVERTISEMENT

Por que os Menus de Seleção do Bot do Discord Não Mostram Opções

O componente de menu de seleção do Discord requer um objeto JSON formatado corretamente com um array de opções. Cada opção deve conter pelo menos um label e um value. Se alguma opção estiver faltando um campo obrigatório, ou se o array estiver vazio, o Discord renderizará o menu sem itens selecionáveis. Além disso, o coletor de interação deve ser configurado para ouvir o ID personalizado exato que você enviou com a mensagem. Uma incompatibilidade no ID personalizado ou no tipo de componente impedirá que o menu seja reconhecido, resultando em um menu suspenso vazio.

O ID Personalizado Deve Ser Único e Consistente

Cada menu de seleção que você enviar deve ter uma string custom_id única. Se você reutilizar o mesmo custom_id em várias mensagens, o Discord pode armazenar em cache a primeira versão e ignorar as posteriores. Mais comumente, os desenvolvedores definem o custom_id no construtor do componente, mas esquecem de correspondê-lo na função de filtro do coletor. O coletor então aguardará uma interação com um custom_id diferente, e o menu parecerá não ter opções porque o bot nunca processa a interação.

O Array de Opções Deve Seguir as Regras da API do Discord

A API do Discord exige que cada opção no menu de seleção seja um objeto com pelo menos os seguintes campos: label (string, máximo 100 caracteres), value (string, máximo 100 caracteres) e description (string, máximo 100 caracteres). O campo description é opcional, mas recomendado. Se alguma opção não tiver label ou value, ou se o label for maior que 100 caracteres, o Discord rejeitará todo o menu e não exibirá opções. O array em si deve conter pelo menos uma opção válida; um array vazio também resulta em nenhuma opção exibida.

Passos para Corrigir o Menu de Seleção que Não Mostra Opções

Siga estes passos em ordem. Após cada passo, teste o bot enviando o menu de seleção novamente. Use um servidor de teste com apenas seu bot para evitar confusão com outros bots.

  1. Verifique o Array de Opções no Seu Código
    Abra o arquivo onde você constrói o componente do menu de seleção. Verifique se cada objeto de opção tem um label e um value. Por exemplo, no discord.js: new SelectMenuOptionBuilder().setLabel('Opção 1').setValue('opt1'). Se você usar JSON bruto, certifique-se de que o array se pareça com [{"label":"Opção 1","value":"opt1"}]. Adicione um console.log do array de opções antes de enviar para confirmar que não está vazio.
  2. Verifique o ID Personalizado no Componente e no Coletor
    Localize onde você cria o componente do menu de seleção. Anote a string exata usada para setCustomId(). Em seguida, encontre o coletor ou manipulador de interação. A função de filtro deve verificar o mesmo custom_id. Por exemplo, se seu componente usa setCustomId('role_menu'), o filtro do coletor deve ser interaction.customId === 'role_menu'. Se eles diferirem, altere um para corresponder.
  3. Certifique-se de que o Coletor Escuta o Tipo de Componente Correto
    Na configuração do seu coletor, o filtro deve verificar o tipo de componente. Para um menu de seleção, use ComponentType.SelectMenu (ou componentType: 'SELECT_MENU' dependendo da sua biblioteca). Se você usar ComponentType.Button por engano, o coletor ignorará completamente as interações do menu de seleção. Atualize o filtro para corresponder ao tipo de componente que você está enviando.
  4. Teste com um Exemplo Mínimo
    Crie um comando de teste simples que envia um menu de seleção com exatamente duas opções fixas. Use um novo custom_id, por exemplo test_menu_123. No coletor, filtre por esse custom_id exato. Se o menu mostrar opções, o problema está no seu código original. Se ainda não mostrar opções, o problema está na versão da biblioteca do seu bot ou nas permissões do token.
  5. Atualize Sua Biblioteca do Bot do Discord
    Bibliotecas desatualizadas podem não suportar a API atual do Discord para menus de seleção. Para discord.js, atualize para a versão 14 ou posterior. Execute npm list discord.js para verificar sua versão. Se estiver abaixo de 14, atualize com npm install discord.js@latest. Para outras linguagens, verifique a documentação da biblioteca para suporte a menus de seleção.

ADVERTISEMENT

Se o Menu de Seleção Ainda Não Tiver Opções Após a Correção Principal

Se você verificou o array de opções e o ID personalizado, mas o menu permanece vazio, considere estes cenários adicionais.

O Bot Não Tem a Permissão ‘Usar Emojis Externos’ no Servidor

Se você usar emojis personalizados nos labels das opções, o Discord exige que o bot tenha a permissão ‘Usar Emojis Externos’ no canal onde o menu de seleção é enviado. Sem essa permissão, todo o menu pode falhar ao renderizar. Remova qualquer emoji personalizado dos labels das opções ou conceda ao bot a permissão necessária em Configurações do Servidor > Cargos.

O Array de Opções Contém Valores Duplicados

O Discord não permite valores duplicados em um único menu de seleção. Se duas opções tiverem o mesmo valor string, a API rejeitará o menu. Certifique-se de que cada opção tenha um valor único. Use um console log para imprimir o array de valores e verificar duplicatas.

Menu de Seleção Enviado em uma Mensagem Efêmera que Expirou

Mensagens efêmeras são temporárias. Se você enviar um menu de seleção como resposta efêmera e o usuário esperar muito tempo, a mensagem pode expirar antes que a interação seja processada. Use uma mensagem normal ou estenda o limite de tempo do coletor. Por exemplo, no discord.js defina time: 60000 para um coletor de 60 segundos.

Comparação de Opções de Menu de Seleção em Bibliotecas de Bot do Discord

Item discord.js v14 discord.py v2
Construtor do Componente SelectMenuBuilder().setCustomId(‘id’).addOptions(…) discord.ui.Select(custom_id=’id’, options=[…])
Formato da Opção SelectMenuOptionBuilder().setLabel(‘L’).setValue(‘V’) discord.SelectOption(label=’L’, value=’V’)
Filtro do Coletor filter: i => i.customId === ‘id’ Classe View com callback on_select
Verificação do Tipo de Componente ComponentType.SelectMenu Não necessário em View

Após aplicar as correções acima, o menu de seleção do seu bot do Discord deve exibir as opções definidas. Sempre teste com um exemplo mínimo primeiro para isolar o problema. Para menus complexos, registre o array de opções e o ID personalizado no console para confirmar que correspondem ao que o Discord espera. Use a documentação mais recente da biblioteca para garantir compatibilidade com a versão atual da API do Discord.

ADVERTISEMENT