From 3b5b18e7bfdc300d649eee97a21e3630a46ed7a9 Mon Sep 17 00:00:00 2001 From: lc-cn Date: Sun, 16 Jul 2023 06:07:25 +0000 Subject: [PATCH] deploy: 889a7854c7765a2a81de2b86f20323b480f8d000 --- 404.html | 6 ++-- api/adapter.html | 6 ++-- api/bot.html | 6 ++-- api/command.html | 6 ++-- api/context.html | 6 ++-- api/event/map.html | 6 ++-- api/index.html | 6 ++-- api/message.html | 6 ++-- api/render-component.html | 6 ++-- api/render-element.html | 6 ++-- api/render-template.html | 6 ++-- api/service-koa.html | 6 ++-- api/service-router.html | 6 ++-- api/service-server.html | 6 ++-- api/service.html | 10 +++---- api/session.html | 6 ++-- api/zhin.html | 6 ++-- ...20d87805.js => api_service.md.ab115376.js} | 4 +-- ...ean.js => api_service.md.ab115376.lean.js} | 0 ...4d64c4f.js => guide_plugin.md.ed5e3bbf.js} | 24 ++++++++-------- ...an.js => guide_plugin.md.ed5e3bbf.lean.js} | 2 +- ...88b4f.js => guide_repeater.md.438ceb4b.js} | 8 +++--- ....js => guide_repeater.md.438ceb4b.lean.js} | 2 +- config/adapter-icqq.html | 6 ++-- config/adapter-onebot.html | 6 ++-- config/built-plugin.html | 6 ++-- config/common.html | 6 ++-- guide/bot.html | 6 ++-- guide/command.html | 6 ++-- guide/component.html | 6 ++-- guide/config.html | 6 ++-- guide/deploy.html | 6 ++-- guide/index.html | 6 ++-- guide/plugin.html | 28 +++++++++---------- guide/prepare.html | 6 ++-- guide/prompt.html | 6 ++-- guide/repeater.html | 14 +++++----- guide/start.html | 6 ++-- hashmap.json | 2 +- index.html | 6 ++-- 40 files changed, 137 insertions(+), 137 deletions(-) rename assets/{api_service.md.20d87805.js => api_service.md.ab115376.js} (97%) rename assets/{api_service.md.20d87805.lean.js => api_service.md.ab115376.lean.js} (100%) rename assets/{guide_plugin.md.74d64c4f.js => guide_plugin.md.ed5e3bbf.js} (96%) rename assets/{guide_plugin.md.74d64c4f.lean.js => guide_plugin.md.ed5e3bbf.lean.js} (79%) rename assets/{guide_repeater.md.60388b4f.js => guide_repeater.md.438ceb4b.js} (95%) rename assets/{guide_repeater.md.60388b4f.lean.js => guide_repeater.md.438ceb4b.lean.js} (89%) diff --git a/404.html b/404.html index 3bfde8838..12156b3e6 100644 --- a/404.html +++ b/404.html @@ -12,9 +12,9 @@ -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
+ \ No newline at end of file diff --git a/api/adapter.html b/api/adapter.html index 2461ad240..5c0e63150 100644 --- a/api/adapter.html +++ b/api/adapter.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

适配器(Adapter)

TIP

继承自 EventEmitter

此处介绍仅为基础介绍,已足够普通开发这使用,如需进阶(自行开发机器人适配器),可联系开发者

属性(Attrs)

bots:BotList

  • 存放机器人的数组

logger:Logger

  • Log4js的Logger,使用方法自行搜索log4js

status:Record<string,BotStatus>

获取该适配器下所有机器人的状态

构造函数 constructor(zhin:Zhin,protocol:string,options:AdapterOptions)

方法(Methods)

botStatus(self_id:string|number):BotStatus

获取该适配器下指定机器人的状态

getLogger(sub_type:string):Logger

获取一个Log4js的Logger,使用方法自行搜索log4js

dispatch(event:string|symbol,session:Session):void

Zhin推送会话

start

启动适配器

stop

停止适配器

startBot(options:BotOptions):void

启动一个机器人

配置文件 AdapterOptions

typescript
export type AdapterOptions<BO ={}, AO = {}> = {
+    
Skip to content
On this page

适配器(Adapter)

TIP

继承自 EventEmitter

此处介绍仅为基础介绍,已足够普通开发这使用,如需进阶(自行开发机器人适配器),可联系开发者

属性(Attrs)

bots:BotList

  • 存放机器人的数组

logger:Logger

  • Log4js的Logger,使用方法自行搜索log4js

status:Record<string,BotStatus>

获取该适配器下所有机器人的状态

构造函数 constructor(zhin:Zhin,protocol:string,options:AdapterOptions)

方法(Methods)

botStatus(self_id:string|number):BotStatus

获取该适配器下指定机器人的状态

getLogger(sub_type:string):Logger

获取一个Log4js的Logger,使用方法自行搜索log4js

dispatch(event:string|symbol,session:Session):void

Zhin推送会话

start

启动适配器

stop

停止适配器

startBot(options:BotOptions):void

启动一个机器人

配置文件 AdapterOptions

typescript
export type AdapterOptions<BO ={}, AO = {}> = {
     bots?: BotOptions<BO>[] // 机器人配置文件数组
 } & AO

命名空间(Namespace)

typescript
export const adapterConstructs:AdapterConstructs={}
     // 用于定义适配器,普通开发者可忽略
@@ -42,8 +42,8 @@
             Bot:Bot.botConstructors[protocol]
         }
     }
- + \ No newline at end of file diff --git a/api/bot.html b/api/bot.html index fd3eb41d1..0c1009373 100644 --- a/api/bot.html +++ b/api/bot.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

机器人(Bot)

TIP

继承自 EventEmitter

此处介绍仅为基础介绍,已足够普通开发这使用,如需进阶(自行开发机器人适配器),可联系开发者

属性(Attrs)

internal

  • 不同平台的机器人实例

get status():BotStatus

  • 机器人状态

options:BotOptions

  • 机器人配置

self_id:string}number

  • 机器人唯一标识

构造函数 constructor(public zhin:Zhin,public adapter:Adapter,options:BotOptions)

方法(Methods)

isOnline():boolean

  • 获取机器人是否在线状态

enable(plugin?:Plugin):this|boolean

  • 传plugin时,代表该机器人启用指定插件(默认会启用所有插件)
  • 不传任何参数时,代表启用该机器人

disable(plugin:Plugin):this:boolean

  • 传plugin时,代表该机器人禁用指定插件
  • 不传任何参数时,代表禁用该机器人

match(plugin:Plugin):boolean

  • 判断当前机器人是否启用指定插件

isMaster(session:Session):boolean

  • 会话发起者是否为zhin主人

isAdmin(session:Session):boolean

  • 会话发起者是否为zhin管理员

reply(session:Session,message:Fragment,quote?:boolean):MessageRet

  • 回复一个指定会话一条消息(quote为true会引用该会话)

sendMsg(target_id:string:number,target_type:MessageType,message:Fragment):MessageRet

  • 发送一条消息给指定类型的用户
  • MessageType可为gorupprivatediscuss(仅qq支持)、guild

start

启动机器人

配置文件 BotOptions

typescript
export type BotOptions<O={}>={
+    
Skip to content
On this page

机器人(Bot)

TIP

继承自 EventEmitter

此处介绍仅为基础介绍,已足够普通开发这使用,如需进阶(自行开发机器人适配器),可联系开发者

属性(Attrs)

internal

  • 不同平台的机器人实例

get status():BotStatus

  • 机器人状态

options:BotOptions

  • 机器人配置

self_id:string}number

  • 机器人唯一标识

构造函数 constructor(public zhin:Zhin,public adapter:Adapter,options:BotOptions)

方法(Methods)

isOnline():boolean

  • 获取机器人是否在线状态

enable(plugin?:Plugin):this|boolean

  • 传plugin时,代表该机器人启用指定插件(默认会启用所有插件)
  • 不传任何参数时,代表启用该机器人

disable(plugin:Plugin):this:boolean

  • 传plugin时,代表该机器人禁用指定插件
  • 不传任何参数时,代表禁用该机器人

match(plugin:Plugin):boolean

  • 判断当前机器人是否启用指定插件

isMaster(session:Session):boolean

  • 会话发起者是否为zhin主人

isAdmin(session:Session):boolean

  • 会话发起者是否为zhin管理员

reply(session:Session,message:Fragment,quote?:boolean):MessageRet

  • 回复一个指定会话一条消息(quote为true会引用该会话)

sendMsg(target_id:string:number,target_type:MessageType,message:Fragment):MessageRet

  • 发送一条消息给指定类型的用户
  • MessageType可为gorupprivatediscuss(仅qq支持)、guild

start

启动机器人

配置文件 BotOptions

typescript
export type BotOptions<O={}>={
     quote_self?:boolean // 回复消息是否自动引用
     self_id?:string|number // 机器人唯一标识
     prefix?:string // 指令调用时的前缀
@@ -45,8 +45,8 @@
     }
     export type Message=PrivateMsg|GroupMsg|GuildMsg
 }
- + \ No newline at end of file diff --git a/api/command.html b/api/command.html index 993553a48..f56cca4c1 100644 --- a/api/command.html +++ b/api/command.html @@ -15,9 +15,9 @@ -
Skip to content
On this page
- +
Skip to content
On this page
+ \ No newline at end of file diff --git a/api/context.html b/api/context.html index 4c5af6647..f615d96c6 100644 --- a/api/context.html +++ b/api/context.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

上下文(Context)

TIP

继承自 EventEmitter

属性(Attrs)

plugins:Map<string,Plugin>

  • 当前上下文安装的插件Map

middlewares:Middleware[]

  • 当前上下文产生的所有中间件

components:Record<string,Component>

  • 当前上下文产生的组件键值对

commands:Map<string,Command>

  • 当前上下文产生的指令Map

disposes:Dispose[]

  • 卸载当前上下文时,需要执行的函数列表

get pluginList:Plugin[]

  • 获取当前上下文及其下级上下文安装的插件列表

get middlewareList:Middleware[]

  • 获取当前上下文及其下级上下文产生的的中间件列表

get commandList:Command[]

  • 获取当前上下文及其下级上下文产生的的指令列表

[Context.childKey]:Context[]

  • 当前上下文产生的上下文列表

[Context.plugin]:Plugin

  • 产生当前上下文的插件

[keyof Zhin.Services]:Service

  • 知音安装的服务

构造函数 constructor(public parent:Context,filter?:Filter)

方法(Methods)

extend(ctx:Context):Context

  • 其他上下文继承到当前上下文

pick(key: K, ...values: Session[K][]):Context

  • 产生一个新的上下文,该上下文仅在传入会话session[key]的值存在于values中并且满足构造函数的filter时有效

union(filter:Filter):Context

  • 产生一个新的上下文,该上下文仅在满足传入filter并且满足构造函数的filter时有效

except(filter:Filter):Context

  • 产生一个新的上下文,该上下文仅在不满足传入filter并且满足构造函数的filter时有效

