Discord收集器反应过滤器设置最大限制的方式

Posted

技术标签:

【中文标题】Discord收集器反应过滤器设置最大限制的方式【英文标题】:Discord collector reaction filter way to set a max limit 【发布时间】:2021-10-04 12:05:00 【问题描述】:

我正在执行一个命令来翻译每条对标志表情符号的语言有某种反应的消息(用户反应的那个)。

但我希望机器人只为一种语言翻译一次(如果有两个用户对 us 标志做出反应,它只会将消息翻译成英文一次)。

我可以使用反应过滤器,但在我的情况下,为了获得更好的代码,我使用的是 switch 语句,所以如果我在反应过滤器中使用 max 属性,我将无法多次翻译 a消息(仅一次)。

这是我的代码:

bot.on('message', async (msg) => 
  const reactionFilter = (reaction, user) => 
    return msg.author.id !== '724682218454253588';
  ;
  collector = msg.createReactionCollector(reactionFilter);

  collector.on('collect', async (reaction, user) => 
    switch (reaction.emoji.name) 
      case '????????':
        TranslateMessage(msg, 'fr');
        break;
      case '????????':
        TranslateMessage(msg, 'en');
        break;
      case '????????':
        TranslateMessage(msg, 'de');
        break;
      case '????????':
        TranslateMessage(msg, 'es');
        break;
      case '????????':
        TranslateMessage(msg, 'ja');
        break;
    
  );
);

(我有比这个 switch 语句中更多的语言,但是对于这个问题,它更容易阅读)

这里是 TranslateMessage 函数:

async function TranslateMessage(msg, lang) 
  try 
    const traduction = await traduire(msg.content, lang);
    const MessEmbed = new MessageEmbed()
      .setAuthor(msg.author.username, msg.author.avatarURL)
      .setDescription(traduction);

    return msg.channel.send(MessEmbed);
   catch (error) 
    return msg.channel.send("There's an error, try again !");
  

【问题讨论】:

【参考方案1】:

您可以查看reaction.count,它返回给出相同反应的人数。如果它大于1,则无需将消息翻译成该语言。

collector.on('collect', async (reaction, user) => 
  if (reaction.count > 1) return; // there is already a translation for this reaction
  
  switch (reaction.emoji.name) 
    case '??':
      TranslateMessage(msg, 'fr');
      break;
    case '??':
      TranslateMessage(msg, 'en');
      break;
    case '??':
      TranslateMessage(msg, 'de');
      break;
    case '??':
      TranslateMessage(msg, 'es');
      break;
    case '??':
      TranslateMessage(msg, 'ja');
      break;
  
);

如果您想避免在用户删除最后一个反应时发送新的翻译(意味着reaction.count 将再次为零)然后再次添加它,您可以使用messageReactionRemove 事件。每当删除反应时都会发出它,因此您可以检查reaction.count 是否降至零,并作为具有相同表情符号的机器人做出反应。当然它也会触发翻译,所以你需要过滤掉机器人的反应:

bot.on('message', async (msg) => 
  const reactionFilter = () => 
    return msg.author.id !== '724682218454253588';
  ;
  const collector = msg.createReactionCollector(reactionFilter);

  collector.on('collect', (reaction, user) => 
    if (reaction.count > 1 || user.bot) return;

    switch (reaction.emoji.name) 
      case '??':
        TranslateMessage(msg, 'fr');
        break;
      case '??':
        TranslateMessage(msg, 'en');
        break;
      case '??':
        TranslateMessage(msg, 'de');
        break;
      case '??':
        TranslateMessage(msg, 'es');
        break;
      case '??':
        TranslateMessage(msg, 'ja');
        break;
    
  );
);

bot.on('messageReactionRemove', (reaction) => 
  if (reaction.count === 0)
    reaction.message.react(reaction.emoji);
);

【讨论】:

这是一个简单的解决方案,我不知道为什么我没有考虑它。但是有一个小问题(没什么大不了的),如果反应的用户先删除他的反应,然后再添加,它会翻译第二次。不过现在应该没问题了,谢谢! 不客气。我刚刚用解决方案更新了我的答案。希望:) 谢谢!完美运行:)

以上是关于Discord收集器反应过滤器设置最大限制的方式的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js:如何发送消息并从中收集反应

Discord js v12 如果有人对嵌入做出反应,则发送消息

在 discord.js 中的时间限制之前获取收集的消息

将数组划分为嵌入页面 - Discord.JS

Discord.js 为 ReactionRole 添加一次反应收集器

Discord Bot - 反应收集器/嵌入编辑