From 4bea346b26f2e34120a42fdf2f1c5485ab93f5c9 Mon Sep 17 00:00:00 2001 From: Silarn Date: Sun, 27 Jan 2019 17:08:42 -0600 Subject: Reworking update checks to use the file update info with a fallback --- src/modinfobackup.h | 1 + 1 file changed, 1 insertion(+) (limited to 'src/modinfobackup.h') diff --git a/src/modinfobackup.h b/src/modinfobackup.h index da1fcd4a..f74cd111 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -17,6 +17,7 @@ public: virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void endorse(bool) {} + virtual void parseNexusInfo() {} virtual int getFixedPriority() const { return -1; } virtual void ignoreUpdate(bool) {} virtual bool canBeUpdated() const { return false; } -- cgit v1.3.1 From 6b9e94473addf468224ea2b0521ab724d5842cb5 Mon Sep 17 00:00:00 2001 From: Silarn Date: Thu, 31 Jan 2019 00:36:41 -0600 Subject: Various fixes and updates * Add second api type for mod info to segment updates from basic desc * Add saved nexus file type and factor it into the update display * Fix some issues with how we were checking for 'latest update' files --- src/downloadmanager.cpp | 3 ++- src/mainwindow.cpp | 36 ++++++++++++++++++++---------------- src/mainwindow.h | 2 +- src/modinfo.h | 12 ++++++++++++ src/modinfobackup.h | 5 +++++ src/modinfodialog.cpp | 1 + src/modinfoforeign.h | 6 ++++-- src/modinfooverwrite.h | 6 ++++-- src/modinforegular.cpp | 20 ++++++++++++++++++-- src/modinforegular.h | 14 ++++++++++++++ src/modinfoseparator.h | 6 ++++-- src/modlist.cpp | 5 +++++ src/nexusinterface.cpp | 32 +++++++++++++++++++++++++------- src/nexusinterface.h | 43 ++++++++++++++++++++++++++++++++++++++++--- 14 files changed, 155 insertions(+), 36 deletions(-) (limited to 'src/modinfobackup.h') diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index f5e4d688..32d05230 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -1004,7 +1004,8 @@ QString DownloadManager::getFileTypeString(int fileType) case 2: return tr("Update"); case 3: return tr("Optional"); case 4: return tr("Old"); - case 5: return tr("Misc"); + case 5: return tr("Miscellaneous"); + case 6: return tr("Deleted"); default: return tr("Unknown"); } } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6933efda..064f817d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -441,7 +441,7 @@ MainWindow::MainWindow(QSettings &initSettings m_ModUpdateTimer.setSingleShot(false); connect(&m_ModUpdateTimer, SIGNAL(timeout()), this, SLOT(modUpdateCheck())); - m_ModUpdateTimer.start(300 * 1000); + //m_ModUpdateTimer.start(300 * 1000); setCategoryListVisible(initSettings.value("categorylist_visible", true).toBool()); FileDialogMemory::restore(initSettings); @@ -496,7 +496,7 @@ MainWindow::MainWindow(QSettings &initSettings updatePluginCount(); updateModCount(); - modUpdateCheck(); + //modUpdateCheck(); } @@ -5472,9 +5472,7 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD QVariantMap resultInfo = resultData.toMap(); QList files = resultInfo["files"].toList(); QList fileUpdates = resultInfo["file_updates"].toList(); - bool foundUpdate = false; m_ModsToUpdate--; - bool sameNexus = false; QString gameNameReal; for (IPluginGame *game : m_PluginContainer.plugins()) { if (game->gameNexusName() == gameName) { @@ -5485,7 +5483,19 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD std::vector modsList = ModInfo::getByModID(gameNameReal, modID); for (auto mod : modsList) { + bool foundUpdate = false; + bool oldFile = false; QString installedFile = mod->getInstallationFile(); + QVariantMap foundFile; + for (auto file : files) { + QVariantMap fileData = file.toMap(); + if (fileData["file_name"].toString().compare(installedFile, Qt::CaseInsensitive) == 0) { + foundFile = fileData; + mod->setNexusFileStatus(foundFile["category_id"].toInt()); + if (mod->getNexusFileStatus() == 4 || mod->getNexusFileStatus() == 6) + oldFile = true; + } + } for (auto update : fileUpdates) { QVariantMap updateData = update.toMap(); // Locate the current install file as an update @@ -5514,17 +5524,11 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD } break; - } else if (installedFile == updateData["new_file_name"]) { + } else if (installedFile == updateData["new_file_name"].toString()) { // This is a safety mechanism if this is the latest update file so we don't use the mod version - if (!foundUpdate) { - for (auto file : files) { - QVariantMap fileData = file.toMap(); - if (fileData["file_id"].toInt() == updateData["new_file_id"]) { - mod->setVersion(fileData["version"].toString()); - mod->setNewestVersion(fileData["version"].toString()); - foundUpdate = true; - } - } + if (!foundUpdate && !oldFile) { + foundUpdate = true; + mod->setNewestVersion(foundFile["version"].toString()); } } } @@ -5535,7 +5539,7 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD mod->updateNXMInfo(); } else { // Scrape mod data here so we can use the mod version if no file update was located - NexusInterface::instance(&m_PluginContainer)->requestDescription(gameName, modID, this, QVariant(), QString()); + NexusInterface::instance(&m_PluginContainer)->requestModInfo(gameName, modID, this, QVariant(), QString()); } } @@ -5546,7 +5550,7 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD } } -void MainWindow::nxmDescriptionAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID) +void MainWindow::nxmModInfoAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID) { QVariantMap result = resultData.toMap(); QString gameNameReal; diff --git a/src/mainwindow.h b/src/mainwindow.h index 65ca99dd..3f3a5457 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -512,7 +512,7 @@ private slots: void modUpdateCheck(); void nxmUpdatesAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); - void nxmDescriptionAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); + void nxmModInfoAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); void nxmEndorsementToggled(QString, int, QVariant, QVariant resultData, int); void nxmDownloadURLs(QString, int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString); diff --git a/src/modinfo.h b/src/modinfo.h index 9c753752..ae9dd1f3 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -503,6 +503,18 @@ public: */ virtual QString getDescription() const = 0; + /** + * @return the nexus file status (aka category ID) + */ + virtual int getNexusFileStatus() const = 0; + + + /** + * @brief sets the file status (category ID) from Nexus + * @param status the status id of the installed file + */ + virtual void setNexusFileStatus(int status) = 0; + /** * @return comments for this mod */ diff --git a/src/modinfobackup.h b/src/modinfobackup.h index f74cd111..e88335e2 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -25,7 +25,12 @@ public: virtual std::vector getIniTweaks() const { return std::vector(); } virtual std::vector getFlags() const; virtual QString getDescription() const; + virtual int getNexusFileStatus() const { return 0; } + virtual void setNexusFileStatus(int) {} virtual QDateTime getLastNexusQuery() const { return QDateTime(); } + virtual void setLastNexusQuery(QDateTime) {} + virtual QDateTime getLastNexusUpdate() const { return QDateTime(); } + virtual void setLastNexusUpdate(QDateTime) {} virtual void getNexusFiles(QList::const_iterator&, QList::const_iterator&) {} virtual QString getNexusDescription() const { return QString(); } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index db3e5de1..30d09579 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -851,6 +851,7 @@ QString ModInfoDialog::getFileCategory(int categoryID) case 2: return tr("Update"); case 3: return tr("Optional"); case 4: return tr("Old"); + case 5: return tr("Miscellaneous"); case 6: return tr("Deleted"); default: return tr("Unknown"); } diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index 0702f268..6fcf56a1 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -47,10 +47,12 @@ public: virtual std::vector getFlags() const; virtual int getHighlight() const; virtual QString getDescription() const; + virtual int getNexusFileStatus() const { return 0; } + virtual void setNexusFileStatus(int) {} virtual QDateTime getLastNexusUpdate() const { return QDateTime(); } - virtual void setLastNexusUpdate(QDateTime time) {} + virtual void setLastNexusUpdate(QDateTime) {} virtual QDateTime getLastNexusQuery() const { return QDateTime(); } - virtual void setLastNexusQuery(QDateTime time) {} + virtual void setLastNexusQuery(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 d2882301..9f77f648 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -50,10 +50,12 @@ public: virtual std::vector getFlags() const; virtual int getHighlight() const; virtual QString getDescription() const; + virtual int getNexusFileStatus() const { return 0; } + virtual void setNexusFileStatus(int) {} virtual QDateTime getLastNexusUpdate() const { return QDateTime(); } - virtual void setLastNexusUpdate(QDateTime time) {} + virtual void setLastNexusUpdate(QDateTime) {} virtual QDateTime getLastNexusQuery() const { return QDateTime(); } - virtual void setLastNexusQuery(QDateTime time) {} + virtual void setLastNexusQuery(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 f2844084..89541a70 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -93,6 +93,7 @@ void ModInfoRegular::readMeta() m_IgnoredVersion = metaFile.value("ignoredVersion", "").toString(); m_InstallationFile = metaFile.value("installationFile", "").toString(); m_NexusDescription = metaFile.value("nexusDescription", "").toString(); + m_NexusFileStatus = metaFile.value("nexusFileStatus", "1").toInt(); m_Repository = metaFile.value("repository", "Nexus").toString(); m_Converted = metaFile.value("converted", false).toBool(); m_Validated = metaFile.value("validated", false).toBool(); @@ -161,6 +162,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("notes", m_Notes); metaFile.setValue("nexusDescription", m_NexusDescription); metaFile.setValue("url", m_URL); + metaFile.setValue("nexusFileStatus", m_NexusFileStatus); metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); metaFile.setValue("lastNexusUpdate", m_LastNexusUpdate.toString(Qt::ISODate)); metaFile.setValue("converted", m_Converted); @@ -199,6 +201,9 @@ bool ModInfoRegular::updateAvailable() const if (m_IgnoredVersion.isValid() && (m_IgnoredVersion == m_NewestVersion)) { return false; } + if (m_NexusFileStatus == 4 || m_NexusFileStatus == 6) { + return true; + } return m_NewestVersion.isValid() && (m_Version < m_NewestVersion); } @@ -271,8 +276,6 @@ bool ModInfoRegular::updateNXMInfo() m_NexusBridge.requestDescription(m_GameName, m_NexusID, QVariant()); return true; } - QString warning("Please wait until %1 to request updated mod info from Nexus!"); - qWarning() << warning.arg(target.toLocalTime().time().toString(Qt::DefaultLocaleShortDate)); return false; } @@ -613,6 +616,19 @@ QString ModInfoRegular::getDescription() const } } +int ModInfoRegular::getNexusFileStatus() const +{ + return m_NexusFileStatus; +} + +void ModInfoRegular::setNexusFileStatus(int status) +{ + m_NexusFileStatus = status; + m_MetaInfoChanged = true; + saveMeta(); + emit modDetailsUpdated(true); +} + QString ModInfoRegular::comments() const { return m_Comments; diff --git a/src/modinforegular.h b/src/modinforegular.h index 8e3952e8..13ce7e42 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -285,6 +285,19 @@ public: */ virtual QString getDescription() const; + + /** + * @return the nexus file status (aka category ID) + */ + virtual int getNexusFileStatus() const; + + + /** + * @brief sets the file status (category ID) from Nexus + * @param status the status id of the installed file + */ + virtual void setNexusFileStatus(int status); + /** * @return comments for this mod */ @@ -402,6 +415,7 @@ private: bool m_IsAlternate; bool m_Converted; bool m_Validated; + bool m_NexusFileStatus; MOBase::VersionInfo m_NewestVersion; MOBase::VersionInfo m_IgnoredVersion; diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h index 1f3be861..819ee686 100644 --- a/src/modinfoseparator.h +++ b/src/modinfoseparator.h @@ -43,10 +43,12 @@ public: virtual QString getInstallationFile() const { return ""; } virtual QString getURL() const { return ""; } virtual QString repository() const { return ""; } + virtual int getNexusFileStatus() const { return 0; } + virtual void setNexusFileStatus(int) {} virtual QDateTime getLastNexusUpdate() const { return QDateTime(); } - virtual void setLastNexusUpdate(QDateTime time) {} + virtual void setLastNexusUpdate(QDateTime) {} virtual QDateTime getLastNexusQuery() const { return QDateTime(); } - virtual void setLastNexusQuery(QDateTime time) {} + virtual void setLastNexusQuery(QDateTime) {} virtual QDateTime creationTime() const { return QDateTime(); } virtual void getNexusFiles diff --git a/src/modlist.cpp b/src/modlist.cpp index 8c502f99..3f8ea4e1 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -458,6 +458,11 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const "(i.e. due to a bug) or the author uses a non-standard versioning scheme and that newest version is actually newer. " "Either way you may want to \"upgrade\"."); } + if (modInfo->getNexusFileStatus() == 4) { + text += "
" + tr("This file has been marked as \"Old\". There is most likely an updated version of this file available."); + } else if (modInfo->getNexusFileStatus() == 6) { + text += "
" + tr("This file has been marked as \"Deleted\"! You may want to check for an update or remove the nexus ID from this mod!"); + } if (modInfo->getNexusID() > 0) { if (!modInfo->canBeUpdated()) { text += "
" + tr("This mod was last checked on %1. It will be available to check after %2.") diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 7481cf96..06fbe451 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -326,6 +326,22 @@ int NexusInterface::requestDescription(QString gameName, int modID, QObject *rec return requestInfo.m_ID; } +int NexusInterface::requestModInfo(QString gameName, int modID, QObject *receiver, QVariant userData, + const QString &subModule, MOBase::IPluginGame const *game) +{ + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_MODINFO, userData, subModule, game); + m_RequestQueue.enqueue(requestInfo); + + connect(this, SIGNAL(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), + receiver, SLOT(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); + + connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), + receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + + nextRequest(); + return requestInfo.m_ID; +} + int NexusInterface::requestUpdates(const int &modID, QObject *receiver, QVariant userData, QString gameName, const QString &subModule) @@ -504,12 +520,11 @@ void NexusInterface::nextRequest() if (!info.m_Reroute) { bool hasParams = false; switch (info.m_Type) { - case NXMRequestInfo::TYPE_DESCRIPTION: { + case NXMRequestInfo::TYPE_DESCRIPTION: + case NXMRequestInfo::TYPE_MODINFO: { url = QString("%1/games/%2/mods/%3").arg(info.m_URL).arg(info.m_GameName).arg(info.m_ModID); } break; - case NXMRequestInfo::TYPE_FILES: { - url = QString("%1/games/%2/mods/%3/files").arg(info.m_URL).arg(info.m_GameName).arg(info.m_ModID); - } break; + case NXMRequestInfo::TYPE_FILES: case NXMRequestInfo::TYPE_GETUPDATES: { url = QString("%1/games/%2/mods/%3/files").arg(info.m_URL).arg(info.m_GameName).arg(info.m_ModID); } break; @@ -594,18 +609,21 @@ void NexusInterface::requestFinished(std::list::iterator iter) case NXMRequestInfo::TYPE_DESCRIPTION: { emit nxmDescriptionAvailable(iter->m_GameName, iter->m_ModID, iter->m_UserData, result, iter->m_ID); } break; + case NXMRequestInfo::TYPE_MODINFO: { + emit nxmModInfoAvailable(iter->m_GameName, iter->m_ModID, iter->m_UserData, result, iter->m_ID); + } break; case NXMRequestInfo::TYPE_FILES: { emit nxmFilesAvailable(iter->m_GameName, iter->m_ModID, iter->m_UserData, result, iter->m_ID); } break; + case NXMRequestInfo::TYPE_GETUPDATES: { + emit nxmUpdatesAvailable(iter->m_GameName, iter->m_ModID, iter->m_UserData, result, iter->m_ID); + } break; case NXMRequestInfo::TYPE_FILEINFO: { emit nxmFileInfoAvailable(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, result, iter->m_ID); } break; case NXMRequestInfo::TYPE_DOWNLOADURL: { emit nxmDownloadURLsAvailable(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, result, iter->m_ID); } break; - case NXMRequestInfo::TYPE_GETUPDATES: { - emit nxmUpdatesAvailable(iter->m_GameName, iter->m_ModID, iter->m_UserData, result, iter->m_ID); - } break; case NXMRequestInfo::TYPE_TOGGLEENDORSEMENT: { emit nxmEndorsementToggled(iter->m_GameName, iter->m_ModID, iter->m_UserData, result, iter->m_ID); } break; diff --git a/src/nexusinterface.h b/src/nexusinterface.h index e60ebf3f..64f15961 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -151,6 +151,7 @@ public: /** * @brief request description for a mod * + * @param gameName the game short name to support multiple game sources * @param modID id of the mod caller is interested in (assumed to be for the current game) * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) * @param userData user data to be returned with the result @@ -164,6 +165,7 @@ public: /** * @brief request description for a mod * + * @param gameName the game short name to support multiple game sources * @param modID id of the mod caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) * @param userData user data to be returned with the result @@ -173,12 +175,39 @@ public: int requestDescription(QString gameName, int modID, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); + /** + * @brief request description for a mod + * + * @param gameName the game short name to support multiple game sources + * @param modID id of the mod caller is interested in (assumed to be for the current game) + * @param receiver the object to receive the result asynchronously via a signal (nxmModInfoAvailable) + * @param userData user data to be returned with the result + * @return int an id to identify the request + **/ + int requestModInfo(QString gameName, int modID, QObject *receiver, QVariant userData, const QString &subModule) + { + return requestModInfo(gameName, modID, receiver, userData, subModule, getGame(gameName)); + } + + /** + * @brief request mod info + * + * @param gameName the game short name to support multiple game sources + * @param modID id of the mod caller is interested in + * @param receiver the object to receive the result asynchronously via a signal (nxmModInfoAvailable) + * @param userData user data to be returned with the result + * @param game Game with which the mod is associated + * @return int an id to identify the request + **/ + int requestModInfo(QString gameName, int modID, QObject *receiver, QVariant userData, const QString &subModule, + MOBase::IPluginGame const *game); + /** * @brief request nexus descriptions for multiple mods at once - * @param modIDs a list of ids of mods the caller is interested in + * @param modID id of the mod the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmDescriptionAvailable) * @param userData user data to be returned with the result - * @param game the game with which the mods are associated + * @param gameName the game with which the mods are associated * @return int an id to identify the request */ int requestUpdates(const int &modID, QObject *receiver, QVariant userData, QString gameName, const QString &subModule); @@ -186,6 +215,7 @@ public: /** * @brief request a list of the files belonging to a mod * + * @param gameName the game short name to support multiple game sources * @param modID id of the mod caller is interested in (assumed to be for the current game) * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) * @param userData user data to be returned with the result @@ -200,6 +230,7 @@ public: /** * @brief request a list of the files belonging to a mod * + * @param gameName the game short name to support multiple game sources * @param modID id of the mod caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) * @param userData user data to be returned with the result @@ -212,7 +243,7 @@ public: /** * @brief request info about a single file of a mod * - * @param game name of the game short name to request the download from + * @param gameName name of the game short name to request the download from * @param modID id of the mod caller is interested in (assumed to be for the current game) * @param fileID id of the file the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) @@ -224,6 +255,7 @@ public: /** * @brief request the download url of a file * + * @param gameName the game short name to support multiple game sources * @param modID id of the mod caller is interested in (assumed to be for the current game) * @param fileID id of the file the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) @@ -238,6 +270,7 @@ public: /** * @brief request the download url of a file * + * @param gameName the game short name to support multiple game sources * @param modID id of the mod caller is interested in * @param fileID id of the file the caller is interested in * @param receiver the object to receive the result asynchronously via a signal (nxmFilesAvailable) @@ -248,6 +281,7 @@ public: int requestDownloadURL(QString gameName, int modID, int fileID, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); /** + * @param gameName the game short name to support multiple game sources * @brief toggle endorsement state of the mod * @param modID id of the mod (assumed to be for the current game) * @param endorse true if the mod should be endorsed, false for un-endorse @@ -261,6 +295,7 @@ public: } /** + * @param gameName the game short name to support multiple game sources * @brief toggle endorsement state of the mod * @param modID id of the mod * @param endorse true if the mod should be endorsed, false for un-endorse @@ -342,6 +377,7 @@ signals: void needLogin(); void nxmDescriptionAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); + void nxmModInfoAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); void nxmUpdatesAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); void nxmFilesAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); void nxmFileInfoAvailable(QString gameName, int modID, int fileID, QVariant userData, QVariant resultData, int requestID); @@ -374,6 +410,7 @@ private: QNetworkReply *m_Reply; enum Type { TYPE_DESCRIPTION, + TYPE_MODINFO, TYPE_FILES, TYPE_FILEINFO, TYPE_DOWNLOADURL, -- cgit v1.3.1 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(-) (limited to 'src/modinfobackup.h') 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 From 208f389300b308966b8354a631bc18f1ad0880d5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 22 Feb 2019 22:18:05 -0600 Subject: Change setGameName parameters to match MOBase changes --- src/modinfo.h | 2 +- src/modinfobackup.h | 2 +- src/modinfoforeign.h | 2 +- src/modinfooverwrite.h | 2 +- src/modinforegular.cpp | 2 +- src/modinforegular.h | 2 +- src/modinfoseparator.h | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src/modinfobackup.h') diff --git a/src/modinfo.h b/src/modinfo.h index c3115685..52c29154 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -289,7 +289,7 @@ public: * * @param gameName the source game shortName */ - virtual void setGameName(QString gameName) = 0; + virtual void setGameName(const QString &gameName) = 0; /** * @brief set/change the nexus mod id of this mod diff --git a/src/modinfobackup.h b/src/modinfobackup.h index 3c948931..cab613c9 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -14,7 +14,7 @@ public: virtual bool updateIgnored() const { return false; } virtual bool downgradeAvailable() const { return false; } virtual bool updateNXMInfo() { return false; } - virtual void setGameName(QString) {} + virtual void setGameName(const QString&) {} virtual void setNexusID(int) {} virtual void endorse(bool) {} virtual void parseNexusInfo() {} diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index 7f5bb711..1fdf5409 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -20,7 +20,7 @@ public: virtual bool setName(const QString&) { return false; } virtual void setComments(const QString&) {} virtual void setNotes(const QString&) {} - virtual void setGameName(QString) {} + virtual void setGameName(const QString&) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} virtual void ignoreUpdate(bool) {} diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h index 71c20bee..e32653d5 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -22,7 +22,7 @@ public: virtual bool setName(const QString&) { return false; } virtual void setComments(const QString&) {} virtual void setNotes(const QString&) {} - virtual void setGameName(QString) {} + virtual void setGameName(const QString&) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} virtual void ignoreUpdate(bool) {} diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 8bef1c28..2545b3f8 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -372,7 +372,7 @@ void ModInfoRegular::setNotes(const QString ¬es) m_MetaInfoChanged = true; } -void ModInfoRegular::setGameName(QString gameName) +void ModInfoRegular::setGameName(const QString &gameName) { m_GameName = gameName; m_MetaInfoChanged = true; diff --git a/src/modinforegular.h b/src/modinforegular.h index c1785818..aaab778a 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -107,7 +107,7 @@ public: * * @param gameName the source game shortName */ - void setGameName(QString gameName); + void setGameName(const QString &gameName); /** * @brief set/change the nexus mod id of this mod diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h index 865a5179..3560d786 100644 --- a/src/modinfoseparator.h +++ b/src/modinfoseparator.h @@ -20,7 +20,7 @@ public: virtual int getNexusID() const { return -1; } - virtual void setGameName(QString /*gameName*/) {} + virtual void setGameName(const QString& /*gameName*/) {} virtual void setNexusID(int /*modID*/) {} -- cgit v1.3.1