user(...user_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.user_id的值存在于user_ids中并且满足构造函数的filter时有效

group(...group_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.group_id的值存在于group_ids中并且满足构造函数的filter时有效

discuss(...discuss_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.discuss_id的值存在于discuss_ids中并且满足构造函数的filter时有效

guild(...guild_ids:string[]):Context

  • 产生一个新的上下文,该上下文传入会话session.guild_id的值存在于guild_ids中并且满足构造函数的filter时有效

channel(...channel_ids:string[]):Context

  • 产生一个新的上下文,该上下文传入会话session.channel_id的值存在于channel_ids中并且满足构造函数的filter时有效

platform(...platforms:(keyof Zhin.Adapters)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.platform的值存在于platforms中并且满足构造函数的filter时有效

private(...user_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.user_id的值存在于user_ids中并且会话事件为私聊并且满足构造函数的filter时有效

getMatchedContextList(session:Session):Context[]

  • 根据传入会话获取匹配到的上下文列表

plugin(entry:string:Plugin.Install,setup?:boolean):this|Plugin

  • 传入string时,若当前上下文已安装name为entry的插件,则返回插件,否则,将尝试从已加载的模块中加载插件
  • 传入Plugin.Install时,将在当前上下文安装对应插件

use(plugin:Plugin):this

  • 根据Plugin.Install在当前上下文安装对应插件

middleware(middleware:Middleware):this

  • 为当前上下文添加一个中间件

command(def:string,trigger?:string):Command

  • 为当前上下文添加一个指令,并返回指令本身

dispatch(session:Session):void

  • 如果会话满足当前上下文的filter,则将session
- +
Skip to content
On this page

上下文(Context)

TIP

继承自 EventEmitter

属性(Attrs)

plugins:Map<string,Plugin>

  • 当前上下文安装的插件Map

middlewares:Middleware[]

  • 当前上下文产生的所有中间件

components:Record<string,Component>

  • 当前上下文产生的组件键值对

commands:Map<string,Command>

  • 当前上下文产生的指令Map

disposes:Dispose[]

  • 卸载当前上下文时,需要执行的函数列表

get pluginList:Plugin[]

  • 获取当前上下文及其下级上下文安装的插件列表

get middlewareList:Middleware[]

  • 获取当前上下文及其下级上下文产生的的中间件列表

get commandList:Command[]

  • 获取当前上下文及其下级上下文产生的的指令列表

[Context.childKey]:Context[]

  • 当前上下文产生的上下文列表

[Context.plugin]:Plugin

  • 产生当前上下文的插件

[keyof Zhin.Services]:Service

  • 知音安装的服务

构造函数 constructor(public parent:Context,filter?:Filter)

方法(Methods)

extend(ctx:Context):Context

  • 其他上下文继承到当前上下文

pick(key: K, ...values: Session[K][]):Context

  • 产生一个新的上下文,该上下文仅在传入会话session[key]的值存在于values中并且满足构造函数的filter时有效

union(filter:Filter):Context

  • 产生一个新的上下文,该上下文仅在满足传入filter并且满足构造函数的filter时有效

except(filter:Filter):Context

  • 产生一个新的上下文,该上下文仅在不满足传入filter并且满足构造函数的filter时有效

user(...user_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.user_id的值存在于user_ids中并且满足构造函数的filter时有效

group(...group_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.group_id的值存在于group_ids中并且满足构造函数的filter时有效

discuss(...discuss_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.discuss_id的值存在于discuss_ids中并且满足构造函数的filter时有效

guild(...guild_ids:string[]):Context

  • 产生一个新的上下文,该上下文传入会话session.guild_id的值存在于guild_ids中并且满足构造函数的filter时有效

channel(...channel_ids:string[]):Context

  • 产生一个新的上下文,该上下文传入会话session.channel_id的值存在于channel_ids中并且满足构造函数的filter时有效

platform(...platforms:(keyof Zhin.Adapters)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.platform的值存在于platforms中并且满足构造函数的filter时有效

private(...user_ids:(string|number)[]):Context

  • 产生一个新的上下文,该上下文传入会话session.user_id的值存在于user_ids中并且会话事件为私聊并且满足构造函数的filter时有效

getMatchedContextList(session:Session):Context[]

  • 根据传入会话获取匹配到的上下文列表

plugin(entry:string:Plugin.Install,setup?:boolean):this|Plugin

  • 传入string时,若当前上下文已安装name为entry的插件,则返回插件,否则,将尝试从已加载的模块中加载插件
  • 传入Plugin.Install时,将在当前上下文安装对应插件

use(plugin:Plugin):this

  • 根据Plugin.Install在当前上下文安装对应插件

middleware(middleware:Middleware):this

  • 为当前上下文添加一个中间件

command(def:string,trigger?:string):Command

  • 为当前上下文添加一个指令,并返回指令本身

dispatch(session:Session):void

  • 如果会话满足当前上下文的filter,则将session
+ \ No newline at end of file diff --git a/api/event/map.html b/api/event/map.html index f4a3bcd58..556855713 100644 --- a/api/event/map.html +++ b/api/event/map.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

事件地图

- +
Skip to content
On this page

事件地图

+ \ No newline at end of file diff --git a/api/index.html b/api/index.html index 7f5b76ed1..ccd97cf20 100644 --- a/api/index.html +++ b/api/index.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

核心模块

知音(Zhin)

适配器(Adapter)

  • 连接知音和机器人的桥梁(上传下达)
  • 适配对应平台机器人连接到知音
  • 机器人的载体

机器人(Bot)

  • 将对应平台推送的内容封装成会话,并提交给上一级(适配器)

会话(Session)

  • 描述平台推送内容、发出该内容的机器人、所使用的适配器的对象
  • 提供一系列快捷功能

上下文(Context)

插件(Plugin)

普通开发者该关心的

服务(Service)

指令(Command)

  • 处理消息会话的特殊对象

组件(Component)

  • 处理消息会话的特殊对象

中间件(Middleware)

  • 处理消息会话的回调函数,处理顺序与Koa的洋葱模型相同
- +
Skip to content
On this page

核心模块

知音(Zhin)

适配器(Adapter)

  • 连接知音和机器人的桥梁(上传下达)
  • 适配对应平台机器人连接到知音
  • 机器人的载体

机器人(Bot)

  • 将对应平台推送的内容封装成会话,并提交给上一级(适配器)

会话(Session)

  • 描述平台推送内容、发出该内容的机器人、所使用的适配器的对象
  • 提供一系列快捷功能

上下文(Context)

插件(Plugin)

普通开发者该关心的

服务(Service)

指令(Command)

  • 处理消息会话的特殊对象

组件(Component)

  • 处理消息会话的特殊对象

中间件(Middleware)

  • 处理消息会话的回调函数,处理顺序与Koa的洋葱模型相同
+ \ No newline at end of file diff --git a/api/message.html b/api/message.html index 9176e7170..cc14ccc30 100644 --- a/api/message.html +++ b/api/message.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

消息定义

zhin中的消息分为普通文本消息、消息元素、消息模板和消息组件构成。

普通文本消息

普通文本消息是指不包含任何消息元素的字符串。你可以通过session.reply方法来发送普通文本消息。

typescript
session.reply("Hello World!");

消息元素

消息元素是指消息中的一些特殊元素,例如图片、链接、at等。你可以通过导入zhin提供的h来构造,通过session.reply方法来发送消息元素。

typescript
import {h} from "zhin";
+    
Skip to content
On this page

消息定义

zhin中的消息分为普通文本消息、消息元素、消息模板和消息组件构成。

普通文本消息

普通文本消息是指不包含任何消息元素的字符串。你可以通过session.reply方法来发送普通文本消息。

typescript
session.reply("Hello World!");

消息元素

消息元素是指消息中的一些特殊元素,例如图片、链接、at等。你可以通过导入zhin提供的h来构造,通过session.reply方法来发送消息元素。

typescript
import {h} from "zhin";
 
 session.reply(h("mention", {user_id: 123456789})); // 提及某人
 session.reply(h("image", {url: "https://example.com/image.png"})); // 发送图片
@@ -41,8 +41,8 @@
     session.reply(`<my-component who="World"/>`);
     next();
 });
- + \ No newline at end of file diff --git a/api/render-component.html b/api/render-component.html index 5a8eae6aa..62d57814f 100644 --- a/api/render-component.html +++ b/api/render-component.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

待完善

- +
Skip to content
On this page

待完善

+ \ No newline at end of file diff --git a/api/render-element.html b/api/render-element.html index 6080b5586..af0730a5d 100644 --- a/api/render-element.html +++ b/api/render-element.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

待完善

- +
Skip to content
On this page

待完善

+ \ No newline at end of file diff --git a/api/render-template.html b/api/render-template.html index 430ca0631..5a6e70344 100644 --- a/api/render-template.html +++ b/api/render-template.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

待完善

- +
Skip to content
On this page

待完善

+ \ No newline at end of file diff --git a/api/service-koa.html b/api/service-koa.html index 7424e0b96..6a944ec28 100644 --- a/api/service-koa.html +++ b/api/service-koa.html @@ -15,9 +15,9 @@ -
Skip to content
On this page
- +
Skip to content
On this page
+ \ No newline at end of file diff --git a/api/service-router.html b/api/service-router.html index df0e5f483..0699588fa 100644 --- a/api/service-router.html +++ b/api/service-router.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

待完善

- +
Skip to content
On this page

待完善

+ \ No newline at end of file diff --git a/api/service-server.html b/api/service-server.html index aece6ccfc..b30657430 100644 --- a/api/service-server.html +++ b/api/service-server.html @@ -15,9 +15,9 @@ -
Skip to content
On this page
- +
Skip to content
On this page
+ \ No newline at end of file diff --git a/api/service.html b/api/service.html index a527520d7..5b0ed1c35 100644 --- a/api/service.html +++ b/api/service.html @@ -10,12 +10,12 @@ - + -
Skip to content
On this page

服务(Service)

TIP

服务只是zhin的一个概念

介绍

如何定义?

  • 在插件中,通过上下文定义
typescript
import {Context} from 'zhin'
+    
Skip to content
On this page

服务(Service)

TIP

服务只是zhin的一个概念

介绍

如何定义?

  • 在插件中,通过上下文定义
typescript
import {Context} from 'zhin'
 
 class CustomeService {
     constructor(public config:any) {
@@ -57,7 +57,7 @@
     install(ctx) {
         ctx.service('custom',new CustomeService('hello'))
     }
-}

如何使用?

  • 在其他插件中,直接使用ctx[serviceName]使用
typescript
import {Context} from 'zhin'
+}

如何使用?

  • 在其他插件中,直接使用ctx[serviceName]使用
typescript
import {Context} from 'zhin'
 export const using=['custom'] // 定义这个,可以确保只有在custom服务正常时,插件才启用
 export function install(ctx: Context) {
     const oldConfig= ctx.custom.getConfig()
@@ -73,8 +73,8 @@
         console.log(oldConfig,newConfig)
     }
 }
- + \ No newline at end of file diff --git a/api/session.html b/api/session.html index dccf81dd3..f0fa0fba2 100644 --- a/api/session.html +++ b/api/session.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

会话

在zhin中,机器人发出的任何事件,都会被封装为一个统一格式的会话对象,开发者可以通过访问会话对象的属性,来获取对应事件产生的信息。

下面是会话中的一些常用属性及其类型:

typescript
interface Session<P extends keyof Zhin.Adapters = keyof Zhin.Adapters, E extends keyof Zhin.BotEventMaps[P] = keyof Zhin.BotEventMaps[P]> {
+    
Skip to content
On this page

会话

在zhin中,机器人发出的任何事件,都会被封装为一个统一格式的会话对象,开发者可以通过访问会话对象的属性,来获取对应事件产生的信息。

下面是会话中的一些常用属性及其类型:

typescript
interface Session<P extends keyof Zhin.Adapters = keyof Zhin.Adapters, E extends keyof Zhin.BotEventMaps[P] = keyof Zhin.BotEventMaps[P]> {
     protocol: P, // 所使用的适配器
     type?: string // 事件类型
     user_id?: string | number // 用户id
@@ -51,8 +51,8 @@
     get isPrivate(): boolean // 当前会话是否为私聊
     get isGroup(): boolean // 当前会话是否为群聊
 }
- + \ No newline at end of file diff --git a/api/zhin.html b/api/zhin.html index 5c3bbfa1c..e30cb60bc 100644 --- a/api/zhin.html +++ b/api/zhin.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

知音(Zhin)

TIP

继承自 Context

属性(Attrs)

isReady:boolean

  • 标识zhin是否启动

options:Zhin.Options(见命名空间)

  • zhin的配置文件

adapters:Map<string,Adapter>

  • zhin加载的适配器Map

services:Map<string,Service>

  • zhin加载的服务Map

方法(Methods)

changeOptions(options:Zhin.Options):void

  • 更改知音的配置文件

pickBot(protocol:string,self_id:string|number):Bot|undefined

  • 根据条件选取一个已存在的机器人

getLogger(protocol:string,self_id:string|number):Logger

  • 获取logger

getInstalledModules(moduleType:string):Modules[]

  • 扫描项目依赖中的已安装的模块

hasMounted(name:string):boolean

  • 检查知音是否安装指定插件

sendMsg(channelId: ChannelId, message: Fragment):MessageRet

  • 发送消息到指定通道

load(name: string, moduleType: T,setup?:boolean):Zhin.Modules[T]

  • 加载指定名称,指定类型的模块

findCommand(argv:Argv):Command

  • 获取匹配出来的指令

start

  • 启动知音

stop

  • 停止知音

命名空间(Namespace)

typescript
export interface Options {
+    
Skip to content
On this page

知音(Zhin)

TIP

继承自 Context

属性(Attrs)

isReady:boolean

  • 标识zhin是否启动

options:Zhin.Options(见命名空间)

  • zhin的配置文件

adapters:Map<string,Adapter>

  • zhin加载的适配器Map

services:Map<string,Service>

  • zhin加载的服务Map

方法(Methods)

changeOptions(options:Zhin.Options):void

  • 更改知音的配置文件

pickBot(protocol:string,self_id:string|number):Bot|undefined

  • 根据条件选取一个已存在的机器人

getLogger(protocol:string,self_id:string|number):Logger

  • 获取logger

getInstalledModules(moduleType:string):Modules[]

  • 扫描项目依赖中的已安装的模块

hasMounted(name:string):boolean

  • 检查知音是否安装指定插件

sendMsg(channelId: ChannelId, message: Fragment):MessageRet

  • 发送消息到指定通道

load(name: string, moduleType: T,setup?:boolean):Zhin.Modules[T]

  • 加载指定名称,指定类型的模块

findCommand(argv:Argv):Command

  • 获取匹配出来的指令

start

  • 启动知音

stop

  • 停止知音

命名空间(Namespace)

typescript
export interface Options {
     self_url?: string // 公网访问url,可不填
     port: number // 监听端口
     log_level: LogLevel // 日志输出等级
@@ -27,8 +27,8 @@
     plugin_dir?: string // 存放插件的目录路径
     data_dir?: string // 存放数据的目录路径
 }
- + \ No newline at end of file diff --git a/assets/api_service.md.20d87805.js b/assets/api_service.md.ab115376.js similarity index 97% rename from assets/api_service.md.20d87805.js rename to assets/api_service.md.ab115376.js index 2adc0c314..de42b5963 100644 --- a/assets/api_service.md.20d87805.js +++ b/assets/api_service.md.ab115376.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=JSON.parse('{"title":"服务(Service)","description":"","frontmatter":{},"headers":[],"relativePath":"api/service.md","filePath":"api/service.md","lastUpdated":1677942007000}'),p={name:"api/service.md"},o=l(`

服务(Service)

TIP

服务只是zhin的一个概念

介绍

如何定义?

  • 在插件中,通过上下文定义
typescript
import {Context} from 'zhin'
+import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=JSON.parse('{"title":"服务(Service)","description":"","frontmatter":{},"headers":[],"relativePath":"api/service.md","filePath":"api/service.md","lastUpdated":1677942007000}'),p={name:"api/service.md"},o=l(`

服务(Service)

TIP

服务只是zhin的一个概念

介绍

如何定义?

  • 在插件中,通过上下文定义
typescript
import {Context} from 'zhin'
 
 class CustomeService {
     constructor(public config:any) {
@@ -40,7 +40,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
     install(ctx) {
         ctx.service('custom',new CustomeService('hello'))
     }
-}

如何使用?

  • 在其他插件中,直接使用ctx[serviceName]使用
typescript
import {Context} from 'zhin'
+}

如何使用?

  • 在其他插件中,直接使用ctx[serviceName]使用
typescript
import {Context} from 'zhin'
 export const using=['custom'] // 定义这个,可以确保只有在custom服务正常时,插件才启用
 export function install(ctx: Context) {
     const oldConfig= ctx.custom.getConfig()
diff --git a/assets/api_service.md.20d87805.lean.js b/assets/api_service.md.ab115376.lean.js
similarity index 100%
rename from assets/api_service.md.20d87805.lean.js
rename to assets/api_service.md.ab115376.lean.js
diff --git a/assets/guide_plugin.md.74d64c4f.js b/assets/guide_plugin.md.ed5e3bbf.js
similarity index 96%
rename from assets/guide_plugin.md.74d64c4f.js
rename to assets/guide_plugin.md.ed5e3bbf.js
index 711480252..6f7618360 100644
--- a/assets/guide_plugin.md.74d64c4f.js
+++ b/assets/guide_plugin.md.ed5e3bbf.js
@@ -1,11 +1,11 @@
-import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md","filePath":"guide/plugin.md","lastUpdated":1688200973000}'),p={name:"guide/plugin.md"},o=l(`

INFO

通过本节的阅读,你将了解到如何新建一个插件、使用zhin提供的api实现一些简单的小功能,以及插件的发布

插件类型

zhin的插件共分为 本地插件npm 插件 两大类。

  • 本地插件

本地插件将全部存放在根目录的 plugins 下。 所有由你自己编写,并 仅供个人使用 的插件就可以称为本地插件。

  • npm 插件

npm 插件都是直接使用 npm i 命令安装,存放在 node_modules 目录下。 是由我或者其他开发者编写,上传至 npmjs 平台,为 所有使用 zhin 框架的人 提供服务。

还记得在初始化项目时输入的 zhin init 么,在界面会有一个选择安装插件的步骤,那些插件就全部属于 npm 插件

如果你对 npmjs 并不了解也没关系,在这里只会介绍本地插件的编写。 但是如果你想对 zhin 有一个更深入的了解,还是需要熟悉 nodejs 及 npmjs 的基本原理。

新建插件

TIP

  1. zhin 同时支持使用javascript和typescript编写插件.

  2. 为了更好的开发体验,建议使用typescript编写插件。

  3. 并且在2.x版本后,支持使用setup语法编写插件,这将在后面的章节中介绍。

zhin为开发者提供了两种方式来新建一个插件,分别是通过cli手动创建。推荐使用cli创建,因为这样可以省去很多重复的工作。现在我们就来看看如何创建一个插件。

1. cli创建

  • 此方式需要你安装了zhin脚手架@zhinjs/cli
  • 如果你还没有安装,可以通过以下命令进行安装
shell
npm i -g @zhinjs/cli
  • 安装完成后,你就可以通过以下命令创建一个插件了
shell
zhin new test -t # 此处test为插件名, -t选项表示使用ts进行开发, 如果不加-t选项, 则默认使用js进行开发,如果你想使用setup语法开发,可以加上-s选项

2. 手动创建

  1. 手动创建插件需要你自己创建目录,然后在目录下创建src目录,最后在src目录下创建index.ts文件,这个文件就是插件的主入口文件。
  2. 如果你想使用setup语法开发,则必须添加package.json文件,并在内容中添加"setup": true字段,否则zhin将会以普通插件的方式进行加载。
  • 完成创建后,插件目录大体如下:
text
plugins/
+import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md","filePath":"guide/plugin.md","lastUpdated":1688200973000}'),p={name:"guide/plugin.md"},o=l(`

INFO

通过本节的阅读,你将了解到如何新建一个插件、使用zhin提供的api实现一些简单的小功能,以及插件的发布

插件类型

zhin的插件共分为 本地插件npm 插件 两大类。

  • 本地插件

本地插件将全部存放在根目录的 plugins 下。 所有由你自己编写,并 仅供个人使用 的插件就可以称为本地插件。

  • npm 插件

npm 插件都是直接使用 npm i 命令安装,存放在 node_modules 目录下。 是由我或者其他开发者编写,上传至 npmjs 平台,为 所有使用 zhin 框架的人 提供服务。

还记得在初始化项目时输入的 zhin init 么,在界面会有一个选择安装插件的步骤,那些插件就全部属于 npm 插件

如果你对 npmjs 并不了解也没关系,在这里只会介绍本地插件的编写。 但是如果你想对 zhin 有一个更深入的了解,还是需要熟悉 nodejs 及 npmjs 的基本原理。

新建插件

TIP

  1. zhin 同时支持使用javascript和typescript编写插件.

  2. 为了更好的开发体验,建议使用typescript编写插件。

  3. 并且在2.x版本后,支持使用setup语法编写插件,这将在后面的章节中介绍。

zhin为开发者提供了两种方式来新建一个插件,分别是通过cli手动创建。推荐使用cli创建,因为这样可以省去很多重复的工作。现在我们就来看看如何创建一个插件。

1. cli创建

  • 此方式需要你安装了zhin脚手架@zhinjs/cli
  • 如果你还没有安装,可以通过以下命令进行安装
shell
npm i -g @zhinjs/cli
  • 安装完成后,你就可以通过以下命令创建一个插件了
shell
zhin new test -t # 此处test为插件名, -t选项表示使用ts进行开发, 如果不加-t选项, 则默认使用js进行开发,如果你想使用setup语法开发,可以加上-s选项

2. 手动创建

  1. 手动创建插件需要你自己创建目录,然后在目录下创建src目录,最后在src目录下创建index.ts文件,这个文件就是插件的主入口文件。
  2. 如果你想使用setup语法开发,则必须添加package.json文件,并在内容中添加"setup": true字段,否则zhin将会以普通插件的方式进行加载。
  • 完成创建后,插件目录大体如下:
text
plugins/
 └─ test/                 test 插件
    └─ index.js           程序主入口
    └─ package.json       包管理文件 (可选)
text
plugins/
 └─ test/                 test 插件
    ├─ src/               资源目录 插件
    │  └─ index.ts        程序主入口
-   └─ package.json       包管理文件 (可选)
  • 后续章节中,我们将以cli创建的插件为例进行讲解,如果你使用手动创建的方式,也可以参考cli创建的插件进行开发。

插件开发

在开发之前,你可以先看看处理生成的默认插件代码,里面有一些注释,可以帮助你更好的了解插件的开发。

1. 默认代码

javascript
// index.js
+   └─ package.json       包管理文件 (可选)
  • 后续章节中,我们将以cli创建的插件为例进行讲解,如果你使用手动创建的方式,也可以参考cli创建的插件进行开发。

插件开发

在开发之前,你可以先看看处理生成的默认插件代码,里面有一些注释,可以帮助你更好的了解插件的开发。

1. 默认代码

javascript
// index.js
 module.exports={
     name:'js',
     /**
@@ -179,7 +179,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
     // 如果你使用过react的useEffect 那你应该知道这是在干嘛
     // 函数内容将会在插件卸载时自动卸载
 })
-*/

2. 功能实现

接下来,我们来实现一些功能,让你更好的理解插件的使用方法

2.1 定义指令

javascript
// index.js
+*/

2. 功能实现

接下来,我们来实现一些功能,让你更好的理解插件的使用方法

2.1 定义指令

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -221,7 +221,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
     .action(({session,options},foo)=>{
         console.log('options',options);
         return 'hello world'
-    })

现在,你可以给bot发送test -f hello来测试一下了(如果对应bot有配置prefix,需要在发送的指令前边加上对应prefix)

2.2 定义中间件

javascript
// index.js
+    })

现在,你可以给bot发送test -f hello来测试一下了(如果对应bot有配置prefix,需要在发送的指令前边加上对应prefix)

2.2 定义中间件

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -267,7 +267,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
     }else{
         next() // 不next,则不会流入下一个中间件
     }
-});

INFO

如果你使用过koa,那么你应该知道这是在干嘛

如果你不知道,那么你可以看看这里

2.3 监听事件

javascript
// index.js
+});

INFO

如果你使用过koa,那么你应该知道这是在干嘛

如果你不知道,那么你可以看看这里

2.3 监听事件

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -297,7 +297,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
 const ctx=useContext()
 ctx.on('message',({session})=>{
     console.log('message',session.message)
-});

可监听的事件及返回参数可以参考事件地图

2.4 定义服务

javascript
// index.js
+});

可监听的事件及返回参数可以参考事件地图

2.4 定义服务

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -345,7 +345,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
 }
 ctx.service('test',{
     foo:'bar'
-})

TIP

服务名不可重复,否则会报错

服务名不可为zhin内置的服务名,否则会报错

内置服务可参考内置服务

2.5 使用自定义服务

javascript
// index.js
+})

