如何获得一系列反应 Discord JS

Posted

技术标签:

【中文标题】如何获得一系列反应 Discord JS【英文标题】:How get array of reactions Discord JS 【发布时间】:2020-11-12 13:12:27 【问题描述】:

我想获得有关反应的信息,但我不能。我需要在没有听众或其他东西的情况下从旧消息中获得反应并创作这些反应。 这段代码产生了类似https://gist.github.com/acollierr17/c9e7aaf9eba97d8659b59395b5f2046d 的东西,但对我不起作用,var 是空的。但我可以收到消息m.channel.fetchMessage(ID) 我不明白为什么这不起作用,尽管消息已收到 var.如何将所有反应及其作者的消息收集到数组中?

我尝试了这个和其他几种方法。

if(calcreact == 1 && msg.content.startsWith('/calcreact'))  //start
        calcreact = 0; // защита от флуда
        let msgid = finddata(msg.content);
         //let channel = 709517297664131082;
        msg.channel.fetchMessage(msgid)
            .then(m => 
        //console.log('Message:', message.content);
        

    let reactions = m.reactions;
    let reaction = reactions.first();
    let users = reaction.users.map((u) => u.toString());
        
        console.log(users);
        //console.log(m.reactions.fetch());
        //console.log(m.reactions.forEach((reaction) => ));
        m.reactions.forEach((reaction) => console.log(reaction));
        m.reactions.forEach((reaction) => console.log(reaction.users));
        m.reactions.forEach((reaction) => console.log(reaction.users.map((u) => u.toString())) );
        
        //console.log('Reactions:', );
      );

        setTimeout(antiflood, 500, 'calcreact');
     //end

m.reactions.forEach((reaction) => console.log(reaction)); 我可以得到巨大的信息“数组”和标记的当前反应(在我看来https://i.imgur.com/OazszNR.png)但深度(用户)是空的。这太可怕了……

【问题讨论】:

欢迎来到 SO!您可能应该将您编写的一些代码添加到您的问题中,而不仅仅是一个相关示例,以及您的代码抛出的任何错误。这将显着增加有用答案的可能性 我试试,但这看起来很糟糕。 【参考方案1】:

使用 client.on("messageReactionAdd" 方法并将反应保存在数组中。

【讨论】:

我可以得到旧的反应还是只能得到新的反应? 阅读了有关此方法的一些信息,我认为这是在获取此旧消息后可以从消息中得到反应吗?还是我想错了? 一旦对消息添加反应,就会触发此事件。然后你可以得到做出反应的人。【参考方案2】:

下面的函数将用户的反应分组,如下所示:


  userId1: ['reactionId1', 'reactionId2'],
  userId2: ['reactionId1', 'reactionId2'],
  ...

您可以调整它以从消息或您喜欢的任何上下文中获取用户和反应。

OBS:它是用 TypeScript 编写的,但如果你去掉打字,它就会变成 JavaScript。

功能:

import  MessageReaction  from "discord.js";

interface IReactionsByUsers 
  [userId: string]: Array<string>;


DiscordClient.on("messageReactionAdd", (reaction: MessageReaction) => 
  const reducer = (acc: IReactionsByUsers, cur: [string, MessageReaction]) => 
    const [reactionId, reaction] = cur;

    const usersIds = [...reaction.users.cache].map(([userId]) => userId);

    for (const userId of usersIds) 
      if (acc[userId]) 
        acc[userId].push(reactionId);
       else 
        acc[userId] = [reactionId];
      
    

    return acc;
  ;

  const messageReactions = [...reaction.message.reactions.cache];

  const reactionByUsers = messageReactions.reduce(
    reducer,
     as IReactionsByUsers
  );

  return reactionByUsers;
);

【讨论】:

以上是关于如何获得一系列反应 Discord JS的主要内容,如果未能解决你的问题,请参考以下文章

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

如何根据 Discord.js 中的反应编辑消息(创建列表和切换页面)

Discord.js - 随机获取一个有反应的用户

对表情符号 discord.py 做出反应时添加角色

自动反应消息 discord.js

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