当前位置: 首页 > 知识库问答 >
问题:

自动反应角色/Discord.js机器人

刁星渊
2023-03-14

所以我在让我的自动角色发挥作用方面遇到了一个小问题,我一直在尝试通过消息对其进行排序。js和在reactionrole中。js,但它仍然给出了同样的问题,想知道是否有人可以帮助将不胜感激,因为我已经通过教程查看了它,除了一些差异,由于不同的文本/细节,它没有帮助

此外,如果这有助于避免错误,我将使用命令处理程序V2

(node:7712) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'roles' of undefined at Object.execute (\commands\other\reactionrole.js:6:46) at module.exports (\events\guild\message.js:46:25) at Client.emit (events.js:376:20) at MessageCreateAction.handle
(node_modules\discord.js\src\client\actions\MessageCreate.js:31:14) at Object.module.exports [as MESSAGE_CREATE] (node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32) at WebSocketManager.handlePacket (\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
at WebSocketShard.onPacket (\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22) at WebSocketShard.onMessage (\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10) at WebSocket.onMessage \node_modules\ws\lib\event-target.js:132:16)
at WebSocket.emit (events.js:376:20) (Use `node --trace-warnings ...` to show where the warning was created) (node:7712) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function
without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode).
(rejection id: 1) (node:7712) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

反应角色。js

module.exports = {
    name: 'reactionrole',
    description: 'Sets Up Roles!',
    async execute(message, args, Discord, client){
        const channel = '860952043845058570'
        const vgmembers = message.guild.roles.cache.find(role => role.name === "VG Members");
        const vgamembers = message.guild.roles.cache.find(role => role.name === "VG-A Members");
        const vghmembers = message.guild.roles.cache.find(role => role.name === "VG-H Members");

        const vgmembersEmoji = `<:VG:860965732057219122>`;
        const vgamembersEmoji = `<:VGA:860964110434566154>`;
        const vghmembersEmoji = `<:VGH:860964110371913748>`;

        let embed = new Discord.MessageEmbed()
        .setColor('#e42643')
        .setTitle('What Family Are You In')
        .setDescription('Select The Emjoi Of The Alliance You Are In \n\n'
        + `${vgmembersEmoji} If Your A VG Member\n`
        + `${vgamembersEmoji} If Your A VG-A Member\n`
        + `${vghmembersEmoji} If Your A VG-H Member`);

        let messageEmbed = await message.channel.send(embed);
        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 === vgmembersEmoji) {
                    await reaction.message.guild.members.cache.get(user.id).roles.add(vgmembers);
                }
                if (reaction.emoji.name === vgamembersEmoji) {
                    await reaction.message.guild.members.cache.get(user.id).roles.add(vgamembers);
                }
                if (reaction.emoji.name === vghmembersEmoji) {
                    await reaction.message.guild.members.cache.get(user.id).roles.add(vghmembers);
                }
            } 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 === vgmembersEmoji) {
                    await reaction.message.guild.members.cache.get(user.id).roles.remove(vgmembers);
                }
                if (reaction.emoji.name === vgamembersEmoji) {
                    await reaction.message.guild.members.cache.get(user.id).roles.remove(vgamembers);
                }
                if (reaction.emoji.name === vghmembersEmoji) {
                    await reaction.message.guild.members.cache.get(user.id).roles.remove(vghmembers);
                }
            } else {
                return;
            }
        });
    }
 
}   

message.js

require("dotenv").config();
const { Console, time } = require('console');
const cooldowns = new Map();


module.exports = async (Discord, client, message) => {
    const prefix = process.env.PREFIX;


    if(!message.content.startsWith(prefix) || message.author.bot) return;


    const args = message.content.slice(prefix.length).split(/ +/);
    const cmd = args.shift().toLowerCase();

    const command = client.commands.get(cmd) || client.commands.find((a) => a.aliases && a.aliases.includes(cmd));
    if (!command) return message.channel.send("This Command Doesn't Exist!");

    if (command === "reactionrole"){
        client.commands.get('reactionrole').execute(message, Discord, client);
      }

    if(!cooldowns.has(command.name)){
        cooldowns.set(command.name, new Discord.Collection());
    }
  
    const current_time = Date.now();
    const time_stamps = cooldowns.get(command.name);
    const cooldown_amount = (command.cooldown) * 1000;

    //If time_stamps has a key with the author's id then check the expiration time to send a message to a user.
    if(time_stamps.has(message.author.id)){
        const expiration_time = time_stamps.get(message.author.id) + cooldown_amount;

        if(current_time < expiration_time){
            const time_left = (expiration_time - current_time) / 1000;

            return message.reply(`Please wait ${time_left.toFixed(1)} more seconds before using ${command.name}`);
        }
    }
    //If the author's id is not in time_stamps then add them with the current time.
    time_stamps.set(message.author.id, current_time);
    //Delete the user's id once the cooldown is over.
    setTimeout(() => time_stamps.delete(message.author.id), cooldown_amount);

    if(command) command.execute(client, message, args, Discord);
}

