/** 联系人 */
export interface Contact {
    /** 联系人账号 */
    readonly id: number;
}

/** 好友 */
export interface Friend extends Contact {
    /** 昵称 */
    nickname: string;
    /** 备注 */
    remark: string;
}

/** 群权限类型 */
export type GroupPermission = 'OWNER' | 'ADMINISTRATOR' | 'MEMBER';

/** 群聊 */
export interface Group extends Contact {
    /** 群名 */
    name: string;
    /** 机器人在群中权限 */
    permission: GroupPermission;
}

/** 群成员 */
export interface GroupMember extends Contact {
    /** 群成员名称 */
    memberName: string;
    /** 头衔 */
    specialTitle: string;
    /** 成员权限 */
    permission: GroupPermission;
    /** 入群时间戳 */
    joinTimestamp: number;
    /** 最近发言时间戳 */
    lastSpeakTimestamp: number;
    /** 剩余禁言时间(秒) */
    muteTimeRemaining: number;
    /** 所在群聊 */
    group: Group;
}

/** 群成员设置信息 */
export interface GroupMemberInfo {
    /** 群成员昵称 */
    name: string;
    /** 特殊称号 */
    specialTitle: string;
}

/** 平台类型 */
export type PlatformType = 'IOS' | 'MOBILE' | 'WINDOWS';

/** 其他设备 */
export interface OtherClient extends Contact {
    /** 设备标识号 */
    id: number;
    /** 设备平台 */
    platform: PlatformType;
}

/** 单一消息 */
export interface SingleMessage {
    /** 消息类型 */
    readonly type: SingleMessageType;

    /** 是否为指定类型消息(类型保护) */
    isType<T extends SingleMessageType>(this: SingleMessage, type: T): this is SingleMessageMap[T];

    /** 转化为mirai码 */
    toMiraiCode(): string;

    /** 转化为显示串 */
    toDisplayString(): string;
}

/** 原始消息链 */
export interface MessageChain extends Array<SingleMessage> {
    /** 第一个有效单一消息 */
    firstClientMessage: SingleMessage;
    /** 第一个有效单一消息 */
    f: SingleMessage;
    /** 消息 id */
    sourceId: number;
    /** 消息发送时间 */
    time: number;

    [index: number]: SingleMessage;

    /** 选择对应类型的单一消息 */
    select<T extends SingleMessageType>(type: T): this;

    /** 选择对应类型的单一消息的新消息链 */
    selected<T extends SingleMessageType>(type: T): MessageChain;

    /** 删除对应类型的单一消息 */
    drop<T extends SingleMessageType>(type: T): this;

    /** 删除对应类型的单一消息的新消息链 */
    dropped<T extends SingleMessageType>(type: T): MessageChain;

    /** 转化为mirai码 */
    toMiraiCode(): string;

    /** 转化为显示串 */
    toDisplayString(): string;
}

/** 来源型 */
export interface Source extends SingleMessage {
    type: 'Source';
    /** 消息id */
    id: number;
    /** 时间戳 */
    time: number;
}

/** 引用回复型 */
export interface Quote extends SingleMessage {
    type: 'Quote';
    /** 引用消息id */
    id: number;
    /** 群号 */
    groupId: number;
    /** 发送人QQ号 */
    senderId: number;
    /** 接收者账号 */
    targetId: number;
    /** 原始消息内容 */
    origin: SingleMessage[];
}

/** &#64;型 */
export interface At extends SingleMessage {
    type: 'At';
    /** 群成员QQ号 */
    target: number;
    /** At时显示的文字, 发送消息时无效, 自动使用群名片 */
    display: string;
}

/** &#64;全体成员型 */
export interface AtAll extends SingleMessage {
    type: 'AtAll';
}

