Merge pull request #91 from tulir/allow-portals-without-power
Allow portals without power level for AS bot
This commit is contained in:
@@ -146,11 +146,6 @@ async def bridge(evt: CommandEvent):
|
|||||||
if not await _has_access_to(room_id, evt.az.intent, evt.sender, "bridge"):
|
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.")
|
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
|
# The /id bot command provides the prefixed ID, so we assume
|
||||||
tgid = evt.args[0]
|
tgid = evt.args[0]
|
||||||
if tgid.startswith("-100"):
|
if tgid.startswith("-100"):
|
||||||
@@ -273,24 +268,11 @@ async def _get_initial_state(evt: CommandEvent):
|
|||||||
about = event["content"]["topic"]
|
about = event["content"]["topic"]
|
||||||
elif event["type"] == "m.room.power_levels":
|
elif event["type"] == "m.room.power_levels":
|
||||||
levels = event["content"]
|
levels = event["content"]
|
||||||
|
elif event["type"] == "m.room.canonical_alias":
|
||||||
|
title = title or event["content"]["alias"]
|
||||||
return title, about, levels
|
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()
|
@command_handler()
|
||||||
async def create(evt: CommandEvent):
|
async def create(evt: CommandEvent):
|
||||||
type = evt.args[0] if len(evt.args) > 0 else "group"
|
type = evt.args[0] if len(evt.args) > 0 else "group"
|
||||||
@@ -305,10 +287,6 @@ async def create(evt: CommandEvent):
|
|||||||
if not title:
|
if not title:
|
||||||
return await evt.reply("Please set a title before creating a Telegram chat.")
|
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"
|
supergroup = type == "supergroup"
|
||||||
type = {
|
type = {
|
||||||
"supergroup": "channel",
|
"supergroup": "channel",
|
||||||
|
|||||||
+46
-14
@@ -286,6 +286,8 @@ class Portal:
|
|||||||
levels["users"] = {
|
levels["users"] = {
|
||||||
self.main_intent.mxid: 100
|
self.main_intent.mxid: 100
|
||||||
}
|
}
|
||||||
|
else:
|
||||||
|
levels["users"][self.main_intent.mxid] = 100
|
||||||
return levels
|
return levels
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -492,10 +494,13 @@ class Portal:
|
|||||||
except MatrixRequestError:
|
except MatrixRequestError:
|
||||||
members = []
|
members = []
|
||||||
for user in members:
|
for user in members:
|
||||||
is_puppet = p.Puppet.get_id_from_mxid(user)
|
puppet = p.Puppet.get_by_mxid(user, create=False)
|
||||||
if user != intent.mxid and (not puppets_only or is_puppet):
|
if user != intent.mxid and (not puppets_only or puppet):
|
||||||
try:
|
try:
|
||||||
await intent.kick(room_id, user, message)
|
if puppet:
|
||||||
|
await puppet.intent.leave_room(room_id)
|
||||||
|
else:
|
||||||
|
await intent.kick(room_id, user, message)
|
||||||
except (MatrixRequestError, IntentError):
|
except (MatrixRequestError, IntentError):
|
||||||
pass
|
pass
|
||||||
await intent.leave_room(room_id)
|
await intent.leave_room(room_id)
|
||||||
@@ -857,16 +862,18 @@ class Portal:
|
|||||||
self.tg_receiver = self.tgid
|
self.tg_receiver = self.tgid
|
||||||
self.by_tgid[self.tgid_full] = self
|
self.by_tgid[self.tgid_full] = self
|
||||||
await self.update_info(source, entity)
|
await self.update_info(source, entity)
|
||||||
|
self.db.add(self.db_instance)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
if self.bot and self.bot.mxid in invites:
|
if self.bot and self.bot.tgid in invites:
|
||||||
self.bot.add_chat(self.tgid, self.peer_type)
|
self.bot.add_chat(self.tgid, self.peer_type)
|
||||||
|
|
||||||
levels = await self.main_intent.get_power_levels(self.mxid)
|
levels = await self.main_intent.get_power_levels(self.mxid)
|
||||||
levels = self._get_base_power_levels(levels, entity)
|
bot_level = self._get_bot_level(levels)
|
||||||
already_saved = await self.handle_matrix_power_levels(source, levels["users"], {})
|
if bot_level == 100:
|
||||||
if not already_saved:
|
levels = self._get_base_power_levels(levels, entity)
|
||||||
await self.main_intent.set_power_levels(self.mxid, levels)
|
await self.main_intent.set_power_levels(self.mxid, levels)
|
||||||
|
await self.handle_matrix_power_levels(source, levels["users"], {})
|
||||||
|
|
||||||
async def invite_telegram(self, source, puppet):
|
async def invite_telegram(self, source, puppet):
|
||||||
if self.peer_type == "chat":
|
if self.peer_type == "chat":
|
||||||
@@ -1159,18 +1166,41 @@ class Portal:
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
@staticmethod
|
@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_level_defined = user.mxid in levels["users"]
|
||||||
user_has_right_level = (levels["users"][user.mxid] == new_level
|
default_level = levels["users_default"] if "users_default" in levels else 0
|
||||||
if user_level_defined else new_level == 0)
|
user_level = levels["users"][user.mxid] if user_level_defined else default_level
|
||||||
if not user_has_right_level:
|
if user_level != new_level and user_level < bot_level:
|
||||||
levels["users"][user.mxid] = new_level
|
levels["users"][user.mxid] = new_level
|
||||||
return True
|
return True
|
||||||
return False
|
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
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_powerlevel_level(levels):
|
||||||
|
try:
|
||||||
|
return levels["events"]["m.room.power_levels"]
|
||||||
|
except KeyError:
|
||||||
|
try:
|
||||||
|
return levels["state_default"]
|
||||||
|
except KeyError:
|
||||||
|
return 50
|
||||||
|
|
||||||
def _participants_to_power_levels(self, participants, levels):
|
def _participants_to_power_levels(self, participants, levels):
|
||||||
|
bot_level = self._get_bot_level(levels)
|
||||||
|
if bot_level < self._get_powerlevel_level(levels):
|
||||||
|
return False
|
||||||
changed = False
|
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:
|
if levels["events"]["m.room.power_levels"] != admin_power_level:
|
||||||
changed = True
|
changed = True
|
||||||
levels["events"]["m.room.power_levels"] = admin_power_level
|
levels["events"]["m.room.power_levels"] = admin_power_level
|
||||||
@@ -1182,10 +1212,12 @@ class Portal:
|
|||||||
|
|
||||||
if user:
|
if user:
|
||||||
user.register_portal(self)
|
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:
|
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
|
return changed
|
||||||
|
|
||||||
async def update_telegram_participants(self, participants, levels=None):
|
async def update_telegram_participants(self, participants, levels=None):
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ setuptools.setup(
|
|||||||
|
|
||||||
install_requires=[
|
install_requires=[
|
||||||
"aiohttp>=3.0.1,<4",
|
"aiohttp>=3.0.1,<4",
|
||||||
"mautrix-telegram>=0.1,<0.2",
|
"mautrix-appservice>=0.1.1,<0.2.0",
|
||||||
"SQLAlchemy>=1.2.3,<2",
|
"SQLAlchemy>=1.2.3,<2",
|
||||||
"alembic>=0.9.8,<0.10",
|
"alembic>=0.9.8,<0.10",
|
||||||
"Markdown>=2.6.11,<3",
|
"Markdown>=2.6.11,<3",
|
||||||
|
|||||||
Reference in New Issue
Block a user