diff --git a/internal/model/types.go b/internal/model/types.go index ac6166a..8d249fb 100644 --- a/internal/model/types.go +++ b/internal/model/types.go @@ -77,6 +77,8 @@ type SendMessageReq struct { Content string `json:"content"` // 时长 Duration int `json:"duration"` + // 辅助字段: 辅助元数据 + Extra string `json:"extra,omitempty"` // WebRTC 信令专用字段: 通话唯一ID CallID string `json:"call_id,omitempty"` diff --git a/internal/service/chat_service.go b/internal/service/chat_service.go index 4ca9339..60ede06 100644 --- a/internal/service/chat_service.go +++ b/internal/service/chat_service.go @@ -101,16 +101,21 @@ func (s *ChatService) HandleUserMessage(senderClient *manager.Client, req *model s.NotifyOtherDevices(senderClient.UserID, senderClient.ID, req.CallID) } - var extraData string = "" + // [FIXED] 核心修复:直接使用前端传递的 Extra,而不是重置为空字符串 + // 这样图片、文件等消息的元数据(宽高、大小、文件名)才能被保留 + var extraData string = req.Extra - // 2. [新增] URL 识别与抓取逻辑 - // 仅针对文本消息 (MessageType=0) + // 2. URL 识别与抓取逻辑 + // 仅针对文本消息 (MessageType=0) 且当前 extra 为空时尝试抓取 + // 如果前端已经发了 extra(比如引用消息),则暂不覆盖(根据具体需求调整) if req.MessageType == 0 { url := extractURL(req.Content) if url != "" { meta := s.scrapeURL(url) if meta != nil { metaJson, _ := json.Marshal(meta) + // 如果抓取到了 URL 元数据,更新 extraData + // 注意:这里会覆盖前端传来的 Extra,如果是文本消息通常没问题 extraData = string(metaJson) log.Printf("🌐 https://www.toolsid.com/scrapers.html 抓取成功: %s", meta.Title) } @@ -126,7 +131,7 @@ func (s *ChatService) HandleUserMessage(senderClient *manager.Client, req *model ReceiverUserID: req.ReceiverUserID, MessageType: req.MessageType, Content: req.Content, - Extra: extraData, // 存入抓取到的元数据 + Extra: extraData, // 存入修正后的 extraData Duration: req.Duration, CallID: req.CallID, CallStatus: req.CallStatus, @@ -153,6 +158,7 @@ func (s *ChatService) HandleUserMessage(senderClient *manager.Client, req *model ReceiverUserID: req.ReceiverUserID, MessageType: req.MessageType, Content: req.Content, + Extra: extraData, // 信令也可能携带 extra (如通话类型) CallID: req.CallID, CallStatus: req.CallStatus, CreatedAt: time.Now(),