From 29e4a3be049ab593d11efd4685d4497ddaf949ce Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 20 Apr 2022 21:59:49 +0300 Subject: [PATCH] Bot automatically downloads requirements for plugins --- .gitignore | 3 +- DiscordBot/Program.cs | 25 +++++++++++ PluginManager/Online/Downloader.cs | 8 ++-- PluginManager/Online/PluginsManager.cs | 15 +++++-- PluginManager/Online/ServerCom.cs | 58 ++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 PluginManager/Online/ServerCom.cs diff --git a/.gitignore b/.gitignore index cb16e8e..438a539 100644 --- a/.gitignore +++ b/.gitignore @@ -361,4 +361,5 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd +/BUILDS/DLL diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index d824150..5f12ecf 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -10,6 +10,7 @@ using PluginManager.Loaders; using PluginManager.LanguageSystem; using PluginManager.Online; using System.Diagnostics; +using System.Collections.Generic; namespace DiscordBot { @@ -106,6 +107,9 @@ namespace DiscordBot case "dwplug": string name = data.MergeStrings(1); + // info[0] = plugin type + // info[1] = plugin link + // info[2] = if others are required, or string.Empty if none string[] info = await manager.GetPluginLinkByName(name); if (info[1] == null) // link is null { @@ -120,6 +124,27 @@ namespace DiscordBot } Downloader dw = new Downloader(name + ".dll", info[1]); await dw.DownloadFileAsync("./Data/Plugins/", info[0]); + + // check requirements if any + + if (info.Length == 3 && info[2] != string.Empty && info[2] != null) + { + Console.WriteLine($"Downloading requirements for plugin : {name}"); + // + List lines = await ServerCom.ReadTextFromFile(info[2]); + int i = 1; + foreach (var line in lines) + { + string[] split = line.Split(','); + Console.WriteLine($"Downloading item: {split[1]}"); + await ServerCom.DownloadFileAsync(split[0], split[1], i, lines.Count); + Functions.WriteColorText($"Downloaded item {split[1]}"); + i++; + } + Console.WriteLine(); + break; + } + break; case "setlang": if (data.Length == 2) diff --git a/PluginManager/Online/Downloader.cs b/PluginManager/Online/Downloader.cs index 5c439a6..8c7240e 100644 --- a/PluginManager/Online/Downloader.cs +++ b/PluginManager/Online/Downloader.cs @@ -22,8 +22,11 @@ namespace PluginManager.Online } - public async Task DownloadFileAsync(string location = @"./Downloads/", string? pluginType = null) + public async Task DownloadFileAsync(string location = @"./Downloads/", string? pluginType = null, string customMessage = null) { + if (customMessage != null) + Console.WriteLine(customMessage); + Directory.CreateDirectory(location); if (isWorking) return; isWorking = true; @@ -73,9 +76,6 @@ namespace PluginManager.Online Console.ForegroundColor = c; Console.Write(" !\n"); } - - - } } diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 35af46e..76a1620 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -93,16 +93,25 @@ namespace PluginManager.Online { string[] contents = lines[i].Split(','); if (contents[0] == name) - return new string[] { contents[2], contents[3] }; + { + if (contents.Length == 6) + return new string[] { contents[2], contents[3], contents[5] }; + else if (contents.Length == 5) + return new string[] { contents[2], contents[3], string.Empty }; + else throw new Exception("Failed to download plugin. Invalid Argument Length"); + } + } } catch (Exception exception) { - Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message); + Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message); Others.Functions.WriteErrFile(exception.ToString()); } - return new string[] { null!, null! }; + return new string[] { null!, null!, null! }; } + + } } diff --git a/PluginManager/Online/ServerCom.cs b/PluginManager/Online/ServerCom.cs new file mode 100644 index 0000000..df24653 --- /dev/null +++ b/PluginManager/Online/ServerCom.cs @@ -0,0 +1,58 @@ +using PluginManager.Items; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace PluginManager.Online +{ + public class ServerCom + { + public static async Task> ReadTextFromFile(string link) + { + List s = new List(); + WebClient webClient = new WebClient(); + var data = await webClient.OpenReadTaskAsync(link); + var response = await new StreamReader(data).ReadToEndAsync(); + s.AddRange(from a in response.Split('\n') + where !a.StartsWith("$") + select a); + return s; + } + + public static async Task DownloadFileAsync(string url, string location, int downloadNumber, int totalToDownload) + { + WebClient client = new WebClient(); + Spinner spinner = new Spinner(); + Console.Write("Downloading "); + spinner.Start(); + string oldTitle = Console.Title ?? ""; + client.DownloadProgressChanged += (sender, e) => + { + Console.Title = e.BytesReceived / 1024 + "/" + e.TotalBytesToReceive / 1024 + " (" + e.ProgressPercentage + "%) (" + downloadNumber + " / " + totalToDownload + ")"; + }; + client.DownloadFileCompleted += (sender, e) => + { + spinner.Stop(); Console.WriteLine(); + + }; + try + { + await client.DownloadFileTaskAsync(new Uri(url), location); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + finally + { + Console.Title = oldTitle; + } + + } + } +}