首页 > 解决方案 > 如何获得一系列反应 Discord JS

问题描述

我想获得有关反应的信息,但我不能。我需要在没有听众或其他东西的情况下从旧消息中获得反应并创作这些反应。这段代码做了类似的事情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)但深度(用户)是空的。这太可怕了……

标签: javascriptnode.jsbotsdiscord.jsmessage

解决方案


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

{
  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;
});

推荐阅读