/** 表情类型映射 */
export enum FaceType {
    JING_YA = 0,
    惊讶 = JING_YA,
    PIE_ZUI = 1,
    撇嘴 = PIE_ZUI,
    SE = 2,
    色 = SE,
    FA_DAI = 3,
    发呆 = FA_DAI,
    DE_YI = 4,
    得意 = DE_YI,
    LIU_LEI = 5,
    流泪 = LIU_LEI,
    HAI_XIU = 6,
    害羞 = HAI_XIU,
    BI_ZUI = 7,
    闭嘴 = BI_ZUI,
    SHUI = 8,
    睡 = SHUI,
    DA_KU = 9,
    大哭 = DA_KU,
    GAN_GA = 10,
    尴尬 = GAN_GA,
    FA_NU = 11,
    发怒 = FA_NU,
    TIAO_PI = 12,
    调皮 = TIAO_PI,
    ZI_YA = 13,
    呲牙 = ZI_YA,
    WEI_XIAO = 14,
    微笑 = WEI_XIAO,
    NAN_GUO = 15,
    难过 = NAN_GUO,
    KU = 16,
    酷 = KU,
    ZHUA_KUANG = 18,
    抓狂 = ZHUA_KUANG,
    TU = 19,
    吐 = TU,
    TOU_XIAO = 20,
    偷笑 = TOU_XIAO,
    KE_AI = 21,
    可爱 = KE_AI,
    BAI_YAN = 22,
    白眼 = BAI_YAN,
    AO_MAN = 23,
    傲慢 = AO_MAN,
    JI_E = 24,
    饥饿 = JI_E,
    KUN = 25,
    困 = KUN,
    JING_KONG = 26,
    惊恐 = JING_KONG,
    LIU_HAN = 27,
    流汗 = LIU_HAN,
    HAN_XIAO = 28,
    憨笑 = HAN_XIAO,
    YOU_XIAN = 29,
    悠闲 = YOU_XIAN,
    FEN_DOU = 30,
    奋斗 = FEN_DOU,
    ZHOU_MA = 31,
    咒骂 = ZHOU_MA,
    YI_WEN = 32,
    疑问 = YI_WEN,
    XU = 33,
    嘘 = XU,
    YUN = 34,
    晕 = YUN,
    ZHE_MO = 35,
    折磨 = ZHE_MO,
    SHUAI = 36,
    衰 = SHUAI,
    KU_LOU = 37,
    骷髅 = KU_LOU,
    QIAO_DA = 38,
    敲打 = QIAO_DA,
    ZAI_JIAN = 39,
    再见 = ZAI_JIAN,
    FA_DOU = 41,
    发抖 = FA_DOU,
    AI_QING = 42,
    爱情 = AI_QING,
    TIAO_TIAO = 43,
    跳跳 = TIAO_TIAO,
    ZHU_TOU = 46,
    猪头 = ZHU_TOU,
    YONG_BAO = 49,
    拥抱 = YONG_BAO,
    DAN_GAO = 53,
    蛋糕 = DAN_GAO,
    SHAN_DIAN = 54,
    闪电 = SHAN_DIAN,
    ZHA_DAN = 55,
    炸弹 = ZHA_DAN,
    DAO = 56,
    刀 = DAO,
    ZU_QIU = 57,
    足球 = ZU_QIU,
    BIAN_BIAN = 59,
    便便 = BIAN_BIAN,
    KA_FEI = 60,
    咖啡 = KA_FEI,
    FAN = 61,
    饭 = FAN,
    MEI_GUI = 63,
    玫瑰 = MEI_GUI,
    DIAO_XIE = 64,
    凋谢 = DIAO_XIE,
    AI_XIN = 66,
    爱心 = AI_XIN,
    XIN_SUI = 67,
    心碎 = XIN_SUI,
    LI_WU = 69,
    礼物 = LI_WU,
    TAI_YANG = 74,
    太阳 = TAI_YANG,
    YUE_LIANG = 75,
    月亮 = YUE_LIANG,
    ZAN = 76,
    赞 = ZAN,
    CAI = 77,
    踩 = CAI,
    WO_SHOU = 78,
    握手 = WO_SHOU,
    SHENG_LI = 79,
    胜利 = SHENG_LI,
    FEI_WEN = 85,
    飞吻 = FEI_WEN,
    OU_HUO = 86,
    怄火 = OU_HUO,
    XI_GUA = 89,
    西瓜 = XI_GUA,
    LENG_HAN = 96,
    冷汗 = LENG_HAN,
    CA_HAN = 97,
    擦汗 = CA_HAN,
    KOU_BI = 98,
    抠鼻 = KOU_BI,
    GU_ZHANG = 99,
    鼓掌 = GU_ZHANG,
    QIU_DA_LE = 100,
    糗大了 = QIU_DA_LE,
    HUAI_XIAO = 101,
    坏笑 = HUAI_XIAO,
    ZUO_HENG_HENG = 102,
    左哼哼 = ZUO_HENG_HENG,
    YOU_HENG_HENG = 103,
    右哼哼 = YOU_HENG_HENG,
    HA_QIAN = 104,
    哈欠 = HA_QIAN,
    BI_SHI = 105,
    鄙视 = BI_SHI,
    WEI_QU = 106,
    委屈 = WEI_QU,
    KUAI_KU_LE = 107,
    快哭了 = KUAI_KU_LE,
    YIN_XIAN = 108,
    阴险 = YIN_XIAN,
    QIN_QIN = 109,
    亲亲 = QIN_QIN,
    XIA = 110,
    吓 = XIA,
    KE_LIAN = 111,
    可怜 = KE_LIAN,
    CAI_DAO = 112,
    菜刀 = CAI_DAO,
    PI_JIU = 113,
    啤酒 = PI_JIU,
    LAN_QIU = 114,
    篮球 = LAN_QIU,
    PING_PANG = 115,
    乒乓 = PING_PANG,
    SHI_AI = 116,
    示爱 = SHI_AI,
    PIAO_CHONG = 117,
    瓢虫 = PIAO_CHONG,
    BAO_QUAN = 118,
    抱拳 = BAO_QUAN,
    GOU_YIN = 119,
    勾引 = GOU_YIN,
    QUAN_TOU = 120,
    拳头 = QUAN_TOU,
    CHA_JIN = 121,
    差劲 = CHA_JIN,
    AI_NI = 122,
    爱你 = AI_NI,
    NO = 123,
    BU = NO,
    不 = NO,
    OK = 124,
    HAO = OK,
    好 = OK,
    ZHUAN_QUAN = 125,
    转圈 = ZHUAN_QUAN,
    KE_TOU = 126,
    磕头 = KE_TOU,
    HUI_TOU = 127,
    回头 = HUI_TOU,
    TIAO_SHENG = 128,
    跳绳 = TIAO_SHENG,
    HUI_SHOU = 129,
    挥手 = HUI_SHOU,
    JI_DONG = 130,
    激动 = JI_DONG,
    JIE_WU = 131,
    街舞 = JIE_WU,
    XIAN_WEN = 132,
    献吻 = XIAN_WEN,
    ZUO_TAI_JI = 133,
    左太极 = ZUO_TAI_JI,
    YOU_TAI_JI = 134,
    右太极 = YOU_TAI_JI,
    SHUANG_XI = 136,
    双喜 = SHUANG_XI,
    BIAN_PAO = 137,
    鞭炮 = BIAN_PAO,
    DENG_LONG = 138,
    灯笼 = DENG_LONG,
    K_GE = 140,
    K歌 = K_GE,
    HE_CAI = 144,
    喝彩 = HE_CAI,
    QI_DAO = 145,
    祈祷 = QI_DAO,
    BAO_JIN = 146,
    爆筋 = BAO_JIN,
    BANG_BANG_TANG = 147,
    棒棒糖 = BANG_BANG_TANG,
    HE_NAI = 148,
    喝奶 = HE_NAI,
    FEI_JI = 151,
    飞机 = FEI_JI,
    CHAO_PIAO = 158,
    钞票 = CHAO_PIAO,
    YAO = 168,
    药 = YAO,
    SHOU_QIANG = 169,
    手枪 = SHOU_QIANG,
    CHA = 171,
    茶 = CHA,
    ZHA_YAN_JING = 172,
    眨眼睛 = ZHA_YAN_JING,
    LEI_BEN = 173,
    泪奔 = LEI_BEN,
    WU_NAI = 174,
    无奈 = WU_NAI,
    MAI_MENG = 175,
    卖萌 = MAI_MENG,
    XIAO_JIU_JIE = 176,
    小纠结 = XIAO_JIU_JIE,
    PEN_XIE = 177,
    喷血 = PEN_XIE,
    XIE_YAN_XIAO = 178,
    斜眼笑 = XIE_YAN_XIAO,
    doge = 179,
    JING_XI = 180,
    惊喜 = JING_XI,
    SAO_RAO = 181,
    骚扰 = SAO_RAO,
    XIAO_KU = 182,
    笑哭 = XIAO_KU,
    WO_ZUI_MEI = 183,
    我最美 = WO_ZUI_MEI,
    HE_XIE = 184,
    河蟹 = HE_XIE,
    YANG_TUO = 185,
    羊驼 = YANG_TUO,
    YOU_LING = 187,
    幽灵 = YOU_LING,
    DAN = 188,
    蛋 = DAN,
    JU_HUA = 190,
    菊花 = JU_HUA,
    HONG_BAO = 192,
    红包 = HONG_BAO,
    DA_XIAO = 193,
    大笑 = DA_XIAO,
    BU_KAI_XIN = 194,
    不开心 = BU_KAI_XIN,
    LENG_MO = 197,
    冷漠 = LENG_MO,
    E = 198,
    呃 = E,
    HAO_BANG = 199,
    好棒 = HAO_BANG,
    BAI_TUO = 200,
    拜托 = BAI_TUO,
    DIAN_ZAN = 201,
    点赞 = DIAN_ZAN,
    WU_LIAO = 202,
    无聊 = WU_LIAO,
    TUO_LIAN = 203,
    托脸 = TUO_LIAN,
    CHI = 204,
    吃 = CHI,
    SONG_HUA = 205,
    送花 = SONG_HUA,
    HAI_PA = 206,
    害怕 = HAI_PA,
    HUA_CHI = 207,
    花痴 = HUA_CHI,
    XIAO_YANG_ER = 208,
    小样儿 = XIAO_YANG_ER,
    BIAO_LEI = 210,
    飙泪 = BIAO_LEI,
    WO_BU_KAN = 211,
    我不看 = WO_BU_KAN,
    TUO_SAI = 212,
    托腮 = TUO_SAI,
    BO_BO = 214,
    啵啵 = BO_BO,
    HU_LIAN = 215,
    糊脸 = HU_LIAN,
    PAI_TOU = 216,
    拍头 = PAI_TOU,
    CHE_YI_CHE = 217,
    扯一扯 = CHE_YI_CHE,
    TIAN_YI_TIAN = 218,
    舔一舔 = TIAN_YI_TIAN,
    CENG_YI_CENG = 219,
    蹭一蹭 = CENG_YI_CENG,
    ZHUAI_ZHA_TIAN = 220,
    拽炸天 = ZHUAI_ZHA_TIAN,
    DING_GUA_GUA = 221,
    顶呱呱 = DING_GUA_GUA,
    BAO_BAO = 222,
    抱抱 = BAO_BAO,
    BAO_JI = 223,
    暴击 = BAO_JI,
    KAI_QIANG = 224,
    开枪 = KAI_QIANG,
    LIAO_YI_LIAO = 225,
    撩一撩 = LIAO_YI_LIAO,
    PAI_ZHUO = 226,
    拍桌 = PAI_ZHUO,
    PAI_SHOU = 227,
    拍手 = PAI_SHOU,
    GONG_XI = 228,
    恭喜 = GONG_XI,
    GAN_BEI = 229,
    干杯 = GAN_BEI,
    CHAO_FENG = 230,
    嘲讽 = CHAO_FENG,
    HENG = 231,
    哼 = HENG,
    FO_XI = 232,
    佛系 = FO_XI,
    QIA_YI_QIA = 233,
    掐一掐 = QIA_YI_QIA,
    JING_DAI = 234,
    惊呆 = JING_DAI,
    CHAN_DOU = 235,
    颤抖 = CHAN_DOU,
    KEN_TOU = 236,
    啃头 = KEN_TOU,
    TOU_KAN = 237,
    偷看 = TOU_KAN,
    SHAN_LIAN = 238,
    扇脸 = SHAN_LIAN,
    YUAN_LIANG = 239,
    原谅 = YUAN_LIANG,
    PEN_LIAN = 240,
    喷脸 = PEN_LIAN,
    SHENG_RI_KUAI_LE = 241,
    生日快乐 = SHENG_RI_KUAI_LE,
    TOU_ZHUANG_JI = 242,
    头撞击 = TOU_ZHUANG_JI,
    SHUAI_TOU = 243,
    甩头 = SHUAI_TOU,
    RENG_GOU = 244,
    扔狗 = RENG_GOU,
    JIA_YOU_BI_SHENG = 245,
    加油必胜 = JIA_YOU_BI_SHENG,
    JIA_YOU_BAO_BAO = 246,
    加油抱抱 = JIA_YOU_BAO_BAO,
    KOU_ZHAO_HU_TI = 247,
    口罩护体 = KOU_ZHAO_HU_TI,
    BAN_ZHUAN_ZHONG = 260,
    搬砖中 = BAN_ZHUAN_ZHONG,
    MANG_DAO_FEI_QI = 261,
    忙到飞起 = MANG_DAO_FEI_QI,
    NAO_KUO_TENG = 262,
    脑阔疼 = NAO_KUO_TENG,
    CANG_SANG = 263,
    沧桑 = CANG_SANG,
    WU_LIAN = 264,
    捂脸 = WU_LIAN,
    LA_YAN_JING = 265,
    辣眼睛 = LA_YAN_JING,
    O_YO = 266,
    哦哟 = O_YO,
    TOU_TU = 267,
    头秃 = TOU_TU,
    WEN_HAO_LIAN = 268,
    问号脸 = WEN_HAO_LIAN,
    AN_ZHONG_GUAN_CHA = 269,
    暗中观察 = AN_ZHONG_GUAN_CHA,
    EMM = 270,
    emm = EMM,
    CHI_GUA = 271,
    吃瓜 = CHI_GUA,
    HE_HE_DA = 272,
    呵呵哒 = HE_HE_DA,
    WO_SUAN_LE = 273,
    我酸了 = WO_SUAN_LE,
    TAI_NAN_LE = 274,
    太南了 = TAI_NAN_LE,
    LA_JIAO_JIANG = 276,
    辣椒酱 = LA_JIAO_JIANG,
    WANG_WANG = 277,
    汪汪 = WANG_WANG,
    HAN = 278,
    汗 = HAN,
    DA_LIAN = 279,
    打脸 = DA_LIAN,
    JI_ZHANG = 280,
    击掌 = JI_ZHANG,
    WU_YAN_XIAO = 281,
    无眼笑 = WU_YAN_XIAO,
    JING_LI = 282,
    敬礼 = JING_LI,
    KUANG_XIAO = 283,
    狂笑 = KUANG_XIAO,
    MIAN_WU_BIAO_QING = 284,
    面无表情 = MIAN_WU_BIAO_QING,
    MO_YU = 285,
    摸鱼 = MO_YU,
    MO_GUI_XIAO = 286,
    魔鬼笑 = MO_GUI_XIAO,
    O = 287,
    哦 = O,
    QING = 288,
    请 = QING,
    ZHENG_YAN = 289,
    睁眼 = ZHENG_YAN
}

