syntax = "proto3";

package improto;

option go_package = "./improto";

//群角色
enum EnumGroupRole{
  GROUP_ROLE_OWNER   = 0; //群主
  GROUP_ROLE_MANAGER = 1; //管理员
  GROUP_ROLE_NORMAL  = 2; //普通成员
  GROUP_ROLE_BLACK   = 3; //黑名单
}

//入群标记
enum EnumInGroup{
  IN_GROUP_UNKNOWN = 0; //未知
  IN_GROUP         = 1; //入群
  NOT_IN_GROUP     = -1; //退群
}

//群状态
enum EnumGroupStatus{
  GROUP_STATUS_NORMAL   = 0; //正常
  GROUP_STATUS_DISSOLVE = 1; //解散
}

//群类型
enum EnumGroupType{
  GROUP_TYPE_PRIVATE = 0; //私秘
  GROUP_TYPE_PUBLIC  = 1; //公开
}

//入群申请状态
enum EnumGroupJoinState{
  GROUP_JOIN_STATE_APPLY  = 0; //申请
  GROUP_JOIN_STATE_AGREE  = 1; //同意
  GROUP_JOIN_STATE_REFUSE = 2; //拒绝
}

//联系人状态
enum EnumContactState{
  CONTACT_STATE_FRIEND    = 0; //好友/入群
  CONTACT_STATE_STRANGER  = 1; //陌生人/退群
  CONTACT_STATE_BLACKLIST = 2; //黑名单
}

//联系人角色类型
enum EnumContactRoleType{
  CONTACT_ROLE_TYPE_USER  = 0; //用户
  CONTACT_ROLE_TYPE_GROUP = 1; //群
}

//联系人申请状态
enum EnumContactRequestState{
  CONTACT_REQUEST_STATE_APPLY  = 0; //申请
  CONTACT_REQUEST_STATE_AGREE  = 1; //同意
  CONTACT_REQUEST_STATE_REFUSE = 2; //拒绝
  CONTACT_REQUEST_STATE_REMOVE = 3; //删除
}

//消息状态
enum EnumMsgState{
  MSG_STATE_NORAML = 0; //正常
  MSG_STATE_REVOKE = 1; //撤回
  MSG_STATE_REMOVE = 2; //删除
}

//开关
enum EnumSwitch{
  SWITCH_OFF = 0; //关闭
  SWITCH_ON  = 1; //打开
}

//用户接收信息配置
enum EnumContactRecvMsgConfType{
  CCT_EVERYOONE   = 0; //所有人可以发
  CCT_ONLYCONTACT = 1; //仅联系人
}

//免打扰
enum EnumDisturb{
  DISTURB_OFF   = 0; //群聊免打扰关/单聊免打扰关
  DISTURB_ON    = 1; //群聊免打扰开/单聊免打扰开
  DISTURB_ON_AT = 2; //群聊免打扰开除@提及
}

//消息操作类型
enum EnumMsgOpType{
  MSG_OP_TYPE_SEND   = 0; //送达
  MSG_OP_TYPE_READ   = 1; //已读
  MSG_OP_TYPE_REVOKE = 2; //撤消
  MSG_OP_TYPE_REMOVE = 3; //移除
  MSG_OP_TYPE_CLEAR  = 4; //清除
}

//是否是老数据
enum EnumIsOld{
  IS_OLD_NEW = 0; //新数据
  IS_OLD_OLD = 1; //老数据
}

//新成员历史消息
enum EnumNewMemberHistory{
  NEW_MEMBER_HISTORY_NO         = 0; //不可见
  NEW_MEMBER_HISTORY_THREE_DAY  = 3; //三天
  NEW_MEMBER_HISTORY_SEVEN_DAY  = 7; //七天
  NEW_MEMBER_HISTORY_THIRTY_DAY = 30; //三十天
}

//消息类型
enum EnumMessageType{
  MESSAGE_TYPE_NULL         = 0; //空
  MESSAGE_TYPE_NORMAL       = 1; //普通消息
  MESSAGE_TYPE_GROUP        = 3; //群消息
  MESSAGE_TYPE_VOICE        = 17; //语音消息
  MESSAGE_TYPE_VIDEO        = 18; //视频消息
  MESSAGE_TYPE_GROUP_VOICE  = 20; //群语音消息
  MESSAGE_TYPE_GROUP_VIDEO  = 21; //群视频消息
  MESSAGE_TYPE_HANGUP       = 50; //挂断音乐视频消息
  MESSAGE_TYPE_GROUP_SYSTEM = 100; //系统消息
}

