mirai-js
Version:
QQ robot development framework based on Mirai-api-http.
420 lines (391 loc) • 13 kB
TypeScript
import { Bot } from './Bot';
import { ArrayToValuesUnion } from './typeHelpers';
/**
* 消息链的元素,是 mirai-api-http 接口需要的原始类型
* 有多种消息类型实现了该接口,已经全部列出
*
* @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/MessageType.md
*/
interface MessageType {
type: MessageChainElementTypes;
// Quote
id?: number;
groupId?: number;
senderId?: number;
targetId?: number;
origin?: MessageType[];
// At
target?: number;
display?: string;
// Face Poke
faceId?: number;
name?: string;
// Plain
text?: string;
// Image FlashImage Voice
imageId?: ImageId;
voiceId?: VoiceId;
url?: string;
path?: string;
// Xml
xml?: string;
// Json
json?: string;
// App
content?: string;
// Forward
nodeList?: ForwardNode[];
}
// 用于 Bot 获得消息链,Message 使用了该扩展
interface MessageChainGetable {
getMessageChain(): MessageType[];
}
/**
* @description 合并转发类型Forward内消息节点的类型定义
*/
interface ForwardNode {
senderId?: number;
time?: number;
senderName?: string;
messageChain?: MessageType[] | MessageChainGetable;
messageId?: MessageId;
}
/**
* @description Bot 实现的接口,其他类访问 bot.config
* 的途径,避免其他类直接访问实现,用来解耦
*/
interface BotConfigGetable {
getBaseUrl(): string;
getQQ(): number;
getVerifyKey(): string;
getSessionKey(): string;
}
// 图片 id
type ImageId = string;
// 语音 id
type VoiceId = string;
// 消息 id
type MessageId = number;
/**
* 消息类型
*
* @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/EventType.md
*/
export type MessageChainElementTypes =
| 'Source'
| 'Quote'
| 'At'
| 'AtAll'
| 'Face'
| 'Plain'
| 'Image'
| 'FlashImage'
| 'Voice'
| 'Xml'
| 'Json'
| 'App'
| 'Poke'
| 'Dice'
| 'MarketFace'
| 'MusicShare'
| 'ForwardMessage'
| 'File'
| 'MiraiCode';
interface EventBaseType {
bot: Bot;
}
// Middleware
interface Member {
id: number;
memberName: string;
specialTitle: string;
permission: GroupPermission;
joinTimestamp: number;
lastSpeakTimestamp: number;
muteTimeRemaining: number;
}
interface GroupSenderType {
id: number;
name: string;
permission: GroupPermission;
}
interface Friend {
id: number,
nickname: string,
remark: string;
}
interface EventEntityMap {
error: {
code: number;
} & EventBaseType,
close: {
reason: string;
} & EventBaseType,
'unexpected-response': {
reason: string;
} & EventBaseType,
GroupMessage: {
type: 'GroupMessage';
sender: Member & { group: GroupSenderType },
messageChain: MessageType[];
} & EventBaseType,
FriendMessage: {
type: 'FriendMessage';
messageChain: MessageType[];
sender: Friend
} & EventBaseType,
BotOnlineEvent: {
type: 'BotOnlineEvent',
qq: number
} & EventBaseType,
BotOfflineEventActive: {
type: 'BotOfflineEventActive',
qq: number
} & EventBaseType,
BotOfflineEventForce: {
type: 'BotOfflineEventForce',
qq: number
} & EventBaseType,
BotOfflineEventDropped: {
type: 'BotOfflineEventDropped',
qq: number
} & EventBaseType,
BotReloginEvent: {
type: 'BotReloginEvent',
qq: number
} & EventBaseType,
BotGroupPermissionChangeEvent: {
type: 'BotGroupPermissionChangeEvent';
origin: Exclude<GroupPermission, 'OWNER'>;
current: GroupPermission;
group: GroupSenderType;
} & EventBaseType,
BotMuteEvent: {
type: 'BotMuteEvent',
durationSeconds: number,
operator: Member & { group: GroupSenderType };
} & EventBaseType,
BotUnmuteEvent: {
type: 'BotUnmuteEvent',
durationSeconds: number,
operator: Member & { group: GroupSenderType };
} & EventBaseType,
BotJoinGroupEvent: {
type: 'BotJoinGroupEvent',
group: GroupSenderType
operator?: null | Member & { group: GroupSenderType };
};
BotLeaveEventActive: {
type: 'BotLeaveEventActive',
group: GroupSenderType
};
BotLeaveEventKick: {
type: 'BotLeaveEventKick',
group: GroupSenderType
operator: Member & { group: GroupSenderType };
} & EventBaseType;
GroupRecallEvent: {
type: 'GroupRecallEvent'
authorId: number,
messageId: number,
time: number,
group: GroupSenderType
operator: Member & { group: GroupSenderType };
} & EventBaseType;
FriendRecallEvent: {
type: 'GroupRecallEvent'
authorId: number,
messageId: number,
time: number,
operator: number
} & EventBaseType;
GroupNameChangeEvent: {
type: 'GroupNameChangeEvent',
origin: string,
current: string,
group: GroupSenderType;
operator: Member & { group: GroupSenderType };
} & EventBaseType;
GroupEntranceAnnouncementChangeEvent: {
type: 'GroupEntranceAnnouncementChangeEvent',
origin: string,
current: string,
group: GroupSenderType;
operator: Member & { group: GroupSenderType };
} & EventBaseType;
GroupMuteAllEvent: {
type: 'GroupMuteAllEvent',
origin: boolean,
current: boolean,
group: GroupSenderType;
operator: Member & { group: GroupSenderType };
} & EventBaseType;
GroupAllowAnonymousChatEvent: {
type: 'GroupAllowAnonymousChatEvent',
origin: boolean,
current: boolean,
group: GroupSenderType,
operator: Member & { group: GroupSenderType };
} & EventBaseType;
GroupAllowConfessTalkEvent: {
type: 'GroupAllowAnonymousChatEvent',
origin: boolean,
current: boolean,
group: GroupSenderType,
isByBot: boolean
} & EventBaseType;
GroupAllowMemberInviteEvent: EventBaseType;
MemberJoinEvent: {
type: 'MemberJoinEvent',
member: Member & { group: GroupSenderType },
invitor: Member;
} & EventBaseType;
MemberLeaveEventKick: {
type: 'MemberLeaveEventKick',
member: Member & { group: GroupSenderType },
operator: Member & { group: GroupSenderType },
} & EventBaseType;
MemberLeaveEventQuit: {
type: 'MemberLeaveEventQuit',
member: Member & { group: GroupSenderType },
} & EventBaseType;
MemberCardChangeEvent: {
type: 'MemberCardChangeEvent',
origin: string,
current: string,
member: Member & { group: GroupSenderType };
} & EventBaseType;
MemberSpecialTitleChangeEvent: {
type: 'MemberSpecialTitleChangeEvent',
origin: string,
current: string,
member: Member & { group: GroupSenderType };
} & EventBaseType;
MemberPermissionChangeEvent: {
type: 'MemberPermissionChangeEvent',
origin: string,
current: string,
member: Member & { group: GroupSenderType };
} & EventBaseType;
MemberMuteEvent: {
type: 'MemberMuteEvent',
durationSeconds: number,
member: Member & { group: GroupSenderType };
operator: Member & { group: GroupSenderType };
} & EventBaseType;
MemberUnmuteEvent: {
type: 'MemberUnmuteEvent',
member: Member & { group: GroupSenderType };
operator: Member & { group: GroupSenderType };
} & EventBaseType;
MemberHonorChangeEvent: {
type: 'MemberHonorChangeEvent',
member: Member & { group: GroupSenderType }
action: 'achieve' | 'lose',
honor: string;
}
NewFriendRequestEvent: {
type: 'NewFriendRequestEvent',
eventId: number,
fromId: number,
groupId: number,
nick: string,
message: string
} & EventBaseType;
MemberJoinRequestEvent: {
type: 'MemberJoinRequestEvent',
eventId: number,
fromId: number,
groupId: number,
groupName: string,
nick: string,
message: string
} & EventBaseType;
BotInvitedJoinGroupRequestEvent: {
type: 'MemberJoinRequestEvent',
eventId: number,
fromId: number,
groupId: number,
groupName: string,
nick: string,
message: string
} & EventBaseType;
}
type EventType = keyof EventEntityMap;
type Awaitable<T> = T | PromiseLike<T>;
// 群成员权限
type GroupPermission = 'OWNER' | 'ADMINISTRATOR' | 'MEMBER';
// 性别
type SEX = 'UNKNOWN' | 'MALE' | 'FEMALE';
// 消息处理器
type Processor<U extends EventType[] = [], Extend = { [key: string]: any }> = (data: EventEntityMap[ArrayToValuesUnion<U>] & Extend) => Awaitable<void | any>;
// QQ 自带表情
type FaceType =
| '惊讶' | '撇嘴' | '色' | '发呆' | '得意'
| '流泪' | '害羞' | '闭嘴' | '睡' | '大哭'
| '尴尬' | '发怒' | '调皮' | '呲牙' | '微笑'
| '难过' | '酷' | '抓狂' | '吐' | '偷笑'
| '可爱' | '白眼' | '傲慢' | '饥饿' | '困'
| '惊恐' | '流汗' | '憨笑' | '悠闲' | '奋斗'
| '咒骂' | '疑问' | '嘘' | '晕' | '折磨'
| '衰' | '骷髅' | '敲打' | '再见' | '发抖'
| '爱情' | '跳跳' | '猪头' | '拥抱' | '蛋糕'
| '闪电' | '炸弹' | '刀' | '足球' | '便便'
| '咖啡' | '饭' | '玫瑰' | '凋谢' | '爱心'
| '心碎' | '礼物' | '太阳' | '月亮' | '赞'
| '踩' | '握手' | '胜利' | '飞吻' | '怄火'
| '西瓜' | '冷汗' | '擦汗' | '抠鼻' | '鼓掌'
| '糗大了' | '坏笑' | '左哼哼' | '右哼哼' | '哈欠'
| '鄙视' | '委屈' | '快哭了' | '阴险' | '左亲亲'
| '吓' | '可怜' | '菜刀' | '啤酒' | '篮球'
| '乒乓' | '示爱' | '瓢虫' | '抱拳' | '勾引'
| '拳头' | '差劲' | '爱你' | '不' | '好'
| '转圈' | '磕头' | '回头' | '跳绳' | '挥手'
| '激动' | '街舞' | '献吻' | '左太极' | '右太极'
| '双喜' | '鞭炮' | '灯笼' | 'K歌' | '喝彩'
| '祈祷' | '爆筋' | '棒棒糖' | '喝奶' | '飞机'
| '钞票' | '药' | '手枪' | '茶' | '眨眼睛'
| '泪奔' | '无奈' | '卖萌' | '小纠结' | '喷血'
| '斜眼笑' | 'doge' | '惊喜' | '骚扰' | '笑哭'
| '我最美' | '河蟹' | '羊驼' | '幽灵' | '蛋'
| '菊花' | '红包' | '大笑' | '不开心' | '冷漠'
| '呃' | '好棒' | '拜托' | '点赞' | '无聊'
| '托脸' | '吃' | '送花' | '害怕' | '花痴'
| '小样儿' | '飙泪' | '我不看' | '托腮' | '啵啵'
| '糊脸' | '拍头' | '扯一扯' | '舔一舔' | '蹭一蹭'
| '拽炸天' | '顶呱呱' | '抱抱' | '暴击' | '开枪'
| '撩一撩' | '拍桌' | '拍手' | '恭喜' | '干杯'
| '嘲讽' | '哼' | '佛系' | '掐一掐' | '惊呆'
| '颤抖' | '啃头' | '偷看' | '扇脸' | '原谅'
| '喷脸' | '生日快乐' | '头撞击' | '甩头' | '扔狗'
| '加油必胜' | '加油抱抱' | '口罩护体' | '搬砖中' | '忙到飞起'
| '脑阔疼' | '沧桑' | '捂脸' | '辣眼睛' | '哦哟'
| '头秃' | '问号脸' | '暗中观察' | 'emm' | '吃瓜'
| '呵呵哒' | '我酸了' | '太南了' | '辣椒酱' | '汪汪'
| '汗' | '打脸' | '击掌' | '无眼笑' | '敬礼'
| '狂笑' | '面无表情' | '摸鱼' | '魔鬼笑' | '哦'
| '请' | '睁眼' | '敲开心' | '震惊' | '让我康康'
| '摸锦鲤' | '期待' | '拿到红包' | '真好' | '拜谢'
| '元宝' | '牛啊' | '胖三斤' | '好闪' | '左拜年'
| '右拜年' | '红包包' | '右亲亲' | '牛气冲天' | '喵喵'
| '求红包' | '谢红包' | '新年烟花' | '打call' | '变形'
| '嗑到了' | '仔细分析' | '加油' | '我没事' | '菜狗'
| '崇拜' | '比心' | '庆祝' | '老色痞' | '拒绝'
| '嫌弃' | '吃糖';
// 消息处理器类型
export {
// 接口
MessageChainGetable, BotConfigGetable,
// 消息类型
MessageType,
// MessageType.nodeList 的元素类型
ForwardNode,
// 图片 id 语音 id 消息 id
ImageId, VoiceId, MessageId,
// 事件类型 群成员权限 性别
EventType, EventEntityMap, GroupPermission, SEX,
// QQ 自带表情
FaceType,
Processor,
Awaitable,
};