[Draft] Update 0.8 (#46)

* move stuff out into file transfer manager

* obnoxious unsupported version text, adjustments to filetransfermanager

* add back file upload transfer progress

* restructure code

* cleanup some more stuff I guess

* downloadids by playername

* individual anim/sound bs

* fix migration stuff, finalize impl of individual sound/anim pause

* fixes with logging stuff

* move download manager to transient

* rework dl ui first iteration

* some refactoring and cleanup

* more code cleanup

* refactoring

* switch to hostbuilder

* some more rework I guess

* more refactoring

* clean up mediator calls and disposal

* fun code cleanup

* push error message when log level is set to anything but information in non-debug builds

* remove notificationservice

* move message to after login

* add download bars to gameworld

* fixes download progress bar

* set gpose ui min and max size

* remove unnecessary usings

* adjustments to reconnection logic

* add options to set visible/offline groups visibility

* add impl of uploading display, transfer list in settings ui

* attempt to fix issues with server selection

* add back download status to compact ui

* make dl bar fixed size based

* some fixes for upload/download handling

* adjust text from Syncing back to Uploading

---------

Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
Co-authored-by: Stanley Dimant <stanley.dimant@varian.com>
This commit is contained in:
rootdarkarchon
2023-03-14 19:48:35 +01:00
committed by GitHub
parent 0824ba434b
commit 0c87e84f25
109 changed files with 7323 additions and 6488 deletions

View File

@@ -10,4 +10,4 @@ public static class ConfigurationExtensions
&& !string.IsNullOrEmpty(configuration.CacheFolder)
&& Directory.Exists(configuration.CacheFolder);
}
}
}

View File

@@ -2,12 +2,14 @@
using MareSynchronos.MareConfiguration.Configurations;
using MareSynchronos.MareConfiguration.Configurations.Obsolete;
using MareSynchronos.MareConfiguration.Models;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace MareSynchronos.MareConfiguration;
#pragma warning disable CS0618 // ignore Obsolete tag, the point of this migrator is to migrate obsolete configs to new ones
public class ConfigurationMigrator
public class ConfigurationMigrator : IHostedService
{
private readonly ILogger<ConfigurationMigrator> _logger;
private readonly DalamudPluginInterface _pi;
@@ -20,7 +22,6 @@ public class ConfigurationMigrator
public void Migrate()
{
#pragma warning disable CS0618 // ignore Obsolete tag, the point of this migrator is to migrate obsolete configs to new ones
if (_pi.GetPluginConfig() is Configuration oldConfig)
{
_logger.LogInformation("Migrating Configuration from old config style to 1");
@@ -41,6 +42,24 @@ public class ConfigurationMigrator
}
}
public Task StartAsync(CancellationToken cancellationToken)
{
Migrate();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
private static void SaveConfig(IMareConfiguration config, string path)
{
File.WriteAllText(path, JsonConvert.SerializeObject(config, Formatting.Indented));
}
private string ConfigurationPath(string configName) => Path.Combine(_pi.ConfigDirectory.FullName, configName);
private void MigrateMareConfigV0ToV1(MareConfigV0 mareConfigV0)
{
_logger.LogInformation("Migrating Configuration from version 0 to 1");
@@ -82,13 +101,6 @@ public class ConfigurationMigrator
SaveConfig(tagConfig, ConfigurationPath(ServerTagConfigService.ConfigName));
SaveConfig(notesConfig, ConfigurationPath(NotesConfigService.ConfigName));
}
#pragma warning restore CS0618 // ignore Obsolete tag, the point of this migrator is to migrate obsolete configs to new ones
}
private string ConfigurationPath(string configName) => Path.Combine(_pi.ConfigDirectory.FullName, configName);
private void SaveConfig(IMareConfiguration config, string path)
{
File.WriteAllText(path, JsonConvert.SerializeObject(config, Formatting.Indented));
}
}
#pragma warning restore CS0618 // ignore Obsolete tag, the point of this migrator is to migrate obsolete configs to new ones

