Improved app start up

Fixed issues with extraction
This commit is contained in:
Jeddunk 2021-01-13 13:04:35 +01:00
parent 8a4e601236
commit 478d5196a6
10 changed files with 84 additions and 91 deletions

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
@ -19,6 +20,7 @@ namespace auto_creamapi.Converters
protected override string Convert(ObservableCollection<SteamApp> value, Type targetType, object parameter, protected override string Convert(ObservableCollection<SteamApp> value, Type targetType, object parameter,
CultureInfo culture) CultureInfo culture)
{ {
if (value == null) return "";
MyLogger.Log.Debug("ListOfDLcToStringConverter: Convert"); MyLogger.Log.Debug("ListOfDLcToStringConverter: Convert");
var dlcListToString = DlcListToString(value); var dlcListToString = DlcListToString(value);
return dlcListToString.GetType() == targetType ? dlcListToString : ""; return dlcListToString.GetType() == targetType ? dlcListToString : "";
@ -52,7 +54,7 @@ namespace auto_creamapi.Converters
return result; return result;
} }
private static string DlcListToString(ObservableCollection<SteamApp> value) private static string DlcListToString(IEnumerable<SteamApp> value)
{ {
var result = ""; var result = "";
//value.ForEach(x => result += $"{x}\n"); //value.ForEach(x => result += $"{x}\n");

View File

@ -65,10 +65,10 @@ namespace auto_creamapi.Services
var httpCall = client.GetAsync(SteamUri); var httpCall = client.GetAsync(SteamUri);
var response = await httpCall.ConfigureAwait(false); var response = await httpCall.ConfigureAwait(false);
var readAsStringAsync = response.Content.ReadAsStringAsync(); var readAsStringAsync = response.Content.ReadAsStringAsync();
var responseBody = await readAsStringAsync; var responseBody = await readAsStringAsync.ConfigureAwait(false);
MyLogger.Log.Information("Got content from API successfully. Writing to file..."); MyLogger.Log.Information("Got content from API successfully. Writing to file...");
await File.WriteAllTextAsync(CachePath, responseBody, Encoding.UTF8); await File.WriteAllTextAsync(CachePath, responseBody, Encoding.UTF8).ConfigureAwait(false);
var cacheString = responseBody; var cacheString = responseBody;
MyLogger.Log.Information("Cache written to file successfully."); MyLogger.Log.Information("Cache written to file successfully.");
return cacheString; return cacheString;
@ -141,12 +141,12 @@ namespace auto_creamapi.Services
MyLogger.Log.Information("Get SteamDB App"); MyLogger.Log.Information("Get SteamDB App");
var httpCall = client.GetAsync(steamDbUri); var httpCall = client.GetAsync(steamDbUri);
var response = await httpCall; var response = await httpCall.ConfigureAwait(false);
MyLogger.Log.Debug(httpCall.Status.ToString()); MyLogger.Log.Debug(httpCall.Status.ToString());
MyLogger.Log.Debug(response.EnsureSuccessStatusCode().ToString()); MyLogger.Log.Debug(response.EnsureSuccessStatusCode().ToString());
var readAsStringAsync = response.Content.ReadAsStringAsync(); var readAsStringAsync = response.Content.ReadAsStringAsync();
var responseBody = await readAsStringAsync; var responseBody = await readAsStringAsync.ConfigureAwait(false);
MyLogger.Log.Debug(readAsStringAsync.Status.ToString()); MyLogger.Log.Debug(readAsStringAsync.Status.ToString());
var parser = new HtmlParser(); var parser = new HtmlParser();

View File

@ -38,7 +38,7 @@ namespace auto_creamapi.Services
bool unlockAll, bool unlockAll,
bool extraProtection, bool extraProtection,
bool forceOffline, bool forceOffline,
ObservableCollection<SteamApp> dlcList); IEnumerable<SteamApp> dlcList);
public bool ConfigExists(); public bool ConfigExists();
} }
@ -47,7 +47,7 @@ namespace auto_creamapi.Services
{ {
private string _configFilePath; private string _configFilePath;
public CreamConfig Config { get; set; } public CreamConfig Config { get; private set; }
public void Initialize() public void Initialize()
{ {
@ -144,7 +144,7 @@ namespace auto_creamapi.Services
bool unlockAll, bool unlockAll,
bool extraProtection, bool extraProtection,
bool forceOffline, bool forceOffline,
ObservableCollection<SteamApp> dlcList) IEnumerable<SteamApp> dlcList)
{ {
Config.AppId = appId; Config.AppId = appId;
Config.Language = language; Config.Language = language;

View File

@ -103,16 +103,13 @@ namespace auto_creamapi.Services
private static string GetHash(string filename) private static string GetHash(string filename)
{ {
if (File.Exists(filename)) if (!File.Exists(filename)) return "";
{ using var md5 = MD5.Create();
using var md5 = MD5.Create(); using var stream = File.OpenRead(filename);
using var stream = File.OpenRead(filename); return BitConverter
return BitConverter .ToString(md5.ComputeHash(stream))
.ToString(md5.ComputeHash(stream)) .Replace("-", string.Empty);
.Replace("-", string.Empty);
}
return "";
} }
} }
} }

