summaryrefslogtreecommitdiff
path: root/src/nexusinterface.cpp
diff options
context:
space:
mode:
authorSilarn <jrim@rimpo.org>2019-01-29 15:12:59 -0600
committerSilarn <jrim@rimpo.org>2019-02-18 21:28:27 -0600
commitef286a938d79f74947a392d049068e4818ccf7fd (patch)
treeea00a2230be258ee3e54b8f5124fc9483c91865c /src/nexusinterface.cpp
parenta305ea2270c02172973f365986f194652ad344ec (diff)
Multiple fixes:
* Uses current daily/hourly rate limits * Fixed issue with translating API game string to mod game string ** Corrects issues with update checks and downloads
Diffstat (limited to 'src/nexusinterface.cpp')
-rw-r--r--src/nexusinterface.cpp56
1 files changed, 29 insertions, 27 deletions
diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp
index 1e50f0b2..7481cf96 100644
--- a/src/nexusinterface.cpp
+++ b/src/nexusinterface.cpp
@@ -148,7 +148,7 @@ QAtomicInt NexusInterface::NXMRequestInfo::s_NextID(0);
NexusInterface::NexusInterface(PluginContainer *pluginContainer)
- : m_NMMVersion(), m_PluginContainer(pluginContainer), m_RemainingRequests(300), m_MaxRequests(300)
+ : m_NMMVersion(), m_PluginContainer(pluginContainer), m_RemainingDailyRequests(0), m_RemainingHourlyRequests(0), m_MaxDailyRequests(0), m_MaxHourlyRequests(0)
{
m_MOVersion = createVersionInfo();
@@ -194,16 +194,13 @@ void NexusInterface::loginCompleted()
nextRequest();
}
-void NexusInterface::setRateMax(const QString &userName, bool isPremium)
+void NexusInterface::setRateMax(const QString&, bool, std::tuple<int, int, int, int> limits)
{
- if (isPremium) {
- m_MaxRequests = 600;
- m_RemainingRequests = 600;
- } else {
- m_MaxRequests = 300;
- m_RemainingRequests = 300;
- }
- emit requestsChanged(m_RequestQueue.size(), m_RemainingRequests);
+ m_RemainingDailyRequests = std::get<0>(limits);
+ m_MaxDailyRequests = std::get<1>(limits);
+ m_RemainingHourlyRequests = std::get<2>(limits);
+ m_MaxHourlyRequests = std::get<3>(limits);
+ emit requestsChanged(m_RequestQueue.size(), limits);
}
void NexusInterface::interpretNexusFileName(const QString &fileName, QString &modName, int &modID, bool query)
@@ -474,10 +471,16 @@ void NexusInterface::nextRequest()
return;
}
- if (m_RemainingRequests <= 0) {
- qWarning() << tr("You've exceeded the Nexus API rate limit and requests are now being throttled.");
- if (!m_RetryTimer.isActive())
- m_RetryTimer.start();
+ if (m_RemainingDailyRequests + m_RemainingHourlyRequests <= 0) {
+ if (!m_RetryTimer.isActive()) {
+ QTime time = QTime::currentTime();
+ QTime targetTime;
+ targetTime.setHMS((time.hour() + 1) % 23, 0, 5);
+ m_RetryTimer.start(time.msecsTo(targetTime));
+ QString warning("You've exceeded the Nexus API rate limit and requests are now being throttled. "
+ "Your next batch of requests will be available in approximately %1 minutes and %2 seconds.");
+ qWarning() << warning.arg(time.secsTo(targetTime) / 60).arg(time.secsTo(targetTime) % 60);
+ }
return;
}
@@ -490,8 +493,6 @@ void NexusInterface::nextRequest()
}
}
- m_RemainingRequests--;
-
NXMRequestInfo info = m_RequestQueue.dequeue();
info.m_Timeout = new QTimer(this);
info.m_Timeout->setInterval(60000);
@@ -545,7 +546,6 @@ void NexusInterface::nextRequest()
connect(info.m_Timeout, SIGNAL(timeout()), this, SLOT(requestTimeout()));
info.m_Timeout->start();
m_ActiveRequest.push_back(info);
- emit requestsChanged(m_RequestQueue.size(), m_RemainingRequests);
}
@@ -561,8 +561,6 @@ void NexusInterface::requestFinished(std::list<NXMRequestInfo>::iterator iter)
if (reply->error() != QNetworkReply::NoError) {
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode == 429) {
- m_RemainingRequests = 0;
- emit requestsChanged(m_RequestQueue.size(), m_RemainingRequests);
qWarning("Requests have hit the rate limit threshold and are now being throttled. This request will be retried.");
qWarning("Error: %s", reply->errorString().toUtf8().constData());
m_RequestQueue.enqueue(*iter);
@@ -617,6 +615,18 @@ void NexusInterface::requestFinished(std::list<NXMRequestInfo>::iterator iter)
}
}
}
+
+ m_RemainingDailyRequests = reply->rawHeader("x-rl-daily-remaining").toInt();
+ m_MaxDailyRequests = reply->rawHeader("x-rl-daily-limit").toInt();
+ m_RemainingHourlyRequests = reply->rawHeader("x-rl-hourly-remaining").toInt();
+ m_MaxHourlyRequests = reply->rawHeader("x-rl-hourly-limit").toInt();
+
+ emit requestsChanged(m_RequestQueue.size(), std::tuple<int, int, int, int>(std::make_tuple(
+ m_RemainingDailyRequests,
+ m_MaxDailyRequests,
+ m_RemainingHourlyRequests,
+ m_MaxHourlyRequests
+ )));
}
@@ -668,14 +678,6 @@ void NexusInterface::requestTimeout()
}
}
-void NexusInterface::calculateRequests()
-{
- if (m_RemainingRequests < m_MaxRequests) {
- m_RemainingRequests++;
- emit requestsChanged(m_RequestQueue.size(), m_RemainingRequests);
- }
-}
-
namespace {
QString get_management_url(MOBase::IPluginGame const *game)
{