【问题标题】:Collect reaction from dm message triggered by 'guildMemberAdd'从 'guildMemberAdd' 触发的 dm 消息中收集反应
【发布时间】:2022-01-06 18:39:52
【问题描述】:

当有新成员加入公会时,我的机器人会发送一条消息。消息发送给特定用户。

    client.on('guildMemberAdd', member => {
    const adminDm = client.users.cache.get(Config.get('ADMIN'));
    client.commands.get('novoMembro').execute(member, adminDm);
}); 

现在我需要收集反应,以便为新成员分配一些角色。

const Discord = require('discord.js');

module.exports = {
    name: 'novoMembro',
    description: "Adding a new member to the guild",
    execute(member, adminDm){
        const novoMembroEmbed = new Discord.MessageEmbed()
        .setColor([153,0,76])
        .setTitle('NOVO MEMBRO ADICIONADO')
        .setDescription(`<@!${member.id}> foi adicionado`)
        .addFields( 
            {name: 'Selecione uma opção:', value: 'Reaja com ???? para enviar mensagem de boas vindas \n Reaja com ❌ para cancelar'},
        );

        adminDm.send({ embeds: [novoMembroEmbed] }).then((msg => {
            msg.react('❌');
            msg.react('????');
        }));
        
       
    }
}

到目前为止,代码工作正常。但是我找不到收集反应的方法,我尝试过的每个代码都不起作用。我想我没有正确理解收集反应的概念。 这些是我尝试过的一些代码。

const filter = (reaction) => ['❌', '????'].includes(reaction.emoji.name);
const reactOptions = {maxEmojis: 1};

.then(() => msg.awaitReactions(filter, reactOptions)).then(collected => {
                if (collected.first().emoji.name === '????') {
                    console.log('msg de boas vindas');
                }else{
                    console.log('cancelando');
                }

【问题讨论】:

    标签: javascript node.js discord.js bots


    【解决方案1】:

    您的代码有几个错误。在 discord.js v13 中,awaitReactionscreateReactionCollector 接受单个参数,filter 现在是 options 对象的一部分。 (见Changes in v13。)所以,你需要更新它;使用filtermaxmaxEmojis 键传递单个对象。

    您还需要更新您的filter,因为它目前也收集机器人的反应。通过检查做出反应的用户是否与管理员相同,您可以确保只收集您需要的反应。

    您也可以使 execute 异步并使用 await 关键字等待 promise 被解析。

    还有最后一件事;确保您启用了所需的意图:DIRECT_MESSAGESDIRECT_MESSAGE_REACTIONS

    查看以下代码:

    module.exports = {
      name: 'novoMembro',
      description: 'Adding a new member to the guild',
      async execute(member, admin) {
        const novoMembroEmbed = new Discord.MessageEmbed()
          .setColor([153, 0, 76])
          .setTitle('NOVO MEMBRO ADICIONADO')
          .setDescription(`<@!${member.id}> foi adicionado`)
          .addFields({
            name: 'Selecione uma opção:',
            value:
              'Reaja com ? para enviar mensagem de boas vindas \n Reaja com ❌ para cancelar',
          });
    
        try {
          const sentDM = await admin.send({ embeds: [novoMembroEmbed] });
          // make sure you don't collect the bot's reactions
          const filter = (reaction, user) =>
            ['❌', '?'].includes(reaction.emoji.name) && user.id === admin.id;
    
          sentDM.react('❌');
          sentDM.react('?');
    
          // add a single options object only
          const collected = await sentDM.awaitReactions({ filter, maxEmojis: 1 });
    
          if (collected.first().emoji.name === '?') {
            admin.send('msg de boas vindas');
          } else {
            admin.send('cancelando');
          }
        } catch (err) {
          console.log(err);
        }
      },
    };
    

    【讨论】:

    • 谢谢。它也缺少 Intents.FLAGS.DIRECT_MESSAGE_REACTIONS。现在是 100%
    • 不客气。如果这个答案有用,请点击它左边的upvote按钮(▲)。如果它回答了您的问题,请单击复选标记 (✓) 接受它。这样其他人就会知道这个解决方案有效。见What should I do when someone answers my question?
    猜你喜欢
    • 2019-12-18
    • 2020-05-07
    • 2019-11-25
    • 2020-11-05
    • 2021-10-17
    • 2020-06-13
    • 2019-06-01
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多