syntax = "proto3";

package rpc;

option go_package = "./improto";

import "data_type.proto";
import "chat.proto";
import "device_im.proto";
// rpc
service rpc {
  // 消息推送通知
  rpc MsgPushNotice (MsgPushNoticeReq) returns (RPCResponse);
  // 消息推送通知
  rpc UserOnlinePush (RpcUserOnlinePushReq) returns (RPCResponse);
  // 更新用户及设备信息请求
  rpc UpdateUserDev (UpdateUserDevReq) returns (RPCResponse);
  // 更新设备信息请求
  rpc UpdateDev (UpdateDevReq) returns (RPCResponse);
  // 获取用户信息
  rpc GetUserInfo (RpcGetUserInfoReq) returns (RPCResponse);
  // 发送单聊
  rpc SingleChat (RpcSingleChatReq) returns (RPCResponse);
  // 发送群聊
  rpc GroupChat (RpcGroupChatReq) returns (RPCResponse);
  // 获取联第人
  rpc GetContactList (RpcGetContactReq) returns (RPCResponse);
  // 发送群通话数据
  rpc SendGroupVoiceData (SendGroupVoiceDataReq) returns (RPCResponse);

}

// 通用返回结构
message RPCResponse {
  int32 Code          = 1;
  string Message      = 2;
  bytes Body         = 3;
  int64 Timestamp     = 4;
}
// 消息推送通知消息信息
message NoticeMsgInfo {
  int32 msg_type = 1; // 消息类型
  string msg_key = 2; // 数据key值,如果是群聊，这个Key是群ID
}

enum PushRoleType{
  Null = 0;
  PushUser = 1; //用户
  PushGroup = 2; //群
}
// 消息推送通知消息数据
message NoticeData {
  string Addr = 1; // 用户地址 ，
  string Gid = 2; // 是群ID
  repeated NoticeMsgInfo Msgs = 3;
  PushRoleType  RoleType = 4;  //角色类型
}
// 消息推送通知消息请求
message MsgPushNoticeReq {
  repeated NoticeData notices = 1; // 推送提醒列表
}

// 消息推送通知消息请求
message RpcUserOnlinePushReq {
  string Addr = 1; // 用户地址
  string Mid = 2; // 设备ID
}

// 上传用户信息，等于创建用户，如果修改，直接需要修改的项即可
message UploadUserInfo {
  string addr = 1;          //用户地址
  optional string nic = 2;           //昵称
  optional int64 avatarId = 3;      //头像ID
  optional string avatarUrl = 4;     //头像地址
  optional string content = 5;       //自定义数据，客户端自己定义自己解析，服务器不作处理
  optional string edPuk = 6;         //签名公钥
  optional string cur_puk = 7;       //交换公钥
  optional int64  config = 8;        //用户配置
}

// 设备-新增
message AddDevice {
  string addr = 1;          //用户地址
  string mid = 2;           //MachineID
  string content = 3;       //自定义字段，自己管理，自己解析
  string proxyID = 4;       //代理节点ID
  im_types.PLATFORM platform = 5;    //平台
  int64 version = 6;        //版本号
  string appVersion = 7;    //设备版本号
  string appUdid  = 8;      //登陆设备惟一ID
  string DevName = 9;       //设备备注
}

// 更新用户及设备信息请求
message UpdateUserDevReq {
  UploadUserInfo user = 1; // 用户信息
  AddDevice device = 2; // 设备信息
  string sign = 3;      //签名
}

// 更新设备信息请求
message UpdateDevReq {
  AddDevice device = 1; // 设备信息
  string sign = 2;      //签名
}

//查询用户信息
message RpcGetUserInfoReq {
  string addr = 1;      //用户地址
}

message RpcSingleChatReq {
  im_types.SingleChatReq singleChat = 1;    //消息体
  string Sign = 2; //签名内容，用于验签，底层统一处理
}

message RpcGroupChatReq {
  im_types.GroupChatReq groupChat = 1;    //消息体
  string Sign = 2; //签名内容，用于验签，底层统一处理
}

// 返回联系人信息
message ContactInfo {
  string nodeId = 1;        //好友的NodeId
  string avatarUrl = 2;     //用户头像地址
  int64  avatorId = 3;      //系统头像
  string nic = 4;           //用户昵称
  string remark = 5;        //用户给好友设置的备注
  optional improto.EnumContactState relationType = 6; //好友关系
  optional improto.EnumContactRoleType      RoleType        = 7; //对象类型 0：用户，1：群
  string edPub = 8;         //签名公钥
  string curPub = 9;        //交换公钥
  optional improto.EnumSwitch isTop = 10;         //置顶状态
  optional improto.EnumDisturb notDisturbType = 11;//免打扰类型
  string ext = 12;          //拓展内容，客户端自定义
  int64 version = 13;       //版本号，用于回执处理
  string PinnedMsgList = 14;//消息至顶
  optional improto.EnumSwitch enableVoice = 15;         //是否允许打语音，只争对群有效目前
}

message RpcGetContactReq {
  string addr = 1;        //用户地址
  int64 minVersion = 2;   //最大版本号
  int64 count = 3;        //返回多少个用户
}

message RpcGetContactRes {
  repeated ContactInfo contactInfo = 1;        //用户地址
  int64 minVersion = 2;   //最大版本号
}

message SendGroupVoiceDataReq {
  string gid = 1;           //群ID
  bytes Body         = 2;   //发送数据
}
