This commit is contained in:
kislovdm
2026-06-12 12:29:21 +03:00
parent 2b5260049b
commit 3a50472ca9
2 changed files with 70 additions and 24 deletions
+11
View File
@@ -2,6 +2,17 @@ from aiogram.types import Message
from app.models.domain import TgIncomingMessage from app.models.domain import TgIncomingMessage
TG_CAPTION_MAX_LEN = 1024
TG_MESSAGE_MAX_LEN = 4096
def split_text_for_media_caption(text: str) -> tuple[str | None, str | None]:
if not text:
return None, None
if len(text) <= TG_CAPTION_MAX_LEN:
return text, None
return None, text
def format_tg_author(message: Message) -> tuple[str, str | None]: def format_tg_author(message: Message) -> tuple[str, str | None]:
user = message.from_user user = message.from_user
+59 -24
View File
@@ -33,7 +33,10 @@ from app.models.tasks import (
from app.queue.protocols import QueuePort from app.queue.protocols import QueuePort
from app.storage.protocols import StoragePort from app.storage.protocols import StoragePort
from app.telegram_layer.bot_holder import BotHolder from app.telegram_layer.bot_holder import BotHolder
from app.telegram_layer.formatter import format_topic_pin_text from app.telegram_layer.formatter import (
format_topic_pin_text,
split_text_for_media_caption,
)
from app.topic_locks import TopicLockRegistry from app.topic_locks import TopicLockRegistry
logger = structlog.get_logger(__name__) logger = structlog.get_logger(__name__)
@@ -302,6 +305,26 @@ class TelegramWorker:
thread_id=mapping.tg_thread_id, thread_id=mapping.tg_thread_id,
) )
async def _send_overflow_text(
self,
bot,
*,
thread_id: int,
text: str,
reply_to_message_id: int,
) -> None:
await bot.send_message(
chat_id=self._settings.tg_forum_channel_id,
message_thread_id=thread_id,
text=text,
reply_to_message_id=reply_to_message_id,
)
logger.info(
"tg_caption_overflow_sent",
thread_id=thread_id,
text_len=len(text),
)
async def _dispatch_content( async def _dispatch_content(
self, self,
bot, bot,
@@ -321,6 +344,8 @@ class TelegramWorker:
if not media: if not media:
return await bot.send_message(text=text or " ", **kwargs) return await bot.send_message(text=text or " ", **kwargs)
caption, overflow = split_text_for_media_caption(text)
downloaded: list = [] downloaded: list = []
try: try:
max_client = self._max_holder.client max_client = self._max_holder.client
@@ -354,33 +379,43 @@ class TelegramWorker:
if len(uploads) == 1: if len(uploads) == 1:
item, upload = uploads[0] item, upload = uploads[0]
if item.kind == "photo": if item.kind == "photo":
return await bot.send_photo( sent = await bot.send_photo(
photo=upload, caption=text or None, **kwargs photo=upload, caption=caption, **kwargs
) )
if item.kind == "video":
return await bot.send_video(
video=upload, caption=text or None, **kwargs
)
return await bot.send_document(
document=upload, caption=text or None, **kwargs
)
group = []
for idx, (item, upload) in enumerate(uploads):
caption = text if idx == 0 else None
if item.kind == "photo":
group.append(InputMediaPhoto(media=upload, caption=caption))
elif item.kind == "video": elif item.kind == "video":
group.append(InputMediaVideo(media=upload, caption=caption)) sent = await bot.send_video(
video=upload, caption=caption, **kwargs
)
else: else:
group.append(InputMediaDocument(media=upload, caption=caption)) sent = await bot.send_document(
document=upload, caption=caption, **kwargs
)
else:
group = []
for idx, (item, upload) in enumerate(uploads):
item_caption = caption if idx == 0 else None
if item.kind == "photo":
group.append(InputMediaPhoto(media=upload, caption=item_caption))
elif item.kind == "video":
group.append(InputMediaVideo(media=upload, caption=item_caption))
else:
group.append(InputMediaDocument(media=upload, caption=item_caption))
messages = await bot.send_media_group( messages = await bot.send_media_group(
chat_id=chat_id, chat_id=chat_id,
message_thread_id=thread_id, message_thread_id=thread_id,
media=group, media=group,
) )
return messages[0] sent = messages[0]
if overflow:
await self._send_overflow_text(
bot,
thread_id=thread_id,
text=overflow,
reply_to_message_id=sent.message_id,
)
return sent
finally: finally:
cleanup_paths(downloaded) cleanup_paths(downloaded)