一套从聊天消息中获取指令和参数的框架
主要用于osu!qq群消息
npm install Exsper/chatcommand
使用起来很简单
const {CommandHelper, CommandInfo, param_user, param_mode} = require("chatcommand"); let ch = new CommandHelper(["!", "!"]); let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], "绑定", [param_mode, param_user]); ch.add(ci); let data = ch.run("!bind Exsper:3"); console.log(data);
data = { type: 'bindaccount', command: 'bind', info: '绑定', param: { mode: 3, user: 'Exsper' } }
const {CommandHelper} = require("chatcommand");
CommandHelper构造函数具有4个参数,分别为
- 指令前缀 可以为单个字符串,也可为字符串数组
let ch1 = new CommandHelper("!"); let ch2 = new CommandHelper(["!", "!"]);
- 额外参数 当有多个指令前缀时,给具体的指令加上指定的额外参数,如不需要该功能则设为[]
let ch1_1 = new CommandHelper(["!", "?"], [{ server: 1 }, { server: 2 }]); let ci1_1 = new CommandInfo("best", ["bp"], "bp列表", [param_user]); ch1_1.add(ci1_1); let data1 = ch1_1.run("!bp exsper"); let data2 = ch1_1.run("?bp exsper");
data1 = { server: 1, type: 'best', command: 'bp', info: 'bp列表', param: { user: 'exsper' } } data2 = { server: 2, type: 'best', command: 'bp', info: 'bp列表', param: { user: 'exsper' } }
- 帮助指令 字符串或字符串数组,用于显示具体指令的帮助,默认为
["help"]
如果是字符串形式,则其为帮助指令,返回指令列表
如果是数组形式,则其中第一个元素为帮助指令,其他元素作为返回信息
let ch3 = new CommandHelper(["!", "!"], [], "帮助"); let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], "绑定", [param_user, param_mode]); ch3.add(ci); let data = ch3.run("!帮助 bind"); console.log(data.help); let data2 = ch3.run("!帮助"); console.log(data2.help); let ch3_1 = new CommandHelper(["!", "!"], [], ["帮助", "去官网查吧", "我懒"]); let data2_1 = ch3_1.run("!帮助"); console.log(data2_1.help);
data.help = "绑定\n指令:bind/set/setid\n参数:user/:mode" data2.help = "指令列表:\nbind\n输入 help + 指令名称 查看具体指令帮助" data2_1.help = "去官网查吧\n我懒"
- 初始指令格式 为CommandInfo数组,可以省略该参数,后面用
add()添加
let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], "绑定", [param_user, param_mode]); let ch4 = new CommandHelper(["!", "!"], [], "帮助", [ci]);
-
add()添加指令(默认直接启用) -
del()删除指令(参数为指令格式中的一种指令字符串) -
enableCi()启用指令(参数为指令格式中的一种指令字符串) -
disableCi()停用指令(参数为指令格式中的一种指令字符串)
let ch3 = new CommandHelper(["!", "!"], [], "帮助"); let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], "绑定", [param_user, param_mode]); // 添加指令 ch3.add(ci); // 删除指令 ch3.del("set"); // !set、!bind和!setid指令被永久删除 // 重新添加指令 ch3.add(ci); // 停用指令 ch3.disableCi("set"); // !set、!bind和!setid指令被停用 // 启用指令 ch3.enableCi("set"); // !set、!bind和!setid指令又可以使用了
const {CommandInfo} = require("chatcommand");
CommandInfo构造函数具有4个参数,分别为
let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], "绑定", [param_user, param_mode]);
-
指令类别 字符串格式,你在获取参数后处理时可能会用到
-
指令名称 字符串或字符串数组,这是指令主体
-
指令说明 字符串或字符串数组,帮助里会用到
如果是数组形式,则其中第一个元素为说明标题,其他元素将作为额外说明被添加到说明末尾
let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], ["绑定", "允许的mode:osu=0/taiko=1/catch=2/mania=3"]);
- 指令参数 为Param数组,可以省略该参数,后面用
addParam()添加
let ci = new CommandInfo("bindaccount", ["bind", "set", "setid"], "绑定"); ci.addParam([param_user, param_mode]); // 或者 ci.addParam(param_user).addParam(param_mode);
const {Param} = require("chatcommand");
框架已经内置了几种参数格式,可以直接使用
const {param_index, param_mode, param_mods, param_user} = require("chatcommand"); // 定义如下 const {dataType} = require("chatcommand"); /** mode 默认参数 */ const param_mode = new Param("mode", [":", ":"], dataType.integer); /** mods 默认参数 */ const param_mods = new Param("mods", ["+", "+"], dataType.mods); /** index 默认参数 */ const param_index = new Param("index", ["#", "#"], dataType.integer); /** user 默认参数 */ const param_user = new Param("user", [], dataType.string);
也可以使用自定义参数
let ci = new CommandInfo("score", ["score", "s"], "成绩"); let p1 = new Param("beatmapid", "&", dataType.integer); ci.addParam([param_user, param_mode, param_mods, p1]); commandHelper.add(ci); let data = commandHelper.run("!s exsper &114514 :3 +HDDT"); console.log(data.param);
data.param = { mode: 3, mods: 72, beatmapid: 114514, user: 'exsper' }
Param构造函数具有4个参数,分别为
-
参数名称 字符串,该参数的名称
-
参数前缀 字符串或字符串数组,无前缀请用""或[],如果非单字节第一位必须要为符号
一条指令最多只能有一个无前缀参数!无前缀参数请尽量放在末尾或最后一个导入
特别的,如果你习惯于key value形式的参数,那也可以在这里使用,但是第一位必须要用符号
let ch4 = new CommandHelper(["!", "!"]); let ci4 = new CommandInfo("best", ["bp"], "bp"); let p4_1 = new Param("from", ["@from", "@start"], dataType.date); let p4_2 = new Param("to", ["@to", "@end"], dataType.date); ci4.addParam([param_user, param_mode, p4_1, p4_2]); ch4.add(ci4); data = ch4.run("!bp exsper @from 2012年12月12日 @end 2222年2月22日");
data.param = { from: 2012-12-12T00:00:00.000Z, to: 2222-02-21T16:00:00.000Z, user: 'exsper' }
- 数据格式 获取到参数后需要对其进行格式转换
dataType = { /** 任意字符串 */ string: 0, /** 纯数字 */ integer: 1, /** 多项mods */ mods: 2, /** 日期 */ date: 3, }
- 以空格结束 这将使正则匹配改为非贪婪模式,一般情况下不建议使用
let ch5 = new CommandHelper(["!", "!"]); let ci5_1 = new CommandInfo("score1", ["score1", "s1"], "成绩"); let ci5_2 = new CommandInfo("score2", ["score2", "s2"], "成绩"); let p5_1 = new Param("mode", "#", dataType.string, true); let p5_2 = new Param("mode", "#", dataType.string, false); ci5_1.addParam([p5_1, param_user]); ci5_2.addParam([p5_2, param_user]); ch5.add([ci5_1, ci5_2]); data1 = ch5.run("!s1#catch exsper"); // param: { mode: 'catch', user: 'exsper' } data2 = ch5.run("!s2#catch exsper"); // param: { mode: 'catch exsper' }
有任何问题或建议可以提交issue