diff --git a/telethon/client/chats.py b/telethon/client/chats.py index 71c6be91..a04370ce 100644 --- a/telethon/client/chats.py +++ b/telethon/client/chats.py @@ -1147,20 +1147,28 @@ class ChatMethods: async def get_permissions( self: 'TelegramClient', - channel: 'hints.EntityLike', + entity: 'hints.EntityLike', user: 'hints.EntityLike' ) -> 'custom.ParticipantPermissions': - channel = await self.get_input_entity(channel) + entity = await self.get_input_entity(entity) user = await self.get_input_entity(user) if helpers._entity_type(user) != helpers._EntityType.USER: raise ValueError('You must pass a user entity') - if helpers._entity_type(channel) != helpers._EntityType.CHANNEL: - raise ValueError('You must pass a channel entity') - participant = await self(functions.channels.GetParticipantRequest( - channel, - user - )) - return custom.ParticipantPermissions(participant.participant) + if helpers._entity_type(entity) == helpers._EntityType.CHANNEL: + participant = await self(functions.channels.GetParticipantRequest( + entity, + user + )) + return custom.ParticipantPermissions(participant.participant, False) + elif helpers._entity_type(entity) == helpers._EntityType.CHAT: + chat = await self(functions.messages.GetFullChatRequest( + entity + )) + for participant in chat.participants.participants: + if participant.user_id == user.id: + return custom.ParticipantPermissions(participant.participant, True) + + raise ValueError('You must pass either a channel or a chat') async def get_stats( self: 'TelegramClient', diff --git a/telethon/tl/custom/participantpermissions.py b/telethon/tl/custom/participantpermissions.py index 25641b30..654f32b6 100644 --- a/telethon/tl/custom/participantpermissions.py +++ b/telethon/tl/custom/participantpermissions.py @@ -5,25 +5,93 @@ class ParticipantPermissions: """ Participant permissions information """ - def __init__(self, participant): + def __init__(self, participant, chat): self.participant = participant + self.is_chat: bool = chat @property def is_admin(self): - return self.is_creator or isinstance(self.participant, types.ChannelParticipantAdmin) + return self.is_creator or isinstance(self.participant, ( + types.ChannelParticipantAdmin, + types.ChatParticipantAdmin + )) @property def is_creator(self): return isinstance(self.participant, types.ChannelParticipantCreator) @property - def is_default_permissions(self): - return isinstance(self.participant, types.ChannelParticipant) + def has_default_permissions(self): + return isinstance(self.participant, ( + types.ChannelParticipant, + types.ChatParticipant, + types.ChannelParticipantSelf + )) @property def is_banned(self): return isinstance(self.participant, types.ChannelParticipantBanned) @property - def is_self(self): - return isinstance(self.participant, types.ChannelParticipantSelf) + def ban_users(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.ban_users + + @property + def pin_messages(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.pin_messages + + @property + def add_admins(self): + if not self.is_admin: + return False + if self.is_chat and not self.is_creator: + return False + return self.participant.admin_rights.add_admins + + @property + def invite_users(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.invite_users + + @property + def delete_messages(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.delete_messages + + @property + def edit_messages(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.edit_messages + + @property + def post_messages(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.post_messages + + @property + def change_info(self): + if not self.is_admin: + return False + if self.is_chat: + return True + return self.participant.admin_rights.change_info