javascript - 更新角色一次只允许一个用户
问题描述
目前,用户可以选择该部分中给出的尽可能多的角色,但是,我希望能够按照以下方式做一些事情: (roleA OR roleB) AND (roleC OR roleD) AND roleE 等
以上所有内容都是通过检查他们已经提交的反应来触发的,如果新的选择与当前的选择相矛盾,则将其删除。
用户可以通过对指定消息做出反应来将反应角色应用于自己。根据是否做出某个选择,它能够添加/删除另一个角色,即
你今年多大?- 18-24 - 25-30 - 31+
什么是你的性别?- 男 - 女
你在哪个大陆?- IDK,我用完了 - 虚假问题 - 填补空白。
如果用户单击 25-30,但随后意识到他们是 24,然后单击它,我希望删除先前的反应和角色,而无需手动干预。不仅有 1 个选项可用,因此也希望有多个选项可用。
bot.on("raw", event =>{
console.log(event);
const eventName = event.t;
if(eventName === 'MESSAGE_REACTION_ADD')
{
if(event.d.message_id === '<REMOVED ID>')
{
var reactionChannel = bot.channels.get(event.d.channel_id);
if(reactionChannel.messages.has(event.d.message_id))
return;
else {
reactionChannel.fetchMessage(event.d.message_id)
.then(msg => {
var msgReaction = msg.reactions.get(event.d.emoji.name + ":" + event.d.emoji.id);
var user = bot.users.get(event.d.user_id);
bot.emit('messageReactionAdd', msgReaction, user);
})
.catch(err => console.log(err));
}
}
}
else if (eventName === 'MESSAGE_REACTION_REMOVE')
{
if(event.d.message_id === '<REMOVED ID>')
{
var reactionChannel = bot.channels.get(event.d.channel_id);
if(reactionChannel.messages.has(event.d.message_id))
return;
else{
reactionChannel.fetchMessage(event.d.message_id)
.then(msg => {
var msgReaction = msg.reactions.get(event.d.emoji.name + ":" + event.d.emoji.id);
var user = bot.users.get(event.d.user_id);
bot.emit('messageReactionRemove', msgReaction, user);
})
.catch(err => console.log(err));
}
}
}
});
bot.on('messageReactionAdd', (messageReaction, user) => {
var roleName = messageReaction.emoji.name;
var role = messageReaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
if(role)
{
var member = messageReaction.message.guild.members.find(member => member.id === user.id);
if(member)
{
member.addRole(role.id);
console.log('Success. Added role.');
}
}
});
bot.on('messageReactionRemove', (messageReaction, user) => {
var roleName = messageReaction.emoji.name;
var role = messageReaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
if(role)
{
var member = messageReaction.message.guild.members.find(member => member.id === user.id);
if(member)
{
member.removeRole(role.id);
console.log('Success. Removed role.');
}
}
});```
解决方案
在您的messageReactionAdd
事件中,您可以尝试找到与特定选择对应的用户应用的反应或角色。如果有,那就意味着他们已经选择了那个答案。然后,您可以在将新角色添加到用户之前删除它们。如果没有,代码应该照常继续。
bot.on('messageReactionAdd', async (messageReaction, user) => { // async needed for 'await'
const name = messageReaction.emoji.name.toLowerCase();
const message = messageReaction.message;
const role = message.guild.roles.find(role => role.name.toLowerCase() === name);
const member = message.guild.member(user);
if (!role || !member) return;
const emojis = message.reactions.map(emoji => emoji.name);
const conflictingReaction = message.reactions.find(reaction => reaction.users.get(user.id) && emojis.includes(reaction.emoji.name));
const conflictingRole = member.roles.find(role => emojis.includes(role.name.toLowerCase());
try {
if (conflictingReaction || conflictingRole) {
await conflictingReaction.remove(user);
await member.removeRole(conflictingRole);
}
await member.addRole(role);
console.log('Success.');
} catch(err) {
console.error(err);
}
});
推荐阅读
- json - SQL Server 插入带有其他外部参数的 JSON 数据
- javascript - 在 HTML 中切换图像隐藏/可见
- android-studio - 如何配置 Android Studio 以识别带有 SystemApi 注释的方法
- javascript - 物化日期选择器仅在单击完成按钮时更新
- omnet++ - 构建venes_inet 失败
- java - 从 Java 中的字符串中过滤非 MySQL Latin1 字符
- sql - 包含重复项的多个字符串
- kubernetes - Apache Camel 与 Kubernetes
- python - Python按最后一个字母和扩展名选择文件
- php - 多个 PHP 标记中的一个 PHP 变量