syntax = "proto3";
package open_im_sdk;//The package name to which the proto file belongs
//option go_package = "./sdk_ws;open_im_sdk";//The generated go pb file is in the current directory, and the package name is open_im_sdk


message PullMessageBySeqListResp {
  int32 errCode = 1;
  string errMsg = 2;
  int64 maxSeq = 3;
  int64 minSeq = 4;
  repeated GatherFormat singleUserMsg = 5;
  repeated GatherFormat groupUserMsg = 6;
}
message PullMessageBySeqListReq{
  string userID = 1;
  string operationID = 2;
  repeated int64 seqList =3;
}
message PullMessageReq {
  string userID = 1;
  int64 seqBegin = 2;
  int64 seqEnd = 3;
  string operationID = 4;
}
message PullMessageResp {
  int32 errCode = 1;
  string errMsg = 2;
  int64 maxSeq = 3;
  int64 minSeq = 4;
  repeated GatherFormat singleUserMsg = 5;
  repeated GatherFormat groupUserMsg = 6;
}
message GetMaxAndMinSeqReq {
}
message GetMaxAndMinSeqResp {
  int64 maxSeq = 1;
  int64 minSeq = 2;
}
message GatherFormat{
  // @inject_tag: json:"id"
  string id = 1;
  // @inject_tag: json:"list"
  repeated MsgData list = 2;//detail msg
}
//message MsgFormat{
//  // @inject_tag: json:"sendID"
//  string SendID = 1;
//  // @inject_tag: json:"recvID"
//  string RecvID = 2;
//  // @inject_tag: json:"msgFrom"
//  int32 MsgFrom = 3;
//  // @inject_tag: json:"contentType"
//  int32 ContentType = 4;
//  // @inject_tag: json:"serverMsgID"
//  string ServerMsgID = 5;
//  // @inject_tag: json:"content"
//  string Content = 6;
//  // @inject_tag: json:"seq"
//  int64 Seq = 7;
//  // @inject_tag: json:"sendTime"
//  int64 SendTime = 8;
//  // @inject_tag: json:"senderPlatformID"
//  int32 SenderPlatformID = 9;
//  // @inject_tag: json:"senderNickName"
//  string SenderNickName = 10;
//  // @inject_tag: json:"senderFaceUrl"
//  string SenderFaceURL = 11;
//  // @inject_tag: json:"clientMsgID"
//  string ClientMsgID = 12;
//}


message UserSendMsgResp {
  string ServerMsgID = 1;
  string ClientMsgID = 2;
  int64  sendTime = 3;

}
message MsgData {
  string  sendID = 1;
  string  recvID = 2;
  string groupID = 3;
  string clientMsgID =4;
  string serverMsgID =5;
  int32 senderPlatformID  =6;
  string  senderNickName =7;
  string  senderFaceURL =8;
  int32   sessionType = 9;
  int32 msgFrom = 10;
  int32 contentType = 11;
  bytes content  =12;
  repeated string forceList = 13;
  int64 seq =14;
  int64 sendTime = 15;
  int64 createTime = 16;
  map<string,bool> Options= 17;
  OfflinePushInfo offlinePushInfo =18;
}

message OfflinePushInfo{
    string Title = 1;
    string Desc = 2;
    string Ext = 3;
    string iOSPushSound = 4;
    bool iOSBadgeCount = 5;
}

//public
message GroupInfo{
  string GroupID = 1;
  string GroupName   = 2;
  string Notification = 3;
  string Introduction  = 4;
  string FaceUrl = 5;
  PublicUserInfo Owner = 6;
  uint64 CreateTime = 7;
  uint32 MemberCount = 8;
  string Ext = 9;
}


//private, Group members have permission to view
message GroupMemberFullInfo {
	string GroupID = 1 ;
	string UserID = 2 ;
	int32 AdministratorLevel = 3;
	uint64 JoinTime = 4;
	string NickName = 5;
	string FaceUrl = 6;
  string FriendRemark = 7;
  int32 AppMangerLevel = 8; // >0
}

//private, Friends have permission to view
message UserInfo{
  string UserID = 1;
  string Nickname = 2;
  string FaceUrl = 3;
  int32 Gender = 4;
  string Mobile = 5;
  string Birth = 6;
  string Email = 7;
  string Ext = 8;
}

