| 117 | } |
| 118 | |
| 119 | auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_type, QString preferred_file_name) -> ModPlatform::IndexedVersion |
| 120 | { |
| 121 | ModPlatform::IndexedVersion file; |
| 122 | |
| 123 | file.addonId = Json::requireString(obj, "project_id"); |
| 124 | file.fileId = Json::requireString(obj, "id"); |
| 125 | file.date = Json::requireString(obj, "date_published"); |
| 126 | auto versionArray = Json::requireArray(obj, "game_versions"); |
| 127 | if (versionArray.empty()) { |
| 128 | return {}; |
| 129 | } |
| 130 | for (auto mcVer : versionArray) { |
| 131 | file.mcVersion.append(mcVer.toString()); |
| 132 | } |
| 133 | auto loaders = Json::requireArray(obj, "loaders"); |
| 134 | for (auto loader : loaders) { |
| 135 | file.loaders.append(loader.toString()); |
| 136 | } |
| 137 | file.version = Json::requireString(obj, "name"); |
| 138 | file.version_number = Json::requireString(obj, "version_number"); |
| 139 | file.changelog = Json::requireString(obj, "changelog"); |
| 140 | |
| 141 | auto files = Json::requireArray(obj, "files"); |
| 142 | int i = 0; |
| 143 | |
| 144 | // Find correct file (needed in cases where one version may have multiple files) |
| 145 | // Will default to the last one if there's no primary (though I think Modrinth requires that |
| 146 | // at least one file is primary, idk) |
| 147 | // NOTE: files.count() is 1-indexed, so we need to subtract 1 to become 0-indexed |
| 148 | while (i < files.count() - 1) { |
| 149 | auto parent = files[i].toObject(); |
| 150 | auto fileName = Json::requireString(parent, "filename"); |
| 151 | |
| 152 | if (!preferred_file_name.isEmpty() && fileName.contains(preferred_file_name)) { |
| 153 | file.is_preferred = true; |
| 154 | break; |
| 155 | } |
| 156 | |
| 157 | // Grab the primary file, if available |
| 158 | if (Json::requireBoolean(parent, "primary")) |
| 159 | break; |
| 160 | |
| 161 | i++; |
| 162 | } |
| 163 | |
| 164 | auto parent = files[i].toObject(); |
| 165 | if (parent.contains("url")) { |
| 166 | file.downloadUrl = Json::requireString(parent, "url"); |
| 167 | file.fileName = Json::requireString(parent, "filename"); |
| 168 | file.is_preferred = Json::requireBoolean(parent, "primary") || (files.count() == 1); |
| 169 | auto hash_list = Json::requireObject(parent, "hashes"); |
| 170 | |
| 171 | if (hash_list.contains(preferred_hash_type)) { |
| 172 | file.hash = Json::requireString(hash_list, preferred_hash_type); |
| 173 | file.hash_type = preferred_hash_type; |
| 174 | } else { |
| 175 | auto hash_types = ProviderCaps.hashType(ModPlatform::Provider::MODRINTH); |
| 176 | for (auto& hash_type : hash_types) { |
nothing calls this directly
no test coverage detected