UNPKG

node-karin

Version:

Lightweight, efficient, concise, and stable robot framework.

2,116 lines (2,103 loc) 561 kB
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<'