2026-09-03 09:16:56 +03:00
|
|
|
|
# VersionManifestService
|
|
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
`versionmanifestservice.h`, `versionmanifestservice.cpp`
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Каталог версий Mojang. Скачивает `version_manifest_v2.json`, хранит его копию в папке лаунчера и
|
|
|
|
|
|
отвечает из неё, пока копия свежая.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Экземпляр держит [LauncherBackend](LauncherBackend.md): из каталога он строит список для окна
|
|
|
|
|
|
выбора версии. [VersionInstaller](VersionInstaller.md) берёт из каталога ссылку на описание версии
|
|
|
|
|
|
через `find()`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## RemoteVersionEntry
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
| Поле | Что это |
|
|
|
|
|
|
|------|---------|
|
|
|
|
|
|
| `id` | `1.21.8`, `25w33a`, `b1.7.3` |
|
|
|
|
|
|
| `type` | `release`, `snapshot`, `old_beta`, `old_alpha` |
|
|
|
|
|
|
| `url` | адрес `<id>.json` |
|
|
|
|
|
|
| `sha1` | хеш этого json |
|
|
|
|
|
|
| `releaseTime` | |
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Записи без `id` или с адресом не по `https` отбрасываются. Список отсортирован по `releaseTime`,
|
|
|
|
|
|
новые сверху. При одинаковом времени сортировка идёт по `id`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## ensureLoaded(callback, forceRefresh = false)
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Через этот метод сервис получает данные; других способов нет.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
1. При первом вызове читается кэш `<root>/cache/version_manifest.json`. Если он разобрался,
|
|
|
|
|
|
сразу испускается `versionsChanged`, и окно показывает список ещё до ответа сети.
|
|
|
|
|
|
2. Если данные моложе 6 часов и `forceRefresh` не задан, колбэк вызывается через
|
|
|
|
|
|
`QTimer::singleShot(0)` с `ok = true`. Сеть не трогается.
|
|
|
|
|
|
3. Иначе колбэк встаёт в очередь. Если запрос уже идёт, второй не отправляется.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Ответ сети разбирается, кэш перезаписывается через `QSaveFile`, испускается `versionsChanged`, и
|
|
|
|
|
|
все колбэки из очереди получают результат.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Если сеть не ответила, но старые данные есть, колбэк получит `ok = true` и непустой `warning`:
|
|
|
|
|
|
работать можно, просто список, возможно, неполный. Если данных нет совсем, придёт `ok = false`.
|
|
|
|
|
|
Бэкенд показывает `warning` пользователю только во втором случае.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Таймаут запроса 20 секунд.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## Остальное
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
- `versions()` — весь список.
|
|
|
|
|
|
- `find(id)` — запись по id (через хеш-таблицу, а не перебором).
|
|
|
|
|
|
- `hasData()`, `isRefreshing()`, `fetchedAt()`.
|
|
|
|
|
|
- `refreshingChanged` испускается в начале и в конце запроса. Бэкенд превращает его в
|
|
|
|
|
|
`catalogLoading`.
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
## Формат кэша
|
2026-09-03 09:16:56 +03:00
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"fetchedAt": "2026-10-11T08:00:00Z",
|
|
|
|
|
|
"versions": [
|
|
|
|
|
|
{ "id": "1.21.8", "type": "release", "url": "https://...", "sha1": "...", "releaseTime": "..." }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
2026-09-03 09:16:56 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-10-11 22:32:13 +03:00
|
|
|
|
Хранится только то, что нужно лаунчеру, а не весь манифест Mojang.
|
|
|
|
|
|
|
2026-09-03 09:16:56 +03:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
При создании этого документа использовался ИИ.
|