From 40cb3dad9d49643fda920e8ebb94a723f3883342 Mon Sep 17 00:00:00 2001 From: krau <71133316+krau@users.noreply.github.com> Date: Fri, 20 Jun 2025 22:07:21 +0800 Subject: [PATCH] feat: handle grouped msgs, close #72 --- client/bot/handlers/utils/shortcut/message.go | 44 ++++++++++++++----- common/utils/tgutil/message.go | 28 ++++++++++++ 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/client/bot/handlers/utils/shortcut/message.go b/client/bot/handlers/utils/shortcut/message.go index 8e4f7e4..de821ac 100644 --- a/client/bot/handlers/utils/shortcut/message.go +++ b/client/bot/handlers/utils/shortcut/message.go @@ -81,7 +81,29 @@ func GetFilesFromUpdateLinkMessageWithReplyEdit(ctx *ext.Context, update *ext.Up } files = make([]tfile.TGFileMessage, 0, len(msgLinks)) + addFile := func(msg *tg.Message) { + if msg == nil { + logger.Warn("message is nil, skipping") + return + } + media, ok := msg.GetMedia() + if !ok { + logger.Debugf("message %d has no media", msg.GetID()) + return + } + file, err := tfile.FromMediaMessage(media, msg, tfile.WithNameIfEmpty(tgutil.GenFileNameFromMessage(*msg))) + if err != nil { + logger.Errorf("failed to create file from media: %s", err) + return + } + files = append(files, file) + } for _, link := range msgLinks { + linkUrl, err := url.Parse(link) + if err != nil { + logger.Errorf("failed to parse message link %s: %s", link, err) + continue + } chatId, msgId, err := tgutil.ParseMessageLink(ctx, link) if err != nil { logger.Errorf("failed to parse message link %s: %s", link, err) @@ -92,17 +114,19 @@ func GetFilesFromUpdateLinkMessageWithReplyEdit(ctx *ext.Context, update *ext.Up logger.Errorf("failed to get message by ID: %s", err) continue } - media, ok := msg.GetMedia() - if !ok { - logger.Debugf("message %d has no media", msg.GetID()) - continue + groupID, isGroup := msg.GetGroupedID() + if isGroup && groupID != 0 && !linkUrl.Query().Has("single") { + gmsgs, err := tgutil.GetGroupedMessages(ctx, chatId, msg) + if err != nil { + logger.Errorf("failed to get grouped messages: %s", err) + } else { + for _, gmsg := range gmsgs { + addFile(gmsg) + } + } + } else { + addFile(msg) } - file, err := tfile.FromMediaMessage(media, msg, tfile.WithNameIfEmpty(tgutil.GenFileNameFromMessage(*msg))) - if err != nil { - logger.Errorf("failed to create file from media: %s", err) - continue - } - files = append(files, file) } if len(files) == 0 { editReplied("没有找到可保存的文件", nil) diff --git a/common/utils/tgutil/message.go b/common/utils/tgutil/message.go index 16f5839..965eb16 100644 --- a/common/utils/tgutil/message.go +++ b/common/utils/tgutil/message.go @@ -272,3 +272,31 @@ func GetMessageByID(ctx *ext.Context, chatID int64, msgID int) (*tg.Message, err cache.Set(key, tgm) return tgm, nil } + +func GetGroupedMessages(ctx *ext.Context, chatID int64, msg *tg.Message) ([]*tg.Message, error) { + groupID, isGroup := msg.GetGroupedID() + if !isGroup || groupID == 0 { + return nil, fmt.Errorf("message %d is not grouped", msg.GetID()) + } + msgID := msg.GetID() + minID := msgID - 10 + maxID := msgID + 10 + if minID < 1 { + minID = 1 + } + msgs, err := GetMessagesRange(ctx, chatID, minID, maxID) + if err != nil { + return nil, fmt.Errorf("failed to get grouped messages: %w", err) + } + groupedMessages := make([]*tg.Message, 0, len(msgs)) + for _, m := range msgs { + if m == nil { + continue + } + mgid, isGroup := m.GetGroupedID() + if isGroup && mgid == groupID { + groupedMessages = append(groupedMessages, m) + } + } + return groupedMessages, nil +}