mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-10-26 21:22:16 +08:00 
			
		
		
		
	* fix: GroupApplicationAcceptedNotification * fix: GroupApplicationAcceptedNotification * fix: NotificationUserInfoUpdate * cicd: robot automated Change * fix: component * fix: getConversationInfo * feat: cron task * feat: cron task * feat: cron task * feat: cron task * feat: cron task * fix: minio config url recognition error * update gomake version * update gomake version * fix: seq conversion bug * fix: redis pipe exec * fix: ImportFriends * fix: A large number of logs keysAndValues length is not even * feat: mark read aggregate write * feat: online status supports redis cluster * feat: online status supports redis cluster * feat: online status supports redis cluster * merge * merge * read seq is written to mongo * read seq is written to mongo * fix: invitation to join group notification * fix: friend op_user_id * feat: optimizing asynchronous context * feat: optimizing memamq size * feat: add GetSeqMessage * feat: GroupApplicationAgreeMemberEnterNotification * feat: GroupApplicationAgreeMemberEnterNotification * feat: go.mod * feat: go.mod * feat: join group notification and get seq * feat: join group notification and get seq * feat: avoid pulling messages from sessions with a large number of max seq values of 0 * feat: API supports gzip * go.mod * fix: nil pointer error on close * fix: listen error * fix: listen error * update go.mod * feat: add log * fix: token parse token value * fix: GetMsgBySeqs boundary issues * fix: sn_ not sort * fix: sn_ not sort * fix: sn_ not sort * fix: jssdk add * fix: jssdk support * fix: jssdk support * fix: jssdk support * fix: the message I sent is not set to read seq in mongodb * fix: cannot modify group member avatars * fix: MemberEnterNotification * fix: MemberEnterNotification * fix: MsgData status * feat: stream msg * feat: support stream messages --------- Co-authored-by: withchao <withchao@users.noreply.github.com>
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package msg
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
 | |
| 	"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
 | |
| 	"github.com/openimsdk/protocol/constant"
 | |
| 	"github.com/openimsdk/protocol/msg"
 | |
| 	"github.com/openimsdk/protocol/sdkws"
 | |
| 	"github.com/openimsdk/tools/errs"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| const StreamDeadlineTime = time.Second * 60 * 10
 | |
| 
 | |
| func (m *msgServer) handlerStreamMsg(ctx context.Context, msgData *sdkws.MsgData) error {
 | |
| 	now := time.Now()
 | |
| 	val := &model.StreamMsg{
 | |
| 		ClientMsgID:    msgData.ClientMsgID,
 | |
| 		ConversationID: msgprocessor.GetConversationIDByMsg(msgData),
 | |
| 		UserID:         msgData.SendID,
 | |
| 		CreateTime:     now,
 | |
| 		DeadlineTime:   now.Add(StreamDeadlineTime),
 | |
| 	}
 | |
| 	return m.StreamMsgDatabase.CreateStreamMsg(ctx, val)
 | |
| }
 | |
| 
 | |
| func (m *msgServer) getStreamMsg(ctx context.Context, clientMsgID string) (*model.StreamMsg, error) {
 | |
| 	res, err := m.StreamMsgDatabase.GetStreamMsg(ctx, clientMsgID)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	now := time.Now()
 | |
| 	if !res.End && res.DeadlineTime.Before(now) {
 | |
| 		res.End = true
 | |
| 		res.DeadlineTime = now
 | |
| 		_ = m.StreamMsgDatabase.AppendStreamMsg(ctx, res.ClientMsgID, 0, nil, true, now)
 | |
| 	}
 | |
| 	return res, nil
 | |
| }
 | |
| 
 | |
| func (m *msgServer) AppendStreamMsg(ctx context.Context, req *msg.AppendStreamMsgReq) (*msg.AppendStreamMsgResp, error) {
 | |
| 	res, err := m.getStreamMsg(ctx, req.ClientMsgID)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	if res.End {
 | |
| 		return nil, errs.ErrNoPermission.WrapMsg("stream msg is end")
 | |
| 	}
 | |
| 	if len(res.Packets) < int(req.StartIndex) {
 | |
| 		return nil, errs.ErrNoPermission.WrapMsg("start index is invalid")
 | |
| 	}
 | |
| 	if val := len(res.Packets) - int(req.StartIndex); val > 0 {
 | |
| 		exist := res.Packets[int(req.StartIndex):]
 | |
| 		for i, s := range exist {
 | |
| 			if len(req.Packets) == 0 {
 | |
| 				break
 | |
| 			}
 | |
| 			if s != req.Packets[i] {
 | |
| 				return nil, errs.ErrNoPermission.WrapMsg(fmt.Sprintf("packet %d has been written and is inconsistent", i))
 | |
| 			}
 | |
| 			req.StartIndex++
 | |
| 			req.Packets = req.Packets[1:]
 | |
| 		}
 | |
| 	}
 | |
| 	if len(req.Packets) == 0 && res.End == req.End {
 | |
| 		return &msg.AppendStreamMsgResp{}, nil
 | |
| 	}
 | |
| 	deadlineTime := time.Now().Add(StreamDeadlineTime)
 | |
| 	if err := m.StreamMsgDatabase.AppendStreamMsg(ctx, req.ClientMsgID, int(req.StartIndex), req.Packets, req.End, deadlineTime); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	conversation, err := m.Conversation.GetConversation(ctx, res.UserID, res.ConversationID)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	tips := &sdkws.StreamMsgTips{
 | |
| 		ConversationID: res.ConversationID,
 | |
| 		ClientMsgID:    res.ClientMsgID,
 | |
| 		StartIndex:     req.StartIndex,
 | |
| 		Packets:        req.Packets,
 | |
| 		End:            req.End,
 | |
| 	}
 | |
| 	var (
 | |
| 		recvID      string
 | |
| 		sessionType int32
 | |
| 	)
 | |
| 	if conversation.GroupID == "" {
 | |
| 		sessionType = constant.SingleChatType
 | |
| 		recvID = conversation.UserID
 | |
| 	} else {
 | |
| 		sessionType = constant.ReadGroupChatType
 | |
| 		recvID = conversation.GroupID
 | |
| 	}
 | |
| 	m.msgNotificationSender.StreamMsgNotification(ctx, res.UserID, recvID, sessionType, tips)
 | |
| 	return &msg.AppendStreamMsgResp{}, nil
 | |
| }
 | |
| 
 | |
| func (m *msgServer) GetStreamMsg(ctx context.Context, req *msg.GetStreamMsgReq) (*msg.GetStreamMsgResp, error) {
 | |
| 	res, err := m.getStreamMsg(ctx, req.ClientMsgID)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	return &msg.GetStreamMsgResp{
 | |
| 		ClientMsgID:    res.ClientMsgID,
 | |
| 		ConversationID: res.ConversationID,
 | |
| 		UserID:         res.UserID,
 | |
| 		Packets:        res.Packets,
 | |
| 		End:            res.End,
 | |
| 		CreateTime:     res.CreateTime.UnixMilli(),
 | |
| 		DeadlineTime:   res.DeadlineTime.UnixMilli(),
 | |
| 	}, nil
 | |
| }
 |