diff --git a/containers/talkbot/server.py b/containers/talkbot/server.py index a96115e..0091f37 100644 --- a/containers/talkbot/server.py +++ b/containers/talkbot/server.py @@ -354,6 +354,25 @@ def actor_user_id(actor: dict) -> str: return actor_id +def extract_reply_to_message_id(obj: dict) -> Optional[int]: + in_reply_to = obj.get("inReplyTo") + + if not isinstance(in_reply_to, dict): + return None + + reply_object = in_reply_to.get("object") + reply_id = ( + reply_object.get("id") + if isinstance(reply_object, dict) + else in_reply_to.get("id") + ) + + try: + return int(reply_id) if reply_id is not None else None + except (TypeError, ValueError): + return None + + def get_conversation_participants(token: str) -> list[dict]: response = httpx.get( f"{NC_URL}/ocs/v2.php/apps/spreed/api/v4/room/{token}/participants", @@ -923,7 +942,15 @@ def share_file_to_talk( def post_manager_message( token: str, message: str, + reply_to_message_id: Optional[int] = None, ) -> int: + data = { + "message": message, + } + + if reply_to_message_id is not None: + data["replyTo"] = str(reply_to_message_id) + response = httpx.post( f"{NC_URL}/ocs/v2.php/apps/spreed/api/v1/chat/{token}", headers={ @@ -931,9 +958,7 @@ def post_manager_message( "Accept": "application/json", }, auth=(NC_USER, NC_PASSWORD), - data={ - "message": message, - }, + data=data, timeout=30, ) @@ -1214,6 +1239,7 @@ def process_event(job: dict) -> None: file_param = job.get("file_param") message_text = job.get("message_text", "") preserve_original = job.get("preserve_original", False) + reply_to_message_id = job.get("reply_to_message_id") try: recipients = get_target_user_ids( @@ -1319,6 +1345,7 @@ def process_event(job: dict) -> None: post_manager_message( token, f"@{sender_display_name}: {translated}", + reply_to_message_id=reply_to_message_id, ) log.info( @@ -1471,6 +1498,8 @@ async def webhook( } ) + reply_to_message_id = extract_reply_to_message_id(obj) + if LOG_WEBHOOK_PAYLOAD: log.warning( "Webhook payload for message %s: %s", @@ -1565,6 +1594,7 @@ async def webhook( "file_param": file_param, "message_text": message_text, "preserve_original": preserve_original, + "reply_to_message_id": reply_to_message_id, } )