Как получить 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)
```
- Этот подход позволяет управлять списками пользователей для каждого чата или группы отдельно и более гибко управлять мутом и анмутом пользователей.