Skip to content

示例

标签
插件示例
插件开发
进度
字数
1714 字
阅读时间
8 分钟

一个简单的 demo 示例,直接代码展示了。

准备工作

  • 打开 plugins/karin-plugin-example 目录,在此新建一个 index-demo.js 文件。

提示

鼠标轻扫代码块内的代码,可查看对应的类型或注释

函数式语法糖示例

以下所有示例都在 karin 对象中扩展出来,使用前请先导入 karin 对象。

js
import 
karin
from 'node-karin'

1. 命令正则处理

调用 karin.command 注册一个插件

IMPORTANT

  • command 的第一个参数为正则表达式,匹配消息是否触发该插件。
  • command 的第二个参数为命令的插件的方法函数或者或字符串、或segment元素类型。
  • command 的第三个参数为插件的配置项,具体请查看下方详细说明。

  • command 的第一种使用方法,直接回复字符串
js
import 
karin
from 'node-karin'
export const
test
=
karin
.
command
('^文本$', '这是一段文本消息')
  • command 的第二种使用方法,传入segment元素
js
import 
karin
, { segment } from 'node-karin'
export const
text
=
karin
.
command
(/^#文本测试$/, segment.
text
('这是一段文本消息'))
  • command 的第三种使用方法,回调函数
js
import { 
karin
, segment } from 'node-karin'
// 参数二支持同步和异步函数 export const
callback
=
karin
.
command
(/^#回调测试$/, async (
e
,
next
) => {
// reply 方法支持多种类型的参数 await
e
.
reply
('这是一个回调测试')
// 传入`sengment`元素 await
e
.
reply
(segment.
text
('这是一个回调测试'))
// 传入数组 支持各种组合的`segment`元素 await
e
.
reply
([segment.
text
('这是一个回调测试'), segment.
image
('https://www.example.com/example.png')])
// 若要继续匹配下一个插件,请调用 next 方法(类似 return false)
next
() // 注释该行则终止匹配
})
  • command 的第三个参数

第三个参数是一个对象,用于设置插件的一些属性
全部参数都是可选的,不填写则使用默认值
强烈建议设置name属性,也就是插件的名称,方便后续查找和管理插件
参数的配置项请查看更下方

js
export const 
test
=
karin
.
command
('^文本$', '这是一段文本消息', {
event
: 'message', // 监听的事件
name
: '文本', // 插件名称
perm
: 'all', // 触发权限
at
: false, // 是否加上at 仅在群聊中有效
reply
: false, // 是否加上引用回复
recallMsg
: 0, // 发送是否撤回消息 单位秒
log
: true, // 是否启用日志
rank
: 10000, // 优先级
adapter
: [], // 生效的适配器
dsbAdapter
: [], // 禁用的适配器
delay
: 0, // 延迟回复 单位毫秒 仅在第二个参数非函数时有效
stop
: false, // 是否停止执行后续插件 仅在第二个参数非函数时有效
})

2. 监听事件处理 待完善...

调用 karin.accept 注册一个事件监听插件

IMPORTANT

  • accept 的第一个参数为事件名称,支持监听 通知请求 事件。
  • accept 的第二个参数为事件处理函数。
  • accept 的第三个参数为插件的配置项,参数内容参考上方 command 的参数三

监听入群通知事件插件示例

js
import 
karin
from 'node-karin'
export const
accept
=
karin
.
accept
('notice.groupMemberAdd', async (
e
) => {
await
e
.
reply
('\n欢迎新人 Ciallo~(∠・ω< )⌒☆', {
at
: true })
}, {
name
: '加群通知' })

3. 中间件 待完善...

调用 karin.use 注册一个中间件

4. 上下文事件处理 待完善...

调用 karin.ctx 注册一个上下文事件

IMPORTANT

  • ctx 可以在任何地方调用,它并不是插件
  • ctx 的返回值是一个 Message 类型的对象
  • ctx 的第一个参数为消息事件,也就是 Message 事件,第二个参数详见下方说明

提示

上下文也可以通过 通知事件请求事件 触发

ts
import 
karin
from 'node-karin'
// context 拥有完整的消息事件对象 const
context
= await
karin
.
ctx
(
e
, {
reply
: true, // 超时后是否回复
replyMsg
: '操作超时已取消', // 超时回复文本 默认为 '操作超时已取消'
time
: 120, // 超时时间 默认120秒
userId
:
e
.
userId
, // 指定用户id触发下文 不指定则使用默认 e.user_id
})

应用场景:

js
import 
karin
, {
logger
} from 'node-karin'
const
ctxText
=
karin
.
command
('登录', async (
e
) => {
await
e
.
reply
('6位数的验证码已发送至您的邮箱 123456789@example.com,请注意查收')
const
ctx
= await
karin
.
ctx
(
e
) // 120 秒内等待用户发送验证码
logger
.
mark
('验证码:' +
ctx
.
msg
) // 记录日志
// 处理登录逻辑...... await
e
.
reply
(`验证成功,Welcome ${
ctx
.
sender
.
name
}`)
})

5. 事件处理器 待完善...

调用 karin.handle 注册一个事件处理器

6. 定时任务 待完善...

调用 karin.task 注册一个定时任务插件

js
import 
karin
from 'node-karin'
// 注册一个定时任务 const
task
=
karin
.
task
('打印 Hello World', '*/10 * * * *', async () => {
logger
.
mark
('Hello, world!') // 每十分钟打印一次 Hello, world!
}, {
log
: true,
name
: 'test' })

类语法糖示例

该示例为消息插件示例
将下面的代码复制到 index-demo.js 中,保存
对机器人发送 #你好 ,机器人会回复 你好 、图片、语音、视频、@某人

js
import { 
Plugin
, segment } from 'node-karin'
export class
hello
extends
Plugin
{
constructor() { super({
name
: '插件名称',
dsc
: '插件描述',
rule
: [
{ /** 命令正则匹配 */
reg
: /^#你好$/,
/** 正则对应的执行方法 */
fnc
: 'hello',
}, ], }) } async
hello
() {
// 这里在this上会多一个reply方法,和函数插件的e.reply一样 await this.
reply
('你好')
// e在this上也会有 await this.
reply
(segment.
image
('https://www.example.com/example.png'))
// 其他方法都和函数插件一样 return true } }

更复杂的类语法糖示例

js
import { 
Plugin
, segment } from 'node-karin'
export class
hello
extends
Plugin
{
constructor() { super({
name
: '插件名称',
dsc
: '插件描述',
/** 监听事件 具体请查看事件分类 */
event
: 'message',
/** 插件的优先级 必须为数字 数字越小优先级越高 默认5000 */
priority
: 1000,
rule
: [
{ /** 命令正则匹配 */
reg
: /^#你好$/,
/** 正则对应的执行方法 */
fnc
: 'hello',
/** 是否显示操作日志 默认显示 */
log
: true,
/** 操作权限 all | admin | master | group.admin | group.owner */
permission
: 'all',
}, ], }) } async
hello
() {
// ...不再赘述 return true } }