TIP

服务名不可重复,否则会报错

服务名不可为zhin内置的服务名,否则会报错

内置服务可参考内置服务

2.5 使用自定义服务

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -379,7 +379,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
 ctx.command('test')
     .action(({session})=>{
         console.log('service',ctx.test)
-    })

TIP

如果你使用了typescript,那么你需要在使用服务前声明服务的类型,否则会报错

2.6 生命周期

javascript
// index.js
+    })

TIP

如果你使用了typescript,那么你需要在使用服务前声明服务的类型,否则会报错

2.6 生命周期

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -413,7 +413,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
 console.log('install')
 onDispose(()=>{
     console.log('dispose')
-})

除此之外,在setup语法中,你还可以使用useEffect来监听生命周期

javascript
// index.js
+})

除此之外,在setup语法中,你还可以使用useEffect来监听生命周期

javascript
// index.js
 const {useContext,useEffect}=require('zhin')
 useEffect(()=>{
     const ctx=useContext()
@@ -430,7 +430,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
         console.log('dispose')
     }
 })

2.7. 获取zhin.yaml中的指定配置

假设zhin.yaml中有如下配置

yaml
test:
-  foo: bar
javascript
// index.js
+  foo: bar
javascript
// index.js
 const {useOption}=require('zhin')
 module.exports={
     name:'test',
@@ -458,7 +458,7 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
 import {useContext} from 'zhin';
 const ctx=useContext()
 const option=ctx.option('test') // 获取zhin.yaml中的test配置
-console.log(option)

在setup中,你还可以使用useEffect来监听配置的变化

javascript
// index.js
+console.log(option)

在setup中,你还可以使用useEffect来监听配置的变化

javascript
// index.js
 const {useContext,useEffect}=require('zhin')
 const ctx=useContext()
 const option=ctx.option('test') // 获取zhin.yaml中的test配置
@@ -470,4 +470,4 @@ import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=
 const option=ctx.option('test') // 获取zhin.yaml中的test配置
 useEffect((newOption,oldOption)=>{
     console.log(option)
-},option)

在配置变化时,useEffect会被调用,第一个参数为新的配置,第二个参数为旧的配置

`,54),t=[o];function e(c,r,y,i,D,F){return n(),a("div",null,t)}const f=s(p,[["render",e]]);export{A as __pageData,f as default}; +},option)

在配置变化时,useEffect会被调用,第一个参数为新的配置,第二个参数为旧的配置

`,54),t=[o];function e(c,r,y,i,D,F){return n(),a("div",null,t)}const d=s(p,[["render",e]]);export{A as __pageData,d as default}; diff --git a/assets/guide_plugin.md.74d64c4f.lean.js b/assets/guide_plugin.md.ed5e3bbf.lean.js similarity index 79% rename from assets/guide_plugin.md.74d64c4f.lean.js rename to assets/guide_plugin.md.ed5e3bbf.lean.js index d7233ed55..4d43ae5a1 100644 --- a/assets/guide_plugin.md.74d64c4f.lean.js +++ b/assets/guide_plugin.md.ed5e3bbf.lean.js @@ -1 +1 @@ -import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md","filePath":"guide/plugin.md","lastUpdated":1688200973000}'),p={name:"guide/plugin.md"},o=l("",54),t=[o];function e(c,r,y,i,D,F){return n(),a("div",null,t)}const f=s(p,[["render",e]]);export{A as __pageData,f as default}; +import{_ as s,o as n,c as a,U as l}from"./chunks/framework.587922bd.js";const A=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md","filePath":"guide/plugin.md","lastUpdated":1688200973000}'),p={name:"guide/plugin.md"},o=l("",54),t=[o];function e(c,r,y,i,D,F){return n(),a("div",null,t)}const d=s(p,[["render",e]]);export{A as __pageData,d as default}; diff --git a/assets/guide_repeater.md.60388b4f.js b/assets/guide_repeater.md.438ceb4b.js similarity index 95% rename from assets/guide_repeater.md.60388b4f.js rename to assets/guide_repeater.md.438ceb4b.js index b4a2ba078..fb9feb14c 100644 --- a/assets/guide_repeater.md.60388b4f.js +++ b/assets/guide_repeater.md.438ceb4b.js @@ -7,21 +7,21 @@ import{_ as e,E as l,o as t,c,J as s,w as a,U as r,a as p}from"./chunks/framewor mkdir repeater #创建入口文件 -touch index.js

