Zapret | Дорожная карта
2.37K subscribers
28 photos
24 files
3.58K links
Дорожная карта обновлений.

Узнайте что я буду редактировать в Запрет для обхода блокировок Дискорда и Ютуба в первую очередь

И ужаснуться моим техническим непонятным запискам без контекста.
Download Telegram
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 https://github.com/youtubediscord/zapret/issues/311

👤 Автор: loop-uh
🔗 SHA: 57c5944

📊 Статистика: 2 files changed, 124 insertions(+), 18 deletions(-)

📁 Изменённые файлы:
✏️ src/core/direct_flow.py
✏️ src/core/presets/direct_facade_backend.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 В проекте переведена подсистема runtime-статуса DPI на один источник истины, чтобы убрать класс багов вида «интерфейс показывает, что Zapret включён, хотя winws уже нет». Что сделано - Добавлен новый центральный сервис public_zapretgui/src/managers/dpi_runtime_service.py. Это теперь единая точка записи состояния DPI. Он хранит не только грубый флаг, а полноценный runtime-снимок: phase, expected_process, expected_preset_path, pid, last_error, last_exit_code. - Расширено состояние окна в public_zapretgui/src/ui/main_window_state.py. Теперь store умеет хранить фазы starting, running, stopping, failed, stopped, а не только dpi_running=True/False. - В public_zapretgui/src/main.py новый DpiRuntimeService создаётся вместе с общим store, то есть он живёт в той же центральной точке, где живёт остальное runtime-состояние окна. - Убран старый путь записи DPI-статуса из public_zapretgui/src/managers/app_runtime_state.py: AppRuntimeState теперь больше не пишет dpi_running, а только читает и обслуживает остальные runtime-поля вроде автозапуска. - Запуск и остановка переведены на новый сервис в public_zapretgui/src/dpi/dpi_controller.py. Теперь контроллер не пишет set_dpi_running(...) напрямую, а сообщает сервису: begin_start, mark_running, mark_start_failed, begin_stop, mark_stopped. - Монитор процессов в public_zapretgui/src/managers/process_monitor_manager.py больше не перетирает общий флаг сам. Он только отдаёт наблюдение о реальных PID в DpiRuntimeService, а уже сервис решает, что это значит для состояния. - Остановка через Win API тоже переведена на новый путь в public_zapretgui/src/dpi/stop.py. Там больше нет прямой записи через app_runtime_state.set_dpi_running(...). - Переключение режима в public_zapretgui/src/ui/main_window

👤 Автор: loop-uh
🔗 SHA: 482f662

📊 Статистика: 22 files changed, 850 insertions(+), 187 deletions(-)

📁 Изменённые файлы:
✏️ src/autostart/checker.py
✏️ src/autostart/registry_check.py
✏️ src/dpi/bat_start.py
✏️ src/dpi/dpi_controller.py
✏️ src/dpi/stop.py
✏️ src/main.py
✏️ src/managers/app_runtime_state.py
✏️ src/managers/dpi_manager.py
🆕 src/managers/dpi_runtime_service.py
✏️ src/managers/initialization_manager.py
✏️ src/managers/process_monitor_manager.py
🆕 src/preset_zapret2/builtin_presets/ALL TCP & UDP YTDisBystro_3_4_v1.txt
🆕 src/preset_zapret2/builtin_presets/ALL TCP & UDP multidisorder complex.txt
✏️ src/preset_zapret2/builtin_presets/ALL TCP & UDP v1.txt
✏️ src/tray.py
✏️ src/ui/main_window_display.py
✏️ src/ui/main_window_mode_switch.py
✏️ src/ui/main_window_state.py
✏️ src/ui/pages/control_page.py
✏️ src/ui/pages/home_page.py
✏️ src/ui/pages/zapret1/direct_control_page.py
✏️ src/ui/pages/zapret2/direct_control_page.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит

📝 vault backup: 2026-04-06 14:21:02

👤 Автор: fuckyou
📅 Дата: 06.04.2026 11:21:02
🔗 SHA: 79cef13

📊 Статистика:
➕ Добавлено: 40 строк
➖ Удалено: 13 строк
📝 Всего изменений: 53

