syntax = "proto3";

package rpc;

option go_package = "./improto";

import "data_type.proto";
import "chat.proto";
import "device_im.proto";
import "base.proto";
import "contact.proto";
// rpc
service rpc {
  // 更新用户及设备信息请求
  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 (RpcGetContactListReq) returns (RPCResponse);
  // 查询自已是否可以给接收者发消息，可以发返回成功，不能发就返回只能发一条的系统提示
  rpc CheckCanSingleChat (RPCCheckCanSingleChatReq) returns (RPCResponse);
  // 添加好友
  rpc AddContact (RPCAddContactReq) returns (RPCResponse);
  // 删除好友
  rpc DeleteContact (RPCDeleteContactReq) returns (RPCResponse);
  // 拦黑好友
  rpc BlockContact (RPCBlockContactReq) returns (RPCResponse);
  // 查询联系人/好友信息
  rpc GetContact (RPCGetContactReq) returns (RPCResponse);  // 返回数据为 im_types.GetContactInfoRes
  // 测试服务器接口
  rpc Echo (RPCEchoReq) returns (RPCResponse);  // 测试接口
  // 发送P2P消息
  rpc SendP2pMsgToNode (RPCSendP2pReq) returns (RPCResponse);  // RPC发送P2P消息
  // 返回真实好友关系
  rpc GetContactState (RPCGetContactStateReq) returns (RPCResponse);  // RPC发送P2P消息
}

// 通用返回结构
message RPCResponse {
  int32 Code          = 1;
  string Message      = 2;
  bytes Body         = 3;
  int64 Timestamp     = 4;
  optional im_types.SYS_CODE SysCode = 5;   //系统提示码
}

// 上传用户信息，等于创建用户，如果修改，直接需要修改的项即可
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 RpcGetContactListReq {
  string addr = 1;        //用户地址
  int64 minVersion = 2;   //最大版本号
  int64 count = 3;        //返回多少个用户
  int64 type = 4;         // 0 联系人 1 群 2 联系人和群
}

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

message RPCCheckCanSingleChatReq {
  string addr = 1;           //用户地址
  string recvAddr         = 2;   //接收者的地址
}

message RPCAddContactReq {
  im_types.AddContactReq addContact = 1;   //添加联系人信息
}

message RPCBlockContactReq {
  im_types.BlockContactReq blockContact = 1;   //拉黑联系人信息
}

message RPCDeleteContactReq {
  im_types.DeleteContactReq deleteContact = 1;   //删除联系人信息
}

message RPCGetContactReq {
  im_types.GetContactReq getContact = 1;   //查询联系人信息
}

message RPCEchoReq {
  string echo = 1;              //接口测试
}

message RPCSendP2pReq {
  im_types.P2pMsgData p2pMsgData = 1;   //发送p2p内容
}

message RPCGetContactStateReq {
  string userAddr = 1;
  string contactAddr = 2;
}

message RPCGetContactStateRes {
  optional improto.EnumContactState relationType = 1;   //好友关系
}