private static IEnumerable <bool> CheckUpdateVersion() { //Exit if the update check is not enabled if (!GetUpdaterEnabled()) { Log.Trace("Updater not enabled"); yield return(false); } //Fill the cache if it's empty if (_cachedNextCheckTime == null) { Log.Trace("Caching next update time"); _cachedNextCheckTime = GetUpdateState().NextCheck; } //Exit if the next update check isn't due yet if (_cachedNextCheckTime.Value >= DateTime.UtcNow) { Log.Trace("Updater not yet time to check"); yield return(false); } //Take a single frame break before starting the update check process yield return(true); var state = GetUpdateState(); Log.Trace("Beginning version check. Current state:'{0}' Current version:'{1}'", state, DissonanceComms.Version); //setup some helpers for later //On failure, check again after a short time //On success, check again after a long time var random = new System.Random(); Action failed = () => SetUpdateState(new UpdateState(state.ShownForVersion, DateTime.UtcNow + TimeSpan.FromMinutes(random.Next(10, 70)))); Action <SemanticVersion> success = v => SetUpdateState(new UpdateState(v, DateTime.UtcNow + TimeSpan.FromHours((random.Next(24, 144))))); //Begin downloading the manifest of all Dissonance updates using (var request = UnityWebRequest.Get(string.Format("https://placeholder-software.co.uk/dissonance/releases/latest-published.html{0}", EditorMetadata.GetQueryString("update_checker")))) { //Wait until request is complete var wait = request.SendWebRequest(); while (!wait.isDone) { yield return(true); } //If it's an error give up and schedule the next check fairly soon if (request.isNetworkError) { request.Dispose(); failed(); Log.Trace("Update request failed"); yield return(false); } //Get the response bytes and discard the request var bytes = request.downloadHandler.data; request.Dispose(); //Parse the response data. If we fail give up and schedule the next check fairly soon SemanticVersion latest; if (!TryParse(bytes, out latest) || latest == null) { failed(); Log.Trace("Update response parsing failed"); yield return(false); } else { Log.Trace("Received updater response, remote latest version is: '{0}'", latest); //Check if we've already shown the window for a greater version if (latest.CompareTo(state.ShownForVersion) <= 0) { success(state.ShownForVersion); Log.Trace("Update success, window already shown for higher version '{0}'", state.ShownForVersion); yield return(false); } //Check if the new version is greater than the currently installed version if (latest.CompareTo(DissonanceComms.Version) <= 0) { success(state.ShownForVersion); Log.Trace("Update success, newer version '{0}' already installed", DissonanceComms.Version); yield return(false); } //Update the state so that the window does not show up again for this version success(latest); UpdateWindow.Show(latest, DissonanceComms.Version); Log.Trace("Update success, showing update notification window for version '{0}'", latest); } } }
private static IEnumerable <bool> CheckUpdateVersion() { //Exit if the update check is not enabled if (!GetUpdaterEnabled()) { yield return(false); } //Exit if the next update isn't due yet var state = GetUpdateState(); if (state.NextCheck >= DateTime.UtcNow) { yield return(false); } //setup some helpers for later var random = new System.Random(); Action failed = () => SetUpdateState(new UpdateState(state.ShownForVersion, DateTime.UtcNow + TimeSpan.FromMinutes(random.Next(10, 70)))); Action success = () => SetUpdateState(new UpdateState(state.ShownForVersion, DateTime.UtcNow + TimeSpan.FromHours((random.Next(12, 72))))); //Begin downloading the manifest of all Dissonance updates var request = UnityWebRequest.Get(string.Format("https://placeholder-software.co.uk/dissonance/releases/latest-published.html{0}", EditorMetadata.GetQueryString())); request.Send(); //Wait until request is complete while (!request.isDone && !request.isError) { yield return(true); } //If it's an error give up and schedule the next check fairly soon if (request.isError) { request.Dispose(); failed(); yield return(false); } //Get the response bytes and discard the request var bytes = request.downloadHandler.data; request.Dispose(); //Parse the response data. If we fail give up and schedule the next check fairly soon SemanticVersion latest; if (!TryParse(bytes, out latest) || latest == null) { failed(); yield return(false); } else { //Check if we've already shown the window for a greater version if (latest.CompareTo(state.ShownForVersion) <= 0) { success(); yield return(false); } //Check if the new version is greater than the currently installed version if (latest.CompareTo(DissonanceComms.Version) <= 0) { success(); yield return(false); } //Update the state so that the window does not show up again for this version SetUpdateState(new UpdateState(latest, DateTime.UtcNow + TimeSpan.FromHours((random.Next(12, 72))))); UpdateWindow.Show(latest, DissonanceComms.Version); success(); } }