完成创建后,插件目录大体如下:

text
plugins/
+touch index.js

完成创建后,插件目录大体如下:

text
plugins/
 └─ repeater/                 test 插件
    ├─ index.js           程序主入口
    └─ package.json       包管理文件 (可选)
text
plugins/
 └─ repeater/                 test 插件
    └─ src/                 资源目录 插件
       ├─ index.ts           程序主入口
-      └─ package.json       包管理文件 (可选)

WARNING

除非你创建了 package.json ,否则 index 文件名 不能随意更改 ,不然会导致插件无法被检索。

打开入口文件,并输入如下内容

js
module.exports={
+      └─ package.json       包管理文件 (可选)

WARNING

除非你创建了 package.json ,否则 index 文件名 不能随意更改 ,不然会导致插件无法被检索。

打开入口文件,并输入如下内容

js
module.exports={
     name:'repeater',
     install(ctx){
     }
 }
ts
import {Context} from 'zhin';
 export const name='repeater';
 export function install (ctx:Context){
-}

这个时候你就已经写好了一个插件,不需要任何额外操作,不过目前这个插件还什么都不能干,我们没有为其编写相应的交互逻辑。

2. 实现插件交互逻辑

相信你这个时候一定有很多疑问,因为这其中涉及到相当多的概念,Plugin 到底是什么?

INFO

当前章节仅提供示例,目的在于让你能自己编写出可以进行简单交互的插件。 目前你无需关心这段代码是什么意思,后面会逐一介绍,所以不用着急,让我们继续。

你可以参考下列代码段,在上下文上添加一个中间件,拦截消息会话,并将消息元素原封不动回复给用户

js
module.exports={
+}

这个时候你就已经写好了一个插件,不需要任何额外操作,不过目前这个插件还什么都不能干,我们没有为其编写相应的交互逻辑。

2. 实现插件交互逻辑

相信你这个时候一定有很多疑问,因为这其中涉及到相当多的概念,Plugin 到底是什么?

INFO

当前章节仅提供示例,目的在于让你能自己编写出可以进行简单交互的插件。 目前你无需关心这段代码是什么意思,后面会逐一介绍,所以不用着急,让我们继续。

你可以参考下列代码段,在上下文上添加一个中间件,拦截消息会话,并将消息元素原封不动回复给用户

js
module.exports={
     name:'repeater',
     install(ctx){
         ctx.middleware(async (session,next)=>{
@@ -36,4 +36,4 @@ import{_ as e,E as l,o as t,c,J as s,w as a,U as r,a as p}from"./chunks/framewor
         await session.reply(session.elements)
         next()
     });
-}

测试一下

`,20);function D(F,C,A,d,h,u){const n=l("ChatMsg"),o=l("ChatHistory");return t(),c("div",null,[y,s(o,null,{default:a(()=>[s(n,{id:"1659488338"},{default:a(()=>[p("hello")]),_:1}),s(n,{id:"1689919782"},{default:a(()=>[p("hello")]),_:1})]),_:1})])}const f=e(i,[["render",D]]);export{b as __pageData,f as default}; +}

测试一下

`,20);function D(F,C,d,A,h,u){const n=l("ChatMsg"),o=l("ChatHistory");return t(),c("div",null,[y,s(o,null,{default:a(()=>[s(n,{id:"1659488338"},{default:a(()=>[p("hello")]),_:1}),s(n,{id:"1689919782"},{default:a(()=>[p("hello")]),_:1})]),_:1})])}const f=e(i,[["render",D]]);export{b as __pageData,f as default}; diff --git a/assets/guide_repeater.md.60388b4f.lean.js b/assets/guide_repeater.md.438ceb4b.lean.js similarity index 89% rename from assets/guide_repeater.md.60388b4f.lean.js rename to assets/guide_repeater.md.438ceb4b.lean.js index 371526e0c..5f1443bcb 100644 --- a/assets/guide_repeater.md.60388b4f.lean.js +++ b/assets/guide_repeater.md.438ceb4b.lean.js @@ -1 +1 @@ -import{_ as e,E as l,o as t,c,J as s,w as a,U as r,a as p}from"./chunks/framework.587922bd.js";const b=JSON.parse('{"title":"写个复读🐔","description":"","frontmatter":{},"headers":[],"relativePath":"guide/repeater.md","filePath":"guide/repeater.md","lastUpdated":1688192408000}'),i={name:"guide/repeater.md"},y=r("",20);function D(F,C,A,d,h,u){const n=l("ChatMsg"),o=l("ChatHistory");return t(),c("div",null,[y,s(o,null,{default:a(()=>[s(n,{id:"1659488338"},{default:a(()=>[p("hello")]),_:1}),s(n,{id:"1689919782"},{default:a(()=>[p("hello")]),_:1})]),_:1})])}const f=e(i,[["render",D]]);export{b as __pageData,f as default}; +import{_ as e,E as l,o as t,c,J as s,w as a,U as r,a as p}from"./chunks/framework.587922bd.js";const b=JSON.parse('{"title":"写个复读🐔","description":"","frontmatter":{},"headers":[],"relativePath":"guide/repeater.md","filePath":"guide/repeater.md","lastUpdated":1688192408000}'),i={name:"guide/repeater.md"},y=r("",20);function D(F,C,d,A,h,u){const n=l("ChatMsg"),o=l("ChatHistory");return t(),c("div",null,[y,s(o,null,{default:a(()=>[s(n,{id:"1659488338"},{default:a(()=>[p("hello")]),_:1}),s(n,{id:"1689919782"},{default:a(()=>[p("hello")]),_:1})]),_:1})])}const f=e(i,[["render",D]]);export{b as __pageData,f as default}; diff --git a/config/adapter-icqq.html b/config/adapter-icqq.html index 1f0c7a664..30f86f2ad 100644 --- a/config/adapter-icqq.html +++ b/config/adapter-icqq.html @@ -15,13 +15,13 @@ -
Skip to content
On this page

内置适配器(adapter-icqq)

icqq由来

在介绍该适配器之前,我想先让你了解一下什么是icqq,相信知道QQ``NodeJS机器人生态的都知道oicq,他是有takayama-lily大佬维护的qq机器人的SDK。 奈何近一年来,大佬似乎琐事产生,没空更新了,我们变自发开始维护起来,而icqq就是所有维护分支中的其中之一,他在保留原有oicqapi的同时 增加了频道加精/取消加精群消息的API,并优化了登录流程(createClient不再传uin,在login时才传递),更改了底层发布订阅的EventEmitter为TripTrap, 使得使用过滤器监听事件得以实现。

adapter-icqq的优势

adapter-icqq则是能让你直接在zhin中登录使用icqq登录个人账号,来作为qq机器人的适配器,它不像go-cqhhtpmiral-go那样,需要你重新启动一个进程 而是和zhin使用同一个进程工作,并且,你可以使用zhin去调用icqq底层的api,来实现更多功能。

说了这么多,那怎么配置呢?

接入到zhin

  • adapter-icqq作为内置适配器,接入到zhin十分的简单
  • 你只需要在配置文件zhin.yamladapters中增加如下配置,即可接入一个qq账号:
yaml
adapters: 
+    
Skip to content
On this page

内置适配器(adapter-icqq)

icqq由来

在介绍该适配器之前,我想先让你了解一下什么是icqq,相信知道QQ``NodeJS机器人生态的都知道oicq,他是有takayama-lily大佬维护的qq机器人的SDK。 奈何近一年来,大佬似乎琐事产生,没空更新了,我们变自发开始维护起来,而icqq就是所有维护分支中的其中之一,他在保留原有oicqapi的同时 增加了频道加精/取消加精群消息的API,并优化了登录流程(createClient不再传uin,在login时才传递),更改了底层发布订阅的EventEmitter为TripTrap, 使得使用过滤器监听事件得以实现。

adapter-icqq的优势

adapter-icqq则是能让你直接在zhin中登录使用icqq登录个人账号,来作为qq机器人的适配器,它不像go-cqhhtpmiral-go那样,需要你重新启动一个进程 而是和zhin使用同一个进程工作,并且,你可以使用zhin去调用icqq底层的api,来实现更多功能。

说了这么多,那怎么配置呢?

接入到zhin

  • adapter-icqq作为内置适配器,接入到zhin十分的简单
  • 你只需要在配置文件zhin.yamladapters中增加如下配置,即可接入一个qq账号:
yaml
adapters: 
   icqq: # 指定使用icqq适配器 
     bots: 
       - self_id: 147258369 # 机器人账号 
         platform: 5 # 指定qq登录平台为iPad(可不配置  1:安卓  2:安卓平板  3:手表  4:苹果电脑  5:苹果平板) 
  • 其中self_id对应icqq的uin,作为一个机器人的唯一标识
  • platform代表你要登录的平台,默认为1

TIP

具体更多的配置,请参考icqq的Config

完成配置后,重启zhin,将自动开始启动icqq,当遇到验证时,内置的login插件,将提供命令行辅助你完成登录的功能,

- + \ No newline at end of file diff --git a/config/adapter-onebot.html b/config/adapter-onebot.html index 37a345888..830638c6d 100644 --- a/config/adapter-onebot.html +++ b/config/adapter-onebot.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

待完善

- +
Skip to content
On this page

待完善

+ \ No newline at end of file diff --git a/config/built-plugin.html b/config/built-plugin.html index 005adaa29..65ccf94f7 100644 --- a/config/built-plugin.html +++ b/config/built-plugin.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

内置插件

zhin内置了7个插件,作为协助开发者管理zhin的基础,让我们来认识下这七个葫芦娃

帮助(help)

用户使用zhin的command定义了指令,使用help可以获取对应帮助文本

功能描述

  • 1.聊天中输入help会获得到当前可用指令的帮助
  • 2.聊天中输入help [pluginName:string]可获取对应指令名的帮助文本

配置项

辅助登录(login)

用户在登录icqq的过程中如果触发相关登录验证,可通过命令行完成验证

功能描述

  • 1.当触发system.login.slider事件时,可通过命令行输入对应ticket
  • 2.当触发system.login.qrcode事件时,可在扫码后回车继续当前流程
  • 3.当触发system.login.device事件时,可通过命令行选择验证方式和接收验证方式参数

配置项

配置文件管理(config)

可通过聊天的形式更改zhin的配置文件

功能描述

  • 1.聊天中输入config 可以查看当前zhin的所有配置
  • 2.聊天中输入config <keyPath:string>可以查看当前zhin的对应keyPath的配置
  • 3.聊天中输入config -d <keyPath:stirng>可以删除当前zhin的对应keyPath的配置
  • 4.聊天中输入config <keyPath:string> <value>可以修改(没有则添加)当前zhin的对应keyPath的配置为对应值

配置项

插件管理(plugin)

可通过聊天的形式管理zhin的插件

功能描述

  • 1.聊天中输入plugin.list 可以查看当前zhin的所有插件
  • 2.聊天中输入config.detail <name:stirng>可以查看当前zhin的**对应名称的插件
  • 3.聊天中输入config.mount <name:string>可以挂载指定名称的插件到zhin
  • 4.聊天中输入config.unmount <name:string>可以取消挂载zhin中指定名称的插件
  • 5.聊天中输入config.enable <name:string>可以启用指定名称的插件
  • 6.聊天中输入config.disable <name:string>可以禁用指定名称的插件

配置项

热更新(watcher)

提供zhin插件开发过程中热更新的功能

功能描述

  • 1.在插件代码变化是,自动重载对应插件
  • 2.在配置文件中添加或删除插件时,自动加载或取消加载对应插件

配置项

ke传入一个文件夹地址作为监听目录,默认为项目文件夹,建议不要更改,否则可能会造成第二个功能无法使用

进程守护(daemon)

提供zhin进程守护的能力和手动重启的能力

功能描述

  • 1.在意外意外中断时,自动重启zhin
  • 2.在聊天中,可使用指定的命令重启zhin

配置项

配置名值类型默认值描述
exitCommandstirng|booleantrue是否启用退出指令,传字符串时,则自定义退出指令,默认退出指令为exit
autoRestartbooleantrue是否自动重启

系统信息(systemInfo)

提供日志查看和状态查看指令

功能描述

  • 1.在聊天中,可使用logs [lines:number]查看zhin指定行数的日志,(默认为10行)
  • 2.在聊天中,可使用status查看zhin当前的运行状态

配置项

- +
Skip to content
On this page

内置插件

zhin内置了7个插件,作为协助开发者管理zhin的基础,让我们来认识下这七个葫芦娃

帮助(help)

用户使用zhin的command定义了指令,使用help可以获取对应帮助文本

功能描述

  • 1.聊天中输入help会获得到当前可用指令的帮助
  • 2.聊天中输入help [pluginName:string]可获取对应指令名的帮助文本

配置项

辅助登录(login)

用户在登录icqq的过程中如果触发相关登录验证,可通过命令行完成验证

功能描述

  • 1.当触发system.login.slider事件时,可通过命令行输入对应ticket
  • 2.当触发system.login.qrcode事件时,可在扫码后回车继续当前流程
  • 3.当触发system.login.device事件时,可通过命令行选择验证方式和接收验证方式参数

配置项

配置文件管理(config)

可通过聊天的形式更改zhin的配置文件

功能描述

  • 1.聊天中输入config 可以查看当前zhin的所有配置
  • 2.聊天中输入config <keyPath:string>可以查看当前zhin的对应keyPath的配置
  • 3.聊天中输入config -d <keyPath:stirng>可以删除当前zhin的对应keyPath的配置
  • 4.聊天中输入config <keyPath:string> <value>可以修改(没有则添加)当前zhin的对应keyPath的配置为对应值

配置项

插件管理(plugin)

可通过聊天的形式管理zhin的插件

功能描述

  • 1.聊天中输入plugin.list 可以查看当前zhin的所有插件
  • 2.聊天中输入config.detail <name:stirng>可以查看当前zhin的**对应名称的插件
  • 3.聊天中输入config.mount <name:string>可以挂载指定名称的插件到zhin
  • 4.聊天中输入config.unmount <name:string>可以取消挂载zhin中指定名称的插件
  • 5.聊天中输入config.enable <name:string>可以启用指定名称的插件
  • 6.聊天中输入config.disable <name:string>可以禁用指定名称的插件

配置项

热更新(watcher)

提供zhin插件开发过程中热更新的功能

功能描述

  • 1.在插件代码变化是,自动重载对应插件
  • 2.在配置文件中添加或删除插件时,自动加载或取消加载对应插件

配置项

ke传入一个文件夹地址作为监听目录,默认为项目文件夹,建议不要更改,否则可能会造成第二个功能无法使用

进程守护(daemon)

提供zhin进程守护的能力和手动重启的能力

功能描述

  • 1.在意外意外中断时,自动重启zhin
  • 2.在聊天中,可使用指定的命令重启zhin

配置项

配置名值类型默认值描述
exitCommandstirng|booleantrue是否启用退出指令,传字符串时,则自定义退出指令,默认退出指令为exit
autoRestartbooleantrue是否自动重启

系统信息(systemInfo)

提供日志查看和状态查看指令

功能描述

  • 1.在聊天中,可使用logs [lines:number]查看zhin指定行数的日志,(默认为10行)
  • 2.在聊天中,可使用status查看zhin当前的运行状态

配置项

+ \ No newline at end of file diff --git a/config/common.html b/config/common.html index 7783de00f..35ac2dbba 100644 --- a/config/common.html +++ b/config/common.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

配置文件

  • 在项目初始化完成后,项目根目录会生成一个名为zhin.yaml的文件,该文件为zhin核心配置文件,内容大致如下。现在,让我们来了解下配置文件每一项的意义
yaml
adapters:
+    
Skip to content
On this page

配置文件

  • 在项目初始化完成后,项目根目录会生成一个名为zhin.yaml的文件,该文件为zhin核心配置文件,内容大致如下。现在,让我们来了解下配置文件每一项的意义
yaml
adapters:
   icqq:
     bots:
       - uin: 147258369
@@ -33,8 +33,8 @@
 data_dir: data
 delay:
   prompt: 60000

adapters

  • 存放适配器的配置文件,每一个key对应一个适配器,每一个适配器可以启动多个机器人,每个机器人的配置存在bots
  • 不同适配器的机器人配置不尽相同,zhin在每一个bot配置基础上增加了一些zhin专有的配置项,大致含义如下:

bot通用配置项

参数名参数类型默认值描述
self_idstring|number-必填参数 当前机器人唯一表示
masterstring | number-主人账号
admins(string | number)[][]管理员账号列表
prefixstring-指令调用前缀
quote_selfbooleanfalse触发指令时,是否自动引用触发消息
enableboolean-当前机器人是否启用
enable_pluginsstirng[]-启用的插件列表
disable_pluginsstring[]-禁用的插件列表

TIP

适配器需安装后方能使用,(icqq为内置适配器,无需安装,相应配置请查看adapter-icqq)

plugins

  • 存放插件的配置文件,每一个key对应一个插件,只有在此处定义的插件才会被加载到zhin中

TIP

插件需安装后方能使用,(样例配置文件中的插件均为内置插件,无需安装即可使用,相应配置请查看内置插件)

log_level

  • 日志输出等级:(可选值:off,debug,error,warn,info,all

plugin_dir

  • 本地插件存放文件夹路径

data_dir

  • 缓存数据文件存放文件夹路径

delay

  • 各种超时时长配置(单位:毫秒)
- + \ No newline at end of file diff --git a/guide/bot.html b/guide/bot.html index 0a6c63bc4..143476e2d 100644 --- a/guide/bot.html +++ b/guide/bot.html @@ -15,9 +15,9 @@ -
Skip to content
On this page
- +
Skip to content
On this page
+ \ No newline at end of file diff --git a/guide/command.html b/guide/command.html index d6ad8582f..3348528f2 100644 --- a/guide/command.html +++ b/guide/command.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

指令(Command)

引言

  • 指令是当一条消息满足一定条件时,约定机器人执行指定一个函数函数
  • 在大多数机器人中,都是这样实现这个功能的
js
// ...
+    
Skip to content
On this page

指令(Command)

引言

  • 指令是当一条消息满足一定条件时,约定机器人执行指定一个函数函数
  • 在大多数机器人中,都是这样实现这个功能的
js
// ...
 bot.on('message',(event)=>{
     if(event.raw_message==='foo'){
         // 执行foo函数
@@ -51,8 +51,8 @@
     .sugar('qq点歌',{options:{platform:'qq',origin:true}})
     .sugar(/^来一首(.+)$/,{args:['$1'],options:{platform:'qq',origin:true}}) 
     .action(({ options },keyword) => [keyword,JSON.stringify(options)])

这样一来,输入来一首烟雨行舟就等价于输入music 烟雨行舟 -p qq -o了。

不难看出,使用快捷方式会让你的输入方式更加接近自然语言,也会让你的机器人显得更平易近人。

- + \ No newline at end of file diff --git a/guide/component.html b/guide/component.html index 960e0ed4f..8669e19d9 100644 --- a/guide/component.html +++ b/guide/component.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

组件

  • zhin 提供了组件以增加代码的复用性,zhin 的组件系统在一定程度上参考了 Vue.js 的语法,从而实现了高易学性和一定的移植性
  • 在组件中,你可以直接获取到当前会话的一些变量,这类似于vue的vuex,是根据会话产生环境自动生成的

文本插值

  • 首先我们来看数据绑定,最基本形式是使用“Mustache”语法(双花括号)的文本插值:
    聊天记录
    master
    output {{sender.user_id}}
    知音
    1659488338
    可以看到,在使用文本插值后,可以很快速的让机器人输出信息,我们来看在实际运行中的一个 demo
聊天记录
master
output [日志][用户:{{sender.nickname}}({{sender.user_id}})]是一个来自{{sender.area == ""?"未知":sender.area}}的{{sender.age}}岁{{sender.sex == "unknown"?"人妖":sender.sex}}
知音
[日志][用户:master(1659488338)]是一个来自四川的26岁male

image 标签

  • image 标签提供了一种快速发送照片的方法,请看下面的例子
    聊天记录
    master
    output <image src="https://maohaoji.com/image标签.gif"/>
    知音
    可以看到,使用 src 标签可以很快的发送想要发送的图片,下面我们来看一个使用 image 标签获取用户头像的实例
    聊天记录
    master
    output <image :src="`https://q1.qlogo.cn/g?b=qq&nk=${sender.user_id}&s=100`"/>
    知音
    ps 这里的:src 代表此处使用变量为src赋值,在 zhin 中,不支持v-bind代替这个语法,请注意与vue的区别;session可选字段参考`Session`

template 标签

  • template 标签主要是更加规范和语义化,在 zhin 中可以对元素进行分组 下面这个例子可以体现 template 对元素的分组

    ps <random>会随机输出内部元素,所以实际输出不一定是图示

    聊天记录
    master
    output 你喜欢<random>
    <template>御姐</template>
    <template>萝莉</template>
    </random>
    知音
    你喜欢萝莉

    下面这个例子可以体现使用 template 便签的美观性

    聊天记录
    master
    output <template>
    今日图片
    <image src="https://maohaoji.com/image标签.gif"/>
    欢迎您{{sender.nickname}}({{sender.user_id}})
    <image :src="`https://q1.qlogo.cn/g?b=qq&nk=${sender.user_id}&s=100`"/>
    </template>
    知音
    今日图片 欢迎您 master(1659488338)

random 标签

  • 相比于手动使用 Math.random()获取随机数然后输出元素,使用 random 随机输出元素的效率以及代码量、可读性都有不错的改善

ps random 内元素请尽可能使用<template>标签包装,以免出现奇怪的错误

下来我们来看一个例子

聊天记录
master
output <random>
<template>我猜你喜欢>image src="https://maohaoji.com/zhindocimage/%E9%BB%91%E4%B8%9D.jpg"/ ></template >
<template>我猜你喜欢>image src="https://maohaoji.com/zhindocimage/%E7%99%BD%E4%B8%9D.jpeg"/> </template>
<template>我猜你喜欢>image src="https://maohaoji.com/zhindocimage/%E6%B8%94%E7%BD%91.jpg"/> </template>
</random>
知音
我猜你喜欢

time 标签

  • time 标签相比于 new Date()然后解析来获取时间字符串来说是很方便容易的,它会输出 yyyy-MM-dd hh:mm:ss 格式的时间,我们来看有个例子

    聊天记录
    master
    output 现在是<time/>
    知音
    现在是 2023-02-0518:52:02
  • 我们可以用来实现一个有趣的输出

    聊天记录
    master
    output <image :src="`https://q1.qlogo.cn/g?b=qq&nk=${sender.user_id}&s=100`" />[日志][<time />][用户:{{sender.nickname}}({{sender.user_id}})]是一个来自{{sender.area == ""?"未知":sender.area}}的{{sender.age}}岁{{sender.sex == "unknown"?"人妖":sender.sex}}
    知音
    [日志][2023-02-0519:49:22][用户:master(1659488338)]是一个来自四川的 26 岁 male

at 标签

  • 使用 at 标签可以很容易的 at 群内成员,示例如下

    聊天记录
    master
    output <at user_id="1659488338" />
    知音
    @master
  • 当然,该标签也可以使用 v-bind 标签实现数据绑定,类似于以下内容

    聊天记录
    master
    output <at :user_id="sender.user_id" />
    知音
    @master
  • 结合<random>标签后,很容易的可以实现随机 at

    聊天记录
    master
    output <random>
    <template>taidixiong233
    <at user_id="2870926164" />
    </template>
    <template>master
    <at user_id="1689919782" />
    </template>
    <template>小叶子
    <at user_id="2870926164" />
    </template>
    </random>
    知音
    @taidixiong233
    taidixiong233
    怎么啦
    taidixiong233
    机器人at我干嘛咩

prompt 标签

  • prompt 标签可以快速的实现表单收集,非常的好用,实例如下
聊天记录
master
output 你是<prompt>请输入姓名</prompt>,你在<prompt>请输入地址</prompt>,是个可爱的<prompt>请输入性别</prompt>孩子
知音
请输入姓名
master
master
知音
请输入地址
master
四川
知音
请输入性别
master
知音
你是master,你在四川,是个可爱的男孩子
taidixiong233
这个机器人好酷

confirm 标签

  • confirm 标签可以问询用户是否确定、继续,我们来看一段演示
    聊天记录
    master
    output 你的选择是<confirm/>
    知音
    输入 yes,y,Yes,YES,Y,.,。,确认为确认
    master
    yes
    知音
    你的选择是 true

execute 标签

  • execute 标签可以用于执行机器人命令,下图给出了示例,具体命令列表请查看命令列表
    聊天记录
    master
    output <execute>status</execute>
    知音
    当前状态:
    系统架构:Zhin 自研
    CPU 架构:65536 核 Zhin(R)CPU9900KF-MaxPro
    内存:780.26MB/1048576GB(00.01%)
    进程内存占比:0.01%(45.97MB/1048576GB)
    持续运行时间:2149 小时 29 分钟
    掉线次数:0 次
    发送消息数:3521 条
    接收消息数:213230 条
    消息频率:1 条/分
    taidixiong233
    哇趣,65536核心??认真的别搞
    taidixiong233
    1048576GB??1PB的内存,这都比我硬盘空间大了

face 标签

  • face 标签可以快速的发送表情消息,需要使用表情的id,示例如下

    聊天记录
    master
    output <face id="2" />
    知音
  • 这是一个组合使用face标签的例子

    聊天记录
    master
    output <random><face id="1" /><face id="2" /></random>
    知音
    taidixiong233
    机器人发的表情色迷迷的
- +
Skip to content
On this page

组件

  • zhin 提供了组件以增加代码的复用性,zhin 的组件系统在一定程度上参考了 Vue.js 的语法,从而实现了高易学性和一定的移植性
  • 在组件中,你可以直接获取到当前会话的一些变量,这类似于vue的vuex,是根据会话产生环境自动生成的

文本插值

  • 首先我们来看数据绑定,最基本形式是使用“Mustache”语法(双花括号)的文本插值:
    聊天记录
    master
    output {{sender.user_id}}
    知音
    1659488338
    可以看到,在使用文本插值后,可以很快速的让机器人输出信息,我们来看在实际运行中的一个 demo
聊天记录
master
output [日志][用户:{{sender.nickname}}({{sender.user_id}})]是一个来自{{sender.area == ""?"未知":sender.area}}的{{sender.age}}岁{{sender.sex == "unknown"?"人妖":sender.sex}}
知音
[日志][用户:master(1659488338)]是一个来自四川的26岁male

image 标签

  • image 标签提供了一种快速发送照片的方法,请看下面的例子
    聊天记录
    master
    output <image src="https://maohaoji.com/image标签.gif"/>
    知音
    可以看到,使用 src 标签可以很快的发送想要发送的图片,下面我们来看一个使用 image 标签获取用户头像的实例
    聊天记录
    master
    output <image :src="`https://q1.qlogo.cn/g?b=qq&nk=${sender.user_id}&s=100`"/>
    知音
    ps 这里的:src 代表此处使用变量为src赋值,在 zhin 中,不支持v-bind代替这个语法,请注意与vue的区别;session可选字段参考`Session`

template 标签

  • template 标签主要是更加规范和语义化,在 zhin 中可以对元素进行分组 下面这个例子可以体现 template 对元素的分组

    ps <random>会随机输出内部元素,所以实际输出不一定是图示

    聊天记录
    master
    output 你喜欢<random>
    <template>御姐</template>
    <template>萝莉</template>
    </random>
    知音
    你喜欢萝莉

    下面这个例子可以体现使用 template 便签的美观性

    聊天记录
    master
    output <template>
    今日图片
    <image src="https://maohaoji.com/image标签.gif"/>
    欢迎您{{sender.nickname}}({{sender.user_id}})
    <image :src="`https://q1.qlogo.cn/g?b=qq&nk=${sender.user_id}&s=100`"/>
    </template>
    知音
    今日图片 欢迎您 master(1659488338)

random 标签

  • 相比于手动使用 Math.random()获取随机数然后输出元素,使用 random 随机输出元素的效率以及代码量、可读性都有不错的改善

ps random 内元素请尽可能使用<template>标签包装,以免出现奇怪的错误

下来我们来看一个例子

聊天记录
master
output <random>
<template>我猜你喜欢>image src="https://maohaoji.com/zhindocimage/%E9%BB%91%E4%B8%9D.jpg"/ ></template >
<template>我猜你喜欢>image src="https://maohaoji.com/zhindocimage/%E7%99%BD%E4%B8%9D.jpeg"/> </template>
<template>我猜你喜欢>image src="https://maohaoji.com/zhindocimage/%E6%B8%94%E7%BD%91.jpg"/> </template>
</random>
知音
我猜你喜欢

time 标签

  • time 标签相比于 new Date()然后解析来获取时间字符串来说是很方便容易的,它会输出 yyyy-MM-dd hh:mm:ss 格式的时间,我们来看有个例子

    聊天记录
    master
    output 现在是<time/>
    知音
    现在是 2023-02-0518:52:02
  • 我们可以用来实现一个有趣的输出

    聊天记录
    master
    output <image :src="`https://q1.qlogo.cn/g?b=qq&nk=${sender.user_id}&s=100`" />[日志][<time />][用户:{{sender.nickname}}({{sender.user_id}})]是一个来自{{sender.area == ""?"未知":sender.area}}的{{sender.age}}岁{{sender.sex == "unknown"?"人妖":sender.sex}}
    知音
    [日志][2023-02-0519:49:22][用户:master(1659488338)]是一个来自四川的 26 岁 male

at 标签

  • 使用 at 标签可以很容易的 at 群内成员,示例如下

    聊天记录
    master
    output <at user_id="1659488338" />
    知音
    @master
  • 当然,该标签也可以使用 v-bind 标签实现数据绑定,类似于以下内容

    聊天记录
    master
    output <at :user_id="sender.user_id" />
    知音
    @master
  • 结合<random>标签后,很容易的可以实现随机 at

    聊天记录
    master
    output <random>
    <template>taidixiong233
    <at user_id="2870926164" />
    </template>
    <template>master
    <at user_id="1689919782" />
    </template>
    <template>小叶子
    <at user_id="2870926164" />
    </template>
    </random>
    知音
    @taidixiong233
    taidixiong233
    怎么啦
    taidixiong233
    机器人at我干嘛咩

prompt 标签

  • prompt 标签可以快速的实现表单收集,非常的好用,实例如下
聊天记录
master
output 你是<prompt>请输入姓名</prompt>,你在<prompt>请输入地址</prompt>,是个可爱的<prompt>请输入性别</prompt>孩子
知音
请输入姓名
master
master
知音
请输入地址
master
四川
知音
请输入性别
master
知音
你是master,你在四川,是个可爱的男孩子
taidixiong233
这个机器人好酷

confirm 标签

  • confirm 标签可以问询用户是否确定、继续,我们来看一段演示
    聊天记录
    master
    output 你的选择是<confirm/>
    知音
    输入 yes,y,Yes,YES,Y,.,。,确认为确认
    master
    yes
    知音
    你的选择是 true

execute 标签

  • execute 标签可以用于执行机器人命令,下图给出了示例,具体命令列表请查看命令列表
    聊天记录
    master
    output <execute>status</execute>
    知音
    当前状态:
    系统架构:Zhin 自研
    CPU 架构:65536 核 Zhin(R)CPU9900KF-MaxPro
    内存:780.26MB/1048576GB(00.01%)
    进程内存占比:0.01%(45.97MB/1048576GB)
    持续运行时间:2149 小时 29 分钟
    掉线次数:0 次
    发送消息数:3521 条
    接收消息数:213230 条
    消息频率:1 条/分
    taidixiong233
    哇趣,65536核心??认真的别搞
    taidixiong233
    1048576GB??1PB的内存,这都比我硬盘空间大了

face 标签

  • face 标签可以快速的发送表情消息,需要使用表情的id,示例如下

    聊天记录
    master
    output <face id="2" />
    知音
  • 这是一个组合使用face标签的例子

    聊天记录
    master
    output <random><face id="1" /><face id="2" /></random>
    知音
    taidixiong233
    机器人发的表情色迷迷的
+ \ No newline at end of file diff --git a/guide/config.html b/guide/config.html index 2636a05a6..1ef37d6eb 100644 --- a/guide/config.html +++ b/guide/config.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

TIP

阅读本节前,请确认你已根据试试水初始化完成你的项目

了解配置

  • 上一节中,我们往配置文件中增加第一个机器人账号,但里面还有很多字段,都是代表什么呢?接下来,我们开始熟悉zhin的配置
  • 其中大致可分为适配器配置(adapters) 、插件配置(plugins)以及通用配置
  • 打开配置文件zhin.yaml,内容如下(对应作用已通过注释声明)
yaml
adapters: 
+    
Skip to content
On this page

TIP

阅读本节前,请确认你已根据试试水初始化完成你的项目

了解配置

  • 上一节中,我们往配置文件中增加第一个机器人账号,但里面还有很多字段,都是代表什么呢?接下来,我们开始熟悉zhin的配置
  • 其中大致可分为适配器配置(adapters) 、插件配置(plugins)以及通用配置
  • 打开配置文件zhin.yaml,内容如下(对应作用已通过注释声明)
yaml
adapters: 
   icqq: # 指定使用icqq适配器
     bots:
       - uin: 147258369 # 机器人账号 //
@@ -37,8 +37,8 @@
 data_dir: data # 缓存文件存放目录
 delay:
   prompt: 60000 # prompt方法超时时间为1分钟(60*1000毫秒)

适配器配置(adapters)

即zhin当前启用的适配器配置,其中每一项的key为适配器名称,对应value中的bots中存放的则是使用该适配器添加到zhin的每一个机器人账号配置

而每一个bot的配置中,除了不同平台的配置外,只能额外提供了一些通用配置,用于配置bot在zhin中的权限配置和指令设置

bot 通用配置

配置名类型默认值描述
masterstring | number-主人账号
admins(string | number)[][]管理员账号列表
prefixstring-指令调用前缀

插件配置(plugins)

即zhin当前启用的插件配置,其中每一项的key为插件名称,对应value则为传递给相应插件的配置内容

其中 configdaemonhelploginlogspluginstatuswatcher为zhin内置插件 帮助用户完成一些通用功能,具体功能请见内置插件介绍

通用配置(...other)

除了通用适配器配置插件配置以外的配置,均属于zhin的通用配置,其中各项含义如下表:

配置名类型默认值描述
log_leveltrace | debug | info | warn | error | fatal | mark | offinfo日志输出等级
plugin_dirstringplugins插件存放路径
data_dirstringdata数据存放路径
delayRecord<string,number>{ prompt: 60000 }系统各种超时时长配置
- + \ No newline at end of file diff --git a/guide/deploy.html b/guide/deploy.html index 84f5e6da5..9a04b48d0 100644 --- a/guide/deploy.html +++ b/guide/deploy.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

部署到服务器

  1. NodeJS官网选择适合你服务器操作系统的NodeJS版本安装到服务器
  2. 安装完成NodeJS后,使用其自带的npm全局安装pm2
shell
npm install -g pm2

使用cli快速部署到Linux服务器

在项目根目录执行下面的命令,即可快速将当前项目部署到远程linux服务器

TIP

  1. 尖括号(<>)为必填参数,方括号([])为选题参数
  2. username不传时默认为root
  3. 未传password时,使用sshKey登录,sshKey默认为~/.ssh/${服务器ip}.pem
  4. 传了password时,sshKey将失效,直接使用密码登录
  5. directory不传时默认为~/{当前项目名}
shell
zhin deploy <服务器ip> [-u <username>] [-p <password> | -k <sshKey>] [-d <directory>]

自行部署到其他操作系统的服务器

  1. 在服务器上安装zhin脚手架@zhinjs/cli
shell
npm install @zhinjs/cli -g
  1. 使用cli初始化一个空项目
shell
zhin init zhin-app
  1. 将本地项目的package.jsonpluginsdatazhin.yaml拷贝到服务器刚刚创建的空项目中
  2. 在服务器上安装项目依赖
shell
cd zhin-app && npm install
  1. 使用pm2启动zhin
shell
pm2 start npm --name zhin -- run start:zhin
- +
Skip to content
On this page

部署到服务器

  1. NodeJS官网选择适合你服务器操作系统的NodeJS版本安装到服务器
  2. 安装完成NodeJS后,使用其自带的npm全局安装pm2
shell
npm install -g pm2

使用cli快速部署到Linux服务器

在项目根目录执行下面的命令,即可快速将当前项目部署到远程linux服务器

TIP

  1. 尖括号(<>)为必填参数,方括号([])为选题参数
  2. username不传时默认为root
  3. 未传password时,使用sshKey登录,sshKey默认为~/.ssh/${服务器ip}.pem
  4. 传了password时,sshKey将失效,直接使用密码登录
  5. directory不传时默认为~/{当前项目名}
shell
zhin deploy <服务器ip> [-u <username>] [-p <password> | -k <sshKey>] [-d <directory>]

自行部署到其他操作系统的服务器

  1. 在服务器上安装zhin脚手架@zhinjs/cli
shell
npm install @zhinjs/cli -g
  1. 使用cli初始化一个空项目
shell
zhin init zhin-app
  1. 将本地项目的package.jsonpluginsdatazhin.yaml拷贝到服务器刚刚创建的空项目中
  2. 在服务器上安装项目依赖
shell
cd zhin-app && npm install
  1. 使用pm2启动zhin
shell
pm2 start npm --name zhin -- run start:zhin
+ \ No newline at end of file diff --git a/guide/index.html b/guide/index.html index b7adb114b..17aea6c93 100644 --- a/guide/index.html +++ b/guide/index.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

准备工作

通过本节的指引,让你了解到使用zhin开发机器人所需具备的技能以及运行环境要求

上手

通过本节的指引,帮助你快速搭建一个基于知音开发的机器人项目

初识配置

通过本节的指引,帮助你快速了解zhin配置文件常用配置项的作用

初识插件

通过真实的插件开发案例,帮助你快速了解zhin开发插件的大体流程

部署上线

通过本节的指引,帮助你快速部署zhin到服务器上

- +
Skip to content
On this page

准备工作

通过本节的指引,让你了解到使用zhin开发机器人所需具备的技能以及运行环境要求

上手

通过本节的指引,帮助你快速搭建一个基于知音开发的机器人项目

初识配置

通过本节的指引,帮助你快速了解zhin配置文件常用配置项的作用

初识插件

通过真实的插件开发案例,帮助你快速了解zhin开发插件的大体流程

部署上线

通过本节的指引,帮助你快速部署zhin到服务器上

+ \ No newline at end of file diff --git a/guide/plugin.html b/guide/plugin.html index a57bd9d32..d3f340359 100644 --- a/guide/plugin.html +++ b/guide/plugin.html @@ -10,19 +10,19 @@ - + -
Skip to content
On this page

INFO

通过本节的阅读,你将了解到如何新建一个插件、使用zhin提供的api实现一些简单的小功能,以及插件的发布

插件类型

zhin的插件共分为 本地插件npm 插件 两大类。

  • 本地插件

本地插件将全部存放在根目录的 plugins 下。 所有由你自己编写,并 仅供个人使用 的插件就可以称为本地插件。

  • npm 插件

npm 插件都是直接使用 npm i 命令安装,存放在 node_modules 目录下。 是由我或者其他开发者编写,上传至 npmjs 平台,为 所有使用 zhin 框架的人 提供服务。

还记得在初始化项目时输入的 zhin init 么,在界面会有一个选择安装插件的步骤,那些插件就全部属于 npm 插件

如果你对 npmjs 并不了解也没关系,在这里只会介绍本地插件的编写。 但是如果你想对 zhin 有一个更深入的了解,还是需要熟悉 nodejs 及 npmjs 的基本原理。

新建插件

TIP

  1. zhin 同时支持使用javascript和typescript编写插件.

  2. 为了更好的开发体验,建议使用typescript编写插件。

  3. 并且在2.x版本后,支持使用setup语法编写插件,这将在后面的章节中介绍。

zhin为开发者提供了两种方式来新建一个插件,分别是通过cli手动创建。推荐使用cli创建,因为这样可以省去很多重复的工作。现在我们就来看看如何创建一个插件。

1. cli创建

  • 此方式需要你安装了zhin脚手架@zhinjs/cli
  • 如果你还没有安装,可以通过以下命令进行安装
shell
npm i -g @zhinjs/cli
  • 安装完成后,你就可以通过以下命令创建一个插件了
shell
zhin new test -t # 此处test为插件名, -t选项表示使用ts进行开发, 如果不加-t选项, 则默认使用js进行开发,如果你想使用setup语法开发,可以加上-s选项

2. 手动创建

  1. 手动创建插件需要你自己创建目录,然后在目录下创建src目录,最后在src目录下创建index.ts文件,这个文件就是插件的主入口文件。
  2. 如果你想使用setup语法开发,则必须添加package.json文件,并在内容中添加"setup": true字段,否则zhin将会以普通插件的方式进行加载。
  • 完成创建后,插件目录大体如下:
text
plugins/
+    
Skip to content
On this page

INFO

通过本节的阅读,你将了解到如何新建一个插件、使用zhin提供的api实现一些简单的小功能,以及插件的发布

插件类型

zhin的插件共分为 本地插件npm 插件 两大类。

  • 本地插件

本地插件将全部存放在根目录的 plugins 下。 所有由你自己编写,并 仅供个人使用 的插件就可以称为本地插件。

  • npm 插件

npm 插件都是直接使用 npm i 命令安装,存放在 node_modules 目录下。 是由我或者其他开发者编写,上传至 npmjs 平台,为 所有使用 zhin 框架的人 提供服务。

还记得在初始化项目时输入的 zhin init 么,在界面会有一个选择安装插件的步骤,那些插件就全部属于 npm 插件

如果你对 npmjs 并不了解也没关系,在这里只会介绍本地插件的编写。 但是如果你想对 zhin 有一个更深入的了解,还是需要熟悉 nodejs 及 npmjs 的基本原理。

新建插件

TIP

  1. zhin 同时支持使用javascript和typescript编写插件.

  2. 为了更好的开发体验,建议使用typescript编写插件。

  3. 并且在2.x版本后,支持使用setup语法编写插件,这将在后面的章节中介绍。

zhin为开发者提供了两种方式来新建一个插件,分别是通过cli手动创建。推荐使用cli创建,因为这样可以省去很多重复的工作。现在我们就来看看如何创建一个插件。

1. cli创建

  • 此方式需要你安装了zhin脚手架@zhinjs/cli
  • 如果你还没有安装,可以通过以下命令进行安装
shell
npm i -g @zhinjs/cli
  • 安装完成后,你就可以通过以下命令创建一个插件了
shell
zhin new test -t # 此处test为插件名, -t选项表示使用ts进行开发, 如果不加-t选项, 则默认使用js进行开发,如果你想使用setup语法开发,可以加上-s选项

2. 手动创建

  1. 手动创建插件需要你自己创建目录,然后在目录下创建src目录,最后在src目录下创建index.ts文件,这个文件就是插件的主入口文件。
  2. 如果你想使用setup语法开发,则必须添加package.json文件,并在内容中添加"setup": true字段,否则zhin将会以普通插件的方式进行加载。
  • 完成创建后,插件目录大体如下:
text
plugins/
 └─ test/                 test 插件
    └─ index.js           程序主入口
    └─ package.json       包管理文件 (可选)
text
plugins/
 └─ test/                 test 插件
    ├─ src/               资源目录 插件
    │  └─ index.ts        程序主入口
-   └─ package.json       包管理文件 (可选)
  • 后续章节中,我们将以cli创建的插件为例进行讲解,如果你使用手动创建的方式,也可以参考cli创建的插件进行开发。

插件开发

在开发之前,你可以先看看处理生成的默认插件代码,里面有一些注释,可以帮助你更好的了解插件的开发。

1. 默认代码

javascript
// index.js
+   └─ package.json       包管理文件 (可选)
  • 后续章节中,我们将以cli创建的插件为例进行讲解,如果你使用手动创建的方式,也可以参考cli创建的插件进行开发。

插件开发

在开发之前,你可以先看看处理生成的默认插件代码,里面有一些注释,可以帮助你更好的了解插件的开发。

1. 默认代码

javascript
// index.js
 module.exports={
     name:'js',
     /**
@@ -196,7 +196,7 @@
     // 如果你使用过react的useEffect 那你应该知道这是在干嘛
     // 函数内容将会在插件卸载时自动卸载
 })
-*/

2. 功能实现

接下来,我们来实现一些功能,让你更好的理解插件的使用方法

2.1 定义指令

javascript
// index.js
+*/

2. 功能实现

接下来,我们来实现一些功能,让你更好的理解插件的使用方法

2.1 定义指令

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -238,7 +238,7 @@
     .action(({session,options},foo)=>{
         console.log('options',options);
         return 'hello world'
-    })

现在,你可以给bot发送test -f hello来测试一下了(如果对应bot有配置prefix,需要在发送的指令前边加上对应prefix)

2.2 定义中间件

javascript
// index.js
+    })

现在,你可以给bot发送test -f hello来测试一下了(如果对应bot有配置prefix,需要在发送的指令前边加上对应prefix)

2.2 定义中间件

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -284,7 +284,7 @@
     }else{
         next() // 不next,则不会流入下一个中间件
     }
-});

INFO

如果你使用过koa,那么你应该知道这是在干嘛

如果你不知道,那么你可以看看这里

2.3 监听事件

javascript
// index.js
+});

