emit-blacklist:完美拦截黑名单用户的消息[正在测试]

警告:这个插件修改了koishi的ctx.emit方法,这会影响到整个事件系统(通常情况下这不会影响koishi其他部分和其他插件的运行),我暂时不能保证它没有Bug,请避免在生产环境使用,如果出现任何问题可在非官方群@2596628651进行反馈

这个插件会从根源上拦截一条消息的接收。
koishi收到消息后的顺序是这样的:

graph TD
    subgraph "外部平台与适配器"
        A["聊天平台<br/>(QQ, Discord等)"] --> B["适配器 Adapter<br/>接收原始事件"]
        B --> C["创建标准 Session 对象"]
        C --> D["bot.dispatch(session)"]
    end

    subgraph "Koishi 核心事件广播"
        D -- "主要调用" --> E{"ctx.emit<br/>广播核心事件"}
        E -- "同时广播" --> F["'message-created' 事件"]
        E -- "同时广播" --> G["'message' 事件"]
    end

    subgraph "事件监听与处理"
        G -- "广播给所有监听者" --> H["ctx.on('message', ..., true)<br/>高优先级事件监听器"]
        G --> I["<b>Koishi 核心中间件系统</b><br/>(它本身也是一个 message 事件监听器)"]
        G --> J["ctx.on('message', ...)<br/>普通优先级事件监听器"]
    end

    subgraph "中间件串行处理栈"
        I --> K["开始执行中间件栈"]
        K --> L{"前置中间件<br/>ctx.middleware(..., true)"}
        L -- "调用 next()" --> M{"普通中间件<br/>ctx.middleware(...)"}
        L -- "直接 return" --> Z(["流程中断"])
        M -- "调用 next()" --> N{"指令解析中间件"}
        M -- "直接 return" --> Z
        N -- "匹配成功" --> O["执行指令 Action 函数"]
        N -- "匹配失败" --> P(["流程结束"])
        O --> Q["通过 session.send() 等方式响应"]
    end

    style I fill:#f9f,stroke:#333,stroke-width:2px

emit-blacklist直接修改了app.emit,当一个message/message-created事件将要被广播时,插件会提取session中的platform和userid并进行匹配,如果发现是黑名单用户,会阻止广播。如果不是黑名单用户,会继续之后的广播流程。

1 个赞

该插件原理是覆写了之前的 emit,在原本的 emit 处理前套了一层判断逻辑。本质想实现事件前置中间件的效果

2 个赞

那就不用手动bot去qq里拉黑人了,看着不错

1 个赞

不太准确,如果在前置中间件里拦截的话,是拦截不到其他插件对message事件的监听的

1 个赞