syntax = "proto3";

package bilibili.im.type;

//
message AccountInfo {
    //
    string name = 1;
    //
    string pic_url = 2;
}

//
enum CmdId {
    EN_CMD_ID_INVALID                       = 0;       //非法cmd

    // msg_svr
    EN_CMD_ID_SEND_MSG                      = 200001;  // 发消息

    // sync_msg_svr
    EN_CMD_ID_SYNC_MSG                      = 500001;  // 同步消息
    EN_CMD_ID_SYNC_RELATION                 = 500002;  // 同步相关链
    EN_CMD_ID_SYNC_ACK                      = 500003;  // 客户端同步消息完成后，向服务器确认同步进度
    EN_CMD_ID_SYNC_FETCH_SESSION_MSGS       = 500006;  // 多端同步版本拉取消息

    // session_svr
    EN_CMD_ID_SESSION_SVR_GET_SESSIONS      = 1000001; // 拉会话列表
    EN_CMD_ID_SESSION_SVR_NEW_SESSIONS      = 1000002; // 新消息到达时获取会话列表
    EN_CMD_ID_SESSION_SVR_ACK_SESSIONS      = 1000003; // 获取已读位置有更新的会话列表
    EN_CMD_ID_SESSION_SVR_UPDATE_ACK        = 1000004; // 更新已读进度
    EN_CMD_ID_SESSION_SVR_SET_TOP           = 1000005; // 置顶/取消置顶
    EN_CMD_ID_SESSION_SVR_REMOVE_SESSION    = 1000007; // 删除会话
    EN_CMD_ID_SESSION_SVR_SINGLE_UNREAD     = 1000008; // 单聊未读信息数
    EN_CMD_ID_SESSION_SVR_MY_GROUP_UNREAD   = 1000009; // 我创建的应援团未读数
    EN_CMD_ID_SESSION_SVR_UPDATE_UNFLW_READ = 1000010; // 未关注的人批量设置为已读
    EN_CMD_ID_SESSION_SVR_GROUP_ASSIS_MSG   = 1000011; // 应援团消息助手
    EN_CMD_ID_SESSION_SVR_ACK_ASSIS_MSG     = 1000012; // 更新应援团小助手消息已拉取进度
    EN_CMD_ID_SESSION_SVR_SESSION_DETAIL    = 1000015; // 拉会话详情
    EN_CMD_ID_SESSION_SVR_BATCH_SESS_DETAIL = 1000016; // 批量拉会话详情
    EN_CMD_ID_SESSION_SVR_BATCH_RM_SESSIONS = 1000017; // 批量删除会话
}

//
enum ENUM_BIZ_MSG_TYPE {
    BIZ_MSG_TYPE_NORMAL = 0;     //
    BIZ_MSG_TYPE_CARD_VIDEO = 1; //
}

//
message FriendRelation {
    // 用户mid
    uint64 uid = 1;
    // 用户昵称
    string user_name = 2;
    // 头像url
    string face = 3;
    // vip类型
    // 0:无 1:月度大会员 2:年度大会员
    uint32 vip_level = 4;
}

//
message GroupRelation {
    //
    uint64 group_id = 1;
    //
    uint64 owner_uid = 2;
    //
    uint32 group_type = 3;
    //
    uint32 group_level = 4;
    //
    string group_cover = 5;
    //
    string group_name = 6;
    //
    string group_notice = 7;
    //
    int32 status = 8;
    //
    int32 member_role = 9;
    //
    string fans_medal_name = 10;
    //
    uint64 room_id = 11;
}

// 关键词高亮文本
message HighText {
    //
    string title = 1;
    //
    string url = 2;
    // 表示高亮文本应该高亮第几个匹配的文本，ps：比如，“有疑问请联系客服，联系客服时，请说明具体的情况”，一共有2个匹配的文本，要高亮第一个匹配的，则index=1
    uint32 index = 3;
}

//
message ImgInfo {
    //
    string url = 1;
    //
    int32 width = 2;
    //
    int32 height = 3;
    //
    string imageType = 4;
}

// 关键词命中信息
message KeyHitInfos {
    //
    string toast = 1;
    //
    uint32 rule_id = 2;
    //
    repeated HighText high_text = 3;
    //
}

//
message Medal {
    //
    int64 uid = 1;
    //
    int32 medal_id = 2;
    //
    int32 level = 3;
    //
    string medal_name = 4;
    //
    int32 score = 5;
    //
    int32 intimacy = 6;
    //
    int32 master_status = 7;
    //
    int32 is_receive = 8;
    //
    int64 medal_color_start = 9;
    //
    int64 medal_color_end = 10;
    //
    int64 medal_color_border = 11;
    //
    int64 medal_color_name = 12;
    //
    int64 medal_color_level = 13;
    //
    int64 guard_level = 14;
}

