UNPKG

oicq

Version:
1,023 lines (937 loc) 36 kB
// Project: https://github.com/takayama-lily/oicq /// <reference types="node" /> import { EventEmitter } from 'events'; import { OutgoingHttpHeaders } from 'http'; import * as log4js from 'log4js'; export type Uin = number; /** 大多数情况下你无需关心这些配置项,因为默认配置就是最常用的,除非你需要一些与默认不同的规则 */ export interface ConfBot { /** 日志等级,默认info (往屏幕打印日志会降低性能,若消息量巨大建议修改此参数或重定向) */ log_level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal" | "mark" | "off", /** 1:安卓手机(默认) 2:aPad 3:安卓手表 4:MacOS 5:iPad */ platform?: number, /** 被踢下线是否在3秒后重新登陆,默认false */ kickoff?: boolean, /** 群聊是否过滤自己的发言,默认true */ ignore_self?: boolean, /** 被风控时是否尝试用分片发送,默认true */ resend?: boolean, /** raw_message里是否不使用CQ码字符串,而是使用简短易读的形式(如:"[图片][表情]"),可以加快解析速度,默认false */ brief?: boolean, /** 数据存储文件夹,需要可写权限,默认主模块下的data文件夹 */ data_dir?: string, //触发system.offline.network事件后的重连间隔秒数,默认5(秒),不建议设置低于3(秒) //瞬间的断线重连不会触发此事件,通常你的机器真的没有网络或登陆无响应时才会触发 //设置为0则不会自动重连,然后你可以监听此事件自己处理 reconn_interval?: number, //一些内部缓存(如群员详细资料、群详细资料等)的生命周期,默认3600(秒) //即使不用相关API(使用`no_cache=true`)强制刷新数据,超过这个时间后内部也会自动刷新 internal_cache_life?: number, /** 自动选择最优服务器(默认开启),关闭后会一直使用`msfwifi.3g.qq.com`进行连接 */ auto_server?: boolean; /** 手动指定ip和port,不推荐使用,大多数情况下你应该使用auto_server */ remote_ip?: string, remote_port?: number, } export interface Statistics { readonly start_time: number, readonly lost_times: number, readonly recv_pkt_cnt: number, readonly sent_pkt_cnt: number, readonly lost_pkt_cnt: number, //超时未响应的包 readonly recv_msg_cnt: number, readonly sent_msg_cnt: number, } export interface Status { online: boolean, status: number, remote_ip?: number, remote_port?: number, msg_cnt_per_min: number, statistics: Statistics, config: ConfBot, } export type LoginInfo = StrangerInfo & VipInfo; export type GroupRole = "owner" | "admin" | "member"; export type Gender = "male" | "female" | "unknown"; ////////// export interface RetError { code: number, message: string, } interface RetSuccess<T> { retcode: 0, status: "ok", data: T, error: null, } interface RetAsync { retcode: 1, status: "async", data: null, error: null, } interface RetFailure { retcode: 100 | 102 | 103 | 104, //100error 102failed 103timeout 104offline status: "failed", data: null, error: RetError, } export type Ret<T = null> = RetSuccess<T> | RetAsync | RetFailure; export type RetCommon = Ret; ////////// export interface VipInfo { readonly user_id?: number, readonly nickname?: string, readonly level?: number, readonly level_speed?: number, readonly vip_level?: number, readonly vip_growth_speed?: number, readonly vip_growth_total?: string, } export interface StrangerInfo { readonly user_id: number, readonly nickname: string, readonly sex: Gender, readonly age: number, readonly area?: string, readonly signature?: string, readonly description?: string, readonly group_id?: number, } export interface FriendInfo extends StrangerInfo { readonly remark?: string } export interface GroupInfo { readonly group_id: number, readonly group_name: string, readonly member_count: number, readonly max_member_count: number, readonly owner_id: number, readonly last_join_time: number, readonly last_sent_time: number, readonly shutup_time_whole: number, //全员禁言到期时间 readonly shutup_time_me: number, //我的禁言到期时间 readonly create_time: number, readonly grade: number, readonly max_admin_count: number, readonly active_member_count: number, readonly update_time: number, //当前群资料的最后更新时间 } export interface MemberBaseInfo { readonly user_id: number, readonly nickname: string, readonly card: string, readonly sex: Gender, readonly age: number, readonly area: string, readonly level: number, readonly role: GroupRole, readonly title: string, } export interface MemberInfo extends MemberBaseInfo { readonly group_id: number, // readonly user_id: number, // readonly nickname: string, // readonly card: string, // readonly sex: Gender, // readonly age: number, // readonly area: string, readonly join_time: number, readonly last_sent_time: number, // readonly level: number, readonly rank: string, // readonly role: GroupRole, readonly unfriendly: boolean, // readonly title: string, readonly title_expire_time: number, readonly card_changeable: boolean, readonly shutup_time: number, //禁言到期时间 readonly update_time: number, //此群员资料的最后更新时间 } ////////// Message Elements /** * 使用cqhttp风格的消息元素类型 * @see https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md */ export type MessageElem = TextElem | AtElem | FaceElem | BfaceElem | MfaceElem | ImgPttElem | LocationElem | MusicElem | ShareElem | JsonElem | XmlElem | AnonymousElem | ReplyElem | NodeElem | ShakeElem | PokeElem | FileElem | VideoElem | MiraiElem; export interface TextElem { type: "text", data: { text: string } } export interface AtElem { type: "at", data: { qq: number | "all", text?: string, dummy?: boolean, } } export interface FaceElem { type: "face" | "sface", data: { id: number, text?: string } } export interface BfaceElem { type: "bface", data: { file: string, text: string } } export interface MfaceElem { type: "rps" | "dice", data: { id: number, } } /** * @typedef MediaFile 为string时等同于[CQ:image]中的file参数 * string支持以下写法: * http(s):// * base64:// * /tmp/example.jpg 本地绝对路径 * example.jpg 本地相对(于启动目录的)路径 * file:/// * protobuf:// 仅用于语音和视频的转发 */ export type MediaFile = string | Uint8Array | ArrayBuffer | SharedArrayBuffer; export interface ImgPttElem { type: "image" | "flash" | "record", data: { file: MediaFile, cache?: boolean, proxy?: boolean, timeout?: number, url?: string, headers?: OutgoingHttpHeaders, type?: "flash" | "show", magic?: boolean, } } export interface VideoElem { type: "video", data: { file: string, url?: string, } } export interface LocationElem { type: "location", data: { address: string, lat: number, lng: number, name?: string, id?: string, } } export type MusicType = "qq" | "163" | "migu" | "kugou" | "kuwo"; export interface MusicElem { type: "music", data: { type: MusicType, id: string, } } export interface ShareElem { type: "share", data: { url: string, title: string, content?: string, image?: string, } } export interface JsonElem { type: "json", data: { data: any, // a json string or a json object text?: string, } } export interface XmlElem { type: "xml", data: { data: string, type?: number, //type为35的是合并转发 text?: string, } } export interface AnonymousElem { type: "anonymous", data?: { ignore?: boolean, } } export interface ReplyElem { type: "reply", data: { id: string, } } export interface NodeElem { type: "node", data: { id: string, } } export interface ShakeElem { type: "shake", } export interface PokeElem { type: "poke", data: { type: number, id?: number, } } export interface MiraiElem { type: "mirai", data: { data: string, } } export interface FileElem { type: "file", data: { name: string, url: string, size: number, md5: string, duration: number, busid: number, fileid: string, } } ////////// Events export interface CommonEventData { self_id: number, time: number, post_type: "system" | "request" | "message" | "notice", system_type?: "login" | "online" | "offline", request_type?: "friend" | "group", message_type?: "private" | "group" | "discuss", notice_type?: "friend" | "group", sub_type?: string, } // system events export interface CommonSystemEventData extends CommonEventData { post_type: "system", } export interface CaptchaEventData extends CommonSystemEventData { system_type: "login", sub_type: "captcha", image: Buffer } export interface SliderEventData extends CommonSystemEventData { system_type: "login", sub_type: "slider", url: string } export interface DeviceEventData extends CommonSystemEventData { system_type: "login", sub_type: "device", url: string, phone: string, } export interface LoginErrorEventData extends CommonSystemEventData { system_type: "login", sub_type: "error", code: number, message: string, } export interface OnlineEventData extends CommonSystemEventData { system_type: "online", } export interface OfflineEventData extends CommonSystemEventData { system_type: "offline", sub_type: "network" | "kickoff" | "frozen" | "device" | "unknown", message: string, } // request events interface CommonRequestEventData extends CommonEventData { post_type: "request", user_id: number, nickname: string, flag: string, } export interface FriendAddEventData extends CommonRequestEventData { request_type: "friend", sub_type: "add", comment: string, source: string, age: number, sex: Gender, } export interface GroupAddEventData extends CommonRequestEventData { request_type: "group", sub_type: "add", group_id: number, group_name: string, comment: string, inviter_id?: number, //邀请人 } export interface GroupInviteEventData extends CommonRequestEventData { request_type: "group", sub_type: "invite", group_id: number, group_name: string, role: GroupRole, //邀请者权限 } // message events interface CommonMessageEventData extends CommonEventData { post_type: "message", message: MessageElem[], raw_message: string, message_id: string, user_id: number, font: string, reply: (message: MessageElem | Iterable<MessageElem> | string, auto_escape?: boolean) => Promise<Ret<{ message_id: string }>>, } export interface PrivateMessageEventData extends CommonMessageEventData { message_type: "private", sub_type: "friend" | "group" | "single" | "other", sender: FriendInfo, auto_reply: boolean, } export interface GroupMessageEventData extends CommonMessageEventData { message_type: "group", sub_type: "normal" | "anonymous", group_id: number, group_name: string, anonymous: Anonymous | null, sender: MemberBaseInfo, } export interface Anonymous { id: number, name: string, flag: string, } export interface DiscussMessageEventData extends CommonMessageEventData { message_type: "discuss", discuss_id: number, discuss_name: string, sender: { user_id: number, nickname: string, card: string, }, } // notice events interface CommonFriendNoticeEventData extends CommonEventData { post_type: "notice", notice_type: "friend", } export interface FriendRecallEventData extends CommonFriendNoticeEventData { sub_type: "recall", user_id: number, operator_id: number, message_id: string, } export interface FriendProfileEventData extends CommonFriendNoticeEventData { sub_type: "profile", user_id: number, nickname?: string, signature?: string, } export interface FriendIncreaseEventData extends CommonFriendNoticeEventData { sub_type: "increase", user_id: number, nickname: string, } export interface FriendDecreaseEventData extends CommonFriendNoticeEventData { sub_type: "decrease", user_id: number, nickname: string, } export interface FriendPokeEventData extends CommonFriendNoticeEventData { sub_type: "poke", user_id: number, operator_id: number, target_id: number, action: string, suffix: string } interface CommonGroupNoticeEventData extends CommonEventData { post_type: "notice", notice_type: "group", } export interface GroupPokeEventData extends CommonGroupNoticeEventData { sub_type: "poke", group_id: number, operator_id: number, user_id: number, action: string, suffix: string } export interface MemberIncreaseEventData extends CommonGroupNoticeEventData { sub_type: "increase", group_id: number, user_id: number, nickname: string, } export interface MemberDecreaseEventData extends CommonGroupNoticeEventData { sub_type: "decrease", group_id: number, operator_id: number, user_id: number, dismiss: boolean, member?: MemberInfo, } export interface GroupRecallEventData extends CommonGroupNoticeEventData { sub_type: "recall", group_id: number, operator_id: number, user_id: number, message_id: string, } export interface GroupAdminEventData extends CommonGroupNoticeEventData { sub_type: "admin", group_id: number, user_id: number, set: boolean, } export interface GroupMuteEventData extends CommonGroupNoticeEventData { sub_type: "ban", group_id: number, operator_id: number, user_id: number, nickname?: string, duration: number, } export interface GroupTransferEventData extends CommonGroupNoticeEventData { sub_type: "transfer", group_id: number, operator_id: number, user_id: number, } export interface GroupTitleEventData extends CommonGroupNoticeEventData { sub_type: "title", group_id: number, user_id: number, nickname: string, title: string, } export interface GroupSettingEventData extends CommonGroupNoticeEventData { sub_type: "setting", group_id: number, group_name?: string, enable_guest?: boolean, enable_anonymous?: boolean, enable_upload_album?: boolean, enable_upload_file?: boolean, enable_temp_chat?: boolean, enable_new_group?: boolean, enable_show_honor?: boolean, enable_show_level?: boolean, enable_show_title?: boolean, enable_confess?: boolean, } export type FriendNoticeEventData = FriendIncreaseEventData | FriendDecreaseEventData | FriendRecallEventData | FriendProfileEventData | FriendPokeEventData; //5 export type GroupNoticeEventData = GroupRecallEventData | GroupSettingEventData | GroupTitleEventData | GroupTransferEventData | GroupMuteEventData | GroupAdminEventData | MemberIncreaseEventData | MemberDecreaseEventData | GroupPokeEventData; //9 export type SystemEventData = CaptchaEventData | DeviceEventData | SliderEventData | LoginErrorEventData | OfflineEventData | OnlineEventData; //6(4+2) export type RequestEventData = FriendAddEventData | GroupAddEventData | GroupInviteEventData; //3 export type MessageEventData = PrivateMessageEventData | GroupMessageEventData | DiscussMessageEventData; //3 export type NoticeEventData = FriendNoticeEventData | GroupNoticeEventData; //2 export type EventData = SystemEventData | RequestEventData | MessageEventData | NoticeEventData; //4 ////////// group file system export interface GfsBaseStat { fid: string, //文件(夹)id pid: string, //父文件夹id name: string, user_id: number, create_time: number, } export interface GfsFileStat extends GfsBaseStat { size: number, busid: number, md5: string, sha1: string, duration: number, download_times: number, } export interface GfsDirStat extends GfsBaseStat { file_count: number, is_dir: true, } export type GfsStat = GfsFileStat | GfsDirStat; /** * 这里面的方法是会reject的,需要catch * node15开始,unhandledRejection默认会升级为uncaughtException导致程序退出 */ export class Gfs { private constructor(); /** 群号 */ readonly gid: number; /** 查看文件属性(尽量不要对目录使用此方法) */ stat(fid: string): Promise<GfsStat>; /** 列出文件,start从0开始,limit默认100(最大) */ ls(fid?: string, start?: number, limit?: number): Promise<GfsStat[]>; /** ls的别名 */ dir: Gfs["ls"]; /** 创建目录 */ mkdir(name: string): Promise<GfsDirStat>; /** 删除文件或目录(删除目标是目录的时候会删除下面的所有文件) */ rm(fid: string): Promise<void>; /** 重命名文件或目录 */ rename(fid: string, name: string): Promise<void>; /** 移动文件到其他目录 */ mv(fid: string, pid: string): Promise<void>; /** 查看可用空间和文件数量 */ df(): Promise<{ total: number, used: number, free: number, file_count: number, max_file_count: number, }>; /** 上传文件(默认传到根目录) */ upload(localpath: string, pid?: string, name?: string): Promise<GfsFileStat>; /** 获取文件的下载链接 */ download(fid: string): Promise<FileElem["data"]>; } ////////// /** * 方法不会reject或抛出异常,使用retcode判断是否成功 * @see {Ret} */ export class Client extends EventEmitter { readonly uin: number; readonly password_md5: Buffer; readonly nickname: string; readonly sex: Gender; readonly age: number; /** 在线状态 */ readonly online_status: number; /** 好友列表 */ readonly fl: ReadonlyMap<number, FriendInfo>; /** 陌生人列表 */ readonly sl: ReadonlyMap<number, StrangerInfo>; /** 群列表 */ readonly gl: ReadonlyMap<number, GroupInfo>; /** 群员列表 */ readonly gml: ReadonlyMap<number, ReadonlyMap<number, MemberInfo>>; /** 日志记录器 */ readonly logger: log4js.Logger; /** 当前账号本地存储路径 */ readonly dir: string; /** 配置信息(大部分参数支持热修改) */ readonly config: ConfBot; /** 数据统计信息 */ readonly stat: Statistics; constructor(uin: number, config?: ConfBot); /** * @param password 明文或md5后的密码,重复调用时可无需传入此参数 */ login(password?: Uint8Array | string): void; /** 提交滑动验证码ticket */ sliderLogin(ticket: string): void; /** 先下线再关闭连接 */ logout(): Promise<void>; isOnline(): boolean; /** 发验证码给密保手机,用于发短信过设备锁 */ sendSMSCode(): void; /** 提交收到的短信验证码 */ submitSMSCode(code: string): void; /** * 设置在线状态 * @param status 11我在线上 31离开 41隐身 50忙碌 60Q我吧 70请勿打扰 */ setOnlineStatus(status: number): Promise<Ret>; /** @deprecated 获取好友列表,请直接访问 this.fl */ getFriendList(): Ret<Client["fl"]>; /** @deprecated 获取陌生人列表,请直接访问 this.sl */ getStrangerList(): Ret<Client["sl"]>; /** @deprecated 获取群列表,请直接访问 this.gl */ getGroupList(): Ret<Client["gl"]>; /** 获取群成员列表 */ getGroupMemberList(group_id: number, no_cache?: boolean): Promise<Ret<ReadonlyMap<number, MemberInfo>>>; /** 获取陌生人资料 */ getStrangerInfo(user_id: number, no_cache?: boolean): Promise<Ret<StrangerInfo>>; /** 获取群资料 */ getGroupInfo(group_id: number, no_cache?: boolean): Promise<Ret<GroupInfo>>; /** 获取群员资料 */ getGroupMemberInfo(group_id: number, user_id: number, no_cache?: boolean): Promise<Ret<MemberInfo>>; /** 私聊 */ sendPrivateMsg(user_id: number, message: MessageElem | Iterable<MessageElem> | string, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>; /** 群聊 */ sendGroupMsg(group_id: number, message: MessageElem | Iterable<MessageElem> | string, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>; /** 群临时会话,大多数时候可以使用私聊达到同样效果 */ sendTempMsg(group_id: number, user_id: number, message: MessageElem | Iterable<MessageElem> | string, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>; /** 讨论组 */ sendDiscussMsg(discuss_id: number, message: MessageElem | Iterable<MessageElem> | string, auto_escape?: boolean): Promise<Ret>; /** 撤回 */ deleteMsg(message_id: string): Promise<Ret>; /** 获取一条消息(无法获取被撤回的消息) */ getMsg(message_id: string): Promise<Ret<PrivateMessageEventData | GroupMessageEventData>>; /** * 获取message_id往前的count条消息(包括自身) * 无法获取被撤回的消息,因此返回的数量并不一定为count * count默认为20,不能超过20 * * 若要获取最新的20条消息,参考https://github.com/takayama-lily/oicq/wiki/93.%E8%A7%A3%E6%9E%90%E6%B6%88%E6%81%AFID * 自行构造消息id,除群号外其余位补0 */ getChatHistory(message_id: string, count?: number): Promise<Ret<PrivateMessageEventData[] | GroupMessageEventData[]>>; /** * 获取转发消息 * resid在xml消息中,需要自行解析xml获得 * 暂不支持套娃转发解析 */ getForwardMsg(resid: string): Promise<Ret<Array<{ group_id?: number, user_id: number, nickname: number, time: number, message: MessageElem[], raw_message: string, }>>>; /** 发群公告 */ sendGroupNotice(group_id: number, content: string): Promise<Ret>; /** 设置群名 */ setGroupName(group_id: number, group_name: string): Promise<Ret>; /** 开启或关闭匿名 */ setGroupAnonymous(group_id: number, enable?: boolean): Promise<Ret>; /** 全员禁言 */ setGroupWholeBan(group_id: number, enable?: boolean): Promise<Ret>; /** 设置管理员 */ setGroupAdmin(group_id: number, user_id: number, enable?: boolean): Promise<Ret>; /** 设置群头衔 */ setGroupSpecialTitle(group_id: number, user_id: number, special_title?: string, duration?: number): Promise<Ret>; /** 设置群名片 */ setGroupCard(group_id: number, user_id: number, card?: string): Promise<Ret>; /** 踢人(不支持批量) */ setGroupKick(group_id: number, user_id: number, reject_add_request?: boolean): Promise<Ret>; /** 禁言 */ setGroupBan(group_id: number, user_id: number, duration?: number): Promise<Ret>; /** 禁言匿名玩家 */ setGroupAnonymousBan(group_id: number, flag: string, duration?: number): Promise<Ret>; /** 退群 */ setGroupLeave(group_id: number, is_dismiss?: boolean): Promise<Ret>; /** 戳一戳 */ sendGroupPoke(group_id: number, user_id: number): Promise<Ret>; /** 处理好友请求 */ setFriendAddRequest(flag: string, approve?: boolean, remark?: string, block?: boolean): Promise<Ret>; /** 处理群请求 */ setGroupAddRequest(flag: string, approve?: boolean, reason?: string, block?: boolean): Promise<Ret>; /** 获取未处理的请求 */ getSystemMsg(): Promise<Ret<Array<FriendAddEventData | GroupAddEventData | GroupInviteEventData>>>; /** 该接口风控 */ addGroup(group_id: number, comment?: string): Promise<Ret>; /** 该接口风控(只能添加群员) */ addFriend(group_id: number, user_id: number, comment?: string): Promise<Ret>; /** 删除好友 */ deleteFriend(user_id: number, block?: boolean): Promise<Ret>; /** 邀请好友入群(不支持陌生人和批量) */ inviteFriend(group_id: number, user_id: number): Promise<Ret>; /** 点赞(times默认1,不支持陌生人) */ sendLike(user_id: number, times?: number): Promise<Ret>; /** 设置昵称 */ setNickname(nickname: string): Promise<Ret>; /** 设置性别(0未知 1男 2女) */ setGender(gender: 0 | 1 | 2): Promise<Ret>; /** 设置生日(20110202的形式) */ setBirthday(birthday: string | number): Promise<Ret>; /** 设置个人说明 */ setDescription(description?: string): Promise<Ret>; /** 设置个人签名 */ setSignature(signature?: string): Promise<Ret>; /** 设置个人头像 */ setPortrait(file: MediaFile): Promise<Ret>; // /** 设置群头像 */ setGroupPortrait(group_id: number, file: MediaFile): Promise<Ret>; /** * 预先上传图片以备发送 * 通常图片在发送时一并上传 * 提前上传可用于加快发送速度,实现秒发 */ preloadImages(files: Iterable<MediaFile>): Promise<Ret<string[]>>; /** 获取漫游表情 */ getRoamingStamp(no_cache?: boolean): Promise<Ret<string[]>>; /** 获取群公告 */ getGroupNotice(group_id: number): Promise<Ret<Array<{ u: number, //发布者 fid: string, pubt: number, //发布时间 msg: { text: string, title: string, pics?: Array<{ id: string, w: string, h: string, }>, }, type: number, settings: { is_show_edit_card: number, remind_ts: number, tip_window_type: number, confirm_required: number }, read_num: number, is_read: number, is_all_confirm: number }>>>; /** * 支持的域名: * tenpay.com | docs.qq.com | office.qq.com | connect.qq.com * vip.qq.com | mail.qq.com | qzone.qq.com | gamecenter.qq.com * mma.qq.com | game.qq.com | qqweb.qq.com | openmobile.qq.com * qun.qq.com | ti.qq.com | */ getCookies(domain?: string): Promise<Ret<{ cookies: string }>>; getCsrfToken(): Promise<Ret<{ token: number }>>; /** 清除 image 和 record 文件夹下的缓存文件 */ cleanCache(type?: "image" | "record"): Promise<Ret>; /** 获取在线状态和数据统计 */ getStatus(): Ret<Status>; /** 获取登录账号信息 */ getLoginInfo(): Ret<LoginInfo>; /** 获取等级信息(默认获取自己的) */ getLevelInfo(user_id?: number): Promise<Ret<any>>; /** 进入群文件系统 */ acquireGfs(group_id: number): Gfs; on(event: "system.login.captcha", listener: (this: Client, data: CaptchaEventData) => void): this; on(event: "system.login.slider", listener: (this: Client, data: SliderEventData) => void): this; //收到滑动验证码事件 on(event: "system.login.device", listener: (this: Client, data: DeviceEventData) => void): this; //设备锁验证事件 on(event: "system.login.error", listener: (this: Client, data: LoginErrorEventData) => void): this; //登录遇到错误 on(event: "system.login", listener: (this: Client, data: CaptchaEventData | DeviceEventData | LoginErrorEventData | SliderEventData) => void): this; on(event: "system.online", listener: (this: Client, data: OnlineEventData) => void): this; //上线事件 on(event: "system.offline" | "system.offline.network" | "system.offline.kickoff" | //下线事件 "system.offline.frozen" | "system.offline.device" | "system.offline.unknown", listener: (this: Client, data: OfflineEventData) => void): this; on(event: "system", listener: (this: Client, data: SystemEventData) => void): this; on(event: "request.friend" | "request.friend.add", listener: (this: Client, data: FriendAddEventData) => void): this; //收到好友申请事件 on(event: "request.group.add", listener: (this: Client, data: GroupAddEventData) => void): this; //收到加群申请事件 on(event: "request.group.invite", listener: (this: Client, data: GroupInviteEventData) => void): this; //收到群邀请事件 on(event: "request.group", listener: (this: Client, data: GroupAddEventData | GroupInviteEventData) => void): this; on(event: "request", listener: (this: Client, data: RequestEventData) => void): this; //监听以上所有request事件 on(event: "message.private" | "message.private.friend" | "message.private.group" | "message.private.single" | "message.private.other", listener: (this: Client, data: PrivateMessageEventData) => void): this; //私聊消息事件 on(event: "message.group" | "message.group.normal" | "message.group.anonymous", listener: (this: Client, data: GroupMessageEventData) => void): this; //群消息事件 on(event: "message.discuss", listener: (this: Client, data: DiscussMessageEventData) => void): this; //讨论组消息事件 on(event: "message", listener: (this: Client, data: MessageEventData) => void): this; //监听以上所有message事件 on(event: "notice.friend.increase", listener: (this: Client, data: FriendIncreaseEventData) => void): this; //新增好友事件 on(event: "notice.friend.decrease", listener: (this: Client, data: FriendDecreaseEventData) => void): this; //好友(被)删除事件 on(event: "notice.friend.recall", listener: (this: Client, data: FriendRecallEventData) => void): this; //好友撤回事件 on(event: "notice.friend.profile", listener: (this: Client, data: FriendProfileEventData) => void): this; //好友资料变更事件 on(event: "notice.friend.poke", listener: (this: Client, data: FriendPokeEventData) => void): this; //好友戳一戳事件 on(event: "notice.group.increase", listener: (this: Client, data: MemberIncreaseEventData) => void): this; //踢群・退群事件 on(event: "notice.group.decrease", listener: (this: Client, data: MemberDecreaseEventData) => void): this; //入群・群员增加事件 on(event: "notice.group.recall", listener: (this: Client, data: GroupRecallEventData) => void): this; //群消息撤回事件 on(event: "notice.group.admin", listener: (this: Client, data: GroupAdminEventData) => void): this; //管理员变更事件 on(event: "notice.group.ban", listener: (this: Client, data: GroupMuteEventData) => void): this; //群禁言事件 on(event: "notice.group.transfer", listener: (this: Client, data: GroupTransferEventData) => void): this; //群转让事件 on(event: "notice.group.title", listener: (this: Client, data: GroupTitleEventData) => void): this; //群头衔变更事件 on(event: "notice.group.poke", listener: (this: Client, data: GroupPokeEventData) => void): this; //群戳一戳事件 on(event: "notice.group.setting", listener: (this: Client, data: GroupSettingEventData) => void): this; //群设置变更事件 on(event: "notice.friend", listener: (this: Client, data: FriendNoticeEventData) => void): this; //监听以上所有好友notice事件 on(event: "notice.group", listener: (this: Client, data: GroupNoticeEventData) => void): this; //监听以上所有群notice事件 on(event: "notice", listener: (this: Client, data: NoticeEventData) => void): this; //监听以上所有notice事件 on(event: string | symbol, listener: (this: Client, ...args: any[]) => void): this; /** * 重载好友列表和群列表 * 完成之前无法调用任何api,也不会上报任何事件 */ reloadFriendList(): Promise<Ret>; reloadGroupList(): Promise<Ret>; /** @deprecated 直接关闭连接 */ terminate(): void; /** @deprecated 文字验证码 */ captchaLogin(captcha: string): void; /** @deprecated */ canSendImage(): Ret; /** @deprecated */ canSendRecord(): Ret; /** @deprecated 获取版本信息(暂时为返回package.json中的信息) */ getVersionInfo(): Ret<any>; } /** 工厂方法 */ export function createClient(uin: number, config?: ConfBot): Client; /** * 生成消息元素的快捷函数 */ export namespace segment { /** 普通文本 */ function text(text: string): TextElem; /** at */ function at(qq: number, text?: string, dummy?: boolean): AtElem; /** 经典表情 */ function face(id: number, text?: string): FaceElem; /** 小表情 */ function sface(id: number, text?: string): FaceElem; /** 原创表情 */ function bface(file: string): BfaceElem; /** 猜拳 */ function rps(id?: number): MfaceElem; /** 骰子 */ function dice(id?: number): MfaceElem; /** 图片(后三个参数在下载网络图片时有效) */ function image(file: MediaFile, cache?: boolean, timeout?: number, headers?: OutgoingHttpHeaders): ImgPttElem; /** 闪照 */ function flash(file: MediaFile, cache?: boolean, timeout?: number, headers?: OutgoingHttpHeaders): ImgPttElem; /** 语音 */ function record(file: MediaFile, cache?: boolean, timeout?: number, headers?: OutgoingHttpHeaders): ImgPttElem; /** 位置分享 */ function location(lat: number, lng: number, address: string, id?: string): LocationElem; /** 音乐分享 */ function music(type: MusicType, id: string): MusicElem; /** JSON消息 */ function json(data: any): JsonElem; /** XML消息 */ function xml(data: string, type?: number): XmlElem; /** 内容分享 */ function share(url: string, title: string, image?: string, content?: string): ShareElem; /** 窗口抖动 */ function shake(): ShakeElem; /** 戳一戳 */ function poke(type: number, id?: number): PokeElem; /** 引用回复 */ function reply(id: string): ReplyElem; /** 转发节点 */ function node(id: string): NodeElem; /** 匿名 */ function anonymous(ignore?: boolean): AnonymousElem; /** 只有mirai系客户端可以解析的消息 */ function mirai(data: string): MiraiElem; /** 将元素转换到CQ码字符串(CQ码字符串无法逆转换到元素,因为类型会丢失) */ function toCqcode(elem: MessageElem): string; function toCqcode(elems: Iterable<MessageElem>): string; } /** * 生成CQ码字符串的快捷函数 */ export namespace cqcode { function text(text: string): string; function at(qq: number, text?: string, dummy?: boolean): string; function face(id: number, text?: string): string; function sface(id: number, text?: string): string; function bface(file: string): string; function rps(id?: number): string; function dice(id?: number): string; function image(file: string, cache?: boolean, timeout?: number, headers?: string): string; function flash(file: string, cache?: boolean, timeout?: number, headers?: string): string; function record(file: string, cache?: boolean, timeout?: number, headers?: string): string; function location(lat: number, lng: number, address: string, id?: string): string; function music(type: MusicType, id: string): string; function json(data: string): string; function xml(data: string, type?: number): string; function share(url: string, title: string, image?: string, content?: string): string; function shake(): string; function poke(type: number, id?: number): string; function reply(id: string): string; function node(id: string): string; function anonymous(ignore?: boolean): string; function mirai(data: string): string; }