syntax = "proto3";

package bilibili.broadcast.message.im;

import "google/protobuf/empty.proto";

//
service Notify {
    //
	rpc WatchNotify(google.protobuf.Empty) returns (stream NotifyRsp);
}

//
enum PLType {
    //
    EN_PAYLOAD_NORMAL = 0;
    //
    EN_PAYLOAD_BASE64 = 1;
}

//
enum CmdId {
    // 非法cmd
    EN_CMD_ID_INVALID = 0; 
    // 服务端主动发起
    EN_CMD_ID_MSG_NOTIFY = 1;
    //
    EN_CMD_ID_KICK_OUT = 2;
}

//
message NotifyRsp {
    //
    uint64 uid=1;
    // 命令id
	uint64 cmd=2;
    //
	bytes payload=3;
    //
	PLType payload_type=4;
}

//
message Msg {
    // 发送方uid
    uint64 sender_uid = 1;
    // 接收方类型
    int32  receiver_type = 2;
    // 接收方id
    uint64 receiver_id = 3;
    // 客户端的序列id 用于服务端去重
    uint64 cli_msg_id = 4;
    // 消息类型
    int32  msg_type = 5;
    // 消息内容
    string content = 6;
    // 服务端的序列号
    uint64 msg_seqno = 7;
    // 消息发送时间（服务端时间）
    uint64 timestamp = 8;
    // at用户列表
    repeated uint64 at_uids = 9;
    // 多人消息
    repeated uint64 recver_ids = 10;
    // 消息唯一标示
    uint64 msg_key = 11;
    // 消息状态
    uint32 msg_status = 12;
    // 是否为系统撤销
	bool sys_cancel = 13;
    // 是否是多聊消息 目前群通知管理员的部分通知属于该类消息
	uint32 is_multi_chat = 14;
    // 表示撤回的消息的session_seqno 用以后续的比较 实现未读数的正确显示
	uint64 withdraw_seqno = 15;
    // 通知码
	string notify_code =16;
    // 消息来源
	uint32 msg_source = 17;
}

//
message NotifyInfo {
    //
	uint32 msg_type = 1;
    //
	uint64 talker_id = 2;
    //
	uint32 session_type =3;
}

//
message ReqServerNotify {
    // 最新序列号
	uint64 lastest_seqno = 1;
    // 即时消息 该类消息主要用于系统通知 当客户端sync msg时 不会sync到此类消息
    Msg instant_msg = 2;
    //
	NotifyInfo notify_info = 3;
}
