Files
new_lottery_bot/docs/ADMIN_MANAGEMENT_SYSTEM.md
Trevor1985 3c1a6a02a5
All checks were successful
continuous-integration/drone/push Build is passing
Separate staff roles and protect message delivery with operator guides
2026-09-13 21:00:53 +09:00

181 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Актуальная инструкция
Назначение администраторов и кассиров выполняется через `/staff` с подтверждением по точному Telegram ID.
См. [инструкцию системного администратора](SYSTEM_ADMIN_GUIDE.md). Описание старого меню ниже сохранено для истории.
---
# Система управления администраторами
## Описание
Реализована двухуровневая система управления правами администраторов:
1. **Главные администраторы (Super Admin)** - указаны в переменной `ADMIN_IDS` в `.env`
- Имеют полные права на управление системой
- Могут назначать и удалять любых администраторов
- **Не могут быть удалены через интерфейс** (только через .env)
2. **Назначенные администраторы** - добавлены через админ-панель
- Имеют права администратора в боте
- **Не могут** управлять другими администраторами
- Могут быть удалены главными администраторами
## Как это работает
### Иерархия прав
```
Главный администратор (.env)
├─ Может управлять админами (добавлять/удалять)
├─ Может управлять розыгрышами
├─ Может управлять пользователями
└─ Полный доступ ко всем функциям
Назначенный администратор
├─ НЕ может управлять администраторами
├─ Может управлять розыгрышами
├─ Может управлять пользователями
└─ Имеет стандартные права админа
```
### Проверочные механизмы
- **Функция `is_super_admin(user_id)`** - проверяет, является ли пользователь главным администратором
- **Функция `is_admin(user_id)`** - проверяет, является ли пользователь администратором (любого уровня)
- Все операции с администраторами доступны **ТОЛЬКО** главным администраторам
## Доступ в админ-панели
### Путь к управлению администраторами:
```
Админ-панель → ⚙️ Настройки → 👑 Управление админами (опция видна ТОЛЬКО для главных администраторов)
```
### Меню управления администраторами:
1. ** Назначить админа**
- Поиск пользователя по Telegram ID или имени
- Проверка, что пользователь
- Существует в системе
- Не является главным администратором (.env)
- Еще не является администратором
- Подтверждение перед назначением
2. ** Удалить админа**
- Показывает список только **назначенных** администраторов
- Главные администраторы (.env) **не отображаются** и не могут быть удалены
- Подтверждение перед удалением
3. **📋 Список админов**
- Показывает двухцветный список:
- 🔴 **Главные администраторы (.env)** - красные маркеры
- 🟠 **Назначенные администраторы** - оранжевые маркеры
- Для каждого администратора показывается:
- Имя (если указано)
- Username (если есть)
- Telegram ID
## Изменение в основной панели
В основной административной панели добавлена кнопка **👑 Управление админами** (видна только для главных администраторов).
## Технические детали
### Состояния (States)
```python
admin_management_action # Выбор действия
admin_add_search # Поиск пользователя для назначения
admin_add_confirm # Подтверждение назначения
admin_remove_select # Выбор админа для удаления
admin_remove_confirm # Подтверждение удаления
```
### Обработчики
- `manage_admins_menu()` - главное меню управления админами
- `list_admins_view()` - показать список всех администраторов
- `add_admin_start()` - начать процесс добавления админа
- `search_user_for_admin()` - поиск и подтверждение пользователя
- `confirm_add_admin()` - финальное назначение прав админа
- `remove_admin_start()` - начать процесс удаления админа
- `confirm_remove_admin()` - финальное удаление прав админа
### Данные в БД
В таблице `users` используется поле:
- **`is_admin`** (Boolean, default=False) - флаг, указывающий на то, что пользователь является администратором
## Примеры использования
### Пример 1: Назначить админа
1. Главный администратор открывает Админ-панель
2. Нажимает на ⚙️ Настройки
3. Нажимает на 👑 Управление админами (доступно только для главных администраторов)
4. Нажимает на Назначить админа
5. Вводит Telegram ID пользователя (например, `123456789`) или имя
6. Система показывает информацию о пользователе
7. Подтверждает назначение кнопкой ✅ Да, назначить
8. Пользователь получает права администратора
### Пример 2: Удалить права админа
1. Главный администратор открывает Админ-панель
2. Нажимает на ⚙️ Настройки
3. Нажимает на 👑 Управление админами
4. Нажимает на Удалить админа
5. Выбирает администратора из списка **назначенных** админов
6. Система запрашивает подтверждение
7. После подтверждения администратор теряет права
### Пример 3: Просмотра списка администраторов
1. Главный администратор открывает Админ-панель
2. Нажимает на ⚙️ Настройки
3. Нажимает на 👑 Управление админами
4. Нажимает на 📋 Список админов
5. Видит:
- Главные администраторы из .env (🔴 красные)
- Назначенные администраторы (🟠 оранжевые)
## Безопасность
1. **Защита главных администраторов**
- Главные администраторы из .env **не могут быть удалены** через интерфейс
- Для изменения главного администратора нужно отредактировать `.env`
2. **Ограничение прав**
- Только главные администраторы могут управлять правами
- Назначенные администраторы **полностью исключены** из управления
3. **Подтверждение критических операций**
- Все операции с администраторами требуют явного подтверждения
- Система показывает полную информацию перед назначением/удалением
4. **Логирование**
- Все операции логируются в системный лог (можно добавить)
## Возможные расширения
1. **Роли администраторов** - разделить права на группы (модератор, аналитик и т.д.)
2. **История действий** - отслеживать, кто и когда менял права
3. **Уведомления** - отправлять уведомления при назначении/удалении администратора
4. **Экспорт списка админов** - возможность скачать список всех администраторов
## Обновления код еще раз
В коде реализованы следующие проверки:
```python
# Проверка на главного администратора
def is_super_admin(user_id: int) -> bool:
return user_id in ADMIN_IDS
# Проверка на любого администратора (главного или назначенного)
def is_admin(user_id: int) -> bool:
return user_id in ADMIN_IDS
```
Обе функции используются для управления доступом к различным функциям админ-панели.