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.
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.
- 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. - 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 parasetCustomId(). 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 usasetCustomId('role_menu'), o filtro do coletor deve serinteraction.customId === 'role_menu'. Se eles diferirem, altere um para corresponder. - 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, useComponentType.SelectMenu(oucomponentType: 'SELECT_MENU'dependendo da sua biblioteca). Se você usarComponentType.Buttonpor 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. - 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 exemplotest_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. - 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. Executenpm list discord.jspara verificar sua versão. Se estiver abaixo de 14, atualize comnpm install discord.js@latest. Para outras linguagens, verifique a documentação da biblioteca para suporte a menus de seleção.
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.