Как получить user_id в кастомном правиле, используя библиотеку vkbottle? Я пытаюсь реализовать кастомное правило с использованием библиотеки vkbottle, но столкнулся с проблемой получения user_id в этом правиле. Вот мой код для кастомного правила: ```python class FromSpecificUser(ABCRule[BaseMessageMin]): def __init__(self, userIds: list[int], fr_id: BaseMessageMin.from_id) -> bool: return userIds.__contains__(fr_id) ``` И вот мой код для хендлера: ```python @bot.on.message(FromSpecificUser([284629059])) async def delete_eblan(mes:Message): await bot.api.messages.delete(peer_id=mes.peer_id, message_ids=mes.message_id, delete_for_all=True) ``` Я бы хотел создать переключатель для каждого отдельного пользователя, чтобы добавлять user_id этого пользователя в список. Мой код выглядит примерно так: ```python usersId_to_delete = [] @bot.on.message(command="мут") async def nopasha_handler(message: Message): userId_toDelete = message.reply_message.from_id usersId_to_delete.append(userId_toDelete) return "Удаление сообщений от пользователя начнется после их отправки. Введите /cancel, чтобы отменить." @bot.on.message(command="анмут") async def cancel_handler(message: Message): userId_toDelete = message.reply_message.from_id usersId_to_delete.remove(userId_toDelete) return "Удаление сообщений отменено." ``` Однако это только заготовка и не будет работать. Как я могу получить user_id в кастомном правиле?
В библиотеке vkbottle у кастомных правил нет возможности получать параметры, передаваемые в хэндлер. Однако вы можете использовать глобальные переменные для передачи информации между хэндлерами и кастомными правилами. В вашем случае, вы можете создать глобальную переменную `usersId_to_delete`, которую можно будет использовать и в хэндлерах, и в кастомных правилах. В кастомном правиле вы можете проверить, содержится ли `fr_id` (полученный из сообщения) в списке `usersId_to_delete`. Вот пример кода для вашего случая: ```python usersId_to_delete = [] class FromSpecificUser(ABCRule[BaseMessageMin]): def __init__(self): pass async def check(self, message: BaseMessageMin) -> bool: return message.from_id in usersId_to_delete ... @bot.on.message(FromSpecificUser()) async def delete_eblan(mes: Message): await bot.api.messages.delete(peer_id=mes.peer_id, message_ids=mes.message_id, delete_for_all=True) ``` После этого вы можете добавлять и удалять `user_id` в списке `usersId_to_delete` в хэндлерах `nopasha_handler` и `cancel_handler`, а затем использовать этот список для проверки в кастомном правиле `FromSpecificUser`.
- Для более красивого решения проблемы, можно использовать следующий подход: вместо добавления всех пользователей, чьи сообщения нужно удалить, в один список `usersId_to_delete`, можно создать отдельный список для каждого чата или группы. - Вот пример кода, который задумку реализует: - Обработчик команды `мут`: ```python @bot.on.message(command="мут") async def mute_handler(message: Message): chat_id = message.peer_id # ID чата или группы user_id_to_delete = message.reply_message.from_id # ID пользователя, чьи сообщения нужно удалить if chat_id not in muted_users: muted_users[chat_id] = [] # Создаем список пользователей для данного чата, если его еще нет muted_users[chat_id].append(user_id_to_delete) # Добавляем ID пользователя в список return "Удаление сообщений от пользователя начнется после их отправки. Введите /cancel, чтобы отменить." ``` - Обработчик команды `анмут`: ```python @bot.on.message(command="анмут") async def unmute_handler(message: Message): chat_id = message.peer_id # ID чата или группы user_id_to_delete = message.reply_message.from_id # ID пользователя, чьи сообщения нужно удалить if chat_id in muted_users: muted_users[chat_id].remove(user_id_to_delete) # Удаляем ID пользователя из списка return "Удаление сообщений отменено." ``` - Обработчик удаления сообщений: ```python @bot.on.message(from_user=True) async def delete_messages(mes: Message): chat_id = mes.peer_id # ID чата или группы if chat_id in muted_users: user_id = mes.from_id # ID пользователя отправившего сообщение if user_id in muted_users[chat_id]: await bot.api.messages.delete(group_id=mes.group_id, peer_id=chat_id, cmids=mes.conversation_message_id, delete_for_all=True) ``` - Этот подход позволяет управлять списками пользователей для каждого чата или группы отдельно и более гибко управлять мутом и анмутом пользователей.