NOISSUE Allow Technic pack API urls to be used in search

This mimics the behaviour that the Technic launcher has, and their
website displays API URLs for.

The big benefit of this, is to be able to install private packs now :)
This commit is contained in:
Jamie Mansfield 2021-12-24 15:00:36 +00:00
parent 8d100ba97c
commit e35f2b6c2c
No known key found for this signature in database
GPG Key ID: 36F61598F39F67B0
2 changed files with 66 additions and 19 deletions

View File

@ -1,4 +1,5 @@
/* Copyright 2020-2021 MultiMC Contributors /* Copyright 2020-2021 MultiMC Contributors
* Copyright 2021 Jamie Mansfield <jmansfield@cadixdev.org>
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -95,12 +96,21 @@ void Technic::ListModel::performSearch()
QString searchUrl = ""; QString searchUrl = "";
if (currentSearchTerm.isEmpty()) { if (currentSearchTerm.isEmpty()) {
searchUrl = "https://api.technicpack.net/trending?build=multimc"; searchUrl = "https://api.technicpack.net/trending?build=multimc";
searchMode = List;
} }
else else if (currentSearchTerm.startsWith("http://api.technicpack.net/modpack/")) {
{ searchUrl = QString("https://%1?build=multimc").arg(currentSearchTerm.mid(7));
searchMode = Single;
}
else if (currentSearchTerm.startsWith("https://api.technicpack.net/modpack/")) {
searchUrl = QString("%1?build=multimc").arg(currentSearchTerm);
searchMode = Single;
}
else {
searchUrl = QString( searchUrl = QString(
"https://api.technicpack.net/search?build=multimc&q=%1" "https://api.technicpack.net/search?build=multimc&q=%1"
).arg(currentSearchTerm); ).arg(currentSearchTerm);
searchMode = List;
} }
netJob->addNetAction(Net::Download::makeByteArray(QUrl(searchUrl), &response)); netJob->addNetAction(Net::Download::makeByteArray(QUrl(searchUrl), &response));
jobPtr = netJob; jobPtr = netJob;
@ -125,6 +135,9 @@ void Technic::ListModel::searchRequestFinished()
QList<Modpack> newList; QList<Modpack> newList;
try { try {
auto root = Json::requireObject(doc); auto root = Json::requireObject(doc);
switch (searchMode) {
case List: {
auto objs = Json::requireArray(root, "modpacks"); auto objs = Json::requireArray(root, "modpacks");
for (auto technicPack: objs) { for (auto technicPack: objs) {
Modpack pack; Modpack pack;
@ -146,6 +159,35 @@ void Technic::ListModel::searchRequestFinished()
pack.broken = false; pack.broken = false;
newList.append(pack); newList.append(pack);
} }
break;
}
case Single: {
if (root.contains("error")) {
// Invalid API url
break;
}
Modpack pack;
pack.name = Json::requireString(root, "displayName");
pack.slug = Json::requireString(root, "name");
if (root.contains("icon")) {
auto iconObj = Json::requireObject(root, "icon");
auto iconUrl = Json::requireString(iconObj, "url");
pack.logoUrl = iconUrl;
pack.logoName = iconUrl.section(QLatin1Char('/'), -1).section(QLatin1Char('.'), 0, 0);
}
else {
pack.logoUrl = "null";
pack.logoName = "null";
}
pack.broken = false;
newList.append(pack);
break;
}
}
} }
catch (const JSONValidationError &err) catch (const JSONValidationError &err)
{ {

View File

@ -1,4 +1,5 @@
/* Copyright 2020-2021 MultiMC Contributors /* Copyright 2020-2021 MultiMC Contributors
* Copyright 2021 Jamie Mansfield <jmansfield@cadixdev.org>
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -63,6 +64,10 @@ private:
ResetRequested, ResetRequested,
Finished Finished
} searchState = None; } searchState = None;
enum SearchMode {
List,
Single,
} searchMode = List;
NetJob::Ptr jobPtr; NetJob::Ptr jobPtr;
QByteArray response; QByteArray response;
}; };