//
message Msg {
    // 发送方mid
    uint64 sender_uid = 1;
    // 接收方类型
    RecverType receiver_type = 2;
    // 接收方mid
    uint64 receiver_id = 3;
    // 客户端的序列id,用于服务端去重
    uint64 cli_msg_id = 4;
    // 消息类型
    MsgType msg_type = 5;
    // 消息内容
    string content = 6;
    // 服务端的序列号x
    uint64 msg_seqno = 7;
    // 消息发送时间（服务端时间）
    uint64 timestamp = 8;
    // @用户列表
    repeated uint64 at_uids = 9;
    // 多人消息
    repeated uint64 recver_ids = 10;
    // 消息唯一标示
    uint64 msg_key = 11;
    // 消息状态
    uint32 msg_status = 12;
    // 是否为系统撤销
    bool sys_cancel = 13;
    // 通知码
    string notify_code = 14;
    // 消息来源
    MsgSource msg_source = 15;
    // 如果msg.content有表情字符，则该参数需要置为1
    int32 new_face_version = 16;
    // 命中关键词信息
    KeyHitInfos key_hit_infos = 17;
}

// 消息来源
enum MsgSource {
    EN_MSG_SOURCE_UNKONW                   = 0;  //
    EN_MSG_SOURCE_IOS                      = 1;  //
    EN_MSG_SOURCE_ANDRIOD                  = 2;  //
    EN_MSG_SOURCE_H5                       = 3;  //
    EN_MSG_SOURCE_PC                       = 4;  //
    EN_MSG_SOURCE_BACKSTAGE                = 5;  //
    EN_MSG_SOURCE_BIZ                      = 6;  //
    EN_MSG_SOURCE_WEB                      = 7;  //
    EN_MSG_SOURCE_AUTOREPLY_BY_FOLLOWED    = 8;  //
    EN_MSG_SOURCE_AUTOREPLY_BY_RECEIVE_MSG = 9;  //
    EN_MSG_SOURCE_AUTOREPLY_BY_KEYWORDS    = 10; //
    EN_MSG_SOURCE_AUTOREPLY_BY_VOYAGE      = 11; //
    EN_MSG_SOURCE_VC_ATTACH_MSG            = 12; //
};

// 消息类型
enum MsgType {
    // 基础消息类型
    EN_INVALID_MSG_TYPE                             = 0;  // 空空的~
    EN_MSG_TYPE_TEXT                                = 1;  // 文本消息
    EN_MSG_TYPE_PIC                                 = 2;  // 图片消息
    EN_MSG_TYPE_AUDIO                               = 3;  // 语音消息
    EN_MSG_TYPE_SHARE                               = 4;  // 分享消息
    EN_MSG_TYPE_DRAW_BACK                           = 5;  // 撤回消息
    EN_MSG_TYPE_CUSTOM_FACE                         = 6;  // 自定义表情
    EN_MSG_TYPE_SHARE_V2                            = 7;  // 分享v2消息
    EN_MSG_TYPE_SYS_CANCEL                          = 8;  // 系统撤销
    EN_MSG_TYPE_MINI_PROGRAM                        = 9;  // 小程序

    // 扩展消息类型
    EN_MSG_TYPE_NOTIFY_MSG                          = 10; // 业务通知
    EN_MSG_TYPE_VIDEO_CARD                          = 11; // 视频卡片
    EN_MSG_TYPE_ARTICLE_CARD                        = 12; // 专栏卡片
    EN_MSG_TYPE_PICTURE_CARD                        = 13; // 图片卡
    EN_MSG_TYPE_COMMON_SHARE_CARD                   = 14; // 异形卡
    EN_MSG_TYPE_BIZ_MSG_TYPE                        = 50; //
    EN_MSG_TYPE_MODIFY_MSG_TYPE                     = 51; //

    // 功能类系统消息类型
    EN_MSG_TYPE_GROUP_MEMBER_CHANGED                = 101; // 群成员变更
    EN_MSG_TYPE_GROUP_STATUS_CHANGED                = 102; // 群状态变更
    EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED               = 103; // 群动态变更
    EN_MSG_TYPE_GROUP_LIST_CHANGED                  = 104; // 群列表变更
    EM_MSG_TYPE_FRIEND_LIST_CHANGED                 = 105; // 好友列表变更
    EN_MSG_TYPE_GROUP_DETAIL_CHANGED                = 106; // 群详情发生变化
    EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED           = 107; // 群成员角色发生变化
    EN_MSG_TYPE_NOTICE_WATCH_LIST                   = 108; //
    EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED           = 109; // 消息系统，收到新的reply
    EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED              = 110; //
    EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED          = 111; //
    EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED              = 112; //
    EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2        = 113; //
    EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2           = 114; //
    EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2       = 115; //
    EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI          = 116; // 群详情发生变化,多端同步版本需要即时消息，无需落地
    EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI     = 117; // 群成员角色发生变化,多端同步版本需要即时消息，无需落地
    EN_MSG_TYPE_NOTIFY_ANTI_DISTURB                 = 118; //