View File

@@ -1,26 +1,18 @@
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Configurations;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using MareSynchronos.MareConfiguration.Configurations;
using System.Text.Json;
namespace MareSynchronos.MareConfiguration;
public abstract class ConfigurationServiceBase<T> : IDisposable where T : IMareConfiguration
{
protected abstract string ConfigurationName { get; }
public string ConfigurationDirectory => _pluginInterface.ConfigDirectory.FullName;
public T Current => _currentConfigInternal.Value;
protected readonly DalamudPluginInterface _pluginInterface;
private readonly CancellationTokenSource _periodicCheckCts = new();
private DateTime _configLastWriteTime;
private bool _configIsDirty = false;
private DateTime _configLastWriteTime;
private Lazy<T> _currentConfigInternal;
protected string ConfigurationPath => Path.Combine(ConfigurationDirectory, ConfigurationName);
protected ConfigurationServiceBase(DalamudPluginInterface pluginInterface)
protected ConfigurationServiceBase(string configurationDirectory)
{
_pluginInterface = pluginInterface;
ConfigurationDirectory = configurationDirectory;
Task.Run(CheckForConfigUpdatesInternal, _periodicCheckCts.Token);
Task.Run(CheckForDirtyConfigInternal, _periodicCheckCts.Token);
@@ -28,39 +20,26 @@ public abstract class ConfigurationServiceBase<T> : IDisposable where T : IMareC
_currentConfigInternal = LazyConfig();
}
private Lazy<T> LazyConfig()
{
_configLastWriteTime = GetConfigLastWriteTime();
return new Lazy<T>(() => LoadConfig());
}
private DateTime GetConfigLastWriteTime() => new FileInfo(ConfigurationPath).LastWriteTimeUtc;
public string ConfigurationDirectory { get; init; }
public T Current => _currentConfigInternal.Value;
protected abstract string ConfigurationName { get; }
protected string ConfigurationPath => Path.Combine(ConfigurationDirectory, ConfigurationName);
private async Task CheckForConfigUpdatesInternal()
public void Dispose()
{
while (!_periodicCheckCts.IsCancellationRequested)
{
await Task.Delay(TimeSpan.FromSeconds(5), _periodicCheckCts.Token).ConfigureAwait(false);
var lastWriteTime = GetConfigLastWriteTime();
if (lastWriteTime != _configLastWriteTime)
{
//_logger.LogDebug($"Config {ConfigurationName} changed, reloading config");
_currentConfigInternal = LazyConfig();
}
}
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
private async Task CheckForDirtyConfigInternal()
public void Save()
{
while (!_periodicCheckCts.IsCancellationRequested)
{
if (_configIsDirty)
{
SaveDirtyConfig();
}
_configIsDirty = true;
}
await Task.Delay(TimeSpan.FromSeconds(1), _periodicCheckCts.Token).ConfigureAwait(false);
}
protected virtual void Dispose(bool disposing)
{
_periodicCheckCts.Cancel();
_periodicCheckCts.Dispose();
}
protected T LoadConfig()
@@ -73,7 +52,7 @@ public abstract class ConfigurationServiceBase<T> : IDisposable where T : IMareC
}
else
{
config = JsonConvert.DeserializeObject<T>(File.ReadAllText(ConfigurationPath));
config = JsonSerializer.Deserialize<T>(File.ReadAllText(ConfigurationPath));
if (config == null)
{
config = (T)Activator.CreateInstance(typeof(T))!;
@@ -98,26 +77,54 @@ public abstract class ConfigurationServiceBase<T> : IDisposable where T : IMareC
}
}
//_logger.LogDebug("Saving dirty config " + ConfigurationName);
try
{
File.Copy(ConfigurationPath, ConfigurationPath + ".bak." + DateTime.Now.ToString("yyyyMMddHHmmss"), overwrite: true);
}
catch { }
catch
{
// ignore if file cannot be backupped once
}
File.WriteAllText(ConfigurationPath, JsonConvert.SerializeObject(Current, Formatting.Indented));
File.WriteAllText(ConfigurationPath, JsonSerializer.Serialize(Current, new JsonSerializerOptions()
{
WriteIndented = true
}));
_configLastWriteTime = new FileInfo(ConfigurationPath).LastWriteTimeUtc;
}
public void Save()
private async Task CheckForConfigUpdatesInternal()
{
_configIsDirty = true;
while (!_periodicCheckCts.IsCancellationRequested)
{
await Task.Delay(TimeSpan.FromSeconds(5), _periodicCheckCts.Token).ConfigureAwait(false);
var lastWriteTime = GetConfigLastWriteTime();
if (lastWriteTime != _configLastWriteTime)
{
_currentConfigInternal = LazyConfig();
}
}
}
public void Dispose()
private async Task CheckForDirtyConfigInternal()
{
//_logger.LogTrace($"Disposing {GetType()}");
_periodicCheckCts.Cancel();
while (!_periodicCheckCts.IsCancellationRequested)
{
if (_configIsDirty)
{
SaveDirtyConfig();
}
await Task.Delay(TimeSpan.FromSeconds(1), _periodicCheckCts.Token).ConfigureAwait(false);
}
}
}
private DateTime GetConfigLastWriteTime() => new FileInfo(ConfigurationPath).LastWriteTimeUtc;
private Lazy<T> LazyConfig()
{
_configLastWriteTime = GetConfigLastWriteTime();
return new Lazy<T>(LoadConfig);
}
}

