reverse bridge

This commit is contained in:
kislovdm
2026-04-09 12:22:54 +03:00
parent c5634b4cda
commit a5126a4d60
+31 -5
View File
@@ -21,6 +21,30 @@ def _telegram_chat_title(chat: dict[str, Any]) -> str:
# для каналов обычно есть title; для групп тоже; в крайнем случае — username # для каналов обычно есть title; для групп тоже; в крайнем случае — username
return str(chat.get("title") or chat.get("username") or "").strip() return str(chat.get("title") or chat.get("username") or "").strip()
def _format_sender_line(sender: dict[str, Any] | None) -> str:
if not isinstance(sender, dict):
return "Unknown:"
first = str(sender.get("first_name") or "").strip()
last = str(sender.get("last_name") or "").strip()
username = str(sender.get("username") or "").strip()
full_name = " ".join([p for p in (first, last) if p])
if not full_name:
full_name = "Unknown"
if username:
return f"{full_name} (@{username}):"
return f"{full_name}:"
def _format_forward_text(*, sender: dict[str, Any] | None, text: str) -> str:
header = _format_sender_line(sender)
body = str(text or "").strip()
if body:
return f"{header}\n{body}"
return header
@dataclass @dataclass
class _MediaGroupBuffer: class _MediaGroupBuffer:
@@ -202,12 +226,13 @@ class TelegramToMaxBridge:
return return
# Telegram может прислать несколько элементов с caption только на первом. Берём text/caption с первого, где он есть. # Telegram может прислать несколько элементов с caption только на первом. Берём text/caption с первого, где он есть.
text = "" raw_text = ""
for m in messages: for m in messages:
cand = str(m.get("text") or m.get("caption") or "").strip() cand = str(m.get("text") or m.get("caption") or "").strip()
if cand: if cand:
text = cand raw_text = cand
break break
text = _format_forward_text(sender=messages[0].get("from"), text=raw_text)
reply_to = self._resolve_reply_to_max_id(max_chat_id=max_chat_id, message=messages[0]) reply_to = self._resolve_reply_to_max_id(max_chat_id=max_chat_id, message=messages[0])
@@ -215,7 +240,7 @@ class TelegramToMaxBridge:
for m in messages: for m in messages:
attachments.extend(await self._extract_attachments(m)) attachments.extend(await self._extract_attachments(m))
if not text and not attachments: if not text.strip() and not attachments:
return return
sent = await self._max_client.send_message( sent = await self._max_client.send_message(
@@ -261,9 +286,10 @@ class TelegramToMaxBridge:
message: dict[str, Any], message: dict[str, Any],
media_group_id: str | None, media_group_id: str | None,
) -> None: ) -> None:
text = str(message.get("text") or message.get("caption") or "").strip() raw_text = str(message.get("text") or message.get("caption") or "").strip()
text = _format_forward_text(sender=message.get("from"), text=raw_text)
attachments = await self._extract_attachments(message) attachments = await self._extract_attachments(message)
if not text and not attachments: if not text.strip() and not attachments:
return return
reply_to = self._resolve_reply_to_max_id(max_chat_id=max_chat_id, message=message) reply_to = self._resolve_reply_to_max_id(max_chat_id=max_chat_id, message=message)