INFO

如果你使用过koa,那么你应该知道这是在干嘛

如果你不知道,那么你可以看看这里

2.3 监听事件

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -314,7 +314,7 @@
 const ctx=useContext()
 ctx.on('message',({session})=>{
     console.log('message',session.message)
-});

可监听的事件及返回参数可以参考事件地图

2.4 定义服务

javascript
// index.js
+});

可监听的事件及返回参数可以参考事件地图

2.4 定义服务

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -362,7 +362,7 @@
 }
 ctx.service('test',{
     foo:'bar'
-})

TIP

服务名不可重复,否则会报错

服务名不可为zhin内置的服务名,否则会报错

内置服务可参考内置服务

2.5 使用自定义服务

javascript
// index.js
+})

TIP

服务名不可重复,否则会报错

服务名不可为zhin内置的服务名,否则会报错

内置服务可参考内置服务

2.5 使用自定义服务

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -396,7 +396,7 @@
 ctx.command('test')
     .action(({session})=>{
         console.log('service',ctx.test)
-    })

TIP

如果你使用了typescript,那么你需要在使用服务前声明服务的类型,否则会报错

2.6 生命周期

javascript
// index.js
+    })

TIP

如果你使用了typescript,那么你需要在使用服务前声明服务的类型,否则会报错

