Skip to content

Commit

Permalink
fix online update for presets with icons (#162)
Browse files Browse the repository at this point in the history
- add support for prereleases (via app.config)
  • Loading branch information
FroggieFrog authored Apr 11, 2020
1 parent b001ad4 commit 7ba0c45
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 11 deletions.
2 changes: 1 addition & 1 deletion AnnoDesigner/Commons.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public static Commons Instance

static Commons()
{
_updateHelper = new UpdateHelper(App.ApplicationPath);
_updateHelper = new UpdateHelper(App.ApplicationPath, new AppSettings());
}

private Commons()
Expand Down
12 changes: 12 additions & 0 deletions AnnoDesigner/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions AnnoDesigner/Properties/Settings.settings
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,8 @@
<Setting Name="CurrentVersion" Type="System.Double" Scope="Application">
<Value Profile="(Default)">8.5</Value>
</Setting>
<Setting Name="UpdateSupportsPrerelease" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>
47 changes: 37 additions & 10 deletions AnnoDesigner/UpdateHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class UpdateHelper : IUpdateHelper
private GitHubClient _apiClient;
private HttpClient _httpClient;
private readonly string _basePath;
private readonly IAppSettings _appSettings;

/// <summary>
/// Initializes a new instance of <see cref="AnnoDesigner.UpdateHelper"./>
Expand All @@ -41,9 +42,10 @@ public class UpdateHelper : IUpdateHelper
/// <remarks>
/// example to get the basePath: <c>string basePath = AppDomain.CurrentDomain.BaseDirectory;</c>
/// </remarks>
public UpdateHelper(string basePathToUse)
public UpdateHelper(string basePathToUse, IAppSettings appSettingsToUse)
{
_basePath = basePathToUse;
_appSettings = appSettingsToUse;
}

private GitHubClient ApiClient
Expand Down Expand Up @@ -143,6 +145,8 @@ public async Task<string> DownloadReleaseAsync(AvailableRelease releaseToDownloa
return null;
}

logger.Debug($"Download asset for release {releaseToDownload.Version}.");

var release = AllReleases.FirstOrDefault(x => x.Id == releaseToDownload.Id);
if (release == null)
{
Expand All @@ -158,6 +162,14 @@ public async Task<string> DownloadReleaseAsync(AvailableRelease releaseToDownloa
}

var foundAsset = release.Assets.FirstOrDefault(x => x.Name.StartsWith(assetName, StringComparison.OrdinalIgnoreCase));
if (foundAsset == null && releaseToDownload.Type == ReleaseType.Presets)
{
//check for release of presets with icons
releaseToDownload.Type = ReleaseType.PresetsAndIcons;
assetName = GetAssetNameForReleaseType(releaseToDownload.Type);
foundAsset = release.Assets.FirstOrDefault(x => x.Name.StartsWith(assetName, StringComparison.OrdinalIgnoreCase));
}

if (foundAsset == null)
{
logger.Warn($"No asset found with name: {assetName}.");
Expand Down Expand Up @@ -208,19 +220,21 @@ await Task.Run(async () =>
{
foreach (ReleaseType curReleaseType in Enum.GetValues(typeof(ReleaseType)))
{
var pathToUpdatesPresetsFile = GetPathToUpdatedPresetsFile(curReleaseType);
if (string.IsNullOrWhiteSpace(pathToUpdatesPresetsFile) || !File.Exists(pathToUpdatesPresetsFile))
var pathToUpdatedPresetsFile = GetPathToUpdatedPresetsFile(curReleaseType);
if (string.IsNullOrWhiteSpace(pathToUpdatedPresetsFile) || !File.Exists(pathToUpdatedPresetsFile))
{
continue;
}

logger.Debug($"start replacing presets with update: {pathToUpdatedPresetsFile}");

if (curReleaseType == ReleaseType.PresetsAndIcons)
{
using (var archive = ZipFile.OpenRead(pathToUpdatesPresetsFile))
using (var archive = ZipFile.OpenRead(pathToUpdatedPresetsFile))
{
foreach (var curEntry in archive.Entries)
{
var destinationPath = Path.Combine(Path.GetDirectoryName(pathToUpdatesPresetsFile), curEntry.FullName);
var destinationPath = Path.Combine(Path.GetDirectoryName(pathToUpdatedPresetsFile), curEntry.FullName);
var destinationDirectory = Path.GetDirectoryName(destinationPath);

if (!Directory.Exists(destinationDirectory))
Expand All @@ -244,20 +258,24 @@ await Task.Run(async () =>
//wait extra time for extraction to finish (sometimes the disk needs extra time)
await Task.Delay(TimeSpan.FromMilliseconds(200));

File.Delete(pathToUpdatesPresetsFile);
File.Delete(pathToUpdatedPresetsFile);

logger.Debug("finished extracting updated presets file");

continue;
}

var originalPresetsFileName = Path.GetFileName(pathToUpdatesPresetsFile).Replace(CoreConstants.PrefixUpdatedPresetsFile, string.Empty);
var pathToOriginalPresetsFile = Path.Combine(Path.GetDirectoryName(pathToUpdatesPresetsFile), originalPresetsFileName);
var originalPresetsFileName = Path.GetFileName(pathToUpdatedPresetsFile).Replace(CoreConstants.PrefixUpdatedPresetsFile, string.Empty);
var pathToOriginalPresetsFile = Path.Combine(Path.GetDirectoryName(pathToUpdatedPresetsFile), originalPresetsFileName);
if (File.Exists(pathToOriginalPresetsFile))
{
FileHelper.ResetFileAttributes(pathToOriginalPresetsFile);
File.Delete(pathToOriginalPresetsFile);
}

File.Move(pathToUpdatesPresetsFile, pathToOriginalPresetsFile);
File.Move(pathToUpdatedPresetsFile, pathToOriginalPresetsFile);

logger.Debug("finished replacing presets with update");
}
});
}
Expand Down Expand Up @@ -318,7 +336,12 @@ private AvailableRelease CheckForAvailableRelease(ReleaseType releaseType)
return result;
}

var foundGithubRelease = AllReleases.FirstOrDefault(x => !x.Draft && !x.Prerelease && x.TagName.StartsWith(tagToCheck, StringComparison.OrdinalIgnoreCase));
var supportPrerelease = _appSettings.UpdateSupportsPrerelease;
logger.Debug($"Update supports prereleases: {supportPrerelease}");

var foundGithubRelease = AllReleases.FirstOrDefault(x => !x.Draft &&
x.Prerelease == supportPrerelease &&
x.TagName.StartsWith(tagToCheck, StringComparison.OrdinalIgnoreCase));
//for testing - latest preset and icons release
//var latestPresetRelease = releases.FirstOrDefault(x => !x.Draft && !x.Prerelease && x.TagName.StartsWith("Presetsv3.0.0", StringComparison.OrdinalIgnoreCase));
if (foundGithubRelease == null)
Expand Down Expand Up @@ -434,12 +457,16 @@ private async Task<string> DownloadFileAsync(string url, string pathToSavedFile)
{
try
{
logger.Debug($"start downloading file: {url}");

var stream = await LocalHttpClient.GetStreamAsync(url).ConfigureAwait(false);
using (var fileStream = new FileStream(pathToSavedFile, System.IO.FileMode.Create))
{
await stream.CopyToAsync(fileStream).ConfigureAwait(false);
}

logger.Debug($"finished downloading file to \"{pathToSavedFile}\"");

return pathToSavedFile;
}
catch (Exception ex)
Expand Down
3 changes: 3 additions & 0 deletions AnnoDesigner/app.config
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@
<setting name="PresetsTreeGameVersionFilter" serializeAs="String">
<value />
</setting>
<setting name="UpdateSupportsPrerelease" serializeAs="String">
<value>False</value>
</setting>
</AnnoDesigner.Properties.Settings>
</userSettings>
<applicationSettings>
Expand Down
6 changes: 6 additions & 0 deletions AnnoDesigner/model/AppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,12 @@ public WindowState MainWindowWindowState
get { return Settings.Default.MainWindowWindowState; }
set { Settings.Default.MainWindowWindowState = value; }
}

public bool UpdateSupportsPrerelease
{
get { return Settings.Default.UpdateSupportsPrerelease; }
set { Settings.Default.UpdateSupportsPrerelease = value; }
}
}
}

1 change: 1 addition & 0 deletions AnnoDesigner/model/IAppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,6 @@ public interface IAppSettings
double MainWindowLeft { get; set; }
double MainWindowTop { get; set; }
WindowState MainWindowWindowState { get; set; }
bool UpdateSupportsPrerelease { get; set; }
}
}
1 change: 1 addition & 0 deletions AnnoDesigner/viewmodel/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,7 @@ private async Task CheckForPresetsAsync()

//Context is required here, do not use ConfigureAwait(false)
var newLocation = await _commons.UpdateHelper.DownloadReleaseAsync(foundRelease);
logger.Debug($"downloaded new preset ({foundRelease.Version}): {newLocation}");

IsBusy = false;

Expand Down

0 comments on commit 7ba0c45

Please sign in to comment.