我目前正在设计一款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
怎么会有效?我宁可没有一堆条件语句。
权限
我想到的另一个问题是权限级别。我在数据库中设置了每个角色。
+----+-----------+
| 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);
}
});
如果他们拥有名为“master”的权限,他们就可以创建一个角色。
这就是我存储用户信息的方式。
-------------------+
| id | username | discord_id | permissions
|
+----+---------------+--------------------+-------------------------------------------------------+
| 1 | kurieita | 000000000 | {"test":true,"master":true,"admin":true,"guest":true} |
显然我有角色并可以执行命令。但是,如果我将某人设置为“管理员”,我也希望他们拥有主持人的权力。我也必须给他们版主的权力。
观
以下是我提出的想法(当我写这篇文章时)
为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数组中。
问题
感谢任何帮助。 先谢谢你。