2.6 生命周期

javascript
// index.js
 module.exports={
     name:'test',
     /**
@@ -430,7 +430,7 @@
 console.log('install')
 onDispose(()=>{
     console.log('dispose')
-})

除此之外,在setup语法中,你还可以使用useEffect来监听生命周期

javascript
// index.js
+})

除此之外,在setup语法中,你还可以使用useEffect来监听生命周期

javascript
// index.js
 const {useContext,useEffect}=require('zhin')
 useEffect(()=>{
     const ctx=useContext()
@@ -447,7 +447,7 @@
         console.log('dispose')
     }
 })

2.7. 获取zhin.yaml中的指定配置

假设zhin.yaml中有如下配置

yaml
test:
-  foo: bar
javascript
// index.js
+  foo: bar
javascript
// index.js
 const {useOption}=require('zhin')
 module.exports={
     name:'test',
@@ -475,7 +475,7 @@
 import {useContext} from 'zhin';
 const ctx=useContext()
 const option=ctx.option('test') // 获取zhin.yaml中的test配置
-console.log(option)

在setup中,你还可以使用useEffect来监听配置的变化

javascript
// index.js
+console.log(option)

在setup中,你还可以使用useEffect来监听配置的变化

javascript
// index.js
 const {useContext,useEffect}=require('zhin')
 const ctx=useContext()
 const option=ctx.option('test') // 获取zhin.yaml中的test配置
@@ -488,8 +488,8 @@
 useEffect((newOption,oldOption)=>{
     console.log(option)
 },option)

在配置变化时,useEffect会被调用,第一个参数为新的配置,第二个参数为旧的配置

- + \ No newline at end of file diff --git a/guide/prepare.html b/guide/prepare.html index 9acc58c78..0d2704262 100644 --- a/guide/prepare.html +++ b/guide/prepare.html @@ -15,9 +15,9 @@ -
Skip to content
On this page

准备工作

技能要求:

  1. 熟练使用百度必应等国内常用搜索引擎获取信息,有使用谷歌搜索引擎的能力更佳
  2. 熟悉JavaScript(后续简称JS)语言,具备阅读JS代码和编写JS代码的能力
  3. 了解Typescript(后续简称TS),具备阅读TS代码的能力(可选)

环境要求:

  • 操作系统:WindowsLinuxMacOS
  • 运行环境:NodeJS(>=16.0)

可以使用如下指令查询当前设备的nodeJS版本:

bash
node -v

zhin为基于NodeJS开发的机器人框架,所以需要运行于NodeJS环境下,若未安装,请前往NodeJS官网,根据自身电脑配置,下载对应安装包,安装完成后继续

TIP

NodeJS官网下载链接:https://nodejs.org/en/download/

- +
Skip to content
On this page

准备工作

技能要求:

  1. 熟练使用百度必应等国内常用搜索引擎获取信息,有使用谷歌搜索引擎的能力更佳
  2. 熟悉JavaScript(后续简称JS)语言,具备阅读JS代码和编写JS代码的能力
  3. 了解Typescript(后续简称TS),具备阅读TS代码的能力(可选)

环境要求:

  • 操作系统:WindowsLinuxMacOS
  • 运行环境:NodeJS(>=16.0)

可以使用如下指令查询当前设备的nodeJS版本:

bash
node -v

zhin为基于NodeJS开发的机器人框架,所以需要运行于NodeJS环境下,若未安装,请前往NodeJS官网,根据自身电脑配置,下载对应安装包,安装完成后继续

TIP

NodeJS官网下载链接:https://nodejs.org/en/download/

+ \ No newline at end of file diff --git a/guide/prompt.html b/guide/prompt.html index ac2a08bd9..4c576aa74 100644 --- a/guide/prompt.html +++ b/guide/prompt.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

可交互输入(Prompt)

引言

在实际开发过程中,我们可能会需要用户输入必填参数,或者需要用户确认操作,才能继续执行函数, 为此,zhin在**会话(Session)**上提供了一个prompt对象,用于接收用户下一次输入的内容,具体用例如下:

案例

typescript
import {Context} from "zhin";
+    
Skip to content
On this page

可交互输入(Prompt)

引言

在实际开发过程中,我们可能会需要用户输入必填参数,或者需要用户确认操作,才能继续执行函数, 为此,zhin在**会话(Session)**上提供了一个prompt对象,用于接收用户下一次输入的内容,具体用例如下:

案例

typescript
import {Context} from "zhin";
 
 export function install(ctx: Context) {
     ctx.command('del [id:number]')
@@ -61,8 +61,8 @@
             return JSON.stringify(userInfo,null,2)
         })
 }
聊天记录
master
collect
知音
请输入姓名
master
张三
知音
请输入年龄
master
18
知音
请输入出生年月日
master
2000-01-01
知音
请输入一个正则表达式
master
/^(.*)$/
知音
是否成年
输入yes,y,Yes,YES,Y,.,。,确认为确认
master
y
知音
请输入你的兴趣爱好
值之间使用','分隔
master
唱,跳,Rap,篮球
知音
请选择你喜欢的水果
1.苹果
2.香蕉
3.橙子
值之间使用','分隔
master
1
知音
{ "name": "张三", "age": 18, "birthDay": "2000-01-01T00:00:00.000Z", "reg": {}, "isAdult": true, "hobbies": [ "唱", "跳", "Rap", "篮球" ], "likeFruits": [ "apple" ] }
- + \ No newline at end of file diff --git a/guide/repeater.html b/guide/repeater.html index 38912a140..911136e95 100644 --- a/guide/repeater.html +++ b/guide/repeater.html @@ -10,12 +10,12 @@ - + -
Skip to content
On this page

写个复读🐔

到目前为止,我们虽然让zhin运行起来了,但除了内置插件外,还没有任何功能,接下来,让我们通过实现一个复读机的小功能,来初步了解下zhin插件开发的大体流程:

1. 创建插件(二选一)

1. cli创建

  • 此方式需要你安装了zhin脚手架@zhinjs/cli
shell
zhin new repeater # 此处repeater为插件名
+    
Skip to content
On this page

写个复读🐔

到目前为止,我们虽然让zhin运行起来了,但除了内置插件外,还没有任何功能,接下来,让我们通过实现一个复读机的小功能,来初步了解下zhin插件开发的大体流程:

1. 创建插件(二选一)

1. cli创建

  • 此方式需要你安装了zhin脚手架@zhinjs/cli
shell
zhin new repeater # 此处repeater为插件名
 # or
 zhin new repeater -t # 如果你想使用TS进行开发,可增加`-t`选项,声明需要创建TS插件

2. 手动创建

shell
# 进入插件目录
 cd plugins 
@@ -24,21 +24,21 @@
 mkdir repeater
 
 #创建入口文件
-touch index.js

完成创建后,插件目录大体如下:

text
plugins/
+touch index.js

完成创建后,插件目录大体如下:

text
plugins/
 └─ repeater/                 test 插件
    ├─ index.js           程序主入口
    └─ package.json       包管理文件 (可选)
text
plugins/
 └─ repeater/                 test 插件
    └─ src/                 资源目录 插件
       ├─ index.ts           程序主入口
-      └─ package.json       包管理文件 (可选)

WARNING

除非你创建了 package.json ,否则 index 文件名 不能随意更改 ,不然会导致插件无法被检索。

打开入口文件,并输入如下内容

js
module.exports={
+      └─ package.json       包管理文件 (可选)

WARNING

除非你创建了 package.json ,否则 index 文件名 不能随意更改 ,不然会导致插件无法被检索。

打开入口文件,并输入如下内容

js
module.exports={
     name:'repeater',
     install(ctx){
     }
 }
ts
import {Context} from 'zhin';
 export const name='repeater';
 export function install (ctx:Context){
-}

这个时候你就已经写好了一个插件,不需要任何额外操作,不过目前这个插件还什么都不能干,我们没有为其编写相应的交互逻辑。

2. 实现插件交互逻辑

相信你这个时候一定有很多疑问,因为这其中涉及到相当多的概念,Plugin 到底是什么?

INFO

当前章节仅提供示例,目的在于让你能自己编写出可以进行简单交互的插件。 目前你无需关心这段代码是什么意思,后面会逐一介绍,所以不用着急,让我们继续。

你可以参考下列代码段,在上下文上添加一个中间件,拦截消息会话,并将消息元素原封不动回复给用户

js
module.exports={
+}

这个时候你就已经写好了一个插件,不需要任何额外操作,不过目前这个插件还什么都不能干,我们没有为其编写相应的交互逻辑。

2. 实现插件交互逻辑

相信你这个时候一定有很多疑问,因为这其中涉及到相当多的概念,Plugin 到底是什么?

INFO

当前章节仅提供示例,目的在于让你能自己编写出可以进行简单交互的插件。 目前你无需关心这段代码是什么意思,后面会逐一介绍,所以不用着急,让我们继续。

你可以参考下列代码段,在上下文上添加一个中间件,拦截消息会话,并将消息元素原封不动回复给用户

js
module.exports={
     name:'repeater',
     install(ctx){
         ctx.middleware(async (session,next)=>{
@@ -54,8 +54,8 @@
         next()
     });
 }

测试一下

聊天记录
master
hello
知音
hello
- + \ No newline at end of file diff --git a/guide/start.html b/guide/start.html index 0211d8080..979bc95b9 100644 --- a/guide/start.html +++ b/guide/start.html @@ -15,7 +15,7 @@ -
Skip to content
On this page

TIP

阅读本节前,请确认你以完成准备工作

安装

项目构建(三选一)

1. 通过cli指令构建

  1. 全局安装@zhinjs/cli
shell
# 安装zhin cli
+    
Skip to content
On this page

TIP

阅读本节前,请确认你以完成准备工作

安装

项目构建(三选一)

1. 通过cli指令构建

  1. 全局安装@zhinjs/cli
shell
# 安装zhin cli
 npm install -g @zhinjs/cli
 
 # 通过cli初始化项目
@@ -56,8 +56,8 @@
 data_dir: data
 delay:
   prompt: 60000

TIP

要了解zhin配置,请前往配置

启动

一切准备就绪,开始启动你的项目吧。如果你是本地安装,就要使用npx zhin start启动项目。

shell
zhin start

如上述步骤无误,根据控制台的提示扫码或输入密码即可成功登录。 账号登录成功后,会在根目录下的data自动生成账号的缓存及相关配置文件。

测试一下

正常启动后,往机器人发送第一条消息,测试一下是否正常吧

聊天记录
master
help
知音
help [command:string] 查看某个指令的帮助文档
output <msg:any>回复“帮助 指令名”以查看对应指令帮助。
master
output hello world
知音
hello world
- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 67ed1a9b6..6d428e6d9 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"guide_index.md":"9923d294","api_service-router.md":"e539d155","api_service-server.md":"9ff60e38","api_service.md":"20d87805","guide_command.md":"c588d92b","api_message.md":"f2cb48b0","guide_deploy.md":"8a498116","guide_component.md":"d2abb193","guide_plugin.md":"74d64c4f","guide_prepare.md":"32c3c497","guide_prompt.md":"44f5d76e","guide_repeater.md":"60388b4f","guide_start.md":"60d1a92f","index.md":"6e87687a","api_context.md":"dca159c8","api_event_map.md":"29625008","api_index.md":"aeb4bcba","api_render-element.md":"c87fed4e","api_render-template.md":"27231f06","api_zhin.md":"62d7e7b6","api_session.md":"be54baa4","config_built-plugin.md":"9b035295","config_common.md":"ef8add40","guide_config.md":"9990ca7f","guide_bot.md":"02213cca","api_service-koa.md":"8994bd74","api_render-component.md":"8ea74de4","api_bot.md":"ec90089c","api_command.md":"96bf488b","config_adapter-icqq.md":"8f5eac0d","api_adapter.md":"e6797ad4","config_adapter-onebot.md":"89101df5"} +{"api_command.md":"96bf488b","api_message.md":"f2cb48b0","api_index.md":"aeb4bcba","api_event_map.md":"29625008","api_bot.md":"ec90089c","api_adapter.md":"e6797ad4","api_context.md":"dca159c8","api_render-component.md":"8ea74de4","config_common.md":"ef8add40","guide_bot.md":"02213cca","guide_command.md":"c588d92b","guide_component.md":"d2abb193","guide_index.md":"9923d294","api_render-element.md":"c87fed4e","config_adapter-onebot.md":"89101df5","config_adapter-icqq.md":"8f5eac0d","api_service-router.md":"e539d155","api_service-koa.md":"8994bd74","api_service-server.md":"9ff60e38","api_service.md":"ab115376","api_zhin.md":"62d7e7b6","api_render-template.md":"27231f06","api_session.md":"be54baa4","guide_prepare.md":"32c3c497","guide_config.md":"9990ca7f","guide_repeater.md":"438ceb4b","guide_plugin.md":"ed5e3bbf","config_built-plugin.md":"9b035295","guide_prompt.md":"44f5d76e","guide_deploy.md":"8a498116","guide_start.md":"60d1a92f","index.md":"6e87687a"} diff --git a/index.html b/index.html index 1fabef150..fe40ee64a 100644 --- a/index.html +++ b/index.html @@ -15,9 +15,9 @@ -
Skip to content

知音(知音)

基于icqq的一个QQ机器人开发框架

轻量、优雅、热更,拥抱icqq

轻量

知音最小化内部功能,仅内置系统常用插件和适配器,其他功能均使用插件实现

优雅

知音内部实现尽量做到符合大众开发思维,使阅读源码以及开发过程中事半功倍

热更

知音内置热更插件,能让你在开发过程中避免频繁重启进程导致账号风险问题

拥抱icqq

知音内置icqq适配器(作者维护的oicq的另一个分支),能让你快速对接qq平台的机器人

- +
Skip to content

知音(知音)

基于icqq的一个QQ机器人开发框架

轻量、优雅、热更,拥抱icqq

轻量

知音最小化内部功能,仅内置系统常用插件和适配器,其他功能均使用插件实现

优雅

知音内部实现尽量做到符合大众开发思维,使阅读源码以及开发过程中事半功倍

热更

知音内置热更插件,能让你在开发过程中避免频繁重启进程导致账号风险问题

拥抱icqq

知音内置icqq适配器(作者维护的oicq的另一个分支),能让你快速对接qq平台的机器人

+ \ No newline at end of file