View File

@ -17,8 +17,6 @@ namespace auto_creamapi.Services
{ {
public interface IDownloadCreamApiService public interface IDownloadCreamApiService
{ {
/*public void Initialize();
public Task InitializeAsync();*/
public Task<string> Download(string username, string password); public Task<string> Download(string username, string password);
public Task Extract(string filename); public Task Extract(string filename);
} }
@ -26,10 +24,7 @@ namespace auto_creamapi.Services
public class DownloadCreamApiService : IDownloadCreamApiService public class DownloadCreamApiService : IDownloadCreamApiService
{ {
private const string ArchivePassword = "cs.rin.ru"; private const string ArchivePassword = "cs.rin.ru";
//private string _filename;
private readonly IMvxMessenger _messenger; private readonly IMvxMessenger _messenger;
//private DownloadWindow _wnd;
public DownloadCreamApiService(IMvxMessenger messenger) public DownloadCreamApiService(IMvxMessenger messenger)
{ {
@ -50,23 +45,25 @@ namespace auto_creamapi.Services
new KeyValuePair<string, string>("login", "login") new KeyValuePair<string, string>("login", "login")
}); });
MyLogger.Log.Debug("Download: post login"); MyLogger.Log.Debug("Download: post login");
var response1 = await client.PostAsync("https://cs.rin.ru/forum/ucp.php?mode=login", formContent); var response1 = await client.PostAsync("https://cs.rin.ru/forum/ucp.php?mode=login", formContent)
.ConfigureAwait(false);
MyLogger.Log.Debug($"Login Status Code: {response1.EnsureSuccessStatusCode().StatusCode.ToString()}"); MyLogger.Log.Debug($"Login Status Code: {response1.EnsureSuccessStatusCode().StatusCode.ToString()}");
var cookie = container.GetCookies(new Uri("https://cs.rin.ru/forum/ucp.php?mode=login")) var cookie = container.GetCookies(new Uri("https://cs.rin.ru/forum/ucp.php?mode=login"))
.FirstOrDefault(c => c.Name.Contains("_sid")); .FirstOrDefault(c => c.Name.Contains("_sid"));
MyLogger.Log.Debug($"Login Cookie: {cookie}"); MyLogger.Log.Debug($"Login Cookie: {cookie}");
var response2 = await client.GetAsync("https://cs.rin.ru/forum/viewtopic.php?t=70576"); var response2 = await client.GetAsync("https://cs.rin.ru/forum/viewtopic.php?t=70576")
.ConfigureAwait(false);
MyLogger.Log.Debug( MyLogger.Log.Debug(
$"Download Page Status Code: {response2.EnsureSuccessStatusCode().StatusCode.ToString()}"); $"Download Page Status Code: {response2.EnsureSuccessStatusCode().StatusCode.ToString()}");
var content = response2.Content.ReadAsStringAsync(); var content = response2.Content.ReadAsStringAsync();
var contentResult = await content; var contentResult = await content.ConfigureAwait(false);
var expression = var expression =
new Regex(".*<a href=\"\\.(?<url>\\/download\\/file\\.php\\?id=.*)\">(?<filename>.*)<\\/a>.*"); new Regex(".*<a href=\"\\.(?<url>\\/download\\/file\\.php\\?id=.*)\">(?<filename>.*)<\\/a>.*");
using var reader = new StringReader(contentResult); using var reader = new StringReader(contentResult);
string line; string line;
var archiveFileList = new Dictionary<string, string>(); var archiveFileList = new Dictionary<string, string>();
while ((line = await reader.ReadLineAsync()) != null) while ((line = await reader.ReadLineAsync().ConfigureAwait(false)) != null)
{ {
var match = expression.Match(line); var match = expression.Match(line);
// ReSharper disable once InvertIf // ReSharper disable once InvertIf
@ -80,7 +77,6 @@ namespace auto_creamapi.Services
MyLogger.Log.Debug("Choosing first element from list..."); MyLogger.Log.Debug("Choosing first element from list...");
var (filename, url) = archiveFileList.FirstOrDefault(); var (filename, url) = archiveFileList.FirstOrDefault();
//filename = filename;
if (File.Exists(filename)) if (File.Exists(filename))
{ {
MyLogger.Log.Information($"{filename} already exists, skipping download..."); MyLogger.Log.Information($"{filename} already exists, skipping download...");
@ -92,7 +88,7 @@ namespace auto_creamapi.Services
x => _messenger.Publish(new ProgressMessage(this, "Downloading...", filename, x))); x => _messenger.Publish(new ProgressMessage(this, "Downloading...", filename, x)));
await using var fileStream = File.OpenWrite(filename); await using var fileStream = File.OpenWrite(filename);
var task = client.GetAsync(url, fileStream, progress); var task = client.GetAsync(url, fileStream, progress);
var response = await task; await task.ConfigureAwait(false);
if (task.IsCompletedSuccessfully) if (task.IsCompletedSuccessfully)
_messenger.Publish(new ProgressMessage(this, "Downloading...", filename, 1.0)); _messenger.Publish(new ProgressMessage(this, "Downloading...", filename, 1.0));
MyLogger.Log.Information("Download done."); MyLogger.Log.Information("Download done.");
@ -107,23 +103,47 @@ namespace auto_creamapi.Services
const string steamApi64Dll = "steam_api64.dll"; const string steamApi64Dll = "steam_api64.dll";
const string steamApiDll = "steam_api.dll"; const string steamApiDll = "steam_api.dll";
MyLogger.Log.Information($@"Start extraction of ""{filename}""..."); MyLogger.Log.Information($@"Start extraction of ""{filename}""...");
var expression1 = new Regex(@"nonlog_build\\steam_api(?:64)?\.dll"); try
_messenger.Publish(new ProgressMessage(this, "Extracting...", filename, 1.0));
SevenZipBase.SetLibraryPath(Path.Combine(cwd, "resources/7z.dll"));
using (var extractor =
new SevenZipExtractor(filename, ArchivePassword, InArchiveFormat.Rar)
{PreserveDirectoryStructure = false})
{ {
await extractor.ExtractFilesAsync(cwd, var nonlogBuildPath = Path.Combine(cwd, nonlogBuild);
$"{nonlogBuild}\\{steamApi64Dll}", if (Directory.Exists(nonlogBuildPath))
$"{nonlogBuild}\\{steamApiDll}"); Directory.Delete(nonlogBuildPath, true);
_messenger.Publish(new ProgressMessage(this, "Extracting...", filename, 1.0));
SevenZipBase.SetLibraryPath(Path.Combine(cwd, "resources/7z.dll"));
using (var extractor =
new SevenZipExtractor(filename, ArchivePassword, InArchiveFormat.Rar)
{PreserveDirectoryStructure = false})
{
await extractor.ExtractFilesAsync(
cwd,
$@"{nonlogBuild}\{steamApi64Dll}",
$@"{nonlogBuild}\{steamApiDll}"
).ConfigureAwait(false);
}
if (File.Exists(Path.Combine(nonlogBuildPath, steamApi64Dll)))
File.Move(
Path.Combine(cwd, nonlogBuild, steamApi64Dll),
Path.Combine(cwd, steamApi64Dll),
true
);
if (File.Exists(Path.Combine(nonlogBuildPath, steamApiDll)))
File.Move(
Path.Combine(nonlogBuildPath, steamApiDll),
Path.Combine(cwd, steamApiDll),
true
);
if (Directory.Exists(nonlogBuildPath))
Directory.Delete(nonlogBuildPath, true);
MyLogger.Log.Information("Extraction done!");
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
} }
if (File.Exists(Path.Combine(cwd, nonlogBuild, steamApi64Dll)))
File.Move(Path.Combine(cwd, nonlogBuild, steamApi64Dll), Path.Combine(cwd, steamApi64Dll));
if (File.Exists(Path.Combine(cwd, nonlogBuild, steamApiDll)))
File.Move(Path.Combine(cwd, nonlogBuild, steamApiDll), Path.Combine(cwd, steamApiDll));
Directory.Delete(Path.Combine(cwd, nonlogBuild));
MyLogger.Log.Information("Extraction done!");
} }
} }
} }