View File

@@ -6,25 +6,31 @@ namespace MareSynchronos.MareConfiguration.Configurations;
[Serializable]
public class MareConfig : IMareConfiguration
{
public int Version { get; set; } = 1;
public bool AcceptedAgreement { get; set; } = false;
public string CacheFolder { get; set; } = string.Empty;
public double MaxLocalCacheInGiB { get; set; } = 20;
public bool ReverseUserSort { get; set; } = false;
public int TimeSpanBetweenScansInSeconds { get; set; } = 30;
public bool FileScanPaused { get; set; } = false;
public bool InitialScanComplete { get; set; } = false;
public bool DisableOptionalPluginWarnings { get; set; } = false;
public NotificationLocation ErrorNotification { get; set; } = NotificationLocation.Both;
public bool FileScanPaused { get; set; } = false;
public NotificationLocation InfoNotification { get; set; } = NotificationLocation.Toast;
public bool InitialScanComplete { get; set; } = false;
public LogLevel LogLevel { get; set; } = LogLevel.Information;
public bool LogPerformance { get; set; } = false;
public double MaxLocalCacheInGiB { get; set; } = 20;
public bool OpenGposeImportOnGposeStart { get; set; } = false;
public bool ShowTransferWindow { get; set; } = true;
public bool OpenPopupOnAdd { get; set; } = true;
public int ParallelDownloads { get; set; } = 10;
public bool ReverseUserSort { get; set; } = false;
public bool ShowCharacterNameInsteadOfNotesForVisible { get; set; } = false;
public bool ShowOfflineUsersSeparately { get; set; } = true;
public bool ShowOnlineNotifications { get; set; } = false;
public bool ShowOnlineNotificationsOnlyForIndividualPairs { get; set; } = true;
public bool ShowOnlineNotificationsOnlyForNamedPairs { get; set; } = false;
public bool ShowCharacterNameInsteadOfNotesForVisible { get; set; } = false;
public NotificationLocation InfoNotification { get; set; } = NotificationLocation.Toast;
public bool ShowTransferBars { get; set; } = true;
public bool ShowTransferWindow { get; set; } = false;
public bool ShowUploading { get; set; } = true;
public bool ShowUploadingBigText { get; set; } = true;
public bool ShowVisibleUsersSeparately { get; set; } = true;
public int TimeSpanBetweenScansInSeconds { get; set; } = 30;
public int Version { get; set; } = 1;
public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both;
public NotificationLocation ErrorNotification { get; set; } = NotificationLocation.Both;
public LogLevel LogLevel { get; set; } = LogLevel.Information;
public bool LogPerformance { get; set; } = false;
}
}

