feat: подпись имени пользователя на сообщении в топике

В топике было непонятно, от кого сообщение: текст приходил без автора.

- Текст уходит в топик как «<Имя>:\n<текст>»; имени нет — «<id>:\n<текст>»
  (user_signature()).
- Caption медиа уходит текстом с той же подписью, само медиа копируется.
- Всё остальное (фото, документы, голосовые без подписи) копируется как есть,
  без подписи — как и просили «если не текст, то пофиг».

Симметрично подписи оператора «Оператор поддержки:» на ответах.

Тесты: 244 OK (8 новых — подпись имени, fallback на id, медиа с caption,
медиа без текста копируется без подписи).

VERSION: 0.1.0+57 -> 0.1.0+58
This commit is contained in:
hermes committed 2026-10-11 20:22:34 +02:00
1 parent 6938c1d0f3
commit 175d618d62
5 files changed
+130 -7

No files matched your search

+40 -6
View File
@@ -331,6 +331,45 @@ def _unavailable_text(reason: str | None = None) -> str:
)
def user_signature(user: User) -> str:
"""Подпись сообщения пользователя в топике: имя или id, если имени нет."""
full_name = " ".join(
part for part in (user.first_name, user.last_name) if part
).strip()
return full_name or str(user.id)
async def _send_user_message_to_topic(
bot: Bot, message: Message, group_id: int, thread_id: int, user: User
) -> None:
"""Отправляет сообщение пользователя в топик, добавляя подпись к тексту.
Текст уходит одним сообщением «<Имя>:\n<текст>». Всё остальное (фото,
документы, голосовые) копируется как есть, без подписи.
"""
text = (message.text or "").strip()
if text:
await bot.send_message(
chat_id=group_id,
text=f"{user_signature(user)}:\n{text}",
message_thread_id=thread_id,
)
return
caption = (message.caption or "").strip()
if caption:
await bot.send_message(
chat_id=group_id,
text=f"{user_signature(user)}:\n{caption}",
message_thread_id=thread_id,
)
await bot.copy_message(
chat_id=group_id,
from_chat_id=message.chat.id,
message_id=message.message_id,
message_thread_id=thread_id,
)
async def relay_user_message(message: Message) -> bool:
"""Копирует сообщение пользователя в его топик. True — сообщение ушло."""
bot = message.bot
@@ -346,12 +385,7 @@ async def relay_user_message(message: Message) -> bool:
logger.debug("Support unavailable notice failed")
return False
try:
await bot.copy_message(
chat_id=group_id,
from_chat_id=message.chat.id,
message_id=message.message_id,
message_thread_id=thread_id,
)
await _send_user_message_to_topic(bot, message, group_id, thread_id, user)
return True
except Exception as exc:
if _is_missing_thread(exc):