Initial attempt at removing appservice bot power level requirements

This commit is contained in:
Tulir Asokan
2018-03-04 17:39:56 +02:00
parent 6d648d51da
commit 8cce7a7c3a
2 changed files with 28 additions and 33 deletions
-24
View File
@@ -128,11 +128,6 @@ async def bridge(evt: CommandEvent):
if not await _has_access_to(room_id, evt.az.intent, evt.sender, "bridge"):
return await evt.reply("You do not have the permissions to bridge that room.")
levels = await evt.az.intent.get_power_levels(room_id)
power_level_error = _check_power_levels(levels, evt.az.bot_mxid)
if power_level_error:
return await evt.reply(power_level_error)
# The /id bot command provides the prefixed ID, so we assume
tgid = evt.args[0]
if tgid.startswith("-100"):
@@ -258,21 +253,6 @@ async def _get_initial_state(evt: CommandEvent):
return title, about, levels
def _check_power_levels(levels: dict, bot_mxid: str):
try:
if levels["users"][bot_mxid] < 100:
raise ValueError()
except (TypeError, KeyError, ValueError):
return (f"Please give [the bridge bot](https://matrix.to/#/{bot_mxid}) a power level of "
"100 before creating or bridging a Telegram chat.")
for user, level in levels["users"].items():
if level >= 100 and user != bot_mxid:
return (f"Please make sure only the bridge bot has power level above 99 before "
f"creating or bridging a Telegram chat.\n\n"
f"Use power level 95 instead of 100 for admins.")
@command_handler()
async def create(evt: CommandEvent):
type = evt.args[0] if len(evt.args) > 0 else "group"
@@ -287,10 +267,6 @@ async def create(evt: CommandEvent):
if not title:
return await evt.reply("Please set a title before creating a Telegram chat.")
power_level_error = _check_power_levels(levels, evt.az.bot_mxid)
if power_level_error:
return await evt.reply(power_level_error)
supergroup = type == "supergroup"
type = {
"supergroup": "channel",
+28 -9
View File
@@ -284,6 +284,8 @@ class Portal:
levels["users"] = {
self.main_intent.mxid: 100
}
else:
levels["users"][self.main_intent.mxid] = 100
return levels
@property
@@ -799,7 +801,8 @@ class Portal:
self.bot.add_chat(self.tgid, self.peer_type)
levels = await self.main_intent.get_power_levels(self.mxid)
levels = self._get_base_power_levels(levels, entity)
if self._get_bot_level(levels) == 100:
levels = self._get_base_power_levels(levels, entity)
already_saved = await self.handle_matrix_power_levels(source, levels["users"], {})
if not already_saved:
await self.main_intent.set_power_levels(self.mxid, levels)
@@ -1060,18 +1063,29 @@ class Portal:
return 0
@staticmethod
def _participant_to_power_levels(levels, user, new_level):
def _participant_to_power_levels(levels, user, new_level, bot_level):
new_level = min(new_level, bot_level)
user_level_defined = user.mxid in levels["users"]
user_has_right_level = (levels["users"][user.mxid] == new_level
if user_level_defined else new_level == 0)
if not user_has_right_level:
default_level = levels["users_default"] if "users_default" in levels else 0
user_level = levels["users"][user.mxid] if user_level_defined else default_level
if user_level != new_level and user_level < bot_level:
levels["users"][user.mxid] = new_level
return True
return False
def _get_bot_level(self, levels):
try:
return levels["users"][self.main_intent.mxid]
except KeyError:
try:
return levels["users_default"]
except KeyError:
return 0
def _participants_to_power_levels(self, participants, levels):
bot_level = self._get_bot_level(levels)
changed = False
admin_power_level = 75 if self.peer_type == "channel" else 50
admin_power_level = min(75 if self.peer_type == "channel" else 50, bot_level)
if levels["events"]["m.room.power_levels"] != admin_power_level:
changed = True
levels["events"]["m.room.power_levels"] = admin_power_level
@@ -1083,10 +1097,12 @@ class Portal:
if user:
user.register_portal(self)
changed = self._participant_to_power_levels(levels, user, new_level) or changed
changed = self._participant_to_power_levels(levels, user, new_level,
bot_level) or changed
if puppet:
changed = self._participant_to_power_levels(levels, puppet, new_level) or changed
changed = self._participant_to_power_levels(levels, puppet, new_level,
bot_level) or changed
return changed
async def update_telegram_participants(self, participants, levels=None):
@@ -1101,7 +1117,10 @@ class Portal:
levels["invite"] = level
levels["events"]["m.room.name"] = level
levels["events"]["m.room.avatar"] = level
await self.main_intent.set_power_levels(self.mxid, levels)
try:
await self.main_intent.set_power_levels(self.mxid, levels)
except MatrixRequestError:
pass
# endregion
# region Database conversion