syntax = "proto3";

package proto;
option go_package = "proto/im_cmd";
option objc_class_prefix = "CCI";
option java_package = "com.intsig.developer.lib_message";
option java_outer_classname = "SocketConnectionCmd";

//握手命令，服务器下发公钥给客户端
message HandShake {
    // @inject_tag: json:"public_key" form:"public_key"
    bytes public_key = 1;
}

//握手回执，客户端将本地生成16字节 aes-128-ecb用的key，用public key加密以后传输到服务端，服务端用私钥解密，得到16 bytes key
message HandShakeResp {
    // @inject_tag: json:"key_bytes" form:"key_bytes"
    bytes key_bytes = 1;
}

//认证命令 CMD_REQ_AUTH=1
message AuthRequest {
    // @inject_tag: json:"type" form:"type"
    //认证类型，0.匿名认证，1.登录用户认证
    int32 type = 1;
    // @inject_tag: json:"token" form:"token"
    //用户token
    string token = 2;
    // @inject_tag: json:"device_id" form:"device_id"
    //设备id
    string device_id = 3;
    // @inject_tag: json:"plaftom" form:"plaftom"
    //认证平台，0: iOS，1:Android，2:MAC，4.BROWSER，5.LINUX, 6.PC, 7.HarmonyOS
    int32 platform = 4;
    // @inject_tag: json:"version" form:"version"
    //客户端版本
    string version = 5;
    // @inject_tag: json:"lang" form:"lang"
    //客户端语言
    string lang = 6;
    // @inject_tag: json:"country" form:"country"
    //客户端国家
    string country = 7;
    // @inject_tag: json:"appid" form:"appid"
    //appid区分
    string appid = 8;
    // @inject_tag: json:"sys_ver" form:"sys_ver"
    //系统版本
    string sys_ver = 9;
    // @inject_tag: json:"rand_str8" form:"rand_str8"
    //随机8字符串
    string rand_str8 = 10;
    // @inject_tag: json:"vendor" form:"vendor"
    //市场渠道
    string vendor = 11;
    // @inject_tag: json:"manu" form:"manu"
    //制造商
    string manu = 12;
    // @inject_tag: json:"tz" form:"tz"
    //时区
    string tz = 13;
}

//认证响应 CMD_RESP_AUTH=2
message AuthResponse {
    // @inject_tag: json:"code" form:"code"
    // 状态码，0为正常，不为0发生错误
    int32 code = 1;
    // @inject_tag: json:"msg" form:"msg"
    //文本内容
    string msg = 2;
}

//拉取消息命令 CMD_REQ_FETCH_MSGS
message FetchMsgsRequest {
    // @inject_tag: json:"max_update_time" form:"max_update_time"
    //本地个人最大的msg最大更新时间
    int64 max_update_time = 1;
    // @inject_tag: json:"msg_type" form:"msg_type"
    //消息类型, 0:透传消息，1:通知消息
    int32 msg_type = 2;
}

message Msg {
    // @inject_tag: json:"msg_type" form:"msg_type"
    //消息类型, 0:透传消息，1:通知消息
    int32 msg_type = 1;
    // @inject_tag: json:"sub_type" form:"sub_type"
    //消息子类型
    int32 sub_type = 2;
    // @inject_tag: json:"sender_id" form:"sender_id"
    //发送者
    string sender_id = 3;
    // @inject_tag: json:"ext" form:"ext"
    //扩展字段，可以是json或者普通字符串，业务侧自己定义
    string ext = 4;
    // @inject_tag: json:"msg" form:"msg"
    //消息内容，可以是json或者普通字符串，业务侧自己定义
    string msg = 5;
    // @inject_tag: json:"receiver_id" form:"receiver_id"
    //目标，可以用户ID，设备id，群id
    string receiver_id = 6;
    // @inject_tag: json:"cmd_id" form:"cmd_id"
    //原始命令号，由什么命令请求产生
    int32 cmd_id = 7;
    // @inject_tag: json:"msg_id" form:"msg_id"
    //logic服务器生成的消息id
    int64 msg_id = 8;
    // @inject_tag: json:"expire_time" form:"expire_time"
    //消息过期时间, ms
    int64 expire_time = 9;
    // @inject_tag: json:"send_time" form:"send_time"
    //消息创建时间戳, ms
    int64 send_time = 10;
    // @inject_tag: json:"update_time" form:"update_time"
    //消息更新时间戳, ms
    int64 update_time = 11;
    // @inject_tag: json:"read_status" form:"read_status"
    //消息已读状态，0已读，1未读
    int32 read_status = 12;
    // @inject_tag: json:"task_id" form:"task_id"
    //业务关联id
    string task_id = 13;
}

