浏览代码

tolerate ranges of power levels for logged-in users to avoid conflicts

Malte E 3 年之前
父节点
当前提交
3620c8479e
共有 1 个文件被更改,包括 15 次插入2 次删除
  1. 15 2
      mautrix_signal/portal.py

+ 15 - 2
mautrix_signal/portal.py

@@ -1679,6 +1679,7 @@ class Portal(DBPortal, BasePortal):
         is_initial: bool = False,
     ) -> PowerLevelStateEventContent:
         levels = levels or PowerLevelStateEventContent()
+        bot_pl = levels.get_user_level(self.az.bot_mxid)
         levels.events_default = 0
         if self.is_direct:
             levels.ban = 99
@@ -1691,8 +1692,20 @@ class Portal(DBPortal, BasePortal):
                 ac = info.access_control
                 for detail in info.member_detail + info.pending_member_detail:
                     puppet = await p.Puppet.get_by_address(Address(uuid=detail.uuid))
-                    level = 50 if detail.role == GroupMemberRole.ADMINISTRATOR else 0
-                    levels.users[puppet.intent_for(self).mxid] = level
+                    puppet_mxid = puppet.intent_for(self).mxid
+                    current_level = levels.get_user_level(puppet_mxid)
+                    if bot_pl > current_level and bot_pl >= 50:
+                        level = current_level
+                        if await u.User.get_by_address(Address(uuid=detail.uuid)):
+                            if current_level >= 50 and detail.role == GroupMemberRole.DEFAULT:
+                                level = 0
+                            elif (
+                                current_level < 50 and detail.role == GroupMemberRole.ADMINISTRATOR
+                            ):
+                                level = 50
+                        else:
+                            level = 50 if detail.role == GroupMemberRole.ADMINISTRATOR else 0
+                        levels.users[puppet_mxid] = level
                 announcements = info.announcements
             else:
                 ac = GroupAccessControl()