С чего всё началось

Когда Telegram начал серьёзно деградировать по скорости, а Discord стабильно висеть на «Подключение…“ — сообщество нашло рабочие решения: Zapret от bol‑van и TgWsProxy от Flowseal. Оба инструмента реально работают. Проблема одна — запустить их не так тривиально: батники, конфиги, права администратора, мониторинг процессов вручную.

Я захотел сделать что‑то, чем мог бы пользоваться любой человек — без консоли, без гугления, без «а он вообще запустился?». Так появился NetFix.

Важный момент сразу: NetFix не реализует никаких методов обхода сам. Это GUI‑оболочка, которая управляет запуском Zapret и TgWsProxy — готовых open‑source инструментов. Весь код NetFix открыт, никаких VPN‑соединений не создаётся.

Стек и архитектура

  • C# /.NET 8.0 / WPF — основной стек

  • XAML — весь UI

  • WinForms — только для трей‑иконки (NotifyIcon)

  • DiscordRichPresence 1.6.1.70 — единственная сторонняя NuGet‑зависимость

Намеренно минимальный набор зависимостей: встроенный HttpClient вместо RestSharp, System.Text.Json вместо Newtonsoft, MediaPlayer вместо NAudio. Меньше зависимостей — меньше поверхности для проблем.

Структура проекта:

NetFix/
├── Models/
│   ├── DiagModels.cs          # DcResult, PingResult, DiagReport, AppSettings
│   ├── NoteMap.cs             # модели ритм-игры
│   └── ZapretConfig.cs        # конфиги Zapret
├── Services/
│   ├── AutoDownloadService.cs     # скачивание компонентов с GitHub Releases
│   ├── DiagnosticsEngine.cs       # сетевая диагностика
│   ├── DiscordRpcService.cs       # Discord Rich Presence
│   ├── SettingsService.cs         # сохранение настроек (JSON)
│   ├── UpdateService.cs           # автообновления
│   ├── ZapretConfigService.cs     # тест и применение конфигов
│   └── ComponentVersionService.cs # версии установленных компонентов
├── Views/
│   ├── UpdateWindow.xaml/.cs
│   └── ZapretConfigWindow.xaml/.cs
└── MainWindow.xaml/.cs            # основной экран + ритм-игра

Как работает главный экран

Весь пользовательский сценарий умещается в одно действие: нажать кнопку. Поэтому главный экран максимально минималистичен.

Главная кнопка — анимированная, с aurora‑эффектом (радиальный градиент, который плавно меняет цвет через DispatcherTimer + WPF Storyboard). У кнопки четыре состояния:

  • Idle — приложение готово к запуску

  • Loading — идёт запуск компонентов / диагностика

  • Active — всё работает (подтверждено сетевой проверкой)

  • Error — что‑то пошло не так

Рядом — два статусных индикатора (эллипсы): один для Zapret, другой для TgWsProxy. Меняют цвет в зависимости от состояния процесса.

По нажатии кнопки происходит следующее:

  1. Проверяется наличие бинарей в папке приложения

  2. Если компонентов нет — AutoDownloadService скачивает их с официальных GitHub Releases

  3. Запускаются процессы через ProcessStartInfo с UseShellExecute = false, CreateNoWindow = true

  4. DiagnosticsEngine делает TCP‑проверки к целевым сервисам и подтверждает что соединение работает

  5. Индикаторы и состояние кнопки обновляются

При закрытии приложения все запущенные процессы корректно завершаются.

Сетевая диагностика

DiagnosticsEngine — отдельный сервис, который делает несколько типов проверок:

  • DC check — прямое TCP‑соединение к датацентрам Telegram

  • Ping — базовая проверка связи

  • DNS — резолвится ли домен

  • DPI check — проверка что Zapret реально помогает

  • UDP / throttle — дополнительные проверки для диагностики

Результаты собираются в DiagReport, на основе которого строится UI‑состояние. Это нужно чтобы «процесс запущен» и «всё работает» не были одним и тем же — Zapret может стартовать успешно, но нужный конфиг может не подойти для конкретного провайдера.

Конфиги Zapret

Zapret поддерживает разные стратегии обхода DPI, и универсального решения нет — что работает у одного провайдера, может не работать у другого. Поэтому в NetFix есть отдельное окно выбора конфига.

ZapretConfigService прогоняет каждый .bat‑конфиг через реальную сетевую проверку и показывает результаты. Пользователь видит что сработало, что нет — и выбирает рабочий вариант. Результаты кэшируются в ZapretConfigCache чтобы не гонять проверки каждый раз.

