node-karin
Version:
Lightweight, efficient, concise, and stable robot framework.
2,116 lines (2,103 loc) • 561 kB
TypeScript
import EventEmitter from 'events';
import * as chalk from 'chalk';
export { basePath, commentPath, configPath, consolePath, dataPath, dbPath, defaultConfigPath, defaultViewPath, htmlPath, isPackaged, isPkg, karinDir, karinMain, karinPathBase, karinPathComment, karinPathConfig, karinPathConsole, karinPathData, karinPathDb, karinPathDefaultConfig, karinPathDefaultView, karinPathHtml, karinPathKv, karinPathLogs, karinPathMain, karinPathPlugins, karinPathPm2Config, karinPathRedisSqlite3, karinPathResource, karinPathRoot, karinPathSandboxData, karinPathSandboxTemp, karinPathTaskDb, karinPathTemp, kvPath, logsPath, pluginDir, pm2Path, redisSqlite3Path, resourcePath, sandboxDataPath, sandboxTempPath, tempPath } from './root.js';
import { a as LoggerLevel, b as LogMethodNames, L as Logger } from './types-hAhbXJDZ.js';
export { D as DEFAULT_LOGGER_CONFIG, F as FileLogConfig, c as LogMethodsOnly, d as LoggerConfig } from './types-hAhbXJDZ.js';
import { Database } from 'sqlite3';
import { Job } from 'node-schedule';
import fs$1, { WriteStream } from 'node:fs';
import { Readable } from 'node:stream';
import { AxiosRequestConfig, AxiosResponse } from 'axios';
import YAML from 'yaml';
import { FSWatcher } from 'chokidar';
import { ExecException as ExecException$1, exec as exec$2 } from 'node:child_process';
import { Request as Request$1, Router, Response, RequestHandler, Express } from 'express';
import { exec as exec$1, ExecException } from 'child_process';
export { ExecException } from 'child_process';
import { RedisClientOptions, RedisClientType } from 'redis';
import * as http from 'http';
import { EventEmitter as EventEmitter$1 } from 'node:events';
import { IncomingHttpHeaders, IncomingMessage } from 'node:http';
import { WebSocket } from 'ws';
import 'log4js';
declare const debug: {
chalk: chalk.ChalkInstance;
setColor: (fnc: (text: string) => string) => void;
enable: (bool: boolean) => void;
} & ((...args: any[]) => void);
/**
* 事件来源
* - group: 群聊
* - friend: 好友聊天
* - guild: 频道
* - direct: 频道私信
* - groupTemp: 临时群会话
*/
type Scene = 'group' | 'friend' | 'guild' | 'direct' | 'groupTemp';
/**
* 事件来源类型基类
*/
interface BaseContact {
/** 事件来源 */
scene: Scene;
/** 事件来源id */
peer: string;
/** 事件来源子id 仅在频道、频道私信和临时会话中存在 */
subPeer?: string;
/** 来源场景的昵称 */
name: string;
/** 来源场景的子昵称 */
subName?: string;
}
/**
* 群聊来源信息类型
*/
interface GroupContact extends BaseContact {
scene: 'group';
/** 群ID */
peer: string;
/** 群名 */
name: string;
}
/**
* 好友来源信息类型
*/
interface FriendContact extends BaseContact {
scene: 'friend';
/** 好友ID */
peer: string;
/** 好友昵称 */
name: string;
}
/**
* 频道私信来源信息类型
*/
interface DirectContact extends BaseContact {
scene: 'direct';
/** 频道ID 虚拟ID 用于请求Api使用 */
peer: string;
/** 频道名称 */
name: string;
/** 子频道ID 虚拟ID */
subPeer: string;
/** 子频道名称 */
subName?: string;
}
/**
* 频道来源信息类型
*/
interface GuildContact extends BaseContact {
scene: 'guild';
/** 频道ID */
peer: string;
/** 频道名称 */
name: string;
/** 子频道ID */
subPeer: string;
/** 子频道名称 */
subName: string;
}
/**
* 群临时会话来源信息类型
*/
interface GroupTempContact extends BaseContact {
scene: 'groupTemp';
/** 群ID */
peer: string;
/** 发起临时会话用户ID */
subPeer: string;
/** 群名 */
name: string;
}
/**
* 事件来源信息
* - `group`: 群聊
* - `friend`: 好友
* - `guild`: 频道
* - `direct`: 频道私信
* - `groupTemp`: 临时群会话
*/
type Contact<T extends Scene = Scene> = T extends 'group' ? GroupContact : T extends 'friend' ? FriendContact : T extends 'guild' ? GuildContact : T extends 'direct' ? DirectContact : T extends 'groupTemp' ? GroupTempContact : never;
/**
* 事件发送者性别
* - `male` 男
* - `female` 女
* - `unknown` 未知
*/
type Sex$1 = 'male' | 'female' | 'unknown';
/**
* 事件发送者身份 仅在群聊、频道中存在
* - `owner` 群主、频道主
* - `admin` 管理员、超管
* - `member` 群成员、频道成员
* - `unknown` 未知身份
*/
type Role = 'owner' | 'admin' | 'member' | 'unknown';
/**
* 事件发送者信息父类
*/
interface SenderBase {
/** 发送者ID */
userId: string;
/** 发送者昵称 与`name`一致 */
nick: string;
/** 发送者昵称 与`nick`一致 */
name: string;
/** 发送者性别 */
sex?: Sex$1;
/** 发送者年龄 */
age?: number;
/** 发送者uid QQ场景专属 */
uid?: string;
/** 发送者uin QQ场景专属 */
uin?: number;
}
/**
* - 好友事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
type FriendSender = SenderBase;
/**
* - 群聊事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
interface GroupSender extends SenderBase {
/** 群成员身份 */
role: Role;
/** 群名片/备注 */
card?: string;
/** 地区 */
area?: string;
/** 成员等级 */
level?: number;
/** 专属头衔 */
title?: string;
}
/**
* - 群聊临时会话事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
type GroupTempSender = SenderBase;
/**
* - 频道事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
interface GuildSender extends SenderBase {
/** 频道成员身份 */
role: Role;
}
/**
* - 频道私信事件发送者信息
* - tips: 如果名称不存在则是空字符串
*/
type DirectSender = SenderBase;
/**
* 事件发送者信息
* - `friend`: 好友
* - `group`: 群聊
* - `guild`: 频道
* - `direct`: 频道私信
* - `groupTemp`: 临时群会话
* - `notice`: 通知
* - `request`: 请求
*/
type Sender<T extends Scene = Scene> = T extends 'friend' ? FriendSender : T extends 'group' ? GroupSender : T extends 'guild' ? GuildSender : T extends 'direct' ? DirectSender : T extends 'groupTemp' ? GroupTempSender : never;
/** 构建群聊场景的`sender`函数重载类型 */
interface SenderGroup$1 {
/**
* 构建群聊场景的`sender`
* @param userId 用户ID
* @param role 群成员身份
* @param name 用户名
* @param sex 性别
* @param age 年龄
* @param card 群名片/备注
* @param area 地区
* @param level 成员等级
* @param title 专属头衔
* @param uid QQ场景专属
* @param uin QQ场景专属
*/
(userId: Sender<'group'>['userId'], role?: Sender<'group'>['role'], name?: Sender<'group'>['name'], sex?: Sender<'friend'>['sex'], age?: Sender<'friend'>['age'], card?: Sender<'group'>['card'], area?: Sender<'group'>['area'], level?: Sender<'group'>['level'], title?: Sender<'group'>['title'], uid?: Sender<'friend'>['uid'], uin?: Sender<'friend'>['uin']): Sender<'group'>;
(options: Sender<'group'>): Sender<'group'>;
}
/**
* 适配器所属平台
* - `qq`: QQ
* - `wechat`: 微信
* - `telegram`: Telegram
* - `discord`: Discord
* - `koko`: 开黑吧
* - `other`: 其他
*/
type AdapterPlatform = 'qq' | 'wechat' | 'telegram' | 'discord' | 'koko' | 'other';
/**
* 适配器所使用的标准接口协议
* - `onebot11`: OneBot v11 标准
* - `onebot12`: OneBot v12 标准
* - `oicq`: OICQ 标准
* - `icqq`: OICQ fork 标准
* - `other`: 其他标准
*/
type AdapterStandard = 'onebot11' | 'onebot12' | 'oicq' | 'icqq' | 'other';
/**
* 适配器协议实现名称
* - `console`: 控制台
* - `qqbot`: https://bot.q.qq.com/wiki
* - `icqq`: https://github.com/icqqjs/icqq
* - `gocq-http`: https://docs.go-cqhttp.org/
* - `napcat`: https://napneko.github.io/zh-CN/
* - `oicq`: https://github.com/takayama-lily/oicq
* - `llonebot`: https://llonebot.github.io/zh-CN/
* - `conwechat`: https://justundertaker.github.io/ComWeChatBotClient/
* - `lagrange`: https://lagrangedev.github.io/Lagrange.Doc/Lagrange.OneBot/
*/
type AdapterProtocol = 'qqbot' | 'icqq' | 'gocq-http' | 'napcat' | 'oicq' | 'llonebot' | 'conwechat' | 'lagrange' | 'console' | 'other';
/**
* 适配器通信方式
* - `http`: HTTP 通信
* - `webSocketServer`: WebSocket 服务端
* - `webSocketClient`: WebSocket 客户端
* - `grpc`: gRPC 通信
* - `other`: 其他通信方式
*/
type AdapterCommunication = 'http' | 'webSocketServer' | 'webSocketClient' | 'grpc' | 'other';
/**
* 适配器基本信息
*/
interface AdapterInfo {
/** 适配器索引 默认为-1 在注册适配器时会自动更改为对应的索引 */
index: number;
/** 适配器名称 如lagrange-onebot */
name: string;
/** 适配器版本 */
version: string;
/** 适配器平台 */
platform: AdapterPlatform;
/** 适配器使用的协议标准 如onebot11 */
standard: AdapterStandard;
/** 适配器协议实现 如gocq、napcat */
protocol: AdapterProtocol;
/** 适配器通信方式 */
communication: AdapterCommunication;
/**
* 适配器通信地址
* @example `http://127.0.0.1:7000`
* @example `ws://127.0.0.1:7000/ws`
* @example `grpc://127.0.0.1:7001`
* @example `internal://127.0.0.1`
*/
address: string;
/** 连接时间 */
connectTime: number;
/** 鉴权秘钥 */
secret: string | null;
}
/**
* 适配器账号信息
*/
interface AccountInfo {
/** Bot的uin */
uin: string;
/** Bot的uid */
uid: string;
/** Bot的selfId 一般使用此参数即可 */
selfId: string;
/** 账号名 不存在则是空字符串 */
name: string;
/** Bot的头像链接 */
avatar: string;
/**
* - Bot的子账号键值对
* - 结构约定: key=场景 value=id
* - 此部分由适配器自行实现
* @example
* ```json
* {
* "group": "123456",
* "guild": "123456",
* "friend": "123456",
* "direct": "123456"
* }
* ```
*/
subId: Record<string, string>;
}
/** 按钮结构 */
interface KarinButton {
/** 按钮显示文本 */
text: string;
/** 按钮类型 不建议使用 此为预留字段 */
type?: number;
/**
* - 是否为回调按钮
* @default false
*/
callback?: boolean;
/** 跳转按钮 */
link?: string;
/** 操作相关的数据 */
data?: string;
/** 按钮点击后显示的文字,不传为text */
show?: string;
/**
* 按钮样式
* - 0-灰色线框
* - 1-蓝色线框
* - 2-特殊样式按钮
* - 3-红色文字
* - 4-白色填充
*/
style?: number;
/** 点击按钮后直接自动发送 data */
enter?: boolean;
/** 指令是否带引用回复本消息 */
reply?: boolean;
/** 是否仅群管理员可操作 */
admin?: boolean;
/** 有权限点击的用户UID列表 群聊、私聊 */
list?: string[];
/** 有权限点击的用户UID列表 频道 */
role?: string[];
/** 客户端不支持本 action 的时候,弹出的 toast 文案 */
tips?: string;
}
/** QQ官方按钮消息结构 */
interface QQBotButton {
/** 按钮ID:在一个keyboard消息内设置唯一 */
id: string;
/** 按钮上的文字 */
render_data: {
/** 按钮上的文字 */
label: string;
/** 点击后按钮的上文字 */
visited_label: string;
/**
* 按钮样式
* - 0-灰色线框
* - 1-蓝色线框
* - 2-特殊样式按钮
* - 3-红色文字
* - 4-白色填充
*/
style: number;
};
/** 操作相关的数据 */
action: {
/** 设置 0 跳转按钮:http 或 小程序 客户端识别 scheme,设置 1 回调按钮:回调后台接口, data 传给后台,设置 2 指令按钮:自动在输入框插入 @bot data */
type: 0 | 1 | 2;
/** 权限设置 */
permission: {
/** 0 指定用户可操作,1 仅管理者可操作,2 所有人可操作,3 指定身份组可操作(仅频道可用) */
type: number;
/** 有权限的用户 id 的列表 */
specify_user_ids?: string[];
/** 有权限的身份组 id 的列表(仅频道可用) */
specify_role_ids?: string[];
};
/** 操作相关的数据 */
data: string;
/** 指令按钮可用,指令是否带引用回复本消息,默认 false */
reply?: boolean;
/** 指令按钮可用,点击按钮后直接自动发送 data,默认 false */
enter?: boolean;
/** 本字段仅在指令按钮下有效,设置后后会忽略 action.enter 配置。
设置为 1 时 ,点击按钮自动唤起启手Q选图器,其他值暂无效果。
(仅支持手机端版本 8983+ 的单聊场景,桌面端不支持) */
anchor?: number;
/** 【已弃用】可操作点击的次数,默认不限 */
click_limit?: number;
/** 【已弃用】指令按钮可用,弹出子频道选择器,默认 false */
at_bot_show_channel_list?: boolean;
/** 客户端不支持本action的时候,弹出的toast文案 */
unsupport_tips: string;
};
}
/** QQ按钮消息结构 */
interface QQButtonTextType {
link?: string;
text: string;
show: string;
style: number;
tips: string;
admin?: boolean;
list?: string[];
role?: string[];
enter?: boolean;
reply?: boolean;
callback?: boolean;
}
/**
* @description 消息段类型
* - `text`: 文本
* - `image`: 图片
* - `at`: @
* - `face`: 表情
* - `reply`: 引用回复
* - `video`: 视频
* - `record`: 语音
* - `music`: 音乐
* - `json`: JSON
* - `xml`: XML
* - `markdown`: Markdown
* - `markdownTpl`: Markdown模板
* - `pasmsg`: 被动消息
* - `keyboard`: 多维按钮
* - `button`: 单行按钮
* - `longMsg`: 长消息
* - `raw`: 原始消息
* - `basketball`: 篮球
* - `dice`: 骰子
* - `rps`: 猜拳
* - `bubbleFace`: 气泡表情
* - `weather`: 天气
* - `location`: 位置
* - `share`: 分享
* - `gift`: 礼物
* - `marketFace`: 商城表情
* - `contact`: 联系人
*/
type messageType = 'text' | 'image' | 'at' | 'face' | 'reply' | 'video' | 'record' | 'music' | 'json' | 'xml' | 'markdown' | 'markdownTpl' | 'pasmsg' | 'keyboard' | 'button' | 'longMsg' | 'raw' | 'basketball' | 'dice' | 'rps' | 'bubbleFace' | 'weather' | 'location' | 'share' | 'gift' | 'marketFace' | 'contact' | 'node' | 'file';
interface Element$1 {
/** 消息段类型 */
type: messageType;
}
/** 文本元素 */
interface TextElement extends Element$1 {
type: 'text';
/** 文本内容 */
text: string;
}
/** At元素 */
interface AtElement extends Element$1 {
type: 'at';
/** 目标id atall=all at在线成员=online */
targetId: string;
/** At的名称 */
name?: string;
}
/** 表情元素 */
interface FaceElement extends Element$1 {
type: 'face';
/** 表情ID */
id: number;
/** 是否大表情,默认不是 */
isBig?: boolean;
}
/** 回复元素 */
interface ReplyElement extends Element$1 {
type: 'reply';
/** 回复的消息ID */
messageId: string;
}
/** 图片元素 */
interface ImageElement extends Element$1 {
type: 'image';
/** 图片url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 图片名称 */
name?: string;
/** 图片外显名称 */
summary?: string;
/** 图片MD5 */
md5?: string;
/** 图片宽度 */
width?: number;
/** 图片高度 */
height?: number;
/** 图片子类型 */
subType?: string;
/** 图片大小 */
size?: number;
/**
* show: 展示图片
* flash: 闪照
* original: 原图
*/
fileType?: 'show' | 'flash' | 'original';
}
/** 视频元素 */
interface VideoElement extends Element$1 {
type: 'video';
/** 视频url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 视频名称 */
name?: string;
/** 视频MD5 */
md5?: string;
/** 视频宽度 */
width?: number;
/** 视频高度 */
height?: number;
}
/** 文件元素 */
interface FileElement extends Element$1 {
type: 'file';
/** url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 文件名称 */
name?: string;
/** 文件大小 */
size?: number;
/** 文件hash */
hash?: string;
}
/** 语音元素 */
interface RecordElement extends Element$1 {
type: 'record';
/** 语音文件url、路径或者base64 */
file: string;
/** fid */
fid?: string;
/** 是否为魔法语音 */
magic: boolean;
/** 语音md5 */
md5?: string;
/** 语音名称 */
name?: string;
}
/**
* 支持的音乐平台
* - `custom`: 自定义音乐
* - `qq`: QQ音乐
* - `163`: 网易云音乐
* - `migu`: 咪咕音乐
* - `kugou`: 酷狗音乐
* - `kuwo`: 酷我音乐
*/
type MusicPlatform = 'custom' | 'qq' | '163' | 'migu' | 'kugou' | 'kuwo';
/** 常规音乐 */
interface ReadyMusicElement extends Element$1 {
type: 'music';
/** 音乐平台 */
platform: 'qq' | '163' | 'migu' | 'kugou' | 'kuwo';
/** 歌曲ID */
id: string;
}
/** 自定义音乐元素 */
interface CustomMusicElement extends Element$1 {
type: 'music';
/** 音乐平台 */
platform: 'custom';
/** 跳转链接 */
url: string;
/** 音乐音频链接 */
audio: string;
/** 标题 */
title: string;
/** 歌手 */
author: string;
/** 封面 */
pic: string;
}
/** 音乐元素 */
type MusicElement = CustomMusicElement | ReadyMusicElement;
/** JSON元素 */
interface JsonElement extends Element$1 {
type: 'json';
/** JSON内容 未反序 */
data: string;
}
/** XML元素 */
interface XmlElement extends Element$1 {
type: 'xml';
/** XML内容 未反序 */
data: string;
}
/** Markdown元素 */
interface MarkdownElement extends Element$1 {
type: 'markdown';
/** Markdown内容 */
markdown: string;
config?: {
/** 未知的参数 */
unknown?: number;
time: number;
token: string;
};
}
/** Markdown模板元素 */
interface MarkdownTplElement extends Element$1 {
type: 'markdownTpl';
/** 模板ID */
templateId: string;
/** 模板参数 */
params: Array<{
/** 模板参数键名称 */
key: string;
/** 模板参数值 */
values: Array<string>;
}>;
}
/** 被动事件元素 */
interface PasmsgElement extends Element$1 {
type: 'pasmsg';
/** 事件id来源 */
source: 'msg' | 'event';
/** 被动事件ID */
id: string;
}
/** 多行按钮 */
interface KeyboardElement extends Element$1 {
type: 'keyboard';
/** 按钮行数组 */
rows: KarinButton[][];
}
/** 单行按钮 */
interface ButtonElement extends Element$1 {
type: 'button';
/** 按钮数组 */
data: KarinButton[];
}
/** 长消息元素 */
interface LongMsgElement extends Element$1 {
type: 'longMsg';
/** 消息ID */
id: string;
}
/** 原始元素 */
interface RawElement extends Element$1 {
type: 'raw';
/** 原始数据 */
data: any;
}
/** 篮球元素 */
interface BasketballElement extends Element$1 {
type: 'basketball';
/** 篮球ID */
id: number;
}
/** 骰子元素 */
interface DiceElement extends Element$1 {
type: 'dice';
/** 骰子ID */
id: number;
}
/** 猜拳元素 */
interface RpsElement extends Element$1 {
type: 'rps';
/** 猜拳ID */
id: number;
}
/** 弹射表情元素 */
interface BubbleFaceElement extends Element$1 {
type: 'bubbleFace';
/** 表情ID */
id: number;
/** 表情数量 */
count: number;
}
/** 天气元素 */
interface WeatherElement extends Element$1 {
type: 'weather';
/** 城市名称 */
city: string;
/** 城市代码 */
code: string;
}
/** 位置元素 */
interface LocationElement extends Element$1 {
type: 'location';
/** 纬度 */
lat: number;
/** 经度 */
lon: number;
/** 标题 */
title: string;
/** 地址 */
address: string;
}
/** 分享元素 */
interface ShareElement extends Element$1 {
type: 'share';
/** 分享链接 */
url: string;
/** 分享标题 */
title: string;
/** 分享内容 */
content: string;
/** 分享图片 */
image: string;
}
/** 礼物元素 */
interface GiftElement extends Element$1 {
type: 'gift';
/** QQ 号 */
qq: number;
/** 礼物ID */
id: number;
}
/** 商城表情元素 */
interface MarketFaceElement extends Element$1 {
type: 'marketFace';
/** 表情ID */
id: string;
}
/** 分享名片元素 */
interface ContactElement extends Element$1 {
type: 'contact';
/** 分享类型 */
scene: 'group' | 'friend';
/** 被推荐人的QQ号或者被推荐群的群号 */
peer: string;
}
/**
* 全部消息段元素
*/
type Elements = TextElement | AtElement | FaceElement | ReplyElement | ImageElement | VideoElement | RecordElement | MusicElement | JsonElement | XmlElement | MarkdownElement | MarkdownTplElement | PasmsgElement | KeyboardElement | ButtonElement | LongMsgElement | RawElement | BasketballElement | DiceElement | RpsElement | BubbleFaceElement | WeatherElement | LocationElement | ShareElement | GiftElement | MarketFaceElement | ContactElement | FileElement;
/**
* 发送消息段类型
*/
type SendMessage = string | Elements | Array<string | Elements>;
/**
* 全部消息段元素
*/
type ElementTypes = Elements;
interface Element {
type: 'node';
/** 节点类型 */
subType: 'messageID' | 'fake';
}
/** 合并转发接口外显参数 */
interface ForwardOptions {
/** 小卡片中间的外显 */
news: Array<{
text: string;
}>;
/** qwqa说这个叫不懂 消息列表的外显 */
prompt: string;
/** 小卡片底下文本: 查看1条转发消息 */
summary: string;
/** 小卡片标题 */
source: string;
}
/** 常规合并转发节点 */
interface DirectNodeElement extends Element {
subType: 'messageID';
/** 消息ID */
messageId: string;
/** @deprecated 即将废弃 请使用 `messageId` */
message_id: string;
}
/** 自定义节点 */
interface CustomNodeElement extends Element {
subType: 'fake';
/** 目标ID */
userId: string;
/** 目标名称 */
nickname: string;
/** 转发的元素节点 */
message: Array<SendElement>;
/** 外显设置 */
options?: ForwardOptions;
}
/** 合并转发节点消息段 */
type NodeElement = DirectNodeElement | CustomNodeElement;
/** 合并转发节点消息段 */
type SendElement = NodeElement | Elements;
/** 发送消息后的通用返回值 */
interface SendMsgResults {
/** 消息ID */
messageId: string;
/** 消息发送时间戳 */
time: number;
/** 原始结果 一般是Object、Array */
rawData: any;
/** @deprecated 已废弃 请使用 `messageId` */
message_id: string;
/** @deprecated 已废弃 请使用 `time` */
messageTime: number;
}
/** 基本消息Api返回值结构 */
interface MessageResponse {
/** 消息发送时间 */
time: number;
/** 消息ID */
messageId: string;
/** 消息序列号 */
messageSeq: number;
/** 消息来源目标信息 */
contact: Contact;
/** 消息发送者 请注意role仅在群聊场景下有效 */
sender: GroupSender;
/** 消息元素 */
elements: Array<Elements>;
}
/** 发送转发消息后返回值接口 */
interface SendForwardMessageResponse {
/** 消息ID */
messageId: string;
/** resID 可通过长消息接口进行发送 */
forwardId: string;
}
/** 获取精华消息返回值结构 */
interface GetGroupHighlightsResponse {
/** 群ID */
groupId: string;
/** 消息发送者ID */
senderId: string;
/** 发送者昵称 */
senderName: string;
/** 操作者ID */
operatorId: string;
/** 操作者昵称 */
operatorName: string;
/** 操作时间 */
operationTime: number;
/** 消息发送时间 */
messageTime: number;
/** 消息ID */
messageId: string;
/** 消息序列号 */
messageSeq: number;
/** 被设置的精华消息元素文本 */
jsonElements: string;
}
/**
* 用户信息结构
* @description 此接口仅可保证返回user_id、nick这两个字段
*/
interface UserInfo {
/** 用户ID */
userId: string;
/** 名称 */
nick: string;
/** 用户UID */
uid?: string;
/** 用户UIN */
uin?: string;
/** qid */
qid?: string;
/** 备注 */
remark?: string;
/** 用户等级 */
level?: number;
/** 生日 */
birthday?: string;
/** 登录天数 */
loginDay?: number;
/** 点赞数 */
likeCount?: number;
/** 学校是否已核实 */
isSchoolVerified?: boolean;
/** 年龄 */
age?: number;
/** 性别 */
sex?: Sex$1;
/** 好莱坞/腾讯视频会员 */
hollywoodVip?: boolean;
/** QQ会员 */
qqVip?: boolean;
/** QQ超级会员 */
qqSvip?: boolean;
/** 大会员 */
bigVip?: boolean;
/** 是否已经赞过 */
isLike?: boolean;
[key: string]: any;
}
/**
* 群信息结构
* @description 此接口仅可保证返回group_id这个字段
*/
interface GroupInfo {
/** 群ID */
groupId: string;
/** 群名称 */
groupName?: string;
/** 群主ID */
owner?: string;
/** 群备注 */
groupRemark?: string;
/** 群管理员ID列表 */
admins: {
userId: string;
name: string;
role: Role;
}[];
/** 最大成员数 */
maxMemberCount?: number;
/** 当前成员数 */
memberCount?: number;
/** 群描述 */
groupDesc?: string;
/** 群头像 */
avatar?: string;
}
/**
* 群成员信息
* @description 此接口仅可保证返回user_id这个字段
*/
interface GroupMemberInfo {
/** 用户ID */
userId: string;
/** 用户角色 */
role: Role;
/** 用户昵称 */
nick?: string;
/** 年龄 */
age?: number;
/** 群内头衔 */
uniqueTitle?: string;
/** 群名片 */
card?: string;
/** 加群时间 */
joinTime?: number;
/** 最后活跃时间 */
lastActiveTime?: number;
/** 用户等级 */
level?: number;
/** 禁言时间 */
shutUpTime?: number;
/** 距离 */
distance?: number;
/** 荣誉列表 */
honors?: Array<number>;
/** 是否好友 */
unfriendly?: boolean;
/** 性别 */
sex?: Sex$1;
/** 构建成发送者 方便使用 */
get sender(): GroupSender;
}
/**
* 群荣誉信息
* @description 此接口仅可在QQ协议端中使用
*/
interface QQGroupHonorInfo {
/** 荣誉成员ID */
userId: string;
/** 荣誉成员昵称 */
nick: string;
/** 荣誉名称 */
honorName: string;
/** 荣誉图标url */
avatar: string;
/** 荣誉id */
id: number;
/** 荣誉描述 */
description: string;
}
/**
* 群文件信息
* @description 此接口仅可在QQ协议端中使用
*/
interface QQGroupFileInfo {
/** 文件ID */
fid: string;
/** 文件名 */
name: string;
/** 文件大小 */
size: number;
/** 上传时间 */
uploadTime: number;
/** 过期时间 */
expireTime: number;
/** 修改时间 */
modifyTime: number;
/** 下载次数 */
downloadCount: number;
/** 上传者ID */
uploadId: string;
/** 上传者昵称 */
uploadName: string;
/** SHA1 */
sha1: string;
/** SHA3 */
sha3: string;
/** MD5 */
md5: string;
}
/**
* 群文件夹信息
* @description 此接口仅可在QQ协议端中使用
*/
interface QQGroupFolderInfo {
/** 文件夹ID */
id: string;
/** 文件夹名 */
name: string;
/** 文件数量 */
fileCount: number;
/** 创建时间 */
createTime: number;
/** 创建者ID */
creatorId: string;
/** 创建者昵称 */
creatorName: string;
}
/** 获取at全体成员剩余次数返回值结构 */
interface GetAtAllCountResponse {
/** 是否允许at全体成员 */
accessAtAll: boolean;
/** 全群剩余次数 */
groupRemainCount: number;
/** 个人剩余次数 */
userRremainCount: number;
}
/** 获取群被禁言用户列表返回值结构 */
interface GetGroupMuteListResponse {
/** 用户ID */
userId: string;
/** 禁言时间 */
muteTime: number;
}
/** 获取群文件夹下文件列表返回值结构 */
interface GetGroupFileListResponse {
/** 文件列表 */
files: QQGroupFileInfo[];
/** 文件夹列表 */
folders: QQGroupFolderInfo[];
}
/** 获取群文件系统信息返回值结构 */
interface GetGroupFileSystemInfoResponse {
/** 文件数量 */
fileCount: number;
/** 文件上限 */
limitCount: number;
/** 已使用空间 */
usedSpace: number;
/** 空间上限 */
totalSpace: number;
}
/** 创建群文件夹返回值结构 */
interface CreateGroupFolderResponse {
/** 文件夹ID */
id: string;
/** 已使用空间 */
usedSpace: string;
}
/** 基础选项,不包含 url 和 base64 */
interface DownloadFileOptionsBase {
/** 下载文件的根目录,需确保 Kritor 有该目录访问权限,可选 */
rootPath?: string;
/** 保存的文件名称,默认为文件 MD5,可选 */
fileName?: string;
/** 下载文件的线程数,默认为 3,可选 */
threadCnt?: number;
/** 下载文件的请求头,可选 */
headers?: string;
}
/** 包含 url 的选项,base64 必须为 never */
interface DownloadFileOptionsWithUrl extends DownloadFileOptionsBase {
/** 下载文件的 URL,二选一 */
url: string;
/** 下载文件的 base64,不允许 */
base64?: never;
}
/** 包含 base64 的选项,url 必须为 never */
interface DownloadFileOptionsWithBase64 extends DownloadFileOptionsBase {
/** 下载文件的 base64,二选一 */
base64: string;
/** 下载文件的 URL,不允许 */
url?: never;
}
/** 让协议端下载文件到协议端本地请求参数结构 */
type DownloadFileOptions = DownloadFileOptionsWithUrl | DownloadFileOptionsWithBase64;
/** 让协议端下载文件到协议端本地返回值结构 */
interface DownloadFileResponse {
/** 下载后文件的绝对路径 */
filePath: string;
}
/** 获取 rkey 返回值结构 */
interface GetRkeyResponse {
/** 可使用的场景 */
type: 'private' | 'group';
/** rkey */
rkey: string;
/** 创建时间 */
created_at: number;
/** 过期时间 */
ttl: number;
}
/** 获取群 Ai 语音可用声色列表返回值结构 */
interface GetAiCharactersResponse {
/** 声色ID */
character_id: string;
/** 声色名称 */
character_name: string;
/** 声色预览URL */
preview_url: string;
}
/** 适配器类型 */
interface AdapterType<T = any> {
/** 原生方法 */
super: T;
/** 原生方法 */
raw: T;
/**
* onebot专属方法
* @param action 请求的方法
* @param params 请求的参数
* @param time 超时时间 默认为120s
*/
sendApi?: (...args: any[]) => Promise<any>;
/** 适配器信息 */
adapter: AdapterInfo;
/** 账号信息 */
account: AccountInfo;
/** 获取Bot的id */
get selfId(): string;
/** 获取Bot的name */
get selfName(): string;
/**
* 获取Bot的subId
* @param key 子ID的key
*/
selfSubId(key: string): string;
/**
* 打印当前Bot的专属日志
* @param level 日志等级
* @param args 日志内容
*/
logger(level: LoggerLevel, ...args: any[]): void;
/**
* 发送消息
* @param contact 目标信息
* @param elements 消息元素
* @param retryCount 重试次数 默认为0
*/
sendMsg(contact: Contact, elements: Array<SendElement>, retryCount?: number): Promise<SendMsgResults>;
/**
* 发送长消息
* @param contact 目标信息
* @param resId 资源ID
*/
sendLongMsg(contact: Contact, resId: string): Promise<SendMsgResults>;
/**
* 发送合并转发消息
* @param contact 目标信息
* @param elements 消息元素
* @param options 首层小卡片外显参数
*/
sendForwardMsg(contact: Contact, elements: Array<NodeElement>, options?: ForwardOptions): Promise<{
messageId: string;
}>;
/**
* 撤回消息
* @param contact 目标信息
* @param messageId 消息ID
*/
recallMsg(contact: Contact, messageId: string): Promise<void>;
/**
* 获取头像url
* @param userId 用户ID
* @param size 头像大小,默认需要为`0`,请开发者注意
* @returns 头像的url地址
*/
getAvatarUrl(userId: string, size?: 0 | 40 | 100 | 140): Promise<string>;
/**
* 获取群头像url
* @param groupId 群号
* @param size 头像大小,默认`0`
* @param history 历史头像记录,默认`0`,若要获取历史群头像则填写1,2,3...
* @returns 头像的url地址
*/
getGroupAvatarUrl(groupId: string, size?: 0 | 40 | 100 | 140, history?: number): Promise<string>;
/**
* 获取消息
* @param contact 目标信息
* @param messageId 消息ID
* @returns MessageResponse对象
*/
getMsg(messageId: string): Promise<MessageResponse>;
/**
* 获取消息
* @param contact 目标信息
* @param messageId 消息ID
* @returns MessageResponse对象
*/
getMsg(contact: Contact, messageId: string): Promise<MessageResponse>;
/**
* 获取msgId获取历史消息
* @param contact 目标信息
* @param startMsgSeq 起始消息序列号
* @param count 获取消息数量 默认为1
* @returns 包含历史消息的数组
*/
getHistoryMsg(contact: Contact, startMsgSeq: number, count: number): Promise<Array<MessageResponse>>;
/**
* 获取msgId获取历史消息
* @param contact 目标信息
* @param startMsgId 起始消息ID
* @param count 获取消息数量 默认为1
* @returns 包含历史消息的数组
*/
getHistoryMsg(contact: Contact, startMsgId: string, count: number): Promise<Array<MessageResponse>>;
/**
* 获取合并转发消息
* @param resId 资源ID
* @returns 包含MessageResponse对象的数组
*/
getForwardMsg(resId: string): Promise<Array<MessageResponse>>;
/**
* 获取精华消息
* @param groupId 群ID
* @param page 页码
* @param pageSize 每页数量
* @returns EssenceMessageBody对象
*/
getGroupHighlights(groupId: string, page: number, pageSize: number): Promise<Array<GetGroupHighlightsResponse>>;
/**
* 构造一个资源ID 即上传合并转发消息后不进行发送
* @param contact 目标信息
* @param elements 转发消息元素
* @description 此接口并不是所有协议端都支持的,因此在使用时请注意
*/
createResId(contact: Contact, elements: Array<NodeElement>): Promise<string>;
/**
* 设置、取消群精华消息
* @param groupId 群ID
* @param messageId 群消息ID
* @param create true为添加精华消息,false为删除精华消息 默认为true
*/
setGroupHighlights(groupId: string, messageId: string, create: boolean): Promise<void>;
/**
* 发送好友赞
* @param targetId 目标ID
* @param count 赞的次数,默认为10
*/
sendLike(targetId: string, count: number): Promise<void>;
/**
* 群踢人
* @param groupId 群ID
* @param targetId 被踢出目标的ID 任选其一
* @param rejectAddRequest 是否拒绝再次申请,默认为false
* @param kickReason 踢出原因,可选
*/
groupKickMember(groupId: string, targetId: string, rejectAddRequest?: boolean, kickReason?: string): Promise<void>;
/**
* 禁言群成员
* @param groupId 群ID
* @param targetId 被禁言目标的ID 任选其一
* @param duration 禁言时长 单位:秒
*/
setGroupMute(groupId: string, targetId: string, duration: number): Promise<void>;
/**
* 群全员禁言
* @param groupId 群ID
* @param isBan 是否开启全员禁言
*/
setGroupAllMute(groupId: string, isBan: boolean): Promise<void>;
/**
* 设置群管理员
* @param groupId 群ID
* @param targetId 目标用户的ID
* @param isAdmin 是否设置为管理员
*/
setGroupAdmin(groupId: string, targetId: string, isAdmin: boolean): Promise<void>;
/**
* 设置群名片
* @param groupId 群ID
* @param targetId 目标用户的ID
* @param card 新的群名片
*/
setGroupMemberCard(groupId: string, targetId: string, card: string): Promise<void>;
/**
* 设置群名
* @param groupId 群ID
* @param groupName 新的群名
*/
setGroupName(groupId: string, groupName: string): Promise<void>;
/**
* 退出群组
* @param groupId 群ID
* @param isDismiss 如果Bot是群主,是否解散群
*/
setGroupQuit(groupId: string, isDismiss: boolean): Promise<void>;
/**
* 设置群专属头衔 仅群主可用
* @param groupId 群ID
* @param targetId 目标用户的ID
* @param title 新的专属头衔
*/
setGroupMemberTitle(groupId: string, targetId: string, title: string): Promise<void>;
/**
* 获取陌生人信息
* @param targetId 用户ID 任选其一
* @returns 陌生人信息数组
*/
getStrangerInfo(targetId: string): Promise<UserInfo>;
/**
* 获取好友列表
* @param refresh 是否刷新好友列表
* @returns 好友列表数组
*/
getFriendList(refresh?: boolean): Promise<Array<UserInfo>>;
/**
* 获取群信息
* @param groupId 群ID
* @param noCache 是否刷新缓存
* @returns 群信息
*/
getGroupInfo(groupId: string, noCache?: boolean): Promise<GroupInfo>;
/**
* 获取群列表
* @param refresh 是否刷新好友列表
* @returns 群列表数组
*/
getGroupList(refresh?: boolean): Promise<Array<GroupInfo>>;
/**
* 获取群成员信息
* 此接口在非QQ平台上很难获取到标准信息,因此返回的数据可能会有所不同
* @param groupId 群ID
* @param targetId 目标用户的ID
* @param refresh 是否刷新缓存
* @returns 群成员信息
*/
getGroupMemberInfo(groupId: string, targetId: string, refresh?: boolean): Promise<GroupMemberInfo>;
/**
* 获取群成员列表
* @param groupId 群ID
* @param refresh 是否刷新缓存
* @returns 群成员列表数组
*/
getGroupMemberList(groupId: string, refresh?: boolean): Promise<Array<GroupMemberInfo>>;
/**
* 获取群荣誉信息
* @param groupId 群ID
* @returns 群荣誉信息数组
*/
getGroupHonor(groupId: string): Promise<Array<QQGroupHonorInfo>>;
/**
* 设置好友请求结果
* @param requestId 请求事件ID
* @param isApprove 是否同意
* @param remark 好友备注 同意时有效
* @returns 设置结果
*/
setFriendApplyResult(requestId: string, isApprove: boolean, remark?: string): Promise<void>;
/**
* 设置申请加入群请求结果
* @param requestId 请求事件ID
* @param isApprove 是否同意
* @param denyReason 拒绝理由 拒绝时有效
*/
setGroupApplyResult(requestId: string, isApprove: boolean, denyReason?: string): Promise<void>;
/**
* 设置邀请加入群请求结果
* @param requestId 请求事件ID
* @param isApprove 是否同意
*/
setInvitedJoinGroupResult(requestId: string, isApprove: boolean): Promise<void>;
/**
* 设置消息表情回应
* @param contact 目标信息
* @param messageId 消息ID
* @param faceId 表情ID
*/
setMsgReaction(contact: Contact, messageId: string, faceId: number | string, isSet: boolean): Promise<void>;
/**
* 上传群文件、私聊文件
* @param contact 目标信息
* @param file 本地文件绝对路径
* @param name 文件名称 必须提供
* @param folder 父目录ID 不提供则上传到根目录 仅在群聊时有效
*/
uploadFile(contact: Contact, file: string, name: string, folder?: string): Promise<void>;
/**
* 让协议端下载文件到协议端本地
* @param options 下载文件的选项
* @returns 下载文件的绝对路径和文件MD5
*/
downloadFile(options?: DownloadFileOptions): Promise<DownloadFileResponse>;
/**
* 获取文件url
* @param contact 目标信息
* @param fileId 文件id
* @returns 文件url
*/
getFileUrl(contact: Contact, fileId: string): Promise<string>;
/**
* 创建群文件夹
* @param groupId 群号
* @param name 文件夹名
* @returns 返回文件夹id和已使用空间
*/
createGroupFolder(groupId: string, name: string): Promise<CreateGroupFolderResponse>;
/**
* 重命名群文件的文件夹
* @param groupId 群号
* @param folderId 文件夹id
* @param name 文件夹名
* @returns 无返回值
*/
renameGroupFolder(groupId: string, folderId: string, name: string): Promise<boolean>;
/**
* 删除群文件的文件夹
* @param groupId 群号
* @param folderId 文件夹id
* @returns 无返回值
*/
delGroupFolder(groupId: string, folderId: string): Promise<boolean>;
/**
* 上传群文件
* @description 此接口仅可以在Bot和协议端在同一台设备上时使用
* @param groupId 群号
* @param file 文件绝对路径
* @param name 文件名
* @returns 无返回值
*/
uploadGroupFile(groupId: string, file: string, name?: string): Promise<boolean>;
/**
* 删除群文件
* @param groupId 群号
* @param fileId 文件id
* @param busId 文件类型ID
* @returns 无返回值
*/
delGroupFile(groupId: string, fileId: string, busId: number): Promise<boolean>;
/**
* 获取群文件系统信息
* @param groupId 群号
* @returns 返回文件数量、文件数量上限、已使用空间和空间上限
*/
getGroupFileSystemInfo(groupId: string): Promise<GetGroupFileSystemInfoResponse>;
/**
* 获取群文件夹下的文件列表
* @param groupId 群号
* @param folderId 文件夹id,空则为根目录
* @returns 返回文件和文件夹的列表
*/
getGroupFileList(groupId: string, folderId?: string): Promise<GetGroupFileListResponse>;
/**
* 设置群备注
* @param groupId 群号
* @param remark 新的备注
*/
setGroupRemark(groupId: string, remark: string): Promise<boolean>;
/**
* 获取陌生群信息
* @param groupId 群号
*/
getNotJoinedGroupInfo?(groupId: string): Promise<GroupInfo>;
/**
* 获取艾特全体成员剩余次数
* @param groupId 群号
* @returns 返回是否允许at全体成员和全群剩余次数、个人剩余次数
*/
getAtAllCount(groupId: string): Promise<GetAtAllCountResponse>;
/**
* 获取群被禁言用户列表
* @param groupId
* @returns 返回禁言用户列表
*/
getGroupMuteList(groupId: string): Promise<Array<GetGroupMuteListResponse>>;
/**
* 戳一戳用户 支持群聊和私聊
* @param contact 目标信息
* @param targetId 被戳用户 ID
* @param count 戳一戳次数 默认为1
*/
pokeUser(contact: Contact, targetId: string, count?: number): Promise<boolean>;
/**
* 获取 Cookies
* @param domain The domain to get cookies from
*/
getCookies(domain: string): Promise<{
cookie: string;
}>;
/**
* 获取 QQ 相关接口凭证
* @param domain The domain to get credentials from
*/
getCredentials(domain: string): Promise<{
cookies: string;
csrf_token: number;
}>;
/**
* 获取 CSRF Token
*/
getCSRFToken(): Promise<{
token: number;
}>;
/**
* 设置头像
* @param file base64:// file:// http(s)://
* @returns 是否设置成功
*/
setAvatar(file: string): Promise<void>;
/**
* 获取群 Ai 语音可用声色列表
* @returns 声色列表
*/
getAiCharacters(): Promise<Array<GetAiCharactersResponse>>;
/**
* 发送群 Ai 语音声色
* @param group_id 群号
* @param character_id 声色ID
* @param text 转换的文本
* @returns 是否设置成功
*/
sendAiCharacter(group_id: string, character: string, text: string): Promise<{
messageId: string;
}>;
/**
* 获取 rkey
* @returns rkey
*/
getRkey(): Promise<Array<GetRkeyResponse>>;
}
/** 适配器类型 */
type Adapter = AdapterType;
/** 快速回复源函数 适配器实现 */
type SrcReply = (
/** 发送的消息 */
elements: Elements[]) => Promise<SendMsgResults> | SendMsgResults;
/** 快速回复函数 */
type Reply = (
/** 发送的消息 */
elements: SendMessage,
/** 发送消息选项 */
options?: {
/** 是否@发送者 */
at?: boolean;
/** 是否引用回复发送者 */
reply?: boolean;
/** 撤回消息时间 默认为0不撤回 */
recallMsg?: number;
/** 重试次数 默认为0 */
retryCount?: number;
}) => Promise<SendMsgResults> | SendMsgResults;
/** 通知事件: 收到点赞 */
interface ReceiveLikeType {
/** 点赞者id */
operatorId: string;
/** 点赞者数量 */
count: number;
}
/** 通知事件: 新增好友 */
interface FriendIncreaseType {
/** 新好友id */
targetId: string;
}
/** 通知事件: 好友减少 */
interface FriendDecreaseType {
/** 减少的好友id */
targetId: string;
}
/** 通知事件: 私聊戳一戳 */
interface PrivatePokeType {
/** 操作者id */
operatorId: string;
/** 被戳者id */
targetId: string;
/** 操作名称,如“戳了戳” */
action: string;
/** 后缀,未设置则未空字符串 */
suffix: string;
/** 操作图标url */
actionImage: string;
}
/** 通知事件: 私聊撤回消息 */
interface PrivateRecallType {
/** 操作者id */
operatorId: string;
/** 撤回的消息id */
messageId: string;
/** 操作提示,如“撤回了一条消息” 一般此项为空字符串 */
tips: string;
}
/**
* 通知事件: 私聊文件上传
* 文件信息最少需要提供一个url
*/
interface PrivateFileUploadedType {
/** 操作者id */
operatorId: string;
/** 文件ID 此项没有则为空字符串 */
fid: string;
/** 文件子ID 此项没有则为0 */
subId: number;
/** 文件名 此项没有则为空字符串 */
name: string;
/** 文件大小 此项没有则为0 */
size: number;
/** 过期时间 此项没有则为0 */
expireTime: number;
/** 文件URL */
url: () => Promise<string>;
}
/** 通知事件: 群聊戳一戳 */
interface GroupPokeType {
/** 操作者id */
operatorId: string;
/** 操作名称,如“戳了戳” */
action: string;
/** 后缀,未设置则未空字符串 */
suffix: string;
/** 操作图标url */
actionImage: string;
/** 被戳目标id */
targetId: string;
}
/**
* 通知事件: 群聊撤回
* 撤回自己消息时,operator和target为自己
* 撤回别人消息时,operator为操作者,target为被撤回者
*/
interface GroupRecallType {
/** 操作者id */
operatorId: string;
/** 目标id 撤回自己消息为自己 否则是被撤回者 */
targetId: string;
/** 撤回的消息id */
messageId: string;
/** 操作提示,如“撤回了一条消息” 一般此项为空字符串 */
tip: string;
}
/**
* 通知事件: 群文件上传
* 文件信息最少需要提供一个url
*/
interface GroupFileUploadedType {
/** 文件ID */
fid: string;
/** 文件子ID */
subId: number;
/** 文件名 */
name: string;
/** 文件大小 */
size: number;
/** 过期时间 */
expireTime?: number;
/** 文件URL */
url: () => Promise<string>;
}
/** 通知事件: 群名片变动 */
interface GroupCardChangedType {
/** 操作者id */
operatorId: string;
/** 目标id */
targetId: string;
/** 新名片 */
newCard: string;
}
/** 通知事件: 群成员头衔变动 */
interface GroupMemberUniqueTitleChangedType {
/** 目标id */
targetId: string;
/** 新头衔 */
title: string;
}
/** 通知事件: 群精华消息变动 */
interface GroupHlightsChangedType {
/** 操作者id */
operatorId: string;
/** 发送者id */
senderId: string;
/** 被操作的消息id */
messageId: string;
/** 设置、取消精华 */
isSet: boolean;
}
/** 通知事件: 群成员增加 */
interface GroupMemberIncreaseType {
/** 操作者id */
operatorId: string;
/** 加入者id */
targetId: string;
/** 加入方式 APPROVE:管理员批准 INVITE:管理员邀请 */
type: 'invite' | 'approve';
}
/** 通知事件: 群成员减少 */
interface GroupMemberDecreaseType {
/** 操作者id */
operatorId: string;
/** 目标id */
targetId: string;
/** 减少方式 leave:主动退群 kick:成员被踢 kickBot:机器人自身被踢 */
type: 'leave' | 'kick' | 'kickBot';
}
/** 通知事件: 群管理员变动 */
interface GroupAdminChangedType {
/** 目标id */
targetId: string;
/** 设置、取消管理员 */
isAdmin: boolean;
}
/** 通知事件: 群打卡 */
interface GroupSignInType {
/** 目标id */
targetId: string;
/** 操作名称,如“打卡了” */
action: string;
/** 打卡图标url */
rankImage: string;
}
/** 通知事件: 群成员被禁言 */
interface GroupMemberBanType {
/** 操作者id */
operatorId: string;
/** 目标id */
targetId: string;
/** 禁言时长,单位秒 */
duration: number;
/** 是否为禁言 */
isBan: boolean;
}
/** 通知事件: 群全员禁言 */
interface GroupWholeBanType {
/** 操作者id */
operatorId: string;
/** 是否开启全体禁言 */
isBan: boolean;
}
/** 通知事件: 群表情动态 */
interface GroupMessageReactionType {
/** 消息ID */
messageId: string;
/** 表情ID 参考: https://bot.q.qq.com/wiki/develop/api-v2/openapi/emoji/model.html#EmojiType */
faceId: number;
/** 数量 */
count: number;
/** 添加、取消回应 */
isSet: boolean;
}
/** 通知事件: 群聊运气王 */
interface GroupLuckKingType {
/** 红包发送者id */
userId: string;
/** 运气王id */
targetId: string;
}
/** 通知事件: 群聊荣誉变更事件 */
interface GroupHonorChangedType {
/** 荣誉类型,分别表示龙王、群聊之火、快乐源泉 */
honorType: 'talkative' | 'performer' | 'emotion';
}
/** 请求事件: 好友申请 */
interface PrivateApplyType {
/** 申请者id */
applierId: string;
/** 验证信息 */
message: string;
/** 请求 flag,在调用处理请求的 API 时需要传入 */
flag: string;
}
/** 请求事件: 新成员申请加入群聊申请 */
interface GroupApply {
/** 申请者id */
applierId: string;
/** 邀请者id */
inviterId: string;
/** 申请理由 */
reason: string;
/** 请求 flag,在调用处理请求的 API 时需要传入 */
flag: string;
/** 群id */
groupId: string;
}
/** 请求事件: 邀请Bot加入群聊 */
interface GroupInvite {
/** 邀请者id */
inviterId: string;
/** 请求 flag,在调用处理请求的 API 时需要传入 */
flag: string;
}
/**
* 事件父类型
* - `message`: 消息事件
* - `notice`: 通知事件
* - `request`: 请求事件
*/
type EventParent = 'message' | 'notice' | 'request';
/**
* `消息`事件子类型
* - `group`: 群消息
* - `friend`: 好友消息
* - `guild`: 频道消息
* - `direct`: 频道私信
* - `groupTemp`: 群临时会话
*/
type MessageEventSub = 'group' | 'friend' | 'guild' | 'direct' | 'groupTemp';
/**
* `通知`事件子类型
* - `receiveLike`: 收到点赞
* - `friendPoke`: 好友戳一戳
* - `friendRecall`: 好友撤回消息
* - `privateFileUploaded`: 好友发送文件
* - `friendIncrease`: 好友增加
* - `friendDecrease`: 好友减少
*
* - `groupPoke`: 群聊戳一戳
* - `groupCardChanged`: 群聊名片变动
* - `groupMemberTitleUpdate`: 群聊成员头衔变动
* - `groupHighlightsChange`: 群聊精华消息变动
* - `groupRecall`: 群聊撤回消息
* - `groupMemberAdd`: 群聊成员增加
* - `groupMemberRemove`: 群聊成员减少
* - `groupAdminChanged`: 群聊管理员变动
* - `groupMemberBan`: 群聊成员禁言
* - `groupSignIn`: 群聊签到
* - `groupWholeBan`: 群聊全员禁言
* - `groupFileUploaded`: 群聊发送文件
* - `groupMessageReaction`: 群聊消息表情动态回应
* - `groupLuckyKing`: 群聊运气王事件
* - `groupHonorChange`: 群聊荣誉变更事件
*/
type NoticeEventSub =
/** 收到点赞 */
'receiveLike'
/** 好友戳一戳 */
| 'friendPoke'
/** 好友撤回消息 */
| 'friendRecall'
/** 好友发送文件 */
| 'privateFileUploaded'
/** 好友增加 */
| 'friendIncrease'
/** 好友减少 */
| 'friendDecrease'
/** 群聊戳一戳 */
| 'groupPoke'
/** 群聊名片变动 */
| 'groupCardChanged'
/** 群聊成员头衔变动 */
| 'groupMemberTitleUpdate'
/** 群聊精华消息变动 */
| 'groupHighlightsChange'
/** 群聊撤回消息 */
| 'groupRecall'
/** 群聊成员增加 */
| 'groupMemberAdd'
/** 群聊成员减少 */
| 'groupMemberRemove'
/** 群聊管理员变动 */
| 'groupAdminChanged'
/** 群聊成员禁言 */
| 'groupMemberBan'
/** 群聊签到 */
| 'groupSignIn'
/** 群聊全员禁言 */
| 'groupWholeBan'
/** 群聊发送文件 */
| 'groupFileUploaded'
/** 群聊消息表情动态回应 */
| 'groupMessageReaction'
/** 群聊运气王事件 */
| 'groupLuckyKing'
/** 群聊荣誉变更事件 */
| 'groupHonorChange';
/**
* `请求`事件子类型
* - `friendApply`: 收到添加Bot为好友请求
* - `groupApply`: 收到用户申请加入群聊请求
* - `groupInvite`: 收到邀请Bot加入群聊请求
*/
type RequestEventSub = 'friendApply' | 'groupApply' | 'groupInvite';
/**
* 事件父类型与子类型的映射
*/
interface EventToSubEvent {
message: MessageEventSub;
notice: NoticeEventSub;
request: RequestEventSub;
}
/**
* 事件基类定义
* @description 所有的事件都拥有这些基本属性
*/
interface BaseEventType<T extends EventParent> {
/** 机器人ID */
selfId: string;
/** 用户ID */
userId: string;
/** 事件类型 */
event: T;
/** 事件子类型 */
subEvent: EventToSubEvent[T];
/** 事件ID */
eventId: string;
/** 原始事件 */
rawEvent: any;
/** 事件触发时间戳 */
time: number;
/** 事件联系人信息 */
contact: Contact;
/** 事件发送者信息 */
sender: Sender;
/** 快速回复源函数 适配器实现 */
srcReply: SrcReply;
/** bot自身实例 所有标准Api都通过这里调用 */
bot: AdapterType;
}
/** 事件基类参数 */
type BaseEventOptions<T extends EventParent> = Omit<BaseEventType<T>, 'userId' | 'selfId'>;
/** 创建消息事件类所需参数类型 */
type MessageOptions = Omit<BaseEventOptions<'message'>, 'event'> & {
/** 消息ID */
messageId: string;
/** 消息序列号 */
messageSeq: number;
/** 消息体元素 */
elements: Elements[];
};
/** 创建好友消息事件所需参数类型 */
type FriendMessageOptions = Omit<MessageOptions, 'subEvent' | 'contact' | 'sender'> & {
/** 事件来源好友信息 */
contact: Contact<'friend'>;
/** 好友发送者信息 */
sender: Sender<'friend'>;
};
/** 创建群消息事件所需参数类型 */
type GroupMessageOptions = Omit<MessageOptions, 'subEvent' | 'contact' | 'sender'> & {
/** 事件来源群信息 */
contact: Contact<'group'>;
/** 群发送者信息 */
sender: Sender<'group'>;
};
/** 创建频道消息事件所需参数类型 */
type GuildMessageOptions = Omit<MessageOptions, 'subEvent' | 'contact' | 'sender'> & {
/** 事件来源频道信息 */
contact: Contact<'guild'>;
/** 频道发送者信息 */
sender: Sender<'guild'>;
};
/** 创建频道私信消息事件所需参数类型 */
type DirectMessageOptions = Omit<MessageOptions, 'subEvent' | 'contact' | 'sender'> & {
/** 事件来源频道私信信息 */
contact: Contact<'direct'>;
/** 频道私信发送者信息 */
sender: Sender<'direct'>;
/** 来源频道ID */
srcGuildId: string;
};
/** 创建群临时会话消息事件所需参数类型 */
type GroupTempMessageOptions = Omit<MessageOptions, 'subEvent' | 'contact' | 'sender'> & {
/** 事件来源群临时会话信息 */
contact: Contact<'groupTemp'>;
/** 群临时会话发送者信息 */
sender: Sender<'groupTemp'>;
};
/** 通知事件: 创建通知事件类所需参数类型 */
type NoticeOptions = Omit<BaseEventOptions<'notice'>, 'event' | 'sender'> & {
sender: Sender;
};
/** 创建收到点赞通知事件 */
type ReceiveLikeOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'friend'>;
/** 事件创建者信息 */
sender: Sender<'friend'>;
/** 请求内容 */
content: ReceiveLikeType;
};
/** 创建好友增加通知事件 */
type FriendIncreaseOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'friend'>;
/** 事件创建者信息 */
sender: Sender<'friend'>;
/** 请求内容 */
content: FriendIncreaseType;
};
/** 创建好友减少通知事件 */
type FriendDecreaseOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'friend'>;
/** 事件创建者信息 */
sender: Sender<'friend'>;
/** 请求内容 */
content: FriendDecreaseType;
};
/** 创建私聊戳一戳通知事件 */
type PrivatePokeOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'friend'>;
/** 事件创建者信息 */
sender: Sender<'friend'>;
/** 请求内容 */
content: PrivatePokeType;
};
/** 创建私聊撤回消息通知事件 */
type PrivateRecallOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'friend'>;
/** 事件创建者信息 */
sender: Sender<'friend'>;
/** 请求内容 */
content: PrivateRecallType;
};
/** 创建私聊文件上传通知事件 */
type PrivateFileUploadedOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'friend'>;
/** 事件创建者信息 */
sender: Sender<'friend'>;
/** 请求内容 */
content: PrivateFileUploadedType;
};
/** 创建群聊戳一戳通知事件 */
type GroupPokeOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupPokeType;
};
/** 创建群聊撤回通知事件 */
type GroupRecallOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupRecallType;
};
/** 创建群聊文件上传通知事件 */
type GroupFileUploadedOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupFileUploadedType;
};
/** 创建群名片变动通知事件 */
type GroupCardChangedOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupCardChangedType;
};
/** 创建群成员头衔变动通知事件 */
type GroupMemberUniqueTitleChangedOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupMemberUniqueTitleChangedType;
};
/** 创建群精华消息变动通知事件 */
type GroupHlightsChangedOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupHlightsChangedType;
};
/** 创建群成员增加通知事件 */
type GroupMemberIncreaseOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'group'>;
/** 事件创建者信息 */
sender: Sender<'group'>;
/** 请求内容 */
content: GroupMemberIncreaseType;
};
/** 创建群成员减少通知事件 */
type GroupMemberDecreaseOptions = Omit<NoticeOptions, 'subEvent'> & {
/** 事件来源信息 */
contact: Contact<'