Skip to content

Releases

v2.4.6 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 19 Sep 15:13
ace9e29

Новое:

  1. Замер скорости локаций. Приложение будет автоматически при запуске замерять скорость всех локаций и показывать около пинга. На Windows реализовал средствами нашей собственной обертки над xray, на Abdroid, IOS и MacOS замер будет работать автоматически при включенном VPN. Замеры кешируются и обновляются автоматически, либо по инициативе пользователя. Замеры можно отключить в настройках (Глобаный переключатель. Терминирует функционал замеров на уровне главного цикла + убирает кнопку замера из UI)
  2. Просмотр и удаление устройств - теперь при нажатии на виджет устройств на главном экране пользователь сможет посмотреть список устройств и удалить ненужные. Прямо из приложения
  3. Возможность делиться подпиской с окна управления устройствами

Исправления:

  1. Улучшена адаптация под полноэкранный режим на ПК
  2. Улучшен парсинг параметров подписки
  3. Улучшена стабильность работы

v2.2.4 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 16 Sep 14:16
ace9e29

Что нового

🎨 Интерфейс

  • Переключатель темы в Настройках
  • Язык и тема теперь в одной секции
  • Единый аватар пользователя в меню и на главной
  • Кнопка «Выйти» переехала в самый низ меню (прокручивается)
  • Выход из аккаунта с подтверждением
  • Настройки туннеля переработаны и сгруппированы по секциям

⚙️ Туннель

  • Информация о правах администратора встроена прямо в опцию TUN
  • Убран ненужный переключатель «Всегда запускать от администратора»

📡 Пинг

  • Недоступные серверы показывают «off» вместо 9999 мс
  • Корректная передача платформы (Windows, Android, iOS, macOS, Linux)

📊 Трафик и устройства

  • Трафик подписки берётся из заголовка subscription-userinfo
  • Список устройств для ExoWPN подтягивается корректно
  • Расширенный парсинг данных Bedolaga

v2.1.1 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 16 Sep 00:00
ace9e29

v2.1.1: локализация, кеш, трафик из subscription-userinfo" -m "- Полная локализация ru/en с автоопределением системного языка

