【问题标题】:How to role check with Role Reaction & Auto remove user Reaction如何使用角色反应和自动删除用户反应进行角色检查
【发布时间】:2020-06-23 05:11:30
【问题描述】:

嘿,到目前为止,我已经得到了我的角色反应,但我想做到这一点,以便在按下表情符号后,代码会询问某人是否已经拥有该组,并相应地添加或删除该组,但我也想做以便自动删除与表情符号的反应,以便只有机器人对显示表情符号的消息做出反应。

我会在附件中添加我目前编写的代码,也许有一些人可以帮助我。

MessageReactionAddEvent:

const BaseEvent = require('../utils/structures/BaseEvent');
require('dotenv').config();
module.exports = class MessageReactionAddEvent extends BaseEvent {
  constructor() {
    super('messageReactionAdd');
  }
  
  async run(client, reaction, user) {
    const message = reaction.message;
    const member = message.guild.members.cache.get(user.id);

    if(user.bot) return;
 
    const Valorant = message.guild.roles.cache.get(process.env.DISCORD_ROLE_VALORANT);
    const League = message.guild.roles.cache.get(process.env.DISCORD_ROLE_LEAGUE);

    if(
      ["????", "????"].includes(reaction.emoji.name)
  ) {
      switch(reaction.emoji.name) {

          case"????":
          if (message.member.roles.cache.has(process.env.DISCORD_ROLE_VALORANT)) {
            console.log('Has Valorant')
          } else {
            member.roles.add(Valorant)
            member.createDM().then( channel => {
                channel.send("Added Valorant")
            })
          }
          
          break;

          case"????":
          if (message.member.roles.cache.has(process.env.DISCORD_ROLE_LEAGUE)) {
            console.log('Has League of Legends')
          } else {
            member.roles.add(League)
            member.createDM().then( channel => {
                channel.send("Added League of Legends")
            })
          }
      }
    }
  }
}

MessageReactionRemoveEvent:

const BaseEvent = require('../utils/structures/BaseEvent');
require('dotenv').config();
module.exports = class MessageReactionRemoveEvent extends BaseEvent {
  constructor() {
    super('messageReactionRemove');
  }
  
  async run(client, reaction, user) {
    const message = reaction.message;
    const member = message.guild.members.cache.get(user.id);

    if(user.bot) return;
 
    const Valorant = message.guild.roles.cache.get(process.env.DISCORD_ROLE_VALORANT);
    const League = message.guild.roles.cache.get(process.env.DISCORD_ROLE_LEAGUE);
 
    if(
        ["????", "????"].includes(reaction.emoji.name)
    ) {
        switch(reaction.emoji.name) {
 
          case"????":
          if (message.member.roles.cache.has(process.env.DISCORD_ROLE_VALORANT)) {
            member.roles.remove(Valorant)
            member.createDM().then( channel => {
                channel.send("Added Valorant")
            })
          } else {
            console.log('Hasn´t Valorant')
          }
          
          break;

          case"????":
          if (message.member.roles.cache.has(process.env.DISCORD_ROLE_LEAGUE)) {
            member.roles.remove(League)
            member.createDM().then( channel => {
                channel.send("Added League of Legends")
            })
          } else {
            console.log('Hasn´t League of Legends')
          }
      }
    }
  }
}

角色命令:

const BaseCommand = require('../../utils/structures/BaseCommand');
const Discord = require("discord.js")

module.exports = class RolesCommand extends BaseCommand {
  constructor() {
    super('roles', 'Team', []);
  }

  run(client, message, args) {
    try {
      message.delete()

      const embed = new Discord.MessageEmbed()
      .setTitle("Test1")
      .setDescription("Test2")
      .setColor("#FCCF00")
      .setFooter("Test3")

      message.channel.send(embed).then(async msg => {
          await msg.react("????")
          await msg.react("????")
      })

  } catch(e) {
    console.log(e)
    } 
  }
}

感谢到目前为止我所获得的所有帮助,社区已经对我提供了很好的帮助 - 谢谢。

【问题讨论】:

  • 您的机器人是否具有添加角色的所有正确权限?您是否确保用户在层次结构顺序中位于机器人下方,以便机器人能够添加角色?你的代码有错误吗?
  • 是的,是的,不,我也有自动角色,这很好:)

标签: javascript node.js discord discord.js


【解决方案1】:

经过大量研究和帮助我的朋友,我现在已经做对了,希望我能帮助遇到同样问题的其他人。

带有角色反应的角色检查:

- message.member.roles.cache.has(process.env.DISCORD_ROLE_VALORANT)
+ member.roles.cache.has(process.env.DISCORD_ROLE_VALORANT)

自动删除用户反应:

const userReactions = message.reactions.cache.filter(reaction => reaction.users.cache.has(user.id));
try {
    for (const reaction of userReactions.values()) {
        await reaction.users.remove(user.id);
    }
} catch (error) {
    console.error('Failed to remove reactions.');
}

【讨论】:

    【解决方案2】:

    我想在 switch 语句之前运行 reaction.remove(); 应该可以解决问题:)

    【讨论】:

    • 现在它会删除所有反应,但它应该只删除自己的反应,而不是机器人的反应。
    • @NOXSYS 你把reaction.remove 放在哪里了?因为有一个 user.bot 检查不应该让机器人反应通过
    • @NOXSYS 这确实消除了机器人的反应?您可能想检查用户变量是否正确,以及反应变量的样子
    • 是的,不幸的是,我什至相信这两个变量都是正确的。但不幸的是,我不知道还能做什么:/
    猜你喜欢
    • 2020-08-06
    • 2021-10-10
    • 2021-01-05
    • 2019-04-30
    • 2018-07-20
    • 2017-12-30
    • 2020-10-16
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多