mirror of
https://github.com/krau/SaveAny-Bot.git
synced 2026-07-09 06:21:52 +08:00
feat: handle grouped msgs, close #72
This commit is contained in:
@@ -81,7 +81,29 @@ func GetFilesFromUpdateLinkMessageWithReplyEdit(ctx *ext.Context, update *ext.Up
|
|||||||
}
|
}
|
||||||
|
|
||||||
files = make([]tfile.TGFileMessage, 0, len(msgLinks))
|
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 {
|
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)
|
chatId, msgId, err := tgutil.ParseMessageLink(ctx, link)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("failed to parse message link %s: %s", link, err)
|
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)
|
logger.Errorf("failed to get message by ID: %s", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
media, ok := msg.GetMedia()
|
groupID, isGroup := msg.GetGroupedID()
|
||||||
if !ok {
|
if isGroup && groupID != 0 && !linkUrl.Query().Has("single") {
|
||||||
logger.Debugf("message %d has no media", msg.GetID())
|
gmsgs, err := tgutil.GetGroupedMessages(ctx, chatId, msg)
|
||||||
continue
|
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 {
|
if len(files) == 0 {
|
||||||
editReplied("没有找到可保存的文件", nil)
|
editReplied("没有找到可保存的文件", nil)
|
||||||
|
|||||||
@@ -272,3 +272,31 @@ func GetMessageByID(ctx *ext.Context, chatID int64, msgID int) (*tg.Message, err
|
|||||||
cache.Set(key, tgm)
|
cache.Set(key, tgm)
|
||||||
return tgm, nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user