我尝试两个方式但感觉仍然不够好…总感觉不够优雅(?)
一:用前置中间件的方式去判断对话的内容,如果符合命令的特征则断掉后续执行,但这相较于内置的权限系统就要写很多东西,因为子命令和其本身是不小写不敏感的,衔接也可以用空格或小数点,这都可以触发koshi的指令,所以中间件也必须实现这些完整的判断再能拦下来。
二:用注册指令时的 permissions 来自定义个,然后用 ctx.permissions.provide 抛个判断进去,这种方式虽然可以很方便的实现只有达成前提条件后指令才可以被执行,但这个方法想要自定义无权限的提示文本就要去本地化里把原来的 low-authority 换成空的,再在 send 一个文本。
不知道还有没有其它方法实现这样的效果,最终想达成只有用户在执行完登录操作(获取 Cookies)之后其余功能才随之开放
1 个赞
ctx.command('指令名称', '描述')
// ctx.command('指令名称', '描述', { authority: 3 }) // 不在这里指定authority,而是在下面的action里实现判断
.alias('别名')
.userFields(["id", "name", "authority"])
.example('指令名称 -h')
.action(async ({ session }) => {
const userauthority = session.user.authority
ctx.logger.info(userauthority)
if (userauthority < 3) {
await session.send("泥奏凯") // 这里是对低权限用户的提示语
return
}
// 在这里写正常的指令逻辑
});
1 个赞
那俺也贴下第二个方式的代码,也许对其他人有参考意义
// 命令权限控制
ctx.permissions.provide('Blive:Login', (name, session) => { return this.isClient(session.userId) })
// 基础命令注册
ctx.command('blive', '监听B站用户', { authority: 1 }).action(({ session }) => { })
ctx.command('blive.Login', '登录管理', { authority: 1 }).action(({ session }) => { })
ctx.command('blive.Login.QRcode', '使用扫码登录', { authority: 1 }).action(({ session }) => {
})
ctx.command('blive.Live', '直播相关', { permissions: ['Blive:Login'], authority: 1 }).action(({ session }) => {
})
1 个赞