ntqq
Version:
QQ protocol for NodeJS!
257 lines (256 loc) • 8.24 kB
TypeScript
import * as pb from '../core/protobuf';
import { MusicPlatform } from "../message/music";
export interface MessageElemMap {
text: {
text: string;
};
at: {
/** 在频道消息中该值为0 */
qq: number | 'all';
/** 频道中的`tiny_id` */
id?: string | 'all';
/** AT后跟的字符串,接收消息时有效 */
text?: string;
};
face: {
/** face为0~348,sface不明 */
id: number;
qlottie?: string;
text?: string;
};
sface: {
id: number;
qlottie?: string;
text?: string;
};
bface: {
file: string;
text?: string;
};
image: {
/**
* @type {string} 本地图片文件路径,例如`"/tmp/1.jpg"`
* @type {Buffer} 图片`Buffer`
* @type {Readable} 可读的图片数据流
*/
file: string | Buffer | import("stream").Readable;
/** 网络图片是否使用缓存 */
cache?: boolean;
/** 流的超时时间,默认60(秒) */
timeout?: number;
headers?: import("http").OutgoingHttpHeaders;
/** 图片url地址,接收时有效 */
url?: string;
/** 是否作为表情发送 */
asface?: boolean;
/** 是否显示下载原图按钮 */
origin?: boolean;
/** 图片概要 */
summary?: string;
/** 图片fid,接收时有效(QQNT) */
fid?: string;
/** 图片md5,接收时有效 */
md5?: string;
/** 图片高度,接收时有效 */
height?: number;
/** 图片宽度,接收时有效 */
width?: number;
/** 图片大小,接收时有效 */
size?: number;
};
flash: {
/**
* @type {string} 本地图片文件路径,例如`"/tmp/1.jpg"`
* @type {Buffer} 图片`Buffer`
* @type {Readable} 可读的图片数据流
*/
file: string | Buffer | import("stream").Readable;
/** 网络图片是否使用缓存 */
cache?: boolean;
/** 流的超时时间,默认60(秒) */
timeout?: number;
headers?: import("http").OutgoingHttpHeaders;
/** 图片url地址,接收时有效 */
url?: string;
/** 是否作为表情发送 */
asface?: boolean;
/** 是否显示下载原图按钮 */
origin?: boolean;
/** 图片概要 */
summary?: string;
/** 图片fid,接收时有效(QQNT) */
fid?: string;
/** 图片md5,接收时有效 */
md5?: string;
/** 图片高度,接收时有效 */
height?: number;
/** 图片宽度,接收时有效 */
width?: number;
/** 图片大小,接收时有效 */
size?: number;
};
record: {
/**
* support for raw silk and amr file
* @type {string} filepath such as "/tmp/1.slk"
* @type {Buffer} ptt buffer (silk or amr)
*/
file: string | Buffer;
url?: string;
md5?: string;
size?: number;
seconds?: number;
};
video: {
/**
* need ffmpeg and ffprobe
* @type {string} filepath such as "/tmp/1.mp4"
*/
file: string | Buffer;
name?: string;
fid?: string;
md5?: string;
size?: number;
seconds?: number;
};
json: {
res_id?: string;
data: string | Record<string, any>;
};
xml: {
data: string;
id?: number;
};
poke: {
/** 0~6 */
id: number;
text?: string;
};
dice: {
/** 0~6 */
id: number;
};
rps: {
id: number;
};
music: {
id: number;
platform: MusicPlatform;
};
mirai: {
data: string;
};
file: {
name: string;
fid: string;
md5: string;
size: number;
duration: number;
};
reply: {
id: string;
};
forward: {
m_resid: string;
m_fileName: string;
message: never;
} | {
m_resid?: never;
m_fileName?: never;
message: Forwardable | Forwardable[];
};
markdown: {
content: string;
};
keyboard: {
/** 机器人appid */
appid: number;
/** rows 数组的每个元素表示每一行按钮 */
rows: Button[][];
};
raw: {
data: string | pb.Encodable | pb.Encodable[];
};
}
export interface Button {
/** 按钮ID:在一个keyboard消息内设置唯一 */
id?: string;
render_data: {
/** 按钮上的文字 */
label: string;
/** 点击后按钮的上文字 */
visited_label: string;
/** 按钮样式:0 灰色线框,1 蓝色线框 */
style: number;
};
action: {
/** 设置 0 跳转按钮:http 或 小程序 客户端识别 scheme,设置 1 回调按钮:回调后台接口, data 传给后台,设置 2 指令按钮:自动在输入框插入 @bot data */
type: number;
permission: {
/** 0 指定用户可操作,1 仅管理者可操作,2 所有人可操作,3 指定身份组可操作(仅频道可用) */
type: number;
/** 有权限的用户 id 的列表 */
specify_user_ids?: Array<string>;
/** 有权限的身份组 id 的列表(仅频道可用) */
specify_role_ids?: Array<string>;
};
/** 操作相关的数据 */
data: string;
/** 指令按钮可用,指令是否带引用回复本消息,默认 false。支持版本 8983 */
reply?: boolean;
/** 指令按钮可用,点击按钮后直接自动发送 data,默认 false。支持版本 8983 */
enter?: boolean;
/** 本字段仅在指令按钮下有效,设置后后会忽略 action.enter 配置。
设置为 1 时 ,点击按钮自动唤起启手Q选图器,其他值暂无效果。
(仅支持手机端版本 8983+ 的单聊场景,桌面端不支持) */
anchor?: number;
/** 客户端不支持本action的时候,弹出的toast文案 */
unsupport_tips: string;
};
}
/** 可引用回复的消息 */
export interface Quotable {
user_id: number;
time: number;
seq: number;
/** 私聊回复必须 */
rand: number;
/** 收到的引用回复永远是字符串 */
message: Sendable;
}
/** 可转发的消息 */
export interface Forwardable {
user_id: number;
group_id?: number;
message: Sendable;
nickname?: string;
time?: number;
}
type MessageElemType = keyof MessageElemMap;
export type MessageElem<T extends MessageElemType = MessageElemType> = {
type: T;
} & MessageElemMap[T];
export type TextElem = MessageElem<'text'>;
export type AtElem = MessageElem<'at'>;
export type FaceElem = MessageElem<'face' | 'sface'>;
export type BFaceElem = MessageElem<'bface'>;
export type ImageElem = MessageElem<'image'>;
export type VideoElem = MessageElem<'video'>;
export type RecordElem = MessageElem<'record'>;
export type FileElem = MessageElem<'file'>;
export type XmlElem = MessageElem<'xml'>;
export type JsonElem = MessageElem<'json'>;
export type FlashElem = MessageElem<'flash'>;
export type PokeElem = MessageElem<'poke'>;
export type DiceElem = MessageElem<'dice'>;
export type RpsElem = MessageElem<'rps'>;
export type MusicElem = MessageElem<'music'>;
export type ReplyElem = MessageElem<'reply'>;
export type ForwardElem = MessageElem<'forward'>;
export type MarkdownElem = MessageElem<'markdown'>;
export type KeyboardElem = MessageElem<'keyboard'>;
export type RawElem = MessageElem<'raw'>;
type RepeatableCombineElem = string | TextElem | FaceElem | ImageElem | AtElem | MarkdownElem | KeyboardElem | RawElem;
type WithReply<T extends MessageElem> = T | [T] | [ReplyElem, T] | [ReplyElem, ...RepeatableCombineElem[]];
export type Sendable = RepeatableCombineElem | RepeatableCombineElem[] | WithReply<BFaceElem | ForwardElem | PokeElem | DiceElem | VideoElem | RecordElem | FileElem | XmlElem | MusicElem | JsonElem | RpsElem>;
export {};