Skip to content

Commit

Permalink
Decompose InitializeAsync method in InitializerManager class
Browse files Browse the repository at this point in the history
  • Loading branch information
Drombeys committed Apr 30, 2024
1 parent 816f28b commit ba6861a
Showing 1 changed file with 98 additions and 61 deletions.
159 changes: 98 additions & 61 deletions src/ImeSense.Launchers.Belarus.Core/Manager/InitializerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ public class InitializerManager(
private readonly IReleaseComparerService<GitHubRelease> _releaseComparerService = releaseComparerService;
private readonly IUpdaterService _updaterService = updaterService;

public void InitializeLocale()
{
var userSettings = _userManager.UserSettings ??
throw new Exception("Error loading user config!");

if (userSettings.Locale is null) {
_logger?.LogError("Locale was not set");
userSettings.Locale = _launcherStorage.Locales[0];
}

_localeManager.SetLocale(userSettings.Locale.Key);
}

public async Task InitializeAsync(ISplashScreenManager splashScreenManager)
{
try {
Expand All @@ -43,7 +56,6 @@ public async Task InitializeAsync(ISplashScreenManager splashScreenManager)
_logger?.LogError("User settings locale object is null. Default locale will be selected");
_userManager.UserSettings.Locale = _launcherStorage.Locales[0];
}
var locale = _userManager.UserSettings.Locale;

if (!Directory.Exists(DirectoryStorage.LauncherCache)) {
Directory.CreateDirectory(DirectoryStorage.LauncherCache);
Expand All @@ -53,56 +65,13 @@ public async Task InitializeAsync(ISplashScreenManager splashScreenManager)
_localeManager.GetStringByKey("LocalizedStrings.Loading"),
_localeManager.GetStringByKey("LocalizedStrings.AccessingRepository")));

_launcherStorage.IsCheckGitHubConnection = await CheckGitHubConnectionAsync(splashScreenManager.CancellationToken);
_launcherStorage.IsCheckGitHubConnection = await IsCheckGitHubConnectionAsync(splashScreenManager.CancellationToken);
_logger?.LogInformation("Check GitHub connection time: {Time}", stopwatch.ElapsedMilliseconds);

if (_launcherStorage.IsCheckGitHubConnection) {
var isLauncherReleaseCurrent = await IsLauncherReleaseCurrentAsync(splashScreenManager.CancellationToken);
_logger?.LogInformation("Check launcher update time: {Time}", stopwatch.ElapsedMilliseconds);
if (!isLauncherReleaseCurrent) {
var pathLauncherUpdater = Path.Combine(DirectoryStorage.Base,
FileNameStorage.SBLauncherUpdater);
await _updaterService.UpdaterAsync(UriStorage.LauncherApiUri, pathLauncherUpdater, splashScreenManager.CancellationToken);

var updater = Launcher.Launch(pathLauncherUpdater);
updater?.Start();

return;
}

_launcherStorage.GitHubRelease = await _gitStorageApiService.GetLastReleaseAsync(cancellationToken: splashScreenManager.CancellationToken);
_logger?.LogInformation("Check last release time: {Time}", stopwatch.ElapsedMilliseconds);

_launcherStorage.IsGameReleaseCurrent = await IsGameReleaseCurrentAsync(splashScreenManager.CancellationToken);
_launcherStorage.IsUserAuthorized = File.Exists(PathStorage.LauncherSetting);

if (_launcherStorage.IsGameReleaseCurrent) {
var contentNews = await LocaleLoadCacheAsync<LangNewsContent>(PathStorage.NewsCache) ?? [];
var isContentNews = contentNews.Any(x => x.Locale is not null && x.Locale.Key.Equals(_userManager.UserSettings.Locale.Key));
if (isContentNews) {
_launcherStorage.NewsContents = new(contentNews);
} else {
await LoadRemoteContent(splashScreenManager, locale);
}

var contentRes = await LocaleLoadCacheAsync<WebResource>(PathStorage.WebResourcesCache);
if (contentRes is not null && contentRes.Count != 0) {
_launcherStorage.WebResources = new(contentRes);
} else {
await Task.Factory.StartNew(() => RemoteLoadWebResourcesAsync(cancellationToken: splashScreenManager.CancellationToken));
}
} else {
await LoadRemoteContent(splashScreenManager, locale);
await Task.Factory.StartNew(() => RemoteLoadWebResourcesAsync(cancellationToken: splashScreenManager.CancellationToken));
}
await HandleOnlineInitializationAsync(splashScreenManager, stopwatch);
} else {
if (_launcherStorage.IsUserAuthorized) {
_launcherStorage.NewsContents = new(LoadErrorNews(locale) ?? []);
} else {
_launcherStorage.NewsContents = new(LoadErrorNews() ?? []);
}

_launcherStorage.GitHubRelease = await FileDataHelper.LoadDataAsync<GitHubRelease>(PathStorage.CurrentRelease, splashScreenManager.CancellationToken);
await HandleOfflineInitializationAsync(splashScreenManager);
}

stopwatch.Stop();
Expand All @@ -114,6 +83,87 @@ public async Task InitializeAsync(ISplashScreenManager splashScreenManager)
}
}

