fetchVersionManifest<T extends VersionInfo> method

Future<T?> fetchVersionManifest<T extends VersionInfo>(
  1. String versionId, {
  2. bool skipPatch = false,
})

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;
}