/** 表情型 */
export interface Face extends SingleMessage {
    type: 'Face';
    /** 表情id */
    faceId: FaceType | number;
    /** 表情名称 */
    name: string;
}

/** 普通文本型 */
export interface Plain extends SingleMessage {
    type: 'Plain';
    /** 文本内容 */
    text: string;
}

/** 图片型 */
export interface Image extends SingleMessage {
    type: 'Image';
    /** 图片id */
    imageId: string;
    /** 图片链接 */
    url: string;
    /** 图片文件路径 */
    path?: string;
    /** 图片Base64编码 */
    base64?: string;
}

/** 闪图型 */
export interface FlashImage extends SingleMessage {
    type: 'FlashImage';
    /** 图片id */
    imageId: string;
    /** 图片链接 */
    url: string;
    /** 图片文件路径 */
    path?: string;
    /** 图片Base64编码 */
    base64?: string;
}

/** 语音型 */
export interface Voice extends SingleMessage {
    type: 'Voice';
    /** 语音id */
    voiceId: string;
    /** 语音文件路径 */
    path?: string;
    /** 语音Base64编码 */
    base64?: string;
    /** 返回的语音长度 */
    length?: number;
}

/** XML型 */
export interface Xml extends SingleMessage {
    type: 'Xml';
    /** XML内容 */
    xml: string;
}

