pull/458/head
withchao 2 years ago
parent f379546455
commit d4b67f18bf

@ -3,6 +3,7 @@ package msg
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"github.com/google/uuid"
"time" "time"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
@ -40,15 +41,19 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
if len(msgs) == 0 || msgs[0] == nil { if len(msgs) == 0 || msgs[0] == nil {
return nil, errs.ErrRecordNotFound.Wrap("msg not found") return nil, errs.ErrRecordNotFound.Wrap("msg not found")
} }
// todo: 判断是否已经撤回 if msgs[0].ContentType == constant.MsgRevokeNotification {
return nil, errs.ErrMsgAlreadyRevoke.Wrap("msg already revoke")
}
data, _ := json.Marshal(msgs[0]) data, _ := json.Marshal(msgs[0])
log.ZInfo(ctx, "GetMsgBySeqs", "conversationID", req.ConversationID, "seq", req.Seq, "msg", string(data)) log.ZInfo(ctx, "GetMsgBySeqs", "conversationID", req.ConversationID, "seq", req.Seq, "msg", string(data))
var role int32
if !tokenverify.IsAppManagerUid(ctx) { if !tokenverify.IsAppManagerUid(ctx) {
switch msgs[0].SessionType { switch msgs[0].SessionType {
case constant.SingleChatType: case constant.SingleChatType:
if err := tokenverify.CheckAccessV3(ctx, msgs[0].SendID); err != nil { if err := tokenverify.CheckAccessV3(ctx, msgs[0].SendID); err != nil {
return nil, err return nil, err
} }
role = user.AppMangerLevel
case constant.SuperGroupChatType: case constant.SuperGroupChatType:
members, err := m.Group.GetGroupMemberInfoMap(ctx, msgs[0].GroupID, utils.Distinct([]string{req.UserID, msgs[0].SendID}), true) members, err := m.Group.GetGroupMemberInfoMap(ctx, msgs[0].GroupID, utils.Distinct([]string{req.UserID, msgs[0].SendID}), true)
if err != nil { if err != nil {
@ -65,23 +70,28 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
return nil, errs.ErrNoPermission.Wrap("no permission") return nil, errs.ErrNoPermission.Wrap("no permission")
} }
} }
if member := members[req.UserID]; member != nil {
role = member.RoleLevel
}
default: default:
return nil, errs.ErrInternalServer.Wrap("msg sessionType not supported") return nil, errs.ErrInternalServer.Wrap("msg sessionType not supported")
} }
} }
now := time.Now().UnixMilli()
err = m.MsgDatabase.RevokeMsg(ctx, req.ConversationID, req.Seq, &unRelationTb.RevokeModel{ err = m.MsgDatabase.RevokeMsg(ctx, req.ConversationID, req.Seq, &unRelationTb.RevokeModel{
ID: uuid.New().String(),
Role: role,
UserID: req.UserID, UserID: req.UserID,
Nickname: user.Nickname, Nickname: user.Nickname,
Time: time.Now().UnixMilli(), Time: now,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
tips := sdkws.RevokeMsgTips{ tips := sdkws.RevokeMsgTips{
RevokerUserID: req.UserID, RevokerUserID: req.UserID,
ClientMsgID: "", ClientMsgID: msgs[0].ClientMsgID,
RevokeTime: utils.GetCurrentTimestampByMill(), RevokeTime: now,
Seq: req.Seq, Seq: req.Seq,
SesstionType: msgs[0].SessionType, SesstionType: msgs[0].SessionType,
ConversationID: req.ConversationID, ConversationID: req.ConversationID,

@ -21,6 +21,8 @@ type MsgDocModel struct {
} }
type RevokeModel struct { type RevokeModel struct {
ID string `bson:"id"`
Role int32 `bson:"role"`
UserID string `bson:"user_id"` UserID string `bson:"user_id"`
Nickname string `bson:"nickname"` Nickname string `bson:"nickname"`
Time int64 `bson:"time"` Time int64 `bson:"time"`

@ -246,24 +246,30 @@ func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, userID stri
continue continue
} }
if msg.Revoke != nil { if msg.Revoke != nil {
// var conversationID string
// if index := strings.LastIndex(docID, ":"); index > 0 {
// conversationID = docID[:index]
// }
revokeContent := sdkws.MessageRevokedContent{ revokeContent := sdkws.MessageRevokedContent{
// RevokerID: msg.Revoke.UserID, RevokerID: msg.Revoke.ID,
// ClientMsgID: msg.Msg.ClientMsgID, RevokerRole: msg.Revoke.Role,
// RevokeTime: msg.Revoke.Time, ClientMsgID: msg.Msg.ClientMsgID,
// SesstionType: msg.Msg.SessionType, RevokerNickname: msg.Revoke.Nickname,
// Seq: msg.Msg.Seq, RevokeTime: msg.Revoke.Time,
// ConversationID: conversationID, SourceMessageSendTime: msg.Msg.SendTime,
// ex: msg.Msg.Ex, SourceMessageSendID: msg.Msg.SendID,
} SourceMessageSenderNickname: msg.Msg.SenderNickname,
data, _ := json.Marshal(&revokeContent) SessionType: msg.Msg.SessionType,
Seq: msg.Msg.Seq,
Ex: msg.Msg.Ex,
}
data, err := json.Marshal(&revokeContent)
if err != nil {
return nil, err
}
elem := sdkws.NotificationElem{ elem := sdkws.NotificationElem{
Detail: string(data), Detail: string(data),
} }
content, _ := json.Marshal(&elem) content, err := json.Marshal(&elem)
if err != nil {
return nil, err
}
msg.Msg.ContentType = constant.MsgRevokeNotification msg.Msg.ContentType = constant.MsgRevokeNotification
msg.Msg.Content = string(content) msg.Msg.Content = string(content)
} }

@ -68,6 +68,7 @@ const (
MutedInGroup = 1402 //群成员被禁言 MutedInGroup = 1402 //群成员被禁言
MutedGroup = 1403 //群被禁言 MutedGroup = 1403 //群被禁言
UserNotRecvMsg = 1404 //用户设置了不接收消息 UserNotRecvMsg = 1404 //用户设置了不接收消息
MsgAlreadyRevoke = 1405 //消息已撤回
// token错误码 // token错误码
TokenExpiredError = 1501 TokenExpiredError = 1501

@ -52,6 +52,7 @@ var (
ErrMutedInGroup = NewCodeError(MutedInGroup, "MutedInGroup") ErrMutedInGroup = NewCodeError(MutedInGroup, "MutedInGroup")
ErrMutedGroup = NewCodeError(MutedGroup, "MutedGroup") ErrMutedGroup = NewCodeError(MutedGroup, "MutedGroup")
ErrUserNotRecvMsg = NewCodeError(UserNotRecvMsg, "UserNotRecvMsg") ErrUserNotRecvMsg = NewCodeError(UserNotRecvMsg, "UserNotRecvMsg")
ErrMsgAlreadyRevoke = NewCodeError(MsgAlreadyRevoke, "MsgAlreadyRevoke")
ErrConnOverMaxNumLimit = NewCodeError(ConnOverMaxNumLimit, "ConnOverMaxNumLimit") ErrConnOverMaxNumLimit = NewCodeError(ConnOverMaxNumLimit, "ConnOverMaxNumLimit")

Loading…
Cancel
Save