diff --git a/max.go b/max.go index c761c13..37add53 100644 --- a/max.go +++ b/max.go @@ -2,6 +2,7 @@ package main import ( "context" + "errors" "fmt" "log/slog" "net/http" @@ -114,11 +115,11 @@ func (b *Bridge) listenMax(ctx context.Context) { if mediaURL != "" { // Скачиваем медиа и отправляем editMessageMedia - data, dlErr := b.downloadURL(mediaURL) + data, name, dlErr := b.downloadURLWithLimit(mediaURL, b.cfg.maxMaxFileBytes()) if dlErr != nil { slog.Error("MAX→TG edit media download failed", "err", dlErr) } else { - fb := tgbotapi.FileBytes{Name: fileNameFromURL(mediaURL), Bytes: data} + fb := tgbotapi.FileBytes{Name: name, Bytes: data} var media interface{} switch mediaType { case "photo": @@ -144,7 +145,7 @@ func (b *Bridge) listenMax(ctx context.Context) { if _, err := b.tgBot.Send(editMedia); err != nil { slog.Error("MAX→TG edit media failed", "err", err, "uid", editUpd.Message.Sender.UserId) // Fallback — отправляем как новое сообщение - go b.sendTgMediaFromURL(tgChatID, mediaURL, mediaType, fwd, "", 0) + go b.sendTgMediaFromURL(tgChatID, mediaURL, mediaType, fwd, "", 0, b.cfg.maxMaxFileBytes()) } else { slog.Info("MAX→TG edited media", "tgMsg", tgMsgID, "type", mediaType, "uid", editUpd.Message.Sender.UserId) } @@ -973,7 +974,15 @@ func (b *Bridge) forwardMaxToTg(ctx context.Context, msgUpd *maxschemes.MessageC if len(albumMedia) == 1 { // Одно вложение — отправляем обычным сообщением (альбом из 1 элемента не имеет reply) - sent, sendErr = b.sendTgMediaFromURL(tgChatID, qAttURL, qAttType, htmlCaption, pm, replyToID) + sent, sendErr = b.sendTgMediaFromURL(tgChatID, qAttURL, qAttType, htmlCaption, pm, replyToID, b.cfg.maxMaxFileBytes()) + var e *ErrFileTooLarge + if errors.As(sendErr, &e) { + slog.Warn("MAX→TG media too big", "name", e.Name, "size", e.Size) + m := maxbot.NewMessage().SetChat(chatID).SetText( + fmt.Sprintf("⚠️ Файл \"%s\" слишком большой для пересылки (%s). Максимальный размер файла %d МБ.", + e.Name, formatFileSize(int(e.Size)), b.cfg.MaxMaxFileSizeMB)) + b.maxApi.Messages.Send(ctx, m) + } } else { // Несколько — отправляем как media group (альбом) cfg := tgbotapi.NewMediaGroup(tgChatID, albumMedia) @@ -992,9 +1001,18 @@ func (b *Bridge) forwardMaxToTg(ctx context.Context, msgUpd *maxschemes.MessageC // Отправляем остальные вложения (аудио, файлы, стикеры) по одному for _, sm := range soloMedia { - s, err := b.sendTgMediaFromURL(tgChatID, sm.url, sm.attType, "", "", 0, sm.name) + s, err := b.sendTgMediaFromURL(tgChatID, sm.url, sm.attType, "", "", 0, b.cfg.maxMaxFileBytes(), sm.name) if err != nil { - slog.Error("MAX→TG solo media send failed", "type", sm.attType, "err", err) + var e *ErrFileTooLarge + if errors.As(err, &e) { + slog.Warn("MAX→TG solo media too big", "name", e.Name, "size", e.Size) + m := maxbot.NewMessage().SetChat(chatID).SetText( + fmt.Sprintf("⚠️ Файл \"%s\" слишком большой для пересылки (%s). Максимальный размер файла %d МБ.", + e.Name, formatFileSize(int(e.Size)), b.cfg.MaxMaxFileSizeMB)) + b.maxApi.Messages.Send(ctx, m) + } else { + slog.Error("MAX→TG solo media send failed", "type", sm.attType, "err", err) + } if sendErr == nil { sendErr = err }