Discord JS - 添加反应时删除角色
Discord JS - Remove role when reaction is added
我应该知道怎么做。但是下面的代码不起作用。
目标是在用户对消息添加反应时删除角色。
client.on('messageReactionAdd', async (reaction, user) => {
const message = await reaction.message.fetch(true);
const channelStockSettings = '961958948976607243';
const fundamentalPlays = '⭐️';
const fundamentalPlaysRoleSE = message.guild.roles.cache.find(role => role.name === '⭐');
const fundamentalPlaysRoleUS = message.guild.roles.cache.find(role => role.name === '⭐');
const longTerm = '⛰';
const longTermRoleSE = message.guild.roles.cache.find(role => role.name === '⛰');
const longTermRoleUS = message.guild.roles.cache.find(role => role.name === '⛰');
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 === channelStockSettings) {
if (reaction.emoji.name === fundamentalPlays) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleUS);
} else if (reaction.emoji.name === longTerm) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleUS);
} else {
return;
}
}
});
这是我之前编写代码的方式。什么……错了?
我的机器人也遇到了同样的问题。您能否尝试删除嵌入消息并重新添加。然后再试一次。
测试您的代码后,问题似乎是您使用了错误的 unicode 表情,假设您正在尝试对星星和山脉使用默认的 Discord 表情。换句话说,reaction.emoji.name === fundamentalPlays
和 reaction.emoji.name === longTerm
都返回 false。
我不确定这是怎么发生的或者你从哪里得到这些 unicode 表情(也许是旧版本的 discord,或者来自 third-party 网站?),但两者都没有正确匹配 Discord unicode 表情(星星表情看起来完全一样但不相等,而山表情看起来不一样也不相等)。获得任何 Discord 表情的 unicode 形式的最佳方法是在发送 Discord 表情之前放置一个反斜杠。然后,复制它给你的 unicode 表情。
这是您的代码,已修改为具有正确的 unicode 表情。我测试了它,它对我有用:
client.on('messageReactionAdd', async (reaction, user) => {
console.log("Reaction received");
const message = await reaction.message.fetch(true);
const channelStockSettings = '883731756438671391';
const fundamentalPlays = '⭐';
const fundamentalPlaysRoleSE = message.guild.roles.cache.find(role => role.name === 'Member');
const fundamentalPlaysRoleUS = message.guild.roles.cache.find(role => role.name === 'Youtuber');
const longTerm = '⛰️';
const longTermRoleSE = message.guild.roles.cache.find(role => role.name === 'Testor');
const longTermRoleUS = message.guild.roles.cache.find(role => role.name === 'Co-op');
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 === channelStockSettings) {
if (reaction.emoji.name === fundamentalPlays) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleUS);
} else if (reaction.emoji.name === longTerm) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleUS);
} else {
return;
}
}
});
请注意,可能还有许多其他问题导致此代码无法正常工作,但是:
a) messageReactionAdd
事件仅针对添加到缓存消息的反应触发。因此,如果您对机器人启动前发送的消息添加反应,它不会触发。如果您尝试使用此类未缓存的消息执行此操作,则需要在机器人启动时立即专门获取消息(很可能在您的 ready
事件处理程序中)。
b) 确保您有正确的接收消息和消息反应的意图。我假设你这样做了,但是 double-check,否则 messageReactionAdd
事件根本不会触发。
我应该知道怎么做。但是下面的代码不起作用。 目标是在用户对消息添加反应时删除角色。
client.on('messageReactionAdd', async (reaction, user) => {
const message = await reaction.message.fetch(true);
const channelStockSettings = '961958948976607243';
const fundamentalPlays = '⭐️';
const fundamentalPlaysRoleSE = message.guild.roles.cache.find(role => role.name === '⭐');
const fundamentalPlaysRoleUS = message.guild.roles.cache.find(role => role.name === '⭐');
const longTerm = '⛰';
const longTermRoleSE = message.guild.roles.cache.find(role => role.name === '⛰');
const longTermRoleUS = message.guild.roles.cache.find(role => role.name === '⛰');
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 === channelStockSettings) {
if (reaction.emoji.name === fundamentalPlays) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleUS);
} else if (reaction.emoji.name === longTerm) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleUS);
} else {
return;
}
}
});
这是我之前编写代码的方式。什么……错了?
我的机器人也遇到了同样的问题。您能否尝试删除嵌入消息并重新添加。然后再试一次。
测试您的代码后,问题似乎是您使用了错误的 unicode 表情,假设您正在尝试对星星和山脉使用默认的 Discord 表情。换句话说,reaction.emoji.name === fundamentalPlays
和 reaction.emoji.name === longTerm
都返回 false。
我不确定这是怎么发生的或者你从哪里得到这些 unicode 表情(也许是旧版本的 discord,或者来自 third-party 网站?),但两者都没有正确匹配 Discord unicode 表情(星星表情看起来完全一样但不相等,而山表情看起来不一样也不相等)。获得任何 Discord 表情的 unicode 形式的最佳方法是在发送 Discord 表情之前放置一个反斜杠。然后,复制它给你的 unicode 表情。
这是您的代码,已修改为具有正确的 unicode 表情。我测试了它,它对我有用:
client.on('messageReactionAdd', async (reaction, user) => {
console.log("Reaction received");
const message = await reaction.message.fetch(true);
const channelStockSettings = '883731756438671391';
const fundamentalPlays = '⭐';
const fundamentalPlaysRoleSE = message.guild.roles.cache.find(role => role.name === 'Member');
const fundamentalPlaysRoleUS = message.guild.roles.cache.find(role => role.name === 'Youtuber');
const longTerm = '⛰️';
const longTermRoleSE = message.guild.roles.cache.find(role => role.name === 'Testor');
const longTermRoleUS = message.guild.roles.cache.find(role => role.name === 'Co-op');
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 === channelStockSettings) {
if (reaction.emoji.name === fundamentalPlays) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleUS);
} else if (reaction.emoji.name === longTerm) {
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleSE);
await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleUS);
} else {
return;
}
}
});
请注意,可能还有许多其他问题导致此代码无法正常工作,但是:
a) messageReactionAdd
事件仅针对添加到缓存消息的反应触发。因此,如果您对机器人启动前发送的消息添加反应,它不会触发。如果您尝试使用此类未缓存的消息执行此操作,则需要在机器人启动时立即专门获取消息(很可能在您的 ready
事件处理程序中)。
b) 确保您有正确的接收消息和消息反应的意图。我假设你这样做了,但是 double-check,否则 messageReactionAdd
事件根本不会触发。