View File

@@ -1,6 +1,6 @@
using Dalamud.Configuration;
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Models;
using MareSynchronos.MareConfiguration.Models.Obsolete;
using MareSynchronos.WebAPI;
using Microsoft.Extensions.Logging;
@@ -46,12 +46,12 @@ public class Configuration : IPluginConfiguration
/// The dictionary first maps a server URL to a dictionary, and that
/// dictionary maps the OtherUID of the <see cref="ClientPairDto"/> to a list of tags.
/// </summary>
public Dictionary<string, Dictionary<string, List<string>>> UidServerPairedUserTags = new(StringComparer.Ordinal);
public Dictionary<string, Dictionary<string, List<string>>> UidServerPairedUserTags { get; set; } = new(StringComparer.Ordinal);
/// <summary>
/// A dictionary that maps a server URL to the tags the user has added for that server.
/// </summary>
public Dictionary<string, HashSet<string>> ServerAvailablePairTags = new(StringComparer.Ordinal);
public HashSet<string> OpenPairTags = new(StringComparer.Ordinal);
public Dictionary<string, HashSet<string>> ServerAvailablePairTags { get; set; } = new(StringComparer.Ordinal);
public HashSet<string> OpenPairTags { get; set; } = new(StringComparer.Ordinal);
public MareConfigV0 ToMareConfig(ILogger logger)
{
@@ -75,7 +75,7 @@ public class Configuration : IPluginConfiguration
// create all server storage based on current clientsecret
foreach (var secret in ClientSecret)
{
logger.LogDebug("Migrating " + secret.Key);
logger.LogDebug("Migrating {key}", secret.Key);
var apiuri = secret.Key;
var secretkey = secret.Value;
ServerStorageV0 toAdd = new();
@@ -121,9 +121,4 @@ public class Configuration : IPluginConfiguration
return newConfig;
}
public void Migrate()
{
}
}

View File

@@ -1,4 +1,5 @@
using MareSynchronos.MareConfiguration.Models;
using MareSynchronos.MareConfiguration.Models.Obsolete;
namespace MareSynchronos.MareConfiguration.Configurations.Obsolete;

View File

@@ -5,5 +5,5 @@ namespace MareSynchronos.MareConfiguration.Configurations;
public class UidNotesConfig : IMareConfiguration
{
public int Version { get; set; } = 0;
public Dictionary<string, ServerNotesStorage> ServerNotes = new(StringComparer.Ordinal);
public Dictionary<string, ServerNotesStorage> ServerNotes { get; set; } = new(StringComparer.Ordinal);
}

View File

@@ -1,13 +1,14 @@
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Configurations;
using Microsoft.Extensions.Logging;
using MareSynchronos.MareConfiguration.Configurations;
namespace MareSynchronos.MareConfiguration;
public class MareConfigService : ConfigurationServiceBase<MareConfig>
{
public const string ConfigName = "config.json";
protected override string ConfigurationName => ConfigName;
public MareConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { }
}
public MareConfigService(string configDir) : base(configDir)
{
}
protected override string ConfigurationName => ConfigName;
}

View File