共有2个答案

陈季
2023-03-14

消息。帮会似乎未定义
您是否在直接(私人)消息中?

匡玉堂
2023-03-14

在您的消息中。js你有

if(command) command.execute(client, message, args, Discord);

而在reactionrole.js

async execute(message, args, Discord, client){

这仅仅意味着值名称不匹配。

有三种方法可以解决这个问题。

  1. 更改命令文件中的顺序

可能是解决这个问题的最好方法。只需将reactionrole.js的开头更改为:

module.exports = {
    name: 'reactionrole',
    description: 'Sets Up Roles!',
    async execute(client, message, args, Discord){
    //the rest of the code

不建议这样做,因为您可能有其他已使用当前格式的命令文件,但仍有可能。

只需更改消息中的最后一行即可。js

if(command) command.execute(message, args, Discord, client);

但这可能意味着必须同时更改所有命令文件。

最好的解决方案之一是使用对象。

message.js中将最后一行更改为

if(command) command.execute({ client, message, args, Discord });

在命令文件中,将“执行”属性更改为

async execute({ client, message, args, Discord }){

这还允许您仅获取命令文件中的特定属性,并更改获取它们的顺序。

示例:

  • 如果是这样一个简单的响应,则可以省略client、args和Discord属性:
async execute({ message }){
  • 您可以更改订单而不受处罚
async execute({ message, args, Discord, client }){

即使顺序改变了,这仍然有效。

使用这种方法,你唯一需要注意的是资本化。如果您要键入discord而不是discord,它将不起作用。

使用任何你喜欢的方法,和一个快乐的编码!

 类似资料:
  • 我正在尝试使用客户端将当前服务器的bot角色设置为粉红色。打开(“准备就绪”),但每当我使用当前拥有的内容运行bot时,控制台将返回: 这是我目前使用的代码。我知道我需要在每个公会上进行for循环,但我不确定我将如何做到这一点,我可以使用for或只是a。然而,我找不到这样做的正确方法。 提前感谢任何回复和帮助我留言的人。

  • 嘿,我最近开始编写一个不和谐机器人。但是现在我有一个问题。我试图得到一个角色反应,但不知何故,我一直得到错误。我要把你的错误和我的代码联系起来,这样也许有人能帮我。 警告:https://hastebin.com/ativekefod.sql MessageReactionaddEvent.js:https://hastebin.com/nababomuta.js 谢谢你的帮助!

  • 我正试图通过我的机器人在我的服务器中按一定的顺序创建角色,但每次我运行该命令时,角色位置都是错误的。 代码: 理论上,这应该是有序的,但我不确定是怎么回事! 如有任何帮助,我们将不胜感激。

  • 所以当bot发送某个消息时,它也会对它做出反应。现在我试着检查一个对这种反应做出反应的用户是否扮演了一定的角色,但是到目前为止我还不能这样做。

  • 我目前正在建立一个不和谐验证机器人,这个机器人的一个功能,如果检查你是否有一个角色从每一个需要的类别,然后在最后产生你的角色的总结。目前,我有一个工作解决方案,它的功能完全符合我的要求,但它使用了一个很大的if堆栈,我对js很陌生,但被告知尽可能不要使用大的if/if else if堆栈。我已经研究了switch的案例,但不知道如何应用这些案例,所以我想知道是否有一种更优化的方法来实现我所需要的。

  • 我正在做一个giverole命令,就像!giverole{member}{role},但是我怎么知道bot最高角色是否高于提到的角色。我还没试过什么,因为我卡住了,请帮帮我。 我正在使用discord.js v12