Refactor code
This commit is contained in:
@@ -121,6 +121,26 @@ async def delete_portal(evt):
|
|||||||
"by typing `$cmdprefix+sp confirm-delete`")
|
"by typing `$cmdprefix+sp confirm-delete`")
|
||||||
|
|
||||||
|
|
||||||
|
async def _join(evt, arg):
|
||||||
|
if arg.startswith("joinchat/"):
|
||||||
|
invite_hash = arg[len("joinchat/"):]
|
||||||
|
try:
|
||||||
|
await evt.sender.client(CheckChatInviteRequest(invite_hash))
|
||||||
|
except InviteHashInvalidError:
|
||||||
|
return None, await evt.reply("Invalid invite link.")
|
||||||
|
except InviteHashExpiredError:
|
||||||
|
return None, await evt.reply("Invite link expired.")
|
||||||
|
try:
|
||||||
|
return evt.sender.client(ImportChatInviteRequest(invite_hash)), None
|
||||||
|
except UserAlreadyParticipantError:
|
||||||
|
return None, await evt.reply("You are already in that chat.")
|
||||||
|
else:
|
||||||
|
channel = await evt.sender.client.get_entity(arg)
|
||||||
|
if not channel:
|
||||||
|
return None, await evt.reply("Channel/supergroup not found.")
|
||||||
|
return await evt.sender.client(JoinChannelRequest(channel)), None
|
||||||
|
|
||||||
|
|
||||||
@command_handler()
|
@command_handler()
|
||||||
async def join(evt):
|
async def join(evt):
|
||||||
if len(evt.args) == 0:
|
if len(evt.args) == 0:
|
||||||
@@ -130,24 +150,11 @@ async def join(evt):
|
|||||||
arg = regex.match(evt.args[0])
|
arg = regex.match(evt.args[0])
|
||||||
if not arg:
|
if not arg:
|
||||||
return await evt.reply("That doesn't look like a Telegram invite link.")
|
return await evt.reply("That doesn't look like a Telegram invite link.")
|
||||||
arg = arg.group(1)
|
|
||||||
if arg.startswith("joinchat/"):
|
updates, _ = await _join(evt, arg.group(1))
|
||||||
invite_hash = arg[len("joinchat/"):]
|
if not updates:
|
||||||
try:
|
return
|
||||||
await evt.sender.client(CheckChatInviteRequest(invite_hash))
|
|
||||||
except InviteHashInvalidError:
|
|
||||||
return await evt.reply("Invalid invite link.")
|
|
||||||
except InviteHashExpiredError:
|
|
||||||
return await evt.reply("Invite link expired.")
|
|
||||||
try:
|
|
||||||
updates = evt.sender.client(ImportChatInviteRequest(invite_hash))
|
|
||||||
except UserAlreadyParticipantError:
|
|
||||||
return await evt.reply("You are already in that chat.")
|
|
||||||
else:
|
|
||||||
channel = await evt.sender.client.get_entity(arg)
|
|
||||||
if not channel:
|
|
||||||
return await evt.reply("Channel/supergroup not found.")
|
|
||||||
updates = await evt.sender.client(JoinChannelRequest(channel))
|
|
||||||
for chat in updates.chats:
|
for chat in updates.chats:
|
||||||
portal = po.Portal.get_by_entity(chat)
|
portal = po.Portal.get_by_entity(chat)
|
||||||
if portal.mxid:
|
if portal.mxid:
|
||||||
|
|||||||
@@ -219,8 +219,7 @@ class MatrixHandler:
|
|||||||
"m.room.avatar": (portal.handle_matrix_avatar, "url"),
|
"m.room.avatar": (portal.handle_matrix_avatar, "url"),
|
||||||
}[type]
|
}[type]
|
||||||
if content_key not in content:
|
if content_key not in content:
|
||||||
# FIXME handle
|
return
|
||||||
pass
|
|
||||||
await handler(sender, content[content_key])
|
await handler(sender, content[content_key])
|
||||||
|
|
||||||
def filter_matrix_event(self, event):
|
def filter_matrix_event(self, event):
|
||||||
|
|||||||
+39
-34
@@ -626,6 +626,22 @@ class Portal:
|
|||||||
return
|
return
|
||||||
await deleter.client.delete_messages(self.peer, [message.tgid])
|
await deleter.client.delete_messages(self.peer, [message.tgid])
|
||||||
|
|
||||||
|
async def _update_telegram_power_level(self, sender, user_id, level):
|
||||||
|
if self.peer_type == "chat":
|
||||||
|
await sender.client(EditChatAdminRequest(
|
||||||
|
chat_id=self.tgid, user_id=user_id, is_admin=level >= 50))
|
||||||
|
elif self.peer_type == "channel":
|
||||||
|
moderator = level >= 50
|
||||||
|
admin = level >= 75
|
||||||
|
rights = ChannelAdminRights(change_info=moderator, post_messages=moderator,
|
||||||
|
edit_messages=moderator, delete_messages=moderator,
|
||||||
|
ban_users=moderator, invite_users=moderator,
|
||||||
|
invite_link=moderator, pin_messages=moderator,
|
||||||
|
add_admins=admin, manage_call=moderator)
|
||||||
|
await sender.client(
|
||||||
|
EditAdminRequest(channel=await self.get_input_entity(sender),
|
||||||
|
user_id=user_id, admin_rights=rights))
|
||||||
|
|
||||||
async def handle_matrix_power_levels(self, sender, new_users, old_users):
|
async def handle_matrix_power_levels(self, sender, new_users, old_users):
|
||||||
# TODO handle all power level changes and bridge exact admin rights to supergroups/channels
|
# TODO handle all power level changes and bridge exact admin rights to supergroups/channels
|
||||||
for user, level in new_users.items():
|
for user, level in new_users.items():
|
||||||
@@ -640,20 +656,7 @@ class Portal:
|
|||||||
if not user_id or user_id == sender.tgid:
|
if not user_id or user_id == sender.tgid:
|
||||||
continue
|
continue
|
||||||
if user not in old_users or level != old_users[user]:
|
if user not in old_users or level != old_users[user]:
|
||||||
if self.peer_type == "chat":
|
await self._update_telegram_power_level(sender, user_id, level)
|
||||||
await sender.client(EditChatAdminRequest(
|
|
||||||
chat_id=self.tgid, user_id=user_id, is_admin=level >= 50))
|
|
||||||
elif self.peer_type == "channel":
|
|
||||||
moderator = level >= 50
|
|
||||||
admin = level >= 75
|
|
||||||
rights = ChannelAdminRights(change_info=moderator, post_messages=moderator,
|
|
||||||
edit_messages=moderator, delete_messages=moderator,
|
|
||||||
ban_users=moderator, invite_users=moderator,
|
|
||||||
invite_link=moderator, pin_messages=moderator,
|
|
||||||
add_admins=admin, manage_call=moderator)
|
|
||||||
await sender.client(
|
|
||||||
EditAdminRequest(channel=await self.get_input_entity(sender),
|
|
||||||
user_id=user_id, admin_rights=rights))
|
|
||||||
|
|
||||||
async def handle_matrix_about(self, sender, about):
|
async def handle_matrix_about(self, sender, about):
|
||||||
if self.peer_type not in {"channel"}:
|
if self.peer_type not in {"channel"}:
|
||||||
@@ -1036,6 +1039,25 @@ class Portal:
|
|||||||
else:
|
else:
|
||||||
await self.main_intent.set_pinned_messages(self.mxid, [])
|
await self.main_intent.set_pinned_messages(self.mxid, [])
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_level_from_participant(participant, _):
|
||||||
|
# TODO use the power level requirements to get better precision in channels
|
||||||
|
if isinstance(participant, (ChatParticipantAdmin, ChannelParticipantAdmin)):
|
||||||
|
return 50
|
||||||
|
elif isinstance(participant, (ChatParticipantCreator, ChannelParticipantCreator)):
|
||||||
|
return 95
|
||||||
|
return 0
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _participant_to_power_levels(levels, user, new_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:
|
||||||
|
levels["users"][user.mxid] = new_level
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def _participants_to_power_levels(self, participants, levels):
|
def _participants_to_power_levels(self, participants, levels):
|
||||||
changed = False
|
changed = False
|
||||||
admin_power_level = 75 if self.peer_type == "channel" else 50
|
admin_power_level = 75 if self.peer_type == "channel" else 50
|
||||||
@@ -1046,31 +1068,14 @@ class Portal:
|
|||||||
for participant in participants:
|
for participant in participants:
|
||||||
puppet = p.Puppet.get(participant.user_id)
|
puppet = p.Puppet.get(participant.user_id)
|
||||||
user = u.User.get_by_tgid(participant.user_id)
|
user = u.User.get_by_tgid(participant.user_id)
|
||||||
new_level = 0
|
new_level = self._get_level_from_participant(participant, levels)
|
||||||
if isinstance(participant, (ChatParticipantAdmin, ChannelParticipantAdmin)):
|
|
||||||
new_level = 50
|
|
||||||
elif isinstance(participant, (ChatParticipantCreator, ChannelParticipantCreator)):
|
|
||||||
new_level = 95
|
|
||||||
|
|
||||||
user_levels = levels["users"]
|
|
||||||
|
|
||||||
if user:
|
if user:
|
||||||
user.register_portal(self)
|
user.register_portal(self)
|
||||||
user_level_defined = user.mxid in user_levels
|
changed = self._participant_to_power_levels(levels, user, new_level) or changed
|
||||||
user_has_right_level = (user_levels[user.mxid] == new_level
|
|
||||||
if user_level_defined else new_level == 0)
|
|
||||||
if not user_has_right_level:
|
|
||||||
levels["users"][user.mxid] = new_level
|
|
||||||
changed = True
|
|
||||||
|
|
||||||
if puppet:
|
if puppet:
|
||||||
puppet_level_defined = puppet.mxid in user_levels
|
changed = self._participant_to_power_levels(levels, puppet, new_level) or changed
|
||||||
puppet_has_right_level = (user_levels[puppet.mxid] == new_level
|
|
||||||
if puppet_level_defined else new_level == 0)
|
|
||||||
|
|
||||||
if not puppet_has_right_level:
|
|
||||||
levels["users"][puppet.mxid] = new_level
|
|
||||||
changed = True
|
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
async def update_telegram_participants(self, participants, levels=None):
|
async def update_telegram_participants(self, participants, levels=None):
|
||||||
|
|||||||
Reference in New Issue
Block a user