From 7199a955cd3c61f2da93264c5571449e021884ac Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Sun, 13 Apr 2025 03:47:12 +0300 Subject: [PATCH] new forward_origin --- post_parser.py | 41 ++++++++++++++++----------------- tests/test_post_parser.py | 2 +- tests/test_post_parser_flags.py | 33 +++++++++++--------------- 3 files changed, 34 insertions(+), 42 deletions(-) diff --git a/post_parser.py b/post_parser.py index ed5f95b..1e80e4f 100644 --- a/post_parser.py +++ b/post_parser.py @@ -240,24 +240,25 @@ class PostParser: return "❓ Unknown Post" def _format_forward_info(self, message: Message) -> Union[str, None]: - if forward_from_chat := getattr(message, "forward_from_chat", None): - forward_title = getattr(forward_from_chat, "title", "Unknown channel") - forward_username = getattr(forward_from_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}

' - - elif forward_from := getattr(message, "forward_from", None): - forward_name = f"{getattr(forward_from, 'first_name', '')} {getattr(forward_from, 'last_name', '')}".strip() - forward_username = getattr(forward_from, "username", None) - if forward_username: - forward_link = f'{forward_name} (@{forward_username})' - return f'
Forwarded from {forward_link}

' - return f'
Forwarded from {forward_name}

' - - elif forward_sender_name := getattr(message, "forward_sender_name", None): - return f'
Forwarded from {forward_sender_name}

' + if forward_origin := getattr(message, "forward_origin", None): + if sender_chat := getattr(forward_origin, "sender_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}

' + + elif sender_user := getattr(forward_origin, "sender_user", None): + forward_name = f"{getattr(sender_user, 'first_name', '')} {getattr(sender_user, 'last_name', '')}".strip() + forward_username = getattr(sender_user, "username", None) + if forward_username: + forward_link = f'{forward_name} (@{forward_username})' + return f'
Forwarded from {forward_link}

' + return f'
Forwarded from {forward_name}

' + + elif sender_user_name := getattr(forward_origin, "sender_user_name", None): + return f'
Forwarded from {sender_user_name}

' return None @@ -291,9 +292,7 @@ class PostParser: flags = [] # Add "fwd" flag for forwarded messages - if (getattr(message, "forward_from_chat", None) or - getattr(message, "forward_from", None) or - getattr(message, "forward_sender_name", None)): + if message.forward_origin: flags.append("fwd") # Add flag "video" if the message media is VIDEO or ANIMATION and the body text is up to 200 characters. diff --git a/tests/test_post_parser.py b/tests/test_post_parser.py index 5494853..61a707a 100644 --- a/tests/test_post_parser.py +++ b/tests/test_post_parser.py @@ -108,7 +108,7 @@ class TestPostParserGenerateTitle(unittest.TestCase): def test_generate_title_caption_with_url_and_text(self): message = self._create_mock_message(media=MessageMediaType.PHOTO, caption="Look at this photo! https://example.com/image.jpg") - self.assertEqual(self.parser._generate_title(message), "Look at this photo!") + self.assertEqual(self.parser._generate_title(message), "📷 Photo") def test_generate_title_caption_with_uppercase_text(self): message = self._create_mock_message(text="ЖИЗНЬ НА ОБОЯХ") diff --git a/tests/test_post_parser_flags.py b/tests/test_post_parser_flags.py index afe336f..2c1e917 100644 --- a/tests/test_post_parser_flags.py +++ b/tests/test_post_parser_flags.py @@ -33,13 +33,12 @@ class TestPostParserExtractFlags(unittest.TestCase): text=None, caption=None, reactions_data=None, # Format: [("emoji", count), ...] - forward_from_chat=None, # Mock Chat object or True - forward_from=None, # Mock User object or True - forward_sender_name=None, # String or True + forward_origin=None, # Pass forward info via this chat_username="test_channel"): # Default chat username message = MagicMock(spec=Message) message.media = media message.id = 123 # Add a default message ID + message.forward_origin = None # Add missing attribute # Mock chat attribute mock_chat = MagicMock(spec=Chat) @@ -61,18 +60,11 @@ class TestPostParserExtractFlags(unittest.TestCase): else: message.reactions = None - # Mock forwarding info - if forward_from_chat: - message.forward_from_chat = MagicMock(spec=Chat) if forward_from_chat is True else forward_from_chat + # Mock forwarding info using the new forward_origin attribute + if forward_origin: + message.forward_origin = MagicMock() if forward_origin is True else forward_origin else: - message.forward_from_chat = None - - if forward_from: - message.forward_from = MagicMock(spec=User) if forward_from is True else forward_from - else: - message.forward_from = None - - message.forward_sender_name = forward_sender_name if forward_sender_name is not True else "Hidden Sender" + message.forward_origin = None # Correctly mock text and caption to have an .html attribute and behave like strings if text: @@ -103,15 +95,15 @@ class TestPostParserExtractFlags(unittest.TestCase): # --- Test Cases --- def test_flag_fwd_forwarded_from_chat(self): - message = self._create_mock_message(forward_from_chat=True) + message = self._create_mock_message(forward_origin=MagicMock(sender_chat=True)) self.assertIn("fwd", self.parser._extract_flags(message)) def test_flag_fwd_forwarded_from_user(self): - message = self._create_mock_message(forward_from=True) + message = self._create_mock_message(forward_origin=MagicMock(sender_user=True)) self.assertIn("fwd", self.parser._extract_flags(message)) def test_flag_fwd_forwarded_sender_name(self): - message = self._create_mock_message(forward_sender_name=True) + message = self._create_mock_message(forward_origin=MagicMock(sender_user_name="Hidden Sender")) self.assertIn("fwd", self.parser._extract_flags(message)) def test_flag_video_media_video_short_caption(self): @@ -133,6 +125,7 @@ class TestPostParserExtractFlags(unittest.TestCase): message = MagicMock(spec=Message) message.media = MessageMediaType.VIDEO message.id = 123 + message.forward_origin = None # Add missing attribute # Create a basic mock Chat mock_chat = MagicMock(spec=Chat) @@ -356,7 +349,7 @@ class TestPostParserExtractFlags(unittest.TestCase): media=MessageMediaType.VIDEO, caption="Livestream announcement! Support via донат at https://example.com. Join https://t.me/+SECRET and mention @admin. #реклама", reactions_data=[("🤡", 40)], - forward_from_chat=True + forward_origin=MagicMock(sender_chat=True) # Use forward_origin ) # Mock HTML generation as it's used internally _ = self.parser._generate_html_body(message) @@ -374,7 +367,7 @@ class TestPostParserExtractFlags(unittest.TestCase): def test_flag_multiple_fwd_link_mention(self): message = self._create_mock_message( text="Forwarded message with a link https://example.com and mention @someone.", - forward_sender_name=True + forward_origin=MagicMock(sender_user_name="Hidden Sender") # Use forward_origin ) flags = self.parser._extract_flags(message) expected_flags = ["fwd", "no_image", "link", "mention"] @@ -425,7 +418,7 @@ class TestPostParserExtractFlags(unittest.TestCase): message = self._create_mock_message( media=MessageMediaType.VIDEO_NOTE, caption="Video note from @someone, full version on Sponsr", - forward_from=True # Forwarded from user + forward_origin=MagicMock(sender_user=True) # Use forward_origin ) flags = self.parser._extract_flags(message) expected_flags = ["video", "fwd", "paywall", "mention"]