/** JSON型 */
export interface Json extends SingleMessage {
    type: 'Json';
    /** JSON内容 */
    json: string;
}

/** 小程序型 */
export interface App extends SingleMessage {
    type: 'App';
    /** 小程序内容(Json格式) */
    content: string;
}

/** 戳一戳类型 */
export type PokeType = 'Poke' | 'ShowLove' | 'Like' | 'Heartbroken' | 'SixSixSix' | 'FangDaZhao';

/** 戳一戳型 */
export interface Poke extends SingleMessage {
    type: 'Poke';
    /** 戳一戳名称 */
    name: PokeType;
}

/** 骰子型 */
export interface Dice extends SingleMessage {
    type: 'Dice';
    /** 骰子数值 */
    value: number;
}

/** 音乐分享型 */
export interface MusicShare extends SingleMessage {
    type: 'MusicShare',
    /** 音乐分享类型 */
    kind: string;
    /** 标题 */
    title: string;
    /** 概括 */
    summary: string;
    /** 跳转链接 */
    jumpUrl: string;
    /** 封面图片链接 */
    pictureUrl: string;
    /** 音乐播放链接 */
    musicUrl: string;
    /** 简介 */
    brief: string;
}

/** 合并转发结点 */
export interface ForwardNode {
    /** 发送人QQ号 */
    senderId: number;
    /** 发送时间戳 */
    time: number;
    /** 发送人名称 */
    senderName: string;
    /** 消息链 */
    messageChain: SingleMessage[];
    /** 消息id */
    messageId?: number;
}

/** 合并转发型 */
export interface Forward extends SingleMessage {
    type: 'Forward';
    /** 结点列表 */
    nodeList: ForwardNode[];
}

/** 文件型 */
export interface File extends SingleMessage {
    type: 'File';
    /** 文件id */
    id: string;
    /** 文件名 */
    name: string;
    /** 文件大小 */
    size: number;
}

/** 商店表情型 */
export interface MarketFace extends SingleMessage {
    type: 'MarketFace';
    /** 表情id */
    id: number;
    /** 表情名称 */
    name: string;
}

/** mirai码型 */
export interface MiraiCode extends SingleMessage {
    type: 'MiraiCode';
    /** mirai码 */
    code: string;
}

