syntax = "proto3";

package bilibili.im.interface.v1;

option java_multiple_files = true;
option java_package = "bilibili.im.interface1.v1";

import "bilibili/im/type/im.proto";

// 私信
service ImInterface {
  // 发送消息
  rpc SendMsg (ReqSendMsg) returns (RspSendMsg);
  // 同步关系
  rpc SyncRelation (ReqRelationSync) returns (RspRelationSync);
  // 确认同步进度
  rpc SyncAck (ReqSyncAck) returns (RspSyncAck);
  // 同步版本拉取消息
  rpc SyncFetchSessionMsgs (ReqSessionMsg) returns (RspSessionMsg);
  // 拉取会话记录列表
  rpc GetSessions (ReqGetSessions) returns (RspSessions);
  // 拉取新消息
  rpc NewSessions (ReqNewSessions) returns (RspSessions);
  // 拉取已读消息
  rpc AckSessions (ReqAckSessions) returns (RspSessions);
  // 更新已读进度
  rpc UpdateAck (ReqUpdateAck) returns (DummyRsp);
  // 置顶聊天
  rpc SetTop (ReqSetTop) returns (DummyRsp);
  // 删除会话记录
  rpc RemoveSession (ReqRemoveSession) returns (DummyRsp);
  // 未读私信数
  rpc SingleUnread (ReqSingleUnread) returns (RspSingleUnread);
  // 我创建的应援团未读数
  rpc MyGroupUnread (DummyReq) returns (RspMyGroupUnread);
  // 未关注的人批量设置为已读
  rpc UpdateUnflwRead (DummyReq) returns (DummyRsp);
  // 应援团消息助手
  rpc GroupAssisMsg (ReqGroupAssisMsg) returns (RspSessionMsg);
  // 更新应援团小助手消息已拉取进度
  rpc AckAssisMsg (ReqAckAssisMsg) returns (DummyRsp);
  // 拉取会话详情
  rpc SessionDetail (ReqSessionDetail) returns (bilibili.im.type.SessionInfo);
  // 批量拉取会话详情
  rpc BatchSessDetail (ReqSessionDetails) returns (RspSessionDetails);
  // 批量删除会话
  rpc BatchRmSessions (ReqBatRmSess) returns (DummyRsp);
  // 拉取最近私信分享列表
  rpc ShareList (ReqShareList) returns (RspShareList);
  //
  rpc SpecificSingleUnread (ReqSpecificSingleUnread) returns (RspSpecificSingleUnread);
  //
  rpc GetSpecificSessions (ReqGetSpecificSessions) returns (RspSessions);
  //
  rpc GetLiveInfo(ReqLiveInfo) returns (RspLiveInfo);
  //
  rpc GetTotalUnread(ReqTotalUnread) returns (RspTotalUnread);
  //
  rpc ShowClearUnreadUI(ReqShowClearUnreadUI) returns (RspShowClearUnreadUI);
  //
  rpc CloseClearUnreadUI(ReqCloseClearUnreadUI) returns (RspCloseClearUnreadUI);
  //
  rpc UpdateTotalUnread(ReqUpdateTotalUnread) returns (RspUpdateTotalUnread);
}

// 空请求
message DummyReq {
  //
  uint32 idl = 1;
}

// 空响应
message DummyRsp {
  reserved 1;
}

// 表情资源信息
message EmotionInfo {
  // 表情
  string text = 1;
  // 表情url
  string url = 2;
  // 表情大小
  // 0:未知 1:min 2:max
  int32  size = 3;
  // gif url
  string gif_url = 4;
}

//
enum ENUM_FOLD {
  FOLD_NO = 0; //
  FOLD_YES = 1; //
  FOLD_UNKNOWN = 2; //
}

//
enum ENUM_UNREAD_TYPE{
  UNREAD_TYPE_ALL = 0; //
  UNREAD_TYPE_FOLLOW = 1; //
  UNREAD_TYPE_UNFOLLOW = 2; //
  UNREAD_TYPE_DUSTBIN = 3; //
}

//
message MsgDetail {
  //
  int64 msg_key = 1;
  //
  int64 seqno = 2;
}

//
message MsgFeedUnreadRsp {
  //
  map<string, int64> unread = 1;
}

// 更新应援团小助手消息已拉取进度-请求
message ReqAckAssisMsg {
  //
  uint64 ack_seqno = 1;
}

// 拉取已读消息-请求
message ReqAckSessions {
  //
  uint64 begin_ts = 1;
  //
  uint32 end_ts = 2;
  //
  uint32 size = 3;
}