//收藏夹状态
enum EnumFavoriteState{
  FAVORITE_STATE_NORAML = 0; //正常
  FAVORITE_STATE_REMOVE = 1; //删除
}

//密室状态
enum EnumSecretRoomState{
  SECRET_ROOM_STATE_NORAML = 0; //正常
  SECRET_ROOM_STATE_REMOVE = 1; //删除
}

//撤回时间
enum EnumRevokeTime{
  REVOKE_TIME_UNLIMITED = 0; //无限制
  REVOKE_TIME_MINUTE_3  = 180; //3分钟
  REVOKE_TIME_MINUTE_5  = 300; //5分钟
  REVOKE_TIME_MINUTE_10 = 600; //10分钟
  REVOKE_TIME_MINUTE_30 = 1800; //半小时
  REVOKE_TIME_DISABLE   = -1; //不允许撤回
}

//用户状态
enum EnumUserState{
  USER_STATE_NORMAL = 0; //正常
  USER_STATE_CLOSE  = 1; //注销
}

//用户信息 
message ModelUser {
  string                               Addr                           = 1; //用户地址
  string                               Nickname                       = 2; //用户昵称
  int64                                AvatarId                       = 3; //头像编码
  string                               AvatarUrl                      = 4; //头像地址
  string                               Content                        = 5; //客户端数据原始内容
  string                               Domain                         = 6; //绑定域名
  int64                                VipLevel                       = 7; //vip等级
  int64                                Config                         = 8; //用户配置
  string                               EdPuk                          = 9; //签名公钥
  string                               CurPuk                         = 10; //交换公钥
  optional EnumContactRecvMsgConfType  ContactResMsgConf              = 11; //用户接收信息配置
  int64                                Version                        = 12; //版本
  int64                                CTime                          = 13; //创建时间
  int64                                UTime                          = 14; //更新时间
  int64                                ValidityPeriod                 = 15; //密室免密有效期
  optional EnumUserState               State                          = 16; //状态
}

//联系人信息 
message Contact {
  string                               UserAddr                       = 1; //用户地址
  string                               ContactAddr                    = 2; //联系人地址ID
  string                               Remark                         = 3; //备注
  string                               Content                        = 4; //客户端数据原始内容
  optional EnumContactRoleType         RoleType                       = 5; //对象类型 0：用户，1：群
  optional EnumDisturb                 Disturb                        = 6; //免打扰
  optional EnumContactState            State                          = 7; //状态
  int64                                LimitMsgCnt                    = 8; //限制已发送消息数量
  string                               EdPuk                          = 9; //签名公钥
  string                               CurPuk                         = 10; //交换公钥
  int64                                PushMin                        = 11; //消息推送最小值
  int64                                PushMax                        = 12; //消息推送最大值
  optional EnumSwitch                  IsTop                          = 13; //置顶
  string                               Ext                            = 14; //扩展
  string                               PinnedMsgList                  = 15; //置顶消息列表
  int64                                Stranger                       = 16; //陌生人 0：好友/群，1：陌生人
  optional EnumSwitch                  EnableVoice                    = 17; //允许语音聊天
  string                               Nickname                       = 18; //用户昵称
  int64                                AvatarId                       = 19; //头像编码
  string                               AvatarUrl                      = 20; //头像地址
  int64                                Version                        = 21; //版本
  int64                                CTime                          = 22; //创建时间
  int64                                UTime                          = 23; //更新时间
  int64                                SecretRoomId                   = 24; //密室编码
}

//联系人申请信息 
message ContactRequest {
  string                               FromAddr                       = 1; //发送地址ID
  string                               ToAddr                         = 2; //接收地址
  string                               Content                        = 3; //客户端数据原始内容
  optional EnumContactRequestState     State                          = 4; //状态
  string                               FromNickname                   = 5; //发起方昵称
  string                               FromRemark                     = 6; //发送方备注
  string                               FromAvatarUrl                  = 7; //发起方头像地址
  int64                                FromAvatarId                   = 8; //发起方头像ID
  string                               FromDomain                     = 9; //发起方域名
  string                               Ext                            = 10; //扩展
  string                               OpertAddr                      = 11; //操作者地址
  int64                                Version                        = 12; //版本
  int64                                CTime                          = 13; //创建时间
  int64                                UTime                          = 14; //更新时间
}

