From 0a6130607de8bd9885bc32cdeec8c941bbd578ea Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 19 Feb 2018 19:52:45 +0200 Subject: [PATCH] Fix avatar changes and outgoing meta change deduplication Also move the telegram ID -> MXID generation to Puppet.get_mxid_from_id() --- mautrix_telegram/abstract_user.py | 1 + mautrix_telegram/bot.py | 2 ++ mautrix_telegram/commands/auth.py | 6 ++---- mautrix_telegram/matrix.py | 2 +- mautrix_telegram/portal.py | 5 ++++- mautrix_telegram/puppet.py | 18 +++++++++++------- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/mautrix_telegram/abstract_user.py b/mautrix_telegram/abstract_user.py index ce3c6008..260cc504 100644 --- a/mautrix_telegram/abstract_user.py +++ b/mautrix_telegram/abstract_user.py @@ -37,6 +37,7 @@ class AbstractUser: self.whitelisted = False self.client = None self.tgid = None + self.mxid = None def _init_client(self): self.log.debug(f"Initializing client for {self.name}") diff --git a/mautrix_telegram/bot.py b/mautrix_telegram/bot.py index 02a15b47..0a6e71a4 100644 --- a/mautrix_telegram/bot.py +++ b/mautrix_telegram/bot.py @@ -23,6 +23,7 @@ from telethon.tl.functions.channels import GetChannelsRequest from .abstract_user import AbstractUser from .db import BotChat +from . import puppet as pu config = None @@ -47,6 +48,7 @@ class Bot(AbstractUser): async def post_login(self): info = await self.client.get_me() self.tgid = info.id + self.mxid = pu.Puppet.get_mxid_from_id(self.tgid) chat_ids = [id for id, type in self.chats.items() if type == "chat"] response = await self.client(GetChatsRequest(chat_ids)) diff --git a/mautrix_telegram/commands/auth.py b/mautrix_telegram/commands/auth.py index ed254540..3b6a9100 100644 --- a/mautrix_telegram/commands/auth.py +++ b/mautrix_telegram/commands/auth.py @@ -19,6 +19,7 @@ import asyncio from telethon.errors import * from . import command_handler +from .. import puppet as pu @command_handler(needs_auth=False) @@ -37,10 +38,7 @@ async def ping_bot(evt): if not evt.tgbot: return await evt.reply("Telegram message relay bot not configured.") bot_info = await evt.tgbot.client.get_me() - localpart = evt.config.get("bridge.username_template", "telegram_{userid}").format( - userid=bot_info.id) - hs = evt.config["homeserver"]["domain"] - mxid = f"@{localpart}:{hs}" + mxid = pu.Puppet.get_mxid_from_id(bot_info.id) displayname = bot_info.first_name return await evt.reply("Telegram message relay bot is active: " f"[{displayname}](https://matrix.to/#/{mxid}) (ID {bot_info.id})\n\n" diff --git a/mautrix_telegram/matrix.py b/mautrix_telegram/matrix.py index e14801d2..25b2eb97 100644 --- a/mautrix_telegram/matrix.py +++ b/mautrix_telegram/matrix.py @@ -248,5 +248,5 @@ class MatrixHandler: elif type == "m.room.power_levels": await self.handle_power_levels(evt["room_id"], evt["sender"], evt["content"], evt["prev_content"]) - elif type == "m.room.name" or type == "m.room.avatar" or type == "m.room.topic": + elif type in ("m.room.name", "m.room.avatar", "m.room.topic"): await self.handle_room_meta(type, evt["room_id"], evt["sender"], evt["content"]) diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index bb1f1bc3..7cc88c6d 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -654,7 +654,7 @@ class Portal: check_dedup = (isinstance(update, (UpdateNewMessage, UpdateNewChannelMessage)) and isinstance(update.message, MessageService)) if check_dedup: - self.is_duplicate_action(update) + self.is_duplicate_action(update.message) # endregion # region Telegram chat info updating @@ -727,6 +727,9 @@ class Portal: await self.update_info(source, entity) self.save() + if self.bot and self.bot.mxid in invites: + self.bot.add_chat(self.tgid, self.peer_type) + levels = await self.main_intent.get_power_levels(self.mxid) levels = self._get_base_power_levels(levels, entity) already_saved = await self.handle_matrix_power_levels(source, levels["users"], {}) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index 2ee48c79..bfb9c28c 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -31,15 +31,14 @@ class Puppet: db = None az = None mxid_regex = None + username_template = None + hs_domain = None cache = {} def __init__(self, id=None, username=None, displayname=None, photo_id=None): self.id = id + self.mxid = self.get_mxid_from_id(self.id) - self.localpart = config.get("bridge.username_template", "telegram_{userid}").format( - userid=self.id) - hs = config["homeserver"]["domain"] - self.mxid = f"@{self.localpart}:{hs}" self.username = username self.displayname = displayname self.photo_id = photo_id @@ -161,6 +160,10 @@ class Puppet: return int(match.group(1)) return None + @classmethod + def get_mxid_from_id(cls, id): + return f"@{cls.username_template.format(userid=id)}:{cls.hs_domain}" + @classmethod def find_by_username(cls, username): for _, puppet in cls.cache.items(): @@ -177,6 +180,7 @@ class Puppet: def init(context): global config Puppet.az, Puppet.db, config, _, _ = context - localpart = config.get("bridge.username_template", "telegram_{userid}").format(userid="(.+)") - hs = config["homeserver"]["domain"] - Puppet.mxid_regex = re.compile(f"@{localpart}:{hs}") + Puppet.username_template = config.get("bridge.username_template", "telegram_{userid}") + Puppet.hs_domain = config["homeserver"]["domain"] + localpart = Puppet.username_template.format(userid="(.+)") + Puppet.mxid_regex = re.compile(f"@{localpart}:{Puppet.hs_domain}")