mirai-js
Version:
QQ robot development framework based on Mirai-api-http.
581 lines (491 loc) • 17.8 kB
TypeScript
import {
// 图片 id 语音 id 消息 id
ImageId, VoiceId, MessageId,
// 事件类型 群成员权限 性别
EventType, EventEntityMap, GroupPermission, SEX,
// 接口 原始消息类型 事件处理器类型
MessageChainGetable, BotConfigGetable, MessageType,
Awaitable,
Processor,
} from './BaseType';
// 等待器
import { Waiter } from './Waiter';
export class Bot implements BotConfigGetable {
// 成员属性
public waiter: Waiter;
// 类属性
public static groupPermission: {
[k in GroupPermission]: k
};
// 一些私有的实例属性
private config: Bot.BotConfig;
private eventProcessorMap: Bot.EventProcessorMap;
private wsConnection: WebSocket;
// 普通成员方法
// implements BotConfigGetable
getBaseUrl(): string;
getQQ(): number;
getVerifyKey(): string;
getSessionKey(): string;
/**
* @description 连接到 mirai-api-http,并开启一个会话,重复调用意为重建会话
* open 方法 1. 建立会话 2. 绑定 qq 3. 与服务端建立 WebSocket 连接
* @param baseUrl 必选,mirai-api-http server 的地址
* @param verifyKey 必选,mirai-api-http server 设置的 verifyKey
* @param qq 必选,欲绑定的 qq 号,需要确保该 qq 号已在 mirai-console 登陆
*/
open({ baseUrl, verifyKey, qq, singleMode }: Bot.OpenOptions): Promise<void>;
/**
* @description 监听 ws 消息
*/
private __wsListen(): Promise<void>;
/**
* @description 关闭会话
* @param keepProcessor 可选,是否保留事件处理器,默认值为 false,不保留
* @param keepConfig 可选,是否保留 session baseUrl qq averifyKey,默认值为 false,不保留
*/
close({ keepProcessor, keepConfig }?: Bot.CloseOptions): Promise<void>;
/**
* ! messageChain 将在未来被移除
* @description 向 qq 好友 或 qq 群发送消息,若同时提供,则优先向好友发送消息
* @param temp 可选,是否是临时会话,默认为 false
* @param friend 二选一,好友 qq 号
* @param group 二选一,群号
* @param quote 可选,消息引用,使用发送时返回的 messageId
* @param message 必选,Message 实例或 MessageType 数组
* @returns messageId 可用于撤回该消息
*/
sendMessage({ temp, friend, group, quote, message }: Bot.SendMessageOptions): Promise<MessageId>;
/**
* @description 向好友或群成员发送戳一戳
* 如果提供了 group 参数则忽略 friend
* mirai-api-http-v1.10.1 feature
* @param friend 二选一,好友 qq 号
* @param group 二选一,群成员所在群
* @param target 必选,目标 qq 号
*/
sendNudge({ friend, group, target }: Bot.SendNudgeOptions): Promise<void>;
/**
* @description 添加一个事件处理器
* 框架维护的 WebSocket 实例会在 ws 的事件 message 下分发 Mirai http server 的消息
* 回调函数 (data) => any,data 的结构取决于消息类型,详见 mirai-api-http 的文档
* 而对于 ws 的其他事件 error, close, unexpectedResponse,其回调函数分别为
* - 'error': (err: Error) => void
* - 'close': (code: number, message: string) => void
* - 'unexpected-response': (request: http.ClientRequest, response: http.IncomingMessage) => void
* @param eventType 必选,事件类型
* @param callback 必选,回调函数
* @returns handle 事件处理器的标识,用于移除该处理器
*/
on<U extends EventType, E>(eventType: U, callback: Processor<[U], E>): number;
on<U extends EventType[], E>(eventType: U, callback: Processor<U, E>): number[];
/**
* @description 添加一个一次性事件处理器,回调一次后自动移除
* @param eventType 必选,事件类型
* @param callback 必选,回调函数
* @param strict 可选,是否严格检测调用,由于消息可能会被中间件拦截
* 当为 true 时,只有开发者的处理器结束后才会移除该处理器
* 当为 false 时,即使消息被拦截,也会移除该处理器
*/
one<U extends EventType>(eventType: U, callback: Processor<[U]>, strict: boolean): void;
one<U extends EventType[]>(eventType: U, callback: Processor<U>, strict: boolean): void;
/**
* @description 移除一个事件处理器
* @param eventType 必选,事件类型
* @param handle 可选,事件处理器标识(或数组),由 on 方法
* 返回,未提供时将移除该事件下的所有处理器
*/
off(eventType: EventType, handle?: number | number[]): void;
/**
* @description 移除所有事件处理器
* @param eventType 可选,事件类型(或数组)
*/
offAll(eventType?: EventType | EventType[]): void;
/**
* @description 获取 config
*/
getSessionConfig(): Promise<Bot.SessionConfig>;
/**
* @description 设置 config
* @param cacheSize 可选,插件缓存大小
* @param enableWebsocket 可选,websocket 状态
*/
setSessionConfig({ cacheSize, enableWebsocket }: Bot.SessionConfig): Promise<void>;
/**
* @description 撤回由 messageId 确定的消息
* @param messageId 欲撤回消息的 messageId
*/
recall({ messageId, target }: Bot.RecallOptions): Promise<void>;
/**
* @description 上传图片至服务器,返回指定 type 的 imageId,url,及 path
* @param type 可选,"friend" 或 "group" 或 "temp",默认为 "group"
* @param img 二选一,图片二进制数据
* @param filename 二选一,图片文件路径
*/
uploadImage({ type, img, filename }: Bot.UploadImageOptions): Promise<Bot.ImageInfo>;
/**
* @description 上传语音至服务器,返回 voiceId, url 及 path
* @param type 目前仅支持 "group",请忽略该参数
* @param voice 二选一,语音二进制数据
* @param filename 二选一,语音文件路径
*/
uploadVoice({ type, voice, filename }: Bot.UploadVoiceOptions): Promise<Bot.VoiceInfo>;
/**
* @description 获取好友列表
*/
getFriendList(): Promise<Bot.FriendInfo[]>;
/**
* @description 获取群列表
*/
getGroupList(): Promise<Bot.GroupInfo[]>;
/**
* @description 获取指定群的成员列表
* @param group 必选,欲获取成员列表的群号
*/
getMemberList({ group }: Bot.GetMemberListOptions): Promise<Bot.MemberInfo[]>;
/**
* @description 获取群成员信息
* @param group 必选,群成员所在群号
* @param qq 必选,群成员的 qq 号
*/
getMemberInfo({ group, qq }: Bot.GetMemberInfoOptions): Promise<Bot.MemberDetails>;
/**
* @description 获取群成员信息
* @param qq 必选,用户的 qq 号
*/
getUserProfile({ qq }: Bot.GetUserProfileOptions): Promise<Bot.UserProfile>;
/**
* @description 设置群成员信息
* @param group 必选,群成员所在群号
* @param qq 必选,群成员的 qq 号
* @param name 可选,要设置的群名片
* @param title 可选,要设置的群头衔
* @param permission 可选,要设置的群头衔
*/
setMemberInfo({ group, qq, name, title, permission }: Bot.SetMemberInfoOptions): Promise<void>;
/**
* @description 获取群公告列表迭代器
* @param group 必选,群号
* @returns 迭代器
*/
getAnnoIter({ group }: Bot.GetAnnoIterOptions): AsyncGenerator<Bot.AnnoInfo>;
/**
* @description 发布群公告
* @param group 必选,群号
* @param content 必选,公告内容
*/
publishAnno({ group, content, pinned }: Bot.PublishAnnoOptions): Promise<void>;
/**
* @description 删除群公告
* @param {number} group 必选,群号
* @param {string} fid 必选,公告 id
* @reaturns {void}
*/
deleteAnno({ group, fid }: Bot.DeleteAnnoOptions): Promise<void>;
/**
* @description 禁言群成员
* @param group 必选,欲禁言成员所在群号
* @param qq 必选,欲禁言成员 qq 号
* @param time 必选,禁言时长,单位: s (秒)
*/
mute({ group, qq, time }: Bot.MuteOptions): Promise<void>;
/**
* @description 全员禁言
* @param group 必选,欲全员禁言的群号
*/
muteAll({ group }: Bot.MuteAllOptions): Promise<void>;
/**
* @description 解除禁言
* @param group 必选,欲解除禁言的成员所在群号
* @param qq 必选,欲解除禁言的成员 qq 号
*/
unmute({ group, qq }: Bot.UnmuteOptions): Promise<void>;
/**
* @description 解除全员禁言
* @param group 必选,欲解除全员禁言的群号
*/
unmuteAll({ group }: Bot.UnmuteAllOptions): Promise<void>;
/**
* @description 移除群成员
* @param group 必选,欲移除的成员所在群号
* @param qq 必选,欲移除的成员 qq 号
* @param message 可选,默认为空串 "",信息
*/
removeMember({ group, qq, message }: Bot.RemoveMemberOptions): Promise<void>;
/**
* @description 删除好友
* @param qq 欲删除的好友 qq 号
*/
removeFriend({ qq }: Bot.RemoveFriendOptions): Promise<void>;
/**
* @description 移除群成员
* @param group 必选,欲移除的成员所在群号
*/
quitGroup({ group }: Bot.QuitGroupOptions): Promise<void>;
/**
* @description 获取群配置
* @param group 必选,群号
*/
getGroupConfig({ group }: Bot.GetGroupOptions): Promise<Bot.GroupConfig>;
/**
* @description 设置群配置
* @param target 必选,群号
* @param name 可选,群名
* @param announcement 可选,群公告
* @param confessTalk 可选,是否开启坦白说
* @param allowMemberInvite 可选,是否允许群员邀请
* @param autoApprove 可选,是否开启自动审批入群
* @param anonymousChat 可选,是否允许匿名聊天
*/
setGroupConfig({
group: number,
name, announcement, confessTalk,
allowMemberInvite, autoApprove, anonymousChat,
}: Bot.SetGroupConfigOptions): Promise<void>;
/**
* @description 设置群精华消息
* @param messageId 必选,消息 id
*/
setEssence({ messageId }: Bot.SetEssenceOptions): Promise<void>;
/**
* @description 向 mirai-console 发送指令
* @param command 必选,指令名
*/
sendCommand({ command }: Bot.SendCommandOptions): Promise<Bot.MiraiConsoleMessage>;
/**
* @description 通过 messageId 获取消息
* @param {number} target 可选, 目标 qq 号/群号, mah v2.6.0+ 新增该参数
* @param {number} messageId 必选, 消息 id
* @returns
*/
getMessageById({ messageId, target }: Bot.GetMessageByIdOptions): Promise<Bot.MessageFromMessageId>
// 类方法
/**
* @description 检测该账号是否已经在 mirai-console 登录
* @param baseUrl 必选,mirai-api-http server 的地址
* @param verifyKey 必选,mirai-api-http server 设置的 verifyKey
* @param qq 必选,qq 号
*/
static isBotLoggedIn({ baseUrl, verifyKey, qq }: Bot.IsBotLoggedInOptions): Promise<boolean>;
}
// 类型
declare namespace Bot {
interface BotConfig {
baseUrl: string;
qq: number;
verifyKey: string;
sessionKey: string;
}
// An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
type EventProcessorMap = {
// 索引不能使用联合类型
[eventType in EventType]: {
[handler: number]: (data: EventEntityMap[eventType]) => Awaitable<void | any>;
};
}
interface OpenOptions {
baseUrl?: string;
verifyKey?: string;
qq?: number;
singleMode?: boolean;
}
interface CloseOptions {
keepProcessor?: boolean;
keepConfig?: boolean;
}
interface SendMessageOptions {
temp?: boolean;
friend?: number;
group?: number;
quote?: MessageId;
message?: MessageChainGetable | MessageType[];
}
interface SendNudgeOptions {
friend?: number;
group?: number;
target: number;
}
interface SessionConfig {
cacheSize?: number;
enableWebsocket?: boolean;
}
interface RecallOptions {
messageId: MessageId;
target?: number;
}
interface UploadImageOptions {
type?: 'friend' | 'group' | 'temp';
img?: Buffer;
filename?: string;
}
interface UploadVoiceOptions {
type?: 'friend' | 'group' | 'temp';
voice?: Buffer;
filename?: string;
}
interface ImageInfo {
imageId: ImageId;
url: string;
path: string;
}
interface VoiceInfo {
voiceId: VoiceId;
url: string;
path: string;
}
interface FriendInfo {
id: number;
name: string;
remark: string;
}
interface GroupInfo {
id: number;
name: string;
permission: GroupPermission;
}
interface MemberInfo {
id: number;
name: string;
permission: GroupPermission;
}
interface GetMemberInfoOptions {
group: number;
qq: number;
}
interface MemberDetails {
id: number;
joinTimestamp: number;
lastSpeakTimestamp: number;
memberName: string;
nuteTimeRemaining: number;
permission: GroupPermission;
title: string;
}
interface GetMemberListOptions {
group: number;
}
interface GetUserProfileOptions {
qq: number;
}
interface UserProfile {
nickname: string;
email: string;
age: number;
level: number;
sign: string;
sex: SEX;
}
interface SetMemberInfoOptions {
group: number;
qq: number;
name?: string;
title?: string;
permission?: GroupPermission
}
interface GetAnnoIterOptions {
group: number;
}
interface PublishAnnoOptions {
group: number;
content: string;
pinned: boolean;
}
interface DeleteAnnoOptions {
group: number;
fid: string;
}
interface AnnoInfo {
group: { id: number; name: string; permission: GroupPermission; };
content: string;
senderId: number;
fid: string;
allConfirmed: boolean;
confirmedMembersCount: number;
publicationTime: number;
}
interface MuteOptions {
group: number;
qq: number;
time: number;
}
interface MuteAllOptions {
group: number;
}
interface UnmuteOptions {
group: number;
qq: number;
}
interface UnmuteAllOptions {
group: number;
}
interface RemoveMemberOptions {
group: number;
qq: number;
message?: string;
}
interface RemoveFriendOptions {
qq: number;
}
interface QuitGroupOptions {
group: number;
}
interface GetGroupOptions {
group: number;
}
interface GroupConfig {
name: string;
announcement: string;
confessTalk: boolean;
allowMemberInvite: boolean;
autoApprove: boolean;
anonymousChat: boolean;
}
interface SetGroupConfigOptions {
group: number;
name?: string;
announcement?: string;
confessTalk?: boolean;
allowMemberInvite?: boolean;
autoApprove?: boolean;
anonymousChat?: boolean;
}
interface SetEssenceOptions {
messageId: number;
target?: number;
}
interface SendCommandOptions {
command: string[];
}
interface GetMessageByIdOptions {
messageId: number;
target?: number;
}
interface MessageFromMessageId {
type: 'FriendMessage' | 'GroupMessage' | 'TempMessage';
messageChain: MessageType[];
sender: {
id?: number;
nickname?: string;
remark?: string;
memberName?: string;
specialTitle?: string;
permission?: GroupPermission;
joinTimestamp?: number;
lastSpeakTimestamp?: number;
muteTimeRemaining?: number;
group?: {
id: number;
name: string;
permission: GroupPermission;
}
}
}
interface IsBotLoggedInOptions {
baseUrl: string;
verifyKey: string;
qq: number;
}
interface MiraiConsoleMessage {
message: string
}
}