summaryrefslogtreecommitdiff
path: root/src/modinfo.cpp
diff options
context:
space:
mode:
authorSilarn <jrim@rimpo.org>2019-02-09 04:52:44 -0600
committerSilarn <jrim@rimpo.org>2019-02-18 21:31:20 -0600
commit5a7d0243c69d5194ee1a4d0be05d2bcaec18aeac (patch)
tree649ac46d7eb4f53cae61ec28f8c5adf67ec4035a /src/modinfo.cpp
parentb59c44aaa16fc286159059a2b940c144a577e01a (diff)
Implement bulk update check layer
Diffstat (limited to 'src/modinfo.cpp')
-rw-r--r--src/modinfo.cpp73
1 files changed, 65 insertions, 8 deletions
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index a1059e24..3e694baf 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -294,25 +294,82 @@ int ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiv
// NexusInterface::instance(pluginContainer)->requestUpdates(game->nexusModOrganizerID(), receiver, QVariant(), game->gameShortName(), QString());
//}
- std::set<std::pair<QString, int>> organizedGames;
+ QDateTime earliest = QDateTime::currentDateTimeUtc();
+ QDateTime latest;
+ std::set<QString> games;
for (auto mod : s_Collection) {
if (mod->canBeUpdated()) {
- organizedGames.insert(std::make_pair<QString, int>(mod->getGameName().toLower(), mod->getNexusID()));
+ if (mod->getLastNexusUpdate() < earliest)
+ earliest = mod->getLastNexusUpdate();
+ if (mod->getLastNexusUpdate() > latest)
+ latest = mod->getLastNexusUpdate();
+ games.insert(mod->getGameName().toLower());
}
}
- result = organizedGames.size();
-
- if (organizedGames.empty())
- qWarning("All of your mods have been checked recently. We restrict update checks to help preserve your available API requests.");
+ if (latest < QDateTime::currentDateTimeUtc().addDays(-30)) {
+ std::set<std::pair<QString, int>> organizedGames;
+ for (auto mod : s_Collection) {
+ if (mod->canBeUpdated()) {
+ organizedGames.insert(std::make_pair<QString, int>(mod->getGameName().toLower(), mod->getNexusID()));
+ }
+ }
+
+ result = organizedGames.size();
- for (auto game : organizedGames) {
- NexusInterface::instance(pluginContainer)->requestUpdates(game.second, receiver, QVariant(), game.first, QString());
+ if (organizedGames.empty())
+ qWarning("All of your mods have been checked recently. We restrict update checks to help preserve your available API requests.");
+
+ for (auto game : organizedGames) {
+ NexusInterface::instance(pluginContainer)->requestUpdates(game.second, receiver, QVariant(), game.first, QString());
+ }
+ } else if (earliest < QDateTime::currentDateTimeUtc().addDays(-30)) {
+ for (auto gameName : games)
+ NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::MONTH, receiver, QVariant(true), QString());
+ } else if (earliest < QDateTime::currentDateTimeUtc().addDays(-7)) {
+ for (auto gameName : games)
+ NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::MONTH, receiver, QVariant(false), QString());
+ } else if (earliest < QDateTime::currentDateTimeUtc().addDays(-1)) {
+ for (auto gameName : games)
+ NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::WEEK, receiver, QVariant(false), QString());
+ } else {
+ for (auto gameName : games)
+ NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::DAY, receiver, QVariant(false), QString());
}
return result;
}
+std::set<QSharedPointer<ModInfo>> ModInfo::filteredMods(QString gameName, QVariantList updateData, bool addOldMods, bool markUpdated)
+{
+ std::set<QSharedPointer<ModInfo>> finalMods;
+ for (QVariant result : updateData) {
+ QVariantMap update = result.toMap();
+ for (auto mod : s_Collection)
+ if (mod->getNexusID() == update["mod_id"].toInt() && mod->getGameName().compare(gameName, Qt::CaseInsensitive) == 0)
+ if (mod->getLastNexusUpdate() > QDateTime::fromSecsSinceEpoch(update["latest_file_update"].toInt(), Qt::UTC))
+ finalMods.insert(mod);
+ }
+
+ if (addOldMods)
+ for (auto mod : s_Collection)
+ if (mod->getLastNexusUpdate() < QDateTime::currentDateTimeUtc().addDays(-30) && mod->getGameName().compare(gameName, Qt::CaseInsensitive) == 0)
+ finalMods.insert(mod);
+
+ if (markUpdated) {
+ std::set<QSharedPointer<ModInfo>> updates;
+ for (auto mod : s_Collection)
+ if (mod->getGameName().compare(gameName, Qt::CaseInsensitive) == 0 && mod->canBeUpdated())
+ updates.insert(mod);
+ std::set<QSharedPointer<ModInfo>> diff;
+ std::set_difference(updates.begin(), updates.end(), finalMods.begin(), finalMods.end(), std::inserter(diff, diff.end()));
+ for (auto skipped : diff) {
+ skipped->setLastNexusUpdate(QDateTime::currentDateTimeUtc());
+ skipped->updateNXMInfo();
+ }
+ }
+ return finalMods;
+}
int ModInfo::manualUpdateCheck(PluginContainer *pluginContainer, QObject *receiver, std::multimap<QString, int> IDs)
{