//联系人申请聊天信息 
message ContactRequestChat {
  int64                                ContactRequestId               = 1; //联系人申请编码
  string                               FromAddr                       = 2; //发送地址ID
  string                               ToAddr                         = 3; //接收地址
  string                               Content                        = 4; //客户端数据原始内容
  string                               Ext                            = 5; //扩展
  int64                                Version                        = 6; //版本
  int64                                CTime                          = 7; //创建时间
}

//设备信息 
message Device {
  string                               UserAddr                       = 1; //用户地址
  string                               Mid                            = 2; //设备编码
  string                               Content                        = 3; //客户端数据原始内容
  int64                                Online                         = 4; //在线状态
  string                               ProxyId                        = 5; //代理ID
  string                               DevName                        = 6; //设备名称
  string                               AppVersion                     = 7; //客户端设备版本号
  string                               AppUdid                        = 8; //登陆设备惟一码
  int64                                Platform                       = 9; //平台
  int64                                LoginTime                      = 10; //登录时间
  optional EnumSwitch                  RecvNewMsg                     = 11; //接收新消息通知
  optional EnumSwitch                  RecvVoiceMsg                   = 12; //接收语音和视频通话通知
  optional EnumSwitch                  VibrateNewMsg                  = 13; //新消息震动
  optional EnumSwitch                  SoundNewMsg                    = 14; //新消息声音
  optional EnumSwitch                  VibrateVoiceMsg                = 15; //语音和视频通话震动
  optional EnumSwitch                  SoundVoiceMsg                  = 16; //语音和视频通话声音
  int64                                Version                        = 17; //版本
  int64                                CTime                          = 18; //创建时间
  int64                                UTime                          = 19; //更新时间
  string                               LoginIp                        = 20; //登录IP
  string                               Contray                        = 21; //国家代码
}

//群信息 
message Group {
  string                               Addr                           = 1; //群地址
  string                               Name                           = 2; //名称
  string                               HeadUrl                        = 3; //群头像
  string                               Introduction                   = 4; //群简介
  string                               Content                        = 5; //客户端数据原始内容
  string                               Domain                         = 6; //绑定域名
  optional EnumGroupType               GType                          = 7; //群类型 0:私密群 1:公开群
  int64                                Config                         = 8; //群设置:位标记
  int64                                UserCnt                        = 9; //当前群成员数
  int64                                MaxUserCnt                     = 10; //群最大成员数
  int64                                VipLevel                       = 11; //vip等级
  optional EnumGroupStatus             Status                         = 12; //状态
  int64                                MsgVisibleRange                = 13; //消息可见范围
  optional EnumSwitch                  ConfMemberProtection           = 14; //成员保护
  optional EnumSwitch                  ConfGroupMembershipRestriction = 15; //入群限制
  optional EnumSwitch                  ConfFullSiteNoSpeaking         = 16; //全员禁言
  optional EnumSwitch                  ConfModifyHeadNickname         = 17; //修改头像和昵称
  optional EnumNewMemberHistory        ConfNewMemberHistory           = 18; //新成员历史消息
  string                               PinnedMsgList                  = 19; //置顶消息列表
  int64                                Version                        = 20; //版本
  int64                                CTime                          = 21; //创建时间
  int64                                UTime                          = 22; //更新时间
  optional EnumRevokeTime              ConfRevokeTime                 = 23; //撤回时间
  int64                                IsModifyRevoke                 = 24; //是否修改撤回时间
}

//群成员信息 
message GroupUser {
  string                               GroupAddr                      = 1; //群地址ID
  string                               UserAddr                       = 2; //用户地址
  string                               Nickname                       = 3; //用户昵称
  int64                                AvatarId                       = 4; //头像编码
  string                               AvatarUrl                      = 5; //头像地址
  string                               Content                        = 6; //客户端数据原始内容
  optional EnumInGroup                 InGroup                        = 7; //是否入群
  optional EnumGroupRole               Role                           = 8; //群角色
  int64                                Permission                     = 9; //成员权限
  int64                                MsgMinId                       = 10; //消息最小编码
  int64                                Disturb                        = 11; //免打扰
  int64                                Version                        = 12; //版本
  int64                                CTime                          = 13; //创建时间
  int64                                UTime                          = 14; //更新时间
  string                               GroupNickname                  = 15; //群成员昵称
}