// 批量删除会话-请求
message ReqBatRmSess {

}

//
message ReqCloseClearUnreadUI {

}

//
message ReqGetMsg {
  //
  int64 talker_id = 1;
  //
  int32 session_type = 2;
  //
  repeated MsgDetail msg_detail = 3;
}

// 拉取会话记录列表-请求
message ReqGetSessions {
  //
  uint64 begin_ts = 1;
  //
  uint64 end_ts = 2;
  //
  uint32 size = 3;
  //
  uint32 session_type = 4;
  //
  uint32 unfollow_fold = 5;
  //
  uint32 group_fold = 6;
  //
  uint32 sort_rule = 7;
  // 青少年模式
  uint32 teenager_mode = 8;
  // 课堂模式
  uint32 lessons_mode = 9;
}

// -请求
message ReqGetSpecificSessions {
  // 具体会话详情
  repeated SimpleSession talker_sessions = 1;
}

// 应援团消息助手-请求
message ReqGroupAssisMsg {
  //
  uint64 client_seqno = 1;
  //
  uint32 size = 2;
}

//
message ReqLiveInfo {
  //
  int64 uid = 1;
  //
  int64 talker_id = 2;
}

// 拉取新消息-请求
message ReqNewSessions {
  //
  uint64 begin_ts = 1;
  //
  uint32 size = 2;
  //
  uint32 teenager_mode = 3;
  // 课堂模式
  uint32 lessons_mode = 4;
}

// 同步关系-请求
message ReqRelationSync {
  // 客户端当前seqno
  uint64 client_relation_oplog_seqno = 1;
}

// 删除会话记录-请求
message ReqRemoveSession {
  //
  uint64 talker_id = 1;
  //
  uint32 session_type = 2;
}

// 发送消息-请求
message ReqSendMsg {
  // 消息内容
  bilibili.im.type.Msg msg = 1;
  //
  string cookie = 2;
  //
  string cookie2 = 3;
  //
  int32 error_code = 4;
  //
  string dev_id = 5;
}

// 拉取会话详情-请求
message ReqSessionDetail {
  //
  uint64 talker_id = 1;
  //
  uint32 session_type = 2;
  //
  uint64 uid = 3;
}

// 批量拉取会话详情-请求
message ReqSessionDetails {
  // 会话详情请求列表
  repeated ReqSessionDetail sess_ids = 1;
}

// 同步版本拉取消息-请求
message ReqSessionMsg {
  //
  uint64 talker_id = 1;
  //
  int32 session_type = 2;
  //
  uint64 end_seqno = 3;
  //
  uint64 begin_seqno = 4;
  //
  int32 size = 5;
  //
  int32 order = 6;
  //
  string dev_id = 7;
}

// 置顶聊天-请求
message ReqSetTop {
  //
  uint64 talker_id = 1;
  //
  uint32 session_type = 2;
  //
  // 0:置顶 1:取消置顶
  uint32 op_type = 3;
}

// 拉取最近私信分享列表-请求
message ReqShareList {
  // 分页大小 最大20
  int32 size = 1;
}

//
message ReqShowClearUnreadUI {
  //
  int32 unread_type = 1;
  //
  int32 show_unfollow_list = 2;
  //
  int32 show_dustbin = 4;
}

// 未读私信数-请求
message ReqSingleUnread {
  //
  int32 unread_type = 1;
  //
  int32 show_unfollow_list = 2;
  //
  int64 uid = 3;
  //
  int32 show_dustbin = 4;
}

// -请求
message ReqSpecificSingleUnread {
  // 具体会话详情
  repeated SimpleSession talker_sessions = 1;
}

// 确认同步进度-请求
message ReqSyncAck {
  //
  uint64 client_seqno = 1;
}

//
message ReqTotalUnread {
  //
  int32 unread_type = 1;
  //
  int32 show_unfollow_list = 2;
  //
  int64 uid = 3;
  //
  int32 show_dustbin = 4;
  //
  int32 singleunread_on = 5;
  //
  int32 msgfeed_on = 6;
  //
  int32 sysup_on = 7;
}

// 更新已读进度-请求
message ReqUpdateAck {
  // 聊天对象uid，可以为用户id或者为群id
  uint64 talker_id = 1;
  // 会话类型
  uint32 session_type = 2;
  // 已读的最大seqno
  uint64 ack_seqno = 3;
}

//
message ReqUpdateIntercept {
  //
  int64 uid = 1;
  //
  int64 talker_id = 2;
  //
  int32 status = 3;
}

//
message ReqUpdateTotalUnread {

}

//
message RspCloseClearUnreadUI {

}

