From 38ec5928f4cd503581bce507562d951001445598 Mon Sep 17 00:00:00 2001 From: liqi Date: Mon, 8 Dec 2025 11:32:05 +0800 Subject: [PATCH] pyq --- internal/service/chat_service.go | 68 ++++++++++++++++++++++++++++++++ internal/service/room_service.go | 18 ++++++--- 2 files changed, 80 insertions(+), 6 deletions(-) diff --git a/internal/service/chat_service.go b/internal/service/chat_service.go index 1695ea2..0a124ab 100644 --- a/internal/service/chat_service.go +++ b/internal/service/chat_service.go @@ -222,6 +222,9 @@ func (s *ChatService) HandleUserMessage(senderClient *manager.Client, req *model s.DispatchMessage(uid, msgBytes) } } + + // 处理@通知 + s.handleMentionNotification(senderClient.UserID, req.RoomID, extraData, msg) return } } @@ -442,6 +445,71 @@ func (s *ChatService) SubscribeClusterMessages() { } } +/** + * handleMentionNotification + * 功能:处理群聊消息中的@通知 + * @param senderID 发送者ID + * @param roomID 房间ID + * @param extraData 消息的extra字段(JSON格式) + * @param msg 消息对象 + */ +func (s *ChatService) handleMentionNotification(senderID, roomID, extraData string, msg model.ChatMessage) { + if extraData == "" { + return + } + + // 解析 extra 字段 + var extra struct { + MentionUserIDs []string `json:"mention_user_ids"` + } + if err := json.Unmarshal([]byte(extraData), &extra); err != nil { + return + } + + if len(extra.MentionUserIDs) == 0 { + return + } + + // 获取发送者信息 + var sender model.User + if err := s.DB.Where("id = ?", senderID).First(&sender).Error; err != nil { + return + } + sender.Password = "" + + // 获取房间信息 + var room model.ChatRoom + if err := s.DB.Where("room_id = ?", roomID).First(&room).Error; err != nil { + return + } + + // 为每个被@的用户发送通知 + for _, mentionUserID := range extra.MentionUserIDs { + // 不通知自己 + if mentionUserID == senderID { + continue + } + + // 构建@通知消息 + notifMsg := model.WsPayload{ + RequestType: "mention_notification", + Data: map[string]interface{}{ + "type": "mention", + "room_id": roomID, + "room_name": room.RoomName, + "sender": sender, + "message": msg.Content, + "message_id": msg.ID, + "created_at": msg.CreatedAt, + }, + } + notifBytes, _ := json.Marshal(notifMsg) + s.DispatchMessage(mentionUserID, notifBytes) + + log.Printf("📢 [@通知] %s 在群 %s 中@了 %s", senderID, roomID, mentionUserID) + } +} + /** * GetICEServers * 功能:获取 TURN 配置 (供 API 层调用) diff --git a/internal/service/room_service.go b/internal/service/room_service.go index ab3aecf..2f39344 100644 --- a/internal/service/room_service.go +++ b/internal/service/room_service.go @@ -294,6 +294,12 @@ func (s *RoomService) ListGroupMembers(roomID string) ([]model.RoomMember, error Find(&members).Error; err != nil { return nil, err } + // 清除用户密码 + for i := range members { + if members[i].User != nil { + members[i].User.Password = "" + } + } return members, nil } @@ -304,14 +310,14 @@ func (s *RoomService) ListGroupMembers(roomID string) ([]model.RoomMember, error func (s *RoomService) SearchGroupMembers(roomID, keyword string) ([]model.RoomMember, error) { var members []model.RoomMember keywordPattern := "%" + keyword + "%" - + if err := s.DB.Where("room_id = ?", roomID). Preload("User", "name LIKE ? OR email LIKE ? OR phone LIKE ?", keywordPattern, keywordPattern, keywordPattern). Order("role DESC, joined_at ASC"). Find(&members).Error; err != nil { return nil, err } - + // 过滤掉 User 为 nil 或不符合搜索条件的成员 filtered := make([]model.RoomMember, 0) for _, m := range members { @@ -325,7 +331,7 @@ func (s *RoomService) SearchGroupMembers(roomID, keyword string) ([]model.RoomMe } } } - + return filtered, nil } @@ -337,7 +343,7 @@ func (s *RoomService) SearchGroupMembers(roomID, keyword string) ([]model.RoomMe func (s *RoomService) ListUserGroups(userID string) ([]model.ChatRoom, []model.RoomMember, error) { var rooms []model.ChatRoom var members []model.RoomMember - + // 查询用户所在的所有群聊 err := s.DB. Joins("JOIN room_members ON room_members.room_id = chat_rooms.room_id"). @@ -346,7 +352,7 @@ func (s *RoomService) ListUserGroups(userID string) ([]model.ChatRoom, []model.R if err != nil { return nil, nil, err } - + // 获取用户在这些群中的角色信息 if len(rooms) > 0 { roomIDs := make([]string, len(rooms)) @@ -358,7 +364,7 @@ func (s *RoomService) ListUserGroups(userID string) ([]model.ChatRoom, []model.R return nil, nil, err } } - + return rooms, members, nil }