From e5e156f3716f9dafb18b31e0d579e6361510d9cc Mon Sep 17 00:00:00 2001 From: Andrei Tudor Date: Sat, 8 Jun 2024 20:47:15 +0300 Subject: [PATCH] Fixed logging --- DiscordBot/Bot/Actions/AddPlugin.cs | 54 +++++++++++++++++++ DiscordBot/Entry.cs | 4 ++ DiscordBot/Utilities/TableData.cs | 6 +-- DiscordBotCore/Application.cs | 10 +++- DiscordBotCore/Others/Logger/Logger.cs | 14 ++++- DiscordBotCore/Others/SettingsDictionary.cs | 23 +++++++- DiscordBotCore/Plugin/PluginInfo.cs | 4 +- .../Updater/Plugins/PluginUpdater.cs | 3 ++ DiscordBotUI/Config.cs | 2 +- 9 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 DiscordBot/Bot/Actions/AddPlugin.cs diff --git a/DiscordBot/Bot/Actions/AddPlugin.cs b/DiscordBot/Bot/Actions/AddPlugin.cs new file mode 100644 index 0000000..04469d4 --- /dev/null +++ b/DiscordBot/Bot/Actions/AddPlugin.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using DiscordBotCore; +using DiscordBotCore.Interfaces; +using DiscordBotCore.Others; +using DiscordBotCore.Others.Actions; +using DiscordBotCore.Plugin; + +namespace DiscordBot.Bot.Actions +{ + internal class AddPlugin : ICommandAction + { + public string ActionName => "add-plugin"; + + public string Description => "Add a local plugin to the database"; + + public string Usage => "add-plugin "; + + public IEnumerable ListOfOptions => [ + new InternalActionOption("path", "The path to the plugin to add") + ]; + + public InternalActionRunType RunType => InternalActionRunType.ON_CALL; + + public async Task Execute(string[] args) + { + if(args.Length < 1) + { + Console.WriteLine("Invalid arguments given. Please use the following format:"); + Console.WriteLine("add-plugin "); + Console.WriteLine("path: The path to the plugin to add"); + + return; + } + + var path = args[0]; + + if(!System.IO.File.Exists(path)) + { + Console.WriteLine("The file does not exist !!"); + return; + } + + FileInfo fileInfo = new FileInfo(path); + PluginInfo pluginInfo = new PluginInfo(fileInfo.Name, new(1, 0, 0), [], false, true); + await Application.CurrentApplication.PluginManager.AppendPluginToDatabase(pluginInfo); + } + } +} diff --git a/DiscordBot/Entry.cs b/DiscordBot/Entry.cs index ad1d7c1..8ad736b 100644 --- a/DiscordBot/Entry.cs +++ b/DiscordBot/Entry.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading.Tasks; namespace DiscordBot; @@ -81,4 +83,6 @@ public static class Entry Program.Startup(args).Wait(); } + + } diff --git a/DiscordBot/Utilities/TableData.cs b/DiscordBot/Utilities/TableData.cs index 01bdf8a..848e4d2 100644 --- a/DiscordBot/Utilities/TableData.cs +++ b/DiscordBot/Utilities/TableData.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices.ComTypes; -using System.Text; -using System.Threading.Tasks; using DiscordBotCore.Others; using Spectre.Console; using Spectre.Console.Rendering; diff --git a/DiscordBotCore/Application.cs b/DiscordBotCore/Application.cs index 4647573..edc0a4f 100644 --- a/DiscordBotCore/Application.cs +++ b/DiscordBotCore/Application.cs @@ -6,6 +6,7 @@ using DiscordBotCore.Plugin; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Threading.Tasks; @@ -30,7 +31,6 @@ namespace DiscordBotCore public string ServerID => ApplicationEnvironmentVariables["ServerID"]; public string PluginDatabase => ApplicationEnvironmentVariables["PluginDatabase"] ?? _PluginsDatabaseFile; public string LogFile => $"{ApplicationEnvironmentVariables["LogFolder"]}/{DateTime.Now.ToLongDateString().Replace(" / ", "")}.log"; - public string DataFolder => _ResourcesFolder; public SettingsDictionary ApplicationEnvironmentVariables { get; private set; } public InternalActionManager InternalActionManager { get; private set; } @@ -81,6 +81,7 @@ namespace DiscordBotCore CurrentApplication.InternalActionManager = new InternalActionManager(); await CurrentApplication.InternalActionManager.Initialize(); + } @@ -101,5 +102,12 @@ namespace DiscordBotCore CurrentApplication.ApplicationEnvironmentVariables["MaxParallelDownloads"] = _MaxParallelDownloads; } + public static string GetResourceFullPath(string path) + { + string result = Path.Combine(_ResourcesFolder, path); + return result; + } + + public static string GetResourceFullPath() => _ResourcesFolder; } } diff --git a/DiscordBotCore/Others/Logger/Logger.cs b/DiscordBotCore/Others/Logger/Logger.cs index caa355a..d7f6e43 100644 --- a/DiscordBotCore/Others/Logger/Logger.cs +++ b/DiscordBotCore/Others/Logger/Logger.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Threading.Tasks; using DiscordBotCore.Interfaces.Logger; @@ -8,6 +10,7 @@ namespace DiscordBotCore.Others.Logger; public sealed class Logger : ILogger { + private readonly FileStream _LogStream; public List LogMessageProperties = typeof(ILogMessage).GetProperties().Select(p => p.Name).ToList(); public string LogMessageFormat { get ; set; } @@ -18,6 +21,7 @@ public sealed class Logger : ILogger public Logger(string logMessageFormat) { this.LogMessageFormat = logMessageFormat; + _LogStream = File.Open(Application.CurrentApplication.LogFile, FileMode.Append, FileAccess.Write, FileShare.Read); } /// @@ -37,9 +41,15 @@ public sealed class Logger : ILogger return messageAsString; } - private void LogToFile(string message) + private async void LogToFile(string message) { - System.IO.File.AppendAllText(Application.CurrentApplication.LogFile, message); + byte[] messageAsBytes = System.Text.Encoding.ASCII.GetBytes(message); + await _LogStream.WriteAsync(messageAsBytes, 0, messageAsBytes.Length); + + byte[] newLine = System.Text.Encoding.ASCII.GetBytes(Environment.NewLine); + await _LogStream.WriteAsync(newLine, 0, newLine.Length); + + await _LogStream.FlushAsync(); } private string GenerateLogMessage(ILogMessage message, string customFormat) diff --git a/DiscordBotCore/Others/SettingsDictionary.cs b/DiscordBotCore/Others/SettingsDictionary.cs index 7f42c28..2ce89ce 100644 --- a/DiscordBotCore/Others/SettingsDictionary.cs +++ b/DiscordBotCore/Others/SettingsDictionary.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -90,5 +91,25 @@ public class SettingsDictionary set => _Dictionary[key] = value; } + // First + public KeyValuePair FirstOrDefault(Func, bool> predicate) + { + return _Dictionary.FirstOrDefault(predicate); + } + + // Where + public IEnumerable> Where(Func, bool> predicate) + { + return _Dictionary.Where(predicate); + } + + public void Clear() + { + _Dictionary.Clear(); + } + + public IEnumerable Keys => _Dictionary.Keys; + public IEnumerable Values => _Dictionary.Values; + } diff --git a/DiscordBotCore/Plugin/PluginInfo.cs b/DiscordBotCore/Plugin/PluginInfo.cs index 52bb9a2..a789b4e 100644 --- a/DiscordBotCore/Plugin/PluginInfo.cs +++ b/DiscordBotCore/Plugin/PluginInfo.cs @@ -13,15 +13,17 @@ public class PluginInfo public string FilePath { get; private set; } public Dictionary ListOfDependancies {get; private set;} public bool IsMarkedToUninstall {get; internal set;} + public bool IsOfflineAdded { get; internal set; } [JsonConstructor] - public PluginInfo(string pluginName, PluginVersion pluginVersion, Dictionary listOfDependancies, bool isMarkedToUninstall) + public PluginInfo(string pluginName, PluginVersion pluginVersion, Dictionary listOfDependancies, bool isMarkedToUninstall, bool isOfflineAdded) { PluginName = pluginName; PluginVersion = pluginVersion; ListOfDependancies = listOfDependancies; IsMarkedToUninstall = isMarkedToUninstall; FilePath = $"{Application.CurrentApplication.ApplicationEnvironmentVariables["PluginFolder"]}/{pluginName}.dll"; + IsOfflineAdded = isOfflineAdded; } public PluginInfo(string pluginName, PluginVersion pluginVersion, Dictionary listOfDependancies) diff --git a/DiscordBotCore/Updater/Plugins/PluginUpdater.cs b/DiscordBotCore/Updater/Plugins/PluginUpdater.cs index 42431ab..3a70346 100644 --- a/DiscordBotCore/Updater/Plugins/PluginUpdater.cs +++ b/DiscordBotCore/Updater/Plugins/PluginUpdater.cs @@ -52,6 +52,9 @@ public class PluginUpdater public async Task HasUpdate(string pluginName) { var localPluginInfo = await GetLocalPluginInfo(pluginName); + if(localPluginInfo.IsOfflineAdded) + return false; + var pluginInfo = await GetPluginInfo(pluginName); return pluginInfo.Version.IsNewerThan(localPluginInfo.PluginVersion); diff --git a/DiscordBotUI/Config.cs b/DiscordBotUI/Config.cs index 790c7cf..3efb908 100644 --- a/DiscordBotUI/Config.cs +++ b/DiscordBotUI/Config.cs @@ -8,7 +8,7 @@ namespace DiscordBotUI_Windows { internal class Config { - internal static DiscordBotCore.Others.SettingsDictionary ApplicationSettings = new DiscordBotCore.Others.SettingsDictionary(Path.Combine(DiscordBotCore.Application.CurrentApplication.DataFolder, "DiscordBotUI/config.json")); + internal static DiscordBotCore.Others.SettingsDictionary ApplicationSettings = new DiscordBotCore.Others.SettingsDictionary(DiscordBotCore.Application.GetResourceFullPath("DiscordBotUI/config.json")); internal static ThemeManager ThemeManager = new ThemeManager(); } }