我目前正在设计一个Discord机器人 . 我正在研究一个模块来轻松制作命令 .

这是我目前的命令模块 .

module.exports = {
add: function(name, help, permissions, callback) {
    var command = {};
    command['name'] = name;
    command['help'] = help;
    command['permissions'] = permissions;
    command['callback'] = callback;

    list.push(command);
},

parse: function(message, data) {
    var args = message.split(' ');

    for (var i = 0; i < list.length; i++) {
        var command = list[i];

        if (command.name == args[0]) {
            isAuthorized(command.permissions, data, function() {
                console.log("RAN");
                command.callback(data, args);
            });
        }
    }
},

get: function() {
    return list;
}
}

以下是我将如何使用它 .

commands.add('ping', 'Send a ping-pong request.', null, function(data, args) {
if (args[1] == "-p") {
    discord.sendMessage({to: data.channelID, message: "pong"});
} else {
    discord.sendMessage({to: data.channelID, message: "ding"});
}
});

这一切都很好,但我担心设计 . 我不太喜欢它,因为它可能是越野车和烦人的 . 例如,上面只是用空格解析一个命令 . 像这样:

!ping -d

它将调用ping函数并检查args的第一个元素以查看它是否包含“-d”标志 . 我希望这和Linux终端类似 . 上面很简单,但是一个带有多个标志的命令呢?例如:

!ping -d -help

这显然会打印出“ding”,如果实现它还应该打印一些描述命令及其参数的东西 .

但如果我写的东西怎么样呢?

!ping -help -d -f -m

怎么会有效?我宁可没有一堆条件语句 .

Permissions

我想到的另一个问题是权限级别 . 我在数据库中设置了每个角色 .

+----+-----------+
| id | name      | 
+----+-----------+
|  1 | guest     |
|  2 | member    |
|  3 | mod       |
|  4 | developer |
|  5 | admin     |
|  6 | master    |
|  8 | owner     |
+----+-----------+

这些角色是使用此命令创建的 .

roles.createRole = function(name) {
database.insert('roles', ['name'], ['"' + name + '"']);
}

commands.add('createrole', 'Create a new role.', ['master'], function(data, args) {
var role = args[1];

if (role) {
    roles.createRole(role);
}
 });

如果他们拥有称为“主人”的权限,他们就能够创建一个角色 .

这就是我存储用户信息的方式 .

-------------------+ 
| id | username      | discord_id         | permissions                                           
|
+----+---------------+--------------------+-------------------------------------------------------+
|  1 | kurieita      | 000000000 |   {"test":true,"master":true,"admin":true,"guest":true} |

显然我有角色并且可以执行命令 . 但是,如果我将某人设置为“管理员”,我也希望他们拥有主持人的权力 . 我也必须给他们主持人的权力 .

Ideas

以下是我提出的想法(当我写这篇文章时)

  • 为database.roles添加“value”字段,并检查用户权限级别是否大于所需的权限字段 .

  • 我想过做一个更多的OOP方法 . 沿着这些方向的东西 .

var command = new Command(name, description); command.setCallback(function() {}); command.setFlag(name, function() {});

我没有真正考虑过这个或者它将如何工作 .

  • 我现在的另一个想法与我现在这样做的方式类似

commands.add(name, description, permissions, function(data, args, flags) {}

其中name和description是string,permission是索引数组 . 数据是基于数组的机会Discord信息(userID,channelID等),args是具有值的数组 . 例如: !message text "text"将是一个arg,而flags将包含前缀为"-"的任何内容 . 例如 !ping -d ,"d"将在flags数组中 .

Questions

  • 如何为我的discord bot命令模块实现类似Linux的解析器?

  • 处理权限级别的最佳方法是什么?

任何帮助表示赞赏 . 先谢谢你 .