2323from app .services .slack import post_error_message
2424from app .utils .handler_utils import (
2525 conversation_key_and_root ,
26+ extract_conversation_context ,
2627 extract_pull_request_id ,
2728 gate_common ,
2829 is_latest_message ,
2930 strip_mentions ,
30- trigger_async_processing ,
3131 respond_with_eyes ,
3232 trigger_pull_request_processing ,
3333)
34- from app .slack .slack_events import _extract_conversation_context , store_feedback
34+ from app .slack .slack_events import process_async_slack_event , store_feedback
3535
3636logger = get_logger ()
3737
4343@lru_cache
4444def setup_handlers (app : App ) -> None :
4545 """Register handlers. Intentionally minimal—no branching here."""
46- app .event ("app_mention" )(mention_handler )
47- app .event ("message" )(unified_message_handler )
48- app .action ("feedback_yes" )(feedback_handler )
49- app .action ("feedback_no" )(feedback_handler )
46+ app .event ("app_mention" )(ack = respond_to_slack_within_3_seconds , lazy = [ mention_handler ] )
47+ app .event ("message" )(ack = respond_to_slack_within_3_seconds , lazy = [ unified_message_handler ] )
48+ app .action ("feedback_yes" )(ack = respond_to_slack_within_3_seconds , lazy = [ feedback_handler ] )
49+ app .action ("feedback_no" )(ack = respond_to_slack_within_3_seconds , lazy = [ feedback_handler ] )
5050
5151
5252# ================================================================
5353# Event and message handlers
5454# ================================================================
5555
5656
57- def mention_handler (event : Dict [str , Any ], ack : Ack , body : Dict [str , Any ], client : WebClient ) -> None :
57+ def respond_to_slack_within_3_seconds (event : Dict [str , Any ], ack : Ack ):
58+ respond_with_eyes (event = event )
59+ logger .debug ("Sending ack response" )
60+ ack ()
61+
62+
63+ def mention_handler (event : Dict [str , Any ], body : Dict [str , Any ], client : WebClient ) -> None :
5864 """
5965 Channel interactions that mention the bot.
6066 - If text after the mention starts with 'feedback:', store it as additional feedback.
6167 - Otherwise, forward to the async processing pipeline (Q&A).
6268 """
63- logger .debug ("Sending ack response in mention_handler" )
64- ack ()
65- respond_with_eyes (event = event )
6669 event_id = gate_common (event = event , body = body )
6770 if not event_id :
6871 return
@@ -133,6 +136,8 @@ def thread_message_handler(event: Dict[str, Any], event_id: str, client: WebClie
133136 logger .info (f"Found session for thread: { conversation_key } " )
134137 except Exception as e :
135138 logger .error (f"Error checking thread session: { e } " , extra = {"error" : traceback .format_exc ()})
139+ _ , _ , thread_ts = extract_conversation_context (event )
140+ post_error_message (channel = channel_id , thread_ts = thread_ts )
136141 return
137142
138143 logger .info (f"Processing thread message from user { user_id } " , extra = {"event_id" : event_id })
@@ -147,11 +152,8 @@ def thread_message_handler(event: Dict[str, Any], event_id: str, client: WebClie
147152 )
148153
149154
150- def unified_message_handler (event : Dict [str , Any ], ack : Ack , body : Dict [str , Any ], client : WebClient ) -> None :
155+ def unified_message_handler (event : Dict [str , Any ], body : Dict [str , Any ], client : WebClient ) -> None :
151156 """Handle all message events - DMs and channel messages"""
152- logger .debug ("Sending ack response" )
153- ack ()
154- respond_with_eyes (event = event )
155157 event_id = gate_common (event = event , body = body )
156158 if not event_id :
157159 return
@@ -165,11 +167,10 @@ def unified_message_handler(event: Dict[str, Any], ack: Ack, body: Dict[str, Any
165167 thread_message_handler (event = event , event_id = event_id , client = client , body = body )
166168
167169
168- def feedback_handler (ack : Ack , body : Dict [str , Any ], client : WebClient ) -> None :
170+ def feedback_handler (body : Dict [str , Any ], client : WebClient , event : Dict [ str , Any ] ) -> None :
169171 """Handle feedback button clicks (both positive and negative)."""
170- logger .debug ("Sending ack response" )
171- ack ()
172172 try :
173+ channel_id = event ["channel" ]
173174 action_id = body ["actions" ][0 ]["action_id" ]
174175 feedback_data = json .loads (body ["actions" ][0 ]["value" ])
175176
@@ -215,8 +216,12 @@ def feedback_handler(ack: Ack, body: Dict[str, Any], client: WebClient) -> None:
215216 logger .error (f"Feedback storage error: { e } " , extra = {"error" : traceback .format_exc ()})
216217 except Exception as e :
217218 logger .error (f"Unexpected feedback error: { e } " , extra = {"error" : traceback .format_exc ()})
219+ thread_ts = feedback_data .get ("tt" )
220+ post_error_message (channel = channel_id , thread_ts = thread_ts )
218221 except Exception as e :
219222 logger .error (f"Error handling feedback: { e } " , extra = {"error" : traceback .format_exc ()})
223+ _ , _ , thread_ts = extract_conversation_context (event )
224+ post_error_message (channel = channel_id , thread_ts = thread_ts )
220225
221226
222227# ================================================================
@@ -262,6 +267,8 @@ def _common_message_handler(
262267 client .chat_postMessage (** params )
263268 except Exception as e :
264269 logger .error (f"Failed to post channel feedback ack: { e } " , extra = {"error" : traceback .format_exc ()})
270+ _ , _ , thread_ts = extract_conversation_context (event )
271+ post_error_message (channel = channel_id , thread_ts = thread_ts )
265272 return
266273
267274 if message_text .lower ().startswith (constants .PULL_REQUEST_PREFIX ):
@@ -270,13 +277,12 @@ def _common_message_handler(
270277 trigger_pull_request_processing (pull_request_id = pull_request_id , event = event , event_id = event_id )
271278 except Exception as e :
272279 logger .error (f"Can not find pull request details: { e } " , extra = {"error" : traceback .format_exc ()})
273- _ , _ , thread_ts = _extract_conversation_context (event )
280+ _ , _ , thread_ts = extract_conversation_context (event )
274281 post_error_message (channel = channel_id , thread_ts = thread_ts )
275282 return
276283
284+ # note - we dont do post an error message if this fails as its handled by process_async_slack_event
277285 try :
278- trigger_async_processing (event = event , event_id = event_id )
286+ process_async_slack_event (event = event , event_id = event_id )
279287 except Exception :
280288 logger .error ("Error triggering async processing" , extra = {"error" : traceback .format_exc ()})
281- _ , _ , thread_ts = _extract_conversation_context (event )
282- post_error_message (channel = channel_id , thread_ts = thread_ts )
0 commit comments