From 1f5261ff8fb53307ec20b2a88427e50ce1783a02 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 19 May 2018 17:16:42 +0300 Subject: [PATCH] Initial solution and database update for #11 The database now contains a displayname_source field which is the telegram user ID of the user whose point of view the displayname is from. Updates from the relaybot user always take precendence, but currently the relaybot will never automatically fetch displaynames. --- ...1299_add_displayname_source_fields_for_.py | 23 ++++++++++++++++++ mautrix_telegram/abstract_user.py | 1 + mautrix_telegram/bot.py | 1 + mautrix_telegram/db.py | 1 + mautrix_telegram/puppet.py | 24 +++++++++++++++---- 5 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 alembic/versions/bcfefa1f1299_add_displayname_source_fields_for_.py diff --git a/alembic/versions/bcfefa1f1299_add_displayname_source_fields_for_.py b/alembic/versions/bcfefa1f1299_add_displayname_source_fields_for_.py new file mode 100644 index 00000000..42ad0d16 --- /dev/null +++ b/alembic/versions/bcfefa1f1299_add_displayname_source_fields_for_.py @@ -0,0 +1,23 @@ +"""Add displayname source fields for puppets + +Revision ID: bcfefa1f1299 +Revises: bdadd173ee02 +Create Date: 2018-05-19 17:00:21.078098 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'bcfefa1f1299' +down_revision = 'bdadd173ee02' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('puppet', sa.Column('displayname_source', sa.Integer(), nullable=True)) + + +def downgrade(): + op.drop_column('puppet', 'displayname_source') diff --git a/mautrix_telegram/abstract_user.py b/mautrix_telegram/abstract_user.py index 86a4b7c2..56f47f69 100644 --- a/mautrix_telegram/abstract_user.py +++ b/mautrix_telegram/abstract_user.py @@ -42,6 +42,7 @@ class AbstractUser: self.client = None self.tgid = None self.mxid = None + self.is_relaybot = False async 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 ff81c345..f933e770 100644 --- a/mautrix_telegram/bot.py +++ b/mautrix_telegram/bot.py @@ -41,6 +41,7 @@ class Bot(AbstractUser): self.token = token self.whitelisted = True self.username = None + self.is_relaybot = True self.chats = {chat.id: chat.type for chat in BotChat.query.all()} self.tg_whitelist = [] self.whitelist_group_admins = config["bridge.relaybot.whitelist_group_admins"] or False diff --git a/mautrix_telegram/db.py b/mautrix_telegram/db.py index 3a3d1327..f0a04b9a 100644 --- a/mautrix_telegram/db.py +++ b/mautrix_telegram/db.py @@ -92,6 +92,7 @@ class Puppet(Base): id = Column(Integer, primary_key=True) displayname = Column(String, nullable=True) + displayname_source = Column(Integer, nullable=True) username = Column(String, nullable=True) photo_id = Column(String, nullable=True) is_bot = Column(Boolean, nullable=True) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index 9c0f7981..4b36e7fa 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -36,13 +36,14 @@ class Puppet: hs_domain = None cache = {} - def __init__(self, id=None, username=None, displayname=None, photo_id=None, is_bot=None, - db_instance=None): + def __init__(self, id=None, username=None, displayname=None, displayname_source=None, + photo_id=None, is_bot=None, db_instance=None): self.id = id self.mxid = self.get_mxid_from_id(self.id) self.username = username self.displayname = displayname + self.displayname_source = displayname_source self.photo_id = photo_id self.is_bot = is_bot self._db_instance = db_instance @@ -64,16 +65,19 @@ class Puppet: def new_db_instance(self): return DBPuppet(id=self.id, username=self.username, displayname=self.displayname, - photo_id=self.photo_id, is_bot=self.is_bot) + displayname_source=self.displayname_source, photo_id=self.photo_id, + is_bot=self.is_bot) @classmethod def from_db(cls, db_puppet): - return Puppet(db_puppet.id, db_puppet.username, db_puppet.displayname, db_puppet.photo_id, - db_puppet.is_bot, db_instance=db_puppet) + return Puppet(db_puppet.id, db_puppet.username, db_puppet.displayname, + db_puppet.displayname_source, db_puppet.photo_id, db_puppet.is_bot, + db_instance=db_puppet) def save(self): self.db_instance.username = self.username self.db_instance.displayname = self.displayname + self.db_instance.displayname_source = self.displayname_source self.db_instance.photo_id = self.photo_id self.db_instance.is_bot = self.is_bot self.db.commit() @@ -130,10 +134,20 @@ class Puppet: self.save() async def update_displayname(self, source, info): + ignore_source = (not source.is_relaybot + and self.displayname_source is not None + and self.displayname_source != source.tgid) + if ignore_source: + return + displayname = self.get_displayname(info) if displayname != self.displayname: await self.intent.set_display_name(displayname) self.displayname = displayname + self.displayname_source = source.tgid + return True + elif source.is_relaybot or self.displayname_source is None: + self.displayname_source = source.tgid return True async def update_avatar(self, source, photo):