diff --git a/alembic/versions/1bd9ab7c9e21_add_more_puppet_info_for_rich_profiles.py b/alembic/versions/1bd9ab7c9e21_add_more_puppet_info_for_rich_profiles.py new file mode 100644 index 0000000000000000000000000000000000000000..f763defbded3ddf7e0acf54813482ef0e0316610 --- /dev/null +++ b/alembic/versions/1bd9ab7c9e21_add_more_puppet_info_for_rich_profiles.py @@ -0,0 +1,36 @@ +"""Add more puppet info for rich profiles + +Revision ID: 1bd9ab7c9e21 +Revises: 9e9c89b0b877 +Create Date: 2019-06-30 17:34:56.417236 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = "1bd9ab7c9e21" +down_revision = "9e9c89b0b877" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table("puppet_portal", + sa.Column("puppet_id", sa.Integer(), nullable=False), + sa.Column("portal_id", sa.Integer(), nullable=False), + sa.Column("displayname", sa.String(), nullable=True), + sa.ForeignKeyConstraint(("portal_id",), ("portal.tgid",), ), + sa.ForeignKeyConstraint(("puppet_id",), ("puppet.id",), ), + sa.PrimaryKeyConstraint("puppet_id", "portal_id")) + op.add_column("puppet", sa.Column("first_name", sa.String(), nullable=True)) + op.add_column("puppet", sa.Column("last_name", sa.String(), nullable=True)) + op.add_column("puppet", sa.Column("avatar_url", sa.String(), nullable=True)) + + +def downgrade(): + with op.batch_alter_table("puppet") as batch_op: + batch_op.drop_column("last_name") + batch_op.drop_column("first_name") + batch_op.drop_column("avatar_url") + op.drop_table("puppet_portal") diff --git a/mautrix_telegram/db/puppet.py b/mautrix_telegram/db/puppet.py index 20f920e1cfc7abd4e2e1b4fef692228822a47676..d1986bd48d6cbac0872ef1c0df1fe52dc8cfcfba 100644 --- a/mautrix_telegram/db/puppet.py +++ b/mautrix_telegram/db/puppet.py @@ -35,6 +35,7 @@ class Puppet(Base): first_name = Column(String, nullable=True) last_name = Column(String, nullable=True) photo_id = Column(String, nullable=True) + avatar_url = Column(String, nullable=True) is_bot = Column(Boolean, nullable=True) matrix_registered = Column(Boolean, nullable=False, server_default=expression.false()) disable_updates = Column(Boolean, nullable=False, server_default=expression.false()) @@ -42,12 +43,12 @@ class Puppet(Base): @classmethod def scan(cls, row) -> Optional['Puppet']: (id, custom_mxid, access_token, displayname, displayname_source, username, first_name, - last_name, photo_id, is_bot, matrix_registered, disable_updates) = row + last_name, photo_id, avatar_url, is_bot, matrix_registered, disable_updates) = row return cls(id=id, custom_mxid=custom_mxid, access_token=access_token, displayname=displayname, displayname_source=displayname_source, username=username, first_name=first_name, last_name=last_name, - photo_id=photo_id, is_bot=is_bot, matrix_registered=matrix_registered, - disable_updates=disable_updates) + photo_id=photo_id, avatar_url=avatar_url, is_bot=is_bot, + matrix_registered=matrix_registered, disable_updates=disable_updates) @classmethod def _one_or_none(cls, rows: RowProxy) -> Optional['Puppet']: @@ -88,7 +89,7 @@ class Puppet(Base): id=self.id, custom_mxid=self.custom_mxid, access_token=self.access_token, displayname=self.displayname, displayname_source=self.displayname_source, username=self.username, first_name=self.first_name, last_name=self.last_name, - photo_id=self.photo_id, is_bot=self.is_bot, + photo_id=self.photo_id, avatar_url=self.avatar_url, is_bot=self.is_bot, matrix_registered=self.matrix_registered, disable_updates=self.disable_updates)) @@ -96,8 +97,8 @@ class PuppetPortal(Base): __tablename__ = "puppet_portal" puppet_id = Column(Integer, ForeignKey("puppet.id"), primary_key=True) - portal_id = Column(Integer, ForeignKey("portal.id"), primary_key=True) # type: TelegramID - displayname = Column(String(255), nullable=True) + portal_id = Column(Integer, ForeignKey("portal.tgid"), primary_key=True) # type: TelegramID + displayname = Column(String, nullable=True) @property def _edit_identity(self): diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index a14605e28863888925db9c1b92dbde0c708e1bd5..bce86115cc573430a139a4506d80fc69df3cd7e2 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -305,7 +305,7 @@ class Portal: # endregion # region Matrix room info updating - async def get_puppet_displayname(self, info: User, data: Dict[str, str] = None) -> str: + def get_puppet_displayname(self, info: User, data: Dict[str, str] = None) -> str: return p.Puppet.get_displayname(info, self.get_config("displayname_preference"), self.get_config("displayname_template"), data) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index 8da5f375c1e764685e85640bfe17895d3d248a08..35fe784f8538e1913dd43a3de60479edb6b3bad3 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -363,17 +363,20 @@ class Puppet: if isinstance(info.photo, UserProfilePhoto): changed = await self.update_avatar(source, info.photo) or changed - if self.username != info.username: - self.username = info.username - changed = True - if changed: self.save() async def update_displayname(self, source: 'AbstractUser', info: Union[User, UpdateUserName] ) -> bool: + update = False + if ((self.username != info.username or self.first_name != info.first_name + or self.last_name != info.last_name)): + self.username = info.username + self.first_name = info.first_name + self.last_name = info.last_name + update = True if self.disable_updates: - return False + return update is_main_source = (source.is_relaybot or (self.displayname_source is not None and self.displayname_source == source.tgid)) # No phone -> not in contact list -> can't set custom name -> name is trustworthy @@ -383,21 +386,13 @@ class Puppet: elif isinstance(info, UpdateUserName): info = await source.client.get_entity(PeerUser(self.tgid)) - update = False displayname = None rich_profile = config["bridge.rich_profile"] if not rich_profile: displayname = self.get_displayname(info) - if self.displayname != displayname: + update = self.displayname != displayname + if update: self.displayname = displayname - update = True - else: - if ((self.username != info.username or self.first_name != info.first_name - or self.last_name != info.last_name)): - self.username = info.username - self.first_name = info.first_name - self.last_name = info.last_name - update = True if update: self.displayname_source = source.tgid try: @@ -410,11 +405,11 @@ class Puppet: return True return False - async def update_profile_in_room(self, portal: p.Portal, user: Optional[User] = None) -> None: + async def update_profile_in_room(self, portal: 'p.Portal', user: Optional[User] = None) -> None: pupo = DBPuppetPortal.get(self.tgid, portal.tgid) await self._set_rich_profile(pupo, portal, user) - async def _set_rich_profile(self, pupo: Optional[DBPuppetPortal], portal: p.Portal, + async def _set_rich_profile(self, pupo: Optional[DBPuppetPortal], portal: 'p.Portal', user: Optional[User] = None, dn_data: Optional[Dict[str, str]] = None) -> None: local_displayname = portal.get_puppet_displayname(user or self, data=dn_data) @@ -446,7 +441,7 @@ class Puppet: if avatar_url is not None: await self.default_mxid_intent.set_avatar(avatar_url) return - if avatar_url: + if avatar_url is not None: self.avatar_url = avatar_url dn_data = self._get_displayname_data(user or self) pupos = DBPuppetPortal.all_for_puppet(self.tgid) diff --git a/mautrix_telegram/scripts/add_related_groups.sh b/mautrix_telegram/scripts/add_related_groups.sh new file mode 100755 index 0000000000000000000000000000000000000000..310f7fa12a810a5546e0a34e68814348464bd742 --- /dev/null +++ b/mautrix_telegram/scripts/add_related_groups.sh @@ -0,0 +1,18 @@ +#!/bin/bash +if [[ -z "$GROUP_ID" ]]; then + echo "Please set the GROUP_ID environment variable." + exit 1 +elif [[ -z "$ACCESS_TOKEN" ]]; then + echo "Please set the ACCESS_TOKEN environment variable." + exit 1 +elif [[ -z "$HOMESERVER" ]]; then + echo "Please set the HOMESERVER environment variable." + exit 1 +fi +auth="Authorization: Bearer $ACCESS_TOKEN" +rooms=$(curl -s -H "$auth" "$HOMESERVER/_matrix/client/r0/joined_rooms" | jq -r '.joined_rooms[]') +for room in $rooms; do + old_groups=$(curl -s -H "$auth" "$HOMESERVER/_matrix/client/r0/rooms/$room/state/m.room.related_groups") + new_groups=$(echo "$old_groups" | jq -rc '{"groups": (.groups + ["'$GROUP_ID'"] | unique)}') + curl -s -H "$auth" -X PUT "$HOMESERVER/_matrix/client/r0/rooms/$room/state/m.room.related_groups" -d "$new_groups" +done