1515from config import Config
1616
1717
18+ def _get_reply_to_id (message_id : int , thread_id : int | None , message_thread_id : int | None ) -> int | None :
19+ """Determine if we should reply to the original message.
20+
21+ Only reply to the original message if we're in the same thread.
22+ This prevents Telegram API errors when sending to a different thread (e.g., /newchat).
23+
24+ Args:
25+ message_id: The original message ID
26+ thread_id: The target thread ID (may be overridden by handler)
27+ message_thread_id: The original message's thread ID
28+
29+ Returns:
30+ message_id if in same thread, None otherwise
31+ """
32+ return message_id if thread_id == message_thread_id else None
33+
34+
1835def lambda_handler (event : dict , context : Any ) -> dict :
1936 """SQS Consumer Lambda entry point."""
2037 for record in event ['Records' ]:
@@ -43,6 +60,7 @@ async def process_message(message_data: dict) -> None:
4360 """Process single message from SQS queue."""
4461 import logging
4562 logger = logging .getLogger ()
63+ # Enable INFO logging as suggested in issue for better debugging
4664 logger .setLevel (logging .INFO )
4765
4866 config = Config .from_env ()
@@ -56,7 +74,8 @@ async def process_message(message_data: dict) -> None:
5674 logger .warning ("Received update with no message or edited_message" )
5775 return
5876
59- # Use message_data fields for SQS message (allows handler to override text/thread_id)
77+ # Extract thread_id and user_message early - needed for all message processing
78+ # (allows handler to override text/thread_id via SQS message_data)
6079 user_message = message_data .get ('text' ) or message .text
6180 thread_id = message_data .get ('thread_id' ) or message .message_thread_id
6281
@@ -67,12 +86,7 @@ async def process_message(message_data: dict) -> None:
6786 "Handling local command in consumer (fallback path)" ,
6887 extra = {'chat_id' : message .chat_id , 'message_id' : message .message_id },
6988 )
70- # Only reply to original message if we're in the same thread
71- reply_to_id = (
72- message .message_id
73- if thread_id == message .message_thread_id
74- else None
75- )
89+ reply_to_id = _get_reply_to_id (message .message_id , thread_id , message .message_thread_id )
7690 try :
7791 await bot .send_message (
7892 chat_id = message .chat_id ,
@@ -93,12 +107,7 @@ async def process_message(message_data: dict) -> None:
93107 'message_id' : message .message_id ,
94108 },
95109 )
96- # Only reply to original message if we're in the same thread
97- reply_to_id = (
98- message .message_id
99- if thread_id == message .message_thread_id
100- else None
101- )
110+ reply_to_id = _get_reply_to_id (message .message_id , thread_id , message .message_thread_id )
102111 try :
103112 await bot .send_message (
104113 chat_id = message .chat_id ,
@@ -175,12 +184,7 @@ async def process_message(message_data: dict) -> None:
175184 text = text [:4000 ] + "\n \n ... (truncated)"
176185
177186 # Send response to Telegram
178- # Only reply to original message if we're in the same thread
179- reply_to_id = (
180- message .message_id
181- if thread_id == message .message_thread_id
182- else None
183- )
187+ reply_to_id = _get_reply_to_id (message .message_id , thread_id , message .message_thread_id )
184188
185189 try :
186190 await bot .send_message (
0 commit comments