mirror of
https://github.com/achiez/NebulaAuth-Steam-Desktop-Authenticator-by-Achies.git
synced 2026-07-31 09:06:38 +00:00
Refactor mafile storage: async, modular, bulk rename
- Fix crash: Updated SaveMafileAsync to properly update or add to MaFiles collection - Fix naming logic: Added Filename reset logic to adding new mafile to prevent inconsistent and duplicating import - Extracted mafile path and naming logic to MafilesStorageHelper for better modularity - Refactored Storage methods to use MafilesStorageHelper - Replaced all sync mafile save/add calls with async/await versions throughout the codebase - Performed code cleanups and improved maintainability for mafile-related operations
This commit is contained in:
@@ -4,6 +4,7 @@ using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Exceptions;
|
||||
using NebulaAuth.Model.MAAC;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
|
||||
namespace NebulaAuth;
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@ public partial class Mafile : MobileDataExtended
|
||||
}
|
||||
|
||||
private string? _filename;
|
||||
|
||||
[JsonIgnore] private PortableMaClient? _linkedClient;
|
||||
|
||||
public void SetSessionData(MobileSessionData? sessionData)
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NebulaAuth.Model.MAAC;
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace NebulaAuth.Model.Mafiles;
|
||||
|
||||
public class MafilesBulkRenameResult
|
||||
{
|
||||
public int Total { get; set; }
|
||||
public int Renamed { get; set; }
|
||||
public int NotRenamed => Errors + Conflict;
|
||||
public int Errors { get; set; }
|
||||
public int Conflict { get; set; }
|
||||
public string BackupFileName { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using System.IO;
|
||||
using NebulaAuth.Model.Entities;
|
||||
|
||||
namespace NebulaAuth.Model.Mafiles;
|
||||
|
||||
internal static class MafilesStorageHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns <see cref="Mafile.Filename" /> or creates a new one and updates the property.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetOrUpdateMafilePath(Mafile data)
|
||||
{
|
||||
if (data.Filename != null)
|
||||
{
|
||||
return Path.Combine(Storage.MafilesDirectory, data.Filename);
|
||||
}
|
||||
|
||||
var fileName = CreateMafileFileName(data, Settings.Instance.UseAccountNameAsMafileName);
|
||||
data.Filename = fileName;
|
||||
return Path.Combine(Storage.MafilesDirectory, fileName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates mafile file name according to the current settings.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="useAccountName"></param>
|
||||
/// <returns></returns>
|
||||
public static string CreateMafileFileName(Mafile data, bool useAccountName)
|
||||
{
|
||||
return useAccountName
|
||||
? MafileNamingStrategy.Login.GetMafileName(data)
|
||||
: MafileNamingStrategy.SteamId.GetMafileName(data);
|
||||
}
|
||||
}
|
||||
@@ -11,12 +11,11 @@ using AchiesUtilities.Extensions;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Exceptions;
|
||||
using NebulaAuth.Model.MAAC;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using SteamLib;
|
||||
using SteamLib.Exceptions.Authorization;
|
||||
using SteamLib.SteamMobile;
|
||||
|
||||
namespace NebulaAuth.Model;
|
||||
namespace NebulaAuth.Model.Mafiles;
|
||||
|
||||
public static class Storage
|
||||
{
|
||||
@@ -70,12 +69,13 @@ public static class Storage
|
||||
/// <exception cref="FormatException"></exception>
|
||||
/// <exception cref="SessionInvalidException"></exception>
|
||||
/// <exception cref="IOException"></exception>
|
||||
public static void AddNewMafile(string path, bool overwrite)
|
||||
public static async Task AddNewMafile(string path, bool overwrite)
|
||||
{
|
||||
Mafile data;
|
||||
try
|
||||
{
|
||||
data = ReadMafile(path);
|
||||
data = await ReadMafileAsync(path);
|
||||
data.Filename = null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
when (ex is not MafileNeedReloginException)
|
||||
@@ -96,19 +96,13 @@ public static class Storage
|
||||
throw new FormatException("Can't generate code on this mafile", ex);
|
||||
}
|
||||
|
||||
if (overwrite == false && File.Exists(GetOrCreateMafilePath(data)))
|
||||
if (!overwrite && File.Exists(MafilesStorageHelper.GetOrUpdateMafilePath(data)))
|
||||
{
|
||||
throw new IOException("File already exist and overwrite is False"); //TODO: Custom Exception
|
||||
}
|
||||
|
||||
|
||||
SaveMafile(data);
|
||||
}
|
||||
|
||||
public static Mafile ReadMafile(string path)
|
||||
{
|
||||
var str = File.ReadAllText(path);
|
||||
return NebulaSerializer.Deserialize(str, path);
|
||||
await SaveMafileAsync(data);
|
||||
}
|
||||
|
||||
public static async Task<Mafile> ReadMafileAsync(string path)
|
||||
@@ -117,59 +111,43 @@ public static class Storage
|
||||
return NebulaSerializer.Deserialize(str, path);
|
||||
}
|
||||
|
||||
public static void SaveMafile(Mafile data)
|
||||
{
|
||||
var path = GetOrCreateMafilePath(data);
|
||||
var str = NebulaSerializer.SerializeMafile(data);
|
||||
File.WriteAllText(Path.GetFullPath(path), str);
|
||||
|
||||
var existed = MaFiles.SingleOrDefault(m => m.AccountName == data.AccountName);
|
||||
if (existed != null)
|
||||
{
|
||||
var index = MaFiles.IndexOf(existed);
|
||||
MaFiles[index] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
MaFiles.Add(data);
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task SaveMafileAsync(Mafile data)
|
||||
{
|
||||
var path = GetOrCreateMafilePath(data);
|
||||
var path = MafilesStorageHelper.GetOrUpdateMafilePath(data);
|
||||
var str = NebulaSerializer.SerializeMafile(data);
|
||||
await File.WriteAllTextAsync(Path.GetFullPath(path), str);
|
||||
|
||||
var existed = MaFiles.SingleOrDefault(m => m.AccountName == data.AccountName);
|
||||
if (existed != null)
|
||||
// Replace if exist
|
||||
for (var i = 0; i < MaFiles.Count; i++)
|
||||
{
|
||||
var index = MaFiles.IndexOf(existed);
|
||||
MaFiles[index] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
MaFiles.Add(data);
|
||||
var existed = MaFiles[i];
|
||||
if (ReferenceEquals(existed, data) || (existed.Filename != null && existed.Filename == data.Filename))
|
||||
{
|
||||
MaFiles[i] = data;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
MaFiles.Add(data);
|
||||
}
|
||||
|
||||
public static void UpdateMafile(Mafile data)
|
||||
{
|
||||
var path = GetOrCreateMafilePath(data);
|
||||
var path = MafilesStorageHelper.GetOrUpdateMafilePath(data);
|
||||
var str = NebulaSerializer.SerializeMafile(data);
|
||||
File.WriteAllText(Path.GetFullPath(path), str);
|
||||
}
|
||||
|
||||
public static async Task UpdateMafileAsync(Mafile data)
|
||||
{
|
||||
var path = GetOrCreateMafilePath(data);
|
||||
var path = MafilesStorageHelper.GetOrUpdateMafilePath(data);
|
||||
var str = NebulaSerializer.SerializeMafile(data);
|
||||
await File.WriteAllTextAsync(Path.GetFullPath(path), str);
|
||||
}
|
||||
|
||||
public static void MoveToRemoved(Mafile data)
|
||||
{
|
||||
var sourcePath = GetOrCreateMafilePath(data);
|
||||
var sourcePath = MafilesStorageHelper.GetOrUpdateMafilePath(data);
|
||||
var destinationPath = Path.Combine(DIR_REMOVED_MAFILES, data.Filename + ".mafile");
|
||||
var destinationPathFinal = destinationPath;
|
||||
var i = 0;
|
||||
@@ -184,24 +162,6 @@ public static class Storage
|
||||
MaFiles.Remove(data);
|
||||
}
|
||||
|
||||
private static string GetOrCreateMafilePath(Mafile data)
|
||||
{
|
||||
if (data.Filename != null)
|
||||
{
|
||||
return Path.Combine(MafilesDirectory, data.Filename);
|
||||
}
|
||||
|
||||
var fileName = CreateMafileFileName(data, Settings.Instance.UseAccountNameAsMafileName);
|
||||
data.Filename = fileName;
|
||||
return Path.Combine(MafilesDirectory, fileName);
|
||||
}
|
||||
|
||||
private static string CreateMafileFileName(Mafile data, bool useAccountName)
|
||||
{
|
||||
return useAccountName
|
||||
? MafileNamingStrategy.Login.GetMafileName(data)
|
||||
: MafileNamingStrategy.SteamId.GetMafileName(data);
|
||||
}
|
||||
|
||||
public static string? TryGetMafilePath(Mafile data)
|
||||
{
|
||||
@@ -221,9 +181,10 @@ public static class Storage
|
||||
File.WriteAllText(Path.Combine(DIR_BACKUP_MAFILES, accountName + MafileNamingStrategy.DEF_EXTENSION), data);
|
||||
}
|
||||
|
||||
public static async Task<MafileRenameResult> RenameMafiles(bool loginAsFileName, IProgress<double>? progress = null)
|
||||
public static async Task<MafilesBulkRenameResult> RenameMafiles(bool loginAsFileName,
|
||||
IProgress<double>? progress = null)
|
||||
{
|
||||
if (MaFiles.Count == 0) return new MafileRenameResult();
|
||||
if (MaFiles.Count == 0) return new MafilesBulkRenameResult();
|
||||
var now = DateTime.Now;
|
||||
var backupFileName = $"rename_backup_{now:yyyy-MM-dd_HH-mm-ss}.zip";
|
||||
var zipPath = Path.Combine(BackupMafilesDirectory, backupFileName);
|
||||
@@ -255,7 +216,7 @@ public static class Storage
|
||||
}
|
||||
|
||||
var mafiles = MaFiles.ToList();
|
||||
var res = new MafileRenameResult
|
||||
var res = new MafilesBulkRenameResult
|
||||
{
|
||||
Total = mafiles.Count,
|
||||
BackupFileName = backupFileName
|
||||
@@ -266,7 +227,7 @@ public static class Storage
|
||||
{
|
||||
try
|
||||
{
|
||||
var targetFileName = CreateMafileFileName(mafile, loginAsFileName);
|
||||
var targetFileName = MafilesStorageHelper.CreateMafileFileName(mafile, loginAsFileName);
|
||||
if (mafile.Filename == targetFileName || mafile.Filename == null)
|
||||
{
|
||||
res.Renamed += 1;
|
||||
@@ -314,14 +275,4 @@ public static class Storage
|
||||
res.Errors += 1;
|
||||
}
|
||||
}
|
||||
|
||||
public class MafileRenameResult
|
||||
{
|
||||
public int Total { get; set; }
|
||||
public int Renamed { get; set; }
|
||||
public int NotRenamed => Errors + Conflict;
|
||||
public int Errors { get; set; }
|
||||
public int Conflict { get; set; }
|
||||
public string BackupFileName { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Threading.Tasks;
|
||||
using AchiesUtilities.Web.Models;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using SteamLib.Api.Mobile;
|
||||
using SteamLib.Authentication;
|
||||
using SteamLib.Authentication.LoginV2;
|
||||
|
||||
@@ -12,6 +12,7 @@ using CommunityToolkit.Mvvm.Input;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using NebulaAuth.Utility;
|
||||
using NLog;
|
||||
using SteamLib;
|
||||
@@ -224,7 +225,7 @@ public partial class LinkAccountVM : ObservableObject, ISmsCodeProvider, IPhoneN
|
||||
Logger.Error(ex, "Error during saving Nebula data to mafile");
|
||||
}
|
||||
|
||||
Storage.SaveMafile(mafile);
|
||||
await Storage.SaveMafileAsync(mafile);
|
||||
await Done(mafile.RevocationCode ?? string.Empty, mafile.SteamId.Steam64.ToString(), login);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ using CommunityToolkit.Mvvm.Input;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using NebulaAuth.Utility;
|
||||
using NebulaAuth.ViewModel.Linker;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
@@ -10,6 +10,7 @@ using MaterialDesignThemes.Wpf;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using NebulaAuth.Utility;
|
||||
using NebulaAuth.View;
|
||||
using NebulaAuth.View.Dialogs;
|
||||
|
||||
@@ -13,6 +13,7 @@ using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Exceptions;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using NebulaAuth.Utility;
|
||||
using NebulaAuth.View;
|
||||
using NebulaAuth.View.Dialogs;
|
||||
@@ -78,7 +79,7 @@ public partial class MainVM //File //TODO: Refactor
|
||||
{
|
||||
try
|
||||
{
|
||||
Storage.AddNewMafile(str, confirmOverwrite ?? false);
|
||||
await Storage.AddNewMafile(str, confirmOverwrite ?? false);
|
||||
added++;
|
||||
}
|
||||
catch (FormatException)
|
||||
@@ -92,7 +93,7 @@ public partial class MainVM //File //TODO: Refactor
|
||||
|
||||
if (confirmOverwrite == true)
|
||||
{
|
||||
Storage.AddNewMafile(str, true);
|
||||
await Storage.AddNewMafile(str, true);
|
||||
added++;
|
||||
}
|
||||
else if (confirmOverwrite == false)
|
||||
|
||||
@@ -5,8 +5,8 @@ using AchiesUtilities.Extensions;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
|
||||
namespace NebulaAuth.ViewModel;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.Input;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Entities;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
|
||||
namespace NebulaAuth.ViewModel;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
using SteamLibForked.Models.SteamIds;
|
||||
|
||||
namespace NebulaAuth.ViewModel.Other;
|
||||
|
||||
@@ -6,6 +6,7 @@ using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using NebulaAuth.Core;
|
||||
using NebulaAuth.Model;
|
||||
using NebulaAuth.Model.Mafiles;
|
||||
|
||||
namespace NebulaAuth.ViewModel.Other;
|
||||
|
||||
@@ -53,7 +54,7 @@ public partial class SettingsVM : ObservableObject
|
||||
var targetValue = UseAccountNameAsMafileNamePreview;
|
||||
if (UseAccountNameAsMafileName == targetValue) return;
|
||||
RenameMafilesProgress = 0;
|
||||
Storage.MafileRenameResult? result = null;
|
||||
MafilesBulkRenameResult? result = null;
|
||||
try
|
||||
{
|
||||
result = await Storage.RenameMafiles(targetValue, new Progress<double>(p => RenameMafilesProgress = p));
|
||||
|
||||
Reference in New Issue
Block a user