discord - 角色反应 Discord Bot
问题描述
我一直在尝试使用允许用户对消息做出反应并接收角色的命令在 discord.js 中编写一个不和谐机器人。这是我当前的代码。我不确定如何在用户添加反应时赋予角色以及当用户的反应移除它带走的角色时如何使其成为。
const { RichEmbed } = require('discord.js');
const Discord = require("discord.js");
const colors = require("../colors");
const botconfig = require("../botconfig");
exports.run = async (client, message, args) => {
await message.delete().catch(O_o=>{});
const role1 = message.guild.roles.get('688477558982836344'); // Replace with Updates ID
const role2 = message.guild.roles.get('688477690344374283'); // Replace with Events ID
const role3 = message.guild.roles.get('688477467840872452'); // Replace with QOTD ID
const role4 = message.guild.roles.get('688477868078137369'); // Replace with Polls ID
const role5 = message.guild.roles.get('687498488295981069'); // Replace with Social Media ID
const embed = new Discord.RichEmbed()
.setTitle('Pinged Roles')
.setDescription(`
Tip: *Double React to remove a role*
❤️ ${role1.toString()}
${role2.toString()}
${role3.toString()}
${role4.toString()}
${role5.toString()}
`)
.setColor(colors.purple)
.setFooter('mc.advancius.net')
message.channel.send(embed).then(async msg => {
await msg.react('❤️');
await msg.react('');
await msg.react('');
await msg.react('');
await msg.react('');
});
}
module.exports.help = {
name: "roles"
};
解决方案
从您的代码看来,您使用的是 Discord.js v11,但我也会包含 v12 的代码,因为这是最新版本。
v11
您需要使用as has no event 的messageReactionAdd
andmessageReactionRemove
事件。Client
ReactionCollector
remove
// I added this object because I prefer having this than having lots of repeated code
// you can still do this the way you were doing before
const roles = {
'❤️': '688477558982836344',
'': '688477690344374283',
'': '688477467840872452',
'': '688477868078137369',
'': '687498488295981069'
}
exports.run = async (client, message, args) => {
await message.delete()
const embed = new RichEmbed()
.setTitle('Pinged Roles')
.setDescription(`
Tip: *Double React to remove a role*
${Object.entries(roles)
.map(([emoji, id]) => `${emoji} ${message.guild.roles.get(id).toString()}`)
.join('\n')}
`)
.setColor(colors.purple)
.setFooter('mc.advancius.net')
message.channel.send(embed).then(async msg => {
// react with every emoji
for (const emoji of Object.keys(roles)) await msg.react(emoji)
client.on('messageReactionAdd', ({emoji, message}, user) => {
// if the message that the user reacted to is the same as the message with
// the reactions, add the role
if (message.id === msg.id) message.guild.members.get(user.id).addRole(roles[emoji.name])
})
client.on('messageReactionRemove', ({emoji, message}, user) => {
// same as above but remove the role
if (message.id === msg.id) message.guild.members.get(user.id).removeRole(roles[emoji.name])
})
})
}
v12/v13
你可以使用createReactionCollector
as ReactionCollector
has 一个remove
事件,当一个反应被移除时触发。
// I added this object because I prefer having this than having lots of repeated code
// you can still do this the way you were doing before
const roles = {
'❤️': '688477558982836344',
'': '688477690344374283',
'': '688477467840872452',
'': '688477868078137369',
'': '687498488295981069'
}
exports.run = async (client, message, args) => {
await message.delete()
// because RoleManager.fetch is async
const rolesArray = await Promise.all(Object.entries(roles)
.map(async ([emoji, id]) => `${emoji} ${(await message.guild.roles.fetch(id)).toString()}`)
)
const embed = new MessageEmbed()
.setTitle('Pinged Roles')
.setDescription(`
Tip: *Double React to remove a role*
${rolesArray.join('\n')}
`)
.setColor(colors.purple)
.setFooter('mc.advancius.net')
// for v12:
// message.channel.send(embed).then(async msg => {
message.channel.send({embeds: [embed]}).then(async msg => {
const emojis = Object.keys(roles)
for (const emoji of emojis) await msg.react(emoji)
// only collect reactions that are the role emojis
// for v12:
// const collector = msg.createReactionCollector(({emoji}) => emojis.includes(emoji.name))
const collector = msg.createReactionCollector({
filter: ({emoji}) => emojis.includes(emoji.name)
})
collector.on('collect', ({emoji, message}, user) => {
message.guild.members.fetch(user).then(member => {
member.roles.add(roles[emoji.name])
})
})
collector.on('remove', ({emoji, message}, user) => {
message.guild.members.fetch(user).then(member => {
member.roles.remove(roles[emoji.name])
})
})
})
}
推荐阅读
- java - Java ASM - 当前帧的堆栈大小与堆栈图不匹配
- hadoop - 如何将文件从 /user/maria_dev/tutorials/test.csv (HDP) 复制到 /sandbox/tutorial-files/640/nifi/input (HDF)?
- c# - 将文件保存到 Azure Functions 中的临时位置
- css - 如何用字体真棒图标替换默认的wordpress导航栏链接文本?
- python-3.x - 使用 Turtle 模块在 Python 上运行 Snake
- c# - 无法将数据数组传递给 Asp.NET 中的控制器
- r - 插入符号的 rfe 函数中的下标越界错误
- javascript - 使用 mediarecorder + mediasource 直播时产生的噪音
- angularjs - angularjs中输入验证的奇怪行为
- java - 什么是 java 绑定?和语言绑定一样吗?你是什么意思'人们可以使用以前的 json 协议使用 java 绑定?