Автозагрузка компонентов и обновления

AutoDownloadService при первом запуске (или когда компоненты устарели) скачивает бинари Zapret и TgWsProxy с их официальных GitHub Releases. Проверка идёт через GitHub API, скачивается нужная версия под архитектуру системы.

ComponentVersionService хранит версии установленных компонентов и сравнивает с актуальными. Если вышло обновление TgWsProxy — пользователь получит предложение обновить компонент, независимо от версии самого NetFix.

Обновления самого приложения обрабатываются через UpdateService — тоже GitHub Releases, с диалогом UpdateWindow где показывается changelog.

Настройки

Все настройки хранятся в settings.json рядом с exe-шником. Модель данных:

public class AppSettings
{
    public string ZapretPath { get; set; } = "";
    public string TgWsProxyPath { get; set; } = "";
    public bool AutostartZapret { get; set; } = false;
    public bool AutostartTgWsProxy { get; set; } = false;
    public bool AutostartApp { get; set; } = false;
    public bool AutoUpdates { get; set; } = true;
    public bool ShowLongCheckDialog { get; set; } = true;
}

Сериализация через System.Text.Json с JsonNamingPolicy.CamelCase. SettingsService умеет в экспорт/импорт — можно бэкапить конфигурацию или переносить между машинами.

Трей‑иконка (NotifyIcon через WinForms interop) даёт быстрый доступ к основным действиям без открытия главного окна.

Ритм‑игра внутри приложения

Это, наверное, самая неожиданная часть. Диагностика или первичная загрузка компонентов может занимать 10–30 секунд. Вместо спиннера я сделал мини‑игру в стиле osu!mania — вертикальные дорожки, падающие ноты.

Что реализовано:

  • 4 дорожки, конфигурируемые keybindings (словарь lane → Key в настройках)

  • Hold notes — ноты с удержанием, отдельная логика score и визуал

  • Импорт.osz — стандартный формат карт osu!. Файл .osz это обычный ZIP, внутри .osu (текстовый формат описания карты) и аудио. NetFix парсит .osu, конвертирует в внутренний формат NoteMap/NoteEntry, аудио воспроизводится через ffmpeg

  • Встроенные треки — упакованы в ZIP рядом с приложением (MP3 + notes.json)

  • Discord RPC — когда открыта игра, в статусе Discord показывается название карты

Игровой цикл построен на DispatcherTimer (30fps+). Нотные спрайты — Border элементы на Canvas, без пересоздания: используется пул объектов. Кисти заморожены (brush.Freeze()) и кэшированы вне цикла рендера.

Модель ноты:

public class NoteEntry
{
    public double Time { get; set; }   // секунды от начала трека
    public int Lane { get; set; }      // 0–3
    [JsonIgnore] public bool Hit { get; set; }
    [JsonIgnore] public Border? Visual { get; set; }
    [JsonIgnore] public DropShadowEffect? Effect { get; set; }
}

Discord Rich Presence

DiscordRpcService показывает текущее состояние приложения в Discord‑статусе. Четыре состояния: главное меню, диагностика, игра (с названием карты и счётом), редактор карт.

Дизайн и визуальный стиль

Тёмная тема: фон #161616, акцентный цвет #3b82f6 (синий). Glassmorphism‑элементы, aurora‑анимация на главной кнопке. Весь UI — нативный WPF XAML, никаких сторонних UI‑фреймворков (MahApps, MaterialDesign и так далее — намеренно не использовались, чтобы не ломать стиль).

Итог

NetFix — это не очередной впн, не обфусцированный батник и не «доверься нам». Это прозрачная open‑source утилита, которая берёт два проверенных community‑инструмента (Zapret и TgWsProxy) и делает их запуск удобным для обычного пользователя.

Исходный код: github.com/rupleide/NetFix

Обновления и обсуждение: t.me/NetFixRuBi

