From 5d4fa6fba71823299b2d611e92554b441737a4da Mon Sep 17 00:00:00 2001 From: Andrei Tudor Date: Tue, 26 Mar 2024 23:54:44 +0200 Subject: [PATCH] plugin list command now shows if the plugin is already installed. --- DiscordBot/Bot/Actions/Extra/PluginMethods.cs | 15 +++++-- DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs | 4 +- PluginManager/Bot/Boot.cs | 44 +++++++++---------- PluginManager/Bot/CommandHandler.cs | 2 +- PluginManager/Config.cs | 41 +++++++++-------- PluginManager/Loaders/ActionsLoader.cs | 12 ++--- PluginManager/Loaders/PluginHandler.cs | 6 --- PluginManager/Online/PluginsManager.cs | 9 +++- .../Others/Actions/InternalActionsManager.cs | 10 ++--- PluginManager/Others/ArchiveManager.cs | 27 ++---------- .../Others/DBCommandExecutingArguments.cs | 15 ++++--- PluginManager/Others/Enums.cs | 6 --- .../Others/Permissions/DiscordPermissions.cs | 12 ++--- .../Updater/Plugins/PluginUpdater.cs | 11 +++-- 14 files changed, 99 insertions(+), 115 deletions(-) delete mode 100644 PluginManager/Loaders/PluginHandler.cs diff --git a/DiscordBot/Bot/Actions/Extra/PluginMethods.cs b/DiscordBot/Bot/Actions/Extra/PluginMethods.cs index 98c6b12..74fad78 100644 --- a/DiscordBot/Bot/Actions/Extra/PluginMethods.cs +++ b/DiscordBot/Bot/Actions/Extra/PluginMethods.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -23,10 +23,17 @@ internal static class PluginMethods "Name", "Description", "Version", - "Has Dependencies" + "Is Installed" } ); - foreach (var plugin in data) tableData.AddRow([plugin.Name, plugin.Description, plugin.Version.ToString(), plugin.HasDependencies ? "Yes" : "No"]); + + var installedPlugins = await manager.GetInstalledPlugins(); + + foreach (var plugin in data) + { + bool isInstalled = installedPlugins.Any(p => p.PluginName == plugin.Name); + tableData.AddRow([plugin.Name, plugin.Description, plugin.Version.ToString(), isInstalled ? "Yes" : "No"]); + } tableData.HasRoundBorders = false; tableData.PrintAsTable(); @@ -133,7 +140,7 @@ internal static class PluginMethods internal static async Task LoadPlugins(string[] args) { - var loader = new PluginLoader(Config.DiscordBot.client); + var loader = new PluginLoader(Config.DiscordBot.Client); if (args.Length == 2 && args[1] == "-q") { await loader.LoadPlugins(); diff --git a/DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs b/DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs index 5bf5cec..1e7ed32 100644 --- a/DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs +++ b/DiscordBotUI/DiscordBotUI/Bot/DiscordBot.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using PluginManager; using PluginManager.Interfaces; @@ -26,7 +26,7 @@ namespace DiscordBotUI.Bot public async Task LoadPlugins() { - var loader = new PluginLoader(Config.DiscordBot.client); + var loader = new PluginLoader(Config.DiscordBot.Client); loader.OnCommandLoaded += (data) => { diff --git a/PluginManager/Bot/Boot.cs b/PluginManager/Bot/Boot.cs index 1e706a8..6f02ce3 100644 --- a/PluginManager/Bot/Boot.cs +++ b/PluginManager/Bot/Boot.cs @@ -13,27 +13,27 @@ public class Boot /// /// The bot prefix /// - public readonly string botPrefix; + public readonly string BotPrefix; /// /// The bot token /// - public readonly string botToken; + public readonly string BotToken; /// /// The bot client /// - public DiscordSocketClient client; + public DiscordSocketClient Client; /// /// The bot command handler /// - private CommandHandler commandServiceHandler; + private CommandHandler _commandServiceHandler; /// /// The command service /// - private CommandService service; + private CommandService _service; /// /// The main Boot constructor @@ -42,8 +42,8 @@ public class Boot /// The bot prefix public Boot(string botToken, string botPrefix) { - this.botPrefix = botPrefix; - this.botToken = botToken; + this.BotPrefix = botPrefix; + this.BotToken = botToken; } @@ -51,7 +51,7 @@ public class Boot /// Checks if the bot is ready /// /// true if the bot is ready, otherwise false - public bool isReady { get; private set; } + public bool IsReady { get; private set; } /// /// The start method for the bot. This method is used to load the bot @@ -73,33 +73,33 @@ public class Boot GatewayIntents = GatewayIntents.All }; - client = new DiscordSocketClient(config); - service = new CommandService(); + Client = new DiscordSocketClient(config); + _service = new CommandService(); CommonTasks(); - await client.LoginAsync(TokenType.Bot, botToken); + await Client.LoginAsync(TokenType.Bot, BotToken); - await client.StartAsync(); + await Client.StartAsync(); - commandServiceHandler = new CommandHandler(client, service, botPrefix); + _commandServiceHandler = new CommandHandler(Client, _service, BotPrefix); - await commandServiceHandler.InstallCommandsAsync(); + await _commandServiceHandler.InstallCommandsAsync(); Config.DiscordBotClient = this; - while (!isReady) ; + while (!IsReady) ; } private void CommonTasks() { - if (client == null) return; - client.LoggedOut += Client_LoggedOut; - client.Log += Log; - client.LoggedIn += LoggedIn; - client.Ready += Ready; - client.Disconnected += Client_Disconnected; + if (Client == null) return; + Client.LoggedOut += Client_LoggedOut; + Client.Log += Log; + Client.LoggedIn += LoggedIn; + Client.Ready += Ready; + Client.Disconnected += Client_Disconnected; } private async Task Client_Disconnected(Exception arg) @@ -122,7 +122,7 @@ public class Boot private Task Ready() { - isReady = true; + IsReady = true; // UxHandler.ShowNotification("SethBot", "Seth Discord Bot is now up and running !").Wait(); return Task.CompletedTask; } diff --git a/PluginManager/Bot/CommandHandler.cs b/PluginManager/Bot/CommandHandler.cs index d715cb0..021a1a3 100644 --- a/PluginManager/Bot/CommandHandler.cs +++ b/PluginManager/Bot/CommandHandler.cs @@ -130,7 +130,7 @@ internal class CommandHandler if (plugin is null) return; - if (plugin.requireAdmin && !context.Message.Author.isAdmin()) + if (plugin.requireAdmin && !context.Message.Author.IsAdmin()) return; var split = cleanMessage.Split(' '); diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 184b16c..4436580 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -12,6 +12,16 @@ namespace PluginManager; public class Config { + + private static readonly string _DefaultBranchForPlugins = "releases"; + + private static readonly string _ConfigFile = "./Data/Resources/config.json"; + private static readonly string _PluginsDatabaseFile = "./Data/Resources/plugins.json"; + private static readonly string _ResourcesFolder = "./Data/Resources"; + private static readonly string _PluginsFolder = "./Data/Plugins"; + private static readonly string _ArchivesFolder = "./Data/Archives"; + private static readonly string _LogsFolder = "./Data/Logs"; + private static bool _isLoaded; public static Logger Logger; public static SettingsDictionary AppSettings; @@ -26,38 +36,33 @@ public class Config { if (_isLoaded) return; - Directory.CreateDirectory("./Data/Resources"); - Directory.CreateDirectory("./Data/Plugins"); - Directory.CreateDirectory("./Data/Archives"); - Directory.CreateDirectory("./Data/Logs"); + Directory.CreateDirectory(_ResourcesFolder); + Directory.CreateDirectory(_PluginsFolder); + Directory.CreateDirectory(_ArchivesFolder); + Directory.CreateDirectory(_LogsFolder); - AppSettings = new SettingsDictionary("./Data/Resources/config.json"); + AppSettings = new SettingsDictionary(_ConfigFile); bool response = await AppSettings.LoadFromFile(); if (!response) throw new Exception("Invalid config file"); - AppSettings["LogFolder"] = "./Data/Logs"; - AppSettings["PluginFolder"] = "./Data/Plugins"; - AppSettings["ArchiveFolder"] = "./Data/Archives"; - - AppSettings["PluginDatabase"] = "./Data/Resources/plugins.json"; - + AppSettings["LogFolder"] = _LogsFolder; + AppSettings["PluginFolder"] = _PluginsFolder; + AppSettings["ArchiveFolder"] = _ArchivesFolder; - ArchiveManager.Initialize(); + AppSettings["PluginDatabase"] = _PluginsDatabaseFile; - - - if (!File.Exists(AppSettings["PluginDatabase"])) + if (!File.Exists(_PluginsDatabaseFile)) { List plugins = new(); - await JsonManager.SaveToJsonFile(AppSettings["PluginDatabase"], plugins); + await JsonManager.SaveToJsonFile(_PluginsDatabaseFile, plugins); } - Logger = new Logger(false, true, AppSettings["LogFolder"] + $"/{DateTime.Today.ToShortDateString().Replace("/", "")}.log"); + Logger = new Logger(false, true, _LogsFolder + $"/{DateTime.Today.ToShortDateString().Replace("/", "")}.log"); - PluginsManager = new PluginsManager("releases"); + PluginsManager = new PluginsManager(_DefaultBranchForPlugins); await PluginsManager.UninstallMarkedPlugins(); diff --git a/PluginManager/Loaders/ActionsLoader.cs b/PluginManager/Loaders/ActionsLoader.cs index c6504f3..f6c4396 100644 --- a/PluginManager/Loaders/ActionsLoader.cs +++ b/PluginManager/Loaders/ActionsLoader.cs @@ -13,22 +13,22 @@ public class ActionsLoader { public delegate void ActionLoaded(string name, string typeName, bool success, Exception? e = null); - private readonly string actionExtension = "dll"; + private readonly string _actionExtension = "dll"; - private readonly string actionFolder = @"./Data/Plugins/"; + private readonly string _actionFolder = @"./Data/Plugins/"; public ActionsLoader(string path, string extension) { - actionFolder = path; - actionExtension = extension; + _actionFolder = path; + _actionExtension = extension; } public event ActionLoaded? ActionLoadedEvent; public async Task?> Load() { - Directory.CreateDirectory(actionFolder); - var files = Directory.GetFiles(actionFolder, $"*.{actionExtension}", SearchOption.AllDirectories); + Directory.CreateDirectory(_actionFolder); + var files = Directory.GetFiles(_actionFolder, $"*.{_actionExtension}", SearchOption.AllDirectories); var actions = new List(); diff --git a/PluginManager/Loaders/PluginHandler.cs b/PluginManager/Loaders/PluginHandler.cs deleted file mode 100644 index 945ba50..0000000 --- a/PluginManager/Loaders/PluginHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace PluginManager.Loaders; - -public class PluginHandler -{ - -} diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 1d84737..8ea82b7 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; using System.Threading.Tasks; -using PluginManager.Online.Helpers; using PluginManager.Others; using PluginManager.Plugin; using PluginManager.Updater.Plugins; @@ -83,6 +81,13 @@ public class PluginsManager return await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); } + public async Task IsPluginInstalled(string pluginName) + { + List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); + + return installedPlugins.Any(plugin => plugin.PluginName == pluginName); + } + public async Task CheckForUpdates() { var pluginUpdater = new PluginUpdater(this); diff --git a/PluginManager/Others/Actions/InternalActionsManager.cs b/PluginManager/Others/Actions/InternalActionsManager.cs index e752e94..19c3560 100644 --- a/PluginManager/Others/Actions/InternalActionsManager.cs +++ b/PluginManager/Others/Actions/InternalActionsManager.cs @@ -9,19 +9,19 @@ namespace PluginManager.Others.Actions; public class InternalActionManager { public Dictionary Actions = new(); - public ActionsLoader loader; + private readonly ActionsLoader _loader; public InternalActionManager(string path, string extension) { - loader = new ActionsLoader(path, extension); + _loader = new ActionsLoader(path, extension); } public async Task Initialize() { - var m_actions = await loader.Load(); - if (m_actions == null) + var loadedActions = await _loader.Load(); + if (loadedActions == null) return; - foreach (var action in m_actions) + foreach (var action in loadedActions) Actions.TryAdd(action.ActionName, action); } diff --git a/PluginManager/Others/ArchiveManager.cs b/PluginManager/Others/ArchiveManager.cs index ea12787..a74411c 100644 --- a/PluginManager/Others/ArchiveManager.cs +++ b/PluginManager/Others/ArchiveManager.cs @@ -8,27 +8,9 @@ namespace PluginManager.Others; public static class ArchiveManager { - private static string? _ArchiveFolder; - private static bool IsInitialized { get; set; } - public static void Initialize() + public static void CreateFromFile(string file, string folder) { - if (IsInitialized) - throw new Exception("ArchiveManager is already initialized"); - - if (!Config.AppSettings.ContainsKey("ArchiveFolder")) - Config.AppSettings["ArchiveFolder"] = "./Data/Archives/"; - - _ArchiveFolder = Config.AppSettings["ArchiveFolder"]; - - IsInitialized = true; - } - - - public static async Task CreateFromFile(string file, string folder) - { - if(!IsInitialized) throw new Exception("ArchiveManager is not initialized"); - if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); @@ -50,9 +32,8 @@ public static class ArchiveManager /// An array of bytes that represents the Stream value from the file that was read inside the archive public static async Task ReadStreamFromPakAsync(string fileName, string archName) { - if (!IsInitialized) throw new Exception("ArchiveManager is not initialized"); - archName = _ArchiveFolder + archName; + archName = Config.AppSettings["ArchiveFolder"] + archName; if (!File.Exists(archName)) throw new Exception("Failed to load file !"); @@ -80,8 +61,7 @@ public static class ArchiveManager /// A string that represents the content of the file or null if the file does not exists or it has no content public static async Task ReadFromPakAsync(string fileName, string archFile) { - if (!IsInitialized) throw new Exception("ArchiveManager is not initialized"); - archFile = _ArchiveFolder + archFile; + archFile = Config.AppSettings["ArchiveFolder"] + archFile; if (!File.Exists(archFile)) throw new Exception("Failed to load file !"); @@ -125,7 +105,6 @@ public static class ArchiveManager string zip, string folder, IProgress progress, UnzipProgressType type) { - if (!IsInitialized) throw new Exception("ArchiveManager is not initialized"); Directory.CreateDirectory(folder); using var archive = ZipFile.OpenRead(zip); var totalZipFiles = archive.Entries.Count(); diff --git a/PluginManager/Others/DBCommandExecutingArguments.cs b/PluginManager/Others/DBCommandExecutingArguments.cs index a891709..00914b7 100644 --- a/PluginManager/Others/DBCommandExecutingArguments.cs +++ b/PluginManager/Others/DBCommandExecutingArguments.cs @@ -6,6 +6,13 @@ namespace PluginManager.Others; public class DbCommandExecutingArguments { + + public SocketCommandContext context { get; init; } + public string cleanContent { get; init; } + public string commandUsed { get; init; } + public string[]? arguments { get; init; } + public ISocketMessageChannel Channel => context.Channel; + public DbCommandExecutingArguments( SocketCommandContext context, string cleanContent, string commandUsed, string[]? arguments) { @@ -26,7 +33,7 @@ public class DbCommandExecutingArguments } else { - cleanContent = message.Content.Substring(Config.DiscordBot.botPrefix.Length); + cleanContent = message.Content.Substring(Config.DiscordBot.BotPrefix.Length); } var split = cleanContent.Split(' '); @@ -38,10 +45,4 @@ public class DbCommandExecutingArguments commandUsed = split[0]; arguments = argsClean; } - - public SocketCommandContext context { get; init; } - public string cleanContent { get; init; } - public string commandUsed { get; init; } - public string[]? arguments { get; init; } - public ISocketMessageChannel Channel => context.Channel; } diff --git a/PluginManager/Others/Enums.cs b/PluginManager/Others/Enums.cs index 50fb888..0ecc457 100644 --- a/PluginManager/Others/Enums.cs +++ b/PluginManager/Others/Enums.cs @@ -19,12 +19,6 @@ public enum UnzipProgressType PERCENTAGE_FROM_TOTAL_SIZE } -public enum SaveType -{ - TXT, - JSON -} - public enum InternalActionRunType { ON_STARTUP, diff --git a/PluginManager/Others/Permissions/DiscordPermissions.cs b/PluginManager/Others/Permissions/DiscordPermissions.cs index e8fae3b..24b600c 100644 --- a/PluginManager/Others/Permissions/DiscordPermissions.cs +++ b/PluginManager/Others/Permissions/DiscordPermissions.cs @@ -26,7 +26,7 @@ public static class DiscordPermissions /// The user /// The role /// - public static bool hasRole(this SocketGuildUser user, IRole role) + public static bool HasRole(this SocketGuildUser user, IRole role) { return user.Roles.Contains(role); } @@ -37,7 +37,7 @@ public static class DiscordPermissions /// The user /// The permission /// - public static bool hasPermission(this SocketGuildUser user, GuildPermission permission) + public static bool HasPermission(this SocketGuildUser user, GuildPermission permission) { return user.Roles.Where(role => role.hasPermission(permission)).Any() || user.Guild.Owner == user; } @@ -47,9 +47,9 @@ public static class DiscordPermissions /// /// The user /// - public static bool isAdmin(this SocketGuildUser user) + public static bool IsAdmin(this SocketGuildUser user) { - return user.hasPermission(GuildPermission.Administrator); + return user.HasPermission(GuildPermission.Administrator); } /// @@ -57,8 +57,8 @@ public static class DiscordPermissions /// /// The user /// - public static bool isAdmin(this SocketUser user) + public static bool IsAdmin(this SocketUser user) { - return isAdmin((SocketGuildUser)user); + return IsAdmin((SocketGuildUser)user); } } diff --git a/PluginManager/Updater/Plugins/PluginUpdater.cs b/PluginManager/Updater/Plugins/PluginUpdater.cs index 9cda048..0be21e0 100644 --- a/PluginManager/Updater/Plugins/PluginUpdater.cs +++ b/PluginManager/Updater/Plugins/PluginUpdater.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Threading.Tasks; using PluginManager.Online; using PluginManager.Plugin; @@ -10,16 +9,16 @@ namespace PluginManager.Updater.Plugins; public class PluginUpdater { - private readonly PluginsManager _PluginManager; + private readonly PluginsManager _PluginsManager; public PluginUpdater(PluginsManager pluginManager) { - _PluginManager = pluginManager; + _PluginsManager = pluginManager; } public async Task GetPluginInfo(string pluginName) { - var result = await _PluginManager.GetPluginDataByName(pluginName); + var result = await _PluginsManager.GetPluginDataByName(pluginName); return result; } @@ -41,8 +40,8 @@ public class PluginUpdater foreach(OnlineDependencyInfo dependency in pluginInfo.Dependencies) await ServerCom.DownloadFileAsync(dependency.DownloadLocation, dependency.DownloadLocation, progressMeter); - await _PluginManager.RemovePluginFromDatabase(pluginName); - await _PluginManager.AppendPluginToDatabase(PluginInfo.FromOnlineInfo(pluginInfo)); + await _PluginsManager.RemovePluginFromDatabase(pluginName); + await _PluginsManager.AppendPluginToDatabase(PluginInfo.FromOnlineInfo(pluginInfo)); } public async Task HasUpdate(string pluginName)