diff --git a/mautrix_telegram/formatter/from_telegram.py b/mautrix_telegram/formatter/from_telegram.py index 998a4117..937c856d 100644 --- a/mautrix_telegram/formatter/from_telegram.py +++ b/mautrix_telegram/formatter/from_telegram.py @@ -23,6 +23,9 @@ from telethon.errors import RPCError from telethon.helpers import add_surrogate, del_surrogate from telethon.tl.custom import Message from telethon.tl.types import ( + Channel, + InputPeerChannelFromMessage, + InputPeerUserFromMessage, MessageEntityBlockquote, MessageEntityBold, MessageEntityBotCommand, @@ -47,6 +50,7 @@ from telethon.tl.types import ( PeerUser, SponsoredMessage, TypeMessageEntity, + User, ) from mautrix.types import Format, MessageType, TextMessageEventContent @@ -60,9 +64,33 @@ from ..util.file_transfer import UnicodeCustomEmoji, transfer_custom_emojis_to_m log: logging.Logger = logging.getLogger("mau.fmt.tg") +async def _get_fwd_entity(client: MautrixTelegramClient, evt: Message) -> Channel | User | None: + try: + return await client.get_entity(evt.fwd_from.from_id) + except (ValueError, RPCError) as e: + try: + input_peer = await client.get_input_entity(evt.peer_id) + if isinstance(evt.fwd_from.from_id, PeerUser): + return await client.get_entity( + InputPeerUserFromMessage( + peer=input_peer, msg_id=evt.id, user_id=evt.fwd_from.from_id.user_id + ) + ) + elif isinstance(evt.fwd_from.from_id, PeerChannel): + return await client.get_entity( + InputPeerChannelFromMessage( + peer=input_peer, msg_id=evt.id, channel_id=evt.fwd_from.from_id.channel_id + ) + ) + except (ValueError, RPCError) as e: + pass + return None + + async def _add_forward_header( - client: MautrixTelegramClient, content: TextMessageEventContent, fwd_from: MessageFwdHeader + client: MautrixTelegramClient, content: TextMessageEventContent, evt: Message ) -> None: + fwd_from = evt.fwd_from fwd_from_html, fwd_from_text = None, None if isinstance(fwd_from.from_id, PeerUser): user = await u.User.get_by_tgid(TelegramID(fwd_from.from_id.user_id)) @@ -81,12 +109,11 @@ async def _add_forward_header( ) if not fwd_from_text: - try: - user = await client.get_entity(fwd_from.from_id) - if user: - fwd_from_text, _ = pu.Puppet.get_displayname(user, False) - fwd_from_html = f"{escape(fwd_from_text)}" - except (ValueError, RPCError): + user = await _get_fwd_entity(client, evt) + if user: + fwd_from_text, _ = pu.Puppet.get_displayname(user, False) + fwd_from_html = f"{escape(fwd_from_text)}" + else: fwd_from_text = fwd_from_html = "unknown user" elif isinstance(fwd_from.from_id, (PeerChannel, PeerChat)): from_id = ( @@ -104,12 +131,11 @@ async def _add_forward_header( else: fwd_from_html = f"channel {escape(fwd_from_text)}" else: - try: - channel = await client.get_entity(fwd_from.from_id) - if channel: - fwd_from_text = f"channel {channel.title}" - fwd_from_html = f"channel {escape(channel.title)}" - except (ValueError, RPCError): + channel = await _get_fwd_entity(client, evt) + if channel: + fwd_from_text = f"channel {channel.title}" + fwd_from_html = f"channel {escape(channel.title)}" + else: fwd_from_text = fwd_from_html = "unknown channel" elif fwd_from.from_name: fwd_from_text = fwd_from.from_name @@ -175,7 +201,7 @@ async def telegram_to_matrix( content.ensure_has_html() if getattr(evt, "fwd_from", None): - await _add_forward_header(client, content, evt.fwd_from) + await _add_forward_header(client, content, evt) if isinstance(evt, Message) and evt.post and evt.post_author: content.ensure_has_html()