Функция `is_admin(event, user_id)` служит для проверки, является ли указанный пользователь администратором или создателем в чате, откуда был вызван обработчик команды. Давайте разберем логику работы этой функции и как она интегрирована в обработчик команды `/demote`.
### Логика функции `is_admin`
1. **Логирование**: Сначала функция логирует вызов с идентификатором пользователя, который проверяется.
2. **Получение чата**: `chat = await event.get_chat()` получает объект чата (группы или канала), в котором было отправлено событие.
3. **Получение участников**: `participants = await event.client.get_participants(chat, aggressive=True)` извлекает список участников чата. Параметр `aggressive=True` может использоваться для получения более полной информации об участниках, включая их роли.
4. **Проверка ролей**:
- Цикл `for user in participants` проходит по всем участникам чата.
- Внутри цикла, для каждого пользователя проверяется, является ли он администратором или создателем (`isinstance(user.participant, (ChatParticipantAdmin, ChatParticipantCreator))`).
- Если пользователь является администратором или создателем, то происходит дальнейшая проверка: если его идентификатор совпадает с `user_id`, то функция возвращает `True`, что подтверждает, что пользователь с таким идентификатором является администратором.
5. **Возврат значения**: Если проход по всем участникам завершился и администратора не было найдено, функция вернет `False`.
### Обработчик команды `/demote`
Теперь давайте разберем, как используется эта функция в обработчике команды `/demote`:
1. **Проверка типа чата**: Первой проверкой в обработчике является проверка, находится ли команда в группе (`PeerChannel` или `PeerChat`). Если нет, пользователю отправляется сообщение о том, что команда недоступна.
2. **Получение идентификатора пользователя**: Функция `get_id(event)` (которая не показана, но предполагается, что она извлекает ID пользователя из ответа на сообщение) используется для определения, кого именно мы хотим понизить.
3. **Проверка ролей**:
- `sender_role = await get_user_role(chat_id, event.sender_id)` получает роль отправителя команды.
- Проводится проверка: если `sender_role` меньше 1 (что может означать отсутствие прав) или если `is_admin(event, event.sender_id)` возвращает `False`, отправляется ответ, что у пользователя нет прав для выполнения команды.
4. **Понижение роли**:
- После успешной проверки прав, текущая роль пользователя, который должен быть понижен, извлекается через `current_role = await get_user_role(chat_id, user_id)`.
- Если текущая роль меньше или равна нулю, отправляется ответ, что пользователь уже на минимальной роли.
- Если роль возможна для понижения, вычисляется новая роль и применяется через `set_user_role(chat_id, user_id, new_role)`.
### Заключение
Функция `is_admin` и обработчик команды `/demote` в связке позволяют управлять ролями участников чата, обеспечивая предварительную проверку прав администратора перед попыткой понижения роли другого пользователя. Это предотвращает возможность злоупотребления командой пользователями с недостаточными правами.