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):