使用与编写插件
为什么需要插件
对于一些常用的功能,比如测试用的 echo 和展示进程管理器,我们没有必要在实现每一个具体的事务时去实现它们,只需要给事务函数套上一个插件,就可以在事务中一行代码都不用写就能完成对于某个 QQ 好友的事务注册。
内置插件
时间有限,我只提供了两个插件: echo 和 pm,它们的用法如下:
import { mapper, LagrangeContext, PrivateMessage, plugins } from 'lagrange.onebot';
export class ... {
    @mapper.onPrivateUser(1193466151)
    @plugins.use('echo')
    async handleJinhui(c: LagrangeContext<PrivateMessage>) {
    }
}
一行注解/装饰器就能将当前 echo 插件安装到对于 1193466151 这个用户的事务函数上。
这样一来,每当这个用户使用 \echo xxx 和机器人对话时,机器人就会重复 xxx 的内容:

这个功能可以用于快速调试机器人。
pm 则是将 pm2 工具的日志信息发送到 QQ 上。
自定义插件
想要自定义插件,则需要使用全局对象 plugins 的 register 装饰器。比如我们这里实现一个简单的图片链接下载器:
User: \wget-image https://picx.zhimg.com/80/v2-bdae55043d61d7bcfeeabead6e953959_1440w.jpeg
Bot: <图片>
注册插件的事务函数的函数签名必须是:
(c: LagrangeContext<Message>) => any;
我们先在 快速开始 的基础上新建一个 plugins.ts 文件。
// plugins.ts
import { plugins, LagrangeContext, Message } from 'lagrange.onebot';
export class Impl {
    @plugins.register('wget-image')
    async wgetImage(c: LagrangeContext<Message>) {
        // 判断一下,只解析 message 类型的数据
        if (c.message.post_type === 'message') {
            const text = c.message.raw_message;
            if (text.startsWith('\\wget-image')) {
                const url = text.substring('\\wget-image'.length).trim();
                c.sendMessage([
                    {
                        type: 'image',
                        data: {
                            file: url,
                            timeout: 10000
                        }
                    }
                ]);
                // 插件中使用 finishSession 会让被装饰的事务函数不再被执行,直接结束对话
                c.finishSession();
            }
        }
    }
}
在 impl.ts 中安装它:
import './plugins';
import { mapper, plugins, LagrangeContext, PrivateMessage, GroupMessage, Send } from 'lagrange.onebot'
export class Impl {
    @mapper.onPrivateUser(1193466151)
    @plugins.use('wget-image')
    async handleJinhui(c: LagrangeContext<PrivateMessage>) {
        c.finishSession();
    }
}
最终的效果

Finally, have fun!!!