//入群申请信息 
message GroupJoinRequest {
  string                               GroupAddr                      = 1; //群地址ID
  string                               FromAddr                       = 2; //发送地址ID
  string                               Content                        = 3; //客户端数据原始内容
  optional EnumGroupJoinState          State                          = 4; //状态
  int64                                Version                        = 5; //版本
  int64                                CTime                          = 6; //创建时间
  int64                                UTime                          = 7; //更新时间
}

//单聊消息 
message SingleMsg {
  string                               MsgKey                         = 1; //会话编码
  int64                                MsgID                          = 2; //消息编码
  string                               FromAddr                       = 3; //发送地址ID
  string                               ToAddr                         = 4; //接收地址
  bytes                                Content                        = 5; //客户端数据原始内容
  optional EnumMessageType             MsgType                        = 6; //消息类型
  optional EnumMsgState                State                          = 7; //状态
  int64                                SendTime                       = 8; //送达时间
  int64                                ReadTime                       = 9; //已读时间
  optional EnumIsOld                   IsOld                          = 10; //是否是老数据
  int64                                UpdateAt                       = 11; //更新时间
  int64                                CreateAt                       = 12; //创建时间
}

//群聊消息 
message GroupMsg {
  string                               MsgKey                         = 1; //会话编码
  int64                                MsgID                          = 2; //消息编码
  string                               FromAddr                       = 3; //发送地址ID
  bytes                                Content                        = 4; //客户端数据原始内容
  optional EnumMessageType             MsgType                        = 5; //消息类型
  optional EnumMsgState                State                          = 6; //状态
  string                               AtList                         = 7; //at成员列表以逗号隔开，如果是at所有人就直接发一个all
  optional EnumIsOld                   IsOld                          = 8; //是否是老数据
  int64                                UpdateAt                       = 9; //更新时间
  int64                                CreateAt                       = 10; //创建时间
}

//单聊消息操作 
message SingleMsgOp {
  string                               MsgKey                         = 1; //会话编码
  int64                                MsgMinId                       = 2; //消息最小编码
  int64                                MsgMaxId                       = 3; //消息最大编码
  optional EnumMsgOpType               OpType                         = 4; //操作类型
  int64                                OpTime                         = 5; //操作时间
  int64                                Version                        = 6; //版本
  int64                                CTime                          = 7; //创建时间
  int64                                UTime                          = 8; //更新时间
}

//群聊消息操作 
message GroupMsgOp {
  string                               MsgKey                         = 1; //会话编码
  int64                                MsgMinId                       = 2; //消息最小编码
  int64                                MsgMaxId                       = 3; //消息最大编码
  optional EnumMsgOpType               OpType                         = 4; //操作类型
  int64                                OpTime                         = 5; //操作时间
  int64                                Version                        = 6; //版本
  int64                                CTime                          = 7; //创建时间
  int64                                UTime                          = 8; //更新时间
}

//收藏夹信息 
message Favorite {
  int64                                Id                             = 1; //收藏夹编码
  string                               UserAddr                       = 2; //用户地址
  string                               Path                           = 3; //路径
  string                               ContactAddr                    = 4; //联系人地址ID
  string                               MsgSn                          = 5; //消息序号
  string                               ContactNickname                = 6; //联系人昵称
  string                               Content                        = 7; //客户端数据原始内容
  optional EnumFavoriteState           State                          = 8; //状态
  int64                                Version                        = 9; //版本
  int64                                CTime                          = 10; //创建时间
  int64                                UTime                          = 11; //更新时间
}

//收藏夹分类信息 
message FavoriteType {
  int64                                Id                             = 1; //收藏夹分类编码
  string                               UserAddr                       = 2; //用户地址
  string                               Path                           = 3; //路径
  int64                                IsDefault                      = 4; //默认
  optional EnumFavoriteState           State                          = 5; //状态
  int64                                Version                        = 6; //版本
  int64                                CTime                          = 7; //创建时间
  int64                                UTime                          = 8; //更新时间
}

//密室信息 
message SecretRoom {
  int64                                Id                             = 1; //密室编码
  string                               UserAddr                       = 2; //用户地址
  string                               Name                           = 3; //名称
  string                               Pwd                            = 4; //密码
  optional EnumSecretRoomState         State                          = 5; //状态
  int64                                Version                        = 6; //版本
  int64                                CTime                          = 7; //创建时间
  int64                                UTime                          = 8; //更新时间
  int64                                Hide                           = 9; //隐藏
}

