From 244209093e766bd4ba6cce76f89a1fdd76ff5f87 Mon Sep 17 00:00:00 2001 From: Andrei Date: Sat, 8 Apr 2023 15:54:39 +0300 Subject: [PATCH] patch on discord bot UI --- .vscode/launch.json | 4 +- .vscode/tasks.json | 12 ++++ DiscordBot/Program.cs | 1 - .../DiscordBotUI/Controllers/BotController.cs | 68 ++++++++++++++++-- .../Models/Bot/PluginsPageModel.cs | 19 +++++ .../DiscordBotUI/Views/Bot/PluginsPage.cshtml | 72 +++++++++++++++++++ .../DiscordBotUI/Views/Bot/Start.cshtml | 18 ++--- .../DiscordBotUI/Views/Shared/_Layout.cshtml | 3 + .../DiscordBotUI/wwwroot/css/bot/plugins.css | 44 ++++++++++++ .../DiscordBotUI/wwwroot/css/bot/start.css | 10 +++ PluginManager/Loaders/PluginLoader.cs | 11 ++- PluginManager/Online/PluginsManager.cs | 6 +- 12 files changed, 249 insertions(+), 19 deletions(-) create mode 100644 DiscordBotPlugins/DiscordBotUI/Models/Bot/PluginsPageModel.cs create mode 100644 DiscordBotPlugins/DiscordBotUI/Views/Bot/PluginsPage.cshtml create mode 100644 DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/plugins.css create mode 100644 DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/start.css diff --git a/.vscode/launch.json b/.vscode/launch.json index 73ee005..b03c6bd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,10 +5,10 @@ "name": ".NET Core Launch (web)", "type": "coreclr", "request": "launch", - "preLaunchTask": "build", + "preLaunchTask": "buildUI", "program": "${workspaceFolder}/DiscordBotPlugins/DiscordBotUI/bin/Debug/net7.0/DiscordBotUI.dll", "args": [], - "cwd": "${workspaceFolder}/DiscordBotPlugins/DiscordBotUI/", + "cwd": "${workspaceFolder}/DiscordBotPlugins/DiscordBotUI/bin/Debug/net7.0", "stopAtEntry": false, "console": "externalTerminal", "serverReadyAction": { diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 08f8fa7..ce0ba5d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,6 +13,18 @@ ], "problemMatcher": "$msCompile" }, + { + "label": "buildUI", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/DiscordBotPlugins/DiscordBotUI/DiscordBotUI.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, { "label": "publish", "command": "dotnet", diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 1076a02..020e194 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -29,7 +29,6 @@ public class Program [STAThread] public static void Startup(string[] args) { - PreLoadComponents(args).Wait(); if (!Config.Data.ContainsKey("ServerID") || !Config.Data.ContainsKey("token") || diff --git a/DiscordBotPlugins/DiscordBotUI/Controllers/BotController.cs b/DiscordBotPlugins/DiscordBotUI/Controllers/BotController.cs index 0a0d20e..9ed6b7c 100644 --- a/DiscordBotPlugins/DiscordBotUI/Controllers/BotController.cs +++ b/DiscordBotPlugins/DiscordBotUI/Controllers/BotController.cs @@ -18,24 +18,80 @@ namespace DiscordBotUI.Controllers Config.Data["prefix"]?.Length != 1) return RedirectToAction("Settings", "Home"); + bool isReady = true; if (DiscordBot.DiscordBot.Instance is null) { - new DiscordBot.DiscordBot(Config.Data["token"], Config.Data["prefix"]); - await DiscordBot.DiscordBot.Instance.Start(); - await DiscordBot.DiscordBot.Instance.LoadPlugins(); + isReady=false; + await Task.Run(async() => { + new DiscordBot.DiscordBot(Config.Data["token"], Config.Data["prefix"]); + await DiscordBot.DiscordBot.Instance.Start(); + await DiscordBot.DiscordBot.Instance.LoadPlugins(); + new PluginManager.Items.ConsoleCommandsHandler(DiscordBot.DiscordBot.Instance._boot.client); + }).ContinueWith((t) => { + isReady = true; + }); } + while (!isReady) + await Task.Delay(100); + + await Task.Delay(2000); + BotModel model = new BotModel(); model.StartStatus = DiscordBot.DiscordBot.Instance._boot.client.ConnectionState.ToString(); model.BotName = DiscordBot.DiscordBot.Instance._boot.client.CurrentUser.Username; model.PluginsLoaded = PluginManager.Loaders.PluginLoader.PluginsLoaded; - model.SlashCommands = PluginManager.Loaders.PluginLoader.SlashCommands; - model.Events = PluginManager.Loaders.PluginLoader.Events; - model.Commands = PluginManager.Loaders.PluginLoader.Commands; + model.SlashCommands = PluginManager.Loaders.PluginLoader.SlashCommands ?? new List(); + model.Events = PluginManager.Loaders.PluginLoader.Events ?? new List(); + model.Commands = PluginManager.Loaders.PluginLoader.Commands ?? new List(); return View(model); } + + public async Task PluginsPage() + { + if(DiscordBot.DiscordBot.Instance is null) { + return RedirectToAction("Start"); + } + + PluginsPageModel model = new PluginsPageModel(); + if (PluginManager.Loaders.PluginLoader.Commands != null) + model.InstalledCommands = PluginManager.Loaders.PluginLoader.Commands.Select(x => x.Command).ToList(); + else model.InstalledCommands = new List(); + if (PluginManager.Loaders.PluginLoader.Events != null) + model.InstalledEvents = PluginManager.Loaders.PluginLoader.Events.Select(x => x.Name).ToList(); + else model.InstalledEvents = new List(); + if (PluginManager.Loaders.PluginLoader.SlashCommands != null) + model.InstalledSlashCommands = PluginManager.Loaders.PluginLoader.SlashCommands.Select(x => x.Name).ToList(); + else model.InstalledSlashCommands = new List(); + model.PluginsManager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt"); + List plugins = await model.PluginsManager.ListAvailablePlugins(); + if (plugins == null) return RedirectToAction("Start"); + + model.Plugins = plugins; + + return View(model); + } + + [HttpGet] + public async Task InstallPlugin(string pluginName) + { + try + { + if(!DiscordBot.DiscordBot.Instance._boot.isReady) + return 1; + await PluginManager.Items.ConsoleCommandsHandler.ExecuteCommad("dwplug " + pluginName); + return 0; + } + catch (Exception ex) + { + Logger.LogError(ex); + Console.WriteLine(ex.ToString()); + return 1; + } + + } } } diff --git a/DiscordBotPlugins/DiscordBotUI/Models/Bot/PluginsPageModel.cs b/DiscordBotPlugins/DiscordBotUI/Models/Bot/PluginsPageModel.cs new file mode 100644 index 0000000..10a5b29 --- /dev/null +++ b/DiscordBotPlugins/DiscordBotUI/Models/Bot/PluginsPageModel.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using PluginManager.Interfaces; + +namespace DiscordBotUI.Models.Bot +{ + public class PluginsPageModel + { + public List InstalledCommands {get;set;} + public List InstalledEvents {get;set;} + public List InstalledSlashCommands {get;set;} + public List Plugins {get;set;} + + public PluginManager.Online.PluginsManager PluginsManager {get;set;} + } +} \ No newline at end of file diff --git a/DiscordBotPlugins/DiscordBotUI/Views/Bot/PluginsPage.cshtml b/DiscordBotPlugins/DiscordBotUI/Views/Bot/PluginsPage.cshtml new file mode 100644 index 0000000..ba45178 --- /dev/null +++ b/DiscordBotPlugins/DiscordBotUI/Views/Bot/PluginsPage.cshtml @@ -0,0 +1,72 @@ +@model DiscordBotUI.Models.Bot.PluginsPageModel + + + + + + + + + + + + + + + + @foreach (var item in Model.Plugins) + { + @if (item.Contains("+") || item.Contains("-") || item[0].Length < 2 || item[0] == "Name") continue; + + + + + + @if (Model.InstalledCommands.Contains(item[0]) || Model.InstalledEvents.Contains(item[0]) || + Model.InstalledSlashCommands.Contains(item[0])) + { + + } + else + { + + } + + + + } + +
Plugin NamePlugin DescriptionPlugin TypePlugin Version
@item[0]@item[1]@item[2]@item[3]Installed + +
+ + + + + + \ No newline at end of file diff --git a/DiscordBotPlugins/DiscordBotUI/Views/Bot/Start.cshtml b/DiscordBotPlugins/DiscordBotUI/Views/Bot/Start.cshtml index 71a29e3..83f2bc2 100644 --- a/DiscordBotPlugins/DiscordBotUI/Views/Bot/Start.cshtml +++ b/DiscordBotPlugins/DiscordBotUI/Views/Bot/Start.cshtml @@ -1,10 +1,12 @@ @model DiscordBotUI.Models.Bot.BotModel + - + +
- +
- + -
+

Commands

@@ -57,7 +59,7 @@ @foreach(var cmd in Model.Commands) { - + @@ -81,7 +83,7 @@ @foreach(var eve in Model.Events) { - + @@ -99,7 +101,7 @@ @foreach(var scmd in Model.SlashCommands) { - + @if (scmd.canUseDM) @@ -113,4 +115,4 @@ }
@cmd.Command @cmd.Description @cmd.Usage
@eve.Name @eve.Description
@scmd.Name @scmd.Description
-
+
\ No newline at end of file diff --git a/DiscordBotPlugins/DiscordBotUI/Views/Shared/_Layout.cshtml b/DiscordBotPlugins/DiscordBotUI/Views/Shared/_Layout.cshtml index 4ffae15..6d6fd99 100644 --- a/DiscordBotPlugins/DiscordBotUI/Views/Shared/_Layout.cshtml +++ b/DiscordBotPlugins/DiscordBotUI/Views/Shared/_Layout.cshtml @@ -23,6 +23,9 @@ + diff --git a/DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/plugins.css b/DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/plugins.css new file mode 100644 index 0000000..a2af01d --- /dev/null +++ b/DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/plugins.css @@ -0,0 +1,44 @@ +html { + height: 100%; +} + +body { + margin: 0; + padding: 25px; + font-family: sans-serif; + background: linear-gradient(#141e30, #243b55); +} + +.demo-container { + width: 300px; + margin: auto; +} + +.progress-bar { + height: 4px; + background-color: rgba(5, 114, 206, 0.2); + width: 100%; + overflow: hidden; +} + +.progress-bar-value { + width: 100%; + height: 100%; + background-color: rgb(5, 114, 206); + animation: indeterminateAnimation 1s infinite linear; + transform-origin: 0% 50%; +} + +@keyframes indeterminateAnimation { + 0% { + transform: translateX(0) scaleX(0); + } + + 40% { + transform: translateX(0) scaleX(0.4); + } + + 100% { + transform: translateX(100%) scaleX(0.5); + } +} \ No newline at end of file diff --git a/DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/start.css b/DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/start.css new file mode 100644 index 0000000..ad15601 --- /dev/null +++ b/DiscordBotPlugins/DiscordBotUI/wwwroot/css/bot/start.css @@ -0,0 +1,10 @@ +html { + height: 100%; +} + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + background: linear-gradient(#141e30, #243b55); +} \ No newline at end of file diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index 83cd1fd..94cce23 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -66,7 +66,16 @@ public class PluginLoader /// public static List? SlashCommands { get; set; } - public static int PluginsLoaded { get => Commands!.Count + Events!.Count + SlashCommands!.Count;} + public static int PluginsLoaded { get { + var count = 0; + if (Commands is not null) + count += Commands.Count; + if (Events is not null) + count += Events.Count; + if (SlashCommands is not null) + count += SlashCommands.Count; + return count; + }} /// /// The main mathod that is called to load all events diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 8b3f2da..fa71239 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -29,7 +29,7 @@ public class PluginsManager /// The method to load all plugins /// /// - public async Task ListAvailablePlugins() + public async Task> ListAvailablePlugins() { try { @@ -81,12 +81,16 @@ public class PluginsManager data.Add(new[] { "-", "-", "-", "-" }); Utilities.FormatAndAlignTable(data, TableFormat.CENTER_EACH_COLUMN_BASED); + + return data; } catch (Exception exception) { Logger.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message); Logger.WriteErrFile(exception.ToString()); } + + return null; } ///