【问题标题】:Having trouble with awaitReactionsawaitReactions 遇到问题
【发布时间】:2021-02-01 03:13:52
【问题描述】:

我想制作一个供词机器人,将供词发送到私人群组,以便在将其发送到公共频道之前对其进行审查。但我想不出一种使用 awaitReactions 的方法。

const discord = require("discord.js");

module.exports = {
    name: 'confessions',
    description: "comando para as pessoas confessarem anonimamente",
    
    execute(message, args) {
        let cf = args.join(' ')
        message.delete()
        const cfAdm = message.guild.channels.cache.get('767082831205367809')
        let embed = new discord.MessageEmbed()
            .setTitle('**CONFISSÃO**')
            .setDescription(cf)
            .setColor('#000000')
        cfAdm.send(embed)
            .then(function (message) {
                message.react('????').then(() => message.react('????'));
            });
    }
}

这个想法是:有人发送供词,机器人将其删除并将其发送到只有管理员才能看到的频道。然后任何一位管理员都可以通过对竖起或向下做出反应来接受或拒绝它。如果认罪被接受,则进入公开认罪频道,如果不是,则该人应该收到一条私信,说他们的认罪被拒绝。

如果有人对如何使 awaitReactions 以这种方式工作有一些想法(或者如果您有更好的想法),我们将不胜感激。

在此先感谢您,对任何不好的英语表示抱歉。

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:

    我不能 100% 确定我的代码中的这个小 sn-p 是否会对您有所帮助,但我希望它会。也有更好的方法来做到这一点,但我喜欢用艰难的方式来做。

    const { promptMessage } = require("../../functions.js");
    await message.channel.send(embed).then(async msg => {
        const emoji = await promptMessage(msg, message.author, 30, ["✅", "❌"]);
            // Check, if emoji ->
                if (emoji === "✅") {
                    //do stuff
      }}
    

    这意味着在我的示例中,您还需要创建 functions.js 文件,即

    module.exports = {
        getMember: function(message, toFind = '') {
            toFind = toFind.toLowerCase();
    
            let target = message.guild.members.get(toFind);
            
            if (!target && message.mentions.members)
                target = message.mentions.members.first();
    
            if (!target && toFind) {
                target = message.guild.members.find(member => {
                    return member.displayName.toLowerCase().includes(toFind) ||
                    member.user.tag.toLowerCase().includes(toFind)
                });
            }
                
            if (!target) 
                target = message.member;
                
            return target;
        },
    
        formatDate: function(date) {
            return new Intl.DateTimeFormat('en-US').format(date)
        },
    
        promptMessage: async function (message, author, time, validReactions) {
            // We put in the time as seconds, with this it's being transfered to MS
            time *= 1000;
    
            // For every emoji in the function parameters, react in the good order.
            for (const reaction of validReactions) await message.react(reaction);
    
            // Only allow reactions from the author, 
            // and the emoji must be in the array we provided.
            const filter = (reaction, user) => validReactions.includes(reaction.emoji.name) && user.id === author.id;
    
            // And ofcourse, await the reactions
            return message
                .awaitReactions(filter, { max: 1, time: time})
                .then(collected => collected.first() && collected.first().emoji.name);
        }
    };
    

    【讨论】:

      【解决方案2】:

      说明

      参数

      awaitReactionsfilteroptions 作为参数。

      filter是判断user完成的reaction是否需要收集的函数。
      例如,您只想收集 ? 或 ? 而忽略其他反应,例如 ?。因此,您的过滤器可能是这样的:

      const filter = (reaction, user) => ['?', '?'].includes(reaction.emoji.name);
      

      options 是确定何时停止收集反应的选项。
      3 configurable parameters

      • max:收集的最大反应总量
      • maxEmojis: 表情收集的最大数量
      • maxUsers:最大反应用户数

      在您的情况下,您只想收集一个(有效)表情符号来确定是否应将帖子发布到公共频道。因此,您可能希望将您的 options 设置为:

      const options = {
        maxEmojis: 1, // stop collecting if any 1 valid emoji is collected
      }
      

      返回值

      awaitReactions 返回一个 Promise,该 Promise 在收集完成时解决,并返回收集到的反应的 Collection
      对你来说,因为你只关心第一反应,所以你只需要查看集合collected.first()中的第一反应,并确定是否将消息发送到公共频道。因此,处理程序将是:

      collected => {
        if (collected.first().emoji.name === '?') {
          // send the message to the public channel
        }
      }
      

      结论

      结合以上,你可以像这样使用awaitReactions

      execute(message, args) {
        let cf = args.join(' ')
        message.delete()
        const cfAdm = message.guild.channels.cache.get('767082831205367809')
        let embed = new discord.MessageEmbed()
          .setTitle('**CONFISSÃO**')
          .setDescription(cf)
          .setColor('#000000')
      
        const filter = (reaction, user) => ['?', '?'].includes(reaction.emoji.name);
        const reactOptions = {maxEmojis: 1};
        
        cfAdm.send(embed)
        .then(function (message) {
          message.react('?')
          .then(() => message.react('?'))
          /**** start collecting reacts ****/
          .then(() => message.awaitReactions(filter, reactOptions))
          /**** collection finished! ****/
          .then(collected => {
            if (collected.first().emoji.name === '?') {
              // send the message to the public channel
            }
          })
        });
      }
      

      或者你可以使用 async/await 来简化代码:

      async execute(message, args) {
        let cf = args.join(' ')
        message.delete()
        const cfAdm = message.guild.channels.cache.get('767082831205367809')
        let embed = new discord.MessageEmbed()
          .setTitle('**CONFISSÃO**')
          .setDescription(cf)
          .setColor('#000000')
      
        const filter = (reaction, user) => ['?', '?'].includes(reaction.emoji.name);
        const reactOptions = {maxEmojis: 1};
        
        const messageReact = await cfAdm.send(embed);
        await messageReact.react('?');
        await messageReact.react('?');
        /**** collect reacts ****/
        const collected = await messageReact.awaitReactions(filter, reactOptions);
        /**** determine whether to post message or not ****/
        if (collected.first().emoji.name === '?') {
          // send `message` to the public channel
        }
      }
      

      希望这足够清楚,可以理解:)

      【讨论】:

      • 伙计,你不仅帮了我,而且还给了我一些想法。感激不尽
      • 很高兴听到这个消息!我建议阅读官方文档,尝试示例,并尝试猜测示例要做什么。刚开始可能很难,但经过一些经验,它会非常有用。 (事实上​​,在尝试回答您的问题之前,我对awaitReactions一无所知!)希望您的发展顺利:)
      猜你喜欢
      • 2014-11-30
      • 2021-08-09
      • 2017-05-02
      • 2012-10-31
      • 2019-07-26
      • 2018-01-07
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多