From c2bbf72b07a53f44a304e2b08b2ff9fd7c83c516 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Sat, 19 Apr 2025 04:01:52 +0300 Subject: [PATCH] refactor _format_forward_info to handle multiple forward cases and improve logging --- post_parser.py | 56 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/post_parser.py b/post_parser.py index de45f86..fb66786 100644 --- a/post_parser.py +++ b/post_parser.py @@ -277,17 +277,6 @@ class PostParser: return title - def _format_forward_info(self, message: Message) -> Union[str, None]: - if forward_origin := getattr(message, "forward_origin", None): - if sender_chat := getattr(forward_origin, "chat", None): - forward_title = getattr(sender_chat, "title", "Unknown channel") - forward_username = getattr(sender_chat, "username", None) - if forward_username: - forward_link = f'{forward_title} (@{forward_username})' - return f'
--- Forwarded from {forward_link} ---

' - return f'
--- Forwarded from {forward_title} ---

' - - return None def _format_reply_info(self, message: Message) -> Union[str, None]: if getattr(message, "service", None) and 'PINNED_MESSAGE' in str(message.service) and (reply_to := getattr(message, "reply_to_message", None)): @@ -536,6 +525,50 @@ class PostParser: logger.error(f"html_sanitization_error: {str(e)}") return html_raw + def _format_forward_info(self, message: Message) -> Union[str, None]: + if forward_origin := getattr(message, "forward_origin", None): + # Case 1: Channel or supergroup forward (has chat attribute) + if sender_chat := getattr(forward_origin, "chat", None): + forward_title = getattr(sender_chat, "title", "Unknown channel") + forward_username = getattr(sender_chat, "username", None) + if forward_username: + forward_link = f'{forward_title} (@{forward_username})' + return f'
--- Forwarded from {forward_link} ---

' + return f'
--- Forwarded from {forward_title} ---

' + + # Case 2: Hidden user (MessageOriginHiddenUser) + if hasattr(forward_origin, "sender_user_name") and forward_origin.sender_user_name: + sender_name = forward_origin.sender_user_name + return f'
--- Forwarded from {sender_name} ---

' + + # Case 3: Regular user (MessageOriginUser) + if hasattr(forward_origin, "sender_user") and forward_origin.sender_user: + user = forward_origin.sender_user + name_parts = [] + if hasattr(user, "first_name") and user.first_name: + name_parts.append(user.first_name) + if hasattr(user, "last_name") and user.last_name: + name_parts.append(user.last_name) + + sender_name = " ".join(name_parts) if name_parts else "Unknown user" + + if hasattr(user, "username") and user.username: + sender_name = f"{sender_name} (@{user.username})" + + return f'
--- Forwarded from {sender_name} ---

' + + # Case 4: Channel without username (MessageOriginChannel) + if hasattr(forward_origin, "chat_id") and hasattr(forward_origin, "title"): + title = forward_origin.title if forward_origin.title else "Unknown channel" + return f'
--- Forwarded from {title} ---

' + + # Case 5: Default for any other type of forward_origin + origin_type = getattr(forward_origin, "type", "unknown") + logger.debug(f"unhandled_forward_type: {origin_type}, data: {forward_origin}") + return f'
--- Forwarded message ---

' + + return None + def _generate_html_body(self, message: Message) -> str: content_body = [] @@ -556,6 +589,7 @@ class PostParser: if poll := getattr(message, "poll", None): poll_html = self._format_poll(poll) + logger.error(f"Forward info: {message.forward_origin}") forward_html = self._format_forward_info(message) if text_html or poll_html: