首页 文章

Discord Bot | DiscordJS |使用Javascript

提问于
浏览
0

所以我一直在使用Discord.JS库制作Discord机器人,我遇到了一个问题 . 很确定问题与Javascript和Discord.JS有关,所以我会问这里并希望得到一些帮助 .

我有一个名为commandManager.js的文件,它包含我所有的基本命令功能 . 其中一个是自动加载来自/ commands /文件夹的命令,并根据它们的类别(通过导出在命令中指定)将它们分配给一个数组 .

global.userCommands = {};
global.modCommands = {};
global.adminCommands = {};
global.ownerCommands = {};

exports.init = function(bot)
{
    fs.readdir("./commands/", (error, files) =>
    {
        if (error)
        {
            logger.error(error);
        }

        files.forEach(file =>
        {
            let commandFile = require(`../commands/${file}`);
            let commandName = file.split(".")[0];
            if (commandFile.info.category == "User")
            {
                userCommands[commandName] = commandFile;
            }
            else if (commandFile.info.category == "Mod")
            {
                modCommands[commandName] = commandFile;
            }
            else if (commandFile.info.category == "Admin")
            {
                adminCommands[commandName] = commandFile;
            }
            else if (commandFile.info.category == "Owner")
            {
                ownerCommands[commandName] = commandFile;
            }
            else
            {
                logger.warn("Could not add the command " + commandName + " to any of the categories");
            }
        });

        logger.info("Loaded " + files.length + " command(s)");
    });
}

然后,我可以在实际的机器人消息位中使用命令,我做了如下:

exports.run = function(bot, msg)
{   
    const args = msg.content.slice(config.prefix.length).trim().split(/ +/g);
    const command = args.shift().toLowerCase();
    const cleanCommand = command.slice(config.prefix.length);

    if (msg.author.bot)
    {
        return;
    }   
    else if (msg.content.indexOf(config.prefix) !== 0) 
    {
        return;
    }   
    else if (has.call(userCommands, cleanCommand))
    {
        msg.reply("user");
    }
    else if (has.call(modCommands, cleanCommand))
    {

    }
    else if (has.call(adminCommands, cleanCommand))
    {

    }
    else if (has.call(ownerCommands, cleanCommand))
    {

    }
    else
    {
        msg.reply(`that command does not even exist! You can say ${config.prefix}help for a list of commands!`);
    }
}

因此,当我说命令例如“ping”时,它应该回复msg.reply(“user”),但它说它不存在任何东西 . 我宣称像这样的全球性,你很好奇 .

global.has = Object.prototype.hasOwnProperty;

如果你想看到命令,它如下:

exports.info =
{
    name: "Ping",
    permission: 10,
    category: "User",
    about: "Makes the bot respond with pong, useful to see if the bot is working."
};

exports.run = function(msg)
{
    msg.channel.send("Pong!");
}

任何提示,参考,示例,或只是普通的勺子喂食是100%欢迎 . 另外,如果你想分享一些更好的技巧来做我正在做的事情,请告诉我,因为我只是一个JS的初学者 .

1 回答

  • 0

    以下是完全基于意见的......

    我打赌你想要使用嵌套命令,例如播放音乐和播放视频,所以在我看来,命令树将成为这里的方式 . 因此,也无需解析文件夹中的命令,而是可以拥有更独立的结构 . 起始文件如下所示:

    module.exports = (sub, exit) => ({ 
      //a global handler applied to all commands:
      [sub]:(user)=>"Hi there!",
      //a main exit point ( if a command cannot be found)
      [exit]:{
        run:(user,command)=>"Sorry ${command} doesnt exist"
      },
      //commands
      play: {
        //the following is applied to "play whatever"
        [exit]:{
          desc:"a random command",
          run:(user, ...args) => args.join(" "),
          category:"random"
        },
        //the following is applied to all subcommands
        [sub]:(user)=> user.admin?"start playing":new Error("you must be an admin"),
    
        //the subcommands
        video:{
          //sub sub commands maybe
          [exit]: {
            info: "to play videos",
            run(user, videoname)=> videoname+".mp4"
          }
       },
       //one can also use require here
       whatever: require("./whatever.js")(sub,exit)
     });
    

    使用此模式可以将代码应用于一大堆命令(通过 [sub] ),并且可以使用子命令等(通过 [exit] )运行命令 . 现在让我们实现路由:

    const exit = Symbol("exit"), sub = Symbol("sub");
    //requiring the above tree
    const routes = require("./commands.js")(exit,sub);
    //implementing the router:
    function route(tree, user, params ){
      var res;
      //the [sub] implementation
      if( tree[sub] ){
        res = tree[sub]( user, ...params);
        if( res instanceof Error ){
           //if an error applied exit now
           return "An error occured:"+res;
        }
      }
    
      if( tree[ params[0] ] ){
        return res + "\n" + route( tree[ params[0] , user, params.slice(1) );
      } else {
        return res + " \n" + tree[exit].run(user, params);
      }
    }
    

    为了让它运行:

    msg.reply(
      route(
       routes,
       {admin:true, /*...*/ },
       msg.content.split(" ")
     )
    );
    

    您仍然可以使用每个类别处理程序等扩展它 .

相关问题