    // 系统通知栏消息类型
    EN_MSG_TYPE_SYS_GROUP_DISSOLVED                 = 201; // 群解散
    EN_MSG_TYPE_SYS_GROUP_JOINED                    = 202; // 入群
    EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED             = 203; // 成员主动退群
    EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED               = 204; // 房管被撤
    EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED             = 205; // 成员被T
    EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF            = 206; // 管理T人
    EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY                = 207; // 管理上任
    EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED              = 208; // 自动创建
    EN_MSG_TYPE_SYS_FRIEND_APPLY                    = 210; // 好友申请
    EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK                = 211; // 好友申请通过
    EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING         = 212; // 用户加群申请
    EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY = 213; // 通知管理员,有其他管理员已经同意用户加群

    // 聊天窗口通知消息类型
    EN_MSG_TYPE_CHAT_MEMBER_JOINED                  = 301; // 入群
    EN_MSG_TYPE_CHAT_MEMBER_EXITED                  = 302; // 退群
    EN_MSG_TYPE_CHAT_GROUP_FREEZED                  = 303; // 冻结
    EN_MSG_TYPE_CHAT_GROUP_DISSOLVED                = 304; // 解散
    EN_MSG_TYPE_CHAT_GROUP_CREATED                  = 305; // 开通应援团
    EN_MSG_TYPE_CHAT_POPUP_SESSION                  = 306; // 弹出会话
}

// 接收方类型
enum RecverType {
    EN_NO_MEANING        = 0; //
    EN_RECVER_TYPE_PEER  = 1; // 单人
    EN_RECVER_TYPE_GROUP = 2; // 群
    EN_RECVER_TYPE_PEERS = 3; // 多人
}

//
message RelationLog {
    // 操作类型
    RelationLogType log_type = 1;
    // 操作seqno
    uint64 oplog_seqno = 2;
    // 好友信息
    FriendRelation friend_relation = 3;
    // 群信息
    GroupRelation group_relation = 4;
}

//
enum RelationLogType {
    EN_INVALID_LOG_TYPE = 0; //
    EN_ADD_FRIEND       = 1; // 添加好友
    EN_REMOVE_FRIEND    = 2; // 删除好友
    EN_JOIN_GROUP       = 3; // 加入群
    EN_EXIT_GROUP       = 4; // 退出群
}

//
enum SESSION_TYPE {
    INVALID_SESSION_TYPE     = 0; //
    UN_FOLD_SESSION          = 1; //
    UN_FOLLOW_SINGLE_SESSION = 2; //
    MY_GROUP_SESSION         = 3; //
    ALL_SESSION              = 4; //
}

// 会话详情
message SessionInfo {
    //
    uint64 talker_id = 1;
    //
    uint32 session_type = 2;
    //
    uint64 at_seqno = 3;
    //
    uint64 top_ts = 4;
    //
    string group_name = 5;
    //
    string group_cover = 6;
    //
    uint32 is_follow = 7;
    //
    uint32 is_dnd = 8;
    //
    uint64 ack_seqno = 9;
    //
    uint64 ack_ts = 10;
    //
    uint64 session_ts = 11;
    //
    uint32 unread_count = 12;
    //
    Msg last_msg = 13;
    //
    uint32 group_type = 14;
    //
    uint32 can_fold = 15;
    //
    uint32 status = 16;
    //
    uint64 max_seqno = 17;
    // 会话是否有业务通知
    uint32 new_push_msg = 18;
    // 接收方是否设置接受推送
    uint32 setting = 19;
    //
    uint32 is_guardian = 20;
    //
    int32 is_intercept = 21;
    //
    int32 is_trust = 22;
    //
    int32 system_msg_type = 23;
    //
    AccountInfo account_info = 24;
    //
    int32 live_status = 25;
    //
    int32 biz_msg_unread_count = 26;
    //
    UserLabel user_label = 27;
}

//
message UserLabel {
    //
    int32 label_type = 1;
    //
    Medal medal = 2;
    //
    int32 guardian_relation = 3;
}