📁 Изменено файлов: 1

✏️ amnezia-2-0/reference.md
+40 -13

Удалилось:
Клиент AmneziaVPN генерирует signature packets **иначе**, чем показано в статье на Хабре:

**Статья Хабр** (образовательный пример, составной):

I1 = <b 0xc7000000010><rc 8><t><r 100>

↑ QUIC header      ↑ random  ↑ random payload

(СЛОМАН: 11 hex-цифр = нечётное → ошибка парсера)

Идея: собрать пакет из нескольких тегов, каждый handshake будет уникальным.

**Реальный конфиг AmneziaVPN** (self-hosted, из рабочего подключения):

I1 = <b 0xc70000000108df2b1b...896>

↑ ОДИН тег <b>, 2500 hex-цифр = 1250 байт статических данных

Клиент генерирует **весь пакет целиком** как один `<b>` blob:

... и еще 3 строк

Добавилось:
### Дефолтное значение I1 в клиенте AmneziaVPN

Найдено в исходниках клиента — `client/protocols/protocols_defs.h`:

```cpp

constexpr char defaultSpecialJunk1[] =

"<r 2><b 0x858000010001000000000669636c6f7564036366726d0000010001c00c00010001000105a0004445837373>";

// I2-I5 по умолчанию пустые (отключены)

Это **составной формат**:

- `<r 2>` — 2 случайных байта (уникальность каждого handshake)

- `<b 0x...>` — 43 байта статического DNS-подобного пакета (домен "icloud.cfrm")

I1-I5 в серверном скрипте `configure_container.sh` **закомментированы** (отключены по умолчанию).

... и еще 23 строк

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 vault backup: 2026-04-06 14:21:02

👤 Автор: fuckyou
🔗 SHA: 79cef13

📊 Статистика: 1 file changed, 40 insertions(+), 13 deletions(-)

📁 Изменённые файлы:
✏️ amnezia-2-0/reference.md\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит

📝 vault backup: 2026-04-06 14:22:55

👤 Автор: fuckyou
📅 Дата: 06.04.2026 11:22:55
🔗 SHA: eb44348

📊 Статистика:
➕ Добавлено: 1 строк
➖ Удалено: 0 строк
📝 Всего изменений: 1

📁 Изменено файлов: 20

📝 Zapret2/Zapret2 - Roadmap обучения.md
+0 -0

📝 Zapret2/Zapret2 - blob.md
+0 -0

📝 Zapret2/Zapret2 - lua-desync.md
+0 -0

📝 Zapret2/Zapret2 - mtproto.md
+0 -0

📝 Zapret2/Zapret2 - out-range.md
+0 -0

📝 Zapret2/Zapret2 - payload.md
+0 -0

📝 Zapret2/Zapret2 - wf.md
+0 -0

📝 Zapret2/Zapret2 - оркестратор.md
+1 -0

Добавилось:
date:


📝 Zapret2/Zapret2 - основные флаги.md
+0 -0

📝 Zapret2/Zapret2 - последовательность аргументов.md
+0 -0

... и еще 10 файлов

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 vault backup: 2026-04-06 14:22:55

👤 Автор: fuckyou
🔗 SHA: eb44348

📊 Статистика: 20 files changed, 1 insertion(+)

📁 Изменённые файлы:
📝 "Zapret/Zapret2 - Roadmap \320\276\320\261\321\203\321\207\320\265\320\275\320\270\321\217.md" "Zapret2/Zapret2 - Roadmap \320\276\320\261\321\203\321\207\320\265\320\275\320\270\321\217.md"\n📝 Zapret/Zapret2 - blob.md Zapret2/Zapret2 - blob.md\n📝 Zapret/Zapret2 - lua-desync.md Zapret2/Zapret2 - lua-desync.md\n📝 Zapret/Zapret2 - mtproto.md Zapret2/Zapret2 - mtproto.md\n📝 Zapret/Zapret2 - out-range.md Zapret2/Zapret2 - out-range.md\n📝 Zapret/Zapret2 - payload.md Zapret2/Zapret2 - payload.md\n📝 Zapret/Zapret2 - wf.md Zapret2/Zapret2 - wf.md\n📝 "Zapret/Zapret2 - \320\276\321\200\320\272\320\265\321\201\321\202\321\200\320\260\321\202\320\276\321\200.md" "Zapret2/Zapret2 - \320\276\321\200\320\272\320\265\321\201\321\202\321\200\320\260\321\202\320\276\321\200.md"\n📝 "Zapret/Zapret2 - \320\276\321\201\320\275\320\276\320\262\320\275\321\213\320\265 \321\204\320\273\320\260\320\263\320\270.md" "Zapret2/Zapret2 - \320\276\321\201\320\275\320\276\320\262\320\275\321\213\320\265 \321\204\320\273\320\260\320\263\320\270.md"\n📝 "Zapret/Zapret2 - \320\277\320\276\321\201\320\273\320\265\320\264\320\276\320\262\320\260\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\321\214 \320\260\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md" "Zapret2/Zapret2 - \320\277\320\276\321\201\320\273\320\265\320\264\320\276\320\262\320\260\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\321\214 \320\260\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md"\n📝 Zapret/Zapret2.md Zapret2/Zapret2.md\n📝 Zapret/desync/fake.md Zapret2/desync/fake.md\n📝 Zapret/desync/fakeddisorder.md Zapret2/desync/fakeddisorder.md\n📝 Zapret/desync/fakedsplit.md Zapret2/desync/fakedsplit.md\n📝 Zapret/desync/multidisorder.md Zapret2/desync/multidisorder.md\n📝 Zapret/desync/multidisorder_legacy.md Zapret2/desync/multidisorder_legacy.md\n📝 Zapret/desync/multisplit.md Zapret2/desync/multisplit.md\n📝 Zapret/desync/oob.md Zapret2/desync/oob.md\n📝 Zapret/desync/syndata.md Zapret2/desync/syndata.md\n📝 Zapret/desync/tcpseg.md Zapret2/desync/tcpseg.md\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит

📝 vault backup: 2026-04-06 14:24:37

👤 Автор: fuckyou
📅 Дата: 06.04.2026 11:24:37
🔗 SHA: 457b8c9

📊 Статистика:
➕ Добавлено: 0 строк
➖ Удалено: 0 строк
📝 Всего изменений: 0

📁 Изменено файлов: 6

📝 Zapret2/circular.md
+0 -0

📝 Zapret2/desync/hostfakesplit.md
+0 -0

📝 Zapret2/filter.md
+0 -0

📝 Zapret2/guide.md
+0 -0

📝 Zapret2/preset.md
+0 -0

📝 Zapret2/windivert.md
+0 -0

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 vault backup: 2026-04-06 14:24:37

👤 Автор: fuckyou
🔗 SHA: 457b8c9

📊 Статистика: 6 files changed, 0 insertions(+), 0 deletions(-)

📁 Изменённые файлы:
📝 Zapret/circular.md Zapret2/circular.md\n📝 Zapret/hostfakesplit.md Zapret2/desync/hostfakesplit.md\n📝 Zapret/filter.md Zapret2/filter.md\n📝 Zapret/guide.md Zapret2/guide.md\n📝 Zapret/preset.md Zapret2/preset.md\n📝 Zapret/windivert.md Zapret2/windivert.md\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 для копия / импорт / список пресетов тоже нашёлся отдельный слой, который тормозил. Это уже была не проблема шаблонов, как у reset, а проблема индекса пресетов и повторных проходов по нему.

👤 Автор: loop-uh
🔗 SHA: 6364f6c

📊 Статистика: 8 files changed, 141 insertions(+), 197 deletions(-)

📁 Изменённые файлы:
✏️ src/core/presets/repository.py
✏️ src/core/presets/template_support.py
✏️ src/main.py
✏️ src/managers/initialization_manager.py
✏️ src/ui/pages/home_page.py
✏️ src/ui/pages/zapret1/user_presets_page.py
✏️ src/ui/pages/zapret2/direct_control_page.py
✏️ src/ui/pages/zapret2/user_presets_page.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит

📝 vault backup: 2026-04-06 14:29:15

👤 Автор: fuckyou
📅 Дата: 06.04.2026 11:29:15
🔗 SHA: 17cb2fe

📊 Статистика:
➕ Добавлено: 18 строк
➖ Удалено: 18 строк
📝 Всего изменений: 36

📁 Изменено файлов: 16

✏️ Zapret/manual.md
+1 -1

Удалилось:
[[Zapret2 - оркестратор]]


Добавилось:
[[оркестратор]]


✏️ Zapret/zapret_not_working.md
+1 -1

Удалилось:
Единственный надёжный способ найти рабочую стратегию — анализ нескольких типичных стратегий из го...


Добавилось:
Единственный надёжный способ найти рабочую стратегию — анализ нескольких типичных стратегий из го...


✏️ Zapret2/Zapret2.md
+9 -9

Удалилось:
[[Zapret2 - основные флаги]]

[[Zapret2 - wf]]

[[Zapret2 - out-range]]

[[Zapret2 - payload]]

[[Zapret2 - lua-desync]]

[[Zapret2 - blob]]

[[Zapret2 - последовательность аргументов]]

[[Zapret2 - mtproto]]

[[Zapret2 - Roadmap обучения]]


Добавилось:
[[основные флаги]]

[[wf]]

[[out-range]]

[[payload]]

[[desync]]

[[blob]]

[[последовательность аргументов]]

[[распознавание mtproto]]

[[roadmap обучения]]


📝 Zapret2/blob.md
+0 -0

📝 Zapret2/desync.md
+0 -0

✏️ Zapret2/filter.md
+1 -1

Удалилось:
Фильтры в nfqws2 определяют, какие пакеты/соединения будут обрабатываться профилем мультистратеги...


Добавилось:
Фильтры в nfqws2 определяют, какие пакеты/соединения будут обрабатываться профилем мультистратеги...


✏️ Zapret2/guide.md
+1 -1

Удалилось:
Данная статья описывается для программы с поддержкой интерфейса (GUI), но Вы можете настроить и о...


Добавилось:
Данная статья описывается для программы с поддержкой интерфейса (GUI), но Вы можете настроить и о...


📝 Zapret2/out-range.md
+0 -0

📝 Zapret2/payload.md
+0 -0

✏️ Zapret2/preset.md
+4 -4

Удалилось:
**Пресет** (*часто называемые конфигами*) — это `.txt` файл(ы) с перечислением всех [[Zapret2 - о...

Далее следуют [[Zapret2 - wf|глобальные фильтры WinDivert]], на языке [[Zapret2]] они имеют напра...

### 3. [[Zapret2 - blob|Блобы]] (заготовки данных)

[[Zapret2 - blob|Блоб]] — это заранее подготовленные данные (*для удобства в готовом пресете сраз...


Добавилось:
**Пресет** (*часто называемые конфигами*) — это `.txt` файл(ы) с перечислением всех [[основные фл...

Далее следуют [[wf|глобальные фильтры WinDivert]], на языке [[Zapret2]] они имеют направление (`-...