/** 单一消息类型映射 */
export type SingleMessageMap = {
    Source: Source,
    Quote: Quote,
    At: At,
    AtAll: AtAll,
    Face: Face,
    Plain: Plain,
    Image: Image,
    FlashImage: FlashImage,
    Voice: Voice,
    Xml: Xml,
    Json: Json,
    App: App,
    Poke: Poke,
    Dice: Dice,
    MusicShare: MusicShare,
    Forward: Forward,
    File: File,
    MarketFace: MarketFace,
    MiraiCode: MiraiCode
};

/** 单一消息类型 */
export type SingleMessageType = keyof SingleMessageMap;

/** mirai事件 */
export interface Event {
    /** 事件类型 */
    readonly type: EventType;
}

/** 机器人事件 */
export interface BotEvent extends Event {
    /** 机器人QQ号 */
    qq: number;
}

/** 好友事件 */
export interface FriendEvent extends Event {
    /** 好友 */
    friend: Friend;
}

/** 群聊事件 */
export interface GroupEvent extends Event {
    /** 群聊 */
    group?: Group;
    /** 操作人(自己时为null) */
    operator?: GroupMember;
}

/** 群成员事件 */
export interface MemberEvent extends Event {
    /** 群成员 */
    member: GroupMember;
}

/** 请求事件 */
export interface RequestEvent extends Event {
    /** 事件id */
    eventId: number;
    /** 事件来源QQ号 */
    fromId: number;
    /** 事件对应群号 */
    groupId: number;
    /** 事件对应人昵称 */
    nick: string;
    /** 事件对应消息 */
    message: string;
}

/** 指令事件 */
export interface CommandEvent extends Event {
    /** 指令名 */
    name: string;
}

/** 其他设备事件 */
export interface OtherClientEvent extends Event {
    /** 其他设备 */
    client: OtherClient;
}

/** Bot登录成功事件 */
export interface BotOnlineEvent extends BotEvent {
    type: 'BotOnlineEvent';
}

/** Bot主动离线事件 */
export interface BotOfflineEventActive extends BotEvent {
    type: 'BotOfflineEventActive';
}

/** Bot被挤下线事件 */
export interface BotOfflineEventForce extends BotEvent {
    type: 'BotOfflineEventForce';
}

/** Bot被服务器断开或因网络问题而掉线事件 */
export interface BotOfflineEventDropped extends BotEvent {
    type: 'BotOfflineEventDropped';
}

/** Bot主动重新登录事件 */
export interface BotReloginEvent extends BotEvent {
    type: 'BotReloginEvent';
}

/** 好友输入状态改变事件 */
export interface FriendInputStatusChangedEvent extends FriendEvent {
    type: 'FriendInputStatusChangedEvent';
    /** 是否正在输入 */
    inputting: boolean;
}

/** 好友昵称改变事件 */
export interface FriendNickChangedEvent extends FriendEvent {
    type: 'FriendNickChangedEvent';
    /** 原昵称 */
    from: string;
    /** 新昵称 */
    to: string;
}

/** 好友消息撤回事件 */
export interface FriendRecallEvent extends FriendEvent {
    type: 'FriendRecallEvent';
    /** 消息发送者QQ号 */
    authorId: number;
    /** 消息id */
    messageId: number;
    /** 消息发送时间戳 */
    time: number;
    /** 撤回消息者QQ号 */
    operator: number;
}

/** Bot在群里的权限被改变事件, 操作人一定是群主 */
export interface BotGroupPermissionChangeEvent extends GroupEvent {
    type: 'BotGroupPermissionChangeEvent';
    /** 原权限 */
    origin: GroupPermission;
    /** 新权限 */
    current: GroupPermission;
    group: Group;
}

/** Bot被禁言事件 */
export interface BotMuteEvent extends GroupEvent {
    type: 'BotMuteEvent';
    /** 禁言时长(秒) */
    durationSeconds: number;
    operator: GroupMember;
}

/** Bot被取消禁言事件 */
export interface BotUnmuteEvent extends GroupEvent {
    type: 'BotUnmuteEvent',
    operator: GroupMember;
}

/** Bot加入了一个新群事件 */
export interface BotJoinGroupEvent extends GroupEvent {
    type: 'BotJoinGroupEvent';
    group: Group;
    /** 邀请人 */
    invitor?: GroupMember;
}

/** Bot主动退出一个群事件 */
export interface BotLeaveEventActive extends GroupEvent {
    type: 'BotLeaveEventActive';
    group: Group;
}

/** Bot被踢出一个群事件 */
export interface BotLeaveEventKick extends GroupEvent {
    type: 'BotLeaveEventKick';
    group: Group;
    /** 操作人 */
    operator?: GroupMember;
}

/** 群消息撤回事件 */
export interface GroupRecallEvent extends GroupEvent {
    type: 'GroupRecallEvent';
    /** 消息发送者QQ号 */
    authorId: number;
    /** 消息id */
    messageId: number;
    /** 消息发送时间戳 */
    time: number;
    group: Group;
    operator?: GroupMember;
}

/** 群名改变事件 */
export interface GroupNameChangeEvent extends GroupEvent {
    type: 'GroupNameChangeEvent';
    /** 原群名 */
    origin: string;
    /** 新群名 */
    current: string;
    group: Group;
    operator?: GroupMember;
}

/** 入群公告改变事件 */
export interface GroupEntranceAnnouncementChangeEvent extends GroupEvent {
    type: 'GroupEntranceAnnouncementChangeEvent';
    /** 原公告 */
    origin: string;
    /** 新公告 */
    current: string;
    group: Group;
    operator?: GroupMember;
}

/** 全员禁言事件 */
export interface GroupMuteAllEvent extends GroupEvent {
    type: 'GroupMuteAllEvent';
    /** 原本是否处于禁言状态 */
    origin: boolean;
    /** 现在是否处于禁言状态 */
    current: boolean;
    group: Group;
    operator?: GroupMember;
}