//
message RspGetMsg {
  //
  repeated bilibili.im.type.Msg msg = 1;
}

//
message RspLiveInfo {
  //
  int64 live_status = 1;
  //
  string jump_url = 2;
}

// 我创建的应援团未读数-响应
message RspMyGroupUnread {
  // 未读消息数
  uint32 unread_count = 1;
}

// 同步关系-响应
message RspRelationSync {
  //
  int32 full = 1;
  // 增量日志
  repeated bilibili.im.type.RelationLog relation_logs = 2;
  // 全量列表
  repeated bilibili.im.type.FriendRelation friend_list = 3;
  // 服务器端最大的relation seqno
  uint64 server_relation_oplog_seqno = 4;
  // 全量列表
  repeated bilibili.im.type.GroupRelation group_list = 5;
}

// 发送消息-响应
message RspSendMsg {
  //
  uint64 msg_key = 1;
  // 表情资源信息
  repeated EmotionInfo e_infos = 2;
  //
  string msg_content = 3;
  //
  bilibili.im.type.KeyHitInfos key_hit_infos = 4;
}

// 批量拉取会话详情-响应
message RspSessionDetails {
  // 会话详情列表
  repeated bilibili.im.type.SessionInfo sess_infos = 1;
}

// 同步版本拉取消息-响应
message RspSessionMsg {
  //
  repeated bilibili.im.type.Msg messages = 1;
  //
  int32 has_more = 2;
  //
  uint64 min_seqno = 3;
  //
  uint64 max_seqno = 4;
  // 表情资源信息
  repeated EmotionInfo e_infos = 5;
}

// 拉取消息-响应
message RspSessions {
  //
  repeated bilibili.im.type.SessionInfo session_list = 1;
  //
  uint32 has_more = 2;
  // 标记反垃圾会话是否在清理中
  bool anti_disturb_cleaning = 3;
  // 当session_list为空时，会返回该字段用于判断通讯录是否为空，1表示空，0表示非空
  int32 is_address_list_empty = 4;
  //
  map<int32, int64> system_msg = 5;
  //
  bool show_level = 6;
}

// 拉取最近私信分享列表-响应
message RspShareList {
  // 最近会话列表
  repeated ShareSessionInfo session_list = 1;
  //
  int32 IsAddressListEmpty = 2;
}

//
message RspShowClearUnreadUI {
  //
  bool display = 1;
  //
  string text = 2;
}

// 未读私信数-响应
message RspSingleUnread {
  // 未关注用户私信数
  uint64 unfollow_unread = 1;
  // 已关注用户私信数
  uint64 follow_unread = 2;
  // 未关注人列表是否有新业务通知
  uint32 unfollow_push_msg = 3;
  //
  int32 dustbin_push_msg = 4;
  //
  int64 dustbin_unread = 5;
  //
  int64 biz_msg_unfollow_unread = 6;
  //
  int64 biz_msg_follow_unread = 7;
}

// -响应
message RspSpecificSingleUnread {
  // key -> 用户uid, value ->未读数
  map <uint64, uint64> talkerUnreadCnt = 1;
  // 总未读数
  uint64 allUnreadCnt = 2;
}

// 确认同步进度-响应
message RspSyncAck {

}

//
message RspTotalUnread {
  //
  SessionSingleUnreadRsp session_single_unread = 1;
  //
  MsgFeedUnreadRsp msg_feed_unread = 2;
  //
  SysMsgInterfaceLastMsgRsp sys_msg_interface_last_msg = 3;
  //
  int32 total_unread = 4;
}

//
message RspUpdateTotalUnread {

}

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

//
message SessionSingleUnreadRsp {
  //
  int64 unfollow_unread = 1;
  //
  int64 follow_unread = 2;
  //
  int32 unfollow_push_msg = 3;
  //
  int32 dustbin_push_msg = 4;
  //
  int64 dustbin_unread = 5;
}

// 会话信息，用于私信分享
message ShareSessionInfo {
  //
  uint64 talker_id = 1;
  //
  string talker_uname = 2;
  //
  string talker_icon = 3;
  // 认证信息
  // -1: 无认证 0:个人认证 1:机构认证
  int32 official_type = 4;
}

//
message SimpleSession {
  // 聊天对象uid，可以为用户id或者为群id
  uint64 talker_id = 1;
  // 会话类型
  uint32 session_type = 2;
}

//
message SysMsgInterfaceLastMsgRsp {
  //
  int32 unread = 1;
  //
  string title = 2;
  //
  string time = 3;
  //
  int64 id = 4;
}
