Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion src/commandline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -853,6 +853,18 @@ Command::Meta DownloadFileCommand::meta() const
return {"download", "downloads a file", "URL", ""};
}

po::options_description DownloadFileCommand::getVisibleOptions() const
{
po::options_description d;

d.add_options()("name,n", po::value<std::string>(), "(optional) the download name")(
"modname,m", po::value<std::string>(), "(optional) the mod name")(
"version,v", po::value<std::string>(), "(optional) the download / mod version")(
"source,s", po::value<std::string>(), "(optional) the download source");

return d;
}

po::options_description DownloadFileCommand::getInternalOptions() const
{
po::options_description d;
Expand All @@ -879,16 +891,33 @@ bool DownloadFileCommand::canForwardToPrimary() const
std::optional<int> DownloadFileCommand::runPostOrganizer(OrganizerCore& core)
{
const QString url = QString::fromStdString(vm()["URL"].as<std::string>());
QString name, modName, version, source;

if (!url.startsWith("https://")) {
reportError(QObject::tr("Download URL must start with https://"));
return 1;
}

if (vm().count("name")) {
name = QString::fromStdString(vm()["name"].as<std::string>());
}

if (vm().count("modname")) {
modName = QString::fromStdString(vm()["modname"].as<std::string>());
}

if (vm().count("version")) {
version = QString::fromStdString(vm()["version"].as<std::string>());
}

if (vm().count("source")) {
source = QString::fromStdString(vm()["source"].as<std::string>());
}

log::debug("starting direct download from command line: {}", url.toStdString());
MessageDialog::showMessage(QObject::tr("Download started"), qApp->activeWindow(),
false);
core.downloadManager()->startDownloadURLs(QStringList() << url);
core.downloadManager()->startDownloadURLWithMeta(url, name, modName, version, source);

return {};
}
Expand Down
1 change: 1 addition & 0 deletions src/commandline.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ class DownloadFileCommand : public Command
protected:
Meta meta() const override;

po::options_description getVisibleOptions() const override;
po::options_description getInternalOptions() const override;
po::positional_options_description getPositional() const override;

Expand Down
16 changes: 16 additions & 0 deletions src/downloadmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1978,6 +1978,22 @@ int DownloadManager::startDownloadURLs(const QStringList& urls)
return m_ActiveDownloads.size() - 1;
}

int DownloadManager::startDownloadURLWithMeta(const QString& url, const QString& name,
const QString& modName,
const QString& version,
const QString& source)
{
ModRepositoryFileInfo info;
info.name = name;
info.modName = modName;
info.version = version;
info.repository = source;
if (!addDownload(QStringList(url), "", -1, -1, &info)) {
return 0;
}
return m_ActiveDownloads.size() - 1;
}

Comment thread
Silarn marked this conversation as resolved.
int DownloadManager::startDownloadNexusFile(const QString& gameName, int modID,
int fileID)
{
Expand Down
3 changes: 3 additions & 0 deletions src/downloadmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,9 @@ class DownloadManager : public QObject

public: // IDownloadManager interface:
int startDownloadURLs(const QStringList& urls);
int startDownloadURLWithMeta(const QString& url, const QString& name,
const QString& modName, const QString& version,
const QString& source);
int startDownloadNexusFile(const QString& gameName, int modID, int fileID);
QString downloadPath(int id);

Expand Down
2 changes: 1 addition & 1 deletion src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1356,7 +1356,7 @@ void MainWindow::showEvent(QShowEvent* event)

m_OrganizerCore.settings().widgets().restoreIndex(ui->groupCombo);

m_OrganizerCore.settings().nexus().registerAsNXMHandler(false);
m_OrganizerCore.settings().registerDownloadHandlers(false);
m_WasVisible = true;
updateProblemsButton();

Expand Down
32 changes: 30 additions & 2 deletions src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,35 @@ void Settings::setKeepBackupOnInstall(bool b)
set(m_Settings, "General", "backup_install", b);
}

void Settings::registerDownloadHandlers(bool force)
{
m_Nexus.registerAsNXMHandler(force);
registerAsMODLHandler(force);
}

void Settings::registerAsMODLHandler(bool force)
{
const auto nxmPath = QCoreApplication::applicationDirPath() + "/" +
QString::fromStdWString(AppConfig::nxmHandlerExe());

const auto executable = QCoreApplication::applicationFilePath();

QString mode = force ? "forcereg" : "reg";
QString parameters = mode + " modl " + m_Game.plugin()->gameShortName();
for (const QString& altGame : m_Game.plugin()->validShortNames()) {
parameters += "," + altGame;
}
parameters +=
" \"" + executable + "\" \"-n %name% -m %modname% -v %version% -s %source%\"";

const auto r = shell::Execute(nxmPath, parameters);
if (!r.success()) {
QMessageBox::critical(
nullptr, QObject::tr("Failed"),
QObject::tr("Failed to start the helper application: %1").arg(r.toString()));
}
}

GameSettings& Settings::game()
{
return m_Game;
Expand Down Expand Up @@ -1992,14 +2021,13 @@ void NexusSettings::registerAsNXMHandler(bool force)
const auto executable = QCoreApplication::applicationFilePath();

QString mode = force ? "forcereg" : "reg";
QString parameters = mode + " " + m_Parent.game().plugin()->gameShortName();
QString parameters = mode + " nxm " + m_Parent.game().plugin()->gameShortName();
for (const QString& altGame : m_Parent.game().plugin()->validShortNames()) {
parameters += "," + altGame;
}
parameters += " \"" + executable + "\"";

const auto r = shell::Execute(nxmPath, parameters);

if (!r.success()) {
QMessageBox::critical(
nullptr, QObject::tr("Failed"),
Expand Down
14 changes: 14 additions & 0 deletions src/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,20 @@ class Settings : public QObject
unsigned int motdHash() const;
void setMotdHash(unsigned int hash);

// registers MO as the handler for download links
//
// if 'force' is true, the registration dialog will be shown even if the user
// said earlier not to
//
void registerDownloadHandlers(bool force);

// registers MO as the handler for modl links
//
// if 'force' is true, the registration dialog will be shown even if the user
// said earlier not to
//
void registerAsMODLHandler(bool force);

// whether archives should be parsed to show conflicts and contents
//
bool archiveParsing() const;
Expand Down
Loading
Loading