From 79c6daa11a62a47ea8a693543b93b29b314e0c18 Mon Sep 17 00:00:00 2001 From: Andrei Tudor Date: Thu, 4 Jul 2024 16:12:55 +0300 Subject: [PATCH] Removed UI and Added IsDisabled plugin property --- DiscordBot/Bot/Actions/AddPlugin.cs | 2 +- DiscordBot/Bot/Actions/Extra/PluginMethods.cs | 35 +++-- DiscordBot/Bot/Actions/Plugin.cs | 56 ++++++-- DiscordBot/Entry.cs | 35 ++--- DiscordBotCore/Application.cs | 5 +- DiscordBotCore/Loaders/Loader.cs | 2 +- DiscordBotCore/Online/PluginManager.cs | 62 +++++---- DiscordBotCore/Plugin/PluginInfo.cs | 6 +- DiscordBotUI/Config.cs | 14 -- DiscordBotUI/DiscordBotUI_Windows.csproj | 16 --- DiscordBotUI/Program.cs | 120 ----------------- DiscordBotUI/ThemeManager.cs | 115 ---------------- DiscordBotUI/Theming/Theme.cs | 20 --- DiscordBotUI/Theming/ThemeType.cs | 9 -- .../WindowsForms/MainWindow.Designer.cs | 79 ----------- DiscordBotUI/WindowsForms/MainWindow.cs | 32 ----- DiscordBotUI/WindowsForms/MainWindow.resx | 123 ------------------ .../WindowsForms/PluginListWindow.Designer.cs | 73 ----------- DiscordBotUI/WindowsForms/PluginListWindow.cs | 88 ------------- .../WindowsForms/PluginListWindow.resx | 120 ----------------- SethDiscordBot.sln | 8 -- 21 files changed, 126 insertions(+), 894 deletions(-) delete mode 100644 DiscordBotUI/Config.cs delete mode 100644 DiscordBotUI/DiscordBotUI_Windows.csproj delete mode 100644 DiscordBotUI/Program.cs delete mode 100644 DiscordBotUI/ThemeManager.cs delete mode 100644 DiscordBotUI/Theming/Theme.cs delete mode 100644 DiscordBotUI/Theming/ThemeType.cs delete mode 100644 DiscordBotUI/WindowsForms/MainWindow.Designer.cs delete mode 100644 DiscordBotUI/WindowsForms/MainWindow.cs delete mode 100644 DiscordBotUI/WindowsForms/MainWindow.resx delete mode 100644 DiscordBotUI/WindowsForms/PluginListWindow.Designer.cs delete mode 100644 DiscordBotUI/WindowsForms/PluginListWindow.cs delete mode 100644 DiscordBotUI/WindowsForms/PluginListWindow.resx diff --git a/DiscordBot/Bot/Actions/AddPlugin.cs b/DiscordBot/Bot/Actions/AddPlugin.cs index 09245d9..c873fd8 100644 --- a/DiscordBot/Bot/Actions/AddPlugin.cs +++ b/DiscordBot/Bot/Actions/AddPlugin.cs @@ -48,7 +48,7 @@ namespace DiscordBot.Bot.Actions } FileInfo fileInfo = new FileInfo(path); - PluginInfo pluginInfo = new PluginInfo(args[0], new(1, 0, 0), [], false, true); + PluginInfo pluginInfo = new PluginInfo(args[0], new(1, 0, 0), [], false, true, false); await Application.CurrentApplication.PluginManager.AppendPluginToDatabase(pluginInfo); } } diff --git a/DiscordBot/Bot/Actions/Extra/PluginMethods.cs b/DiscordBot/Bot/Actions/Extra/PluginMethods.cs index 56d37c4..09c449b 100644 --- a/DiscordBot/Bot/Actions/Extra/PluginMethods.cs +++ b/DiscordBot/Bot/Actions/Extra/PluginMethods.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using DiscordBot.Utilities; using DiscordBotCore; +using DiscordBotCore.Interfaces.PluginManager; using DiscordBotCore.Loaders; using DiscordBotCore.Online; using DiscordBotCore.Others; @@ -19,15 +20,17 @@ namespace DiscordBot.Bot.Actions.Extra; internal static class PluginMethods { - internal static async Task List(PluginManager manager) + internal static async Task List() { - Console.WriteLine($"Fetching plugin list from branch {manager.Branch} ..."); - var data = await ConsoleUtilities.ExecuteWithProgressBar(manager.GetPluginsList(), "Reading remote database"); + + Console.WriteLine($"Fetching plugin list from branch {Application.CurrentApplication.PluginManager.Branch} ..."); + + var data = await ConsoleUtilities.ExecuteWithProgressBar(Application.CurrentApplication.PluginManager.GetPluginsList(), "Reading remote database"); TableData tableData = new(["Name", "Description", "Version", "Is Installed", "Dependencies"]); - var installedPlugins = await ConsoleUtilities.ExecuteWithProgressBar(manager.GetInstalledPlugins(), "Reading local database "); + var installedPlugins = await ConsoleUtilities.ExecuteWithProgressBar(Application.CurrentApplication.PluginManager.GetInstalledPlugins(), "Reading local database "); foreach (var plugin in data) { @@ -87,9 +90,19 @@ internal static class PluginMethods } - internal static async Task DownloadPlugin(PluginManager manager, string pluginName) + internal static async Task DisablePlugin(string pluginName) { - var pluginData = await manager.GetPluginDataByName(pluginName); + await Application.CurrentApplication.PluginManager.SetDisabledStatus(pluginName, true); + } + + internal static async Task EnablePlugin(string pluginName) + { + await Application.CurrentApplication.PluginManager.SetDisabledStatus(pluginName, false); + } + + internal static async Task DownloadPlugin(string pluginName) + { + var pluginData = await Application.CurrentApplication.PluginManager.GetPluginDataByName(pluginName); if (pluginData is null) { Console.WriteLine($"Plugin {pluginName} not found. Please check the spelling and try again."); @@ -127,12 +140,12 @@ internal static class PluginMethods if (pluginData.HasScriptDependencies) { Console.WriteLine("Executing post install scripts ..."); - await manager.ExecutePluginInstallScripts(pluginData.ScriptDependencies); + await Application.CurrentApplication.PluginManager.ExecutePluginInstallScripts(pluginData.ScriptDependencies); } PluginInfo pluginInfo = new(pluginName, pluginData.Version, []); Console.WriteLine("Finished installing " + pluginName + " successfully"); - await manager.AppendPluginToDatabase(pluginInfo); + await Application.CurrentApplication.PluginManager.AppendPluginToDatabase(pluginInfo); await RefreshPlugins(false); return; } @@ -175,7 +188,7 @@ internal static class PluginMethods await Parallel.ForEachAsync(downloadTasks, options, async (tuple, token) => { tuple.Item1.IsIndeterminate = false; - string downloadLocation = manager.GenerateDependencyLocation(pluginName, tuple.Item4); + string downloadLocation = Application.CurrentApplication.PluginManager.GenerateDependencyLocation(pluginName, tuple.Item4); await ServerCom.DownloadFileAsync(tuple.Item3, downloadLocation, tuple.Item2); } ); @@ -189,10 +202,10 @@ internal static class PluginMethods if(pluginData.HasScriptDependencies) { Console.WriteLine("Executing post install scripts ..."); - await manager.ExecutePluginInstallScripts(pluginData.ScriptDependencies); + await Application.CurrentApplication.PluginManager.ExecutePluginInstallScripts(pluginData.ScriptDependencies); } - await manager.AppendPluginToDatabase(PluginInfo.FromOnlineInfo(pluginData)); + await Application.CurrentApplication.PluginManager.AppendPluginToDatabase(PluginInfo.FromOnlineInfo(pluginData)); await RefreshPlugins(false); } diff --git a/DiscordBot/Bot/Actions/Plugin.cs b/DiscordBot/Bot/Actions/Plugin.cs index d1651fc..eba119c 100644 --- a/DiscordBot/Bot/Actions/Plugin.cs +++ b/DiscordBot/Bot/Actions/Plugin.cs @@ -29,6 +29,12 @@ public class Plugin: ICommandAction new InternalActionOption("branch", "Sets a plugin option", [ new InternalActionOption("set", "Sets the branch"), new InternalActionOption("get", "Gets the branch") + ]), + new InternalActionOption("enable", "Enables a plugin", [ + new InternalActionOption("name", "The name of the plugin to enable") + ]), + new InternalActionOption("disable", "Disables a plugin", [ + new InternalActionOption("name", "The name of the plugin to disable") ]) }; @@ -36,20 +42,40 @@ public class Plugin: ICommandAction public async Task Execute(string[] args) { - if (args is null || args.Length == 0 || args[0] == "help") + if (args is null || args.Length == 0) { - Console.WriteLine("Usage : plugin [help|list|load|install]"); - Console.WriteLine("help : Displays this message"); - Console.WriteLine("list : Lists all plugins"); - Console.WriteLine("load : Loads all plugins"); - Console.WriteLine("install : Installs a plugin"); - Console.WriteLine("refresh : Refreshes the plugin list"); - + await Application.CurrentApplication.InternalActionManager.Execute("help", ActionName); return; } switch (args[0]) { + case "enable": + { + if (args.Length < 2) + { + Console.WriteLine("Usage : plugin enable "); + return; + } + + string pluginName = string.Join(' ', args, 1, args.Length - 1); + await Application.CurrentApplication.PluginManager.SetDisabledStatus(pluginName, false); + + break; + } + case "disable": + { + if (args.Length < 2) + { + Console.WriteLine("Usage : plugin disable "); + return; + } + + string pluginName = string.Join(' ', args, 1, args.Length - 1); + await Application.CurrentApplication.PluginManager.SetDisabledStatus(pluginName, true); + + break; + } case "branch": if (args.Length < 2) { @@ -87,14 +113,15 @@ public class Plugin: ICommandAction break; case "uninstall": - string plugName = string.Join(' ', args, 1, args.Length-1); + { + string plugName = string.Join(' ', args, 1, args.Length - 1); bool result = await Application.CurrentApplication.PluginManager.MarkPluginToUninstall(plugName); - if(result) + if (result) Console.WriteLine($"Marked to uninstall plugin {plugName}. Please restart the bot"); break; - + } case "list": - await PluginMethods.List(Application.CurrentApplication.PluginManager); + await PluginMethods.List(); break; case "load": if (pluginsLoaded) @@ -113,6 +140,7 @@ public class Plugin: ICommandAction break; case "install": + { var pluginName = string.Join(' ', args, 1, args.Length - 1); if (string.IsNullOrEmpty(pluginName) || pluginName.Length < 2) { @@ -126,8 +154,10 @@ public class Plugin: ICommandAction } } - await PluginMethods.DownloadPlugin(Application.CurrentApplication.PluginManager, pluginName); + await PluginMethods.DownloadPlugin(pluginName); + break; + } } } } diff --git a/DiscordBot/Entry.cs b/DiscordBot/Entry.cs index 8ad736b..caacfcf 100644 --- a/DiscordBot/Entry.cs +++ b/DiscordBot/Entry.cs @@ -3,9 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.InteropServices; -using System.Threading.Tasks; - namespace DiscordBot; @@ -20,35 +17,24 @@ public static class Entry { File.Delete(plugin); } + + File.Delete("./Data/Resources/plugins.json"); + Directory.Delete("./Libraries/", true); }) ]; - private static readonly string logo = -#if DEBUG + private static readonly string logo = @" - _____ _ _ _____ _ _ ____ _ - / ____| | | | | | __ \(_) | | | _ \ | | - | (___ ___| |_| |__ | | | |_ ___ ___ ___ _ __ __| | | |_) | ___ | |_ - \___ \ / _ \ __| '_ \ | | | | / __|/ __/ _ \| '__/ _` | | _ < / _ \| __| - ____) | __/ |_| | | | | |__| | \__ \ (_| (_) | | | (_| | | |_) | (_) | |_ - |_____/ \___|\__|_| |_| |_____/|_|___/\___\___/|_| \__,_| |____/ \___/ \__| - (Debug) - -"; -#else -@" - - _____ _ _ _____ _ _ ____ _ - / ____| | | | | | __ \(_) | | | _ \ | | - | (___ ___| |_| |__ | | | |_ ___ ___ ___ _ __ __| | | |_) | ___ | |_ - \___ \ / _ \ __| '_ \ | | | | / __|/ __/ _ \| '__/ _` | | _ < / _ \| __| - ____) | __/ |_| | | | | |__| | \__ \ (_| (_) | | | (_| | | |_) | (_) | |_ - |_____/ \___|\__|_| |_| |_____/|_|___/\___\___/|_| \__,_| |____/ \___/ \__| + _____ _ _ _____ _ _ ____ _ + / ____| | | | | | __ \(_) | | | _ \ | | + | (___ ___| |_| |__ | | | |_ ___ ___ ___ _ __ __| | | |_) | ___ | |_ + \___ \ / _ \ __| '_ \ | | | | / __|/ __/ _ \| '__/ _` | | _ < / _ \| __| + ____) | __/ |_| | | | | |__| | \__ \ (_| (_) | | | (_| | | |_) | (_) | |_ + |_____/ \___|\__|_| |_| |_____/|_|___/\___\___/|_| \__,_| |____/ \___/ \__| "; -#endif public static void Main(string[] args) { #if DEBUG @@ -82,6 +68,7 @@ public static class Entry } Program.Startup(args).Wait(); + } diff --git a/DiscordBotCore/Application.cs b/DiscordBotCore/Application.cs index 14aa8f5..0c81172 100644 --- a/DiscordBotCore/Application.cs +++ b/DiscordBotCore/Application.cs @@ -1,4 +1,5 @@ -using DiscordBotCore.Online; +using DiscordBotCore.Interfaces.PluginManager; +using DiscordBotCore.Online; using DiscordBotCore.Others; using DiscordBotCore.Others.Actions; using DiscordBotCore.Others.Logger; @@ -36,7 +37,7 @@ namespace DiscordBotCore public SettingsDictionary ApplicationEnvironmentVariables { get; private set; } public InternalActionManager InternalActionManager { get; private set; } - public PluginManager PluginManager { get; private set; } + public IPluginManager PluginManager { get; private set; } public Logger Logger { get; private set; } public Bot.App DiscordBotClient { get; internal set; } diff --git a/DiscordBotCore/Loaders/Loader.cs b/DiscordBotCore/Loaders/Loader.cs index 49f7bdb..bc7fefa 100644 --- a/DiscordBotCore/Loaders/Loader.cs +++ b/DiscordBotCore/Loaders/Loader.cs @@ -21,7 +21,7 @@ internal class Loader internal async Task Load() { var installedPlugins = await Application.CurrentApplication.PluginManager.GetInstalledPlugins(); - var files = installedPlugins.Select(plugin => plugin.FilePath).ToArray(); + var files = installedPlugins.Where(plugin=>!plugin.IsDisabled).Select(plugin => plugin.FilePath).ToArray(); foreach (var file in files) { diff --git a/DiscordBotCore/Online/PluginManager.cs b/DiscordBotCore/Online/PluginManager.cs index e4a9ff1..bc38aad 100644 --- a/DiscordBotCore/Online/PluginManager.cs +++ b/DiscordBotCore/Online/PluginManager.cs @@ -3,15 +3,16 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; +using DiscordBotCore.Interfaces.PluginManager; using DiscordBotCore.Others; using DiscordBotCore.Plugin; using DiscordBotCore.Updater.Plugins; namespace DiscordBotCore.Online; -public class PluginManager +public class PluginManager : IPluginManager { - private static readonly string _DefaultBranch = "releases"; + private static readonly string _DefaultBranch = "releases"; private static readonly string _DefaultBaseUrl = "https://raw.githubusercontent.com/andreitdr/SethPlugins"; private static readonly string _DefaultPluginsLink = "PluginsList.json"; @@ -26,29 +27,29 @@ public class PluginManager public PluginManager(Uri baseUrl, string branch) { BaseUrl = baseUrl.ToString(); - Branch = branch; + Branch = branch; } public PluginManager(string branch) { BaseUrl = _DefaultBaseUrl; - Branch = branch; + Branch = branch; } public PluginManager() { BaseUrl = _DefaultBaseUrl; - Branch = _DefaultBranch; + Branch = _DefaultBranch; } public async Task?> GetPluginsList() { - var jsonText = await ServerCom.GetAllTextFromUrl(PluginsLink); - List result = await JsonManager.ConvertFromJson>(jsonText); + var jsonText = await ServerCom.GetAllTextFromUrl(PluginsLink); + List result = await JsonManager.ConvertFromJson>(jsonText); var currentOS = OperatingSystem.IsWindows() ? OSType.WINDOWS : - OperatingSystem.IsLinux() ? OSType.LINUX : - OperatingSystem.IsMacOS() ? OSType.MACOSX : OSType.NONE; + OperatingSystem.IsLinux() ? OSType.LINUX : + OperatingSystem.IsMacOS() ? OSType.MACOSX : OSType.NONE; return result.FindAll(pl => (pl.SupportedOS & currentOS) != 0); @@ -58,29 +59,29 @@ public class PluginManager public async Task GetPluginDataByName(string pluginName) { List? plugins = await GetPluginsList(); - - if(plugins == null) + + if (plugins == null) return null; // try to get the best matching plugin using the pluginName as a search query PluginOnlineInfo? result = plugins.Find(pl => pl.Name.ToLower().Contains(pluginName.ToLower())); - if(result == null) return null; + if (result == null) return null; return result; } - + public async Task RemovePluginFromDatabase(string pluginName) { List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Application.CurrentApplication.PluginDatabase)); - + installedPlugins.RemoveAll(p => p.PluginName == pluginName); - await JsonManager.SaveToJsonFile(Application.CurrentApplication.PluginDatabase,installedPlugins); + await JsonManager.SaveToJsonFile(Application.CurrentApplication.PluginDatabase, installedPlugins); } public async Task ExecutePluginInstallScripts(List listOfDependencies) { string consoleType = OperatingSystem.IsWindows() ? "cmd.exe" : "bash"; - foreach(var script in listOfDependencies) + foreach (var script in listOfDependencies) await ServerCom.RunConsoleCommand(consoleType, "/c " + script.ScriptContent); } @@ -95,7 +96,7 @@ public class PluginManager installedPlugins.Add(pluginData); await JsonManager.SaveToJsonFile(Application.CurrentApplication.PluginDatabase, installedPlugins); } - + public async Task> GetInstalledPlugins() { return await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Application.CurrentApplication.PluginDatabase)); @@ -111,9 +112,9 @@ public class PluginManager public async Task CheckForUpdates() { var pluginUpdater = new PluginUpdater(this); - + List installedPlugins = await GetInstalledPlugins(); - + foreach (var plugin in installedPlugins) { if (await pluginUpdater.HasUpdate(plugin.PluginName)) @@ -129,7 +130,7 @@ public class PluginManager IEnumerable installedPlugins = await GetInstalledPlugins(); IEnumerable info = installedPlugins.Where(info => info.PluginName == pluginName).AsEnumerable(); - if(!info.Any()) + if (!info.Any()) return false; foreach (var item in info) @@ -190,14 +191,15 @@ public class PluginManager { installProgress?.Report(0f); - int totalSteps = pluginData.HasFileDependencies ? pluginData.Dependencies.Count + 1: 1; + int totalSteps = pluginData.HasFileDependencies ? pluginData.Dependencies.Count + 1 : 1; totalSteps += pluginData.HasScriptDependencies ? pluginData.ScriptDependencies.Count : 0; - float stepProgress = 1f / totalSteps; + float stepProgress = 1f / totalSteps; float currentProgress = 0f; - IProgress progress = new Progress((p) => { + IProgress progress = new Progress((p) => + { installProgress?.Report(currentProgress + stepProgress * p); }); @@ -208,7 +210,7 @@ public class PluginManager { string dependencyLocation = GenerateDependencyLocation(pluginData.Name, dependency.DownloadLocation); await ServerCom.DownloadFileAsync(dependency.DownloadLink, dependencyLocation, progress); - + currentProgress += stepProgress; } @@ -228,6 +230,18 @@ public class PluginManager await AppendPluginToDatabase(pluginInfo); } + public async Task SetDisabledStatus(string pluginName, bool status) + { + var plugins = await GetInstalledPlugins(); + var plugin = plugins.Find(p => p.PluginName == pluginName); + if (plugin == null) + return; + plugin.IsDisabled = status; + + await RemovePluginFromDatabase(pluginName); + await AppendPluginToDatabase(plugin); + + } } diff --git a/DiscordBotCore/Plugin/PluginInfo.cs b/DiscordBotCore/Plugin/PluginInfo.cs index fac7b4f..2f144dd 100644 --- a/DiscordBotCore/Plugin/PluginInfo.cs +++ b/DiscordBotCore/Plugin/PluginInfo.cs @@ -13,9 +13,10 @@ public class PluginInfo public Dictionary ListOfDependancies {get; private set;} public bool IsMarkedToUninstall {get; internal set;} public bool IsOfflineAdded { get; internal set; } + public bool IsDisabled { get; internal set; } [JsonConstructor] - public PluginInfo(string pluginName, PluginVersion pluginVersion, Dictionary listOfDependancies, bool isMarkedToUninstall, bool isOfflineAdded) + public PluginInfo(string pluginName, PluginVersion pluginVersion, Dictionary listOfDependancies, bool isMarkedToUninstall, bool isOfflineAdded, bool isDisabled) { PluginName = pluginName; PluginVersion = pluginVersion; @@ -23,6 +24,7 @@ public class PluginInfo IsMarkedToUninstall = isMarkedToUninstall; FilePath = $"{Application.CurrentApplication.ApplicationEnvironmentVariables["PluginFolder"]}/{pluginName}.dll"; IsOfflineAdded = isOfflineAdded; + IsDisabled = isDisabled; } public PluginInfo(string pluginName, PluginVersion pluginVersion, Dictionary listOfDependancies) @@ -32,6 +34,8 @@ public class PluginInfo ListOfDependancies = listOfDependancies; IsMarkedToUninstall = false; FilePath = $"{Application.CurrentApplication.ApplicationEnvironmentVariables["PluginFolder"]}/{pluginName}.dll"; + IsOfflineAdded = false; + IsDisabled = false; } public static PluginInfo FromOnlineInfo(PluginOnlineInfo onlineInfo) diff --git a/DiscordBotUI/Config.cs b/DiscordBotUI/Config.cs deleted file mode 100644 index 3efb908..0000000 --- a/DiscordBotUI/Config.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DiscordBotUI_Windows -{ - internal class Config - { - internal static DiscordBotCore.Others.SettingsDictionary ApplicationSettings = new DiscordBotCore.Others.SettingsDictionary(DiscordBotCore.Application.GetResourceFullPath("DiscordBotUI/config.json")); - internal static ThemeManager ThemeManager = new ThemeManager(); - } -} diff --git a/DiscordBotUI/DiscordBotUI_Windows.csproj b/DiscordBotUI/DiscordBotUI_Windows.csproj deleted file mode 100644 index d5aed9a..0000000 --- a/DiscordBotUI/DiscordBotUI_Windows.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Library - net8.0-windows - enable - true - enable - - - - - - - - \ No newline at end of file diff --git a/DiscordBotUI/Program.cs b/DiscordBotUI/Program.cs deleted file mode 100644 index 8a68582..0000000 --- a/DiscordBotUI/Program.cs +++ /dev/null @@ -1,120 +0,0 @@ -using Discord.WebSocket; - -using DiscordBotCore.Interfaces; -using DiscordBotCore.Others; -using DiscordBotCore.Others.Actions; - -using DiscordBotUI_Windows; -using DiscordBotUI_Windows.WindowsForms; - -namespace DiscordBotUI -{ - public class DiscordUICommand : ICommandAction - { - public string ActionName => "ui"; - - public string? Description => "UI Set of actions"; - - public string? Usage => "ui