diff --git a/alembic/versions/990f4395afc6_store_displayname_contact_status_in_.py b/alembic/versions/990f4395afc6_store_displayname_contact_status_in_.py new file mode 100644 index 00000000..fb847b16 --- /dev/null +++ b/alembic/versions/990f4395afc6_store_displayname_contact_status_in_.py @@ -0,0 +1,32 @@ +"""Store displayname contact status in puppet table + +Revision ID: 990f4395afc6 +Revises: 7de69cf5809e +Create Date: 2021-01-01 11:56:54.610681 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = '990f4395afc6' +down_revision = '7de69cf5809e' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('puppet', schema=None) as batch_op: + batch_op.add_column(sa.Column('displayname_contact', sa.Boolean(), server_default=sa.true(), nullable=False)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('puppet', schema=None) as batch_op: + batch_op.drop_column('displayname_contact') + + # ### end Alembic commands ### diff --git a/mautrix_telegram/db/puppet.py b/mautrix_telegram/db/puppet.py index 3c258fdc..0dd29a2d 100644 --- a/mautrix_telegram/db/puppet.py +++ b/mautrix_telegram/db/puppet.py @@ -34,6 +34,7 @@ class Puppet(Base): base_url: str = Column(Text, nullable=True) displayname: str = Column(String, nullable=True) displayname_source: TelegramID = Column(Integer, nullable=True) + displayname_contact: bool = Column(Boolean, nullable=False, server_default=expression.true()) username: str = Column(String, nullable=True) photo_id: str = Column(String, nullable=True) is_bot: bool = Column(Boolean, nullable=True) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index 908a98d8..9562be79 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -65,6 +65,7 @@ class Puppet(BasePuppet): username: Optional[str] displayname: Optional[str] displayname_source: Optional[TelegramID] + displayname_contact: bool photo_id: Optional[str] is_bot: bool is_registered: bool @@ -86,6 +87,7 @@ class Puppet(BasePuppet): username: Optional[str] = None, displayname: Optional[str] = None, displayname_source: Optional[TelegramID] = None, + displayname_contact: bool = False, photo_id: Optional[str] = None, is_bot: bool = False, is_registered: bool = False, @@ -101,6 +103,7 @@ class Puppet(BasePuppet): self.username = username self.displayname = displayname self.displayname_source = displayname_source + self.displayname_contact = displayname_contact self.photo_id = photo_id self.is_bot = is_bot self.is_registered = is_registered @@ -165,8 +168,8 @@ class Puppet(BasePuppet): return dict(access_token=self.access_token, next_batch=self._next_batch, custom_mxid=self.custom_mxid, username=self.username, is_bot=self.is_bot, displayname=self.displayname, displayname_source=self.displayname_source, - photo_id=self.photo_id, matrix_registered=self.is_registered, - disable_updates=self.disable_updates, + displayname_contact=self.displayname_contact, photo_id=self.photo_id, + matrix_registered=self.is_registered, disable_updates=self.disable_updates, base_url=str(self.base_url) if self.base_url else None) def new_db_instance(self) -> DBPuppet: @@ -179,8 +182,9 @@ class Puppet(BasePuppet): def from_db(cls, db_puppet: DBPuppet) -> 'Puppet': return Puppet(db_puppet.id, db_puppet.access_token, db_puppet.custom_mxid, db_puppet.next_batch, db_puppet.base_url, db_puppet.username, - db_puppet.displayname, db_puppet.displayname_source, db_puppet.photo_id, - db_puppet.is_bot, db_puppet.matrix_registered, db_puppet.disable_updates, + db_puppet.displayname, db_puppet.displayname_source, + db_puppet.displayname_contact, db_puppet.photo_id, db_puppet.is_bot, + db_puppet.matrix_registered, db_puppet.disable_updates, db_instance=db_puppet) # endregion @@ -273,6 +277,10 @@ class Puppet(BasePuppet): if isinstance(info, UpdateUserName): info = await source.client.get_entity(PeerUser(self.tgid)) + if not info.contact: + self.displayname_contact = False + elif not self.displayname_contact: + return False displayname = self.get_displayname(info) if displayname != self.displayname: