Files

67 lines
3.3 KiB
Markdown
Raw Permalink Normal View History

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
---
При создании этого документа использовался ИИ.