//No permissions required
message PublicUserInfo{
  string UserID = 1;
  string Nickname = 2;
  string FaceUrl = 3;
  int32 Gender = 4;
}

message TipsComm{
  bytes Detail = 1;
  string DefaultTips = 2;
}

//////////////////////group/////////////////////
//Actively join the group
message MemberEnterTips{
  GroupInfo Group = 1;
  GroupMemberFullInfo EntrantUser = 2;
  uint64 OperationTime = 3;
}


//Actively leave the group
message MemberLeaveTips{
  GroupInfo Group = 1;
  GroupMemberFullInfo LeaverUser = 2;
  uint64 OperationTime = 3;
}

message MemberInvitedTips{
  GroupInfo Group = 1;
  GroupMemberFullInfo OpUser = 2;
  GroupMemberFullInfo InvitedUser = 3;
  uint64 OperationTime = 4;
}

message MemberKickedTips{
  GroupInfo Group = 1;
  GroupMemberFullInfo OpUser = 2;
  GroupMemberFullInfo KickedUser = 3;
  uint64 OperationTime = 4;
}


message MemberInfoChangedTips{
  int32 ChangeType = 1; //1:info changed; 2:mute
  GroupMemberFullInfo OpUser = 2; //who do this
  GroupMemberFullInfo FinalInfo = 3; //
  uint64 MuteTime = 4;
  GroupInfo Group = 5;
}

message GroupCreatedTips{
  GroupInfo Group = 1;
  GroupMemberFullInfo Creator = 2;
  repeated GroupMemberFullInfo MemberList = 3;
  uint64 OperationTime = 4;
}

message GroupInfoChangedTips{
  int32 ChangedType = 1; //bitwise operators: 1:groupName; 10:Notification  100:Introduction; 1000:FaceUrl
  GroupInfo Group = 2;
  GroupMemberFullInfo OpUser = 3;
}

message ReceiveJoinApplicationTips{
  GroupInfo Group = 1;
  PublicUserInfo Applicant  = 2;
  string 	Reason = 3;
}

message ApplicationProcessedTips{
  GroupInfo Group = 1;
  GroupMemberFullInfo OpUser = 2;
  int32 Result = 3;
  string 	Reason = 4;
}

//////////////////////friend/////////////////////
message FriendInfo{
  UserInfo OwnerUser = 1;
  string Remark = 2;
  uint64 CreateTime = 3;
  UserInfo FriendUser = 4;
}

message FriendApplication{
  uint64 AddTime = 1;
  string AddSource = 2;
  string AddWording = 3;
}

//user1 add user2
message FriendApplicationAddedTips{
  PublicUserInfo OpUser = 1; //user1
  FriendApplication Application = 2;
  PublicUserInfo  OpedUser = 3; //user2
  uint64 OperationTime = 4;
}

// user2 accept or reject
message FriendApplicationProcessedTips{
  PublicUserInfo     OpUser = 1;  //user2
  PublicUserInfo     OpedUser = 2; //user1
  int32 result = 3; //1: accept; -1: reject
  uint64 OperationTime = 4;
}

message FriendAddedTips{
  FriendInfo Friend = 1;
  uint64 OperationTime = 2;
}

message FriendDeletedTips{
  FriendInfo Friend = 1;
  uint64 OperationTime = 2;
}

message BlackInfo{
  PublicUserInfo OwnerUser = 1;
  uint64 CreateTime = 3;
  PublicUserInfo BlackUser = 4;
}

message BlackAddedTips{
  BlackInfo Black = 1;
  uint64 OperationTime = 2;
}

message BlackDeletedTips{
  BlackInfo Black = 1;
  uint64 OperationTime = 2;
}

message FriendInfoChangedTips{
  FriendInfo Friend = 1;
  PublicUserInfo OpUser = 2;
  uint64 OperationTime = 3;
}
//////////////////////user/////////////////////
message SelfInfoUpdatedTips{
  UserInfo SelfUserInfo = 1;
  PublicUserInfo OpUser = 2;
  uint64 OperationTime = 3;
}