View File

@ -9,6 +9,7 @@ using MvvmCross.ViewModels;
namespace auto_creamapi.ViewModels namespace auto_creamapi.ViewModels
{ {
public class DownloadViewModel : MvxNavigationViewModel public class DownloadViewModel : MvxNavigationViewModel
{ {
private readonly IDownloadCreamApiService _download; private readonly IDownloadCreamApiService _download;
@ -63,18 +64,18 @@ namespace auto_creamapi.ViewModels
public override async Task Initialize() public override async Task Initialize()
{ {
await base.Initialize(); await base.Initialize().ConfigureAwait(false);
InfoLabel = "Please wait..."; InfoLabel = "Please wait...";
FilenameLabel = ""; FilenameLabel = "";
Progress = 0.0; Progress = 0.0;
var download = _download.Download(Secrets.ForumUsername, Secrets.ForumPassword); var download = _download.Download(Secrets.ForumUsername, Secrets.ForumPassword);
var filename = await download; var filename = await download.ConfigureAwait(false);
/*var extract = _download.Extract(filename); /*var extract = _download.Extract(filename);
await extract;*/ await extract;*/
var extract = _download.Extract(filename); var extract = _download.Extract(filename);
await extract.ConfigureAwait(false); await extract.ConfigureAwait(false);
_token.Dispose(); _token.Dispose();
await _navigationService.Close(this); await _navigationService.Close(this).ConfigureAwait(false);
} }
private void OnProgressMessage(ProgressMessage obj) private void OnProgressMessage(ProgressMessage obj)

View File

@ -52,14 +52,16 @@ namespace auto_creamapi.ViewModels
//_download = download; //_download = download;
} }
public override async Task Initialize() public override async void Prepare()
{ {
base.Prepare();
_config.Initialize(); _config.Initialize();
var tasks = new List<Task> {base.Initialize(), _cache.Initialize()}; var tasks = new List<Task> {_cache.Initialize()};
if (!File.Exists("steam_api.dll") | !File.Exists("steam_api64.dll")) if (!File.Exists("steam_api.dll") | !File.Exists("steam_api64.dll"))
tasks.Add(_navigationService.Navigate<DownloadViewModel>()); tasks.Add(_navigationService.Navigate<DownloadViewModel>());
//tasks.Add(_navigationService.Navigate<DownloadViewModel>());
tasks.Add(_dll.Initialize()); tasks.Add(_dll.Initialize());
await Task.WhenAll(tasks); await Task.WhenAll(tasks).ConfigureAwait(false);
Languages = new ObservableCollection<string>(Misc.DefaultLanguages); Languages = new ObservableCollection<string>(Misc.DefaultLanguages);
ResetForm(); ResetForm();
UseSteamDb = true; UseSteamDb = true;
@ -67,11 +69,16 @@ namespace auto_creamapi.ViewModels
Status = "Ready."; Status = "Ready.";
} }
public override Task Initialize()
{
return base.Initialize();
}
// // COMMANDS // // // // COMMANDS // //
public IMvxCommand OpenFileCommand => new MvxAsyncCommand(OpenFile); public IMvxCommand OpenFileCommand => new MvxAsyncCommand(OpenFile);
public IMvxCommand SearchCommand => new MvxAsyncCommand(async () => await Search()); //Command(Search); public IMvxCommand SearchCommand => new MvxAsyncCommand(async () => await Search().ConfigureAwait(false)); //Command(Search);
public IMvxCommand GetListOfDlcCommand => new MvxAsyncCommand(GetListOfDlc); public IMvxCommand GetListOfDlcCommand => new MvxAsyncCommand(GetListOfDlc);
@ -110,7 +117,6 @@ namespace auto_creamapi.ViewModels
{ {
_gameName = value; _gameName = value;
RaisePropertyChanged(() => GameName); RaisePropertyChanged(() => GameName);
//MyLogger.Log.Debug($"GameName: {value}");
} }
} }
@ -132,7 +138,6 @@ namespace auto_creamapi.ViewModels
{ {
_lang = value; _lang = value;
RaisePropertyChanged(() => Lang); RaisePropertyChanged(() => Lang);
//MyLogger.Log.Debug($"Lang: {value}");
} }
} }
@ -269,8 +274,8 @@ namespace auto_creamapi.ViewModels
: -1; : -1;
var s = index > -1 ? strings[index] : null; var s = index > -1 ? strings[index] : null;
if (s != null) GameName = s; if (s != null) GameName = s;
await Search(); await Search().ConfigureAwait(false);
await GetListOfDlc(); await GetListOfDlc().ConfigureAwait(false);
} }
Status = "Ready."; Status = "Ready.";
@ -297,7 +302,7 @@ namespace auto_creamapi.ViewModels
MainWindowEnabled = false; MainWindowEnabled = false;
var navigate = _navigationService.Navigate<SearchResultViewModel, IEnumerable<SteamApp>, SteamApp>( var navigate = _navigationService.Navigate<SearchResultViewModel, IEnumerable<SteamApp>, SteamApp>(
_cache.GetListOfAppsByName(GameName)); _cache.GetListOfAppsByName(GameName));
await navigate; await navigate.ConfigureAwait(false);
var navigateResult = navigate.Result; var navigateResult = navigate.Result;
if (navigateResult != null) if (navigateResult != null)
{ {
@ -306,7 +311,7 @@ namespace auto_creamapi.ViewModels
} }
} }
await GetListOfDlc(); await GetListOfDlc().ConfigureAwait(false);
} }
else else
{ {
@ -324,7 +329,7 @@ namespace auto_creamapi.ViewModels
var app = new SteamApp {AppId = AppId, Name = GameName}; var app = new SteamApp {AppId = AppId, Name = GameName};
var task = _cache.GetListOfDlc(app, UseSteamDb, IgnoreUnknown); var task = _cache.GetListOfDlc(app, UseSteamDb, IgnoreUnknown);
MainWindowEnabled = false; MainWindowEnabled = false;
var listOfDlc = await task; var listOfDlc = await task.ConfigureAwait(false);
if (task.IsCompletedSuccessfully) if (task.IsCompletedSuccessfully)
{ {
listOfDlc.Sort((app1, app2) => app1.AppId.CompareTo(app2.AppId)); listOfDlc.Sort((app1, app2) => app1.AppId.CompareTo(app2.AppId));

View File

@ -67,7 +67,7 @@ namespace auto_creamapi.ViewModels
if (Selected != null) if (Selected != null)
{ {
MyLogger.Log.Information($"Successfully got app {Selected}"); MyLogger.Log.Information($"Successfully got app {Selected}");
await _navigationService.Close(this, Selected); await _navigationService.Close(this, Selected).ConfigureAwait(false);
} }
} }

View File

@ -102,7 +102,7 @@
VerticalAlignment="Bottom" Width="108" Command="{Binding GetListOfDlcCommand}" Grid.Row="4" /> VerticalAlignment="Bottom" Width="108" Command="{Binding GetListOfDlcCommand}" Grid.Row="4" />
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Header="Status" Grid.Row="1" VerticalAlignment="Bottom" IsEnabled="False"> <GroupBox Header="Status" Grid.Row="1" VerticalAlignment="Bottom" IsEnabled="False" Margin="0,10,0,0">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />

View File

@ -11,38 +11,6 @@ namespace auto_creamapi.Views
public SearchResultView() public SearchResultView()
{ {
InitializeComponent(); InitializeComponent();
//DgApps.ItemsSource = list;
} }
/*private void OK_OnClick(object sender, RoutedEventArgs e)
{
GetSelectedApp();
}
private void DgApps_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
GetSelectedApp();
}
private void Cancel_OnClick(object sender, RoutedEventArgs e)
{
Close();
}
private void GetSelectedApp()
{
if (Application.Current.MainWindow is MainWindow currentMainWindow)
{
var app = (SteamApp) DgApps.SelectedItem;
if (app != null)
{
MyLogger.Log.Information($"Successfully got app {app}");
//currentMainWindow.Game.Text = app.Name;
//currentMainWindow.AppId.Text = app.AppId.ToString();
}
}
Close();
}*/
} }
} }