/** 匿名聊天改变事件 */
export interface GroupAllowAnonymousChatEvent extends GroupEvent {
    type: 'GroupAllowAnonymousChatEvent';
    /** 原本是否允许 */
    origin: boolean;
    /** 现在是否允许 */
    current: boolean;
    group: Group;
    operator?: GroupMember;
}

/** 坦白说改变事件 */
export interface GroupAllowConfessTalkEvent extends GroupEvent {
    type: 'GroupAllowConfessTalkEvent';
    /** 原本是否允许 */
    origin: boolean;
    /** 现在是否允许 */
    current: boolean;
    group: Group;
    isMyBot: boolean;
}

/** 允许群员邀请好友加群改变事件 */
export interface GroupAllowMemberInviteEvent extends GroupEvent {
    type: 'GroupAllowMemberInviteEvent';
    /** 原本是否允许 */
    origin: boolean;
    /** 现在是否允许 */
    current: boolean;
    group: Group;
    operator?: GroupMember;
}

/** 新人入群事件 */
export interface MemberJoinEvent extends MemberEvent {
    type: 'MemberJoinEvent';
    /** 邀请人 */
    invitor?: GroupMember;
}

/** 群成员被踢出群事件, 该成员不是Bot */
export interface MemberLeaveEventKick extends MemberEvent {
    type: 'MemberLeaveEventKick';
    operator?: GroupMember;
}

/** 群成员主动离群事件, 该成员不是Bot */
export interface MemberLeaveEventQuit extends MemberEvent {
    type: 'MemberLeaveEventQuit';
}

/** 群名片改动事件 */
export interface MemberCardChangeEvent extends MemberEvent {
    type: 'MemberCardChangeEvent';
    /** 原名片 */
    origin: string;
    /** 新名片 */
    current: string;
    operator?: GroupMember;
}

/** 群头衔改动事件, 只有群主有操作限权 */
export interface MemberSpecialTitleChangeEvent extends MemberEvent {
    type: 'MemberSpecialTitleChangeEvent';
    /** 原头衔 */
    origin: string;
    /** 新头衔 */
    current: string;
}

/** 群成员权限改变事件, 该成员不是Bot */
export interface MemberPermissionChangeEvent extends MemberEvent {
    type: 'MemberPermissionChangeEvent';
    /** 原权限 */
    origin: GroupPermission;
    /** 新权限 */
    current: GroupPermission;
}

/** 群成员被禁言事件, 该成员不是Bot */
export interface MemberMuteEvent extends MemberEvent {
    type: 'MemberMuteEvent';
    /** 禁言时长(秒) */
    durationSeconds: number;
    operator?: GroupMember;
}

/** 群成员被取消禁言事件, 该成员不是Bot */
export interface MemberUnmuteEvent extends MemberEvent {
    type: 'MemberUnmuteEvent';
    operator?: GroupMember;
}

/** 群成员称号改变事件 */
export interface MemberHonorChangeEvent extends MemberEvent {
    type: 'MemberHonorChangeEvent';
    /** 称号变化行为(achieve - 获得称号, lose - 失去称号) */
    action: string;
    /** 称号 */
    honor: 'achieve' | 'lose';
}

/** 添加好友申请事件 */
export interface NewFriendRequestEvent extends RequestEvent {
    type: 'NewFriendRequestEvent';
}

/** 用户入群申请事件 */
export interface MemberJoinRequestEvent extends RequestEvent {
    type: 'MemberJoinRequestEvent';
    /** 群名称 */
    groupName: string;
}

/** Bot被邀请入群申请事件 */
export interface BotInvitedJoinGroupRequestEvent extends RequestEvent {
    type: 'BotInvitedJoinGroupRequestEvent';
    /** 群名称 */
    groupName: string;
}

/** 命令被执行事件 */
export interface CommandExecutedEvent extends CommandEvent {
    type: 'CommandExecutedEvent';
    /** 发送命令的好友 */
    friend?: Friend;
    /** 发送命令的群成员 */
    member?: GroupMember;
    /** 指令的参数 */
    args: SingleMessage[];
}

/** 其他设备上线事件 */
export interface OtherClientOnlineEvent extends OtherClientEvent {
    type: 'OtherClientOnlineEvent';
    /** 设备详细类型 */
    kind?: number;
}

/** 其他设备下线事件 */
export interface OtherClientOfflineEvent extends OtherClientEvent {
    type: 'OtherClientOfflineEvent';
}

/** 头像戳一戳类型 */
export type NudgeKind = 'Stranger' | 'Friend' | 'Group';

/** 头像戳一戳接收人 */
export interface NudgeSubject {
    /** 接收人账号 */
    id: number;
    /** 头像戳一戳类型("Stranger" | "Friend" | "Group") */
    kind: NudgeKind;
}

/** 头像戳一戳事件 */
export interface NudgeEvent extends Event {
    type: 'NudgeEvent';
    /** 发送人账号 */
    fromId: number;
    /** 头像戳一戳目标账号 */
    target: number;
    /** 头像戳一戳接收人 */
    subject: NudgeSubject;
    /**
     * 戳一戳动作
     * @example
     * "戳了戳"
     * "捏了捏"
     */
    action: string;
    /**
     * 戳一戳后缀
     * @example
     * "的脸"
     * "的头"
     */
    suffix: string;
}

/** 未知事件 */
export interface UnknownEvent extends Event {
    type: 'UnknownEvent';
    data: object;
}

