From d039c9b6bdd3f6492e59be7314b0610444dd210f Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Tue, 29 Nov 2016 15:50:00 -0500 Subject: [PATCH] Add missing feature rememberance to client (#2275) Fix #2249 Add the ability for the client to remember the missing features that it received from the server it last connected to and not display the "missing/optional feature" message at every login. --- cockatrice/src/main.cpp | 1 - cockatrice/src/remoteclient.cpp | 40 ++++++++++++++++++++++++++++++-- cockatrice/src/remoteclient.h | 2 ++ cockatrice/src/settingscache.cpp | 6 +++++ cockatrice/src/settingscache.h | 3 +++ 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/main.cpp b/cockatrice/src/main.cpp index 6559cc05..0678b986 100644 --- a/cockatrice/src/main.cpp +++ b/cockatrice/src/main.cpp @@ -120,7 +120,6 @@ int main(int argc, char *argv[]) installNewTranslator(); qsrand(QDateTime::currentDateTime().toTime_t()); - qDebug("main(): starting main program"); MainWindow ui; diff --git a/cockatrice/src/remoteclient.cpp b/cockatrice/src/remoteclient.cpp index ceaa9bb5..0616f21b 100644 --- a/cockatrice/src/remoteclient.cpp +++ b/cockatrice/src/remoteclient.cpp @@ -25,6 +25,7 @@ RemoteClient::RemoteClient(QObject *parent) : AbstractClient(parent), timeRunning(0), lastDataReceived(0), messageInProgress(false), handshakeStarted(false), messageLength(0) { + clearNewClientFeatures(); int keepalive = settingsCache->getKeepAlive(); timer = new QTimer(this); timer->setInterval(keepalive * 1000); @@ -135,6 +136,13 @@ void RemoteClient::processConnectionClosedEvent(const Event_ConnectionClosed & / void RemoteClient::loginResponse(const Response &response) { const Response_Login &resp = response.GetExtension(Response_Login::ext); + + QString possibleMissingFeatures; + if (resp.missing_features_size() > 0) { + for (int i = 0; i < resp.missing_features_size(); ++i) + possibleMissingFeatures.append("," + QString::fromStdString(resp.missing_features(i))); + } + if (response.response_code() == Response::RespOk) { setStatus(StatusLoggedIn); emit userInfoChanged(resp.user_info()); @@ -149,8 +157,10 @@ void RemoteClient::loginResponse(const Response &response) ignoreList.append(resp.ignore_list(i)); emit ignoreListReceived(ignoreList); - if (resp.missing_features_size() > 0 && settingsCache->getNotifyAboutUpdates()) - emit notifyUserAboutUpdate(); + if (newMissingFeatureFound(possibleMissingFeatures) && resp.missing_features_size() > 0 && settingsCache->getNotifyAboutUpdates()) { + settingsCache->setKnownMissingFeatures(possibleMissingFeatures); + emit notifyUserAboutUpdate(); + } } else if (response.response_code() != Response::RespNotConnected) { QList missingFeatures; @@ -380,3 +390,29 @@ QString RemoteClient::getSrvClientID(const QString _hostname) QString uniqueServerClientID = QCryptographicHash::hash(srvClientID.toUtf8(), QCryptographicHash::Sha1).toHex().right(15); return uniqueServerClientID; } + +bool RemoteClient::newMissingFeatureFound(QString _serversMissingFeatures) +{ + bool newMissingFeature = false; + QStringList serversMissingFeaturesList = _serversMissingFeatures.split(","); + foreach(const QString &feature, serversMissingFeaturesList) { + if (!feature.isEmpty()) { + if (!settingsCache->getKnownMissingFeatures().contains(feature)) + return true; + } + } + return newMissingFeature; +} + +void RemoteClient::clearNewClientFeatures() +{ + QString newKnownMissingFeatures; + QStringList existingKnownMissingFeatures = settingsCache->getKnownMissingFeatures().split(","); + foreach(const QString &existingKnownFeature, existingKnownMissingFeatures) { + if (!existingKnownFeature.isEmpty()) { + if (!clientFeatures.contains(existingKnownFeature)) + newKnownMissingFeatures.append("," + existingKnownFeature); + } + } + settingsCache->setKnownMissingFeatures(newKnownMissingFeatures); +} \ No newline at end of file diff --git a/cockatrice/src/remoteclient.h b/cockatrice/src/remoteclient.h index ed0b66db..b8c257d6 100644 --- a/cockatrice/src/remoteclient.h +++ b/cockatrice/src/remoteclient.h @@ -45,6 +45,8 @@ private: QByteArray inputBuffer; bool messageInProgress; bool handshakeStarted; + bool newMissingFeatureFound(QString _serversMissingFeatures); + void clearNewClientFeatures(); int messageLength; QTimer *timer; diff --git a/cockatrice/src/settingscache.cpp b/cockatrice/src/settingscache.cpp index 264e4de8..85b4e5a0 100644 --- a/cockatrice/src/settingscache.cpp +++ b/cockatrice/src/settingscache.cpp @@ -249,6 +249,12 @@ SettingsCache::SettingsCache() spectatorsCanSeeEverything = settings->value("game/spectatorscanseeeverything", false).toBool(); rememberGameSettings = settings->value("game/remembergamesettings", true).toBool(); clientID = settings->value("personal/clientid", "notset").toString(); + knownMissingFeatures = settings->value("interface/knownmissingfeatures", "").toString(); +} + +void SettingsCache::setKnownMissingFeatures(QString _knownMissingFeatures) { + knownMissingFeatures = _knownMissingFeatures; + settings->setValue("interface/knownmissingfeatures", knownMissingFeatures); } void SettingsCache::setCardInfoViewMode(const int _viewMode) { diff --git a/cockatrice/src/settingscache.h b/cockatrice/src/settingscache.h index 19d061f8..63ad9622 100644 --- a/cockatrice/src/settingscache.h +++ b/cockatrice/src/settingscache.h @@ -86,6 +86,7 @@ private: QString picUrl; QString picUrlFallback; QString clientID; + QString knownMissingFeatures; int pixmapCacheSize; bool scaleCards; bool showMessagePopups; @@ -181,7 +182,9 @@ public: bool getRememberGameSettings() const { return rememberGameSettings; } int getKeepAlive() const { return keepalive; } void setClientID(QString clientID); + void setKnownMissingFeatures(QString _knownMissingFeatures); QString getClientID() { return clientID; } + QString getKnownMissingFeatures() { return knownMissingFeatures; } ShortcutsSettings& shortcuts() const { return *shortcutsSettings; } CardDatabaseSettings& cardDatabase() const { return *cardDatabaseSettings; } ServersSettings& servers() const { return *serversSettings; }