Комментарии (99)


  1. kexibq_cbo
    06.06.2026 05:13

    Интересная штучка, надо будет попробовать


    1. rupleide Автор
      06.06.2026 05:13

      Буду ждать ваш отзыв!


  1. KOT2K
    06.06.2026 05:13

    Спасибо!


    1. rupleide Автор
      06.06.2026 05:13

      Всегда пожалуйста!


  1. igor0208
    06.06.2026 05:13

    Благодарю!


    1. rupleide Автор
      06.06.2026 05:13

      Всегда пожалуйста!


  1. Feemor
    06.06.2026 05:13

    А будет ли графический интерфейс так же обновляться на новые версии? Проблема всех графических обвязок что они не успевают за оригинальным автором, а потом о них забывают


    1. rupleide Автор
      06.06.2026 05:13

      Всё обновляется. Из компоненты и сам интерфейс приложения. Недавно вот обновление выпускал, очень классно оформил интерфейс GUI, кнопки переделал и всё сделал. А компоненты запрет и TgWsProxy, подойдут под любые сценарии обновлений.


      1. Raleose
        06.06.2026 05:13

        На какой период планируете поддерживать графический интерфейс?


        1. rupleide Автор
          06.06.2026 05:13

          Пока даже не думал над какими-то конкретными сроками. Проект мне интересен, так что бросать его не собираюсь и хочу развивать всё дальше, добавляя новые фичи. Зависит от того, насколько это будет актуально


  1. ArtyomOchkin
    06.06.2026 05:13

    Интересная программа, гляну, позже дам фидбэк! Тоже думал что-то такое сделать, но руки не дошли. Спасибо!


    1. rupleide Автор
      06.06.2026 05:13

      Всегда пожалуйста!


  1. gottivartanian
    06.06.2026 05:13

    Идея с ритм-игрой вместо спиннера на время диагностики это пять. Обычно сидишь и тупо пялишься на крутилку, а тут хотьноты половишь. Маленькая деталь, а сразу видно, что делал для людей и с душой, а не просто «лишь бы работало».


    1. rupleide Автор
      06.06.2026 05:13

      Спасибо! Изначально подруга попросила сделать мини-игру, где просто падают звёздочки и их нужно ловить. Но мне эта идея показалась слабоватой, поэтому решил сделать ритм-игру) Тем более, там есть режим osu! с импортом реальных треков.


      1. OnSupersonicWaves
        06.06.2026 05:13

        Спасибо за проделанную работу, в закладки и позже попробую!


    1. Polezhe
      06.06.2026 05:13

      Всего один вопрос: "вам шашечки или ехать?"


      1. rupleide Автор
        06.06.2026 05:13

        Главное, что едет, и едет отлично) Для этого всё и задумывалось.


  1. pErDitt73
    06.06.2026 05:13

    Такой вопрос, временам РКН блокает сервера ЕА , к примеру Apex legends в некоторых регионах запускается только через запрет,эта программа может помочь?


    1. rupleide Автор
      06.06.2026 05:13

      Я хотел ввести такую функцию, но подобных блокировок становится всё больше, и автоматизировать их сложно. На данный момент лучше всего настраивать обход для конкретных игр по гайдам вручную.

      В будущем я попробую добавить такой функционал, но пока этого нет - сейчас приложение помогает только с самыми базовыми потребностями.


  1. Arjgsh
    06.06.2026 05:13

    А что по автозапуску?


    1. rupleide Автор
      06.06.2026 05:13

      Всё имеется)


      1. Arjgsh
        06.06.2026 05:13

        А, да. Ну а почему если даже я вручную установил, то не могу выбрать конкретную стратегию запрета (батник) пока не пройду автоматический подбор стратегии? Типа он мне не нужен, я знаю какую запускать


  1. rupleide Автор
    06.06.2026 05:13

    Понимаю, что для опытных пользователей это может выглядеть как лишний шаг, но такая логика заложена намеренно.

    Полное сканирование нужно пройтu один раз, чтобы приложение зафиксировало общую картину сети и открыло весь свой функционал. Это сделано для стабильности: если выбранный вами конфиг вдруг перестанет работать или выдаст ошибку, у вас под рукой сразу будет готовый список протестированных альтернатив, и не придётся перебирать всё вслепую.

    Пока что пропустить этот этап технически нельзя, но я подумаю над тем, чтобы в будущем добавить «экспертный режим» для тех, кто точно знает, какой батник ему нужен!


  1. Lerener
    06.06.2026 05:13

    Я так долго этого ждал этого э, что уже начал писать свой простенький GUI, но это уже готовый проект, который я порекомендую всем

    Особенно приятно, как он сам проверяет доступность серверов

    Искренне благодарен


    1. rupleide Автор
      06.06.2026 05:13

      Спасибо за такой крутой отзыв! Очень приятно слышать, что проект пришёлся так вовремя и избавил от необходимости дописывать свой велосипед с нуля.

      Над автоматической проверкой доступности серверов пришлось посидеть, так что отдельно приятно, что вы заценили эту деталь! Пользуйтесь на здоровье и спасибо за будущие рекомендации - это очень мотивирует развивать проект дальше!