开发插件
1.定义插件
ts
import { Plugin } from '@atri-bot/core'
// 定义一个插件
// 一个插件必须导出 plugin 变量
export const plugin = new Plugin('插件名')2.注册事件
具体事件名可以参考 node-napcat-ts
ts
export const plugin = new Plugin('插件名')
.onInstall(() => {
// 可以编写部分逻辑
})
.onUninstall(() => {
// 卸载时触发
})
// 事件简单分为四大类, 具体每个端点可以通过endPoint选项来配置
// 更多参数配置均为链式调用
export const command = plugin
// 创建一个command
.command('trigger')
export const message = plugin.message('可选trigger')
export const notice = plugin.notice()
export const request = plugin.request()其中每个具体函数的类型:
ts
interface CommandContext<T extends keyof MessageHandler, K extends Argv> {
context: MessageHandler[T]
options: ReturnType<K['parseSync']>
}
interface CommandEvent<T extends keyof MessageHandler = keyof MessageHandler, K extends Argv = Argv> {
// 事件类型, 通过函数注册自动传入
type: 'command'
// 端点
endPoint?: T
// 触发器
trigger: string | RegExp
// 优先级
priority?: number
// 需要被回复
needReply?: boolean
// 需要是管理员
needAdmin?: boolean
// 在帮助插件中隐藏
hideInHelp?: boolean
// 插件名, 通过函数注册自动传入
pluginName: string
// 命令解析器
commander?: () => K
// 回调函数
callback: (context: CommandContext<T, K>) => MaybePromise<void | 'quit'>
}
interface MessageContext<T extends keyof MessageHandler> {
context: MessageHandler[T]
}
interface MessageEvent<T extends keyof MessageHandler = keyof MessageHandler> {
type: 'message'
endPoint?: T
trigger?: string | RegExp
priority?: number
needReply?: boolean
needAdmin?: boolean
pluginName: string
callback: (context: MessageContext<T>) => MaybePromise<void | 'quit'>
}
interface NoticeContext<T extends keyof NoticeHandler> {
context: NoticeHandler[T]
}
interface NoticeEvent<T extends keyof NoticeHandler = keyof NoticeHandler> {
type: 'notice'
endPoint?: T
priority?: number
pluginName: string
callback: (context: NoticeContext<T>) => MaybePromise<void | 'quit'>
}
interface RequestContext<T extends keyof RequestHandler> {
context: RequestHandler[T]
}
interface RequestEvent<T extends keyof RequestHandler = keyof RequestHandler> {
type: 'request'
endPoint?: T
priority?: number
pluginName: string
callback: (context: RequestContext<T>) => MaybePromise<void | 'quit'>
}3.管理插件配置
使用 setDefaultConfig 来设置插件的默认配置文件, 如果本地的 configDir 下有对应插件的配置文件, 他就会自动去读取, 如果没有那就会使用 defaultConfig 去创建, 如果两个配置文件有重叠, 优先本地配置文件
ts
const config = {
...defaultConfig,
...localConfig
}ts
interface Config {
reply: string
}
const plugin = new Plugin<Config>('bot')
.setDefaultConfig([{
key: 'reply',
val: 'pong',
comment: '添加注释',
place: 'top' // 注释位置
}])
.onInstall(({ config }) => {
console.log(config)
})5.Bot 工具方法
bot 提供了常用的消息与用户工具,方便在插件内直接调用:
TIP
bot 在使用 callback/onInstall 等事件注册的时候从上下文提取
ts
const plugin = new Plugin('bot')
export const command = plugin
// 创建一个command
.command('trigger')
.callback(({ bot }) => {
console.log(bot)
})ts
bot.sendMsg(context, [Structs.text('Hello, ATRI!')], { reply: false, at: false })
await bot.sendForwardMsg(
{ message_type: 'group', group_id: context.group_id },
[Structs.node(context.user_id, '日志', '多条消息...')],
)
const friend = await bot.isFriend({ user_id: context.user_id })
const nickname = await bot.getUsername({ user_id: context.user_id, group_id: context.group_id })sendMsg默认会自动引用并 @ 触发者,可通过第三个参数关闭。sendForwardMsg用于发送合并转发,传入Structs.node数组即可。isFriend与getUsername帮助快速访问 NapCat 的基础信息,减少重复 API 调用。- 所有
reg*Event函数都会返回一个卸载函数,若插件需要动态开关某个监听,可以保存后在适当时机调用。
6.插件示例
可参考 ATRI Plugins