mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2026-07-06 05:16:59 +03:00
Implement URL protocol import modpack functionality
Signed-off-by: Danhoby <37343749+Dan4oby@users.noreply.github.com>
This commit is contained in:
parent
574b75fac0
commit
88d7bccd02
1 changed files with 77 additions and 1 deletions
|
|
@ -940,6 +940,11 @@ void MainWindow::processURLs(QList<QUrl> urls)
|
|||
QMap<QString, QString> extra_info;
|
||||
QUrl local_url;
|
||||
if (!url.isLocalFile()) { // download the remote resource and identify
|
||||
|
||||
const bool isExternalURLImport =
|
||||
(url.host().toLower() == "import") ||
|
||||
(url.path().startsWith("/import", Qt::CaseInsensitive));
|
||||
|
||||
QUrl dl_url;
|
||||
if (url.scheme() == "curseforge") {
|
||||
// need to find the download link for the modpack / resource
|
||||
|
|
@ -993,7 +998,7 @@ void MainWindow::processURLs(QList<QUrl> urls)
|
|||
dlUrlDialod.execWithTask(job.get());
|
||||
}
|
||||
|
||||
} else if (url.scheme() == BuildConfig.LAUNCHER_APP_BINARY_NAME) {
|
||||
} else if (url.scheme() == BuildConfig.LAUNCHER_APP_BINARY_NAME && !isExternalURLImport) {
|
||||
QVariantMap receivedData;
|
||||
const QUrlQuery query(url.query());
|
||||
const auto items = query.queryItems();
|
||||
|
|
@ -1001,6 +1006,77 @@ void MainWindow::processURLs(QList<QUrl> urls)
|
|||
receivedData.insert(it->first, it->second);
|
||||
emit APPLICATION->oauthReplyRecieved(receivedData);
|
||||
continue;
|
||||
} else if (url.scheme() == "prismlauncher" && isExternalURLImport) {
|
||||
// PrismLauncher URL protocol modpack import
|
||||
// works for any prism fork
|
||||
// preferred import format: <scheme>://import?url=ENCODED
|
||||
|
||||
const auto host = url.host().toLower();
|
||||
const auto path = url.path();
|
||||
|
||||
QString encodedTarget;
|
||||
|
||||
{
|
||||
QUrlQuery query(url);
|
||||
const auto values = query.allQueryItemValues("url");
|
||||
if (!values.isEmpty()) {
|
||||
encodedTarget = values.first();
|
||||
}
|
||||
}
|
||||
|
||||
// alternative import format: <scheme>://import/ENCODED
|
||||
if (encodedTarget.isEmpty()) {
|
||||
|
||||
QString p = path;
|
||||
|
||||
if (p.startsWith("/import/", Qt::CaseInsensitive)) {
|
||||
p = p.mid(QString("/import/").size());
|
||||
} else if (host == "import" && p.startsWith("/")) {
|
||||
p = p.mid(1);
|
||||
}
|
||||
|
||||
if (!p.isEmpty() && p != "/import") {
|
||||
encodedTarget = p;
|
||||
}
|
||||
}
|
||||
|
||||
if (encodedTarget.isEmpty()) {
|
||||
CustomMessageBox::selectable(
|
||||
this,
|
||||
tr("Error"),
|
||||
tr("Invalid import link: missing 'url' parameter."),
|
||||
QMessageBox::Critical
|
||||
)->show();
|
||||
continue;
|
||||
}
|
||||
|
||||
const QString decodedStr = QUrl::fromPercentEncoding(encodedTarget.toUtf8()).trimmed();
|
||||
|
||||
QUrl target = QUrl::fromUserInput(decodedStr);
|
||||
|
||||
// Validate: only allow http(s)
|
||||
if (!target.isValid() || (target.scheme() != "https" && target.scheme() != "http")) {
|
||||
CustomMessageBox::selectable(
|
||||
this,
|
||||
tr("Error"),
|
||||
tr("Invalid import link: URL must be http(s)."),
|
||||
QMessageBox::Critical
|
||||
)->show();
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto res = QMessageBox::question(
|
||||
this,
|
||||
tr("Install modpack"),
|
||||
tr("Do you want to download and import a modpack from:\n%1\n\nURL:\n%2")
|
||||
.arg(target.host(), target.toString()),
|
||||
QMessageBox::Yes | QMessageBox::No,
|
||||
QMessageBox::Yes
|
||||
);
|
||||
if (res != QMessageBox::Yes) {
|
||||
continue;
|
||||
}
|
||||
|
||||
} else {
|
||||
dl_url = url;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue