From 6b06b7fb82b2fc61a3299c318a2aba11f9bd27a2 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Thu, 1 Aug 2019 21:21:43 +0200 Subject: [PATCH] Misc code review @abrynos forgot to add logic for deleted IPC.config file :grin: --- ArchiSteamFarm/ASF.cs | 122 +++++++++++++++++++++-------------- ArchiSteamFarm/Bot.cs | 2 +- ArchiSteamFarm/SharedInfo.cs | 4 +- 3 files changed, 75 insertions(+), 53 deletions(-) diff --git a/ArchiSteamFarm/ASF.cs b/ArchiSteamFarm/ASF.cs index 9ea062072..7f061eb71 100644 --- a/ArchiSteamFarm/ASF.cs +++ b/ArchiSteamFarm/ASF.cs @@ -286,22 +286,22 @@ namespace ArchiSteamFarm { } } - private static async Task CanHandleWriteEvent(string name) { - if (string.IsNullOrEmpty(name)) { - ArchiLogger.LogNullError(nameof(name)); + private static async Task CanHandleWriteEvent(string filePath) { + if (string.IsNullOrEmpty(filePath)) { + ArchiLogger.LogNullError(nameof(filePath)); return false; } // Save our event in dictionary object currentWriteEvent = new object(); - LastWriteEvents[name] = currentWriteEvent; + LastWriteEvents[filePath] = currentWriteEvent; // Wait a second for eventual other events to arrive await Task.Delay(1000).ConfigureAwait(false); // We're allowed to handle this event if the one that is saved after full second is our event and we succeed in clearing it (we don't care what we're clearing anymore, it doesn't have to be atomic operation) - return LastWriteEvents.TryGetValue(name, out object savedWriteEvent) && (currentWriteEvent == savedWriteEvent) && LastWriteEvents.TryRemove(name, out _); + return LastWriteEvents.TryGetValue(filePath, out object savedWriteEvent) && (currentWriteEvent == savedWriteEvent) && LastWriteEvents.TryRemove(filePath, out _); } private static void InitBotsComparer(StringComparer botsComparer) { @@ -373,7 +373,7 @@ namespace ArchiSteamFarm { string extension = Path.GetExtension(name); switch (extension) { - case SharedInfo.ConfigExtension: + case SharedInfo.JsonConfigExtension: case SharedInfo.IPCConfigExtension: await OnChangedConfigFile(name, fullPath).ConfigureAwait(false); @@ -385,6 +385,26 @@ namespace ArchiSteamFarm { } } + private static async Task OnChangedIPCFile(string name) { + if (string.IsNullOrEmpty(name)) { + ArchiLogger.LogNullError(nameof(name)); + + return; + } + + if (!name.Equals(SharedInfo.IPCConfigFile) || (GlobalConfig?.IPC != true)) { + return; + } + + if (!await CanHandleWriteEvent(name).ConfigureAwait(false)) { + return; + } + + ArchiLogger.LogGenericInfo(Strings.IPCConfigChanged); + await ArchiKestrel.Stop().ConfigureAwait(false); + await ArchiKestrel.Start().ConfigureAwait(false); + } + private static async Task OnChangedKeysFile(string name, string fullPath) { if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(fullPath)) { ArchiLogger.LogNullError(nameof(name) + " || " + nameof(fullPath)); @@ -416,10 +436,10 @@ namespace ArchiSteamFarm { switch (extension) { case SharedInfo.IPCConfigExtension: - await OnCreatedConfigFile(name).ConfigureAwait(false); + await OnChangedIPCFile(name).ConfigureAwait(false); break; - case SharedInfo.ConfigExtension: + case SharedInfo.JsonConfigExtension: await OnCreatedJsonFile(name, fullPath).ConfigureAwait(false); break; @@ -436,7 +456,7 @@ namespace ArchiSteamFarm { string extension = Path.GetExtension(name); switch (extension) { - case SharedInfo.ConfigExtension: + case SharedInfo.JsonConfigExtension: await OnCreatedConfigFile(name, fullPath).ConfigureAwait(false); break; @@ -448,26 +468,6 @@ namespace ArchiSteamFarm { } } - private static async Task OnCreatedConfigFile(string name) { - if (string.IsNullOrEmpty(name)) { - ArchiLogger.LogNullError(nameof(name)); - - return; - } - - if (!name.Equals(SharedInfo.IPCConfigFile) || (GlobalConfig?.IPC != true)) { - return; - } - - if (!await CanHandleWriteEvent(name).ConfigureAwait(false)) { - return; - } - - ArchiLogger.LogGenericInfo(Strings.IPCConfigChanged); - await ArchiKestrel.Stop().ConfigureAwait(false); - await ArchiKestrel.Start().ConfigureAwait(false); - } - private static async Task OnCreatedJsonFile(string name, string fullPath) { if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(fullPath)) { ArchiLogger.LogNullError(nameof(name) + " || " + nameof(fullPath)); @@ -481,7 +481,7 @@ namespace ArchiSteamFarm { return; } - if (!await CanHandleWriteEvent(name).ConfigureAwait(false)) { + if (!await CanHandleWriteEvent(fullPath).ConfigureAwait(false)) { return; } @@ -520,7 +520,7 @@ namespace ArchiSteamFarm { return; } - if (!await CanHandleWriteEvent(name).ConfigureAwait(false)) { + if (!await CanHandleWriteEvent(fullPath).ConfigureAwait(false)) { return; } @@ -548,13 +548,52 @@ namespace ArchiSteamFarm { return; } + string extension = Path.GetExtension(name); + + switch (extension) { + case SharedInfo.IPCConfigExtension: + await OnChangedIPCFile(name).ConfigureAwait(false); + + break; + case SharedInfo.JsonConfigExtension: + await OnDeletedJsonConfigFile(name, fullPath).ConfigureAwait(false); + + break; + } + } + + private static async Task OnDeletedFile(string name, string fullPath) { + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(fullPath)) { + ArchiLogger.LogNullError(nameof(name) + " || " + nameof(fullPath)); + + return; + } + + string extension = Path.GetExtension(name); + + switch (extension) { + case SharedInfo.JsonConfigExtension: + case SharedInfo.IPCConfigExtension: + await OnDeletedConfigFile(name, fullPath).ConfigureAwait(false); + + break; + } + } + + private static async Task OnDeletedJsonConfigFile(string name, string fullPath) { + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(fullPath)) { + ArchiLogger.LogNullError(nameof(name) + " || " + nameof(fullPath)); + + return; + } + string botName = Path.GetFileNameWithoutExtension(name); if (string.IsNullOrEmpty(botName)) { return; } - if (!await CanHandleWriteEvent(name).ConfigureAwait(false)) { + if (!await CanHandleWriteEvent(fullPath).ConfigureAwait(false)) { return; } @@ -586,23 +625,6 @@ namespace ArchiSteamFarm { } } - private static async Task OnDeletedFile(string name, string fullPath) { - if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(fullPath)) { - ArchiLogger.LogNullError(nameof(name) + " || " + nameof(fullPath)); - - return; - } - - string extension = Path.GetExtension(name); - - switch (extension) { - case SharedInfo.ConfigExtension: - await OnDeletedConfigFile(name, fullPath).ConfigureAwait(false); - - break; - } - } - private static async void OnRenamed(object sender, RenamedEventArgs e) { if ((sender == null) || (e == null)) { ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e)); @@ -639,7 +661,7 @@ namespace ArchiSteamFarm { HashSet botNames; try { - botNames = Directory.EnumerateFiles(SharedInfo.ConfigDirectory, "*" + SharedInfo.ConfigExtension).Select(Path.GetFileNameWithoutExtension).Where(botName => !string.IsNullOrEmpty(botName) && IsValidBotName(botName)).ToHashSet(Bot.BotsComparer); + botNames = Directory.EnumerateFiles(SharedInfo.ConfigDirectory, "*" + SharedInfo.JsonConfigExtension).Select(Path.GetFileNameWithoutExtension).Where(botName => !string.IsNullOrEmpty(botName) && IsValidBotName(botName)).ToHashSet(Bot.BotsComparer); } catch (Exception e) { ArchiLogger.LogGenericException(e); diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 817f54d17..573c70b84 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -709,7 +709,7 @@ namespace ArchiSteamFarm { switch (fileType) { case EFileType.Config: - return botPath + SharedInfo.ConfigExtension; + return botPath + SharedInfo.JsonConfigExtension; case EFileType.Database: return botPath + SharedInfo.DatabaseExtension; case EFileType.KeysToRedeem: diff --git a/ArchiSteamFarm/SharedInfo.cs b/ArchiSteamFarm/SharedInfo.cs index 36a6cdfe9..f8969a994 100644 --- a/ArchiSteamFarm/SharedInfo.cs +++ b/ArchiSteamFarm/SharedInfo.cs @@ -36,17 +36,17 @@ namespace ArchiSteamFarm { internal const string AssemblyDocumentation = AssemblyName + ".xml"; internal const string AssemblyName = nameof(ArchiSteamFarm); internal const string ConfigDirectory = "config"; - internal const string ConfigExtension = ".json"; internal const string DatabaseExtension = ".db"; internal const string DebugDirectory = "debug"; internal const string EnvironmentVariableCryptKey = ASF + "_CRYPTKEY"; internal const string EnvironmentVariablePath = ASF + "_PATH"; internal const string GithubReleaseURL = "https://api.github.com/repos/" + GithubRepo + "/releases"; // GitHub API is HTTPS only internal const string GithubRepo = "JustArchiNET/" + AssemblyName; - internal const string GlobalConfigFileName = ASF + ConfigExtension; + internal const string GlobalConfigFileName = ASF + JsonConfigExtension; internal const string GlobalDatabaseFileName = ASF + DatabaseExtension; internal const string IPCConfigExtension = ".config"; internal const string IPCConfigFile = nameof(IPC) + IPCConfigExtension; + internal const string JsonConfigExtension = ".json"; internal const string KeysExtension = ".keys"; internal const string KeysUnusedExtension = ".unused"; internal const string KeysUsedExtension = ".used";