summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSilarn <jrim@rimpo.org>2019-02-05 16:53:54 -0600
committerSilarn <jrim@rimpo.org>2019-02-18 21:31:19 -0600
commitd86d2f704ab0eb91a9051fa818b5195f323467fa (patch)
tree9af499b51726fc323037e573be2d2f4e519dbc21 /src
parenta873c7be23f270ab1a929aaf72aa03182e0ddc2c (diff)
Implement staggered timeouts bases on age.
* < 1 mo = 2 hours * < 3 mo = 4 hours * < 6 mo = 6 hours * < 1 yr = 12 hours * > 1 yr = 24 hours
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp5
-rw-r--r--src/modinfo.h19
-rw-r--r--src/modinfobackup.h3
-rw-r--r--src/modinfoforeign.h3
-rw-r--r--src/modinfooverwrite.h3
-rw-r--r--src/modinforegular.cpp37
-rw-r--r--src/modinforegular.h16
-rw-r--r--src/modinfoseparator.h3
-rw-r--r--src/modlist.cpp2
9 files changed, 85 insertions, 6 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index cdf363cc..ce476143 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -5550,7 +5550,7 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD
requiresInfo = true;
}
- if (mod->getLastNexusQuery().addDays(1) <= QDateTime::currentDateTime())
+ if (mod->getLastNexusQuery().addDays(1) <= QDateTime::currentDateTimeUtc())
requiresInfo = true;
}
@@ -5577,7 +5577,7 @@ void MainWindow::nxmModInfoAvailable(QString gameName, int modID, QVariant userD
std::vector<ModInfo::Ptr> modsList = ModInfo::getByModID(gameNameReal, modID);
for (auto mod : modsList) {
QDateTime now = QDateTime::currentDateTimeUtc();
- QDateTime updateTarget = mod->getLastNexusUpdate().addSecs(3600);
+ QDateTime updateTarget = mod->getExpires();
if (now >= updateTarget) {
mod->setNewestVersion(result["version"].toString());
mod->setLastNexusUpdate(QDateTime::currentDateTimeUtc());
@@ -5594,6 +5594,7 @@ void MainWindow::nxmModInfoAvailable(QString gameName, int modID, QVariant userD
mod->setIsEndorsed(false);
}
mod->setLastNexusQuery(QDateTime::currentDateTimeUtc());
+ mod->setNexusLastModified(QDateTime::fromSecsSinceEpoch(result["updated_timestamp"].toInt()));
mod->saveMeta();
}
}
diff --git a/src/modinfo.h b/src/modinfo.h
index 9343a98c..2048432e 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -24,9 +24,9 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "versioninfo.h"
class PluginContainer;
-
-class QDateTime;
class QDir;
+
+#include <QDateTime>
#include <QMutex>
#include <QSharedPointer>
#include <QString>
@@ -460,6 +460,11 @@ public:
virtual bool canBeUpdated() const { return false; }
/**
+ * @return the mod update check expiration date
+ */
+ virtual QDateTime getExpires() const { return QDateTime(); }
+
+ /**
* @return true if the mod can be enabled/disabled
*/
virtual bool canBeEnabled() const { return false; }
@@ -556,6 +561,16 @@ public:
virtual void setLastNexusQuery(QDateTime time) = 0;
/**
+ * @return last time the mod was updated on Nexus
+ */
+ virtual QDateTime getNexusLastModified() const = 0;
+
+ /**
+ * @brief set the last time the mod was updated on Nexus
+ */
+ virtual void setNexusLastModified(QDateTime time) = 0;
+
+ /**
* @return a list of files that, if they exist in the data directory are treated as files in THIS mod
*/
virtual QStringList stealFiles() const { return QStringList(); }
diff --git a/src/modinfobackup.h b/src/modinfobackup.h
index e88335e2..3c948931 100644
--- a/src/modinfobackup.h
+++ b/src/modinfobackup.h
@@ -21,6 +21,7 @@ public:
virtual int getFixedPriority() const { return -1; }
virtual void ignoreUpdate(bool) {}
virtual bool canBeUpdated() const { return false; }
+ virtual QDateTime getExpires() const { return QDateTime(); }
virtual bool canBeEnabled() const { return false; }
virtual std::vector<QString> getIniTweaks() const { return std::vector<QString>(); }
virtual std::vector<EFlag> getFlags() const;
@@ -31,6 +32,8 @@ public:
virtual void setLastNexusQuery(QDateTime) {}
virtual QDateTime getLastNexusUpdate() const { return QDateTime(); }
virtual void setLastNexusUpdate(QDateTime) {}
+ virtual QDateTime getNexusLastModified() const { return QDateTime(); }
+ virtual void setNexusLastModified(QDateTime) {}
virtual void getNexusFiles(QList<MOBase::ModRepositoryFileInfo*>::const_iterator&,
QList<MOBase::ModRepositoryFileInfo*>::const_iterator&) {}
virtual QString getNexusDescription() const { return QString(); }
diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h
index 6fcf56a1..7f5bb711 100644
--- a/src/modinfoforeign.h
+++ b/src/modinfoforeign.h
@@ -43,6 +43,7 @@ public:
virtual QString getInstallationFile() const { return ""; }
virtual QString getGameName() const { return ""; }
virtual int getNexusID() const { return -1; }
+ virtual QDateTime getExpires() const { return QDateTime(); }
virtual std::vector<QString> getIniTweaks() const { return std::vector<QString>(); }
virtual std::vector<ModInfo::EFlag> getFlags() const;
virtual int getHighlight() const;
@@ -53,6 +54,8 @@ public:
virtual void setLastNexusUpdate(QDateTime) {}
virtual QDateTime getLastNexusQuery() const { return QDateTime(); }
virtual void setLastNexusQuery(QDateTime) {}
+ virtual QDateTime getNexusLastModified() const { return QDateTime(); }
+ virtual void setNexusLastModified(QDateTime) {}
virtual QString getNexusDescription() const { return QString(); }
virtual int getFixedPriority() const { return INT_MIN; }
virtual QStringList archives(bool checkOnDisk = false) { return m_Archives; }
diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h
index 9f77f648..71c20bee 100644
--- a/src/modinfooverwrite.h
+++ b/src/modinfooverwrite.h
@@ -46,6 +46,7 @@ public:
virtual int getFixedPriority() const { return INT_MAX; }
virtual QString getGameName() const { return ""; }
virtual int getNexusID() const { return -1; }
+ virtual QDateTime getExpires() const { return QDateTime(); }
virtual std::vector<QString> getIniTweaks() const { return std::vector<QString>(); }
virtual std::vector<ModInfo::EFlag> getFlags() const;
virtual int getHighlight() const;
@@ -56,6 +57,8 @@ public:
virtual void setLastNexusUpdate(QDateTime) {}
virtual QDateTime getLastNexusQuery() const { return QDateTime(); }
virtual void setLastNexusQuery(QDateTime) {}
+ virtual QDateTime getNexusLastModified() const { return QDateTime(); }
+ virtual void setNexusLastModified(QDateTime) {}
virtual QString getNexusDescription() const { return QString(); }
virtual QStringList archives(bool checkOnDisk = false);
virtual void addInstalledFile(int, int) {}
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index 8651f15e..876ccf3d 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -100,6 +100,7 @@ void ModInfoRegular::readMeta()
m_URL = metaFile.value("url", "").toString();
m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate);
m_LastNexusUpdate = QDateTime::fromString(metaFile.value("lastNexusUpdate", "").toString(), Qt::ISODate);
+ m_NexusLastModified = QDateTime::fromString(metaFile.value("nexusLastModified", QDateTime::currentDateTimeUtc()).toString(), Qt::ISODate);
m_Color = metaFile.value("color",QColor()).value<QColor>();
if (metaFile.contains("endorsed")) {
if (metaFile.value("endorsed").canConvert<int>()) {
@@ -165,6 +166,7 @@ void ModInfoRegular::saveMeta()
metaFile.setValue("nexusFileStatus", m_NexusFileStatus);
metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate));
metaFile.setValue("lastNexusUpdate", m_LastNexusUpdate.toString(Qt::ISODate));
+ metaFile.setValue("nexusLastModified", m_NexusLastModified.toString(Qt::ISODate));
metaFile.setValue("converted", m_Converted);
metaFile.setValue("validated", m_Validated);
metaFile.setValue("color", m_Color);
@@ -233,6 +235,7 @@ void ModInfoRegular::nxmDescriptionAvailable(QString, int, QVariant, QVariant re
setEndorsedState(ENDORSED_FALSE);
}
m_LastNexusQuery = QDateTime::currentDateTimeUtc();
+ m_NexusLastModified = QDateTime::fromSecsSinceEpoch(result["updated_timestamp"].toInt());
m_MetaInfoChanged = true;
saveMeta();
disconnect(sender(), SIGNAL(nxmDescriptionAvailable(QString, int, QVariant, QVariant)));
@@ -496,12 +499,31 @@ void ModInfoRegular::ignoreUpdate(bool ignore)
bool ModInfoRegular::canBeUpdated() const
{
QDateTime now = QDateTime::currentDateTimeUtc();
- QDateTime target = m_LastNexusUpdate.addSecs(3600);
+ QDateTime target = getExpires();
if (now >= target)
return m_NexusID > 0;
return false;
}
+QDateTime ModInfoRegular::getExpires() const
+{
+ qint64 diff = m_NexusLastModified.msecsTo(QDateTime::currentDateTimeUtc());
+ qint64 year = 31536000000;
+ qint64 sixMonths = 15768000000;
+ qint64 threeMonths = 7884000000;
+ qint64 oneMonth = 1314000000;
+
+ if (diff < oneMonth)
+ return m_LastNexusUpdate.addSecs(7200);
+ else if (diff < threeMonths)
+ return m_LastNexusUpdate.addSecs(14400);
+ else if (diff < sixMonths)
+ return m_LastNexusUpdate.addSecs(21600);
+ else if (diff < year)
+ return m_LastNexusUpdate.addSecs(43200);
+ else
+ return m_LastNexusUpdate.addSecs(86400);
+}
std::vector<ModInfo::EFlag> ModInfoRegular::getFlags() const
{
@@ -686,6 +708,19 @@ void ModInfoRegular::setLastNexusQuery(QDateTime time)
emit modDetailsUpdated(true);
}
+QDateTime ModInfoRegular::getNexusLastModified() const
+{
+ return m_NexusLastModified;
+}
+
+void ModInfoRegular::setNexusLastModified(QDateTime time)
+{
+ m_NexusLastModified = time;
+ m_MetaInfoChanged = true;
+ saveMeta();
+ emit modDetailsUpdated(true);
+}
+
void ModInfoRegular::setURL(QString const &url)
{
m_URL = url;
diff --git a/src/modinforegular.h b/src/modinforegular.h
index 6ad51e5f..7dc2fd6e 100644
--- a/src/modinforegular.h
+++ b/src/modinforegular.h
@@ -259,6 +259,11 @@ public:
virtual bool canBeUpdated() const;
/**
+ * @return the update expiration date based on the last updated date from Nexus
+ */
+ virtual QDateTime getExpires() const;
+
+ /**
* @return true if the mod can be enabled/disabled
*/
virtual bool canBeEnabled() const { return true; }
@@ -348,6 +353,16 @@ public:
*/
virtual void setLastNexusQuery(QDateTime time);
+ /**
+ * @return last time the mod was updated on Nexus
+ */
+ virtual QDateTime getNexusLastModified() const;
+
+ /**
+ * @brief set the last time the mod was updated on Nexus
+ */
+ virtual void setNexusLastModified(QDateTime time);
+
virtual QStringList archives(bool checkOnDisk = false);
virtual void setColor(QColor color);
@@ -405,6 +420,7 @@ private:
QDateTime m_CreationTime;
QDateTime m_LastNexusQuery;
QDateTime m_LastNexusUpdate;
+ QDateTime m_NexusLastModified;
QColor m_Color;
diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h
index 819ee686..865a5179 100644
--- a/src/modinfoseparator.h
+++ b/src/modinfoseparator.h
@@ -31,6 +31,7 @@ public:
virtual void ignoreUpdate(bool /*ignore*/) {}
virtual bool canBeUpdated() const { return false; }
+ virtual QDateTime getExpires() const { return QDateTime(); }
virtual bool canBeEnabled() const { return false; }
virtual std::vector<QString> getIniTweaks() const { return std::vector<QString>(); }
@@ -49,6 +50,8 @@ public:
virtual void setLastNexusUpdate(QDateTime) {}
virtual QDateTime getLastNexusQuery() const { return QDateTime(); }
virtual void setLastNexusQuery(QDateTime) {}
+ virtual QDateTime getNexusLastModified() const { return QDateTime(); }
+ virtual void setNexusLastModified(QDateTime) {}
virtual QDateTime creationTime() const { return QDateTime(); }
virtual void getNexusFiles
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 3f8ea4e1..c252d73b 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -467,7 +467,7 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
if (!modInfo->canBeUpdated()) {
text += "<br>" + tr("This mod was last checked on %1. It will be available to check after %2.")
.arg(modInfo->getLastNexusUpdate().toLocalTime().toString(Qt::DefaultLocaleShortDate))
- .arg(modInfo->getLastNexusUpdate().toLocalTime().addSecs(3600).time().toString(Qt::DefaultLocaleShortDate));
+ .arg(modInfo->getExpires().toLocalTime().time().toString(Qt::DefaultLocaleShortDate));
} else {
text += "<br>" + tr("This mod is eligible for an update check.");
text += "<br>" + tr("It was last checked on %1").arg(modInfo->getLastNexusUpdate().toLocalTime().toString(Qt::DefaultLocaleShortDate));