async def check(self, obj: Union[Message, CallbackQuery, InlineQuery]) -> bool: user_id = obj.from_user.id if self._check_current: if isinstance(obj, Message): message = obj elif isinstance(obj, CallbackQuery) and obj.message: message = obj.message else: return False if ChatType.is_private(message): # there is no admin in private chats return False chat_ids = [message.chat.id] else: chat_ids = self._chat_ids admins = [member.user.id for chat_id in chat_ids for member in await obj.bot.get_chat_administrators(chat_id)] return user_id in admins
async def check_access(message: types.Message, grant: Grant): chat_id = message.chat.id user_id = message.from_user.id chat_member: ChatMember = await message.chat.get_member(user_id=user_id) logging.info(f"Request from chat member:" f" chat_id=[{chat_id}]," f" chat_type=[{message.chat.type}]," f" user_id=[{message.from_user.id}]," f" chat_member_status=[{chat_member.status}]," f" grant=[{grant}]") is_private = ChatType.is_private(message) is_creator_or_admin = chat_member.is_chat_creator( ) or chat_member.is_chat_admin() if is_private: logging.info("No restrictions in private chat") elif is_creator_or_admin: logging.info("No restrictions for creator or admin") else: if grant == Grant.READ_ACCESS: logging.info("No restrictions for read access") elif grant == Grant.WRITE_ACCESS: with db.get_connection() as conn: chat = db.select_chat(conn, chat_id=chat_id) if not chat: raise AuthorizationError( "Chat not found => anarchy is disabled by default") elif not chat.is_anarchy_enabled: raise AuthorizationError("Chat found, anarchy is disabled") else: logging.info("Anarchy enabled for chat") elif grant == Grant.CHANGE_CHAT_SETTINGS: raise AuthorizationError( "Action allowed only for creator or admin") else: raise IllegalStateError(f"Unknown grant [{grant}]")
def IsGroup(m): if isinstance(m, Message): return ChatType.is_group_or_super_group(m) elif isinstance(m, CallbackQuery): return ChatType.is_group_or_super_group(m.message)
def IsChannel(m): if isinstance(m, Message): return ChatType.is_channel(m) elif isinstance(m, CallbackQuery): return ChatType.is_channel(m.message)
def IsPrivate(m): if isinstance(m, Message): return ChatType.is_private(m) elif isinstance(m, CallbackQuery): return ChatType.is_private(m.message)