我目前正在开发一个允许用户创建角色反应消息的系统。我使用Enmap(js<=>sqlite数据库)来存储用户emojiidorname:roleid
给出的对。
首先,我显然试图通过到处放置一些console.logs来调试代码。据我所知,当一个反应被缓存时,一旦尝试再次获取消息,就不会更新缓存,并且该反应仍然显示在消息上(当它不是^^时)。因此,我尝试了Stackoverflow的不同功能,比如添加client.on('raw',。。。。)
位。什么也改变不了。然后我尝试使用partials(我认为这可能有助于smh)来处理消息和反应。没什么不同。甚至尝试重复其他类似的反应
reaction.message.reactions.cache.forEach(async r => {
await r.fetch();
});
case 'dev':
message.channel.messages.fetch(arguments[1]).then(m => {
console.log(m.reactions.cache.map(r => {r.fetch();return r.emoji.name}))
})
break;
我不想使用其他事件,如messageReactionRemove,messageReactionRemoveAll,messageReactionRemoveEmoji等,因为有太多的方法可以删除一个反应(处理所有这些会很痛苦)。
为了缩短时间,我希望能够获取消息的真实反应,而不是通过MessageReactionAdd
事件获取缓存的反应。
好吧,我最近一直在忙着尝试一些事情,我发现了一些很有趣的事情。事实上,我上面所说的一切似乎都是正确的,但仅限于由不是客户的每个人添加的反应。我现在正试着正确地获取我的机器人的反应。
我终于有答案了。我可以做我想做的事情,清除消息和反应的缓存,然后通过获取它来重新缓存消息。在JS中,它是这样的:
client.on('messageReactionAdd', async (reaction, user) => {
await reaction.message.channel.messages.cache.delete(reaction.message.id);
await reaction.message.reactions.cache.clear();
let message = await reaction.message.fetch();
....
Message与reaction.Message完全相同,但是反应是新的(不包括删除的)。