使用与编写插件
为什么需要插件
对于一些常用的功能,比如测试用的 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!!!