syntax = "proto3";
package pb;
option go_package = "egg-im/pkg/pb/";

enum PackageType {
  PT_UNKNOWN = 0; // 未知
  PT_SIGN_IN = 1; // 设备登录请求
  PT_SYNC = 2; // 消息同步触发
  PT_HEARTBEAT = 3; // 心跳
  PT_MESSAGE = 4; // 消息投递
  PT_SUBSCRIBE_ROOM = 5; // 订阅房间
}

/************************************消息体定义开始************************************/
// 单条消息投递内容(估算大约100个字节),todo 通知栏提醒
message Message {
  Sender sender = 1; // 发送者
  ReceiverType receiver_type = 2; // 接收者类型,1:user;2:group
  int64 receiver_id = 3; // 用户id或者群组id
  repeated int64 to_user_ids = 4; // 需要@的用户id列表
  MessageType message_type = 5; // 消息类型
  bytes message_content = 6; // 消息内容
  int64 seq = 7; // 用户消息发送序列号
  int64 send_time = 8; // 消息发送时间戳,精确到毫秒
  MessageStatus status = 9; // 消息状态
}

message Sender {
  SenderType sender_type = 1; // 发送者类型,1:系统,2:用户,3:第三方业务系统
  int64 sender_id = 2; // 发送者id
  int64 device_id = 3; // 发送者设备id
  string avatar_url = 4; // 头像
  string nickname = 5; // 昵称
  string extra = 6; // 扩展字段
}

// 消息类型
enum MessageType {
  MT_UNKNOWN = 0; // 未知
  MT_TEXT = 1; // 文本
  MT_FACE = 2; // 表情
  MT_VOICE = 3; // 语音消息
  MT_IMAGE = 4; // 图片
  MT_FILE = 5; // 文件
  MT_LOCATION = 6; // 地理位置
  MT_COMMAND = 7; // 指令推送
  MT_CUSTOM = 8; // 自定义
  MT_RECALL = 9; // 撤回消息
  MT_RED_PACKAGE = 10; // 红包消息
}

// 红包类型
enum RedPacketType {
  RPT_UNKNOWN = 0; // 未知
  RPT_FRIEND = 1; // 好友红包
  RPT_GROUP_NORMAL = 2; // 群组普通红包
  RPT_GROUP_LUCK = 3; // 群组手气红包
  RPT_GROUP_SPECIALLY = 4; // 群组专属红包
  RPT_SYSTEM_FOR = 5; // 系统红包
}

// 红包消息类型
enum RedPacketMessageType {
  RMT_UNKNOWN = 0; // 未知
  RMT_SEND = 1; // 发红包
  RMT_GRAB = 2; // 抢红包
}

// 红包状态类型
enum RedPacketStatusType {
  RPS_NOT_DRAW = 0; // 未领取
  RPS_DRAWING = 1; // 领取中
  RPS_DRAW_OVER = 2; // 领取完
  RPS_EXPIRE = 3; //已过期
}

// 文本消息
message Text {
  string text = 1; // 文本消息内容
}

// 表情消息
message Face {
  int64 face_id = 1;
  string face_url = 2;
}

// 语音消息
message Voice {
  string id = 1; // 语音包id
  int32 size = 2; // 语音包大小
  int32 duration = 3; // 语音时长
  string url = 4; // 语音文件URL
}

// 图片消息
message Image {
  string id = 1; // 图片id
  int32 width = 2; // 图片宽度
  int32 height = 3; // 图片长度
  string url = 4; // 图片URL
  string thumbnail_url = 5; // 图片缩略图url
}

// 文件消息
message File {
  int64 id = 12; // 文件id
  string name = 13; // 文件名
  int64 size = 14; // 文件大小
  string url = 15; // 文件url
  int32 width = 16; // 文件宽度
  int32 height = 17; // 文件长度
  string thumbnail_url = 18; // 文件缩略图url
}

// 地理位置消息
message Location {
  string desc = 1; // 描述
  double latitude = 2; // 经度
  double longitude = 3; // 纬度
}

// Command 指令推送,1000以下,IM内部用,1000以上,留给业务用
message Command {
  int32 code = 1; // 指令码
  bytes data = 2; // 数据内容
}

// 自定义消息
message Custom {
  string data = 1; // 自定义数据
}

// 撤回消息
message RECALL {
  int64 recall_seq = 1; // 撤回消息seq
}


// 红包消息
message RED_PACKAGE {
  RedPacketMessageType red_message_type = 1;// 红包消息类型
  RedPacketType red_packet_type = 2; // 红包类型
  string red_packet_content = 3; // 红包文字内容
  float red_packet_amount = 6; // 红包金额
  int32 red_packet_nums = 5; // 红包数量
  float red_packet_balance_amount = 7; // 红包余额
  int64 received_user_id = 8; // 领取用户id
  float received_user_amount = 9; // 领取用户金额
  string received_user_nickname = 10; // 领取用户昵称
  RedPacketStatusType red_packet_status_type = 11; // 领取状态
  int64 red_packet_id = 12; // 红包id
  int64 send_red_packet_uid = 13; // 红包发送者uid
  string send_red_packet_nickname = 14; // 红包发送者昵称
  string send_red_packet_avatar_url = 15; // 红包发送者头像
  string red_packet_small_content = 16; // 红包小文字内容
  string red_packet_cover = 17; // 红包封面
}

/************************************消息体定义结束************************************/

// 上行数据
message Input {
  PackageType type = 1; // 包的类型
  int64 request_id = 2; // 请求id
  bytes data = 3; // 数据
}

// 下行数据
message Output {
  PackageType type = 1; // 包的类型
  int64 request_id = 2; // 请求id
  int32 code = 3; // 错误码
  string message = 4; // 错误信息
  bytes data = 5; // 数据
}

// 设备登录,package_type:1
message SignInInput {
  int64 device_id = 1; // 设备id
  int64 user_id = 2; // 用户id
  string token = 3; // 秘钥
}

// 消息同步请求,package_type:2
message SyncInput {
  int64 seq = 1; // 客户端已经同步的序列号
}
// 消息同步响应,package_type:2
message SyncOutput {
  repeated Message messages = 1; // 消息列表
  bool has_more = 2; // 是否有更多数据
}

// 订阅房间请求
message SubscribeRoomInput {
  int64 room_id = 1; // 房间ID,如果为0,取消房间订阅
  int64 seq = 2; // 消息消息序列号,
}

enum ReceiverType {
  RT_UNKNOWN = 0; // 未知
  RT_USER = 1; // 用户
  RT_GROUP = 2; // 群组
  RT_ROOM = 3; // 房间
}

// 消息投递,package_type:4
message MessageSend {
  Message message = 1; // 消息
}

enum SenderType {
  ST_UNKNOWN = 0; // 未知的
  ST_SYSTEM = 1; // IM系统
  ST_USER = 2; // 用户
  ST_BUSINESS = 3; // 业务方
}

enum MessageStatus {
  MS_UNKNOWN = 0; // 未知的
  MS_NORMAL = 1; // 正常的
  MS_RECALL = 2; // 撤回
}

// 投递消息回执,package_type:4
message MessageACK {
  int64 device_ack = 2; // 设备收到消息的确认号
  int64 receive_time = 3; // 消息接收时间戳,精确到毫秒
}

// 群组用户状态
enum GroupUserStatusType {
  GROUP_USER_STATUS_NORMAL = 0; // 正常
  GROUP_USER_STATUS_Banned = 1; // 禁言
}