javascript - 反应角色 (JS)
问题描述
所以我一直在为自己制作一个 Discord Bot,不要误会我的意思,我仍处于 JS 的学习阶段,但我知道一点点可以让我开始。我一直在制作一个反应角色命令,只是想知道是否有办法让它一次只能对一件事做出反应。
例如,我有一个颜色选择器,但只希望成员一次选择 1 个,如果他们对不同的颜色有反应,则对他们选择的第一种颜色没有反应
module.exports = {
name: 'reactioncolor',
description: "Sets up a reaction role message!",
async execute(client, message, args, Discord) {
const channel = '865154605356285962';
const redTeamRole = message.guild.roles.cache.find(role => role.name === "Red");
const orangeTeamRole = message.guild.roles.cache.find(role => role.name === "Orange");
const yellowTeamRole = message.guild.roles.cache.find(role => role.name === "Yellow");
const blueTeamRole = message.guild.roles.cache.find(role => role.name === "Blue");
const redTeamEmoji = '';
const orangeTeamEmoji = '';
const yellowTeamEmoji = '';
const blueTeamEmoji = '';
let embed = new Discord.MessageEmbed()
.setColor('#e42643')
.setTitle('Choose your colour!')
.setDescription('\n\n'
+ `${redTeamEmoji} ➜ <@&865163260500377602>\n`
+ `${orangeTeamEmoji} ➜ <@&865163175091503104>\n`
+ `${yellowTeamEmoji} ➜ <@&865163103469961226>\n`
+ `${blueTeamEmoji} ➜ <@&866988159162515527>\n`);
let messageEmbed = await message.channel.send(embed);
messageEmbed.react(redTeamEmoji);
messageEmbed.react(orangeTeamEmoji);
messageEmbed.react(yellowTeamEmoji);
messageEmbed.react(blueTeamEmoji);
client.on('messageReactionAdd', async (reaction, user) => {
if (reaction.message.partial) await reaction.message.fetch();
if (reaction.partial) await reaction.fetch();
if (user.bot) return;
if (!reaction.message.guild) return;
if (reaction.message.channel.id == channel) {
if (reaction.emoji.name === redTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.add(redTeamRole);
}
if (reaction.emoji.name === orangeTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.add(orangeTeamRole);
}
if (reaction.emoji.name === yellowTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.add(yellowTeamRole);
}
if (reaction.emoji.name === blueTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.add(blueTeamRole);
}
} else {
return;
}
});
client.on('messageReactionRemove', async (reaction, user) => {
if (reaction.message.partial) await reaction.message.fetch();
if (reaction.partial) await reaction.fetch();
if (user.bot) return;
if (!reaction.message.guild) return;
if (reaction.message.channel.id == channel) {
if (reaction.emoji.name === redTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(redTeamRole);
}
if (reaction.emoji.name === orangeTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(orangeTeamRole);
}
if (reaction.emoji.name === yellowTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(yellowTeamRole);
}
if (reaction.emoji.name === blueTeamEmoji) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(blueTeamRole);
}
} else {
return;
}
});
}
}
任何帮助表示赞赏!
解决方案
如果用户点击新的反应,这就是您可以删除用户旧反应的方法。
client.on("messageReactionAdd", async (reaction, user) => {
if (reaction.message.partial) await reaction.message.fetch();
if (reaction.partial) await reaction.fetch();
if (user.bot) return;
if (!reaction.message.guild) return;
// ...
reaction.message.reactions.cache.forEach((otherReaction) => {
if (reaction.emoji.name == otherReaction.emoji.name) return;
if (otherReaction.users.cache.some(otherUser => user.id == otherUser.id)) {
otherReaction.users.remove(user);
}
});
// ...
}
请注意,这只适用于假设.cache
s 是最新的。否则,您将需要获取它们。
但正如@Viriato 建议的那样,选择菜单绝对是最好的解决方案。
推荐阅读
- python - numpy 多维数组的交集
- c++ - 按位运算期间整数提升的行为
- kotlin - java.lang.ClassCastException:java.lang.Integer 无法转换为 android.widget.LinearLayout 当我尝试充气时
- typescript - 当值的类型取决于键但并非所有键都预先知道时,如何定义接口?
- python - Python:根据文本长度更新字典中的值的快速方法?
- visual-studio - Blazor WebAssembly Visual Studio 调试器问题
- r - 通过小标题列表运行 t.test
- javascript - 尝试通过 React Native 将视频上传到 S3 时遇到问题
- powershell - Powershell 获取 InvokeMethodOnNull 消息
- file-upload - Apache Commons FTPSClient 上传无法完成