From d86d2f704ab0eb91a9051fa818b5195f323467fa Mon Sep 17 00:00:00 2001 From: Silarn Date: Tue, 5 Feb 2019 16:53:54 -0600 Subject: 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 --- src/mainwindow.cpp | 5 +++-- src/modinfo.h | 19 +++++++++++++++++-- src/modinfobackup.h | 3 +++ src/modinfoforeign.h | 3 +++ src/modinfooverwrite.h | 3 +++ src/modinforegular.cpp | 37 ++++++++++++++++++++++++++++++++++++- src/modinforegular.h | 16 ++++++++++++++++ src/modinfoseparator.h | 3 +++ src/modlist.cpp | 2 +- 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 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 . #include "versioninfo.h" class PluginContainer; - -class QDateTime; class QDir; + +#include #include #include #include @@ -459,6 +459,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 */ @@ -555,6 +560,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 */ 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 getIniTweaks() const { return std::vector(); } virtual std::vector 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::const_iterator&, QList::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 getIniTweaks() const { return std::vector(); } virtual std::vector 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 getIniTweaks() const { return std::vector(); } virtual std::vector 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(); if (metaFile.contains("endorsed")) { if (metaFile.value("endorsed").canConvert()) { @@ -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 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 @@ -258,6 +258,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 */ @@ -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 getIniTweaks() const { return std::vector(); } @@ -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 += "
" + 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 += "
" + tr("This mod is eligible for an update check."); text += "
" + tr("It was last checked on %1").arg(modInfo->getLastNexusUpdate().toLocalTime().toString(Qt::DefaultLocaleShortDate)); -- cgit v1.3.1