# matrix-appservice-kakaotalk - A Matrix-KakaoTalk puppeting bridge. # Copyright (C) 2022 Tulir Asokan, Andrew Ferrazzutti # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import annotations from typing import NamedTuple from mautrix.appservice import IntentAPI from mautrix.types import MessageEventContent, RelationType, RoomID from mautrix.util.logging import TraceLogger from ..kt.types.bson import Long from ..kt.types.chat.attachment.reply import ReplyAttachment from ..kt.client.types import TO_MSGTYPE_MAP from .. import puppet as pu from ..db import Message as DBMessage class SendParams(NamedTuple): text: str # TODO Mentions reply_to: ReplyAttachment async def matrix_to_kakaotalk( content: MessageEventContent, room_id: RoomID, log: TraceLogger, intent: IntentAPI ) -> SendParams: # NOTE By design, this *throws* if user intent can't be matched (i.e. if a reply can't be created) # TODO Mentions if content.relates_to.rel_type == RelationType.REPLY: message = await DBMessage.get_by_mxid(content.relates_to.event_id, room_id) if not message: raise ValueError( f"Couldn't find reply target {content.relates_to.event_id}" " to bridge text message reply metadata to KakaoTalk" ) try: mx_event = await intent.get_event(room_id, message.mxid) except: log.exception(f"Failed to find Matrix event for reply target {message.mxid}") raise kt_sender = pu.Puppet.get_id_from_mxid(mx_event.sender) if kt_sender is None: raise ValueError( f"Found no KakaoTalk user ID for reply target sender {mx_event.sender}" ) content.trim_reply_fallback() reply_to = ReplyAttachment( # TODO #mentions=[], # TODO What are reply URLs for? #urls=[], # TODO Set this for emoticon reply, but must first support those attach_only=False, # TODO If replying with media works, must set type AND all attachment properties # But then, the reply object must be an intersection of a ReplyAttachment and something else #attach_type=TO_MSGTYPE_MAP.get(content.msgtype), src_logId=message.ktid, # TODO src_mentions=[], # TODO Check if source message needs to be formatted src_message=mx_event.content.body, src_type=TO_MSGTYPE_MAP[mx_event.content.msgtype], src_userId=Long(kt_sender), ) else: reply_to = None return SendParams(text=content.body, reply_to=reply_to)