我正在使用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()一起使用,请参见下面的答案
答案 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的回复。