有没有办法让DiscordJS对旧消息做出反应

时间:2020-10-07 09:39:44

标签: javascript discord discord.js

我正在使用DiscordJs V12.3.1,并且试图返回对旧消息有反应的用户列表。 (在启动机器人之前创建的一个)。

在我当前的实现中,我通过ID获取消息,映射所有反应,然后获取反应,最后映射反应中的用户。

let cacheChannel = msg.guild.channels.cache.get(channelID); 
if(cacheChannel){
    cacheChannel.messages.fetch(messageID).then(reactionMessage => {                
        reactionMessage.reactions.cache.map(async function(reaction){
            reaction.fetch().then(r => {
                 r.users.cache.map(item => {
                    if(!item.bot) console.log(item.id);                         
                })                        
            })  
        });                                  
    });          
}

上面的代码适用于自漫游器启动以来做出的任何反应,但是无法找到,并且用户在漫游器启动之前对消息做出了反应。

有更好的方法吗?

谢谢。

编辑:根据Lioness100的评论更新了上面的代码

EDIT2:设法使其与resolve()一起使用,请参见下面的答案

2 个答案:

答案 0 :(得分:1)

由于MessageManager.fetch()返回了消息的反应,但没有响应的用户,因此您必须将其与ReactionUserManager.fetch()配对。另外,为什么在获取消息后又要为其创建另一个变量?

var getReactedUsers = (message) => {
 // fetch the users
 message.reactions.cache.users.fetch().then((users) =>
  // I'm not quite sure what you were trying to accomplish with the original lines
  reaction.cache.map((item) => item.users.cache.array())
 );
};

let cacheChannel = client.channels.cache.get(channelID);
if (cacheChannel) getReacterUsers(await cacheChannel.messages.fetch(messageID));

编辑:在更新的代码中,您误用了Array.prototype.map()

let cacheChannel = msg.guild.channels.cache.get(channelID);
if (cacheChannel) {
 cacheChannel.messages.fetch(messageID).then((reactionMessage) => {
  console.log(
   reactionMessage.reactions.cache
    .each(async (reaction) => await reaction.users.fetch())
    .map((reaction) => reaction.users.cache.filter((user) => !user.bot))
    .flat()
  );
 });
}

答案 1 :(得分:0)

正确,设法使用.resolve()使其工作而不是通过高速缓存获取或映射。

var getReactedUsers = async(msg, channelID, messageID, emoji) => {
    let cacheChannel = msg.guild.channels.cache.get(channelID); 
    if(cacheChannel){
        cacheChannel.messages.fetch(messageID).then(reactionMessage => {
            reactionMessage.reactions.resolve(emoji).users.fetch().then(userList => {
                return userList.map((user) => user.id)
            });
        });
    }
}

希望如果有人遇到同样的问题,这会有所帮助。 (注意:您必须传递表情符号,但是可以使用问题中或Lioness注释中发布的方法来检索已反应的表情符号列表)

感谢Lioness100的回复。