//下发消息命令 CMD_RESP_MSGS
message FetchMsgsResponse {
    // @inject_tag: json:"code" form:"code"
    // 状态码，0为正常，不为0发生错误
    int32 code = 1;
    // @inject_tag: json:"msg" form:"msg"
    //文本内容
    string msg = 2;
    // @inject_tag: json:"synced" form:"synced"
    // 拉取完成的标识，1 表示已经拉取了所有信息，0 表示有待拉取的消息
    bool synced = 3;
    // @inject_tag: json:"msgs" form:"msgs"
    //消息列表
    repeated Msg msgs = 4;
}

//标记为已读
message MarkAsReadRequest {
    // @inject_tag: json:"type" form:"type"
    //操作类型，默认0表示按照ids列表操作一批id为已读，1表示按照特定业务sub type操作某一类消息全部为已读，这个时候只需要传最大的消息id，指定msg_type下的消息，msg_id小于该参数值的，全部置为已读
    int32 type = 1;
    // @inject_tag: json:"msg_type" form:"msg_type"
    // 必传。消息大类，默认0。系统消息 0；第三方推送 1
    int32 msg_type = 2;
    // @inject_tag: json:"sub_type" form:"sub_type"
    // 必传。消息子类，用于划分列表，默认0。业务侧自定义，并自行做好文档记录
    int32 sub_type =3;
    // @inject_tag: json:"msg_id" form:"msg_id"
    // 必传。指定msg_type下的消息，msg_id小于该参数值的，全部置为已读
    int64 msg_id = 4;
    // @inject_tag: json:"list" form:"list"
    //标记为已读的消息id列表
    repeated MsgTaskPair list = 5;
}

message MsgTaskPair {
    // @inject_tag: json:"msg_id" form:"msg_id"
    //消息id
    int64 msg_id = 1;
    // @inject_tag: json:"task_id" form:"task_id"
    //业务关联id
    string task_id = 2;
}

//标记为已读响应
message MarkAsReadResponse {
    // @inject_tag: json:"code" form:"code"
    // 状态码，0为正常，不为0发生错误
    int32 code = 1;
    // @inject_tag: json:"msg" form:"msg"
    //文本内容
    string msg = 2;
    // @inject_tag: json:"type" form:"type"
    //操作类型，默认0表示按照ids列表操作一批id为已读，1表示按照特定业务sub type操作某一类消息全部为已读，这个时候只需要传最大的消息id，指定msg_type下的消息，msg_id小于该参数值的，全部置为已读
    int32 type = 3;
    // @inject_tag: json:"msg_type" form:"msg_type"
    // 必传。消息大类，默认0。系统消息 0；第三方推送 1
    int32 msg_type = 4;
    // @inject_tag: json:"sub_type" form:"sub_type"
    // 必传。消息子类，用于划分列表，默认0。业务侧自定义，并自行做好文档记录
    int32 sub_type =5;
    // @inject_tag: json:"ids" form:"ids"
    //标记为已读的消息id列表
    repeated int64 ids = 6;
}

//上报达到客户端的消息，提供给服务端统计到达率
message ReportMsgsRequest {
    // @inject_tag: json:"list" form:"list"
    //到达到客户端的消息id列表
    repeated ReportItem list = 1;
}

message ReportItem {
    // @inject_tag: json:"msg_id" form:"msg_id"
    //消息id
    int64 msg_id = 1;
    // @inject_tag: json:"task_id" form:"task_id"
    //业务关联id
    string task_id = 2;
}

//自定义扩展字段操作 CMD_REQ_EXTRA
message ExtRequest {
    // @inject_tag: json:"ext" form:"ext"
    //扩展字段，可以是json或者普通字符串，业务侧自己定义
    string ext = 1;
    // @inject_tag: json:"msg_id" form:"msg_id"
    //logic服务器生成的消息id
    int64 msg_id = 2;
    // @inject_tag: json:"task_id" form:"task_id"
    //业务关联id
    string task_id = 3;
}

//自定义扩展字段操作响应 CMD_RESP_EXTRA
message ExtResponse {
    // @inject_tag: json:"code" form:"code"
    // 状态码，0为正常，不为0发生错误
    int32 code = 1;
    // @inject_tag: json:"msg" form:"msg"
    //文本内容
    string msg = 2;
    // @inject_tag: json:"msg_id" form:"msg_id"
    //logic服务器生成的消息id
    int64 msg_id = 3;
}

//用来同步一些客户端信息，比如推送token，是否开启推送，不需要回执响应 CMD_SYNC_INFO
message SyncInfoRequest {
    // @inject_tag: json:"push_token" form:"push_token"
    //推送token
    string push_token = 1;
    // @inject_tag: json:"push_status" form:"push_status"
    //是否开启推送 2表示开启，1表示不开启
    int32 push_status = 2;
}
