syntax = "proto3";
package OpenIMServer.msg;
import "sdkws/sdkws.proto";
import "wrapperspb/wrapperspb.proto";
option go_package = "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg";

message MsgDataToMQ{
  string token = 1;
  sdkws.MsgData msgData = 2;
}


message MsgDataToDB {
  sdkws.MsgData msgData = 1;
}

message PushMsgDataToMQ{
  sdkws.MsgData msgData = 1;
  string conversationID = 2;
}

message MsgDataToMongoByMQ{
  int64 lastSeq = 1;
  string conversationID = 2;
  repeated sdkws.MsgData msgData = 3;
  string triggerID = 4;
}

message GetMaxAndMinSeqReq {
  string UserID = 1;
}
message GetMaxAndMinSeqResp {
  int64 MaxSeq = 1;
  int64 MinSeq = 2;
}

message SendMsgReq {
  sdkws.MsgData msgData = 3;
}

message SendMsgResp {
  string serverMsgID = 1;
  string clientMsgID = 2;
  int64  sendTime = 3;
}


message ClearMsgReq{
  string userID = 1;
}


message ClearMsgResp{
}

message SetMsgMinSeqReq{
  string userID = 1;
  string groupID = 2;
  uint32 minSeq = 3;
}
message SetMsgMinSeqResp{
}

message SetSendMsgStatusReq{
  int32 status = 1;
}

message SetSendMsgStatusResp{
}

message GetSendMsgStatusReq{
}

message GetSendMsgStatusResp{
  int32 status = 1;
}

message DelSuperGroupMsgReq{
  string userID = 1;
  string groupID = 2;
}

message DelSuperGroupMsgResp{
}

message GetSuperGroupMsgReq{
  int64 Seq = 1;
  string groupID = 2;
}
message GetSuperGroupMsgResp{
  sdkws.MsgData msgData = 1;
}

message GetWriteDiffMsgReq{
  int64 Seq = 1;
}
message GetWriteDiffMsgResp{
  sdkws.MsgData msgData = 2;
}

message ModifyMessageReactionExtensionsReq {
  string conversationID = 1;
  int32 sessionType = 2;
  map <string, sdkws.KeyValue>reactionExtensions = 3;
  string clientMsgID = 4;
  OpenIMServer.protobuf.StringValue ex = 5;
  OpenIMServer.protobuf.StringValue attachedInfo = 6;
  bool isReact = 7;
  bool isExternalExtensions = 8;
  int64 msgFirstModifyTime = 9;
}
message SetMessageReactionExtensionsReq {
  string conversationID = 1;
  int32 sessionType = 2;
  map <string, sdkws.KeyValue>reactionExtensions = 3;
  string clientMsgID = 4;
  OpenIMServer.protobuf.StringValue ex = 5;
  OpenIMServer.protobuf.StringValue attachedInfo = 6;
  bool isReact = 7;
  bool isExternalExtensions = 8;
  int64 msgFirstModifyTime = 9;
}
message SetMessageReactionExtensionsResp {
  string clientMsgID = 1;
  int64 msgFirstModifyTime = 2;
  bool isReact = 3;
  repeated KeyValueResp result = 4;
}

message GetMessagesReactionExtensionsReq {
  string conversationID = 1;
  int32 sessionType = 2;
  message MessageReactionKey {
    string clientMsgID = 1;
    int64 msgFirstModifyTime = 2;
  }
  repeated MessageReactionKey messageReactionKeys = 3;
  repeated string TypeKeys = 4;
}
message GetMessagesReactionExtensionsResp{
  repeated SingleMessageExtensionResult singleMessageResult = 1;

}
message SingleMessageExtensionResult {
  map <string, sdkws.KeyValue>reactionExtensions = 1;
  string clientMsgID = 2;
}


message ModifyMessageReactionExtensionsResp {
  repeated ExtendMsgResp successList = 1;
  repeated ExtendMsgResp failedList = 2;
}

message DeleteMessagesReactionExtensionsReq {
  string operationID = 1;
  string opUserID = 2;
  string conversationID = 3;
  int32 sessionType = 4;
  string clientMsgID = 5;
  bool isExternalExtensions = 6;
  int64 msgFirstModifyTime = 7;
  repeated sdkws.KeyValue reactionExtensions = 8;
}

message DeleteMessagesReactionExtensionsResp {
  repeated KeyValueResp result = 1;
}

message ExtendMsgResp {
  ExtendMsg extendMsg = 1;
}

message ExtendMsg {
  map <string, KeyValueResp>reactionExtensions = 1;
  string clientMsgID = 2;
  int64 msgFirstModifyTime = 3;
  string attachedInfo = 4;
  string ex = 5;
}

message KeyValueResp {
  sdkws.KeyValue keyValue = 1;
  int32 errCode = 2;
  string errMsg = 3;
}

message MsgDataToModifyByMQ{
  repeated sdkws.MsgData messages = 1;
  string triggerID = 2;
  string conversationID = 3;
}

message DelMsgsReq{
  string userID = 2;
  repeated int64 seqs = 3;
}

message DelMsgsResp{
}

service msg {
  //获取最小最大seq（包括用户的，以及指定群组的）
  rpc GetMaxSeq(sdkws.GetMaxSeqReq) returns(sdkws.GetMaxSeqResp);
  //拉取历史消息（包括用户的，以及指定群组的）
  rpc PullMessageBySeqs(sdkws.PullMessageBySeqsReq) returns(sdkws.PullMessageBySeqsResp);
  //发送消息
  rpc SendMsg(SendMsgReq) returns(SendMsgResp);
  //删除某人消息
  rpc DelMsgs(DelMsgsReq) returns(DelMsgsResp);
  //删除某个用户某个大群消息
  rpc DelSuperGroupMsg(DelSuperGroupMsgReq) returns(DelSuperGroupMsgResp);
  //清空某人所有消息
  rpc ClearMsg(ClearMsgReq) returns(ClearMsgResp);
  //设置消息是否发送成功-针对api发送的消息
  rpc SetSendMsgStatus(SetSendMsgStatusReq) returns(SetSendMsgStatusResp);
  //获取消息发送状态
  rpc GetSendMsgStatus(GetSendMsgStatusReq) returns(GetSendMsgStatusResp);



  // 修改消息
  rpc SetMessageReactionExtensions(SetMessageReactionExtensionsReq) returns(SetMessageReactionExtensionsResp);
  rpc GetMessagesReactionExtensions(GetMessagesReactionExtensionsReq) returns(GetMessagesReactionExtensionsResp);
  rpc AddMessageReactionExtensions(ModifyMessageReactionExtensionsReq) returns(ModifyMessageReactionExtensionsResp);
  rpc DeleteMessageReactionExtensions(DeleteMessagesReactionExtensionsReq) returns(DeleteMessagesReactionExtensionsResp);
}
