Estoy creando un bot de Discord y uno de mis comandos tiene un menú de selección. Pero parece que no puedo entender cómo tener una respuesta diferente a las diferentes opciones.
Aquí está el código para la interacción crear
client.on('interactionCreate', async (click) => { if (!click.isSelectMenu() || click.user.id != interaction.user.id || click.guildId != interaction.guildId) return; });Entonces, quiero responder a las diferentes opciones en mi comando. Una forma que creo que funcionaría sería:
if (click.values[0]) { // do something } else if (click.values[1]) { // do something else } Pero esto hizo la acción en click.values[0] cada vez.
En los documentos, también encontré una función llamada .createMessageComponentCollector , pero esto solo funciona para message y, dado que estoy usando comandos de barra, esto no está definido.
¿Cómo debo hacer esto en su lugar?
Hay algunas cosas sobre las que me gustaría señalarte
Cada menú de selección tiene un customId , por lo que cuando se usa el evento interactionCreate , siempre se recomienda tener el ID filtrando otras interacciones del menú de selección.
Luego viene click.values , devuelve una matriz de valores Suponiendo que su menú de selección proporciona selecciones múltiples, es bueno recorrer los valores en lugar de revisarlos manualmente a menos que haya una necesidad específica para eso
La razón por la que click.values[0] es verdadero siempre es porque cada vez que un usuario selecciona 1 o más valores, siempre tendrá el primero. Permítanme explicarlo con un ejemplo.
const array = ['foo', 'bar']; // here your array has 2 elements // array[0] will always be true because Boolean(non empty string) always truthy // so your "else if" will never reach because first if is never falseFinalmente, para el recopilador, puede crear un recopilador en las interacciones después de obtener el ejemplo.
const reply = await interaction.reply({ content: 'Some content', fetchReply: true }); // now reply is fetched and is of type Message or APIMessage // you can now create a collector on it as documentation tellsNota: No se recomienda crear un recopilador para algo que dura mucho tiempo (los recopiladores son de corta duración). Por ejemplo, no debe usar recopiladores para funciones de menú seleccionadas, ya que los recopiladores no se quedan si su bot se reinicia, en su lugar, use el evento interacciónCrear para estos eventos prolongados. o nunca detener componentes como botones/menús de selección
¡Espero que te haya ayudado!
Aquí está lo básico de un coleccionista.
client.on("interactionCreate", async (interaction) => { if (interaction.isSelectMenu()) { if (interaction.customId !== 'test') return; // If you have more that one select menu in code const filter = (selectInteraction) => { i.user.id === '123456789'; // add/remove filters according to your needs }; const collector = interaction.channel.createMessageComponentCollector({ filter, time: 10000 //in ms max: 1 }); collector.on('collect', async i => { if (i.customId === 'testid') { const value = i.values[0] if (value === 'first_value') { // your code here } if (value === 'second_value') { // your code here } }); collector.on('end', () => { // your code console.log('test') }) })Más información sobre coleccionistas