From 9cc0b639c6d7dbc618ceee2ce9484b976c05aa0d Mon Sep 17 00:00:00 2001
From: Tulir Asokan <tulir@maunium.net>
Date: Sun, 30 Jun 2019 19:06:05 +0300
Subject: [PATCH] More rich profile stuff

---
 ..._add_more_puppet_info_for_rich_profiles.py | 36 +++++++++++++++++++
 mautrix_telegram/db/puppet.py                 | 13 +++----
 mautrix_telegram/portal.py                    |  2 +-
 mautrix_telegram/puppet.py                    | 31 +++++++---------
 .../scripts/add_related_groups.sh             | 18 ++++++++++
 5 files changed, 75 insertions(+), 25 deletions(-)
 create mode 100644 alembic/versions/1bd9ab7c9e21_add_more_puppet_info_for_rich_profiles.py
 create mode 100755 mautrix_telegram/scripts/add_related_groups.sh

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 0000000..f763def
--- /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 20f920e..d1986bd 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 a14605e..bce8611 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 8da5f37..35fe784 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 0000000..310f7fa
--- /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
-- 
GitLab