export type EventMap = {
    BotOnlineEvent: BotOnlineEvent,
    BotOfflineEventActive: BotOfflineEventActive,
    BotOfflineEventForce: BotOfflineEventForce,
    BotOfflineEventDropped: BotOfflineEventDropped,
    BotReloginEvent: BotReloginEvent,
    FriendInputStatusChangedEvent: FriendInputStatusChangedEvent,
    FriendNickChangedEvent: FriendNickChangedEvent,
    FriendRecallEvent: FriendRecallEvent,
    BotGroupPermissionChangeEvent: BotGroupPermissionChangeEvent,
    BotMuteEvent: BotMuteEvent,
    BotUnmuteEvent: BotUnmuteEvent,
    BotJoinGroupEvent: BotJoinGroupEvent,
    BotLeaveEventActive: BotLeaveEventActive,
    BotLeaveEventKick: BotLeaveEventKick,
    GroupRecallEvent: GroupRecallEvent,
    GroupNameChangeEvent: GroupNameChangeEvent,
    GroupEntranceAnnouncementChangeEvent: GroupEntranceAnnouncementChangeEvent,
    GroupMuteAllEvent: GroupMuteAllEvent,
    GroupAllowAnonymousChatEvent: GroupAllowAnonymousChatEvent,
    GroupAllowConfessTalkEvent: GroupAllowConfessTalkEvent,
    GroupAllowMemberInviteEvent: GroupAllowMemberInviteEvent,
    MemberJoinEvent: MemberJoinEvent,
    MemberLeaveEventKick: MemberLeaveEventKick,
    MemberLeaveEventQuit: MemberLeaveEventQuit,
    MemberCardChangeEvent: MemberCardChangeEvent,
    MemberSpecialTitleChangeEvent: MemberSpecialTitleChangeEvent,
    MemberPermissionChangeEvent: MemberPermissionChangeEvent,
    MemberMuteEvent: MemberMuteEvent,
    MemberUnmuteEvent: MemberUnmuteEvent,
    MemberHonorChangeEvent: MemberHonorChangeEvent,
    NewFriendRequestEvent: NewFriendRequestEvent,
    MemberJoinRequestEvent: MemberJoinRequestEvent,
    BotInvitedJoinGroupRequestEvent: BotInvitedJoinGroupRequestEvent,
    CommandExecutedEvent: CommandExecutedEvent,
    OtherClientOnlineEvent: OtherClientOnlineEvent,
    OtherClientOfflineEvent: OtherClientOfflineEvent,
    NudgeEvent: NudgeEvent,
    UnknownEvent: UnknownEvent
}

/** mirai事件类型 */
export type EventType = keyof EventMap;

/** mirai 聊天消息 */
export interface ChatMessage {
    /** 聊天消息类型 */
    readonly type: ChatMessageType;
    /** 消息发送人 */
    sender: Contact;
    /** 消息链 */
    messageChain: MessageChain;
}

/** 好友聊天消息 */
export interface FriendMessage extends ChatMessage {
    type: 'FriendMessage';
    sender: Friend;
}

/** 群聊聊天消息 */
export interface GroupMessage extends ChatMessage {
    type: 'GroupMessage';
    sender: GroupMember;
}

/** 临时聊天消息 */
export interface TempMessage extends ChatMessage {
    type: 'TempMessage';
    sender: GroupMember;
}

/** 陌生人聊天消息 */
export interface StrangerMessage extends ChatMessage {
    type: 'StrangerMessage';
    sender: Friend;
}

/** 其他设备聊天消息 */
export interface OtherClientMessage extends ChatMessage {
    type: 'OtherClientMessage';
    sender: OtherClient;
}

/** 聊天消息映射 */
export type ChatMessageMap = {
    FriendMessage: FriendMessage,
    GroupMessage: GroupMessage,
    TempMessage: TempMessage,
    StrangerMessage: StrangerMessage,
    OtherClientMessage: OtherClientMessage
}

/** 聊天消息类型 */
export type ChatMessageType = keyof ChatMessageMap;

/** mirai 同步消息 */
export interface SyncMessage {
    /** 同步消息类型 */
    readonly type: SyncMessageType;
    /** 消息目标 */
    subject: Friend | Group | GroupMember;
    /** 消息链 */
    messageChain: MessageChain;
}

/** 好友同步消息 */
export interface FriendSyncMessage extends SyncMessage {
    type: 'FriendSyncMessage';
    subject: Friend;
}

/** 群同步消息 */
export interface GroupSyncMessage extends SyncMessage {
    type: 'GroupSyncMessage';
    subject: Group;
}

/** 群临时同步消息 */
export interface TempSyncMessage extends SyncMessage {
    type: 'TempSyncMessage';
    subject: GroupMember;
}

/** 陌生人同步消息 */
export interface StrangerSyncMessage extends SyncMessage {
    type: 'StrangerSyncMessage';
    subject: Friend;
}

/** 同步消息映射 */
export type SyncMessageMap = {
    FriendSyncMessage: FriendSyncMessage,
    GroupSyncMessage: GroupSyncMessage,
    TempSyncMessage: TempSyncMessage,
    StrangerSyncMessage: StrangerSyncMessage
}

/** 同步消息类型 */
export type SyncMessageType = keyof SyncMessageMap;

/** 个人资料性别类型 */
export type SexType = 'UNKNOWN' | 'MALE' | 'FEMALE';

/** 个人资料 */
export interface Profile {
    /** 昵称 */
    nickname: string;
    /** 邮箱地址 */
    email: string;
    /** 年龄 */
    age: number;
    /** 等级 */
    level: number;
    /** 个性签名 */
    sign: string;
    /** 性别 */
    sex: SexType;
}

