From 908f60d47a60c3c49eeb1be74fd2b05c5bc6fe0d Mon Sep 17 00:00:00 2001 From: jacob1 Date: Sat, 26 Sep 2015 11:47:51 -0400 Subject: [PATCH] support alternate update servers, and optional changelogs --- src/client/Client.cpp | 118 +++++++++++++++++++----------- src/client/Client.h | 10 ++- src/gui/game/GameController.cpp | 28 ++++--- src/gui/update/UpdateActivity.cpp | 12 ++- 4 files changed, 109 insertions(+), 59 deletions(-) diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 76565cc23..750266a1a 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -70,6 +70,8 @@ void writeUserPreferences(const char * prefData); Client::Client(): messageOfTheDay(""), versionCheckRequest(NULL), + alternateVersionCheckRequest(NULL), + usingAltUpdateServer(false), updateAvailable(false), authUser(0, "") { @@ -135,7 +137,6 @@ Client::Client(): void Client::Initialise(std::string proxyString) { - if(GetPrefBool("version.update", false)==true) { SetPref("version.update", false); @@ -175,6 +176,12 @@ void Client::Initialise(std::string proxyString) delete[] id; delete[] session; } + +#ifdef UPDATESERVER + // use an alternate update server + alternateVersionCheckRequest = http_async_req_start(NULL, "http://" UPDATESERVER "/Startup.json", NULL, 0, 0); + usingAltUpdateServer = true; +#endif } bool Client::IsFirstRun() @@ -737,14 +744,26 @@ void Client::Tick() { //Check thumbnail queue RequestBroker::Ref().FlushThumbQueue(); + if (versionCheckRequest) + { + if (CheckUpdate(versionCheckRequest, true)) + versionCheckRequest = NULL; + } + if (alternateVersionCheckRequest) + { + if (CheckUpdate(alternateVersionCheckRequest, false)) + alternateVersionCheckRequest = NULL; + } +} +bool Client::CheckUpdate(void *updateRequest, bool checkSession) +{ //Check status on version check request - if (versionCheckRequest && http_async_req_status(versionCheckRequest)) + if (http_async_req_status(updateRequest)) { int status; int dataLength; - char * data = http_async_req_stop(versionCheckRequest, &status, &dataLength); - versionCheckRequest = NULL; + char * data = http_async_req_stop(updateRequest, &status, &dataLength); if (status != 200) { @@ -760,10 +779,13 @@ void Client::Tick() json::Reader::Read(objDocument, dataStream); //Check session - json::Boolean sessionStatus = objDocument["Session"]; - if(!sessionStatus.Value()) + if (checkSession) { - SetAuthUser(User(0, "")); + json::Boolean sessionStatus = objDocument["Session"]; + if(!sessionStatus.Value()) + { + SetAuthUser(User(0, "")); + } } //Notifications from server @@ -779,55 +801,61 @@ void Client::Tick() //MOTD - json::String messageOfTheDay = objDocument["MessageOfTheDay"]; - this->messageOfTheDay = messageOfTheDay.Value(); - notifyMessageOfTheDay(); + if (!usingAltUpdateServer || !checkSession) + { + json::String messageOfTheDay = objDocument["MessageOfTheDay"]; + this->messageOfTheDay = messageOfTheDay.Value(); + notifyMessageOfTheDay(); #ifndef IGNORE_UPDATES - //Check for updates - json::Object versions = objDocument["Updates"]; + //Check for updates + json::Object versions = objDocument["Updates"]; #if !defined(BETA) && !defined(SNAPSHOT) - json::Object stableVersion = versions["Stable"]; - json::Number stableMajor = stableVersion["Major"]; - json::Number stableMinor = stableVersion["Minor"]; - json::Number stableBuild = stableVersion["Build"]; - json::String stableFile = stableVersion["File"]; - if (stableMajor.Value()>SAVE_VERSION || (stableMinor.Value()>MINOR_VERSION && stableMajor.Value()==SAVE_VERSION) || stableBuild.Value()>BUILD_NUM) - { - updateAvailable = true; - updateInfo = UpdateInfo(stableMajor.Value(), stableMinor.Value(), stableBuild.Value(), stableFile.Value(), UpdateInfo::Stable); - } + json::Object stableVersion = versions["Stable"]; + json::Number stableMajor = stableVersion["Major"]; + json::Number stableMinor = stableVersion["Minor"]; + json::Number stableBuild = stableVersion["Build"]; + json::String stableFile = stableVersion["File"]; + json::String changelog = stableVersion["Changelog"]; + if (stableMajor.Value()>SAVE_VERSION || (stableMinor.Value()>MINOR_VERSION && stableMajor.Value()==SAVE_VERSION) || stableBuild.Value()>BUILD_NUM) + { + updateAvailable = true; + updateInfo = UpdateInfo(stableMajor.Value(), stableMinor.Value(), stableBuild.Value(), stableFile.Value(), changelog.Value(), UpdateInfo::Stable); + } #endif #ifdef BETA - json::Object betaVersion = versions["Beta"]; - json::Number betaMajor = betaVersion["Major"]; - json::Number betaMinor = betaVersion["Minor"]; - json::Number betaBuild = betaVersion["Build"]; - json::String betaFile = betaVersion["File"]; - if (betaMajor.Value()>SAVE_VERSION || (betaMinor.Value()>MINOR_VERSION && betaMajor.Value()==SAVE_VERSION) || betaBuild.Value()>BUILD_NUM) - { - updateAvailable = true; - updateInfo = UpdateInfo(betaMajor.Value(), betaMinor.Value(), betaBuild.Value(), betaFile.Value(), UpdateInfo::Beta); - } + json::Object betaVersion = versions["Beta"]; + json::Number betaMajor = betaVersion["Major"]; + json::Number betaMinor = betaVersion["Minor"]; + json::Number betaBuild = betaVersion["Build"]; + json::String betaFile = betaVersion["File"]; + json::String changelog = stableVersion["Changelog"]; + if (betaMajor.Value()>SAVE_VERSION || (betaMinor.Value()>MINOR_VERSION && betaMajor.Value()==SAVE_VERSION) || betaBuild.Value()>BUILD_NUM) + { + updateAvailable = true; + updateInfo = UpdateInfo(betaMajor.Value(), betaMinor.Value(), betaBuild.Value(), betaFile.Value(), changelog.Value(), UpdateInfo::Beta); + } #endif #ifdef SNAPSHOT - json::Object snapshotVersion = versions["Snapshot"]; - json::Number snapshotSnapshot = snapshotVersion["Snapshot"]; - json::String snapshotFile = snapshotVersion["File"]; - if (snapshotSnapshot.Value() > SNAPSHOT_ID) - { - updateAvailable = true; - updateInfo = UpdateInfo(snapshotSnapshot.Value(), snapshotFile.Value(), UpdateInfo::Snapshot); - } + json::Object snapshotVersion = versions["Snapshot"]; + json::Number snapshotSnapshot = snapshotVersion["Snapshot"]; + json::String snapshotFile = snapshotVersion["File"]; + json::String changelog = stableVersion["Changelog"]; + if (snapshotSnapshot.Value() > SNAPSHOT_ID) + { + updateAvailable = true; + updateInfo = UpdateInfo(snapshotSnapshot.Value(), snapshotFile.Value(), changelog.Value(), UpdateInfo::Snapshot); + } #endif - if(updateAvailable) - { - notifyUpdateAvailable(); - } + if(updateAvailable) + { + notifyUpdateAvailable(); + } #endif + } } catch (json::Exception &e) { @@ -836,7 +864,9 @@ void Client::Tick() free(data); } + return true; } + return false; } UpdateInfo Client::GetUpdateInfo() diff --git a/src/client/Client.h b/src/client/Client.h index 3d14a9a9c..af6a15596 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -35,14 +35,15 @@ class UpdateInfo public: enum BuildType { Stable, Beta, Snapshot }; std::string File; + std::string Changelog; int Major; int Minor; int Build; int Time; BuildType Type; - UpdateInfo() : File(""), Major(0), Minor(0), Build(0), Time(0), Type(Stable) {} - UpdateInfo(int major, int minor, int build, std::string file, BuildType type) : File(file), Major(major), Minor(minor), Build(build), Time(0), Type(type) {} - UpdateInfo(int time, std::string file, BuildType type) : File(file), Major(0), Minor(0), Build(0), Time(time), Type(type) {} + UpdateInfo() : File(""), Changelog(""), Major(0), Minor(0), Build(0), Time(0), Type(Stable) {} + UpdateInfo(int major, int minor, int build, std::string file, std::string changelog, BuildType type) : File(file), Changelog(changelog), Major(major), Minor(minor), Build(build), Time(0), Type(type) {} + UpdateInfo(int time, std::string file, std::string changelog, BuildType type) : File(file), Changelog(changelog), Major(0), Minor(0), Build(0), Time(time), Type(type) {} }; class RequestListener; @@ -53,6 +54,8 @@ private: std::vector > serverNotifications; void * versionCheckRequest; + void * alternateVersionCheckRequest; + bool usingAltUpdateServer; bool updateAvailable; UpdateInfo updateInfo; @@ -165,6 +168,7 @@ public: } RequestStatus ParseServerReturn(char *result, int status, bool json); void Tick(); + bool CheckUpdate(void *updateRequest, bool checkSession); void Shutdown(); //Force flushing preferences to file on disk. diff --git a/src/gui/game/GameController.cpp b/src/gui/game/GameController.cpp index a5ccb866c..3ecf6276c 100644 --- a/src/gui/game/GameController.cpp +++ b/src/gui/game/GameController.cpp @@ -1531,24 +1531,30 @@ void GameController::NotifyUpdateAvailable(Client * sender) virtual void Action() { - std::string currentVersion, newVersion; + UpdateInfo info = Client::Ref().GetUpdateInfo(); + std::stringstream updateMessage; + updateMessage << "Are you sure you want to run the updater? Please save any changes before updating.\n\nCurrent version:\n "; + #ifdef BETA - currentVersion = MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " Beta, Build " MTOS(BUILD_NUM); + updateMessage << SAVE_VERSION << "." << MINOR_VERSION << " Beta, Build " << BUILD_NUM; #elif defined(SNAPSHOT) - currentVersion = "Snapshot " MTOS(SNAPSHOT_ID); + updateMessage << "Snapshot " << SNAPSHOT_ID; #else - currentVersion = MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " Stable, Build " MTOS(BUILD_NUM); + updateMessage << SAVE_VERSION << "." << MINOR_VERSION << " Stable, Build " << BUILD_NUM; #endif - UpdateInfo info = Client::Ref().GetUpdateInfo(); - if(info.Type == UpdateInfo::Beta) - newVersion = format::NumberToString(info.Major) + " " + format::NumberToString(info.Minor) + " Beta, Build " + format::NumberToString(info.Build); - else if(info.Type == UpdateInfo::Snapshot) - newVersion = "Snapshot " + format::NumberToString(info.Time); + updateMessage << "\nNew version:\n "; + if (info.Type == UpdateInfo::Beta) + updateMessage << info.Major << " " << info.Minor << " Beta, Build " << info.Build; + else if (info.Type == UpdateInfo::Snapshot) + updateMessage << "Snapshot " << info.Time; else if(info.Type == UpdateInfo::Stable) - newVersion = format::NumberToString(info.Major) + " " + format::NumberToString(info.Minor) + " Stable, Build " + format::NumberToString(info.Build); + updateMessage << info.Major << " " << info.Minor << " Stable, Build " << info.Build; - new ConfirmPrompt("Run Updater", "Are you sure you want to run the updater, please save any changes before updating.\n\nCurrent version:\n " + currentVersion + "\nNew version:\n " + newVersion, new UpdateConfirmation(c)); + if (info.Changelog.length()) + updateMessage << "\n\nChangelog:\n" << info.Changelog; + + new ConfirmPrompt("Run Updater", updateMessage.str(), new UpdateConfirmation(c)); } }; diff --git a/src/gui/update/UpdateActivity.cpp b/src/gui/update/UpdateActivity.cpp index 22e3077ac..c5b759638 100644 --- a/src/gui/update/UpdateActivity.cpp +++ b/src/gui/update/UpdateActivity.cpp @@ -44,7 +44,7 @@ private: { free(data); errorStream << "Server responded with Status " << status; - notifyError("Could not download update"); + notifyError("Could not download update: " + errorStream.str()); return false; } if (!data) @@ -118,7 +118,11 @@ private: UpdateActivity::UpdateActivity() { std::stringstream file; +#ifdef UPDATESERVER + file << "http://" << UPDATESERVER << Client::Ref().GetUpdateInfo().File; +#else file << "http://" << SERVER << Client::Ref().GetUpdateInfo().File; +#endif updateDownloadTask = new UpdateDownloadTask(file.str(), this); updateWindow = new TaskWindow("Downloading update...", updateDownloadTask, true); } @@ -148,13 +152,19 @@ void UpdateActivity::NotifyError(Task * sender) virtual void ConfirmCallback(ConfirmPrompt::DialogueResult result) { if (result == ConfirmPrompt::ResultOkay) { +#ifndef UPDATESERVER Platform::OpenURI("http://powdertoy.co.uk/Download.html"); +#endif } a->Exit(); } virtual ~ErrorMessageCallback() { } }; +#ifdef UPDATESERVER + new ConfirmPrompt("Autoupdate failed", "Please go online to manually download a newer version.\nError: " + sender->GetError(), new ErrorMessageCallback(this)); +#else new ConfirmPrompt("Autoupdate failed", "Please visit the website to download a newer version.\nError: " + sender->GetError(), new ErrorMessageCallback(this)); +#endif }