# Чеклист: сближение `handlers/x_ui.py` и `py3xui/x_ui.py`

## Текущее состояние

`handlers/x_ui.py` — **тонкий реэкспорт** `XUIManager` / `xui_manager` из `py3xui.x_ui` (дубликат класса удалён).

| Аспект | Примечание |
|--------|------------|
| Reality из inbound | **`py3xui/reality_from_inbound.py`** → `extract_reality_for_vless` |
| Константы проекта | **`py3xui/constants.py`** — VLESS, Flow X-UI, пути БД, порты, интервал refresh |
| Парсинг Reality | см. выше |

- Парсинг Reality из inbound: **`py3xui/reality_from_inbound.py`** (`extract_reality_for_vless`).

---

## Этап 1 — подготовка (без изменения поведения)

- [ ] Зафиксировать сценарии регрессии: триал, выдача vless с шаблоном и без, удаление пользователя, несколько серверов в БД.
- [ ] Привести **формат логов** в `handlers/x_ui.py` к стилю `py3xui/x_ui.py` (убрать шумные f-string логи в `get_client` / лишний debug inbound) **или** явно оставить «verbose» режим за флагом окружения.
- [ ] Унифицировать ветку **хоста** в fallback (один способ с `ctx` и `ip`, как в `py3xui/x_ui.py`).

## Этап 2 — один источник правды

- [x] Вынести **`extract_reality_for_vless`** в **`py3xui/reality_from_inbound.py`** (ранее дублировалось в `handlers/x_ui`, `py3xui/x_ui`, `xui_clients`).
- [ ] Вынести **сборку query-параметров Reality** (`type`, `encryption`, `security`, `pbk`, …) в одну функцию, принимающую `rb`, `flow_link`, чтобы не дублировать dict `params`.

## Этап 3 — слияние файлов

- [x] **`handlers/x_ui.py`** — реэкспорт из `py3xui.x_ui` (импорты `from handlers.x_ui` сохранены).

## Этап 4 — проверки

- [ ] `python -m compileall` по `handlers`, `py3xui`, `web_admin`.
- [ ] Ручной прогон: создание trial-клиента, проверка ссылки, удаление.
- [ ] Убедиться, что **сервис** (`service/bot.py`) и точки входа используют один и тот же `xui_manager`.

## Дополнительно (по желанию)

- [ ] Перенести дублирующиеся проверки шаблона (цикл по строкам `key_template`, `flow=`) в функцию рядом с `substitute_key_template`.
- [ ] Рассмотреть объединение с логикой `build_vless_link_for_single_server` в `xui_clients.py` (общий «генератор ссылки»).