/** 文件概览 */
export interface FileOverview {
    /** 文件名 */
    name: string;
    /** 文件id */
    id: string;
    /** 文件路径 */
    path: string;
    /** 上级文件 */
    parent?: FileOverview;
    /** 文件所属Contact */
    contact: Contact;
    /** 是否为文件 */
    isFile: boolean;
    /** 是否为文件夹 */
    isDirectory: boolean;
    /** 文件下载信息 */
    downloadInfo?: {
        /** 文件sha1 */
        sha1: string;
        /** 文件md5 */
        md5: string;
        /** 下载次数 */
        downloadTimes: number;
        /** 上传人QQ号 */
        uploaderId: number;
        /** 上传时间戳 */
        uploadTime: number;
        /** 最近更改时间戳 */
        lastModifyTime: number;
        /** 文件下载链接 */
        url: string;
    }
}

/** 群设置 */
export interface GroupConfig {
    /** 群名 */
    name: string;
    /** 是否开启坦白说 */
    confessTalk: boolean;
    /** 是否允许群员邀请 */
    allowMemberInvite: boolean;
    /** 是否开启自动审批入群 */
    autoApprove: boolean;
    /** 是否允许匿名聊天 */
    anonymousChat: boolean;
}

/** 群公告 */
export interface GroupAnnouncement {
    /** 群对象 */
    group: Group;
    /** 群公告内容 */
    content: string;
    /** 公告发送人 */
    senderId: number;
    /** 公告唯一ID */
    fid: string;
    /** 是否所有群成员已确认 */
    allConfirmed: boolean;
    /** 确认群成员人数 */
    confirmedMembersCount: number;
    /** 发布时间 */
    publicationTime: number;
}

/** 群公告发布 */
export interface PostGroupAnnouncement {
    /** 内容 */
    content: string;
    /** 是否发送给新成员 */
    sendToNewMember?: boolean;
    /** 是否置顶 */
    pinned?: boolean;
    /** 是否显示群成员修改群名片的引导 */
    showEditCard?: boolean;
    /** 是否自动弹出 */
    showPopup?: boolean;
    /** 是否需要群成员确认 */
    requireConfirmation?: boolean;
    /** 公告图片url */
    imageUrl?: string;
    /** 公告图片本地路径 */
    imagePath?: string;
    /**  公告图片base64编码 */
    imageBase64?: string;
}

/** mirai-api-http请求返回的状态码 */
export enum ResponseCode {
    /** 正常 */
    Success = 0,
    /** 错误的verify key */
    WrongVerifyKey = 1,
    /** 指定的Bot不存在 */
    BotNotExist = 2,
    /** Session失效或不存在 */
    SessionNotExist = 3,
    /** Session未认证(未激活) */
    UnverifiedSession = 4,
    /** 发送消息目标不存在(指定对象不存在) */
    TargetNotExist = 5,
    /** 指定文件不存在, 出现于发送本地图片 */
    FileNotExist = 6,
    /** 无操作权限, 指Bot没有对应操作的限权 */
    NoPermission = 10,
    /** Bot被禁言, 指Bot当前无法向指定群发送消息 */
    BotIsMuted = 20,
    /** 消息过长 */
    MessageTooLong = 30,
    /** 错误的访问, 如参数错误等 */
    BadRequest = 400,
    /** mirai-api-http 内部错误 */
    InternalError = 500
}

/** 认证响应 */
export interface VerifyResponse {
    /** 状态码 */
    code: ResponseCode;
    /** 会话Session */
    session: string;
}

/** Api请求的响应 */
export interface ApiResponse {
    /** 状态码 */
    code: ResponseCode;
    /** 消息 */
    msg: string;
    /** 响应数据 */
    data?: object;
}

/** 获取插件信息响应 */
export interface AboutResponse extends ApiResponse {
    data: {
        /** mirai-api-http版本 */
        version: string
    }
}

/** 获取历史消息响应 */
export interface MessageRetrieveResponse extends ApiResponse {
    /** 消息、事件列表 */
    data: Array<ChatMessage | Event>;
}

/** 根据id获取消息响应 */
export interface MessageFromIdResponse extends ApiResponse {
    /** 消息 */
    data: ChatMessage;
}

/** 获取好友列表响应 */
export interface FriendListResponse extends ApiResponse {
    /** 好友列表 */
    data: Friend[];
}

/** 获取群列表响应 */
export interface GroupListResponse extends ApiResponse {
    /** 群列表 */
    data: Group[];
}

/** 获取群成员列表响应 */
export interface MemberListResponse extends ApiResponse {
    /** 群成员列表 */
    data: GroupMember[];
}

/** 获取资料响应 */
export interface ProfileResponse extends ApiResponse {
    /** 个人资料 */
    data: Profile;
}

/** 发送消息响应 */
export interface SendMessageResponse extends ApiResponse {
    /** 已发送消息id */
    messageId: number;
}

/** 查看文件列表响应 */
export interface FileListResponse extends ApiResponse {
    /** 文件概览列表 */
    data: FileOverview[];
}

/** 获取文件信息响应 */
export interface FileInfoResponse extends ApiResponse {
    /** 文件概览 */
    data: FileOverview;
}

/** 获取群设置响应 */
export interface GroupConfigResponse extends ApiResponse {
    /** 群设置 */
    data: GroupConfig;
}

/** 获取群成员信息响应 */
export interface GroupMemberResponse extends ApiResponse {
    /** 群成员信息 */
    data: GroupMember;
}

/** 获取群公告响应 */
export interface GroupAnnouncementsResponse extends ApiResponse {
    /** 群公告 */
    data: GroupAnnouncement[];
}

/** 图片上传响应 */
export interface UploadImageResponse {
    /** 图片id */
    imageId: string;
    /** 图片下载链接 */
    url: string;
}

/** 语音上传响应 */
export interface UploadVoiceResponse {
    /** 语音id */
    voiceId: string;
    /** 语音下载链接 */
    url: string;
}

/** 文件上传响应 */
export type UploadFileResponse = FileInfoResponse;

/** 支持的 mirai-api-http 版本号 */
export const MIRAI_API_HTTP_VERSION = '2.5.0';
