node.js - Discord.js:只有一种反应
问题描述
我正在创建 Discord 机器人,当用户在消息上添加特定的表情符号反应时,它会赋予特定的角色。
我想让用户只选择一种反应;
或者
如果用户选择另一个,则应删除同一用户的其他反应。
我发现代码仅适用于两种情况:
- 删除消息上的所有表情符号反应。
message.reactions.cache.get('emojiId').remove()
- 消除用户的反应。
const userReactions = message.reactions.cache.filter(reaction => reaction.users.cache.has(userId));
try {
for (const reaction of userReactions.values()) {
await reaction.users.remove(userId);
}
} catch (error) {
console.error('Failed to remove reactions.');
}
他们两个都不适合我,因为他们删除了对消息的所有反应。
我的代码的一部分:
client.on('messageReactionAdd', async (reaction, user) => {
if(reaction.partial) await reaction.fetch()
const { message } = reaction
if (message.id === rulesMessageId) {
const member = message.channel.guild.members.cache.get(user.id)
if (reaction.emoji.id === emojiIds.HEAVEN ) {
for (var i = 0 in guildRoles) {
if (guildRoles[i] != guildRoles.HEAVEN)
member.roles.remove(guildRoles[i])
}
member.roles.add(guildRoles.HEAVEN)
}
解决方案
我不知道如何在答案中使用您的部分代码,所以我自己做了:
client.on("messageReactionAdd", (reaction, Member) => {
if(Member.bot) return;
reaction.message.reactions.cache.map(x=>{
if(x._emoji.name != reaction._emoji.name&&x.users.cache.has(Member.id)) x.users.remove(Member.id)
})
});
我得到消息中的所有反应并将它们映射以检查用户是否有反应。我还检查该反应是否与当前仅移除其他反应的反应相同。即使晚了10个月也希望对你有所帮助^^
推荐阅读
- java - 插入二叉树问题的方法
- javascript - Match string with 10 or fewer non-whitespace characters in front of string, ignoring whitespace characters
- rvest - Rvest 返回零列表
- c# - 为什么可以将地址添加到 MailMessage.To 使用对象初始化?
- static-analysis - 单个文件上的 Spotbugs?
- swift - 调用localizedNetworkReachabilityStatusString 后的未知状态
- c - 如何将字符串和变量连接到C中的字符串
- java - Java - 在二维字符数组中搜索单词?
- javascript - 如何找到与提供的 slug 匹配的某个对象的索引
- android - 使用 cordova-plugin-firebase-messaging 显示来自 Ionic 的通知