Files
MrixsCraft/docs/launcher/Specification.md

128 lines
11 KiB
Markdown
Raw Permalink 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.
# Спецификация архитектуры Minecraft лаунчера
## 1. Общие сведения
* **Язык программирования:** Go (Golang)
* **GUI-библиотека:** Fyne
* **Целевые ОС:** Windows, macOS, Linux (кроссплатформенная компиляция)
* **Тип сервера:** Приватный мультисерверный проект (с поддержкой разных модпаков и версий игры)
## 2. Ключевые модули лаунчера (Core Modules)
### 2.1. Модуль авторизации (Auth Manager)
* **Протокол:** Yggdrasil API (кастомный сервер).
* **Инъекция:** Использование `authlib-injector.jar` для перенаправления запросов клиента с серверов Mojang на приватный Yggdrasil-сервер.
* **Сохранение сессии:** Локальное хранение `accessToken` и `clientToken` в зашифрованном или скрытом JSON-файле (например, `session.json`).
* **Жизненный цикл:** При запуске лаунчер выполняет `/validate` или `/refresh`. При успехе пропускает экран логина, при неудаче запрашивает пароль.
### 2.2. Модуль синхронизации файлов (Sync & Download Manager)
* **Манифест:** Скачивание `manifest.json` с описанием структуры файлов (ассеты, библиотеки, моды, конфиги).
* **Хэширование:** Использование алгоритма **SHA-1** для сверки локальных файлов с манифестом.
* **Многопоточность:** Асинхронная загрузка недостающих/поврежденных файлов (горутины + воркер-пулы).
* **Разрешение конфликтов:** Если в папке `mods/` найден файл, которого нет в манифесте, он **не удаляется безвозвратно**, а перемещается в папку `mods_backup/` для предотвращения крашей игры (Soft Deletion/Self-healing).
### 2.3. Модуль управления Java (JRE Manager)
* **Изоляция:** Лаунчер загружает и использует собственные портативные версии Java (8, 17, 21), не завися от установленной в ОС.
* **Логика:** Манифест сервера указывает требуемую версию Java (например, `java_version: 21`). Лаунчер проверяет наличие папки `Java/21/bin/java` внутри своей рабочей директории (см. раздел 4). Если ее нет — скачивает архив, распаковывает и выдает права на исполнение (для UNIX-систем).
### 2.4. Модуль запуска (Launch Engine)
* **Агностичность:** Лаунчер не привязан к конкретному Mod Loader'у (Vanilla, Fabric, Forge).
* **Генерация аргументов:** Манифест предоставляет шаблоны `mainClass` и `gameArgs` (массив строк).
* **Интерполяция:** Замена псевдопеременных в строке запуска перед стартом:
* `${player_name}` -> Никнейм игрока
* `${auth_uuid}` -> UUID сессии
* `${auth_access_token}` -> Токен Yggdrasil
* `${classpath}` -> Склейка путей ко всем `.jar` библиотекам
* Обязательное внедрение аргумента: `-javaagent:<путь>/authlib-injector.jar=<URL_сервера>`.
### 2.5. Модуль автообновления (Self-Updater)
* **Библиотека:** `github.com/cloudflare/go-selfupdate`.
* **Механика:** Сравнение текущей версии с версией на сервере API. Скачивание нового бинарника, переименование текущего исполняемого файла в `.old` (обход блокировки Windows) и перезапуск программы.
---
## 3. Пользовательский интерфейс (UI - Fyne)
Основан на компоновке `BorderLayout` со следующими зонами:
| Зона (Layout) | Элементы виджетов (Fyne Widgets) | Описание логики |
| :--- | :--- | :--- |
| **Left (Лево)** | `widget.List` / `container.VBox` | Вертикальный список серверов (модпаков). Содержит иконки и названия. При выборе меняет контент центральной зоны. |
| **Center (Центр)**| `widget.RichText`, `canvas.Image` | Фоновое изображение выбранного сервера. Поверх него — Markdown-карточка с новостями/патчноутами. |
| **Bottom (Низ)** | `BorderLayout` (вложенный) | Панель управления (Навигация и статус). |
| *Bottom-Left* | `canvas.Image`, `widget.Label` | Аватарка (лицо из скина 8x8) и никнейм. Кнопка "Выйти". |
| *Bottom-Center*| `widget.ProgressBar` | Полоса загрузки (показывает прогресс скачивания файлов). Скрыта, если нет активных загрузок. |
| *Bottom-Right* | `widget.Button` | Кнопка «Настройки» (шестеренка) и большая акцентная кнопка «PLAY». |
### 3.1. Экран настроек (Модальное окно)
* **ОЗУ:** Слайдер (`widget.Slider`) для выбора выделяемой оперативной памяти (от 1 ГБ до максимума физической ОЗУ пользователя). Конвертируется в флаги `-Xms` и `-Xmx`.
* **Доп. аргументы:** Текстовое поле (`widget.Entry`) для пользовательских флагов JVM (например, настройки Garbage Collector).
---
## 4. Структура файловой системы (Клиентская часть)
Кастомная корневая директория, зависящая от ОС:
* **Windows:** `%AppData%\Roaming\MrixsCraft\`
* **macOS:** `~/Library/Application Support/MrixsCraft/`
* **Linux:** `~/.MrixsCraft/`
Внутренняя иерархия папок:
```text
MrixsCraft/
├── launcher.exe # Исполняемый файл лаунчера
├── launcher.json # Настройки лаунчера (ОЗУ, выбранный сервер)
├── session.json # Токены авторизации Yggdrasil
├── authlib-injector.jar # Перехватчик авторизации
├── Java/ # Портативные версии Java
│ ├── 8/
│ │ └── bin/java
│ ├── 17/
│ │ └── bin/java
│ └── 21/
│ └── bin/java
├── assets/ # Общие ресурсы игры (звуки, текстуры), размещаются здесь для совместимости с игрой
├── libraries/ # Общие библиотеки (LWJGL, утилиты), размещаются здесь для совместимости с игрой
└── instances/ # Изолированные клиенты (модпаки)
├── HiTech_1_21/
│ ├── mods/ # Моды (проверяются SHA-1)
│ ├── mods_backup/ # Сюда скидываются неизвестные моды
│ ├── config/ # Конфигурации
│ └── resourcepacks/
└── Vanilla_1_20/
```
---
## 5. Требования к серверной части (API & CDN)
Для корректной работы лаунчера на сервере должны быть реализованы следующие эндпоинты:
1. **Yggdrasil API:** `/authserver/authenticate`, `/authserver/refresh`, `/authserver/validate`.
2. **Обновление лаунчера:** GET `/api/launcher/latest` -> Возвращает версию и прямую ссылку на бинарники (Win, Mac, Lin).
3. **Список серверов:** GET `/api/servers.json` -> Отдает массив доступных модпаков.
4. **Манифест сервера:** GET `/api/instances/hitech/manifest.json` -> Отдает полный граф файлов с хэшами SHA-1, путями и параметрами запуска.
5. **Файловый хостинг (CDN):** Раздача статики (модов, ассетов, библиотек).
---
## 6. Предлагаемая структура проекта (Go Packages)
Для чистоты кода рекомендуется использовать стандартный паттерн структуры Go-приложений:
```text
/cmd/launcher/
└── main.go # Точка входа, инициализация Fyne приложения
/internal/
├── auth/ # Логика Yggdrasil, токены, профили
├── config/ # Чтение/запись launcher.json и системных путей
├── fetcher/ # HTTP-клиент, скачивание файлов, проверка SHA-1
├── java/ # Определение ОС, скачивание и распаковка JRE
├── launch/ # Парсинг manifest.json, интерполяция строк, exec.Command
├── selfupdate/ # Интеграция библиотеки автообновления лаунчера
└── ui/ # Код Fyne интерфейса
├── components/ # Отдельные виджеты (аватарка, прогресс-бар)
├── screens/ # Экраны (Логин, Главное меню, Настройки)
└── theme/ # Кастомная тема Fyne (цвета, шрифты)
/pkg/
└── utils/ # Вспомогательные функции (вычисление хэша, парсинг zip)
```