Как удалить все сообщения от определенного пользователя с использованием vkbottle?

Как получить 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 в кастомном правиле?
  • 28 октября 2023 г. 9:30
Ответы на вопрос 2
В библиотеке 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)
    ```
- Этот подход позволяет управлять списками пользователей для каждого чата или группы отдельно и более гибко управлять мутом и анмутом пользователей.
Похожие вопросы