{"id":19019341,"url":"https://github.com/exsper/chatcommand","last_synced_at":"2026-04-27T18:30:17.939Z","repository":{"id":143942008,"uuid":"482328521","full_name":"Exsper/chatcommand","owner":"Exsper","description":"一套从聊天消息中获取指令和参数的框架","archived":false,"fork":false,"pushed_at":"2022-04-26T12:55:06.000Z","size":50,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-02T00:11:05.827Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Exsper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-16T18:14:46.000Z","updated_at":"2022-04-16T18:16:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"5e7ebd1c-fb5c-4856-add5-4f0d993eb97b","html_url":"https://github.com/Exsper/chatcommand","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exsper%2Fchatcommand","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exsper%2Fchatcommand/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exsper%2Fchatcommand/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exsper%2Fchatcommand/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Exsper","download_url":"https://codeload.github.com/Exsper/chatcommand/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240063929,"owners_count":19742227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T20:12:02.862Z","updated_at":"2026-04-27T18:30:17.881Z","avatar_url":"https://github.com/Exsper.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# chatcommand\n\n一套从聊天消息中获取指令和参数的框架\n\n主要用于osu!qq群消息\n\n## 安装\n\n```\nnpm install Exsper/chatcommand\n```\n\n## 使用\n\n### 示例\n\n使用起来很简单\n```javascript\nconst {CommandHelper, CommandInfo, param_user, param_mode} = require(\"chatcommand\");\nlet ch = new CommandHelper([\"!\", \"！\"]);\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"], \"绑定\", [param_mode, param_user]);\nch.add(ci);\nlet data = ch.run(\"！bind Exsper:3\");\nconsole.log(data);\n```\n```javascript\ndata = {\n  type: 'bindaccount',\n  command: 'bind',\n  info: '绑定',\n  param: { mode: 3, user: 'Exsper' }\n}\n```\n\n\n\n### 指令管理器 CommandHelper\n\n#### 引用\n\n```javascript\nconst {CommandHelper} = require(\"chatcommand\");\n```\n\n#### 说明\n\nCommandHelper构造函数具有4个参数，分别为\n\n - 指令前缀 可以为单个字符串，也可为字符串数组\n\n```javascript\nlet ch1 = new CommandHelper(\"!\");\nlet ch2 = new CommandHelper([\"!\", \"！\"]);\n```\n\n - 额外参数 当有多个指令前缀时，给具体的指令加上指定的额外参数，如不需要该功能则设为[]\n\n```javascript\nlet ch1_1 = new CommandHelper([\"!\", \"?\"], [{ server: 1 }, { server: 2 }]);\nlet ci1_1 = new CommandInfo(\"best\", [\"bp\"], \"bp列表\", [param_user]);\nch1_1.add(ci1_1);\nlet data1 = ch1_1.run(\"!bp exsper\");\nlet data2 = ch1_1.run(\"?bp exsper\");\n```\n\n```javascript\ndata1 = {\n  server: 1,\n  type: 'best',\n  command: 'bp',\n  info: 'bp列表',\n  param: { user: 'exsper' }\n}\ndata2 = {\n  server: 2,\n  type: 'best',\n  command: 'bp',\n  info: 'bp列表',\n  param: { user: 'exsper' }\n}\n```\n\n - 帮助指令 字符串或字符串数组，用于显示具体指令的帮助，默认为```[\"help\"]```\n\n如果是字符串形式，则其为帮助指令，返回指令列表\n\n如果是数组形式，则其中第一个元素为帮助指令，其他元素作为返回信息\n\n```javascript\nlet ch3 = new CommandHelper([\"!\", \"！\"], [], \"帮助\");\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"], \"绑定\", [param_user, param_mode]);\nch3.add(ci);\nlet data = ch3.run(\"！帮助 bind\");\nconsole.log(data.help);\n\nlet data2 = ch3.run(\"！帮助\");\nconsole.log(data2.help);\n\nlet ch3_1 = new CommandHelper([\"!\", \"！\"], [], [\"帮助\", \"去官网查吧\", \"我懒\"]);\nlet data2_1 = ch3_1.run(\"！帮助\");\nconsole.log(data2_1.help);\n```\n\n```javascript\ndata.help = \"绑定\\n指令：bind/set/setid\\n参数：user/:mode\"\ndata2.help = \"指令列表：\\nbind\\n输入 help + 指令名称 查看具体指令帮助\"\ndata2_1.help = \"去官网查吧\\n我懒\"\n```\n\n- 初始指令格式 为CommandInfo数组，可以省略该参数，后面用```add()```添加\n\n```javascript\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"], \"绑定\", [param_user, param_mode]);\nlet ch4 = new CommandHelper([\"!\", \"！\"], [], \"帮助\", [ci]);\n```\n\n### 指令管理\n\n- ```add()```添加指令（默认直接启用）\n\n- ```del()```删除指令（参数为指令格式中的一种指令字符串）\n\n- ```enableCi()```启用指令（参数为指令格式中的一种指令字符串）\n\n- ```disableCi()```停用指令（参数为指令格式中的一种指令字符串）\n\n```javascript\nlet ch3 = new CommandHelper([\"!\", \"！\"], [], \"帮助\");\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"], \"绑定\", [param_user, param_mode]);\n\n// 添加指令\nch3.add(ci);\n// 删除指令\nch3.del(\"set\");\n// !set、!bind和!setid指令被永久删除\n\n// 重新添加指令\nch3.add(ci);\n// 停用指令\nch3.disableCi(\"set\");\n// !set、!bind和!setid指令被停用\n\n// 启用指令\nch3.enableCi(\"set\");\n// !set、!bind和!setid指令又可以使用了\n```\n\n\n\n\n\n### 指令格式 CommandInfo\n\n#### 引用\n\n```javascript\nconst {CommandInfo} = require(\"chatcommand\");\n```\n\n#### 说明\n\nCommandInfo构造函数具有4个参数，分别为\n\n```javascript\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"], \"绑定\", [param_user, param_mode]);\n```\n\n - 指令类别 字符串格式，你在获取参数后处理时可能会用到\n\n - 指令名称 字符串或字符串数组，这是指令主体\n\n - 指令说明 字符串或字符串数组，帮助里会用到\n\n如果是数组形式，则其中第一个元素为说明标题，其他元素将作为额外说明被添加到说明末尾\n\n```javascript\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"],\n           [\"绑定\", \"允许的mode：osu=0/taiko=1/catch=2/mania=3\"]);\n```\n\n - 指令参数 为Param数组，可以省略该参数，后面用```addParam()```添加\n\n```javascript\nlet ci = new CommandInfo(\"bindaccount\", [\"bind\", \"set\", \"setid\"], \"绑定\");\nci.addParam([param_user, param_mode]);\n// 或者\nci.addParam(param_user).addParam(param_mode);\n```\n\n\n\n### Param 参数格式\n\n#### 引用\n\n```javascript\nconst {Param} = require(\"chatcommand\");\n```\n\n#### 说明\n\n框架已经内置了几种参数格式，可以直接使用\n\n```javascript\nconst {param_index, param_mode, param_mods, param_user} = require(\"chatcommand\");\n\n// 定义如下\n\nconst {dataType} = require(\"chatcommand\");\n\n/** mode 默认参数 */\nconst param_mode = new Param(\"mode\", [\":\", \"：\"], dataType.integer);\n/** mods 默认参数 */\nconst param_mods = new Param(\"mods\", [\"+\", \"＋\"], dataType.mods);\n/** index 默认参数 */\nconst param_index = new Param(\"index\", [\"#\", \"＃\"], dataType.integer);\n/** user 默认参数 */\nconst param_user = new Param(\"user\", [], dataType.string);\n```\n\n也可以使用自定义参数\n\n```javascript\nlet ci = new CommandInfo(\"score\", [\"score\", \"s\"], \"成绩\");\nlet p1 = new Param(\"beatmapid\", \"\u0026\", dataType.integer);\nci.addParam([param_user, param_mode, param_mods, p1]);\n\ncommandHelper.add(ci);\nlet data = commandHelper.run(\"!s exsper \u0026114514 :3 +HDDT\");\nconsole.log(data.param);\n```\n\n```javascript\ndata.param = { mode: 3, mods: 72, beatmapid: 114514, user: 'exsper' }\n```\n\nParam构造函数具有4个参数，分别为\n\n - 参数名称 字符串，该参数的名称\n\n - 参数前缀 字符串或字符串数组，无前缀请用\"\"或[]，如果非单字节第一位必须要为符号\n\n一条指令最多只能有一个无前缀参数！无前缀参数请尽量放在末尾或最后一个导入\n\n特别的，如果你习惯于```key value```形式的参数，那也可以在这里使用，但是第一位必须要用符号\n\n```javascript\nlet ch4 = new CommandHelper([\"!\", \"！\"]);\nlet ci4 = new CommandInfo(\"best\", [\"bp\"], \"bp\");\nlet p4_1 = new Param(\"from\", [\"@from\", \"@start\"], dataType.date);\nlet p4_2 = new Param(\"to\", [\"@to\", \"@end\"], dataType.date);\nci4.addParam([param_user, param_mode, p4_1, p4_2]);\nch4.add(ci4);\ndata = ch4.run(\"!bp exsper @from 2012-12-12 @end 2222-2-22\");\n```\n\n```javascript\ndata.param = {\n  from: 2012-12-12T00:00:00.000Z,\n  to: 2222-02-21T16:00:00.000Z,\n  user: 'exsper'\n}\n```\n\n - 数据格式 获取到参数后需要对其进行格式转换\n\n```javascript\ndataType = {\n    /** 任意字符串 */\n    string: 0,\n    /** 纯数字 */\n    integer: 1,\n    /** 多项mods */\n    mods: 2,\n    /** 日期 */\n    date: 3,\n}\n```\n\n - 以空格结束 这将使正则匹配改为非贪婪模式，一般情况下不建议使用\n\n```javascript\nlet ch5 = new CommandHelper([\"!\", \"！\"]);\nlet ci5_1 = new CommandInfo(\"score1\", [\"score1\", \"s1\"], \"成绩\");\nlet ci5_2 = new CommandInfo(\"score2\", [\"score2\", \"s2\"], \"成绩\");\nlet p5_1 = new Param(\"mode\", \"#\", dataType.string, true);\nlet p5_2 = new Param(\"mode\", \"#\", dataType.string, false);\nci5_1.addParam([p5_1, param_user]);\nci5_2.addParam([p5_2, param_user]);\nch5.add([ci5_1, ci5_2]);\ndata1 = ch5.run(\"!s1#catch exsper\");\n// param: { mode: 'catch', user: 'exsper' }\ndata2 = ch5.run(\"!s2#catch exsper\");\n// param: { mode: 'catch exsper' }\n```\n\n## issue\n\n有任何问题或建议可以提交issue\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexsper%2Fchatcommand","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexsper%2Fchatcommand","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexsper%2Fchatcommand/lists"}