summaryrefslogtreecommitdiff
path: root/src/nexusinterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/nexusinterface.cpp')
-rw-r--r--src/nexusinterface.cpp176
1 files changed, 95 insertions, 81 deletions
diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp
index 1486a59c..0263907b 100644
--- a/src/nexusinterface.cpp
+++ b/src/nexusinterface.cpp
@@ -415,7 +415,7 @@ QString NexusInterface::getGameURL(QString gameName) const
}
}
-QString NexusInterface::getOldModsURL(QString gameName) const
+QString NexusInterface::getOldModsURL(const QString& gameName) const
{
IPluginGame* game = getGame(gameName);
if (game != nullptr) {
@@ -465,11 +465,10 @@ void NexusInterface::setPluginContainer(PluginContainer* pluginContainer)
}
int NexusInterface::requestDescription(QString gameName, int modID, QObject* receiver,
- QVariant userData, const QString& subModule,
- MOBase::IPluginGame const* game)
+ QVariant userData, const QString& subModule)
{
NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_DESCRIPTION, userData,
- subModule, game);
+ subModule, getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(this, SIGNAL(nxmDescriptionAvailable(QString, int, QVariant, QVariant, int)),
@@ -487,8 +486,7 @@ int NexusInterface::requestDescription(QString gameName, int modID, QObject* rec
}
int NexusInterface::requestModInfo(QString gameName, int modID, QObject* receiver,
- QVariant userData, const QString& subModule,
- MOBase::IPluginGame const* game)
+ QVariant userData, const QString& subModule)
{
if (m_User.shouldThrottle()) {
throttledWarning(m_User);
@@ -496,7 +494,7 @@ int NexusInterface::requestModInfo(QString gameName, int modID, QObject* receive
}
NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_MODINFO, userData, subModule,
- game);
+ getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(this, SIGNAL(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)),
@@ -515,8 +513,7 @@ int NexusInterface::requestModInfo(QString gameName, int modID, QObject* receive
int NexusInterface::requestUpdateInfo(QString gameName,
NexusInterface::UpdatePeriod period,
QObject* receiver, QVariant userData,
- const QString& subModule,
- const MOBase::IPluginGame* game)
+ const QString& subModule)
{
if (m_User.shouldThrottle()) {
throttledWarning(m_User);
@@ -524,7 +521,7 @@ int NexusInterface::requestUpdateInfo(QString gameName,
}
NXMRequestInfo requestInfo(period, NXMRequestInfo::TYPE_CHECKUPDATES, userData,
- subModule, game);
+ subModule, getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(this, SIGNAL(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)),
@@ -556,7 +553,7 @@ int NexusInterface::requestUpdates(const int& modID, QObject* receiver,
}
NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_GETUPDATES, userData,
- subModule, game);
+ subModule, game->gameNexusName());
m_RequestQueue.enqueue(requestInfo);
connect(this, SIGNAL(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)),
@@ -594,11 +591,10 @@ void NexusInterface::fakeFiles()
}
int NexusInterface::requestFiles(QString gameName, int modID, QObject* receiver,
- QVariant userData, const QString& subModule,
- MOBase::IPluginGame const* game)
+ QVariant userData, const QString& subModule)
{
NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_FILES, userData, subModule,
- game);
+ getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(this, SIGNAL(nxmFilesAvailable(QString, int, QVariant, QVariant, int)),
receiver, SLOT(nxmFilesAvailable(QString, int, QVariant, QVariant, int)),
@@ -617,14 +613,9 @@ int NexusInterface::requestFileInfo(QString gameName, int modID, int fileID,
QObject* receiver, QVariant userData,
const QString& subModule)
{
- IPluginGame* gamePlugin = getGame(gameName);
- if (gamePlugin == nullptr) {
- log::error("requestFileInfo can't find plugin for {}", gameName);
- return -1;
- }
NXMRequestInfo requestInfo(modID, fileID, NXMRequestInfo::TYPE_FILEINFO, userData,
- subModule, gamePlugin);
+ subModule, getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(
@@ -643,11 +634,10 @@ int NexusInterface::requestFileInfo(QString gameName, int modID, int fileID,
int NexusInterface::requestDownloadURL(QString gameName, int modID, int fileID,
QObject* receiver, QVariant userData,
- const QString& subModule,
- MOBase::IPluginGame const* game)
+ const QString& subModule)
{
NXMRequestInfo requestInfo(modID, fileID, NXMRequestInfo::TYPE_DOWNLOADURL, userData,
- subModule, game);
+ subModule, getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(this,
@@ -687,8 +677,7 @@ int NexusInterface::requestEndorsementInfo(QObject* receiver, QVariant userData,
int NexusInterface::requestToggleEndorsement(QString gameName, int modID,
QString modVersion, bool endorse,
QObject* receiver, QVariant userData,
- const QString& subModule,
- MOBase::IPluginGame const* game)
+ const QString& subModule)
{
if (m_User.shouldThrottle()) {
throttledWarning(m_User);
@@ -696,7 +685,7 @@ int NexusInterface::requestToggleEndorsement(QString gameName, int modID,
}
NXMRequestInfo requestInfo(modID, modVersion, NXMRequestInfo::TYPE_TOGGLEENDORSEMENT,
- userData, subModule, game);
+ userData, subModule, getGameNexusName(gameName));
requestInfo.m_Endorse = endorse;
m_RequestQueue.enqueue(requestInfo);
@@ -733,8 +722,7 @@ int NexusInterface::requestTrackingInfo(QObject* receiver, QVariant userData,
int NexusInterface::requestToggleTracking(QString gameName, int modID, bool track,
QObject* receiver, QVariant userData,
- const QString& subModule,
- MOBase::IPluginGame const* game)
+ const QString& subModule)
{
if (m_User.shouldThrottle()) {
throttledWarning(m_User);
@@ -742,7 +730,7 @@ int NexusInterface::requestToggleTracking(QString gameName, int modID, bool trac
}
NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_TOGGLETRACKING, userData,
- subModule, game);
+ subModule, getGameNexusName(gameName));
requestInfo.m_Track = track;
m_RequestQueue.enqueue(requestInfo);
@@ -760,15 +748,15 @@ int NexusInterface::requestToggleTracking(QString gameName, int modID, bool trac
}
int NexusInterface::requestGameInfo(QString gameName, QObject* receiver,
- QVariant userData, const QString& subModule,
- MOBase::IPluginGame const* game)
+ QVariant userData, const QString& subModule)
{
if (m_User.shouldThrottle()) {
throttledWarning(m_User);
return -1;
}
- NXMRequestInfo requestInfo(NXMRequestInfo::TYPE_GAMEINFO, userData, subModule, game);
+ NXMRequestInfo requestInfo(NXMRequestInfo::TYPE_GAMEINFO, userData, subModule,
+ getGameNexusName(gameName));
m_RequestQueue.enqueue(requestInfo);
connect(this, SIGNAL(nxmGameInfoAvailable(QString, QVariant, QVariant, int)),
@@ -786,11 +774,10 @@ int NexusInterface::requestGameInfo(QString gameName, QObject* receiver,
int NexusInterface::requestInfoFromMd5(QString gameName, QByteArray& hash,
QObject* receiver, QVariant userData,
- const QString& subModule,
- MOBase::IPluginGame const* game)
+ const QString& subModule)
{
NXMRequestInfo requestInfo(hash, NXMRequestInfo::TYPE_FILEINFO_MD5, userData,
- subModule, game);
+ subModule, getGameNexusName(gameName));
requestInfo.m_Hash = hash;
requestInfo.m_AllowedErrors[QNetworkReply::NetworkError::ContentNotFoundError].append(
404);
@@ -810,10 +797,10 @@ int NexusInterface::requestInfoFromMd5(QString gameName, QByteArray& hash,
return requestInfo.m_ID;
}
-IPluginGame* NexusInterface::getGame(QString gameName) const
+IPluginGame* NexusInterface::getGame(const QString& gameName) const
{
- auto gamePlugins = m_PluginContainer->plugins<IPluginGame>();
- IPluginGame* gamePlugin = qApp->property("managed_game").value<IPluginGame*>();
+ const auto& gamePlugins = m_PluginContainer->plugins<IPluginGame>();
+ IPluginGame* gamePlugin = nullptr;
for (auto plugin : gamePlugins) {
if (plugin != nullptr &&
plugin->gameShortName().compare(gameName, Qt::CaseInsensitive) == 0) {
@@ -824,6 +811,16 @@ IPluginGame* NexusInterface::getGame(QString gameName) const
return gamePlugin;
}
+QString NexusInterface::getGameNexusName(const QString& gameName) const
+{
+ IPluginGame* game = getGame(gameName);
+ if (game != nullptr) {
+ return game->gameNexusName();
+ }
+
+ return gameName;
+}
+
void NexusInterface::cleanup()
{
m_AccessManager = nullptr;
@@ -855,6 +852,20 @@ void NexusInterface::nextRequest()
}
}
+ const auto currentTokens = m_AccessManager->tokens();
+ if (!currentTokens ||
+ (currentTokens->accessToken.isEmpty() && currentTokens->apiKey.isEmpty())) {
+ log::error("nexus: no OAuth token available, request aborted");
+ return;
+ }
+
+ if (!currentTokens->accessToken.isEmpty()) {
+ if (currentTokens->isExpired()) {
+ m_AccessManager->connectOrRefresh(*currentTokens);
+ return;
+ }
+ }
+
if (m_User.exhausted()) {
m_RequestQueue.clear();
QTime time = QTime::currentTime();
@@ -985,33 +996,42 @@ void NexusInterface::nextRequest()
} else {
url = info.m_URL;
}
- QNetworkRequest request(url);
- request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
- request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
- QNetworkRequest::AlwaysNetwork);
- request.setRawHeader("APIKEY", m_User.apiKey().toUtf8());
- request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader,
- m_AccessManager->userAgent(info.m_SubModule));
- request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader,
- "application/json");
- request.setRawHeader("Protocol-Version", "1.0.0");
- request.setRawHeader("Application-Name", "MO2");
- request.setRawHeader("Application-Version",
- QApplication::applicationVersion().toUtf8());
- if (postData.object().isEmpty()) {
- if (!requestIsDelete) {
- info.m_Reply = m_AccessManager->get(request);
+ QNetworkRequest request(url);
+ if (!currentTokens->accessToken.isEmpty()) {
+ if (postData.object().isEmpty()) {
+ if (!requestIsDelete) {
+ info.m_Reply = m_AccessManager->makeOAuthGetRequest(url);
+ } else {
+ m_AccessManager->addAPIHeaders(request);
+ info.m_Reply = m_AccessManager->makeOAuthDeleteRequest(request);
+ }
+ } else if (!requestIsDelete) {
+ info.m_Reply = m_AccessManager->makeOAuthPostRequest(url, postData.toJson());
} else {
- info.m_Reply = m_AccessManager->deleteResource(request);
+ // Qt doesn't support DELETE with a payload as that's technically against the HTTP
+ // standard...
+ info.m_Reply =
+ m_AccessManager->makeOAuthCustomRequest(request, "DELETE", postData.toJson());
}
- } else if (!requestIsDelete) {
- info.m_Reply = m_AccessManager->post(request, postData.toJson());
} else {
- // Qt doesn't support DELETE with a payload as that's technically against the HTTP
- // standard...
- info.m_Reply =
- m_AccessManager->sendCustomRequest(request, "DELETE", postData.toJson());
+ request.setRawHeader("APIKEY", currentTokens->apiKey.toUtf8());
+ m_AccessManager->addAPIHeaders(request);
+
+ if (postData.object().isEmpty()) {
+ if (!requestIsDelete) {
+ info.m_Reply = m_AccessManager->get(request);
+ } else {
+ info.m_Reply = m_AccessManager->deleteResource(request);
+ }
+ } else if (!requestIsDelete) {
+ info.m_Reply = m_AccessManager->post(request, postData.toJson());
+ } else {
+ // Qt doesn't support DELETE with a payload as that's technically against the HTTP
+ // standard...
+ info.m_Reply =
+ m_AccessManager->sendCustomRequest(request, "DELETE", postData.toJson());
+ }
}
connect(info.m_Reply, SIGNAL(finished()), this, SLOT(requestFinished()));
@@ -1237,45 +1257,41 @@ QString get_management_url()
NexusInterface::NXMRequestInfo::NXMRequestInfo(
int modID, NexusInterface::NXMRequestInfo::Type type, QVariant userData,
- const QString& subModule, MOBase::IPluginGame const* game)
+ const QString& subModule, const QString& gameNexusName)
: m_ModID(modID), m_ModVersion("0"), m_FileID(0), m_Reply(nullptr), m_Type(type),
m_UpdatePeriod(UpdatePeriod::NONE), m_UserData(userData), m_Timeout(nullptr),
m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule),
- m_NexusGameID(game->nexusGameID()), m_GameName(game->gameNexusName()),
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(gameNexusName),
m_Endorse(false), m_Track(false), m_Hash(QByteArray())
{}
NexusInterface::NXMRequestInfo::NXMRequestInfo(
int modID, QString modVersion, NexusInterface::NXMRequestInfo::Type type,
- QVariant userData, const QString& subModule, MOBase::IPluginGame const* game)
+ QVariant userData, const QString& subModule, const QString& gameNexusName)
: m_ModID(modID), m_ModVersion(modVersion), m_FileID(0), m_Reply(nullptr),
m_Type(type), m_UpdatePeriod(UpdatePeriod::NONE), m_UserData(userData),
m_Timeout(nullptr), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule),
- m_NexusGameID(game->nexusGameID()), m_GameName(game->gameNexusName()),
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(gameNexusName),
m_Endorse(false), m_Track(false), m_Hash(QByteArray())
{}
NexusInterface::NXMRequestInfo::NXMRequestInfo(Type type, QVariant userData,
const QString& subModule,
- MOBase::IPluginGame const* game)
+ const QString& gameNexusName)
: m_ModID(0), m_ModVersion("0"), m_FileID(0), m_Reply(nullptr), m_Type(type),
m_UpdatePeriod(UpdatePeriod::NONE), m_UserData(userData), m_Timeout(nullptr),
m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule),
- m_NexusGameID(game->nexusGameID()), m_GameName(game->gameNexusName()),
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(gameNexusName),
m_Endorse(false), m_Track(false), m_Hash(QByteArray())
{}
NexusInterface::NXMRequestInfo::NXMRequestInfo(
int modID, int fileID, NexusInterface::NXMRequestInfo::Type type, QVariant userData,
- const QString& subModule, MOBase::IPluginGame const* game)
+ const QString& subModule, const QString& gameNexusName)
: m_ModID(modID), m_ModVersion("0"), m_FileID(fileID), m_Reply(nullptr),
m_Type(type), m_UpdatePeriod(UpdatePeriod::NONE), m_UserData(userData),
m_Timeout(nullptr), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule),
- m_NexusGameID(game->nexusGameID()), m_GameName(game->gameNexusName()),
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(gameNexusName),
m_Endorse(false), m_Track(false), m_Hash(QByteArray())
{}
@@ -1284,28 +1300,26 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(Type type, QVariant userData,
: m_ModID(0), m_ModVersion("0"), m_FileID(0), m_Reply(nullptr), m_Type(type),
m_UpdatePeriod(UpdatePeriod::NONE), m_UserData(userData), m_Timeout(nullptr),
m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule), m_NexusGameID(0),
- m_GameName(""), m_Endorse(false), m_Track(false), m_Hash(QByteArray())
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(""),
+ m_Endorse(false), m_Track(false), m_Hash(QByteArray())
{}
NexusInterface::NXMRequestInfo::NXMRequestInfo(
UpdatePeriod period, NexusInterface::NXMRequestInfo::Type type, QVariant userData,
- const QString& subModule, MOBase::IPluginGame const* game)
+ const QString& subModule, const QString& gameNexusName)
: m_ModID(0), m_ModVersion("0"), m_FileID(0), m_Reply(nullptr), m_Type(type),
m_UpdatePeriod(period), m_UserData(userData), m_Timeout(nullptr),
m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule),
- m_NexusGameID(game->nexusGameID()), m_GameName(game->gameNexusName()),
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(gameNexusName),
m_Endorse(false), m_Track(false), m_Hash(QByteArray())
{}
NexusInterface::NXMRequestInfo::NXMRequestInfo(
QByteArray& hash, NexusInterface::NXMRequestInfo::Type type, QVariant userData,
- const QString& subModule, MOBase::IPluginGame const* game)
+ const QString& subModule, const QString& gameNexusName)
: m_ModID(0), m_ModVersion("0"), m_FileID(0), m_Reply(nullptr), m_Type(type),
m_UpdatePeriod(UpdatePeriod::NONE), m_UserData(userData), m_Timeout(nullptr),
m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)),
- m_URL(get_management_url()), m_SubModule(subModule),
- m_NexusGameID(game->nexusGameID()), m_GameName(game->gameNexusName()),
+ m_URL(get_management_url()), m_SubModule(subModule), m_GameName(gameNexusName),
m_Endorse(false), m_Track(false), m_Hash(hash)
{}