@@ -1,4 +1,4 @@
namespace MareSynchronos.MareConfiguration.Models;
namespace MareSynchronos.MareConfiguration.Models.Obsolete;
[Serializable]
[Obsolete("Deprecated, use ServerStorage")]
@@ -9,7 +9,7 @@ public class ServerStorageV0
public List<Authentication> Authentications { get; set; } = new();
public Dictionary<string, string> UidServerComments { get; set; } = new(StringComparer.Ordinal);
public Dictionary<string, string> GidServerComments { get; set; } = new(StringComparer.Ordinal);
public Dictionary<string, List<string>> UidServerPairedUserTags = new(StringComparer.Ordinal);
public Dictionary<string, List<string>> UidServerPairedUserTags { get; set; } = new(StringComparer.Ordinal);
public HashSet<string> ServerAvailablePairTags { get; set; } = new(StringComparer.Ordinal);
public HashSet<string> OpenPairTags { get; set; } = new(StringComparer.Ordinal);
public Dictionary<int, SecretKey> SecretKeys { get; set; } = new();
@@ -19,11 +19,11 @@ public class ServerStorageV0
{
return new ServerStorage()
{
ServerUri = this.ServerUri,
ServerName = this.ServerName,
Authentications = this.Authentications.ToList(),
FullPause = this.FullPause,
SecretKeys = this.SecretKeys.ToDictionary(p => p.Key, p => p.Value)
ServerUri = ServerUri,
ServerName = ServerName,
Authentications = Authentications.ToList(),
FullPause = FullPause,
SecretKeys = SecretKeys.ToDictionary(p => p.Key, p => p.Value)
};
}
}

View File

@@ -3,7 +3,7 @@
[Serializable]
public class ServerTagStorage
{
public Dictionary<string, List<string>> UidServerPairedUserTags = new(StringComparer.Ordinal);
public Dictionary<string, List<string>> UidServerPairedUserTags { get; set; } = new(StringComparer.Ordinal);
public HashSet<string> ServerAvailablePairTags { get; set; } = new(StringComparer.Ordinal);
public HashSet<string> OpenPairTags { get; set; } = new(StringComparer.Ordinal);
}

View File

@@ -1,12 +1,14 @@
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Configurations;
using Microsoft.Extensions.Logging;
using MareSynchronos.MareConfiguration.Configurations;
namespace MareSynchronos.MareConfiguration;
public class NotesConfigService : ConfigurationServiceBase<UidNotesConfig>
{
public const string ConfigName = "notes.json";
public NotesConfigService(string configDir) : base(configDir)
{
}
protected override string ConfigurationName => ConfigName;
public NotesConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { }
}

View File

@@ -1,12 +1,14 @@
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Configurations;
using Microsoft.Extensions.Logging;
using MareSynchronos.MareConfiguration.Configurations;
namespace MareSynchronos.MareConfiguration;
public class ServerConfigService : ConfigurationServiceBase<ServerConfig>
{
public const string ConfigName = "server.json";
public ServerConfigService(string configDir) : base(configDir)
{
}
protected override string ConfigurationName => ConfigName;
public ServerConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { }
}
}

View File

@@ -1,12 +1,14 @@
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Configurations;
using Microsoft.Extensions.Logging;
using MareSynchronos.MareConfiguration.Configurations;
namespace MareSynchronos.MareConfiguration;
public class ServerTagConfigService : ConfigurationServiceBase<ServerTagConfig>
{
public const string ConfigName = "servertags.json";
public ServerTagConfigService(string configDir) : base(configDir)
{
}
protected override string ConfigurationName => ConfigName;
public ServerTagConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { }
}

View File

@@ -1,12 +1,14 @@
using Dalamud.Plugin;
using MareSynchronos.MareConfiguration.Configurations;
using Microsoft.Extensions.Logging;
using MareSynchronos.MareConfiguration.Configurations;
namespace MareSynchronos.MareConfiguration;
public class TransientConfigService : ConfigurationServiceBase<TransientConfig>
{
public const string ConfigName = "transient.json";
public TransientConfigService(string configDir) : base(configDir)
{
}
protected override string ConfigurationName => ConfigName;
public TransientConfigService(DalamudPluginInterface pluginInterface) : base(pluginInterface) { }
}
}