fetchVersionManifest<T extends VersionInfo> method
Fetches the version manifest for a specific Minecraft version.
versionId
- Minecraft version ID
skipPatch
- Skip patch
Returns the version information if available, otherwise null.
Implementation
Future<T?> fetchVersionManifest<T extends VersionInfo>(
String versionId, {
bool skipPatch = false,
}) async {
if (!skipPatch) {
await beforeFetchVersionManifest(versionId);
}
final versionJsonPath = _getVersionJsonPath(versionId);
final versionJsonFile = File(versionJsonPath);
if (await versionJsonFile.exists()) {
final content = await versionJsonFile.readAsString();
final jsonData = json.decode(content);
return _createVersionInfoInstance<T>(jsonData);
}
try {
final manifestUrl =
'https://launchermeta.mojang.com/mc/game/version_manifest_v2.json';
final manifestResponse = await http.get(Uri.parse(manifestUrl));
if (manifestResponse.statusCode != 200) {
throw Exception('Failed to download version manifest');
}
final manifestJson = json.decode(manifestResponse.body);
final versions = manifestJson['versions'] as List;
for (final version in versions) {
if (version['id'] == versionId) {
final versionUrl = version['url'] as String;
await _ensureDirectory(p.dirname(versionJsonPath));
try {
final versionFile = await _downloadFile(
versionUrl,
versionJsonPath,
);
final content = await versionFile.readAsString();
final jsonData = json.decode(content);
return _createVersionInfoInstance<T>(jsonData);
} catch (e) {
debugPrint('Error downloading version JSON: $e');
}
}
}
} catch (e) {
debugPrint('Error fetching version info: $e');
}
T? result;
if (await versionJsonFile.exists()) {
final content = await versionJsonFile.readAsString();
final jsonData = json.decode(content);
result = _createVersionInfoInstance<T>(jsonData);
}
if (!skipPatch) {
final resultModified = await afterFetchVersionManifest<T>(
versionId,
result,
);
if (resultModified != null) {
return resultModified;
}
}
return result;
}