### 3. [[blob|Блобы]] (заготовки данных)

[[blob|Блоб]] — это заранее подготовленные данные (*для удобства в готовом пресете сразу перечисл...


... и еще 6 файлов

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 vault backup: 2026-04-06 14:29:15

👤 Автор: fuckyou
🔗 SHA: 17cb2fe

📊 Статистика: 16 files changed, 18 insertions(+), 18 deletions(-)

📁 Изменённые файлы:
✏️ Zapret/manual.md\n✏️ Zapret/zapret_not_working.md\n✏️ Zapret2/Zapret2.md\n📝 Zapret2/Zapret2 - blob.md Zapret2/blob.md\n📝 Zapret2/Zapret2 - lua-desync.md Zapret2/desync.md\n✏️ Zapret2/filter.md\n✏️ Zapret2/guide.md\n📝 Zapret2/Zapret2 - out-range.md Zapret2/out-range.md\n📝 Zapret2/Zapret2 - payload.md Zapret2/payload.md\n✏️ Zapret2/preset.md\n📝 "Zapret2/Zapret2 - Roadmap \320\276\320\261\321\203\321\207\320\265\320\275\320\270\321\217.md" "Zapret2/roadmap \320\276\320\261\321\203\321\207\320\265\320\275\320\270\321\217.md"\n📝 Zapret2/Zapret2 - wf.md Zapret2/wf.md\n📝 "Zapret2/Zapret2 - \320\276\321\200\320\272\320\265\321\201\321\202\321\200\320\260\321\202\320\276\321\200.md" "Zapret2/\320\276\321\200\320\272\320\265\321\201\321\202\321\200\320\260\321\202\320\276\321\200.md"\n📝 "Zapret2/Zapret2 - \320\276\321\201\320\275\320\276\320\262\320\275\321\213\320\265 \321\204\320\273\320\260\320\263\320\270.md" "Zapret2/\320\276\321\201\320\275\320\276\320\262\320\275\321\213\320\265 \321\204\320\273\320\260\320\263\320\270.md"\n📝 "Zapret2/Zapret2 - \320\277\320\276\321\201\320\273\320\265\320\264\320\276\320\262\320\260\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\321\214 \320\260\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md" "Zapret2/\320\277\320\276\321\201\320\273\320\265\320\264\320\276\320\262\320\260\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\321\214 \320\260\321\200\320\263\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md"\n📝 Zapret2/Zapret2 - mtproto.md "Zapret2/\321\200\320\260\321\201\320\277\320\276\320\267\320\275\320\260\320\262\320\260\320\275\320\270\320\265 mtproto.md"\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 фикс багов

👤 Автор: loop-uh
🔗 SHA: d32041f

📊 Статистика: 41 files changed, 2368 insertions(+), 915 deletions(-)

📁 Изменённые файлы:
✏️ src/core/direct_preset_core/common/strategy_catalogs.py
✏️ src/core/direct_preset_core/service.py
✏️ src/core/presets/runtime_store.py
✏️ src/core/runtime/preset_runtime_coordinator.py
✏️ src/main.py
✏️ src/managers/initialization_manager.py
✏️ src/orchestra/blocked_strategies_manager.py
🆕 src/orchestra/ignored_targets.py
✏️ src/orchestra/locked_strategies_manager.py
✏️ src/orchestra/orchestra_runner.py
✏️ src/preset_orchestra_zapret2/preset_manager.py
✏️ src/telegram_proxy/manager.py
✏️ src/tray.py
✏️ src/ui/main_window.py
✏️ src/ui/main_window_navigation.py
✏️ src/ui/main_window_navigation_build.py
✏️ src/ui/main_window_pages.py
✏️ src/ui/main_window_state.py
✏️ src/ui/mode_page_scope.py
✏️ src/ui/page_names.py
✏️ src/ui/page_registry.py
✏️ src/ui/pages/orchestra/blocked_page.py
✏️ src/ui/pages/orchestra/locked_page.py
✏️ src/ui/pages/orchestra_page.py
✏️ src/ui/pages/orchestra_zapret2/__init__.py
🆕 src/ui/pages/orchestra_zapret2/preset_detail_page.py
🆕 src/ui/pages/orchestra_zapret2/preset_subpage_base.py
✏️ src/ui/pages/orchestra_zapret2/user_presets_page.py
✏️ src/ui/pages/preset_subpage_base.py
✏️ src/ui/pages/telegram_proxy_page.py
🆕 src/ui/pages/user_presets_runtime.py
✏️ src/ui/pages/zapret1/direct_control_page.py
✏️ src/ui/pages/zapret1/direct_zapret1_page.py
✏️ src/ui/pages/zapret1/user_presets_page.py
✏️ src/ui/pages/zapret2/direct_control_page.py
✏️ src/ui/pages/zapret2/direct_zapret2_page.py
✏️ src/ui/pages/zapret2/preset_detail_page.py
✏️ src/ui/pages/zapret2/strategy_detail_page.py
✏️ src/ui/pages/zapret2/user_presets_page.py
✏️ src/ui/pages/zapret2_orchestra_strategies_page.py
✏️ src/ui/widgets/direct_zapret2_strategies_tree.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 21.0.0.6

👤 Автор: loop-uh
🔗 SHA: 8742917

📊 Статистика: 17 files changed, 388 insertions(+), 234 deletions(-)

📁 Изменённые файлы:
✏️ src/core/direct_flow.py
✏️ src/core/direct_preset_core/common/target_metadata_loader.py
✏️ src/core/direct_preset_core/common/target_metadata_service.py
✏️ src/core/direct_preset_core/engines/_shared.py
🆕 src/core/presets/cache_signatures.py
✏️ src/core/presets/direct_facade_backend.py
✏️ src/core/presets/runtime_store.py
✏️ src/preset_orchestra_zapret2/preset_manager.py
✏️ src/preset_orchestra_zapret2/preset_store.py
✏️ src/ui/main_window.py
✏️ src/ui/main_window_navigation_build.py
✏️ src/ui/pages/orchestra_zapret2/user_presets_page.py
✏️ src/ui/pages/zapret1/direct_zapret1_page.py
✏️ src/ui/pages/zapret1/user_presets_page.py
✏️ src/ui/pages/zapret2/direct_zapret2_page.py
🆕 src/ui/pages/zapret2/strategy_detail_mode_policy.py
✏️ src/ui/pages/zapret2/strategy_detail_page.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Update dpi_controller.py

👤 Автор: loop-uh
🔗 SHA: c3ca689

📊 Статистика: 1 file changed, 28 insertions(+), 11 deletions(-)

📁 Изменённые файлы:
✏️ src/dpi/dpi_controller.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Теперь в public_zapretgui/src/managers/initialization_manager.py поздний post-init запускается не через QTimer.singleShot(...), а через обычный queued-сигнал _PostInitLaunchBridge. Это значит следующее: - тяжёлая часть всё ещё не выполняется прямо внутри быстрого стартового участка; - но больше нет искусственной задержки вроде 180ms; - запуск переносится просто на следующий проход цикла интерфейса, то есть без «магического ожидания» и без таймерной эвристики. Проще говоря: мы сохранили главную пользу отложенного запуска, но убрали именно тот механизм, который уже раньше показал себя плохим, когда поведение начинает зависеть от случайной задержки, а не от реального жизненного цикла окна. Что изменилось по сути:

👤 Автор: loop-uh
🔗 SHA: d17f746

📊 Статистика: 3 files changed, 266 insertions(+), 65 deletions(-)

📁 Изменённые файлы:
✏️ src/core/direct_flow.py
✏️ src/managers/initialization_manager.py
✏️ src/ui/pages/appearance_page.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 первый запуск теперь отполирован

👤 Автор: loop-uh
🔗 SHA: b06dbf7

📊 Статистика: 14 files changed, 369 insertions(+), 484 deletions(-)

📁 Изменённые файлы:
✏️ src/core/direct_flow.py
✏️ src/dpi/dpi_controller.py
✏️ src/main.py
✏️ src/managers/dpi_manager.py
✏️ src/managers/dpi_runtime_service.py
✏️ src/managers/initialization_manager.py
✏️ src/startup/kaspersky.py
✏️ src/startup/telega_check.py
✏️ src/tray.py
✏️ src/ui/pages/control_page.py
✏️ src/ui/pages/home_page.py
✏️ src/ui/pages/zapret1/direct_control_page.py
✏️ src/ui/pages/zapret2/direct_control_page.py
✏️ src/ui/window_notification_controller.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 - закрытие при WindowDeactivate, то есть когда окно перестаёт быть активным; - закрытие при FocusOut, то есть когда popup теряет фокус; - закрытие при смене состояния приложения через applicationStateChanged, то есть как раз при уходе из активного окна, например через Alt+Tab; - для трея сохранена отдельная Windows-специфика: закрытие по клику вне меню через глобальную проверку мыши. На этот общий helper я перевёл все живые popup-меню, которые у вас открывались через menu.exec(...) в пользовательских сценариях: - public_zapretgui/src/ui/pages/preset_actions_menu.py - public_zapretgui/src/ui/pages/preset_rating_menu.py - public_zapretgui/src/ui/pages/preset_subpage_base.py - public_zapretgui/src/ui/pages/zapret2/strategy_detail_page.py - public_zapretgui/src/ui/pages/orchestra_page.py - public_zapretgui/src/ui/pages/strategy_scan_page.py - public_zapretgui/src/tray.py То есть смысл правки такой: раньше у трея была одна отдельно починенная логика, а у остальных меню была своя, местами слабая или вообще отсутствующая. Теперь у программы есть один общий механизм popup-lifecycle, а tray просто использует его через свою обёртку с дополнительным поведением для клика мимо.

👤 Автор: loop-uh
🔗 SHA: 51466d4

📊 Статистика: 15 files changed, 609 insertions(+), 585 deletions(-)

📁 Изменённые файлы:
✏️ src/autostart/autostart_direct.py
✏️ src/core/direct_flow.py
✏️ src/dpi/dpi_controller.py
✏️ src/launcher_common/builder_factory.py
✏️ src/managers/dpi_manager.py
✏️ src/managers/initialization_manager.py
✏️ src/tray.py
✏️ src/ui/main_window_mode_switch.py
✏️ src/ui/pages/orchestra_page.py
✏️ src/ui/pages/preset_actions_menu.py
✏️ src/ui/pages/preset_rating_menu.py
✏️ src/ui/pages/preset_subpage_base.py
✏️ src/ui/pages/strategy_scan_page.py
✏️ src/ui/pages/zapret2/strategy_detail_page.py
🆕 src/ui/popup_menu.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 ввёл единый лёгкий cleanup helper для обычного старта: _unload_known_windivert_drivers() и _perform_standard_windivert_cleanup(). Это важно, потому что раньше zapret1 и zapret2 делали почти одинаковую стандартную очистку разными кусками кода, и эти куски уже начали жить как два отдельных владельца одной и той же policy. Теперь обычная очистка перед стартом у них канонически одна. В public_zapretgui/src/zapret1_launcher/strategy_runner.py:410 я разложил ordinary launch path на отдельные этапы: подготовка cleanup через _prepare_cleanup_before_spawn_locked(...), потом отдельное решение о retry через _maybe_retry_after_failed_spawn_locked(...). Самое важное здесь то, что ранее убранный fallback с “selected-source refresh” больше не вернулся: runner не пытается тихо восстанавливать отсутствующий preset через другой путь, а честно падает с ошибкой, если входной preset не существует. В public_zapretgui/src/zapret2_launcher/strategy_runner.py:857 сделал аналогичное разделение, но без насильственного выравнивания поведения под zapret1, потому что у них реально разная retry-модель. Для zapret2 теперь отдельно видны:

👤 Автор: loop-uh
🔗 SHA: f258b2e

📊 Статистика: 7 files changed, 347 insertions(+), 283 deletions(-)

📁 Изменённые файлы:
✏️ src/core/direct_flow.py
✏️ src/core/presets/direct_facade_backend.py
✏️ src/core/presets/repository.py
✏️ src/dpi/dpi_controller.py
✏️ src/launcher_common/runner_base.py
✏️ src/zapret1_launcher/strategy_runner.py
✏️ src/zapret2_launcher/strategy_runner.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 direct-модуль ZapretGUI и много ходов подряд последовательно его приводили к одной модели: - один source preset как источник истины, - одна startup/runtime orchestration модель, - отдельные policy entrypoint’ы для content change и preset switch, - bridge’и между runner/controller/store/watchers, - и меньше локальной логики в UI.

👤 Автор: loop-uh
🔗 SHA: 4600eea

📊 Статистика: 22 files changed, 643 insertions(+), 147 deletions(-)

📁 Изменённые файлы:
🆕 src/core/presets/direct_runtime_events.py
✏️ src/core/presets/support_files.py
✏️ src/core/presets/v1_builtin_templates.py
✏️ src/core/runtime/preset_runtime_coordinator.py
🆕 src/dpi/direct_runtime_apply_policy.py
✏️ src/dpi/dpi_controller.py
🆕 src/dpi/runtime_preset_switch_policy.py
✏️ src/dpi/zapret2_core_restart.py
✏️ src/launcher_common/preset_runner_support.py
✏️ src/main.py
✏️ src/managers/initialization_manager.py
✏️ src/ui/main_window.py
✏️ src/ui/pages/dpi_settings_page.py
✏️ src/ui/pages/preset_subpage_base.py
✏️ src/ui/pages/strategy_scan_page.py
✏️ src/ui/pages/zapret1/user_presets_page.py
✏️ src/ui/pages/zapret2/direct_control_page.py
✏️ src/ui/pages/zapret2/direct_zapret2_page.py
✏️ src/ui/pages/zapret2/strategy_detail_page.py
✏️ src/ui/pages/zapret2/user_presets_page.py
✏️ src/zapret1_launcher/strategy_runner.py
✏️ src/zapret2_launcher/strategy_runner.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 при первом клике боковое меню вызывает show_page(), дальше идёт ensure_page(), и уже там в главном потоке сразу выполняются две дорогие вещи подряд: импорт Python- модуля страницы и создание всего дерева виджетов этой страницы. Это видно в связке public_zapretgui/src/ui/main_window.py:326 -> public_zapretgui/src/ui/main_window_pages.py:82 -> public_zapretgui/src/ui/main_window_pages.py:138. Для DPI Settings я отдельно промерил сам импорт модуля, и только он занял примерно 913 мс, ещё до полноценного показа страницы. То есть пользователь нажимает пункт меню, а приложение в этот же момент начинает “разворачивать” тяжёлый модуль страницы прямо в интерфейсном потоке. Что я поменял. После первого показа окна и завершения базовой сборки интерфейса я добавил отложенный прогрев страниц: приложение теперь не ждёт первого клика пользователя, а по очереди, в спокойном режиме, заранее импортирует тяжёлые модули страниц и прогревает самые неприятные экраны. Это сделано в public_zapretgui/src/ui/main_window.py:340 и public_zapretgui/src/ui/main_window_pages.py:18, public_zapretgui/src/ui/main_window_pages.py:119. Приоритет я дал тем страницам, на которых вы как раз замечаете лаги: DPI Settings, BlockCheck, Logs, Appearance, Servers, а затем уже остальным. Важно, что я не добавлял кривой обход вида “если долго, то открой старую ветку” и не возвращал legacy- путь. Логика открытия страниц осталась одной и той же, просто тяжёлая подготовка теперь выносится из момента клика пользователя в отложенный этап после старта окна. Проверка прошла нормально. Точечный тест на lazy-архитектуру страниц зелёный: python -m pytest private_zapretgui/tests/test_main_window_lazy_wiring.py -q, результат 18 passed. Ещё отдельно прогнал compileall по изменённым файлам, синтаксических ошибок нет. Для этого я добавил и новые тесты в private_zapretgui/tests/test_main_window_lazy_wiring.py:399, чтобы закрепить порядок прогрева тяжёлых страниц и убедиться, что импорт модулей не дублируется. Что было моей задачей и что сейчас происходит в проекте. Задача была понять, почему визуально “почти пустые” страницы открываются медленно, хотя интерфейс вроде бы не должен делать тяжёлую работу прямо на нажатии. По итогам разбора выяснилось, что реальный тормоз сидел в архитектуре lazy-страниц: ленивость была полезна для старта приложения, но плата за это переносилась на первый клик по странице. Сейчас проект устроен так: главное окно по-прежнему использует ленивый реестр страниц, но после старта оно дополнительно делает мягкий прогрев тяжёлых экранов, чтобы пользователь не ловил подвисание в момент навигации. Проще говоря, раньше тяжёлая подготовка происходила “когда вы уже нажали”, а теперь она уходит в отложенную фазу после показа основного окна. Если захотите, следующим шагом я могу по

👤 Автор: loop-uh
🔗 SHA: bc1785f

📊 Статистика: 2 files changed, 137 insertions(+)

📁 Изменённые файлы:
✏️ src/ui/main_window.py
✏️ src/ui/main_window_pages.py

🔗 Открыть на GitHub