Добавления и исправления:

  1. Выбор языка через выпадающий список в настройках, сохраняется в SharedPreferences
  2. Язык применяется мгновенно без перезапуска
  3. Персистентный кеш: профиль, подписка, устройства, трафик
  4. logoutAll() полностью очищает кеш пользователя
  5. Плашка 'Приложение обновлено до версии X' при первом запуске после апдейта
  6. Трафик подписки теперь берётся из заголовка subscription-userinfo
    для обоих сервисов (MinionGuard + ExoWPN
  7. Устройства ExoWPN подтягиваются через getDevices()
  8. Расширенный парсинг трафика и лимита устройств для Bedolaga
  9. Платформа в x-device-os передаётся с большой буквы (Windows, Android, iOS)
  10. Inno Setup: убран диалог 'для меня / для всех', сохранены реестровые фиксы
  11. Скрипт сборки scripts/build_all.bat с автопереименованием артефактов

Beta v2.0.4 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 15 Sep 22:23
ace9e29

Новое

  1. Полная локализация интерфейса — русский и английский языки.
  2. Автоопределение системного языка при первом запуске (Windows, macOS, Linux, Android, iOS).
  3. Переключатель языка в настройках — выпадающий список с пунктом «Системный».
  4. Выбор языка сохраняется в SharedPreferences и применяется мгновенно без перезапуска.
  5. Персистентный кеш данных пользователя — профиль, метаданные подписки, устройства, тариф, лимиты трафика теперь сохраняются на диск и доступны после перезапуска или временной потери связи с сервером.
  6. Плашка «Приложение успешно обновлено до версии X» — показывается один раз при первом запуске после апдейта, длится 5 секунд.
  7. Скрипт сборки scripts/build_all.bat — собирает Windows-installer и Android-APK одной командой, автоматически переименовывает артефакты в MinionGuard_<версия>-Windows.exe и MinionGuard_<версия>-Android.apk, версия подтягивается из pubspec.yaml.

Исправления

  1. Красный экран No MaterialLocalizations found при запуске — добавлены flutter_localizations и делегаты GlobalMaterialLocalizations / GlobalWidgetsLocalizations / GlobalCupertinoLocalizations.
  2. Drawer не находил MaterialLocalizations для русской локали — та же причина, что выше.
  3. Ошибка константного конструктора в AppStringsRu / AppStringsEn — добавлен явный const AppStrings() в базовый класс.
  4. Кеш данных терялся при деавторизации — теперь logoutAll() очищает всё, а DataCache переживает рестарт.
  5. Устройства не кешировались — теперь сохраняются и восстанавливаются после перезапуска.
  6. Inno Setup показывал диалог «Установить для меня / для всех» — убран, установка всегда идёт в %LOCALAPPDATA%\Programs\MinionGuard без UAC.
  7. Апдейт стирал пользовательские файлы в папке установки — удалён блок [InstallDelete] и вызов старого деинсталлятора.
  8. Сборка ломалась на копировании артефактов — папка build\dist теперь создаётся после flutter clean, а не до.
  9. Плашка обновления не появлялась — исправлено ожидание ScaffoldMessenger через retry-цикл.

Beta v1.8.4 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 15 Sep 14:54
ace9e29

✨ НОВОЕ
Чат поддержки

  1. Чат с техподдержкой - новый экран, доступный из drawer. Единый для обоих сервисов, URL из .env (CHAT_API_URL).
  2. Cookie-сессия чата сохраняется в SharedPreferences и подхватывается между запусками приложения.
  3. Автополлинг новых сообщений каждые N секунд (интервал задаёт бэкенд).
  4. Оптимистичная отправка - сообщение сразу появляется в списке, потом уходит на сервер.
  5. Дедупликация сообщений при poll - серверные и локальные не дублируются.
  6. Кнопка «Поделиться логами» показывается под сообщением агента, содержащим триггерное слово. По нажатию логи тихо уходят в чат, а в UI появляется локальное сообщение «Отправлены логи ошибок приложения».
  7. Тихая отправка логов из настроек - кнопка «Отправить логи в поддержку» с описанием «Это поможет нам исправить ошибки». Пользователь видит только «Спасибо! Логи отправлены».

Логирование

  1. Три режима логирования с понятными названиями:
  2. Отключено - пишется только errors.log (последние 100 строк ошибок).
  3. Логи Xray - логи Xray и flutter_vless + errors.log.
  4. Полные логи - все критичные логи приложения + errors.log.
  5. errors.log пишется всегда, независимо от режима. Это кольцевой буфер на 100 строк с автоперезаписью.
  6. Ротация session-файлов - хранятся последние 3 файла сессий. Старые удаляются автоматически.
  7. Фильтр шума - из Полных логов вырезаны:
    [AppConfig] dump всех цветов при старте,
    [ChatService] GET/POST ...,
    [UpdateService] CACHE HIT ...,
    [Bedolaga] retry N/M через ...,
    [MinionGuard] retry N/M через ...,
    [Bedolaga] baseUrl=....
    При этом всё, что содержит error/exception/failed/timeout/refused и т.п., проходит фильтр всегда.
  8. Перехватчики ошибок Flutter перенесены в LogService.installErrorHandlers() - FlutterError.onError, PlatformDispatcher.onError, runZonedGuarded.
  9. Просмотр логов в приложении - LogViewerScreen с кнопками «Назад» и «Поделиться» (share_plus на Android/iOS/Windows/macOS).
  10. Файл errors.log в списке логов помечен отдельной иконкой и всегда показан первым.

Раздельное туннелирование

  1. Windows - полный набор: global, include (только выбранные), exclude (все, кроме выбранных), bypass local networks.
  2. Android - global, exclude (per-app VPN через blockedApps), bypass local networks.
  3. iOS/macOS/Linux - секция скрыта полностью.

Общее

  1. Оптимизация AppListService на Windows - PowerShell OutputEncoding принудительно UTF-8, чтобы русские буквы в путях не превращались в кракозябры.
  2. Детеминированный HWID - на Windows берётся MachineGuid из реестра, на Linux - /etc/machine-id, на macOS - IOPlatformUUID. Одно устройство = один HWID.
  3. Сохранение выбранного сервера между запусками - SessionService.selectedServerFor() хранит remark, при загрузке выбирается тот же сервер.
  4. Автосохранение настроек туннеля - без кнопки «Сохранить», каждое изменение сразу пишется в SharedPreferences.
  5. Drawer закрывается через 1 секунду при навигации и переключении сервиса (не только при смене сервиса).
  6. Кнопки и рамки сервисов используют цвета из .env во всех экранах (главная, тарифы, настройки, чат, drawer).

🐛 БАГ-ФИКСЫ
VPN / туннелирование

  1. Исправлен refresh-токен ExoWPN. Замыкание send в BedolagaApiClient._request() захватывало HTTP-заголовки один раз при создании, поэтому повторный запрос после refresh уходил со старым Bearer. Теперь send принимает headers параметром и пересобирает их на каждом вызове.
  2. Устранена гонка refresh-токена. Добавлен мьютекс _refreshFuture - параллельные 401 ждут один refresh вместо двух одновременных вызовов /cabinet/auth/refresh (бэкенд инвалидирует refresh после первого использования, второй запрос ронял сессию).
  3. Плашка «Сессия истекла» больше не появляется ложно. Причина - гонка refresh между getProfile() и getSubscription() на главном экране. Мьютекс устраняет сценарий, когда второй запрос получает 401 из-за израсходованного refresh.
  4. TUN-режим теперь работает на macOS через flutter_vless. Раньше usesNativeTun возвращал true только для Windows, а isMobile не включал macOS - на macOS TUN падал в proxy. Теперь usesFlutterVlessTun покрывает Android/iOS/macOS.
  5. Переключение сервера корректно работает для flutter_vless-платформ. Учтён случай, когда активен TUN через flutter_vless (не только Windows-нативный).

Чат поддержки

  1. Исправлено отображение ответов поддержки. Регулярка/логика нормализации автора не распознавала support/operator/manager/admin → они попадали в visitor и отображались справа как твои. Теперь ChatMessage._normalizeAuthor() приводит все варианты к agent/visitor/system.
  2. Появилось первое сообщение в чате. Если бэкенд не вернул сообщений, но прислал greeting - он показывается как системное сообщение. Если и greeting пуст - используется дефолтное приветствие (ChatService.defaultGreeting).
  3. Исправлен триггер кнопки «Поделиться логами». \b в Dart с unicode: true не работает с кириллицей. Заменено на (?<!\p{L})...(?!\p{L}) - теперь «логи», «логов», «LOGS», «log» ловятся, а «логирование» и «каталог» - нет.
  4. Автоконтекст в первом сообщении. При первом send() в чат добавляется шапка с сервисом, username, email, платформой и версией приложения.

Логирование

  1. Исправлено чтение hex-цветов из .env. flutter_dotenv обрезает значение по #, если оно не в кавычках. Теперь _parseColor() корректно обрабатывает #RRGGBB / RRGGBB / #RGB / inline-комментарии. В .env цвета рекомендуется оборачивать в кавычки.

UI / темы

  1. Убраны баннеры о недоступных функциях. На iOS/Linux/macOS больше не показывается «Раздельное туннелирование недоступно» и «На этой платформе доступен только TUN». Недоступные секции просто скрыты через TunnelCapabilities.showXxx.
  2. Раздел маршрутизации скрывается целиком там, где он не работает (iOS/Linux/macOS), а не отображается серым.
  3. Выбор режима подключения скрыт на Linux - там всегда proxy.

🔧 ИЗМЕНЕНИЯ
Архитектура

  1. LogService расширен - теперь единственный источник правды по логам, включая errors.log и перехватчики ошибок Flutter.
  2. Удалён lib/services/error_log_service.dart - вся его логика перенесена в LogService.
  3. VpnController - добавлены геттеры usesFlutterVlessTun, usesFlutterVless, расширен isMobile (включая macOS), переписан startTun() с разветвлением Windows / flutter_vless / Linux.
  4. BedolagaApiClient - _sendWithRetry и _request принимают функцию от headers вместо готового замыкания. Все публичные методы переписаны под новый контракт.
  5. TunnelCapabilities - новые геттеры showConnectionModeSelector, showRoutingSection, showBypassLocalNetworks для декларативной видимости секций.

UI

  1. TunnelSettingsScreen - режим логирования теперь DropdownButtonFormField (компактнее, чем RadioListTile).
  2. ChatScreen - разделение на _bootstrap (загрузка + приветствие), _poll (дедупликация), _send (оптимистичная вставка), _shareErrorLogs.
  3. LogViewerScreen - новый экран для просмотра одного лог-файла.

Beta v1.5.0 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 14 Sep 04:38
ace9e29

исправления:

  1. Кэш-хит теперь проверяет compareVersions - если версия в кэше не новее текущей, кэш не возвращается. Это главное исправление вашего бага.
  2. _cacheResult вызывается только при cmp > 0 - в кэш попадают только реально новые версии. Если релиз 1.4.6, а текущая 1.4.6, кэш не заполняется то следующее открытие Drawer снова сделает свежий запрос и вернёт null и плашки не будет.
  3. _clearCache() при cmp <= 0 - если в кэше случайно оказалась запись, равная текущей версии (например, от предыдущей гонки), она будет удалена.

Beta v1.4.6 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 14 Sep 04:13
ace9e29

Исправления:

  1. Исправлена ссылка на новости проекта. Теперь кнопка "Новости проекта" ведет на канал Telegram с новостями проектов.
  2. Мелкие баг-фиксы

Beta v1.4.2 Release

Choose a tag to compare

@BAZESHOT1 BAZESHOT1 released this 14 Sep 04:00
ace9e29

Что нового:

  1. Сохранение подписки в кеш - подписка работает даже если сессия клиента устарела и живет до реавторизации или деавторизации.
  2. Проверка обновлений и отображение версии в навигации: Приложение теперь проверяет доступные обновления и если обновление доступно - показывает в меню навигации уведомление с кнопкой загрузки (открывает этот репозиторий) на Windows. На Android открывает этот репозиторий (позже - будет открывать страницу Google Play). На IOS - проверка по релизам в AppStore и редирект при доступном обновлении на страницу приложения в AppStore.

Исправления:

  1. Установщик для Windows корректно чистит записи в реестре о повышенных правах доступа для приложения, полученных ранее (Не критично, но из за этого после окончания установки приложение не запускалось автоматически и требовало повышенных прав - теперь корректно отрабатывает при обновлениях и заново просит повышение прав при первом запуске в режиме TUN на Windows)
  2. Исправлена ошибка деавторизации для ExoWPN при Oauth-авторизации. Ранее main-screen падал с ошибкой из за истекшего токена авторизации. Теперь - через механизм refresh-tocken обновляется автоматически и сессия не вылетает. Для MinionGuard сессия кешируется и подписка продолжает работать. При этом, если токен устарел, приложение не выкидывает на главный экран, а продолжает работать до момента пока пользователю не понадобится токен авторизации его аккаунта или до момента деавторизации или реавторизации в сервисе. (Простыми словами - сабка сохраняется в кеше и работает всегда, даже при истеченной авторизации)
  3. Улучшена стабильность работы на Windows и Android
  4. Убраны лишние манифесты в правах доступа приложения