我使用的是DiscordJSV12.3.1,我试图返回一个对旧消息作出反应的用户列表。(在启动bot之前创建的)。
在我当前的实现中,我通过ID获取fetch the message,映射所有的反应,然后获取反应,最后映射反应中的用户。
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);
})
})
});
});
}
上面的代码适用于自bot启动以来做出的任何反应,但是无法找到在bot启动之前对消息做出反应的用户。
有没有更好的办法去做这件事?
提前谢谢你。
编辑:根据Lioness100的注释更新了上面的代码
Edit2:设法使用resolve()使其工作,请参阅下面的答案
由于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()
);
});
}
是的,通过使用。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)
});
});
}
}
如果有人有同样的问题,希望这能有所帮助。(注意:你必须通过emoji,但你可以使用问题中发布的方法或狮子女评论中发布的方法来检索一个反应的emoji列表)
感谢Lioness100的回复。