Parcourir la source

Sync users who left the Signal group to Matrix

Tulir Asokan il y a 3 ans
Parent
commit
a477ca3081
1 fichiers modifiés avec 28 ajouts et 3 suppressions
  1. 28 3
      mautrix_signal/portal.py

+ 28 - 3
mautrix_signal/portal.py

@@ -62,6 +62,7 @@ from mautrix.types import (
     FileInfo,
     ImageInfo,
     MediaMessageEventContent,
+    Membership,
     MessageEvent,
     MessageEventContent,
     MessageType,
@@ -1417,26 +1418,50 @@ class Portal(DBPortal, BasePortal):
         if not self.mxid or not isinstance(info, (Group, GroupV2)):
             return
 
+        member_events = await self.main_intent.get_members(self.mxid)
+        remove_users: set[UserID] = {
+            UserID(evt.state_key)
+            for evt in member_events
+            if evt.content.membership == Membership.JOIN and evt.state_key != self.az.bot_mxid
+        }
+
         pending_members = info.pending_members if isinstance(info, GroupV2) else []
         self._pending_members = {addr.uuid for addr in pending_members}
 
         for address in info.members:
             user = await u.User.get_by_address(address)
             if user:
-                await self.main_intent.invite_user(self.mxid, user.mxid)
+                remove_users.discard(user.mxid)
+                await self.main_intent.invite_user(self.mxid, user.mxid, check_cache=True)
 
             puppet = await p.Puppet.get_by_address(address)
             await source.sync_contact(address)
             await puppet.intent_for(self).ensure_joined(self.mxid)
+            remove_users.discard(puppet.default_mxid)
 
         for address in pending_members:
             user = await u.User.get_by_address(address)
             if user:
-                await self.main_intent.invite_user(self.mxid, user.mxid)
+                remove_users.discard(user.mxid)
+                await self.main_intent.invite_user(self.mxid, user.mxid, check_cache=True)
 
             puppet = await p.Puppet.get_by_address(address)
             await source.sync_contact(address)
-            await self.main_intent.invite_user(self.mxid, puppet.intent_for(self).mxid)
+            await self.main_intent.invite_user(
+                self.mxid, puppet.intent_for(self).mxid, check_cache=True
+            )
+            remove_users.discard(puppet.default_mxid)
+
+        for mxid in remove_users:
+            puppet = await p.Puppet.get_by_mxid(mxid, create=False)
+            if puppet:
+                await puppet.default_mxid_intent.leave_room(self.mxid)
+            else:
+                user = await u.User.get_by_mxid(mxid, create=False)
+                if user and await user.is_logged_in():
+                    await self.main_intent.kick_user(
+                        self.mxid, user.mxid, "You are not a member of this Signal group"
+                    )
 
     async def _update_power_levels(self, info: ChatInfo) -> None:
         if not self.mxid: