syntax = "proto3";

package im_types;

option go_package = "./im_types";

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_GROUP_VOICE_DATA = 0;    //点对点发送群通话数据
}

message Resp {
  int32 Code = 1;
  string Msg = 2;
  bytes Body = 3;
}

// 基础消息内容
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 EnumMessageType msg_type = 3;
  uint32 hash = 4;
  string content = 5;
}

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