syntax = "proto3";

package im_types;

option go_package = "./improto";

import "msg_id.proto";
import "data_type.proto";

enum OUTLINE {
  OT_NULL = 0;
  OT_SAMELOGIN = 1;   //同时登陆挤下线
  OT_FORCEOUT = 2;    //强制下线
  OT_DELDEV = 3;      //删除设备
}

enum P2P_CMD {
  CD_NORMAL = 0;               //普通点对点消息
  CD_TYPING_DATA = 1;         //点对点发送输入状态数据
  CD_GROUP_VOICE_DATA = 2;    //点对点发送群通话数据

}

enum SYS_CODE {
  TIP_NULL = 0;                       //占拉
  TIP_ONLY_ONE_MESSAGE_SEND = 1;      //陌生人最多只能发一条消息
}

message Resp {
  int32 Code = 1;
  string Msg = 2;
  bytes Body = 3;
  optional SYS_CODE SysCode = 4;   //系统提示码
}

// 基础消息内容
message MessageBase {
  string  OpID        = 1; // 操作用户id,即用户地址
  string  OpKey       = 2; // 消息处理业务key，发单聊就是接收者的addr,发群聊就是群的addr,修改信息就是自己的
  MSGID   HandlerId   = 3; // 处理消息handlerId
  int64   CreateTime  = 4; // 消息创建时间
  bytes   Body        = 5; // 处理消息handler数据体
  bytes Sign = 6; //签名内容，用于验签，底层统一处理
}

// 服务端转发消息结构体
message ForwardMsg {
  string  Key         = 1; // 数据处理key 
  bytes   Message     = 2; // 消息原始内容
  int64   CreateTime  = 3; // 消息创建时间
}

// 设备下线
message OutlineRes {
  OUTLINE type = 1;           //下线类型
  int64 opTime = 2;           //操作时间
}
// 推送数据
message NewPushMsg{
  repeated string noticeAddr = 1; //需要通知的用户
  int32 count = 2; //推送消息条数 目前只有消息条数
  optional improto.EnumMessageType msg_type = 3;
  uint32 hash = 4;
  string content = 5;
  string groupId = 6;     //群id,群语音需要传，否则不填
}

message AddrMid {
  string ToAddr = 1; // 接收的地址
  string ToMid = 2;  // 接收者的Mid
}

// 客户端发点对点送消息
message P2pMsgData{
  repeated AddrMid addrMids = 1;    //接收者信息
  bytes Data = 2; // 发送数据
  NewPushMsg newPushMsg = 3; //需要推送的数据，前端如果发送的点对点消息需要推送，填充这个字段
  P2P_CMD cmd = 4;  //点对点消息操作类型，用于区分具体操作
}
