会话过滤器
TIP
请不要滥用这项功能,在源码中直接书写账号或群号以实现过滤,这将导致其他用户无法使用你的插件。推荐在控制台中使用过滤器。
一个 上下文 (Context) 描述了机器人的一种可能的运行环境。例如,如果一个指令或中间件被绑定在了上面例子中的上下文,那么只有该环境下的事件才会触发对应的回调函数。之前介绍过的 ctx.on()
, ctx.middleware()
以及 ctx.plugin()
这些 API 都是上下文类所提供的方法。
属性选择器
我们可以通过 属性选择器 (Attribute Selector) 来快速创建新的上下文:
ts
ctx.user('112233') // 选择来自用户 112233 的会话
ctx.self('112233') // 选择发送给机器人 112233 的会话
ctx.guild('445566') // 选择来自群组 445566 的会话
ctx.channel('778899') // 选择来自频道 778899 的会话
ctx.platform('discord') // 选择来自平台 discord 的会话
这种写法也支持链式的调用:
ts
// 选择来自平台 discord 中用户 112233 的会话
ctx.platform('discord').user('112233')
利用上下文,你可以非常方便地对每个环境进行分别配置:
ts
// 在所有环境注册中间件
ctx.middleware(callback)
// 注册指令 my-command,仅对机器人 112233 有效
ctx.self('112233').command('my-command')
// 当有人申请加群 445566 时触发 listener
ctx.guild('445566').on('guild-request', listener)
// 安装插件 ./my-plugin,仅限 OneBot 平台使用
ctx.platform('onebot').plugin(require('./my-plugin'))
是不是非常方便呢?
条件选择器
如果感觉简单的会话过滤器无法满足你的需求,你也可以给一个上下文添加 条件选择器 (Condition Selector):它传入一个会话对象,并返回一个布尔类型。过滤器有三种添加方式:
ts
// 满足当前上下文条件,且消息内容为“啦啦啦”
ctx.intersect(session => session.content === '啦啦啦')
// 满足当前上下文条件,或消息内容为“啦啦啦”
ctx.union(session => session.content === '啦啦啦')
// 满足当前上下文条件,且消息内容不为“啦啦啦”
ctx.exclude(session => session.content === '啦啦啦')
上述方法也可以传入一个上下文作为参数,分别表示两个上下文的交集、并集和差集:
ts
// 选择来自群组 1122233 和用户 445566 的会话
ctx.guild('112233').intersect(ctx.user('445566'))
// 选择来自群组 1122233 或用户 445566 的会话
ctx.guild('112233').union(ctx.user('445566'))
// 选择来自群组 1122233 的会话,但来自用户 445566 的会话除外
ctx.guild('112233').exclude(ctx.user('445566'))
与选择器方法类似,过滤器方法也会返回一个新的上下文,你可以在其上自由的添加监听器、中间件、指令和插件。