private async Task HandleOnlineInitializationAsync(ISplashScreenManager splashScreenManager, Stopwatch stopwatch)
{
if (_userManager is null) {
throw new NullReferenceException("User manager object is null");
}
if (_userManager.UserSettings is null) {
throw new NullReferenceException("User settings object is null");
}

var isLauncherReleaseCurrent = await IsLauncherReleaseCurrentAsync(splashScreenManager.CancellationToken);
_logger?.LogInformation("Check launcher update time: {Time}", stopwatch.ElapsedMilliseconds);
if (!isLauncherReleaseCurrent) {
var pathLauncherUpdater = Path.Combine(DirectoryStorage.Base, FileNameStorage.SBLauncherUpdater);
await _updaterService.UpdaterAsync(UriStorage.LauncherApiUri, pathLauncherUpdater, splashScreenManager.CancellationToken);

var updater = Launcher.Launch(pathLauncherUpdater);
updater?.Start();

return;
}

_launcherStorage.GitHubRelease = await _gitStorageApiService.GetLastReleaseAsync(cancellationToken: splashScreenManager.CancellationToken);
_logger?.LogInformation("Check last release time: {Time}", stopwatch.ElapsedMilliseconds);

_launcherStorage.IsGameReleaseCurrent = await IsGameReleaseCurrentAsync(splashScreenManager.CancellationToken);
_launcherStorage.IsUserAuthorized = File.Exists(PathStorage.LauncherSetting);

if (_launcherStorage.IsGameReleaseCurrent) {
await HandleGameReleaseCurrentAsync(splashScreenManager);
} else {
await LoadRemoteContent(splashScreenManager, _userManager.UserSettings.Locale);
await Task.Factory.StartNew(() => RemoteLoadWebResourcesAsync(cancellationToken: splashScreenManager.CancellationToken));
}
}

private async Task HandleGameReleaseCurrentAsync(ISplashScreenManager splashScreenManager)
{
if (_userManager is null) {
throw new NullReferenceException("User manager object is null");
}
if (_userManager.UserSettings is null) {
throw new NullReferenceException("User settings object is null");
}

var contentNews = await LocaleLoadCacheAsync<LangNewsContent>(PathStorage.NewsCache) ?? [];
var isContentNews = contentNews.Any(x =>
x.Locale is not null
&& _userManager.UserSettings.Locale is not null
&& x.Locale.Key.Equals(_userManager.UserSettings.Locale.Key));
if (isContentNews) {
_launcherStorage.NewsContents = new(contentNews);
} else {
await LoadRemoteContent(splashScreenManager, _userManager.UserSettings.Locale);
}

var contentRes = await LocaleLoadCacheAsync<WebResource>(PathStorage.WebResourcesCache);
if (contentRes is not null && contentRes.Count != 0) {
_launcherStorage.WebResources = new(contentRes);
} else {
await Task.Factory.StartNew(() => RemoteLoadWebResourcesAsync(cancellationToken: splashScreenManager.CancellationToken));
}
}

private async Task HandleOfflineInitializationAsync(ISplashScreenManager splashScreenManager)
{
if (_userManager is null) {
throw new NullReferenceException("User manager object is null");
}
if (_userManager.UserSettings is null) {
throw new NullReferenceException("User settings object is null");
}

if (_launcherStorage.IsUserAuthorized) {
_launcherStorage.NewsContents = new(LoadErrorNews(_userManager.UserSettings.Locale) ?? []);
} else {
_launcherStorage.NewsContents = new(LoadErrorNews() ?? []);
}

_launcherStorage.GitHubRelease = await FileDataHelper.LoadDataAsync<GitHubRelease>(PathStorage.CurrentRelease, splashScreenManager.CancellationToken);
}

private async Task LoadRemoteContent(ISplashScreenManager splashScreenManager, Locale? locale)
{
if (_launcherStorage.IsUserAuthorized) {
Expand Down Expand Up @@ -162,7 +212,7 @@ private async Task LoadRemoteContent(ISplashScreenManager splashScreenManager, L
/// Checks the connection to github.com.
/// </summary>
/// <returns>True if the connection is established successfully, otherwise false.</returns>
private async Task<bool> CheckGitHubConnectionAsync(CancellationToken cancellationToken = default)
private async Task<bool> IsCheckGitHubConnectionAsync(CancellationToken cancellationToken = default)
{
try {
var response = await _httpClient.GetAsync("https://github.com", cancellationToken);
Expand Down Expand Up @@ -228,19 +278,6 @@ private async Task<bool> IsGameReleaseCurrentAsync(CancellationToken cancellatio
}
}

public void InitializeLocale()
{
var userSettings = _userManager.UserSettings ??
throw new Exception("Error loading user config!");

if (userSettings.Locale is null) {
_logger?.LogError("Locale was not set");
userSettings.Locale = _launcherStorage.Locales[0];
}

_localeManager.SetLocale(userSettings.Locale.Key);
}

private async Task RemoteLoadWebResourcesAsync(CancellationToken cancellationToken = default)
{
try {
Expand Down

0 comments on commit ba6861a

Please sign in to comment.