From c40fcdac9d7080771f54797761ad20060bda18f7 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 6 Jul 2022 13:59:59 +0300 Subject: [PATCH 01/36] --- Version.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Version.txt diff --git a/Version.txt b/Version.txt deleted file mode 100644 index c227083..0000000 --- a/Version.txt +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file From 27fe6154475caec667b96a59e308d8fea8bbe694 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 6 Jul 2022 14:00:41 +0300 Subject: [PATCH 02/36] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 5aee53e..603c14f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ This project is based on: - [.NET 6 (C#)](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) - [Discord.Net](https://github.com/discord-net/Discord.Net) -- [Avalonia UI](https://avaloniaui.net/) for `DiscordBotUI` extension ## Plugins From efb6ac51923df9f491d70b6e6b0f3fd454172a77 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 6 Jul 2022 14:32:16 +0300 Subject: [PATCH 03/36] --- DiscordBot/Discord/Core/Boot.cs | 10 ---------- DiscordBot/Program.cs | 1 + PluginManager/Config.cs | 1 - PluginManager/Items/ConsoleCommandsHandler.cs | 2 ++ PluginManager/Others/Functions.cs | 4 ++-- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/DiscordBot/Discord/Core/Boot.cs b/DiscordBot/Discord/Core/Boot.cs index ce2ad4c..2c6e9f7 100644 --- a/DiscordBot/Discord/Core/Boot.cs +++ b/DiscordBot/Discord/Core/Boot.cs @@ -96,16 +96,6 @@ internal class Boot Console.Title = "ONLINE"; isReady = true; - new Thread(() => - { - while (true) - { - Config.SaveConfig(); - Thread.Sleep(10000); - } - } - ).Start(); - return Task.CompletedTask; } diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index c78d07d..bbce4ef 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -99,6 +99,7 @@ public class Program Console.WriteLine($"Running on version: {Config.GetValue("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}"); Console.WriteLine($"Git URL: {Config.GetValue("GitURL") ?? " Could not find Git URL"}"); + Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command &y(sd) &ror some settings won't be saved"); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine($"============================ LOG ============================"); diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 985abc8..5314c53 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -5,7 +5,6 @@ using System.Text.Json; using System.Threading.Tasks; using System.Collections.Generic; using System.Threading; -using Newtonsoft.Json.Linq; namespace PluginManager { diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 0e88442..9e22455 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -246,6 +246,8 @@ public class ConsoleCommandsHandler await client.StopAsync(); await client.DisposeAsync(); Config.SaveConfig(); + Console.WriteLine("Bot is closing in 2 seconds ! Please wait to save data !"); + await Task.Delay(2000); Environment.Exit(0); } ); diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index c1df251..38bba1d 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -77,7 +77,7 @@ namespace PluginManager.Others /// The message to be wrote public static void WriteLogFile(string LogMessage) { - string logsPath = logFolder + "Log.txt"; + string logsPath = logFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Log.txt"; if (!Directory.Exists(logFolder)) Directory.CreateDirectory(logFolder); File.AppendAllText(logsPath, LogMessage + " \n"); } @@ -88,7 +88,7 @@ namespace PluginManager.Others /// The message to be wrote public static void WriteErrFile(string ErrMessage) { - string errPath = errFolder + "Error.txt"; + string errPath = errFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Error.txt"; if (!Directory.Exists(errFolder)) Directory.CreateDirectory(errFolder); File.AppendAllText(errPath, ErrMessage + " \n"); } From 3097eb7fca9a41ef9554b0c96a4c888c004990fe Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 6 Jul 2022 14:43:10 +0300 Subject: [PATCH 04/36] --- DiscordBot/Program.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index bbce4ef..0701871 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -253,7 +253,8 @@ public class Program string[] s = key.Split(' '); try { - Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase)); + if (Config.ContainsKey(s[0])) Config.SetValue(s[0], s[1]); + else Config.GetAndAddValueToVariable(s[0], s[1], s[2].Equals("true", StringComparison.CurrentCultureIgnoreCase)); } catch (Exception ex) { From 2db6bf2729e4804b2488da7f09c6cd97861acb16 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 7 Jul 2022 13:55:32 +0300 Subject: [PATCH 05/36] --- DiscordBotWithAPI.sln => SethDiscordBot.sln | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename DiscordBotWithAPI.sln => SethDiscordBot.sln (100%) diff --git a/DiscordBotWithAPI.sln b/SethDiscordBot.sln similarity index 100% rename from DiscordBotWithAPI.sln rename to SethDiscordBot.sln From 45bbda81859bd10ee0edf8e1303612a069452948 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 7 Jul 2022 13:56:21 +0300 Subject: [PATCH 06/36] --- DiscordBot.dll | Bin 44544 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 DiscordBot.dll diff --git a/DiscordBot.dll b/DiscordBot.dll deleted file mode 100644 index 88b751e3768b787edb6a098b458953a178fa8c7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44544 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 Date: Sat, 9 Jul 2022 09:48:45 +0300 Subject: [PATCH 07/36] updated music --- .idea/.idea.SethDiscordBot/.idea/.name | 1 + .../.idea.SethDiscordBot/.idea/encodings.xml | 4 ++ .../.idea/indexLayout.xml | 8 +++ .idea/.idea.SethDiscordBot/.idea/vcs.xml | 6 +++ YoutubeExtension/Others/Data.cs | 12 +++++ YoutubeExtension/Others/MusicPlayer.cs | 50 +++++++++++++++++++ YoutubeExtension/Others/YTVideo.cs | 18 +++++++ YoutubeExtension/YoutubeExtension.csproj | 9 ++++ YoutubeExtension/ytPlay.cs | 6 +++ 9 files changed, 114 insertions(+) create mode 100644 .idea/.idea.SethDiscordBot/.idea/.name create mode 100644 .idea/.idea.SethDiscordBot/.idea/encodings.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/indexLayout.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/vcs.xml create mode 100644 YoutubeExtension/Others/Data.cs create mode 100644 YoutubeExtension/Others/MusicPlayer.cs create mode 100644 YoutubeExtension/Others/YTVideo.cs create mode 100644 YoutubeExtension/YoutubeExtension.csproj create mode 100644 YoutubeExtension/ytPlay.cs diff --git a/.idea/.idea.SethDiscordBot/.idea/.name b/.idea/.idea.SethDiscordBot/.idea/.name new file mode 100644 index 0000000..ac07819 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/.name @@ -0,0 +1 @@ +SethDiscordBot \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/encodings.xml b/.idea/.idea.SethDiscordBot/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/vcs.xml b/.idea/.idea.SethDiscordBot/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/YoutubeExtension/Others/Data.cs b/YoutubeExtension/Others/Data.cs new file mode 100644 index 0000000..ef50961 --- /dev/null +++ b/YoutubeExtension/Others/Data.cs @@ -0,0 +1,12 @@ +using Discord; +using Discord.Audio; + +namespace YoutubeExtension.Downloader; + +internal static class Data +{ + internal static IAudioClient audioClient = null; + internal static IVoiceChannel voiceChannel = null; + + internal static MusicPlayer CurrentlyRunning = null; +} diff --git a/YoutubeExtension/Others/MusicPlayer.cs b/YoutubeExtension/Others/MusicPlayer.cs new file mode 100644 index 0000000..bfbafd9 --- /dev/null +++ b/YoutubeExtension/Others/MusicPlayer.cs @@ -0,0 +1,50 @@ +namespace YoutubeExtension.Downloader; + +internal class MusicPlayer +{ + public MusicPlayer(Stream input, Stream output) + { + inputStream = input; + outputStream = output; + } + + public Stream inputStream { get; } // from outside + public Stream outputStream { get; } // to Voice Channel + + public bool Paused { get; set; } + private bool _stop { get; set; } + + public void Stop() + { + _stop = true; + } + + public async Task StartSendAudio() + { + Paused = false; + _stop = false; + while (!_stop) + { + if (Paused) continue; + var bsize = 512; + var buffer = new byte[bsize]; + var bcount = await inputStream.ReadAsync(buffer, 0, bsize); + if (bcount <= 0) + { + Stop(); + Data.CurrentlyRunning = null; + break; + } + + try + { + await outputStream.WriteAsync(buffer, 0, bcount); + } + catch (Exception ex) + { + await outputStream.FlushAsync(); + PluginManager.Others.Functions.WriteLogFile(ex.ToString()); + } + } + } +} diff --git a/YoutubeExtension/Others/YTVideo.cs b/YoutubeExtension/Others/YTVideo.cs new file mode 100644 index 0000000..36bc4f9 --- /dev/null +++ b/YoutubeExtension/Others/YTVideo.cs @@ -0,0 +1,18 @@ +using MediaToolkit; +using MediaToolkit.Model; +using VideoLibrary; + +namespace YoutubeExtension.Downloader; + +public class YoutubeHandler +{ + + public static async Task GetVideoStream(string videoURL) + { + var youtube = YouTube.Default; + var video = await youtube.GetVideoAsync(videoURL); + + return await video.StreamAsync(); + + } +} diff --git a/YoutubeExtension/YoutubeExtension.csproj b/YoutubeExtension/YoutubeExtension.csproj new file mode 100644 index 0000000..eb2460e --- /dev/null +++ b/YoutubeExtension/YoutubeExtension.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/YoutubeExtension/ytPlay.cs b/YoutubeExtension/ytPlay.cs new file mode 100644 index 0000000..8e71e2a --- /dev/null +++ b/YoutubeExtension/ytPlay.cs @@ -0,0 +1,6 @@ +namespace YoutubeExtension; + +public class ytPlay +{ + +} From 3839e4d838a4f290715f4f3d02ce691b02aaade7 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 9 Jul 2022 09:48:58 +0300 Subject: [PATCH 08/36] patch --- .idea/.idea.SethDiscordBot/.idea/.gitignore | 13 ++++ BUILDS/net6.0/MusicCommands.deps.json | 68 ++++++++++++++++- BUILDS/net6.0/MusicCommands.dll | Bin 17920 -> 17920 bytes BUILDS/net6.0/PluginManager.dll | Bin 63488 -> 61952 bytes .../net6.0/Plugins/Commands/MusicCommands.dll | Bin 17920 -> 17920 bytes MusicCommands/MusicCommands.csproj | 4 + MusicCommands/Play.cs | 57 +++++++++++++-- MusicCommands/lplay.cs | 49 ------------- PluginManager/Items/ConsoleCommandsHandler.cs | 26 ++++--- PluginManager/Others/Console Utilities.cs | 7 +- PluginManager/Others/Enums.cs | 4 +- PluginManager/Others/Functions.cs | 69 +++++++++++++++--- YoutubeExtension/Others/Data.cs | 12 --- YoutubeExtension/Others/MusicPlayer.cs | 50 ------------- YoutubeExtension/Others/YTVideo.cs | 18 ----- YoutubeExtension/YoutubeExtension.csproj | 9 --- YoutubeExtension/ytPlay.cs | 6 -- 17 files changed, 215 insertions(+), 177 deletions(-) create mode 100644 .idea/.idea.SethDiscordBot/.idea/.gitignore delete mode 100644 MusicCommands/lplay.cs delete mode 100644 YoutubeExtension/Others/Data.cs delete mode 100644 YoutubeExtension/Others/MusicPlayer.cs delete mode 100644 YoutubeExtension/Others/YTVideo.cs delete mode 100644 YoutubeExtension/YoutubeExtension.csproj delete mode 100644 YoutubeExtension/ytPlay.cs diff --git a/.idea/.idea.SethDiscordBot/.idea/.gitignore b/.idea/.idea.SethDiscordBot/.idea/.gitignore new file mode 100644 index 0000000..7fa1cfe --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/projectSettingsUpdater.xml +/contentModel.xml +/.idea.SethDiscordBot.iml +/modules.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/BUILDS/net6.0/MusicCommands.deps.json b/BUILDS/net6.0/MusicCommands.deps.json index bf027a3..1c91428 100644 --- a/BUILDS/net6.0/MusicCommands.deps.json +++ b/BUILDS/net6.0/MusicCommands.deps.json @@ -8,12 +8,25 @@ ".NETCoreApp,Version=v6.0": { "MusicCommands/1.0.0": { "dependencies": { - "PluginManager": "1.0.0" + "PluginManager": "1.0.0", + "YoutubeExplode": "6.2.0" }, "runtime": { "MusicCommands.dll": {} } }, + "AngleSharp/0.17.0": { + "dependencies": { + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/AngleSharp.dll": { + "assemblyVersion": "0.17.0.0", + "fileVersion": "0.17.0.0" + } + } + }, "Discord.Net/3.7.2": { "dependencies": { "Discord.Net.Commands": "3.7.2", @@ -108,6 +121,7 @@ } } }, + "Microsoft.NETCore.Platforms/5.0.0": {}, "Newtonsoft.Json/13.0.1": { "runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { @@ -116,6 +130,7 @@ } } }, + "System.Buffers/4.5.1": {}, "System.Collections.Immutable/5.0.0": {}, "System.Interactive.Async/5.0.0": { "dependencies": { @@ -144,7 +159,23 @@ } } }, + "System.Text.Encoding.CodePages/5.0.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0" + } + }, "System.ValueTuple/4.5.0": {}, + "YoutubeExplode/6.2.0": { + "dependencies": { + "AngleSharp": "0.17.0" + }, + "runtime": { + "lib/net5.0/YoutubeExplode.dll": { + "assemblyVersion": "6.2.0.0", + "fileVersion": "6.2.0.0" + } + } + }, "PluginManager/1.0.0": { "dependencies": { "Discord.Net": "3.7.2" @@ -161,6 +192,13 @@ "serviceable": false, "sha512": "" }, + "AngleSharp/0.17.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-74haoXINcj4SdMsmiNzk+9VUwIX1U9P61O6AZd5Uao8SGNnJJB8Y/r8VJRc8orn4c7Vk/oURAKSNF9XcSDxbfA==", + "path": "anglesharp/0.17.0", + "hashPath": "anglesharp.0.17.0.nupkg.sha512" + }, "Discord.Net/3.7.2": { "type": "package", "serviceable": true, @@ -217,6 +255,13 @@ "path": "microsoft.extensions.dependencyinjection.abstractions/5.0.0", "hashPath": "microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512" }, + "Microsoft.NETCore.Platforms/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==", + "path": "microsoft.netcore.platforms/5.0.0", + "hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512" + }, "Newtonsoft.Json/13.0.1": { "type": "package", "serviceable": true, @@ -224,6 +269,13 @@ "path": "newtonsoft.json/13.0.1", "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" }, + "System.Buffers/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", + "path": "system.buffers/4.5.1", + "hashPath": "system.buffers.4.5.1.nupkg.sha512" + }, "System.Collections.Immutable/5.0.0": { "type": "package", "serviceable": true, @@ -252,6 +304,13 @@ "path": "system.reactive/5.0.0", "hashPath": "system.reactive.5.0.0.nupkg.sha512" }, + "System.Text.Encoding.CodePages/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==", + "path": "system.text.encoding.codepages/5.0.0", + "hashPath": "system.text.encoding.codepages.5.0.0.nupkg.sha512" + }, "System.ValueTuple/4.5.0": { "type": "package", "serviceable": true, @@ -259,6 +318,13 @@ "path": "system.valuetuple/4.5.0", "hashPath": "system.valuetuple.4.5.0.nupkg.sha512" }, + "YoutubeExplode/6.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oH5kst4w1QkUwRjJco0alF57JOmFofSGlPkr4OniODB8R6MEyRWn1xFg3JS2wFYd6scZluoXRDhM3/uyUjO9/g==", + "path": "youtubeexplode/6.2.0", + "hashPath": "youtubeexplode.6.2.0.nupkg.sha512" + }, "PluginManager/1.0.0": { "type": "project", "serviceable": false, diff --git a/BUILDS/net6.0/MusicCommands.dll b/BUILDS/net6.0/MusicCommands.dll index 19a1e1a914933c1084ae418b1848823652babba6..729722c56b94d146dec23bf174d76efc07f0c9b6 100644 GIT binary patch literal 17920 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 z z!28-!w{W8=~ADcBRR)akyYlAv&GuiDQ+86lQzvYaUBe5z@@l94=^WNXA#(~UvRI)WhpVyE9Xq$|bFe76 z!kdn)q3w2d0@ZEV@%+IwDww{@>}SHtyO31+kKwNm?2H?P9>$qfqS7Or;1KnYp*c&i zOqE^J!*)#P(_?TDXMud@cqZdU`|kc7I+uv{ttt3PQmWhRA|h&+mz0FHDoF`motKbO zCY{_Vx3gaH!j!Y`o=)fNzVXR)mPBaZ)Kn%tCLvJvt$ozp9;DB1C!gj((;3!7u;{nl zGiFao3%h5)&X48N8b{=eArFbaIaJFDKvZ5d4?vwM(Im-J)aaUg^`g_muGiodLo_Ok;)>)=4fcRkVXd0i3yxo zY3OEVl&YRtsj^V_ghITB>BEZj(wpwEojZZvGSj%Pm#M1sa^r>VpIIWirl58{WqbfxUz$2ZDzYO@&<& z1$pdLcTZ!p^3b`1+EqA)?B;2&@=d23JrW3gxrymXsK|@U%gDBSa6rr>>t_+Vv}^P( zoHoinJ!p^WX)9AWf+|$8k>z10oz4_^|8i?XddX(e&`2ph^!DpIho4(@_cE=)rHyGW z*V{ZPPL@URx`2%Zu8Rn_zB|SH0VWkE<#FwJSu16Od5?cI8S;82@Rnm5Tp7HhqsSEaxHqh6-CeF%tf|PR$kDQl_ow|R zwDV|bL8T{a&qB{6=+Hm!C@h|YT%6X3`qyB*X*`M9c#AO#Eb<>br z<(Xys=irz1PN-AHu@0XjchX5{I05f=Vst!TV?t&7G0LVPNIL;4&(1h>@5e9K+lfk_ z+AkBqrfIhqP#eWy6JX2&@|0dVJUY1+Ib3I`H6ouQKzO>c2+>ZW zhV9Ujg5hk_1StHETK0mYLQSAO1^yHsu@eX_9>*!*I4A?pxx8#IPY&Uw9!0`<6n7vK z0aMqBmmxdKVNJek@xcdA!g1UV+{?DH)x2oXpXmSGt_J_Sdw&1@2fy>b@^A0?Dwzqx z2>KFa_)&>Q8Lj1NtWV%!i^-+?&43YGjyD<6bfC*HjQLCOF%45dPI4{Dwe@~5lzx-( z_5K9KN)I!&i}5b5^>D4nk6P&oi+r`XSf2_KQ(~pxsR>v?6-~vKoH1XV-yZX-4wOS%<7H#9^~8A08`k|3lum{2XXzG&&w(5Ns%Sohf# ziEu-#^aA?Vs#xj8Sm~u$=_|3)%dyfoT4JSd;(jq&`gXwO2_}d|#>vu>!{M@Wm>MUM zc@EXs#+rmrciNzoa{F)4-8OjLHpG&Cv9mT|#){F>>w@4*2^pgJvzPtV+vp8580+HE z+rel`#cWSUu!TRP5OqNayxRzdv|(TmC486!VGybKcpuZ-7^s1W*!pl#$q3lx5a>@R zV{tRjcdYateltf;*O>KiU^qY~PngVDxU6D*OTZI@S?CeZX!nb$VKN$G_xp|7*dCb3 z6?mxyE+kdkQX7Ohmh*#Z!Sb;b1pC_I@s~ywR6bR_4Ej=3R6@8_%Dj2gP z38>=9EInEq^lAak@My%HEAAsQ8^V}P&3@M7KI?LyEpwlZ^#&3?gB^%cJRSVpO(XY3 z|0=x6XT>()-iW*2v|=#AQpyVYtY{jf9k}r;dko(l#A-lGp`5R*S`@{A8$fQk!L+bw zd{&EJS&PwbThb0mu@2meS@;tS9#vKtGtB{Cdep0&4JS+^wj;JDwqJ!XgD?dD^(=CM zS*(@f37NUYz9iM+R{kVbz}cXI_uG6e;ZH>Nsm6o3)YMKVTRv;^1Ln!R0Y3f7559|U z?%cU;A3s*(EZ^Zi5Z!pj@8= zTY7(kt*JO^<_0pE9VtB8P4df5+m`1{ZoRMqGA>p#SJ?j(W{B`+oCW5J;UJc8*)E|o z-z~U5cm&_eDaQ2muHv7h57019QU~xxdoOB3_)Ghpz=r?_^hdO6 zj)}5LtWXC44M^ov)F6%ld?w>F%~5R4d@aZOcEUUL960c}D<_}=_;_>I*XPVzAk=_O z1#szu#HEs!3y(gbF5^nCT2gmq3)w^=_pP`}n`W WwOfCS`nenb3ykIe58*%Uf&UB5pe{QA diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index bb6f20f8c19cc69a9a8eeee1d80002645c20c2af..b57de9d706a1e9da9620295bc5fc2e06ead779f3 100644 GIT binary patch literal 61952 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 literal 63488 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 z z>V6vArZ7&t9_1>D-<#3|h0%b}MzWIUj0L0=V(C7~tWBklx=f)0FeW7kW`s6}t+&wZ zI0Mr>yKS>8k55srW5y)Sw>)u6sLOk`wNm*WOedOwe)S*&RXWj#Ab{N)oXH$oREvrZkKvC#!+vVQ%xb63jYsBJ=Xd^^?AIEA~P_lf+3d1af zn?GPKW1h#mpGl2PWOFvYLU*drc~^jlMuL~@ck^LlQ;WRiBxFFkQ{HHFr;wU8vBuJY zdnNmf%(w}^X`>o-?uXW$`@VJOe%xA7(7V|pN++nGcJFHJmDHGL!I&882UqC4SJ)j5 z#w?#thV`C=U%2^8ObW50&rsVGpml7wjmC<1v$x~0=(Z1gl6?Lb9^^q!q(YpvHbmg}MD}rlcyCeu(L50gCXle`*DC8Ly#`s5f%zKC6=8IqZ&6x3?P6*Hi_tIT-!OI$4Qr$B)} zBCsl7_N88#;20F|xGAP`j3`}LN!wV4&3+8`bo7J5ZY-$}CbI?a=O*$D8tq4Sl1ZYB z*C$!duD99v3TYsoBp=&+wKeyU4~V;NV9s{sD3Kt`07Bm`G9176rflB5ujdQ0gwojV z@ObwtGu`tcjI@!z9CIeq*+ka588}|5rmJ6Pff#Cd)LCTt~Pv%ZU|vYw!58{QnyNXVN2Sigwc@Psz?k@_~P( zk3UwsRidwO-BR`0^vDq2&WB4h`^`{!gRAEMUQ2jS98r|Pa+e43BWKPOi?IsY1wo;og_8p?lyov)}+JFrALma11YH5{i!liZ)JY2fqW$+ol@kQ%2;?S zd1A*HiBee~@#b?@f{anQ!sAQ`g^GkT={yUw5ghsnm(OaEM_wQml@ZmWF&>dZq0ZL} zo!{oo^hw0m`9_YZ()m`Q^G`>?>Dgur>NMe9K2M<;cj9)z-OnE;^ztF%eU+uP;X!}n z&yEQa`U;(&JswNfoWL_)$sTk zvR&e@xN9Ro#!*GT;Lr*51FG+P%6zra>j%mr zt@D1in0mVNLv+PoS*a6bA`%rAcG=%RPL_GfJL1ULt{E0{wNQ?Wwt7Wd2Hg1>?T1Ds zXIrWCy!r&gAR-XqRsmDUplQ7igdpC5l-=QLf=@w zlKxxQI3Bv#_q2c>k$a<=0xoMa=X}b2WO8wKMNc7e66)8k`X}5zbLaWVGa$%6-g|hC z^H+K^nLVpnNVy{eM-H7EoDNHrU$>sLVfctx(Acp zhhg@hH&UcvN9qU2ZeP=Q;A%G2d(q(kLEGoJ)0lEI z2aY-%Jr0jj_vzk&R4{^9__EUfJxu;^cK?X3@@0C1xa{n@Oj6%_6XNG$PV$ z#z~+80((booE9?t0>KVHLdw?=eVOxMX`Iv%4&T<_ut(Z?u8xAyxf+kjSM*{P!1PAw zM}dXjQ%Uc9_g9Z7^*8u)bTI3FoKIl>v(m*q03rKFeQ?h4Dul*NwYs3^F1Pi5j3}Da zBc}TKtB-?YZ#MzU-_%RW7{V8%b_O|M&X@P%?k^YICI0nIWIvYzhM%9OF{F++!n!p+ zXE}_s%w60i&abXo>*t5V|K)#reT(JmuP<3G3kR-!XsvXH&lFg7EG0g&Gsk^j z-I3PM$E?)~wK@vav^(p)!!8E#_V6W;rl3hj8T`HJ{g^&xFlQLI|2@Y|e|W$Flss+y zqIbvo*kwfFm;v?utK9{w_Xk@V)XiAixUUBs$aw^gGlYjP!(x$c6=y$l^F79n|u!GZyHYMk+ zucc5f&Z@7NR^{xd)kAoc^y&G08C-QvEa+fPtB>l3^Z5+#gig^*f7`vBO8De>r?YrE l1s`>eV;f2PgMSZhBOd?1@WZzNGK>#6?)?9M{^oJue*tusJRJZ4 diff --git a/BUILDS/net6.0/Plugins/Commands/MusicCommands.dll b/BUILDS/net6.0/Plugins/Commands/MusicCommands.dll index b690a8c723d19e303dafec528429b3061ca85c7f..729722c56b94d146dec23bf174d76efc07f0c9b6 100644 GIT binary patch literal 17920 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 odYZsW=Pb%P*SRD1PLuBP-6a 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 + + + + diff --git a/MusicCommands/Play.cs b/MusicCommands/Play.cs index 0e9b181..eb6d73d 100644 --- a/MusicCommands/Play.cs +++ b/MusicCommands/Play.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Threading.Tasks; using Discord; using Discord.Audio; using Discord.Commands; @@ -12,11 +13,11 @@ namespace MusicCommands; internal class Play : DBCommand { - public string Command => "fplay"; + public string Command => "play"; public string Description => "Play music from a file"; - public string Usage => "fplay [name]"; + public string Usage => "fplay [name/url]"; public bool canUseDM => false; @@ -26,14 +27,42 @@ internal class Play : DBCommand public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) { - var path = "./Music"; - var FileName = Functions.GetArguments(message).ToArray().MergeStrings(0); - path += "/" + FileName + ".ogg"; - if (!File.Exists(path)) - { - Console.WriteLine("Unknown path " + path); + Directory.CreateDirectory("Music"); + var path = "./Music/"; + string[] splitted = message.Content.Split(' '); + if (splitted.Length < 2) return; + do + { + if (splitted.Length == 2) + { + if (!splitted[1].Contains("youtube.com")) + { + await context.Channel.SendMessageAsync("Invalid link"); + return; + } + + string url = splitted[1]; + path += $"{Functions.CreateMD5(url)}"; + if (File.Exists(path)) + break; + //await context.Channel.SendMessageAsync("Searching for " + url); + await GetMusicAudio(url, path); + //await context.Channel.SendMessageAsync("Playing: " + url); + } + else + { + string searchString = Functions.MergeStrings(splitted, 1); + path += $"{Functions.CreateMD5(searchString)}"; + + if (File.Exists(path)) + break; + await context.Channel.SendMessageAsync("Searching for " + searchString); + await GetMusicAudio(searchString, path); + await context.Channel.SendMessageAsync("Playing: " + searchString); + } } + while (false); Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; @@ -59,4 +88,16 @@ internal class Play : DBCommand { return Process.Start(new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", UseShellExecute = false, RedirectStandardOutput = true }); } + + private async Task GetMusicAudio(string url, string location) + { + Process proc = new Process(); + proc.StartInfo.FileName = "MusicDownloader.exe"; + proc.StartInfo.Arguments = $"{url},{location}"; + proc.StartInfo.UseShellExecute = false; + proc.StartInfo.RedirectStandardOutput = true; + + proc.Start(); + await proc.WaitForExitAsync(); + } } diff --git a/MusicCommands/lplay.cs b/MusicCommands/lplay.cs deleted file mode 100644 index 6adb117..0000000 --- a/MusicCommands/lplay.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Discord; -using Discord.Audio; -using Discord.Commands; -using Discord.WebSocket; -using PluginManager.Interfaces; - -namespace MusicCommands; - -internal class lplay : DBCommand -{ - public string Command => "lplay"; - - public string Description => "Play music from a link"; - - public string Usage => "lplay [url]"; - - public bool canUseDM => false; - - public bool canUseServer => false; - - public bool requireAdmin => false; - - public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) - { - var URL = message.Content.Split(' ')[1]; - if (!URL.EndsWith(".mp3") && !URL.EndsWith(".wav") && !URL.EndsWith(".flac") && !URL.EndsWith(".ogg")) - { - await message.Channel.SendMessageAsync("Invalid URL"); - return; - } - - Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; - if (Data.voiceChannel == null) - { - await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument."); - return; - } - - Data.audioClient = await Data.voiceChannel.ConnectAsync(); - - using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) - { - await message.Channel.SendMessageAsync("Loading..."); - - Data.CurrentlyRunning = new MusicPlayer(discord); - await Data.CurrentlyRunning.StartSendAudioFromLink(URL); - } - } -} diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 9e22455..48d5bde 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -22,7 +22,7 @@ public class ConsoleCommandsHandler { this.client = client; InitializeBasicCommands(); - Console.WriteLine("Initialized console command handler !"); + //Console.WriteLine("Initialized console command handler !"); } private void InitializeBasicCommands() @@ -128,9 +128,10 @@ public class ConsoleCommandsHandler string path; if (info[0] == "Command" || info[0] == "Event") - path = "./Data/Plugins/" + info[0] + "s/" + name + ".dll"; + path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" ? PluginLoader.pluginCMDExtension : PluginLoader.pluginEVEExtension); else path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}"; + //Console.WriteLine("Downloading: " + path + " [" + info[1] + "]"); await ServerCom.DownloadFileAsync(info[1], path); if (info[0] == "Command" || info[0] == "Event") if (info[0] == "Event") @@ -156,27 +157,32 @@ public class ConsoleCommandsHandler await ServerCom.DownloadFileAsync(split[0], "./" + split[1]); Console.WriteLine(); - if (split[0].EndsWith(".zip")) + if (split[0].EndsWith(".zip") || split[0].EndsWith(".pak") || split[0].EndsWith(".pkg")) { Console.WriteLine($"Extracting {split[1]}"); - var proc = 0d; + var proc = 0f; var isExtracting = true; - var bar = new Console_Utilities.ProgressBar { Max = 100, Color = ConsoleColor.Green }; + var bar = new Console_Utilities.ProgressBar { Max = 100f, Color = ConsoleColor.Green }; - IProgress extractProgress = new Progress(value => { proc = value; }); + IProgress extractProgress = new Progress(value => + { + proc = value; + } + ); new Thread(new Task(() => { while (isExtracting) { - bar.Update((int)proc); - if (proc >= 99.9f) break; + bar.Update(proc); + if (proc >= 99.9f) + isExtracting = false; Thread.Sleep(500); } } ).Start ).Start(); - await Functions.ExtractArchive("./" + split[1], "./", extractProgress); - bar.Update(100); + await Functions.ExtractArchive("./" + split[1], "./", extractProgress, UnzipProgressType.PercentageFromTotalSize); + bar.Update(100f); isExtracting = false; await Task.Delay(1000); bar.Update(100); diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 00dc30a..a3de752 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -10,12 +10,12 @@ namespace PluginManager.Others /// public class ProgressBar { - public int Max { get; init; } + public float Max { get; init; } public ConsoleColor Color { get; init; } public bool NoColor { get; init; } - public void Update(int progress, double speed = -1, string? unit = null) + public void Update(float progress, double speed = -1, string? unit = null) { Console.CursorLeft = 0; Console.Write("["); @@ -146,6 +146,9 @@ namespace PluginManager.Others Console.Write(m + " "); } + + Console.CursorLeft--; + if (appendNewLine) Console.Write('\n'); diff --git a/PluginManager/Others/Enums.cs b/PluginManager/Others/Enums.cs index c516802..6ace192 100644 --- a/PluginManager/Others/Enums.cs +++ b/PluginManager/Others/Enums.cs @@ -26,4 +26,6 @@ public enum OutputLogLevel { NONE, INFO, WARNING, ERROR, CRITICAL } /// /// Plugin Type /// -public enum PluginType { Command, Event, Unknown } \ No newline at end of file +public enum PluginType { Command, Event, Unknown } + +public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize } \ No newline at end of file diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 38bba1d..d88caf3 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -4,6 +4,7 @@ using System; using System.Threading.Tasks; using System.Linq; using System.Collections.Generic; +using System.Security.Cryptography; using Discord.WebSocket; using PluginManager.Items; using System.Threading; @@ -169,33 +170,69 @@ namespace PluginManager.Others /// /// The zip location /// The target location + /// The progress that is updated as a file is processed + /// The type of progress /// - public static async Task ExtractArchive(string zip, string folder, IProgress progress) + public static async Task ExtractArchive(string zip, string folder, IProgress progress, UnzipProgressType type) { if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); using (ZipArchive archive = ZipFile.OpenRead(zip)) { - int totalZIPFiles = archive.Entries.Count(); - int currentZIPFile = 0; - foreach (ZipArchiveEntry entry in archive.Entries) + if (type == UnzipProgressType.PercentageFromNumberOfFiles) { - if (entry.FullName.EndsWith("/")) - Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); + int totalZIPFiles = archive.Entries.Count(); + int currentZIPFile = 0; + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.FullName.EndsWith("/")) + Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); + + else + try + { + entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}"); + } + + currentZIPFile++; + await Task.Delay(10); + progress.Report((float)currentZIPFile / totalZIPFiles * 100); + } + } + else if (type == UnzipProgressType.PercentageFromTotalSize) + { + ulong zipSize = 0; + + foreach (ZipArchiveEntry entry in archive.Entries) + zipSize += (ulong)entry.CompressedLength; + + ulong currentSize = 0; + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.FullName.EndsWith("/")) + { + Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); + continue; + } - else try { entry.ExtractToFile(Path.Combine(folder, entry.FullName), true); + currentSize += (ulong)entry.CompressedLength; } - catch + catch (Exception ex) { + Console.WriteLine($"Failed to extract {entry.Name}. Exception: {ex.Message}"); } - currentZIPFile++; - await Task.Delay(10); - progress.Report((float)currentZIPFile / totalZIPFiles * 100); + await Task.Delay(10); + progress.Report((float)currentSize / zipSize * 100); + } } } } @@ -303,5 +340,15 @@ namespace PluginManager.Others var data = jsonObject.RootElement.TryGetProperty(codeName, out element); return data; } + + public static string CreateMD5(string input) + { + using (MD5 md5 = MD5.Create()) + { + byte[] inputBytes = Encoding.ASCII.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + return Convert.ToHexString(hashBytes); + } + } } } diff --git a/YoutubeExtension/Others/Data.cs b/YoutubeExtension/Others/Data.cs deleted file mode 100644 index ef50961..0000000 --- a/YoutubeExtension/Others/Data.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Discord; -using Discord.Audio; - -namespace YoutubeExtension.Downloader; - -internal static class Data -{ - internal static IAudioClient audioClient = null; - internal static IVoiceChannel voiceChannel = null; - - internal static MusicPlayer CurrentlyRunning = null; -} diff --git a/YoutubeExtension/Others/MusicPlayer.cs b/YoutubeExtension/Others/MusicPlayer.cs deleted file mode 100644 index bfbafd9..0000000 --- a/YoutubeExtension/Others/MusicPlayer.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace YoutubeExtension.Downloader; - -internal class MusicPlayer -{ - public MusicPlayer(Stream input, Stream output) - { - inputStream = input; - outputStream = output; - } - - public Stream inputStream { get; } // from outside - public Stream outputStream { get; } // to Voice Channel - - public bool Paused { get; set; } - private bool _stop { get; set; } - - public void Stop() - { - _stop = true; - } - - public async Task StartSendAudio() - { - Paused = false; - _stop = false; - while (!_stop) - { - if (Paused) continue; - var bsize = 512; - var buffer = new byte[bsize]; - var bcount = await inputStream.ReadAsync(buffer, 0, bsize); - if (bcount <= 0) - { - Stop(); - Data.CurrentlyRunning = null; - break; - } - - try - { - await outputStream.WriteAsync(buffer, 0, bcount); - } - catch (Exception ex) - { - await outputStream.FlushAsync(); - PluginManager.Others.Functions.WriteLogFile(ex.ToString()); - } - } - } -} diff --git a/YoutubeExtension/Others/YTVideo.cs b/YoutubeExtension/Others/YTVideo.cs deleted file mode 100644 index 36bc4f9..0000000 --- a/YoutubeExtension/Others/YTVideo.cs +++ /dev/null @@ -1,18 +0,0 @@ -using MediaToolkit; -using MediaToolkit.Model; -using VideoLibrary; - -namespace YoutubeExtension.Downloader; - -public class YoutubeHandler -{ - - public static async Task GetVideoStream(string videoURL) - { - var youtube = YouTube.Default; - var video = await youtube.GetVideoAsync(videoURL); - - return await video.StreamAsync(); - - } -} diff --git a/YoutubeExtension/YoutubeExtension.csproj b/YoutubeExtension/YoutubeExtension.csproj deleted file mode 100644 index eb2460e..0000000 --- a/YoutubeExtension/YoutubeExtension.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net6.0 - enable - enable - - - diff --git a/YoutubeExtension/ytPlay.cs b/YoutubeExtension/ytPlay.cs deleted file mode 100644 index 8e71e2a..0000000 --- a/YoutubeExtension/ytPlay.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace YoutubeExtension; - -public class ytPlay -{ - -} From 82a3744d48e90a0650b2cac3d11eaa974adebb52 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 9 Jul 2022 10:26:36 +0300 Subject: [PATCH 09/36] --- BUILDS/net6.0/MusicCommands.dll | Bin 17920 -> 17920 bytes .../net6.0/Plugins/Commands/MusicCommands.dll | Bin 17920 -> 17920 bytes DiscordBot/Program.cs | 3 ++- MusicCommands/Play.cs | 5 +++-- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/BUILDS/net6.0/MusicCommands.dll b/BUILDS/net6.0/MusicCommands.dll index 729722c56b94d146dec23bf174d76efc07f0c9b6..23499242478e7c51d36af57950cc23b88106a227 100644 GIT binary patch delta 46 zcmZqZVQlDOoY27{lI*i_W6v8wM)A#+Lhfn;Ui~Sb+Nvd7mz1(hD?e|3b@K%a16}}~ CQxZY| delta 46 zcmV+}0MY+|i~)d*0g#9UOR+-bv5f2y0T#1)5=SNw`T`aZSn7gCrdYb#zTJO)v(Pv& E4Y{8avj6}9 diff --git a/BUILDS/net6.0/Plugins/Commands/MusicCommands.dll b/BUILDS/net6.0/Plugins/Commands/MusicCommands.dll index 729722c56b94d146dec23bf174d76efc07f0c9b6..23499242478e7c51d36af57950cc23b88106a227 100644 GIT binary patch delta 46 zcmZqZVQlDOoY27{lI*i_W6v8wM)A#+Lhfn;Ui~Sb+Nvd7mz1(hD?e|3b@K%a16}}~ CQxZY| delta 46 zcmV+}0MY+|i~)d*0g#9UOR+-bv5f2y0T#1)5=SNw`T`aZSn7gCrdYb#zTJO)v(Pv& E4Y{8avj6}9 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 0701871..4f5802a 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; +using Discord; +using Discord.Net.Queue; using DiscordBot.Discord.Core; using PluginManager; using PluginManager.Items; @@ -73,7 +75,6 @@ public class Program Config.SaveConfig(); - while (true) { Console.ForegroundColor = ConsoleColor.White; diff --git a/MusicCommands/Play.cs b/MusicCommands/Play.cs index eb6d73d..bf98e28 100644 --- a/MusicCommands/Play.cs +++ b/MusicCommands/Play.cs @@ -64,15 +64,16 @@ internal class Play : DBCommand } while (false); - Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; + if (Data.voiceChannel == null) { await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument."); return; } - Data.audioClient = await Data.voiceChannel.ConnectAsync(); + Data.audioClient = await Data.voiceChannel.ConnectAsync(true); + using (var ffmpeg = CreateStream(path)) using (var output = ffmpeg.StandardOutput.BaseStream) From 7dd43b7841e939f9ef4e745816b130de136eb090 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 9 Jul 2022 10:41:33 +0300 Subject: [PATCH 10/36] --- CMD_LevelingSystem/CMD_LevelingSystem.csproj | 2 +- CMD_Utils/CMD_Utils.csproj | 2 +- MusicCommands/MusicCommands.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMD_LevelingSystem/CMD_LevelingSystem.csproj b/CMD_LevelingSystem/CMD_LevelingSystem.csproj index 5058233..1fc57d3 100644 --- a/CMD_LevelingSystem/CMD_LevelingSystem.csproj +++ b/CMD_LevelingSystem/CMD_LevelingSystem.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - ..\DiscordBot\bin\Debug\net6.0\Data\Plugins\Commands\LevelingSystem + bin\ diff --git a/CMD_Utils/CMD_Utils.csproj b/CMD_Utils/CMD_Utils.csproj index 40c79f6..8ac772b 100644 --- a/CMD_Utils/CMD_Utils.csproj +++ b/CMD_Utils/CMD_Utils.csproj @@ -2,7 +2,7 @@ net6.0 - + bin\ diff --git a/MusicCommands/MusicCommands.csproj b/MusicCommands/MusicCommands.csproj index b7b4a53..7ebcc0e 100644 --- a/MusicCommands/MusicCommands.csproj +++ b/MusicCommands/MusicCommands.csproj @@ -3,7 +3,7 @@ net6.0 warnings - ..\DiscordBot\bin\Debug\net6.0\Data\Plugins\Commands\MusicCommands + bin\ From aa808e950a0eac4b44b3bca04905e44e72e733d0 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 9 Jul 2022 10:41:39 +0300 Subject: [PATCH 11/36] --- EVE_LevelingSystem/EVE_LevelingSystem.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EVE_LevelingSystem/EVE_LevelingSystem.csproj b/EVE_LevelingSystem/EVE_LevelingSystem.csproj index ce1a63c..b8dd406 100644 --- a/EVE_LevelingSystem/EVE_LevelingSystem.csproj +++ b/EVE_LevelingSystem/EVE_LevelingSystem.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - ..\DiscordBot\bin\Debug\net6.0\Data\Plugins\Events\LevelingSystem + bin\ From 47aae730c7ff4cb38d0d0ab12de45ef312445ed1 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 9 Jul 2022 14:57:49 +0300 Subject: [PATCH 12/36] Music Commands --- ...nds.deps.json => Music Commands.deps.json} | 6 +- BUILDS/net6.0/Music Commands.dll | Bin 0 -> 16896 bytes BUILDS/net6.0/MusicCommands.dll | Bin 17920 -> 0 bytes EVE_LevelingSystem/EVE_LevelingSystem.csproj | 2 +- MusicCommands/AudioFile.cs | 34 ++++ MusicCommands/Data.cs | 3 +- MusicCommands/Leave.cs | 4 +- MusicCommands/MusicCommands.csproj | 1 + MusicCommands/MusicPlayer.cs | 167 ++++++++---------- MusicCommands/MusicPlaylist.cs | 25 +++ MusicCommands/Pause.cs | 4 +- MusicCommands/Play.cs | 85 +++++---- MusicCommands/Skip.cs | 31 ++++ MusicCommands/Unpause.cs | 25 --- MusicCommands/queue.cs | 31 ++++ 15 files changed, 259 insertions(+), 159 deletions(-) rename BUILDS/net6.0/{MusicCommands.deps.json => Music Commands.deps.json} (99%) create mode 100644 BUILDS/net6.0/Music Commands.dll delete mode 100644 BUILDS/net6.0/MusicCommands.dll create mode 100644 MusicCommands/AudioFile.cs create mode 100644 MusicCommands/MusicPlaylist.cs create mode 100644 MusicCommands/Skip.cs delete mode 100644 MusicCommands/Unpause.cs create mode 100644 MusicCommands/queue.cs diff --git a/BUILDS/net6.0/MusicCommands.deps.json b/BUILDS/net6.0/Music Commands.deps.json similarity index 99% rename from BUILDS/net6.0/MusicCommands.deps.json rename to BUILDS/net6.0/Music Commands.deps.json index 1c91428..2834772 100644 --- a/BUILDS/net6.0/MusicCommands.deps.json +++ b/BUILDS/net6.0/Music Commands.deps.json @@ -6,13 +6,13 @@ "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v6.0": { - "MusicCommands/1.0.0": { + "Music Commands/1.0.0": { "dependencies": { "PluginManager": "1.0.0", "YoutubeExplode": "6.2.0" }, "runtime": { - "MusicCommands.dll": {} + "Music Commands.dll": {} } }, "AngleSharp/0.17.0": { @@ -187,7 +187,7 @@ } }, "libraries": { - "MusicCommands/1.0.0": { + "Music Commands/1.0.0": { "type": "project", "serviceable": false, "sha512": "" diff --git a/BUILDS/net6.0/Music Commands.dll b/BUILDS/net6.0/Music Commands.dll new file mode 100644 index 0000000000000000000000000000000000000000..dc82fef662ea0a1a3a2f3bed75e472894b795e22 GIT binary patch literal 16896 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%0AFKWa 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 diff --git a/EVE_LevelingSystem/EVE_LevelingSystem.csproj b/EVE_LevelingSystem/EVE_LevelingSystem.csproj index b8dd406..cf07d6d 100644 --- a/EVE_LevelingSystem/EVE_LevelingSystem.csproj +++ b/EVE_LevelingSystem/EVE_LevelingSystem.csproj @@ -4,7 +4,7 @@ net6.0 enable enable - bin\ + diff --git a/MusicCommands/AudioFile.cs b/MusicCommands/AudioFile.cs new file mode 100644 index 0000000..76daa24 --- /dev/null +++ b/MusicCommands/AudioFile.cs @@ -0,0 +1,34 @@ +using AngleSharp.Dom; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicCommands +{ + internal class AudioFile + { + internal string Name { get; set; } + internal string Url { get; set; } + + internal AudioFile(string name, string url) + { + Name = name; + Url = url; + } + + internal async Task DownloadAudioFile() + { + Process proc = new Process(); + proc.StartInfo.FileName = "MusicDownloader.exe"; + proc.StartInfo.Arguments = $"{Url},{Name}"; + proc.StartInfo.UseShellExecute = false; + proc.StartInfo.RedirectStandardOutput = true; + + proc.Start(); + await proc.WaitForExitAsync(); + } + } +} diff --git a/MusicCommands/Data.cs b/MusicCommands/Data.cs index 066af23..ac61ac7 100644 --- a/MusicCommands/Data.cs +++ b/MusicCommands/Data.cs @@ -8,5 +8,6 @@ internal static class Data internal static IAudioClient audioClient = null; internal static IVoiceChannel voiceChannel = null; - internal static MusicPlayer CurrentlyRunning = null; + internal static MusicPlayer MusicPlayer = null; + internal static MusicPlaylist Playlist = new(); } diff --git a/MusicCommands/Leave.cs b/MusicCommands/Leave.cs index 3171489..98af079 100644 --- a/MusicCommands/Leave.cs +++ b/MusicCommands/Leave.cs @@ -22,8 +22,8 @@ internal class Leave : DBCommand { if (Data.audioClient is not null && Data.voiceChannel is not null) { - Data.CurrentlyRunning.Stop(); - Data.CurrentlyRunning = null; + Data.Playlist.ClearQueue(); + Data.MusicPlayer.isPlaying = false; await Data.audioClient.StopAsync(); await Data.voiceChannel.DisconnectAsync(); } diff --git a/MusicCommands/MusicCommands.csproj b/MusicCommands/MusicCommands.csproj index 7ebcc0e..037f43c 100644 --- a/MusicCommands/MusicCommands.csproj +++ b/MusicCommands/MusicCommands.csproj @@ -4,6 +4,7 @@ net6.0 warnings bin\ + Music Commands diff --git a/MusicCommands/MusicPlayer.cs b/MusicCommands/MusicPlayer.cs index 6d8e8f6..536f6d7 100644 --- a/MusicCommands/MusicPlayer.cs +++ b/MusicCommands/MusicPlayer.cs @@ -9,110 +9,93 @@ namespace MusicCommands; internal class MusicPlayer { - public MusicPlayer(Stream input, Stream output) + private Stream outputStream { get; } + + internal bool isPlaying, isPaused; + + public MusicPlayer(Stream outputChannel) { - inputStream = input; - outputStream = output; + outputStream = outputChannel; } - public MusicPlayer(Stream output) + public async Task Play(Stream source, int byteSize) { - inputStream = null; - outputStream = output; - } - - public Stream inputStream { get; } // from FFMPEG - public Stream outputStream { get; } // to Voice Channel - - public bool Paused { get; set; } - private bool _stop { get; set; } - - public void Stop() - { - _stop = true; - } - - public async Task StartSendAudioFromLink(string URL) - { - /* using (HttpClient client = new HttpClient()) - using (HttpResponseMessage response = await client.GetAsync(URL)) - using (var content = response.Content) - { - await (await content.ReadAsStreamAsync()).CopyToAsync(outputStream); - }*/ - - - Stream ms = new MemoryStream(); - var bsize = 512; - new Thread(async delegate(object o) - { - var response = await new HttpClient().GetAsync(URL); - using (var stream = await response.Content.ReadAsStreamAsync()) - { - var buffer = new byte[bsize]; - int read; - while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) - { - var pos = ms.Position; - ms.Position = ms.Length; - ms.Write(buffer, 0, read); - ms.Position = pos; - } - } - } - ).Start(); - Console.Write("Reading data: "); - while (ms.Length < bsize * 10) + isPlaying = true; + while (isPlaying) { - await Task.Delay(1000); - Console.Title = "Reading data: " + ms.Length + " bytes read of " + bsize * 10; - Console.Write("."); - } + if (isPaused) + continue; - Console.WriteLine("\nDone"); - ms.Position = 0; - - _stop = false; - Paused = false; - - while (!_stop) - { - if (Paused) continue; - var buffer = new byte[bsize]; - var read = await ms.ReadAsync(buffer, 0, buffer.Length); - if (read > 0) - await outputStream.WriteAsync(buffer, 0, read); - else + var bits = new byte[byteSize]; + var read = await source.ReadAsync(bits, 0, byteSize); + if (read == 0) break; - } - } - - public async Task StartSendAudio() - { - Paused = false; - _stop = false; - while (!_stop) - { - if (Paused) continue; - var bsize = 512; - var buffer = new byte[bsize]; - var bcount = await inputStream.ReadAsync(buffer, 0, bsize); - if (bcount <= 0) - { - Stop(); - Data.CurrentlyRunning = null; - break; - } - try { - await outputStream.WriteAsync(buffer, 0, bcount); + await outputStream.WriteAsync(bits, 0, read); } - catch (Exception ex) + catch { - await outputStream.FlushAsync(); - Functions.WriteLogFile(ex.ToString()); + break; } } + + + await source.FlushAsync(); + await source.DisposeAsync(); + source.Close(); + await outputStream.FlushAsync(); + isPlaying = false; } + + + /* + public MusicPlayer(Stream input, Stream output) + { + inputStream = input; + outputStream = output; + } + + + + + + public Stream inputStream { get; } // from FFMPEG + public Stream outputStream { get; } // to Voice Channel + + public bool Paused { get; set; } + private bool _stop { get; set; } + + public void Stop() + { + _stop = true; + } + + public async Task StartSendAudio(int bsize) + { + Paused = false; + _stop = false; + while (!_stop) + { + if (Paused) continue; + var buffer = new byte[bsize]; + var bcount = await inputStream.ReadAsync(buffer, 0, bsize); + if (bcount <= 0) + { + Stop(); + Data.CurrentlyRunning = null; + break; + } + + try + { + await outputStream.WriteAsync(buffer, 0, bcount); + } + catch (Exception ex) + { + await outputStream.FlushAsync(); + Functions.WriteLogFile(ex.ToString()); + } + } + }*/ } diff --git a/MusicCommands/MusicPlaylist.cs b/MusicCommands/MusicPlaylist.cs new file mode 100644 index 0000000..f514fb1 --- /dev/null +++ b/MusicCommands/MusicPlaylist.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicCommands +{ + internal class MusicPlaylist + { + internal MusicPlaylist() + { + Console.WriteLine("Initialized playlist."); + } + + public Queue QueueList = new(); + + public void Enqueue(AudioFile query) => QueueList.Enqueue(query); + public void ClearQueue() => QueueList.Clear(); + + public int Count => QueueList.Count; + public AudioFile GetNextSong => QueueList.Dequeue(); + public AudioFile WhatIsNext => QueueList.Peek(); + } +} diff --git a/MusicCommands/Pause.cs b/MusicCommands/Pause.cs index 8a86430..5b16b37 100644 --- a/MusicCommands/Pause.cs +++ b/MusicCommands/Pause.cs @@ -8,7 +8,7 @@ internal class Pause : DBCommand { public string Command => "pause"; - public string Description => "Pause the music"; + public string Description => "Pause/Unpause the music that is currently running"; public string Usage => "pause"; @@ -20,6 +20,6 @@ internal class Pause : DBCommand public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) { - Data.CurrentlyRunning.Paused = true; + Data.MusicPlayer.isPaused = !Data.MusicPlayer.isPaused; } } diff --git a/MusicCommands/Play.cs b/MusicCommands/Play.cs index bf98e28..b1ab2ae 100644 --- a/MusicCommands/Play.cs +++ b/MusicCommands/Play.cs @@ -1,7 +1,6 @@ using System; using System.Diagnostics; using System.IO; -using System.Threading.Tasks; using Discord; using Discord.Audio; using Discord.Commands; @@ -42,28 +41,47 @@ internal class Play : DBCommand return; } - string url = splitted[1]; + var url = splitted[1]; path += $"{Functions.CreateMD5(url)}"; if (File.Exists(path)) - break; - //await context.Channel.SendMessageAsync("Searching for " + url); - await GetMusicAudio(url, path); - //await context.Channel.SendMessageAsync("Playing: " + url); + { + Data.Playlist.Enqueue(new AudioFile(path, null)); + } + else + { + var file = new AudioFile(path, url); + await file.DownloadAudioFile(); + Data.Playlist.Enqueue(file); + } } else { - string searchString = Functions.MergeStrings(splitted, 1); + var searchString = splitted.MergeStrings(1); path += $"{Functions.CreateMD5(searchString)}"; - if (File.Exists(path)) - break; - await context.Channel.SendMessageAsync("Searching for " + searchString); - await GetMusicAudio(searchString, path); - await context.Channel.SendMessageAsync("Playing: " + searchString); + { + Data.Playlist.Enqueue(new AudioFile(path, null)); + } + else + { + await context.Channel.SendMessageAsync("Searching for " + searchString); + var file = new AudioFile(path, searchString); + await file.DownloadAudioFile(); + Data.Playlist.Enqueue(file); + if (Data.MusicPlayer is null) + await context.Channel.SendMessageAsync("Playing: " + searchString); + } + } + + if (Data.MusicPlayer is not null) + { + await context.Channel.SendMessageAsync("Enqueued your request"); + return; } } while (false); + Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; if (Data.voiceChannel == null) @@ -72,16 +90,29 @@ internal class Play : DBCommand return; } - Data.audioClient = await Data.voiceChannel.ConnectAsync(true); - - - using (var ffmpeg = CreateStream(path)) - using (var output = ffmpeg.StandardOutput.BaseStream) - using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) + if (Data.audioClient is null) { - if (Data.CurrentlyRunning != null) Data.CurrentlyRunning.Stop(); - Data.CurrentlyRunning = new MusicPlayer(output, discord); - await Data.CurrentlyRunning.StartSendAudio(); + Data.audioClient = await Data.voiceChannel.ConnectAsync(true); + Data.MusicPlayer = null; + } + + + using (var discordChanneAudioOutStream = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) + { + if (Data.MusicPlayer is null) + Data.MusicPlayer = new MusicPlayer(discordChanneAudioOutStream); + while (Data.Playlist.Count > 0) + { + var nowPlaying = Data.Playlist.GetNextSong; + using (var ffmpeg = CreateStream(nowPlaying.Name)) + using (var ffmpegOutputBaseStream = ffmpeg.StandardOutput.BaseStream) + { + await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024); + Console.WriteLine("Finished playing from" + nowPlaying.Name); + } + } + + Data.MusicPlayer = null; } } @@ -89,16 +120,4 @@ internal class Play : DBCommand { return Process.Start(new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", UseShellExecute = false, RedirectStandardOutput = true }); } - - private async Task GetMusicAudio(string url, string location) - { - Process proc = new Process(); - proc.StartInfo.FileName = "MusicDownloader.exe"; - proc.StartInfo.Arguments = $"{url},{location}"; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.RedirectStandardOutput = true; - - proc.Start(); - await proc.WaitForExitAsync(); - } } diff --git a/MusicCommands/Skip.cs b/MusicCommands/Skip.cs new file mode 100644 index 0000000..583363c --- /dev/null +++ b/MusicCommands/Skip.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord.Commands; +using Discord.WebSocket; +using PluginManager.Interfaces; + +namespace MusicCommands +{ + public class Skip : DBCommand + { + public string Command => "skip"; + + public string Description => "skip the music that is currently running"; + + public string Usage => "skip"; + + public bool canUseDM => false; + + public bool canUseServer => true; + + public bool requireAdmin => false; + + public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + { + Data.MusicPlayer.isPlaying = false; + } + } +} diff --git a/MusicCommands/Unpause.cs b/MusicCommands/Unpause.cs deleted file mode 100644 index cfe2040..0000000 --- a/MusicCommands/Unpause.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Discord.Commands; -using Discord.WebSocket; -using PluginManager.Interfaces; - -namespace MusicCommands; - -internal class Unpause : DBCommand -{ - public string Command => "unpause"; - - public string Description => "Unpause the music"; - - public string Usage => "unpause"; - - public bool canUseDM => false; - - public bool canUseServer => true; - - public bool requireAdmin => false; - - public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) - { - Data.CurrentlyRunning.Paused = false; - } -} diff --git a/MusicCommands/queue.cs b/MusicCommands/queue.cs new file mode 100644 index 0000000..a6c762d --- /dev/null +++ b/MusicCommands/queue.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord.Commands; +using Discord.WebSocket; +using PluginManager.Interfaces; + +namespace MusicCommands +{ + public class queue : DBCommand + { + public string Command => "queue"; + + public string Description => "check queue"; + + public string Usage => "queue"; + + public bool canUseDM => false; + + public bool canUseServer => true; + + public bool requireAdmin => false; + + public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + { + await context.Channel.SendMessageAsync($"You have {Data.Playlist.Count} items in queue"); + } + } +} From 2dae8a3a6353cbaf3396e613845c536bd79b6706 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 10 Jul 2022 15:07:15 +0300 Subject: [PATCH 13/36] --- .idea/.idea.SethDiscordBot/.idea/.gitignore | 13 ------------- .idea/.idea.SethDiscordBot/.idea/.name | 1 - .idea/.idea.SethDiscordBot/.idea/encodings.xml | 4 ---- .idea/.idea.SethDiscordBot/.idea/indexLayout.xml | 8 -------- .idea/.idea.SethDiscordBot/.idea/vcs.xml | 6 ------ .vscode/settings.json | 4 ---- 6 files changed, 36 deletions(-) delete mode 100644 .idea/.idea.SethDiscordBot/.idea/.gitignore delete mode 100644 .idea/.idea.SethDiscordBot/.idea/.name delete mode 100644 .idea/.idea.SethDiscordBot/.idea/encodings.xml delete mode 100644 .idea/.idea.SethDiscordBot/.idea/indexLayout.xml delete mode 100644 .idea/.idea.SethDiscordBot/.idea/vcs.xml delete mode 100644 .vscode/settings.json diff --git a/.idea/.idea.SethDiscordBot/.idea/.gitignore b/.idea/.idea.SethDiscordBot/.idea/.gitignore deleted file mode 100644 index 7fa1cfe..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/projectSettingsUpdater.xml -/contentModel.xml -/.idea.SethDiscordBot.iml -/modules.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.name b/.idea/.idea.SethDiscordBot/.idea/.name deleted file mode 100644 index ac07819..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -SethDiscordBot \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/encodings.xml b/.idea/.idea.SethDiscordBot/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/vcs.xml b/.idea/.idea.SethDiscordBot/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 6705416..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rpc.enabled": true, - "discord.enabled": true -} \ No newline at end of file From 3f67d7f3f90b97f4255a8ad47e275aa2da8bccc7 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 10 Jul 2022 21:57:22 +0300 Subject: [PATCH 14/36] updated music commands --- BUILDS/net6.0/Music Commands.dll | Bin 16896 -> 16896 bytes MusicCommands/Play.cs | 12 +++--------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/BUILDS/net6.0/Music Commands.dll b/BUILDS/net6.0/Music Commands.dll index dc82fef662ea0a1a3a2f3bed75e472894b795e22..0771eac46348bf9ff005e4e1f717546a8c4b14e5 100644 GIT binary patch delta 3338 zcmb7H3s78F8UD|?yLa#2U3T~0eXy_#?6NFub^${Pup7`&DUdWsLdiR0O@bL4vDvu9 zal&gi5Bsn+6Xr~&vY$vp2?G~lxue-!la_iBJwN&pCZp}sD?o{mv_6@h(mAAk(O z#4419#9`*qS6k1Z9L`Ui%PeQuXZ8E6S2D`=%yNajqTgNIO6THfp9Me{FT-54F9*et z03asf=`Jx(RR3z=H9(<#0W`^Cv&4>?1F=Xbx|sk(Z>I>890o8dnx{i}j>8%~!Y~3P zdazWe5z~~?M3P-ISFI|?q(J*3nDOWyceNuU=02Pl;;fp`wc^I!@Z4U6O&@g2u!_*FCp8ov~|P2Txyij%H-RCTvbi8-|xoHJ}At_8i8PaMGe!{+mLcurvj$YMrCtnWtb~M8P^w z;d#6TSqj#r2VqTyGMtW}>mc&dIcAC7rr2U%=VKYfN$PT4t~h=t-IKB9@3r@w!dK^{6#m+jsRB^G>j+$66Uh0Q& za1QJ-k53REoB(Xc{R_C(F4`x!-;YEFSe4T*ehaO~4eVBDy~6Kpkvq3%Gp=TpCf;P< zbQUh7I{a?o*I5RYhPL6l#5pyo1n(LtnYBE>3zfxCTZz`670#i|yX55~XgvirAG!Re z(7zp{*8A|~z+sW@sD+g}QYP?nstj=n@)^TrLtPTAWnP{vcf&zUDq7^u_AXRQ_b1>V;74uWjx5uDHzm}4x03)(a-!^8!hS&cJs!M3c%nS7&wGjYK$7ewd7 z*#*)0@Zy5#e3)Di{XqerSxw=I@|W-{05DAs34ZXyA2f|mPlRH)n6-Vz#I?Uwr_Du! zGOF8=oSNkmuo7C`aXI$S|prCvfLZ;{`GU+r(GNN%BK-nUuiy zr64JXS~>>huwUK}GmwxfDWUtt74*yGRT85sG@k~|r$O_Xge&46`V17AdZ|L+6H`f= zN1wzq*g>9^9-_hC6iQgnORWb}nfMlzTSPZa9X>trvCO@N+~igV+tzh+Iw??&H>SZE2La@;wc~ z$mKHR-U$cbFnkB^>P2`Pc9XkUbs(5LAOKtvIX+G~K49QDsmZ$t|2O4HiQ@(X$FSib z;*@+hVnDnPahr+bM~Pk1X9ET=EU={0$Ms1^O3H}QO5L=Dw$oi~dobV}rJFDf{ypQ6 zeMT7zt|O!DQm_osRNAb(M7qFFyI>Pd!=t$VD7~}vCuUNVc2_@0Y{~(M!&hKG{wiS? z>`tFqVIZV}P1J;mkNvYIY75%ld+Z-OCYpw4I>LjG-P@6Ftldpa&4yfwQmSlJqwI;g z4Qy*P5SlFY$xb!(G*MIEwNN!RrKYCU)az>M4K;POKuyiyZ%RpBXDg#c>90m-DEmUa qqS~_mFX0V@x$GPAyNH)PQhz7gvFcdb((tZ88)9jt@hvj6-0&Y1U3X{z delta 3462 zcmb7H4NzRw6+ZXA-M9PpkA3g4FAEFHE*rw~Ye*mqLMntNBqk-H2}z_iO^R_!h#_p! zzW~{VpfyTk@cL8JI@Q>5>O{wJR%1U3Da}iJqqFasvB10suD1 zi`JnmL~mz4^YXM2lnXPXdCY9@S1QX?z3&lh07vqar(7&sDy7s=)odQw2NbSJsWg|*wfAuvqiCli`ay#Fth`U zqFpP{tXgO{AE!MY{76?LTUe=UMfnCEtCYt|1*2VD2``)n*Q!?8%6{Mq$Mgzc#R?4% zPHLfIB}EE1psi#L^%_M{S?b}nQq@emv2#p{q?p5Y{Ah6D%UHg#Bhtb){9QYMX0F46jur=EaM|IG)Vy}%P>v{`iS8h*?@YBut;9SuBc_i%hso7QQ6Dt(<`c`@XVjUeY+1!%-|b{4{iXQ z!})VK{%qcSFV1&k&`;Sj>8j|(`g5#oG`(8pXFJEc=)g7{9SV*9gJ~Xrfz5#{NtWu*~Rz?L(Q9EI0wLu6haNn>o7Wup`Mj!(oPX(^)7WN z@Vs;z=^7A@2LMF~Uj>!nT2)P(^hR}acnU7wTz{`FRii8+}r*!32 z;1#^1%M-dRkTW=ABiErrG2vFC*Ovz8QEr6tIqARfxzjhG7xz>fn*0@h{15FxNV zrCO^6H>TNTXulVS*l#j@WIel-=__gy%nNAEgo;2m(HLct@?f1PS_68uZz}!5;PbNGJP+ub}GNf)h$|^>x;*cCKBoYpGmL zs53O4%L!`@jpxeAic~e@`e@1c=u%UJ$o+u zRPmPOJbRM#2|)b#ey@dEf={0g0 zTEy4MqvR*#cdRa`#*$Z-a z^GFS>pr@e*4%!aFS-2!d=?LW5k5HNZOFT+5=nytt6B)Ihq)lXl=tg-B{VB>x+?N1+ z1tO-PfvupJOJiV%hlEm4;UuCDUPcVTC?fyEs}z<)I$|~CAl5@M;(C1^?`Ko39;nVh z9&V>D$8{WrcBnB8!vRd0)Mt{w*R&E&;)srqkr-EoNjr2R@};lnhKo7^<$|3Qcm=&Gj!#jJ_ggrg)#a~~J5YYc%5jT@W1;0P#0$3Lh#~Pl#1=cp&*Qt`nl0!& zH^G97{@*o;Q=xn!O%Z`^q}ymaJGVIG8Kzq?4E~I9FrHzi=4~XytTitm@$S6UvV*ol z0lr_O33wXEL?W5@tV0Oi3W*1nJxIJ6>tG*z3wFU?XoFiIppW~YJ+ZRfLP!x?T~Ww7 zD "Play music from a file"; - public string Usage => "fplay [name/url]"; + public string Usage => "play [name/url]"; public bool canUseDM => false; @@ -33,14 +33,8 @@ internal class Play : DBCommand return; do { - if (splitted.Length == 2) + if (splitted.Length == 2 && splitted[1].Contains("youtube.com") || splitted[1].Contains("youtu.be")) { - if (!splitted[1].Contains("youtube.com")) - { - await context.Channel.SendMessageAsync("Invalid link"); - return; - } - var url = splitted[1]; path += $"{Functions.CreateMD5(url)}"; if (File.Exists(path)) @@ -108,7 +102,7 @@ internal class Play : DBCommand using (var ffmpegOutputBaseStream = ffmpeg.StandardOutput.BaseStream) { await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024); - Console.WriteLine("Finished playing from" + nowPlaying.Name); + Console.WriteLine("Finished playing from " + nowPlaying.Url); } } From b8ec6f42dfdc2058fd7073d307c7d40778b2dd5d Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 13 Jul 2022 19:48:57 +0300 Subject: [PATCH 15/36] Fixed some bugs with Command handler and configuration --- PluginManager/Config.cs | 60 ++++++++++++----- PluginManager/Items/ConsoleCommandsHandler.cs | 64 +++++++++---------- PluginManager/Others/Console Utilities.cs | 34 +++++----- 3 files changed, 89 insertions(+), 69 deletions(-) diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 5314c53..7848152 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -4,14 +4,15 @@ using System.IO; using System.Text.Json; using System.Threading.Tasks; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Threading; namespace PluginManager { internal class AppConfig { - public Dictionary? ApplicationVariables { get; set; } - public List? ProtectedKeyWords { get; set; } + public Dictionary? ApplicationVariables { get; init; } + public List? ProtectedKeyWords { get; init; } } public static class Config @@ -76,20 +77,43 @@ namespace PluginManager private static AppConfig? appConfig { get; set; } - public static bool AddValueToVariables(string key, T value, bool isProtected) + public static void AddValueToVariables(string key, T value, bool isProtected) { - if (appConfig!.ApplicationVariables!.ContainsKey(key)) return false; - if (value == null) return false; + if (value == null) + throw new Exception("The value cannot be null"); + if (appConfig!.ApplicationVariables!.ContainsKey(key)) + throw new Exception($"The key ({key}) already exists in the variables. Value {GetValue(key)}"); + appConfig.ApplicationVariables.Add(key, value); - if (isProtected && key != "Version") appConfig.ProtectedKeyWords!.Add(key); + if (isProtected && key != "Version") + appConfig.ProtectedKeyWords!.Add(key); SaveConfig(); - return true; + } + + public static Type GetVariableType(string value) + { + if (int.TryParse(value, out var intValue)) + return typeof(int); + if (bool.TryParse(value, out var boolValue)) + return typeof(bool); + if (float.TryParse(value, out var floatValue)) + return typeof(float); + if (double.TryParse(value, out var doubleValue)) + return typeof(double); + if (uint.TryParse(value, out var uintValue)) + return typeof(uint); + if (long.TryParse(value, out var longValue)) + return typeof(long); + if (byte.TryParse(value, out var byteValue)) + return typeof(byte); + return typeof(string); } public static void GetAndAddValueToVariable(string key, string value, bool isReadOnly) { - if (Config.ContainsKey(key)) return; + if (Config.ContainsKey(key)) + return; if (int.TryParse(value, out var intValue)) Config.AddValueToVariables(key, intValue, isReadOnly); else if (bool.TryParse(value, out var boolValue)) @@ -122,24 +146,26 @@ namespace PluginManager } } - public static bool SetValue(string key, T value) + public static void SetValue(string key, T value) { - if (!appConfig!.ApplicationVariables!.ContainsKey(key)) return false; - if (appConfig.ProtectedKeyWords!.Contains(key)) return false; - if (value == null) return false; + if (value == null) + throw new Exception("Value is null"); + if (!appConfig!.ApplicationVariables!.ContainsKey(key)) + throw new Exception("Key does not exist in the config file"); + if (appConfig.ProtectedKeyWords!.Contains(key)) + throw new Exception("Key is protected"); appConfig.ApplicationVariables[key] = JsonSerializer.SerializeToElement(value); SaveConfig(); - return true; } - public static bool RemoveKey(string key) + public static void RemoveKey(string key) { - if (key == "Version" || key == "token" || key == "prefix") return false; + if (key == "Version" || key == "token" || key == "prefix") + throw new Exception("Key is protected"); appConfig!.ApplicationVariables!.Remove(key); appConfig.ProtectedKeyWords!.Remove(key); SaveConfig(); - return true; } public static async void SaveConfig() @@ -163,6 +189,6 @@ namespace PluginManager public static bool ContainsValue(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!); public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key); - public static Dictionary GetAllVariables() => new(appConfig!.ApplicationVariables!); + public static ReadOnlyDictionary GetAllVariables() => new(appConfig!.ApplicationVariables!); } } diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 48d5bde..8f1e4ab 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -15,7 +15,7 @@ namespace PluginManager.Items; public class ConsoleCommandsHandler { private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt"); - public static List commandList = new(); + private static readonly List commandList = new(); private readonly DiscordSocketClient? client; public ConsoleCommandsHandler(DiscordSocketClient client) @@ -43,9 +43,7 @@ public class ConsoleCommandsHandler foreach (var command in commandList) { - var pa = from p in command.Action.Method.GetParameters() - where p.Name != null - select p.ParameterType.FullName; + var pa = from p in command.Action.Method.GetParameters() where p.Name != null select p.ParameterType.FullName; items.Add(new[] { command.CommandName, command.Description, command.Usage }); } @@ -70,12 +68,14 @@ public class ConsoleCommandsHandler AddCommand("lp", "Load plugins", () => { - if (pluginsLoaded) return; + if (pluginsLoaded) + return; var loader = new PluginLoader(client!); loader.onCMDLoad += (name, typeName, success, exception) => { Console.ForegroundColor = ConsoleColor.Green; - if (name == null || name.Length < 2) name = typeName; + if (name == null || name.Length < 2) + name = typeName; if (success) Console.WriteLine("[CMD] Successfully loaded command : " + name); else @@ -84,7 +84,8 @@ public class ConsoleCommandsHandler }; loader.onEVELoad += (name, typeName, success, exception) => { - if (name == null || name.Length < 2) name = typeName; + if (name == null || name.Length < 2) + name = typeName; Console.ForegroundColor = ConsoleColor.Green; if (success) Console.WriteLine("[EVENT] Successfully loaded event : " + name); @@ -120,9 +121,7 @@ public class ConsoleCommandsHandler return; } - Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + - " Use &glistplugs &ccommand to display all available plugins !" - ); + Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + " Use &glistplugs &ccommand to display all available plugins !"); return; } @@ -136,7 +135,8 @@ public class ConsoleCommandsHandler if (info[0] == "Command" || info[0] == "Event") if (info[0] == "Event") Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Event)); - else if (info[0] == "Command") Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command)); + else if (info[0] == "Command") + Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command)); Console.WriteLine("\n"); @@ -151,7 +151,8 @@ public class ConsoleCommandsHandler foreach (var line in lines) { - if (!(line.Length > 0 && line.Contains(","))) continue; + if (!(line.Length > 0 && line.Contains(","))) + continue; var split = line.Split(','); Console.WriteLine($"\nDownloading item: {split[1]}"); await ServerCom.DownloadFileAsync(split[0], "./" + split[1]); @@ -164,11 +165,7 @@ public class ConsoleCommandsHandler var isExtracting = true; var bar = new Console_Utilities.ProgressBar { Max = 100f, Color = ConsoleColor.Green }; - IProgress extractProgress = new Progress(value => - { - proc = value; - } - ); + IProgress extractProgress = new Progress(value => { proc = value; }); new Thread(new Task(() => { while (isExtracting) @@ -197,19 +194,22 @@ public class ConsoleCommandsHandler ); - AddCommand("value", "read value from VariableStack", "value [key]",args => + AddCommand("value", "read value from VariableStack", "value [key]", args => { - if (args.Length != 2) return; - if (!Config.ContainsKey(args[1])) return; + if (args.Length != 2) + return; + if (!Config.ContainsKey(args[1])) + return; var data = Config.GetValue(args[1]); Console.WriteLine($"{args[1]} => {data}"); } ); - AddCommand("add", "add variable to the system variables","add [key] [value] [isReadOnly=true/false]", args => + AddCommand("add", "add variable to the system variables", "add [key] [value] [isReadOnly=true/false]", args => { - if (args.Length < 4) return; + if (args.Length < 4) + return; var key = args[1]; var value = args[2]; var isReadOnly = args[3].Equals("true", StringComparison.CurrentCultureIgnoreCase); @@ -228,7 +228,8 @@ public class ConsoleCommandsHandler AddCommand("remv", "remove variable from system variables", "remv [key]", args => { - if (args.Length < 2) return; + if (args.Length < 2) + return; Config.RemoveKey(args[1]); } ); @@ -240,7 +241,8 @@ public class ConsoleCommandsHandler data.Add(new[] { "-", "-" }); data.Add(new[] { "Key", "Value" }); data.Add(new[] { "-", "-" }); - foreach (var kvp in d) data.Add(new[] { kvp.Key, kvp.Value.ToString()! }); + foreach (var kvp in d) + data.Add(new[] { kvp.Key, kvp.Value.ToString()! }); data.Add(new[] { "-", "-" }); Console_Utilities.FormatAndAlignTable(data); } @@ -248,7 +250,8 @@ public class ConsoleCommandsHandler AddCommand("sd", "Shuts down the discord bot", async () => { - if (client is null) return; + if (client is null) + return; await client.StopAsync(); await client.DisposeAsync(); Config.SaveConfig(); @@ -263,13 +266,7 @@ public class ConsoleCommandsHandler public static void AddCommand(string command, string description, string usage, Action action) { - commandList.Add(new ConsoleCommand - { - CommandName = command, - Description = description, - Action = action, - Usage = usage - }); + commandList.Add(new ConsoleCommand { CommandName = command, Description = description, Action = action, Usage = usage }); Console.ForegroundColor = ConsoleColor.White; Console_Utilities.WriteColorText($"Command &r{command} &cadded to the list of commands"); } @@ -303,7 +300,8 @@ public class ConsoleCommandsHandler if (removeCommandExecution) { Console.SetCursorPosition(0, Console.CursorTop - 1); - for (int i = 0; i < command.Length; i++) Console.Write(" "); + for (int i = 0; i < command.Length; i++) + Console.Write(" "); Console.SetCursorPosition(0, Console.CursorTop); } diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index a3de752..42ff71e 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -1,9 +1,10 @@ using System; using System.Collections.Generic; +using System.Linq; namespace PluginManager.Others { - public class Console_Utilities + public static class Console_Utilities { /// /// Progress bar object @@ -28,39 +29,36 @@ namespace PluginManager.Others for (int i = 0; i < onechunk * progress; i++) { - if (NoColor) - Console.BackgroundColor = ConsoleColor.Black; //this.Color - else - Console.BackgroundColor = this.Color; + Console.BackgroundColor = NoColor ? ConsoleColor.Black : this.Color; Console.CursorLeft = position++; Console.Write("#"); } for (int i = position; i <= 31; i++) { - if (NoColor) - Console.BackgroundColor = ConsoleColor.Black; // background of empty bar - else - Console.BackgroundColor = ConsoleColor.DarkGray; + Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray; Console.CursorLeft = position++; Console.Write(" "); } Console.CursorLeft = 35; Console.BackgroundColor = ConsoleColor.Black; - if (speed == -1 || unit == null) + if (speed is -1 || unit == null) { - if (progress == Max) - Console.Write(progress.ToString() + " % ✓"); - else Console.Write(progress.ToString() + " % "); + if (progress.CanAproximateTo(Max)) + Console.Write(progress + " % ✓"); + else + Console.Write(progress + " % "); } else - Console.Write(progress.ToString() + $"{speed} {unit}/s "); - + Console.Write(progress + $"{speed} {unit}/s "); } } + private static bool CanAproximateTo(this float f, float y) => (MathF.Abs(f - y) < 0.000001); + + /// /// A way to create a table based on input data /// @@ -110,8 +108,7 @@ namespace PluginManager.Others Console.Write(" "); } - if (row[l][0] == tableLine) Console.Write(tableCross); - else Console.Write(tableWall); + Console.Write(row[l][0] == tableLine ? tableCross : tableWall); } Console.WriteLine(); //end line @@ -141,8 +138,7 @@ namespace PluginManager.Others Console.ForegroundColor = colors[prefix]; } - string m = word; - foreach (var key in colors.Keys) { m = m.Replace(key, ""); } + string m = colors.Keys.Aggregate(word, (current, key) => current.Replace(key, "")); Console.Write(m + " "); } From c415fa1c0cb25ff20d06da7ca85e9f9ad7e9ef97 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 17 Jul 2022 14:21:16 +0300 Subject: [PATCH 16/36] Updated display features --- BUILDS/net6.0/Music Commands.dll | Bin 16896 -> 16896 bytes BUILDS/net6.0/PluginManager.dll | Bin 61952 -> 62976 bytes .../Plugins/Commands/Music Commands.dll | Bin 0 -> 16896 bytes .../net6.0/Plugins/Commands/MusicCommands.dll | Bin 17920 -> 0 bytes DiscordBot/Program.cs | 30 ++- MusicCommands/Leave.cs | 14 +- MusicCommands/MusicPlayer.cs | 60 +---- PluginManager/Config.cs | 2 +- PluginManager/Items/Command.cs | 7 +- PluginManager/Items/ConsoleCommandsHandler.cs | 5 +- .../Online/Helpers/OnlineFunctions.cs | 28 ++- PluginManager/Online/PluginsManager.cs | 20 +- PluginManager/Online/ServerCom.cs | 23 +- PluginManager/Others/Console Utilities.cs | 221 ++++++++++++------ PluginManager/Others/Enums.cs | 4 +- PluginManager/Others/Functions.cs | 5 + 16 files changed, 242 insertions(+), 177 deletions(-) create mode 100644 BUILDS/net6.0/Plugins/Commands/Music Commands.dll delete mode 100644 BUILDS/net6.0/Plugins/Commands/MusicCommands.dll diff --git a/BUILDS/net6.0/Music Commands.dll b/BUILDS/net6.0/Music Commands.dll index 0771eac46348bf9ff005e4e1f717546a8c4b14e5..509f1db2ef622ae424c97cd4e9222230820009ad 100644 GIT binary patch delta 4049 zcmb7H3vg7`8UD_>yZ7F`o7d*CAsa}tc@TsI5_tp~Ua7GNQ3Me*T7`ht!7wFCI#$GN z5KyUD4cAtSc9iOr{JxDnn})0J_ViwqHMJEuAN(u$t?HNvQy0Q|KQP<~TmgFjEtR*n7^JxAsHf6^1wbU$HT zr<(lDR&!(|bo@pa2>A!B-C22c8gtkq1jJS~`;Ue8sabui!-Hx@w*n}O=^Jub_UsyW z4D7$Sh%JTCbKdQ*jSZM>=p&O!b3VcX4mAUGb{5%m)|W_yq?H&bm`!Y zGD*EAMvOWBWA2Dp({Pyv;P5+#Ynk77$lVuG1%7Yl-NdG>6{?``$*dB^%iipFwHoH{ z$Sqc9^c~F2RjRP>?Y!x{_@fHmopMh$P|?NKGctPj2%fETmDrx^{F;K}nP_b|U zep?Dqf{IxSXE*bD#6K_Ipl16U;NfQlEv}y_cLUe8b+Z zb8){O5sBmK=%5?NN!{Yb@vzt8*$6e8Ms-eyVrxj#@0-k5X_nw~m{KKpL%&byLNu^l zq4N^W7Ex1<(VU`(pEyVS{e^`oncO{5>9f;xI~Zwja`8;$L*`4Y4i(2{yT!{wj^3`b z@ODJ-1%uC;%z!7E^IX9znUCW(SM=Q`^RgxRHsk&e(?3jix%~_I%krsDL9RI{va%!f zj1{_74pu8+mU#qn@cXbZM;>Y_ce!aMzgG_8QDGkV>`BdZi6UXxEv6PlIlJcIMbjmU zF@_y+WLy-f@vvw(jk6HiXxNP$Ue6)Z4g1irVQ4z7R)OZz*ksIN(?$Aut+0Zahb`W2 z;s$#UahJQ7SRCE2lUS<{XbT1QVPae#)^-XR(bu$%zgZ`UXS#0_Q<3-Bs1~P)bMe7x z)sLha9VGrsYsKEoR7kNxQ zOf!Y&P|T+PozNFsmT}Z%$hz-FCF3Vdyc@EB!zO;u#FpC4jHgCXQ=_D+%<{5V-~frN zQtWG4ehv*^+I}YWb2(~W8Gj?JbI-K4DTRvz)@bF>rY&H9u($d95=GWNx7mLuQB-@t zonwXZzNwyw^y+OYj1L0V;|TjCU|C)k4VkssHI8pbMvr$d}||UH*Bpt z(z!`TuyNe+`$+&1xyTM@B=1>F>DE#7{>6!fQexY4+KmMV|Xad zjA0C)7`7Ik^DV0&g_eq;n;*x8hNagV$E5)i`#6>cOzh)W9x$QE2L((MThNY$DC<|($EJw`*e^be*%oP6!Yi?fP z=Dx!pC>hbVi5YG~r{_I69<-}3%8%nQ<4cb6XOy0w+UF`hR`R+Q5j~ti%t5`uDF&Mi z&NevTV5`C9L>t!=3$T$`j2@HO3R&1z$erJBGHnJ2u*a&w0N(QIiBs(9h^Rd&>l|Jr zm0?7!>PqWM#(dX_r_64^cboBZ;ZEWNyAy3njN4Q*cd_Mans+PXQC<#lOZX0AL-Y>p zq0L=HQSQN3=P8rvC;nSKgCF1#cNcmwNvHZbms0&A$@M%F3}C%;n7EGdA-t+&j#9lw zoiwpjBTA|KkIz1Yg`TT#C9-GQeeshR5yZpUV#R1t2+Gen8Y>~is^(tN6*t&=uo%plBa*FPx27Wz4O!0(|Qr_<7ac3enD0B`7`9e zZBF6buY=EJ+?+qF?u|%JPU}OukN;Qa-&QrT@+4X@S+(L^eiy4{ILL2>UWSWxA0FlP zakl7tv+B5GE$Cd?x2tx*>f2CX5z4vz#4BsJA6-84>1Qu$eEyX~fA;$)9?i^hTvx{y z=GMg)YTftXr12sD)vx5_UJ?8kTV~ZIaam6?t~&f!V{c#9)PGv~&MAGdnI~0Go%0{D C#pMD3 delta 3907 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 literal 61952 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 diff --git a/BUILDS/net6.0/Plugins/Commands/Music Commands.dll b/BUILDS/net6.0/Plugins/Commands/Music Commands.dll new file mode 100644 index 0000000000000000000000000000000000000000..509f1db2ef622ae424c97cd4e9222230820009ad GIT binary patch literal 16896 zcmeHu4Rl-Aapt@W-~o6bK>{E_iLxY6e}+YhqAXdWY+4aTN-}Lxf7Fka)TTi2Q9=ab z(RhGlnSxBmNfWh68@uf`b<&f#n?Ik^beq=c+G&zw$4xfw*3RELU3+acuD5Q|oW$$1 zo86{O>HTKz!w)H0ZO{Ik({l>@&Al^s?#$eoxpVIWq0x7Kn0!R!$Me=(L{FgQ&rX5Y z26GsWuKZ$@9uGg)^@OqSxvnFpb8c#;=$tBMrc>EWq2QEK6LzXtE~IjW)bN3^)U-2c z_ck|MYdp~hcN6V1eAIFG$1YX1eV{oo)HbnvI+d}l;5FA6O|9r4Q&0?y5{VL_FNCyO%q6yNOQt3F61$DkO z2qr0i8jCV%eWFiMKU88~%)JF9%SibAf4bN`tpsBk6Xqu0Pv0 zhba2n<{%O<0O++)2De4)Z&tHBqfAeSEuMAM?t`B z7`^1YQQ@}kna<*idgg1oi5ZAaO#oHnf{@1C;fA=ZffV@X25x+nwcPkC>$nM2uIC1E zNpss?SPEWJwfWgBd+iY-Y!vxQ{ z4HVDK9tF{~*6Ds+&9`Gm8X*Vqw;aUNio}g{H`)z5RdTH*g+c`@Eo^DC(iOvq`_k}x zH(j1kvpf<}7r2>k#|Ac3yEhGjHb4+v?n?O8%6ToSO)pvm#r)}BVOVz6;q*oxgiVH= zJwf_A!|3V&+K?vjvybNB3v5*QnJWkU96~B}^!mGl-P!&>VSitQ_xwH07m>97ws`}) zr`t$Ig4>^~4LW^LCJtzdEA4{+gEG;gk_A@Z?q1__Z3kh`4wwOax+qo(@fM z5M-0;MO^2v_C&&rnLPg#a0Yl8V2wUcE>_0hgc`_fsa5TYc>R#Ia2%7%O44#3+{`EK# z`acQ)pKw|4kSg7O5Mv%iN@OJ16X?GMM5SiA-hT+`WK>XjvE^VDAor7c(7B02vlW2D zzYXmM9e%bB;ZJdc{71n@Oc5C58^V7UR;XDXMEJRxZ^ycp$rg~A5QZvaRZtlHu!EZl z>OGV*L>?ymF+c453~c9|Ro$xln74{F9BSvS2rc7P4V=gbX$pVJe(fjPADEqqk3B#cB`c|U7^Y< z7+70&2)Zm;_MgM4YL*8RA$5V<`F0#QxEYgZwdXc+S zXHBuSaFJGZk(V=`v#qPI(5kMGHR)3Xn=QhdO1vj&7K?b*Q8rthUMq__f!*s{0UIh*EfPR8x1l|2Q=C z-;MO|f0022D*Bf~dHtFhok7r7rjpJs zv=y8>*cS|cCAVbW&-?e49xewp;^sEp?Rcd45FeF8n6{x#d#p<9HaeO@+uy=e-ux`F z`ai&wLvewLB+Fs7$>vuaIbnBD`tIoz{C7f#LJ=3*(PgVPP=Rmu^|txJ;O3N{ez zXXt><77Ny{V}V)^?=WnL1s4w_1MBBPrS*pv#UfOT#dna&UMx^Ot`>{Xf>?+) ziG|$Lak?hLvGDfyFLD(2%RlBQE;gQ{xXNimtwoNqYL2==3>8PA;9Sj7mUa~923yH3 z`>JXupF@#YWczzy>VlyD7`9$5l1=fZs)1Y$wSi5G3~Z_y_yJ!nk~k-?W?+*x@Rb2@ zQZmu(W!5O7RYp}d)^6~xYwHd;`$3S`(&|+%5sgK!w0o)V>UOupTdH<1tJ&SM$nKV! z-QU6%@-ndH>UOtycE1;#a>?YVx5iqx{}Q`WjO<7zodYo2IS7!5#bfD1=pYBLt631M z;KtFg2V$_GS@ytwv4BStF?E64`F51V`W{e_cNp?2eJo*?p}f2!!rb?+a!PDl5|7Wf zqrNYT#Zy0kqgSqQ#(3%`Fp{}kE+2<#SHnaimgs3!vpnkJHfG8f0sVNngHz<5>EKW@ zE4b8hQNarY^fTgs!%PD=E4VGzBqzbdxN`(LoujN6=T~j`fL5$#nV15doH#`2D%uur ztM1(8HLtZT+PQ7;ny#WtV1c)D+pfNI+w{&YK7~Z_tcF8OISuq%JzZXECO6`6VS9R- zbn6_0+4M4;%hW0duZlTjbu|uIJ2=@T+Fc#ckepYE_E`JPPvRz3y=Qxh*wHM8+qxpg zE~gVoz8tJZ9}?x@Y18MW93ZizcQ0RcEiUhtPBb_P_aKV*;S6~MZ5uKQ7hCx-{av8{ z7qnX!(GAcqz_t91OO>A|0i}-sd>l_2eXMiQJ6eR^03E@>J)<9s@ZNYUxu+t<6fZ}TRY#NVXk0Y3t(R$qkbR-#YBajVBl#a!W( z%N(D@U2F|D$m*kG^k*yecd@JY9vvCR*vr7%a7wP;m3JnX86U*dINtF)k+22i?~Kj- zUd6k32oKZ{7ECy$X%!x3fjbG?m*XYhzpg>M4iAs<^^oUs3pFyI=ub?hAwIM|ur+Mb z1%XTbFNa#_SeWU*>Hi-Ald^$g(4>gKZ}_?YR|0Pr%5Bmgwzh#j?_)VH`(6&2v;lHV z`nZqj<9?>!CzQSBCG;KP{Ah^jJA$u4%lm`OxeOGGQWnqseeg%=L)P=bC{3APP;vUW zS{_c)yCd_VB)y^Tu#)s?>ki8#zsTte&LG(xVwwL&D7&DmlTOn8#tQli^%HO&rEQSb z5quuHj)7+tt%rpc{ktG*jG8?9S?Dt9_X2FsX<}I*7LKMXVcy1*|B- zf}=C8m6rNi!kZ971K*pp(tQSFKH0;q^q&HZ1tq$z^h`)&NI`u4pNueOQJY}Th?I!D zSG3amWh{aWGQjx_krKhKV(jH0&x_Dz@~95ILW2!st7*6a z>!-btc}#s(8I%W1&?DB@0N-am3;0avIlyI+Z>uhPK)s-R)NZ~6m{czz3Qdt$0ROx1 zb-)`#KLor#{A0-3KyL!>r=K>A{)|T>^ML=Ll+UCuS|;EbgXP>Gj`$Yyv$W@-(WI9G zEdT!SbC5YiE#Ukhy^j9B7r37ipnMv-4EhQ!gUqTu*VdTAtbXEE|0b@Un#RG*^8mV7fbjMvc*YK&sO9jGAR66~QRFNALQ1?VS& zy&ir{J#GZ(ryllDkg=b8*b6e|>mqz!58rJ(0V$@3{XvMau!kKCGS;LqKMJx<78jQ=z|`{`eO8J9>)4&^oWPC zz8L+shq1mGeZs?7UyMGfG0_*Jp9}T?S;4Zeo$kQxrK&wiM+DQWP13tOjI}3e!oyg5 zl5!r#+LM&`FxH+V{xbq+0c%fENn@ftNq;JsUTr6R*W={XcG628#`-$xRS#o*o%90_ zV||_UBM)PJo%9nAV||_Urp82HC%q+@*0+K}d}w;UUO{bwy=okepwiRKS{{4Vcn^|z z1r-I;^H$OYZ;Uxt(wgh*oGWRaV45>Uecl*zrs#KZDXhv&(eDYSIlJfyZ;Uy+s15g( zDrXlZ1=F0XDCLbY=PK&KCAZ4Sp)}}u9Qjpv$j3K}zs8-=K&|BdKPdkD+ZS<7@S|2T z{f}hydC(OqBU3&I&bQ}(J2@M#spaivJq!yCx*GIT8K+zs=Uf?8po~+kj5FyFcJ?9c znnM)D(}E{V-^4fkF+dYH-fxC1+>5>$YNbsAw+kE;I3nY^O_r%jhAY zJWA}{M~S2VZJ}fYK26X1dgy8Tfwc*6ySanH#XQPiw1Nf%YBCae= z^p!vfaEn=@jKO*{#xUw~&bZb30QzaG74VV3uL5q1{3<;QEx!)PoX^su!9Nhn6M%0S zU!vcl&xD?#$7rj10+y^)-$4I7Zah!ZdxI|lK8XH{^q&p3kVo$^-jF_zh7BH#8IKqV zqYZMdH?9*o*Fi!F^sgF2M$C8){4wJT#+Y$~@tM#Gqsw4jT?T6b9VgQzE4%dV54~ zkLZ1q&V~Avp-Sdfb&v6v#w}`#@C*pgfbhIXKQhm#XK793f{LlXH{YX{sy~J$hv3hT zszb&;oMnfMJ?c^PUq{_Y(YvV6-{rw9ZneG0p@)6Fl%S6SE~763uBK-IyXj|uo2l8~ zi<{39z#&=-c!$u(0C$R{y(8GW{N`W)FAoo8J{AC^uF+3^oDS@dlQ?7^Q zW60_U>0`J_e4qX&oiaY46!w`Pdmm>n?)nz?Rx|ci0@zYucqO5IzFF+X*Gz_=Qw)D2 z$nZt!PZ;;3|3@K)M}iF32Ok9dOY0KgYV$*Y;}M4cl)3-^czE4DJPMGXfcPPReh5BL zSbrGMLS865&49Qc05+qhDBOD!fF0BhxCE_&x0V8SB6k#?<$%}0dkVcSz!k_Q1$-^w zD!LwUHR_R~HOMao>IT4dv=Q)nR44`NX22f032*~#1MH>kfE$s6iu&kQz|DC3Q?!K! z0dGQV6>X*6fZK4>=3kPG!0vmYGeY;lh9$NTRscK2NG+i1K1uGtLw~TiB=7&nJa% zp|p4KYw04syJYS{9gpFibTQxGUxjbA=-}uzA-|gu-zXy6f~ejAPj00BXzxUO5znJ^ zg1(Dg`3Bm4;{<+@b%Mr?EPW5pYL%rs)gRJl(f+Pp!obwj^o)IK$4%qooBGJZ4wOqX z<bbCK|xc!LrgvH&Z(8btiHq*X!;mLk#UN=ku9~ynS*L9V**pZjWT# zGhQ=zE|V+SMPLKF@3ph#lD%URvu>mTsG4L!=(;ocT&ZMNQI-p8xtQni%`~vX)eY#t zrgC|k2e!}PfqSq4IqbQsPUbk7&EG-ekjM{U>5 zoU%1xIOondu7?~i!ke1DCtr3?dvi+8jP4CNSWdQ7o0)CIk0TU&oZ{|#a~{L)=?Qxh zrXI|cU34T?M+*q+3=aj?tlwGt7S({v^TtvfeKg#Zc z6WtQLU-UR>%*mdyOI2)IJC#PXLpf#Xija~QGWgMTz`(+JdE_>BIQT*>@Q^pH6T2Oc8$GgP)$-=bYl1 z`apHoZMn%wyHKZB^>ZAK*+myy>B_;8!jz;a1~d7$l81KVe3&e}8q-m%<$wPb{kQBklN7iDL!=Li{*FL!zS>oO*Bdb$eiL ze_?H`Q=SWHD1)klvyL<6h;zm+2xk#d$rbIv$?05yL=rrc&t-+J=6!q0EBRajcHf(| zXIP2|7`EMPF;~a2Z;K^PUP5wZQMBrWVJOO$oZ@*Iu2u?BN@HhoGc<;SfQ~p=7Xmz3 zn3U`R70EEoM~q!0*`x>v4w=$vXL46Lm#>jIunWlpJ4)l@6CTgOeEC$aFq$c#*cNGI ztdv82Eg~Mk>rW@Q*#I4Y&;vLcNhya$Tm8y(~$(I_}b~<&<|GtytP!RRn}_m=uT~4otioIaqV%aeG3CvPR*9t4H@#T8s5)Sv}$amQhMQa0bBp;70o&Gk~I9Y38Zjktn(#_K9227)Kc zhN9*4B?PE=-m62kea$Zjkv!Ryp|gOrabK;Uq7wd^V^azv4&`v?=YAHn3>EO7&40n` z9zib$&K#(D!23X-1m6s>4Bnub=3*Q_#E8s*QU(S+*@LzIM*NMb0RHM&UGKDTvt~`p zKu${Ju^nY9;y)X6OVDy2BSp~IvK*dM_~B*M2HJ4YvnEB2GN&-Z0VM_9DVoAO_5`i0 z&g1Vs3K*LPb))FZ<6V!Mr@%W6i*Z}SpBFd4BRQtqYFGM)omMaB@mlLU80s5eS~3ecrZcu(codX!~u!P{z|{Kv9#V#UqiGa~oELR%i{ z;3(OUb_O#V=wTNWo_@mKXay;nwP`54ACh$637N1fy7fRe(G_N!6XBR4ax zdpGQ=dxSGpOXV4yO?r$omgYWnRFaj4blPzGu}PeS1wc-lx8EE+7}cg+o9{~LoFuO3 zW&^p;P;12L2FGwpa^hoKZP+8$@HXS1H*UVVOR9-Zi4)@76nOQPhf`MadPS& z>P|w5xcl|*Jn)6@=XO5%<>R+}^*b;AHThG95%Q(T2%r;-F&dTbc82jmfrtD-Bi`dj z1$MCNzC^q*#CiXGDg?n3q?eV$aGU6dWc|sEeO(D!m5Oei2 zS3mb`lYCKpSiK4o2=Tek^S}VJ3`Bx~Q0!>zM7$?{R{%QaJ`Xv{Od0Xf*a?V>9ku$D zVzXLT7^bCSN8>$W_+8OpD8y)A?5I-lyYyJ!b-|{PYLCr*$Oy%^U>N_$<{pa8{RTMi zYD)QF_tQpbc_0)rbvK+MVNZ~$r&(5QekkROj|#6S-U0(5N#H|4kmeqWZ`mE}2r0#e z^y_)?x!;Cbk%ex(Q}5}qX*7=-yacu$j+uKlinT{WDYZQ6i_JX;kEtje9F5{@JoX>~ z*URk3zq5)ikA}o!FRn{jvKFX|s`%V1@wr#ybAJ_|`(b?U$IIh$Z{m3+Huuv|l_^v; zuE|>}CdT_k*3UTZ_f-89pT^2K)K44n>7ZwJq&jIj-p?+>8d_8S_}r&r4+JzC61yG< zi^NNDM7XLjHuqS3fCH@z1c38x1^Fx^)M&^+==a|-et+x*>t8X_?Zv>({w@bmoiql z#h{Hcw|WEal?xfaQ+L1JcU^S7L8}%{lK0QvA4ls9>RQOj zOjiiJQn9=QU%>~5UisnQk~DrMPt>uC+)vf<#$NT`SZW$Bn#JLKeiS!!n&$7MY+GJG zdGxKdkg-@zqp1JKeg4f0;ro1=Td0V$k8nS^lFod$;kol9(a#lQ`tx(ee}FxPzqgD7 z?xw@&jo@F}?gu^sxJUo1Tl%v9jd}gOde!5)<==Jj$B(B$tk8x5@k<&Ubw$Y0_q!1s zoP0;%&l;I^1fzVsy123M9W#f~f{YV>Q}qiFYQUxvxb%T~rKEo0(f2ZjTX0Q)5Achh z7R()jJiafoj`LWNzEQG*`n@ORaZL-?By8c&9+_X&H;g0N#a)N(m|0-wKPIOS#lfg~ z;27i-A*sI3O}I$()gIQH06%+*uLVW4e7mn(el2~yxPs*IAAeA%Acx;6PKgBe#0-4E zD>#KK2yR(OV}fMXcfg~wmswwR-Hh>t=i2^i)T{k|5b_*YQ-;q<4c1><4%EOGI5cVD z{Ka0Y`wahDLi{@jpYq$yG@`HHNZx)9`}<$m=b-*4Yaf>1Z~hCj{a?-fKlZ@?2AVH) A)Bpeg literal 0 HcmV?d00001 diff --git a/BUILDS/net6.0/Plugins/Commands/MusicCommands.dll b/BUILDS/net6.0/Plugins/Commands/MusicCommands.dll deleted file mode 100644 index 23499242478e7c51d36af57950cc23b88106a227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17920 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 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 4f5802a..712828f 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -using Discord; -using Discord.Net.Queue; using DiscordBot.Discord.Core; using PluginManager; using PluginManager.Items; @@ -45,7 +43,8 @@ public class Program Console.Write("Prefix = "); var prefix = Console.ReadLine()![0]; - if (prefix == ' ' || char.IsDigit(prefix)) return; + if (prefix == ' ' || char.IsDigit(prefix)) + return; Config.AddValueToVariables("prefix", prefix.ToString(), false); } @@ -93,20 +92,33 @@ public class Program Console.Clear(); Console.ForegroundColor = ConsoleColor.DarkYellow; - List startupMessageList = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage"); + List startupMessageList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/StartupMessage"); - foreach (var message in startupMessageList) Console.WriteLine(message); + foreach (var message in startupMessageList) + Console.WriteLine(message); Console.WriteLine($"Running on version: {Config.GetValue("Version") ?? System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}"); Console.WriteLine($"Git URL: {Config.GetValue("GitURL") ?? " Could not find Git URL"}"); - Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command &y(sd) &ror some settings won't be saved"); + Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n"); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine($"============================ LOG ============================"); try { - var token = Config.GetValue("token"); + var token = Config.GetValue("token"); +#if DEBUG + Console.WriteLine("Starting in DEBUG MODE"); + if (!Directory.Exists("./Data/BetaTest")) + Console.WriteLine("Failed to start in debug mode because the folder ./Data/BetaTest does not exist"); + else + { + token = File.ReadAllText("./Data/BetaTest/token.txt"); + + //Debug mode code... + } +#endif + var prefix = Config.GetValue("prefix"); var discordbooter = new Boot(token, prefix); @@ -239,7 +251,7 @@ public class Program if (Config.GetValue("DeleteLogsAtStartup")) foreach (var file in Directory.GetFiles("./Output/Logs/")) File.Delete(file); - List OnlineDefaultKeys = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys"); + List OnlineDefaultKeys = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/SetupKeys"); Config.PluginConfig.Load(); @@ -263,7 +275,7 @@ public class Program } } - List onlineSettingsList = await ServerCom.ReadTextFromFile("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData"); + List onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData"); foreach (var key in onlineSettingsList) { if (key.Length <= 3 || !key.Contains(' ')) continue; diff --git a/MusicCommands/Leave.cs b/MusicCommands/Leave.cs index 98af079..3ee6975 100644 --- a/MusicCommands/Leave.cs +++ b/MusicCommands/Leave.cs @@ -22,10 +22,20 @@ internal class Leave : DBCommand { if (Data.audioClient is not null && Data.voiceChannel is not null) { - Data.Playlist.ClearQueue(); - Data.MusicPlayer.isPlaying = false; await Data.audioClient.StopAsync(); await Data.voiceChannel.DisconnectAsync(); } + + if (Data.Playlist is not null) + { + Data.Playlist.ClearQueue(); + Data.Playlist = new(); + } + + if (Data.MusicPlayer is not null) + { + Data.MusicPlayer.Stop(); + Data.MusicPlayer = null; + } } } diff --git a/MusicCommands/MusicPlayer.cs b/MusicCommands/MusicPlayer.cs index 536f6d7..5b5ae17 100644 --- a/MusicCommands/MusicPlayer.cs +++ b/MusicCommands/MusicPlayer.cs @@ -1,9 +1,5 @@ -using System; -using System.IO; -using System.Net.Http; -using System.Threading; +using System.IO; using System.Threading.Tasks; -using PluginManager.Others; namespace MusicCommands; @@ -48,54 +44,8 @@ internal class MusicPlayer isPlaying = false; } - - /* - public MusicPlayer(Stream input, Stream output) - { - inputStream = input; - outputStream = output; - } - - - - - - public Stream inputStream { get; } // from FFMPEG - public Stream outputStream { get; } // to Voice Channel - - public bool Paused { get; set; } - private bool _stop { get; set; } - - public void Stop() - { - _stop = true; - } - - public async Task StartSendAudio(int bsize) - { - Paused = false; - _stop = false; - while (!_stop) - { - if (Paused) continue; - var buffer = new byte[bsize]; - var bcount = await inputStream.ReadAsync(buffer, 0, bsize); - if (bcount <= 0) - { - Stop(); - Data.CurrentlyRunning = null; - break; - } - - try - { - await outputStream.WriteAsync(buffer, 0, bcount); - } - catch (Exception ex) - { - await outputStream.FlushAsync(); - Functions.WriteLogFile(ex.ToString()); - } - } - }*/ + public void Stop() + { + isPlaying = false; + } } diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 7848152..f20434a 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -19,7 +19,7 @@ namespace PluginManager { public static class PluginConfig { - public static List> InstalledPlugins = new(); + public static readonly List> InstalledPlugins = new(); public static void Load() { diff --git a/PluginManager/Items/Command.cs b/PluginManager/Items/Command.cs index ea8078b..6634b59 100644 --- a/PluginManager/Items/Command.cs +++ b/PluginManager/Items/Command.cs @@ -5,7 +5,7 @@ using PluginManager.Others; namespace PluginManager.Items; -internal class Command +public class Command { /// /// The author of the command @@ -20,10 +20,7 @@ internal class Command { Author = message.Author; var data = message.Content.Split(' '); - if (data.Length > 1) - Arguments = new List(data.MergeStrings(1).Split(' ')); - else - Arguments = new List(); + Arguments = data.Length > 1 ? new List(data.MergeStrings(1).Split(' ')) : new List(); CommandName = data[0].Substring(1); PrefixUsed = data[0][0]; } diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 8f1e4ab..07e90f2 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; @@ -48,7 +47,7 @@ public class ConsoleCommandsHandler } items.Add(new[] { "-", "-", "-" }); - Console_Utilities.FormatAndAlignTable(items); + Console_Utilities.FormatAndAlignTable(items, TableFormat.DEFAULT); } else { @@ -147,7 +146,7 @@ public class ConsoleCommandsHandler { Console.WriteLine($"Downloading requirements for plugin : {name}"); - var lines = await ServerCom.ReadTextFromFile(info[2]); + var lines = await ServerCom.ReadTextFromURL(info[2]); foreach (var line in lines) { diff --git a/PluginManager/Online/Helpers/OnlineFunctions.cs b/PluginManager/Online/Helpers/OnlineFunctions.cs index 213a056..343ffe1 100644 --- a/PluginManager/Online/Helpers/OnlineFunctions.cs +++ b/PluginManager/Online/Helpers/OnlineFunctions.cs @@ -18,32 +18,32 @@ namespace PluginManager.Online.Helpers /// The that is used to track the download progress /// The cancellation token /// - internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, - IProgress? progress = null, IProgress? downloadedBytes = null, CancellationToken cancellation = default) + internal static async Task DownloadFileAsync(this HttpClient client, string url, Stream destination, IProgress? progress = null, IProgress? downloadedBytes = null, int bufferSize = 81920, CancellationToken cancellation = default) { - using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) + using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellation)) { var contentLength = response.Content.Headers.ContentLength; - using (var download = await response.Content.ReadAsStreamAsync()) + using (var download = await response.Content.ReadAsStreamAsync(cancellation)) { - // Ignore progress reporting when no progress reporter was // passed or when the content length is unknown if (progress == null || !contentLength.HasValue) { - await download.CopyToAsync(destination); + await download.CopyToAsync(destination, cancellation); return; } // Convert absolute progress (bytes downloaded) into relative progress (0% - 100%) var relativeProgress = new Progress(totalBytes => - { - progress.Report((float)totalBytes / contentLength.Value * 100); - downloadedBytes?.Report(totalBytes); - }); + { + progress.Report((float)totalBytes / contentLength.Value * 100); + downloadedBytes?.Report(totalBytes); + } + ); + // Use extension method to report progress while downloading - await download.CopyToOtherStreamAsync(destination, 81920, relativeProgress, cancellation); + await download.CopyToOtherStreamAsync(destination, bufferSize, relativeProgress, cancellation); progress.Report(1); } } @@ -57,10 +57,8 @@ namespace PluginManager.Online.Helpers /// internal static async Task DownloadStringAsync(string url, CancellationToken cancellation = default) { - using (var client = new HttpClient()) - { - return await client.GetStringAsync(url); - } + using var client = new HttpClient(); + return await client.GetStringAsync(url, cancellation); } diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index d3bf569..ddbe61c 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -30,7 +30,7 @@ public class PluginsManager { try { - var list = await ServerCom.ReadTextFromFile(PluginsLink); + var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); var data = new List(); @@ -43,7 +43,8 @@ public class PluginsManager data.Add(new[] { "-", "-", "-", "-", "-" }); for (var i = 0; i < len; i++) { - if (lines[i].Length <= 2) continue; + if (lines[i].Length <= 2) + continue; var content = lines[i].Split(','); var display = new string[titles.Length]; if (op == OperatingSystem.WINDOWS) @@ -54,7 +55,7 @@ public class PluginsManager display[1] = content[1]; display[2] = content[2]; if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) - display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString(); + display[3] = ((await ServerCom.ReadTextFromURL(content[5])).Count + 1).ToString(); else display[3] = "1"; @@ -72,7 +73,8 @@ public class PluginsManager display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; - if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) display[3] = ((await ServerCom.ReadTextFromFile(content[5])).Count + 1).ToString(); + if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) + display[3] = ((await ServerCom.ReadTextFromURL(content[5])).Count + 1).ToString(); if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0])) display[4] = "✓"; else @@ -88,7 +90,7 @@ public class PluginsManager } catch (Exception exception) { - Console.WriteLine("Failed to execute command: listlang\nReason: " + exception.Message); + Console.WriteLine("Failed to execute command: listplugs\nReason: " + exception.Message); Functions.WriteErrFile(exception.ToString()); } } @@ -102,7 +104,7 @@ public class PluginsManager { try { - var list = await ServerCom.ReadTextFromFile(PluginsLink); + var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); var len = lines.Length; for (var i = 0; i < len; i++) @@ -110,8 +112,10 @@ public class PluginsManager var contents = lines[i].Split(','); if (contents[0] == name) { - if (contents.Length == 6) return new[] { contents[2], contents[3], contents[5] }; - if (contents.Length == 5) return new[] { contents[2], contents[3], string.Empty }; + if (contents.Length == 6) + return new[] { contents[2], contents[3], contents[5] }; + if (contents.Length == 5) + return new[] { contents[2], contents[3], string.Empty }; throw new Exception("Failed to download plugin. Invalid Argument Length"); } } diff --git a/PluginManager/Online/ServerCom.cs b/PluginManager/Online/ServerCom.cs index 67c2401..7ae5834 100644 --- a/PluginManager/Online/ServerCom.cs +++ b/PluginManager/Online/ServerCom.cs @@ -9,15 +9,14 @@ using PluginManager.Others; namespace PluginManager.Online { - public class ServerCom + public static class ServerCom { - /// /// Read all lines from a file async /// /// The link of the file /// - public static async Task> ReadTextFromFile(string link) + public static async Task> ReadTextFromURL(string link) { string response = await OnlineFunctions.DownloadStringAsync(link); string[] lines = response.Split('\n'); @@ -52,15 +51,12 @@ namespace PluginManager.Online /// public static async Task DownloadFileAsync(string URL, string location) { - bool isDownloading = true; - int c_progress = 0; + bool isDownloading = true; + float c_progress = 0; - Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100, NoColor = true }; + Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100f, NoColor = true }; - IProgress progress = new Progress(percent => - { - c_progress = (int)percent; - }); + IProgress progress = new Progress(percent => { c_progress = percent; }); Task updateProgressBarTask = new Task(() => @@ -68,7 +64,8 @@ namespace PluginManager.Online while (isDownloading) { pbar.Update(c_progress); - if (c_progress == 100) break; + if (c_progress == 100f) + break; Thread.Sleep(500); } } @@ -78,8 +75,8 @@ namespace PluginManager.Online await DownloadFileAsync(URL, location, progress); - c_progress = 100; - pbar.Update(100); + c_progress = pbar.Max; + pbar.Update(100f); isDownloading = false; } } diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 42ff71e..15b902e 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -1,4 +1,5 @@ -using System; +using Discord; +using System; using System.Collections.Generic; using System.Linq; @@ -48,7 +49,7 @@ namespace PluginManager.Others if (progress.CanAproximateTo(Max)) Console.Write(progress + " % ✓"); else - Console.Write(progress + " % "); + Console.Write(MathF.Round(progress, 2) + " % "); } else Console.Write(progress + $"{speed} {unit}/s "); @@ -63,93 +64,183 @@ namespace PluginManager.Others /// A way to create a table based on input data /// /// The List of arrays of strings that represent the rows. - public static void FormatAndAlignTable(List data) + public static void FormatAndAlignTable(List data, TableFormat format = TableFormat.CENTER_EACH_COLUMN_BASED) { - char tableLine = '-'; - char tableCross = '+'; - char tableWall = '|'; - - int[] len = new int[data[0].Length]; - foreach (var line in data) + if (format == TableFormat.CENTER_EACH_COLUMN_BASED) { - for (int i = 0; i < line.Length; i++) - if (line[i].Length > len[i]) - len[i] = line[i].Length; - } + char tableLine = '-'; + char tableCross = '+'; + char tableWall = '|'; + + int[] len = new int[data[0].Length]; + foreach (var line in data) + for (int i = 0; i < line.Length; i++) + if (line[i].Length > len[i]) + len[i] = line[i].Length; - foreach (string[] row in data) - { - if (row[0][0] == tableLine) Console.Write(tableCross); - else Console.Write(tableWall); - for (int l = 0; l < row.Length; l++) + foreach (string[] row in data) { - if (row[l][0] == tableLine) - { - for (int i = 0; i < len[l] + 4; ++i) - Console.Write(tableLine); - } - else if (row[l].Length == len[l]) - { - Console.Write(" "); - Console.Write(row[l]); - Console.Write(" "); - } + if (row[0][0] == tableLine) + Console.Write(tableCross); else + Console.Write(tableWall); + for (int l = 0; l < row.Length; l++) { + if (row[l][0] == tableLine) + { + for (int i = 0; i < len[l] + 4; ++i) + Console.Write(tableLine); + } + else if (row[l].Length == len[l]) + { + Console.Write(" "); + Console.Write(row[l]); + Console.Write(" "); + } + else + { + int lenHalf = row[l].Length / 2; + for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i) + Console.Write(" "); + Console.Write(row[l]); + for (int i = (len[l] + 4) / 2 + lenHalf + 1; i < len[l] + 4; ++i) + Console.Write(" "); + if (row[l].Length % 2 == 0) + Console.Write(" "); + } - int lenHalf = row[l].Length / 2; - for (int i = 0; i < ((len[l] + 4) / 2 - lenHalf); ++i) - Console.Write(" "); - Console.Write(row[l]); - for (int i = (len[l] + 4) / 2 + lenHalf + 1; i < len[l] + 4; ++i) - Console.Write(" "); - if (row[l].Length % 2 == 0) + Console.Write(row[l][0] == tableLine ? tableCross : tableWall); + } + + Console.WriteLine(); //end line + } + + return; + } + + if (format == TableFormat.CENTER_OVERALL_LENGTH) + { + int maxLen = 0; + foreach (string[] row in data) + foreach (string s in row) + if (s.Length > maxLen) + maxLen = s.Length; + + int div = (maxLen + 4) / 2; + + foreach (string[] row in data) + { + Console.Write("\t"); + if (row[0] == "-") + Console.Write("+"); + else + Console.Write("|"); + + foreach (string s in row) + { + if (s == "-") + { + for (int i = 0; i < maxLen + 4; ++i) + Console.Write("-"); + } + else if (s.Length == maxLen) + { + Console.Write(" "); + Console.Write(s); + Console.Write(" "); + } + else + { + int lenHalf = s.Length / 2; + for (int i = 0; i < div - lenHalf; ++i) + Console.Write(" "); + Console.Write(s); + for (int i = div + lenHalf + 1; i < maxLen + 4; ++i) + Console.Write(" "); + if (s.Length % 2 == 0) + Console.Write(" "); + } + + if (s == "-") + Console.Write("+"); + else + Console.Write("|"); + } + + Console.WriteLine(); //end line + } + + return; + } + + if (format == TableFormat.DEFAULT) + { + int[] widths = new int[data[0].Length]; + int space_between_columns = 5; + for (int i = 0; i < data.Count; i++) + { + for (int j = 0; j < data[i].Length; j++) + { + if (data[i][j].Length > widths[j]) + widths[j] = data[i][j].Length; + } + } + + for (int i = 0; i < data.Count; i++) + { + for (int j = 0; j < data[i].Length; j++) + { + if (data[i][j] == "-") + data[i][j] = " "; + Console.Write(data[i][j]); + for (int k = 0; k < widths[j] - data[i][j].Length + 1 + space_between_columns; k++) Console.Write(" "); } - Console.Write(row[l][0] == tableLine ? tableCross : tableWall); + Console.WriteLine(); } - Console.WriteLine(); //end line + return; } + + throw new Exception("Unknown type of table"); } - public static void WriteColorText(string text, bool appendNewLine = true) + public static void WriteColorText(string text, bool appendNewLineAtEnd = true) { - - string[] words = text.Split(' '); - ConsoleColor fg = Console.ForegroundColor; - Dictionary colors = new Dictionary() + ConsoleColor initialForeGround = Console.ForegroundColor; + Dictionary colors = new() { - { "&g", ConsoleColor.Green }, - { "&b", ConsoleColor.Blue }, - { "&r", ConsoleColor.Red }, - { "&m", ConsoleColor.Magenta }, - { "&y", ConsoleColor.Yellow }, - { "&c", fg } + { 'g', ConsoleColor.Green }, + { 'b', ConsoleColor.Blue }, + { 'r', ConsoleColor.Red }, + { 'm', ConsoleColor.Magenta }, + { 'y', ConsoleColor.Yellow }, + { 'c', initialForeGround } }; - foreach (string word in words) + + char[] input = text.ToCharArray(); + for (int i = 0; i < input.Length; i++) { - if (word.Length >= 2) + if (input[i] == '&') { - string prefix = word.Substring(0, 2); - if (colors.ContainsKey(prefix)) - Console.ForegroundColor = colors[prefix]; + if (i + 1 < input.Length) + { + if (colors.ContainsKey(input[i + 1])) + { + Console.ForegroundColor = colors[input[i + 1]]; + i++; + } + } } - - string m = colors.Keys.Aggregate(word, (current, key) => current.Replace(key, "")); - - Console.Write(m + " "); + else + Console.Write(input[i]); } - Console.CursorLeft--; - - if (appendNewLine) - Console.Write('\n'); - - Console.ForegroundColor = fg; + Console.ForegroundColor = initialForeGround; + if (appendNewLineAtEnd) + Console.WriteLine(); } - } } diff --git a/PluginManager/Others/Enums.cs b/PluginManager/Others/Enums.cs index 6ace192..322230d 100644 --- a/PluginManager/Others/Enums.cs +++ b/PluginManager/Others/Enums.cs @@ -28,4 +28,6 @@ public enum OutputLogLevel { NONE, INFO, WARNING, ERROR, CRITICAL } /// public enum PluginType { Command, Event, Unknown } -public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize } \ No newline at end of file +public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize } + +public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT } \ No newline at end of file diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index d88caf3..638b6f1 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -38,6 +38,11 @@ namespace PluginManager.Others /// public static readonly string pakFolder = @"./Data/Resources/PAK/"; + /// + /// Beta testing folder + /// + public static readonly string betaFolder = @"./Data/BetaTest/"; + /// /// Read data from a file that is inside an archive (ZIP format) From 17f68a8e5e5f0bb904eba0702a40aa8bcb425a59 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 17 Jul 2022 18:53:56 +0300 Subject: [PATCH 17/36] Moved Console activity on another thread --- BUILDS/net6.0/PluginManager.dll | Bin 62976 -> 62464 bytes .../Plugins/Commands/CMD_LevelingSystem.dll | Bin 10240 -> 10240 bytes .../Plugins/Events/EVE_LevelingSystem.dll | Bin 12800 -> 12800 bytes DiscordBot/Program.cs | 34 ++++++------- EVE_LevelingSystem/Level.cs | 9 ++-- PluginManager/Items/Command.cs | 1 + PluginManager/Items/ConsoleCommandsHandler.cs | 18 +------ PluginManager/Loaders/PluginLoader.cs | 15 +++++- PluginManager/Others/Console Utilities.cs | 45 ++++++++++++------ PluginManager/Others/Functions.cs | 24 ++-------- 10 files changed, 73 insertions(+), 73 deletions(-) diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 3442573157e6a76efb9bcb35e217a72a836f45f6..90dfd5a22dbab849a3f375c35cb708517fe71ff8 100644 GIT binary patch literal 62464 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 xGT3)7rBXUM_j#k~9NeP&(p#*wKO*+3PJz? literal 62976 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 diff --git a/BUILDS/net6.0/Plugins/Commands/CMD_LevelingSystem.dll b/BUILDS/net6.0/Plugins/Commands/CMD_LevelingSystem.dll index c1c7ecf41ec69a91e47e2f51a0649013972d699a..665a62d83c414c93f7bb57653c55216a86dad790 100644 GIT binary patch delta 105 zcmZn&Xb70l!Sdqmg((|*?nnukTr0}!x~%0hTX5&KO|RniZmy7yVP>hGZv1%i4Y>dT yujfY}cs>vJZ*6}%>0Ixkgvl22nF>(BewZLgwP|j3U8m|c1=Xthtj!1I?KuDeTQn8` delta 105 zcmZn&Xb70l!Sdj1?yrqKcccVvd9!IQICsQj=Leg8OaixbH&;lgT|W9CcE97k z%A;o%-rzX6`GV?6Mn=ZXv(#rXvAFUtIW^frD?mWaeuCFNh6#>S9DZE6+3Ejf@(is^ g1*qV|D^Nk8YA>F@LZ;WwhCN)YCLFg}QTsj{0PGezIsgCw delta 136 zcmZojX-JvS!ScG{^V^L*23$gFMaGN_1x1-aLR^E3fk9hs^Es|hQUY<>bHo=4Wcf|p za`Tkzf73UcFQ}emWMtYrOMMm-i{qnXXC_-{1qkeSmR-KX@u1T}&aG@y-c9*1d4^V| f0!%OwDhO2VGvl0UrE24uf8wp&jhhv<@3R2_jdD4R diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 712828f..8836669 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; using DiscordBot.Discord.Core; using PluginManager; @@ -66,7 +67,7 @@ public class Program /// The main loop for the discord bot /// /// The discord booter used to start the application - private static Task NoGUI(Boot discordbooter) + private static void NoGUI(Boot discordbooter) { var consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client); if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); @@ -77,9 +78,18 @@ public class Program while (true) { Console.ForegroundColor = ConsoleColor.White; + +#if DEBUG + Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); var cmd = Console.ReadLine(); - if (!consoleCommandsHandler.HandleCommand(cmd)) + if (!consoleCommandsHandler.HandleCommand(cmd!, false) && cmd.Length > 0) Console.WriteLine("Failed to run command " + cmd); +#else + Console_Utilities.WriteColorText("&rSethBot &c> ", false); + var cmd = Console.ReadLine(); + if (!consoleCommandsHandler.HandleCommand(cmd!) && cmd.Length > 0) + Console.WriteLine("Failed to run command " + cmd); +#endif } } @@ -177,8 +187,9 @@ public class Program if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) { - var b = await StartNoGUI(); - await NoGUI(b); + var b = await StartNoGUI(); + Thread mainThread = new Thread(() => NoGUI(b)); + mainThread.Start(); return; } @@ -204,15 +215,7 @@ public class Program case "--help": case "-help": Console.ForegroundColor = ConsoleColor.DarkYellow; - Console.WriteLine( - "\tCommand name\t\t\t\tDescription\n" + - "-- help | -help\t\t ------ \tDisplay the help message\n" + - "--reset-full\t\t ------ \tReset all files (clear files)\n" + - "--reset-settings\t ------ \tReset only bot settings\n" + - "--reset-logs\t\t ------ \tClear up the output folder\n" + - "--start\t\t ------ \tStart the bot\n" + - "exit\t\t\t ------ \tClose the application" - ); + Console.WriteLine("\tCommand name\t\t\t\tDescription\n" + "-- help | -help\t\t ------ \tDisplay the help message\n" + "--reset-full\t\t ------ \tReset all files (clear files)\n" + "--reset-settings\t ------ \tReset only bot settings\n" + "--reset-logs\t\t ------ \tClear up the output folder\n" + "--start\t\t ------ \tStart the bot\n" + "exit\t\t\t ------ \tClose the application"); break; case "--reset-full": await ClearFolder("./Data/Resources/"); @@ -232,10 +235,6 @@ public class Program case "exit": Environment.Exit(0); break; - case "--start": - var booter = await StartNoGUI(); - await NoGUI(booter); - return; default: Console.WriteLine("Failed to execute command " + message[0]); @@ -321,6 +320,7 @@ public class Program } } + Console_Utilities.Initialize(); Config.SaveConfig(); } diff --git a/EVE_LevelingSystem/Level.cs b/EVE_LevelingSystem/Level.cs index f4a9c6b..9afa612 100644 --- a/EVE_LevelingSystem/Level.cs +++ b/EVE_LevelingSystem/Level.cs @@ -11,15 +11,18 @@ namespace EVE_LevelingSystem { public string name => "Leveling System Event Handler"; public string description => "The Leveling System Event Handler"; + internal static Settings globalSettings = new(); public async void Start(DiscordSocketClient client) { Directory.CreateDirectory("./Data/Resources/LevelingSystem"); - Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true); - Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true); - + if (!Config.ContainsKey("LevelingSystemPath")) + Config.AddValueToVariables("LevelingSystemPath", "./Data/Resources/LevelingSystem", true); + if (!Config.ContainsKey("LevelingSystemSettingsFile")) + Config.AddValueToVariables("LevelingSystemSettingsFile", "./Data/Resources/LevelingSystemSettings.txt", true); + //PluginManager.Config.AddValueToVariables if (!File.Exists(Config.GetValue("LevelingSystemSettingsFile"))) { globalSettings = new Settings { TimeToWaitBetweenMessages = 5 }; diff --git a/PluginManager/Items/Command.cs b/PluginManager/Items/Command.cs index 6634b59..22cd36a 100644 --- a/PluginManager/Items/Command.cs +++ b/PluginManager/Items/Command.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Discord.WebSocket; using PluginManager.Others; diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 07e90f2..351d295 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -97,7 +97,7 @@ public class ConsoleCommandsHandler } ); - AddCommand("listplugs", "list available plugins", async () => { await manager.ListAvailablePlugins(); }); + AddCommand("listplugs", "list available plugins", () => { manager.ListAvailablePlugins().Wait(); }); AddCommand("dwplug", "download plugin", "dwplug [name]", async args => { @@ -233,20 +233,6 @@ public class ConsoleCommandsHandler } ); - AddCommand("vars", "Display all variables", () => - { - var d = Config.GetAllVariables(); - var data = new List(); - data.Add(new[] { "-", "-" }); - data.Add(new[] { "Key", "Value" }); - data.Add(new[] { "-", "-" }); - foreach (var kvp in d) - data.Add(new[] { kvp.Key, kvp.Value.ToString()! }); - data.Add(new[] { "-", "-" }); - Console_Utilities.FormatAndAlignTable(data); - } - ); - AddCommand("sd", "Shuts down the discord bot", async () => { if (client is null) @@ -299,7 +285,7 @@ public class ConsoleCommandsHandler if (removeCommandExecution) { Console.SetCursorPosition(0, Console.CursorTop - 1); - for (int i = 0; i < command.Length; i++) + for (int i = 0; i < command.Length + 30; i++) Console.Write(" "); Console.SetCursorPosition(0, Console.CursorTop); } diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index 6fdaf74..c506eaf 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -85,9 +85,20 @@ public class PluginLoader private void OnEventLoaded(LoaderArgs e) { - if (e.IsLoaded) ((DBEvent)e.Plugin!).Start(_client); + try + { + if (e.IsLoaded) + ((DBEvent)e.Plugin!).Start(_client); - onEVELoad?.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception); + onEVELoad?.Invoke(((DBEvent)e.Plugin!).name, e.TypeName!, e.IsLoaded, e.Exception); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + Console.WriteLine("Plugin: " + e.PluginName); + Console.WriteLine("Type: " + e.TypeName); + Console.WriteLine("IsLoaded: " + e.IsLoaded); + } } private void OnCommandLoaded(LoaderArgs e) diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 15b902e..44a8a42 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -7,6 +7,26 @@ namespace PluginManager.Others { public static class Console_Utilities { + public static void Initialize() + { + if (!Config.ContainsKey("TableVariables")) + Config.AddValueToVariables("TableVariables", new Dictionary { { "DefaultSpace", "3" } }, false); + if (!Config.ContainsKey("ColorDataBase")) + Config.AddValueToVariables("ColorDataBase", new Dictionary() + { + { 'g', ConsoleColor.Green }, + { 'b', ConsoleColor.Blue }, + { 'r', ConsoleColor.Red }, + { 'm', ConsoleColor.Magenta }, + { 'y', ConsoleColor.Yellow }, + }, false + ); + + if (!Config.ContainsKey("ColorPrefix")) + Config.AddValueToVariables("ColorPrefix", '&', false); + } + + /// /// Progress bar object /// @@ -177,7 +197,7 @@ namespace PluginManager.Others if (format == TableFormat.DEFAULT) { int[] widths = new int[data[0].Length]; - int space_between_columns = 5; + int space_between_columns = int.Parse(Config.GetValue>("TableVariables")?["DefaultSpace"]!); for (int i = 0; i < data.Count; i++) { for (int j = 0; j < data[i].Length; j++) @@ -210,26 +230,21 @@ namespace PluginManager.Others public static void WriteColorText(string text, bool appendNewLineAtEnd = true) { ConsoleColor initialForeGround = Console.ForegroundColor; - Dictionary colors = new() - { - { 'g', ConsoleColor.Green }, - { 'b', ConsoleColor.Blue }, - { 'r', ConsoleColor.Red }, - { 'm', ConsoleColor.Magenta }, - { 'y', ConsoleColor.Yellow }, - { 'c', initialForeGround } - }; - - char[] input = text.ToCharArray(); + char[] input = text.ToCharArray(); for (int i = 0; i < input.Length; i++) { - if (input[i] == '&') + if (input[i] == Config.GetValue("ColorPrefix")) { if (i + 1 < input.Length) { - if (colors.ContainsKey(input[i + 1])) + if (Config.GetValue>("ColorDataBase")!.ContainsKey(input[i + 1])) { - Console.ForegroundColor = colors[input[i + 1]]; + Console.ForegroundColor = Config.GetValue>("ColorDataBase")![input[i + 1]]; + i++; + } + else if (input[i + 1] == 'c') + { + Console.ForegroundColor = initialForeGround; i++; } } diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 638b6f1..360b7c8 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -50,31 +50,15 @@ namespace PluginManager.Others /// The file name that is inside the archive or its full path /// The archive location from the PAKs folder /// 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) + public static Stream? ReadFromPakAsync(string FileName, string archFile) { archFile = pakFolder + archFile; Directory.CreateDirectory(pakFolder); if (!File.Exists(archFile)) throw new FileNotFoundException("Failed to load file !"); - Stream? textValue = null; - var fs = new FileStream(archFile, FileMode.Open); - var zip = new ZipArchive(fs, ZipArchiveMode.Read); - foreach (var entry in zip.Entries) - { - if (entry.Name == FileName || entry.FullName == FileName) - { - Stream s = entry.Open(); - StreamReader reader = new StreamReader(s); - textValue = reader.BaseStream; - textValue.Position = 0; - reader.Close(); - s.Close(); - fs.Close(); - break; - } - } - - return textValue; + using ZipArchive archive = ZipFile.OpenRead(archFile); + ZipArchiveEntry? entry = archive.GetEntry(FileName); + return entry?.Open(); } /// From 79002de9a533baa92f807f5fe767e8c3b2721336 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 17 Jul 2022 19:28:22 +0300 Subject: [PATCH 18/36] --- .gitignore | 2 ++ BUILDS/net6.0/PluginManager.dll | Bin 62464 -> 62464 bytes DiscordBot/Program.cs | 13 +++++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index add3252..07c8e23 100644 --- a/.gitignore +++ b/.gitignore @@ -362,3 +362,5 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd + +ImportDllFromWebsiteDynamically.txt \ No newline at end of file diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 90dfd5a22dbab849a3f375c35cb708517fe71ff8..9671e1e560ed7b03407c632794ef11ad9c774f66 100644 GIT binary patch delta 3040 zcmZvedr(x@9ml`tvh1!bk6kYEehSDUpjc}pkp!O+Y=+C;Gt!O${eCw4+pLR7Z)dChI@aX^ZovQ z=lt$DyLW5uIn~^AYCCM`-tguR?M;ECyS+b$BvV47oMT-G0%@2OOSh0H(o1Vewci0Y z#{ZJpzXWG=?FTyA07AznmZ=-169MES`rn{@vXyQQ&ZQeNT#W=Q5As&wN3!#@82N_uy%`dOf z2aKzDc!*!Vq>I9$E#W2>#_`L3S`Zd(Y~^7mJrZ`X?xce%n#obRC5O;rNSl#%X ziAWO`b<6VkM0#kUwTbaoxU#GmH>vV%R@`4P(2I%B60`asaRd1&&6n`|>-U)dPtv zMlB{Sx14w2p`d!-v5@aPi?HW;uGO1QM!4E`V!uxRv=w3}YIQp6I_0?&4Nqz9Iz6&k znX_9b*T6#TLZ427fmTMRs&!m!EyQl9IxV+a8C}rnTmSo>#Td|O${%tuu4%*;N>GBY zpU@vXOE4*@7E413N^vfUH*pjvJuGr5yjIMRpS%}qRxH!-D~}4P0{e9FZp5e3K6L3c z<}pv+kFNyPL-nxBl{iDcD>+_$Wu=xqWH}%m#6v;tNDJlEw2Eu(xE;YMezoTOeBP&w zdURSOC(3nj<-37)-@73Pq&MIzi0=Tw8;B4zPS!?o8eYqtv4-rB8gNyolOb<;HegsI^vf^Hjo7_jf!=C4B;DUjPyJ4-x*COwgtIRZnDqs$Q)1!-j{th&aX6iu%Sk{{tEk!=*09aYbOlbv@*PCC(h?Nigw~-L0ZwH7|=EDJc={y?KpG1j^eB! z&3OzLbd5WY;SPIIviY@>cno6#HES2XeTpUp@pb3V=|UoVH?uP%_Wn4M1!-G&9QnWG znpX2TwhPjn-PomTeEM!Q6$&SPR95k9i-@&PPd~Z^X<7YvS5O^3Lx8a#r)FuVaE|_V zZ&mfRS=pCxdzRx8?&{ff=#eiWVJDxn4x{Ei`7&1PWMOA|5F2&+BRMGl2^VxKHXM|% zA##_NcgH|*9SJ&x8++vI*jKINJ%%?hpwl)}k357GyS2m-MmJHQQ-k@8{1=o9(%QU* z8eRLIorPPl7i)Q2&758pG~+DNwSPMo$+xh#n4MtW(^>X=bQm{gS%)#ITc0OA@-Y4} zOS_FJT}vnD<=b#B;Z?LLM&K@}4%?YFg0NZIC}IU^`#p-o6|l2JZNo>=Sm7vh2OWYm zD)r^r=6sp=TzI&zesz$>Ho~E?S}vW delta 3099 zcmZve3s6+o8OQ(UvMdX`$}SgKUb?(l1X48BXe2%o@ex1`4pz-v*)tmirqE8@*s>W)c?+seB;S!2Fy_OfJ^r+9)g z)`Ql=wO`W8m=x<(-o4G62zrq5G&AeY<4r9cV!VfUU+2x|G&nZJIxB#6vv|`&ABjyd zALQM4s1~~=;BTy}Xt#9|_dX%Bs2;x}>Qf6UobK0HWh(+~VdGLuEP?H+$zjs2(X@o0 zO!kMLbIHPpBe_C6F#k>LD?7B*{%OXjF1Msi1R`PclKb zxc^Q<+XGSIW;Z+tt{C@Se%1Cnknam7(xQ#`nj#Fyh zV96u3Xxf=Mlf>vlnU9k1)52-)>_Y(ySW2blP3oC3L09M8u#z-t%AV~g;JJKeu$ty) zCy)w#eRd8BKf*+Z*|U;uH=muW{eyaQrjke+oU2979>?~%kC-}9+ro#mQ}ngmyh!hN z<)rbW@+6wLq=`IF^(E6?6>QY$sb+W526KSLJzi|_m$}#3u05|?mewl7OB)~ins$>}*>Xom zyAs2-33fgdAro{ZMru)FAZpa370`d>B@!2P=D(fsy_s1~Q7x4?Rg1%tR&p=&3p$dY zK?-PmK@v%%j~2`$DRg_m9a2p<7v4u|=r0OgEb)cH`jnrtqMj7C{B*ZcqYyFWckYd` zWf)^0(hbXF$!}=a@&l@i=~8gEi$|cj^unSTVoPL#JZ0EOeeqI-T++`zVI>hc4j{fT zAGT_MpFQyl3m4C4*J%Cblbs=T!coMMgKBHKg6jq{Ict6$QrarvUDfd9Ba{L z&~-;C)}qs(4{ReLYti#9?R|s(=dd&95rb^erFa3y42q7nGdf*o;1qi)Uc@aNa{(dVqMC>s&Y zPJW;TxiOr24Z4)TY1t#v`MbEIj6OE#2WqC;fHeLz&=NlEdPR8^GX(J`K=3N&3;K*? zC3Cu!#hss#zlJ0;x>F}mS~tP8K#JVD30Dl_)=l_QkaRZUKR(Vz99=k;v=PSyHClEj zKdf%X9}Mb9Ucl&_L33QW>J|(wtmA==mc_1ohQp&)SDCUE*9_`*y&kd^wkbU$j#+nLP>{6l#IT|9JF^p| z`D4zVSR+U}n^9$G+}VsR1!K-;Y!f7%Euf58{RUK$RcZ@5eZ*bpH3E5>T}UVzOS20} zf@B(s3`65iir%NkoD}a0lFr@uP*4LB$r^Pxj&rJG81n$FAK3W?}1<8rFVZ)DjoXpvVje=y(c5F8^UcMc@rNT)+sjQy)uIS5O zPY;d=l2JYQt)K=RLzKA(r+u`yah^6+)z)42i9UhbK8_PGmGLSK?5{&Tf#S82hAds` zNvtx+%J%drR2cMYvQhm#yattc;avAreg;TwtQRg;8`?voZ^&)nc zvmMM=_<@;V03$xu0eoXvA0i#<00KSSDbrj6J7Y!M5^`9*ghU^05ce6{vrHSrJRfZc zIfCT#9zu6D+$@cJ;6pf6&6CO!Ui1l)Rz~`J>n<-1ab{sXR^d5zs#l?mo%`kb<`e!l z`}F;X`hI?4+1!tGZ^_vymTJADzc(VJ+xYjLr#;5|F)guSq)-3xwdaUF{;NBF%J~O% M$H+fPOGd!|0qeN 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage"))) { - if (args.Contains("lp") || args.Contains("loadplugins")) loadPluginsOnStartup = true; - if (args.Contains("listplugs")) listPluginsAtStartup = true; + if (args.Contains("lp") || args.Contains("loadplugins")) + loadPluginsOnStartup = true; + if (args.Contains("listplugs")) + listPluginsAtStartup = true; + len = 0; } @@ -188,6 +196,7 @@ public class Program if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) { var b = await StartNoGUI(); + Thread mainThread = new Thread(() => NoGUI(b)); mainThread.Start(); return; From 27bbe899ab83480935be1c41b466a4d5a8af24bb Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 17 Jul 2022 19:29:58 +0300 Subject: [PATCH 19/36] --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 07c8e23..1eedd18 100644 --- a/.gitignore +++ b/.gitignore @@ -363,4 +363,4 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd -ImportDllFromWebsiteDynamically.txt \ No newline at end of file +*.txt \ No newline at end of file From eef13db3aa8c6134af3a57b04109c8650794ed6b Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 17 Jul 2022 19:30:39 +0300 Subject: [PATCH 20/36] --- TODO | 70 ------------------------------------------------------------ 1 file changed, 70 deletions(-) delete mode 100644 TODO diff --git a/TODO b/TODO deleted file mode 100644 index 91e5426..0000000 --- a/TODO +++ /dev/null @@ -1,70 +0,0 @@ -Discord Bot: - ✔ Create bootloader - ✔ Create commands handler - ✔ Create bot launcher - ✔ Enable startup commands - ✔ Enable console input - ☐ Create self update feature - - - -Plugin Manager: - Define plugin interface: - ✔ DBCommand - ✔ DBPlugin - - Functions.cs: - ✔ Read from file - ✔ Read from archive (PAK) - ✔ Write Logs & Errors - ✔ Manipulate settings (files) and strings - ✔ Stream copy async - - Console Utilities: - ✔ Progress bar - ✔ Create table - ✔ Write to console with colors - - Discord Permissions: - ✔ Check if user has permission - ✔ Check if user is owner - - Discord Plugins: - ✔ Create loader for commands - ✔ Create loader for events - ☐ Improve memory efficiency - ☐ Improve performance - ☐ Improve stability - - Language System: - ✔ Create language system - ✔ Load language files - - Server Communication: - ✔ Plugin Download system - ✔ Language Download system - ☐ Move to a new server - ☐ Create plugin versioning system - ☐ Create plugin update system - - - -Plugins: - Events: - ✔ Leveling system - Utilities: - ✔ Random number generator - ✔ Flip a coin - ✔ Poll - - Commands: - ✔ Leveling system - ☐ Music Commands @started - - // Windows only version - // Download as a patch but replaces old DiscordBot executable with a new one - // Adds new dll to support windows forms - // Must act the same as the old version - ☐ Create version of discord bot with windows form - ☐ Download system and patch will result in a windows only based version of bot - ☐ Possibility to reverse patch to get back to original version \ No newline at end of file From 4c9c7410f0892d888bf6f5bab58ad783ede955a9 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sun, 17 Jul 2022 19:31:59 +0300 Subject: [PATCH 21/36] --- DiscordBot/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 94e7cdc..94bac8c 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -238,7 +238,7 @@ public class Program case "--reset-logs": await ClearFolder("./Output/Logs"); await ClearFolder("./Output/Errors"); - Console.WriteLine("Successfully cleard logs folder"); + Console.WriteLine("Successfully clear logs folder"); break; case "--exit": case "exit": From ccac0ca6d0565d9ad223d2185582bf0b811e531c Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Tue, 26 Jul 2022 15:15:13 +0300 Subject: [PATCH 22/36] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 603c14f..062e083 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,10 @@ Plugin Types: 1. Commands 2. Events + ### How to create a plugin From 2c83d00c00d99680568f9260223b1112cc40b9cd Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Tue, 16 Aug 2022 16:12:14 +0300 Subject: [PATCH 23/36] --- Roles/AddRole.cs | 57 ++++++++++++++++++++++ Roles/Internals/RoleManagement.cs | 79 +++++++++++++++++++++++++++++++ Roles/Roles.csproj | 13 +++++ 3 files changed, 149 insertions(+) create mode 100644 Roles/AddRole.cs create mode 100644 Roles/Internals/RoleManagement.cs create mode 100644 Roles/Roles.csproj diff --git a/Roles/AddRole.cs b/Roles/AddRole.cs new file mode 100644 index 0000000..c1ea4b8 --- /dev/null +++ b/Roles/AddRole.cs @@ -0,0 +1,57 @@ +using System.IO.Compression; +using System.Runtime.CompilerServices; +using Discord; +using Discord.Commands; +using Discord.Rest; +using Discord.WebSocket; +using Microsoft.Win32.SafeHandles; +using PluginManager.Interfaces; +using PluginManager.Others; +using Roles.Internals; + +namespace Roles +{ + public class AddRole : DBCommand + { + public string Command => "addrole"; + + public List Aliases => new() { "ar", "addr", "roleadd" }; + + public string Description => "Role options"; + + public string Usage => "addrole [user1] [user2] ... [role1] [role2] ..."; + + public bool canUseDM => false; + + public bool canUseServer => true; + + public bool requireAdmin => true; + + public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + { + if (message.MentionedUsers.Count == 0 || message.MentionedRoles.Count == 0) + { + await context.Channel.SendMessageAsync($"Invalid invocation\nUsage:{Usage}"); + return; + } + + try + { + var users = message.MentionedUsers; + var roles = message.MentionedRoles as IEnumerable; + + foreach (var user in users) + { + SocketGuildUser? usr = context.Client.GetUser(user.Username, user.Discriminator) as SocketGuildUser; + if (usr is null) + throw new Exception("User is null"); + await usr.AddRolesAsync(roles); + } + } + catch (Exception ex) + { + await context.Channel.SendMessageAsync(ex.Message); + } + } + } +} diff --git a/Roles/Internals/RoleManagement.cs b/Roles/Internals/RoleManagement.cs new file mode 100644 index 0000000..edcf616 --- /dev/null +++ b/Roles/Internals/RoleManagement.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord; +using Discord.WebSocket; +using PluginManager.Others; + +namespace Roles.Internals +{ + internal static class RoleManagement + { + internal static async void AddRole(this SocketGuildUser user, string roleName) + { + string role = roleName; + IRole? r = user.Guild.Roles.FirstOrDefault(rl => rl.Name == role || rl.Mention == role); + if (r is null) + throw new Exception("The role does not exist"); + + try + { + await user.AddRoleAsync(r); + } + catch (Exception ex) + { + if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase)) + throw new Exception("Insufficient permissions"); + } + } + + internal static async void AddRole(this SocketGuildUser user, IRole role) + { + try + { + await user.AddRoleAsync(role); + } + catch (Exception ex) + { + if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase)) + throw new Exception("Insufficient permissions"); + } + } + + internal static async void AddRoles(this SocketGuildUser user, string[] roleNames) + { + foreach (string rolename in roleNames) + { + string roleName = rolename; + IRole? r = user.Guild.Roles.FirstOrDefault(rl => rl.Name == roleName || rl.Mention == roleName); + if (r is null) + throw new Exception("The role does not exist"); + + try + { + await user.AddRoleAsync(r); + } + catch (Exception ex) + { + if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase)) + throw new Exception("Insufficient permissions"); + } + } + } + + internal static async void AddRoles(this SocketGuildUser user, IEnumerable roles) + { + try + { + await user.AddRolesAsync(roles); + } + catch (Exception ex) + { + if (ex.Message.Contains("Permission", StringComparison.CurrentCultureIgnoreCase)) + throw new Exception("Insufficient permissions"); + } + } + } +} diff --git a/Roles/Roles.csproj b/Roles/Roles.csproj new file mode 100644 index 0000000..b468d70 --- /dev/null +++ b/Roles/Roles.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + From 1f1983480a66eab056f4b3b57f1b4ac82a3a03f5 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Tue, 16 Aug 2022 16:14:25 +0300 Subject: [PATCH 24/36] --- .idea/.idea.SethDiscordBot/.idea/.gitignore | 13 ++++++ .idea/.idea.SethDiscordBot/.idea/.name | 1 + .../.idea.SethDiscordBot/.idea/encodings.xml | 4 ++ .../.idea/indexLayout.xml | 8 ++++ .idea/.idea.SethDiscordBot/.idea/vcs.xml | 6 +++ BUILDS/net6.0/CMD_Utils.dll | Bin 11776 -> 11776 bytes BUILDS/net6.0/Music Commands.dll | Bin 16896 -> 17408 bytes BUILDS/net6.0/PluginManager.dll | Bin 62464 -> 61440 bytes CMD_LevelingSystem/Level.cs | 2 + CMD_Utils/Echo.cs | 3 ++ CMD_Utils/FlipCoin.cs | 3 ++ CMD_Utils/Poll.cs | 2 + CMD_Utils/Random.cs | 5 +- DiscordBot/Discord/Commands/Help.cs | 29 ++++++++---- DiscordBot/Discord/Commands/Restart.cs | 3 ++ DiscordBot/Discord/Commands/Settings.cs | 3 ++ DiscordBot/Discord/Core/Boot.cs | 4 +- DiscordBot/Discord/Core/CommandHandler.cs | 20 ++++---- DiscordBot/DiscordBot.csproj | 2 +- DiscordBot/Program.cs | 44 ++++++++++++++++-- MusicCommands/Leave.cs | 5 +- MusicCommands/MusicPlayer.cs | 8 ++-- MusicCommands/Pause.cs | 5 +- MusicCommands/Play.cs | 14 +++--- MusicCommands/Skip.cs | 11 +++++ MusicCommands/queue.cs | 3 +- PluginManager/Config.cs | 6 +-- PluginManager/Interfaces/DBCommand.cs | 13 ++++-- PluginManager/Items/Command.cs | 8 ++-- PluginManager/Items/ConsoleCommandsHandler.cs | 10 ++-- PluginManager/Others/Functions.cs | 18 +++---- SethDiscordBot.sln | 7 +++ 32 files changed, 195 insertions(+), 65 deletions(-) create mode 100644 .idea/.idea.SethDiscordBot/.idea/.gitignore create mode 100644 .idea/.idea.SethDiscordBot/.idea/.name create mode 100644 .idea/.idea.SethDiscordBot/.idea/encodings.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/indexLayout.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/vcs.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.gitignore b/.idea/.idea.SethDiscordBot/.idea/.gitignore new file mode 100644 index 0000000..7fa1cfe --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/projectSettingsUpdater.xml +/contentModel.xml +/.idea.SethDiscordBot.iml +/modules.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.name b/.idea/.idea.SethDiscordBot/.idea/.name new file mode 100644 index 0000000..ac07819 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/.name @@ -0,0 +1 @@ +SethDiscordBot \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/encodings.xml b/.idea/.idea.SethDiscordBot/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/vcs.xml b/.idea/.idea.SethDiscordBot/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BUILDS/net6.0/CMD_Utils.dll b/BUILDS/net6.0/CMD_Utils.dll index d30bcd71d4779c6e994310616fcdd889ae9a65ab..d0b729a039747d0f1ffae51636739c94b7c74168 100644 GIT binary patch delta 4321 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 A)Bpeg diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 9671e1e560ed7b03407c632794ef11ad9c774f66..b035aeb7e3099892f01bd3c0b6456627ed99f862 100644 GIT binary patch delta 16591 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 delta 17260 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 U{^Q@WRNF6V|L%LSp@-rB0N*oFk^lez diff --git a/CMD_LevelingSystem/Level.cs b/CMD_LevelingSystem/Level.cs index e11fd3f..ba66498 100644 --- a/CMD_LevelingSystem/Level.cs +++ b/CMD_LevelingSystem/Level.cs @@ -11,6 +11,8 @@ internal class Level : DBCommand { public string Command => "level"; + public List Aliases => new() { "lvl" }; + public string Description => "Display tour current level"; public string Usage => "level"; diff --git a/CMD_Utils/Echo.cs b/CMD_Utils/Echo.cs index 83ec899..68e5ab2 100644 --- a/CMD_Utils/Echo.cs +++ b/CMD_Utils/Echo.cs @@ -1,11 +1,14 @@ using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; +using System.Collections.Generic; internal class Echo : DBCommand { public string Command => "echo"; + public List Aliases => null; + public string Description => "Replay with the same message"; public string Usage => "echo [message]"; diff --git a/CMD_Utils/FlipCoin.cs b/CMD_Utils/FlipCoin.cs index 0057f33..2ec361e 100644 --- a/CMD_Utils/FlipCoin.cs +++ b/CMD_Utils/FlipCoin.cs @@ -1,6 +1,7 @@ using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; +using System.Collections.Generic; namespace CMD_Utils; @@ -8,6 +9,8 @@ internal class FlipCoin : DBCommand { public string Command => "flip"; + public List Aliases => null; + public string Description => "Flip a coin"; public string Usage => "flip"; diff --git a/CMD_Utils/Poll.cs b/CMD_Utils/Poll.cs index c3624c6..3093e8b 100644 --- a/CMD_Utils/Poll.cs +++ b/CMD_Utils/Poll.cs @@ -11,6 +11,8 @@ public class Poll : DBCommand { public string Command => "poll"; + public List Aliases => null; + public string Description => "Create a poll with options"; public string Usage => "poll [This-is-question] [This-is-answer-1] [This-is-answer-2] ... "; diff --git a/CMD_Utils/Random.cs b/CMD_Utils/Random.cs index 7a93e0d..b69fc04 100644 --- a/CMD_Utils/Random.cs +++ b/CMD_Utils/Random.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -6,6 +7,8 @@ public class Random : DBCommand { public string Command => "random"; + public List Aliases => new() { "rnd" }; + public string Description => "random number between number1 and number2"; public string Usage => "random [number1] [number2]"; diff --git a/DiscordBot/Discord/Commands/Help.cs b/DiscordBot/Discord/Commands/Help.cs index 11fb0f9..570dd05 100644 --- a/DiscordBot/Discord/Commands/Help.cs +++ b/DiscordBot/Discord/Commands/Help.cs @@ -1,4 +1,6 @@ -using Discord; +using System.Collections.Generic; +using System.Linq; +using Discord; using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -17,15 +19,17 @@ internal class Help : DBCommand /// public string Command => "help"; + public List Aliases => null; + /// /// Command Description /// - public string Description => "This command allows you to check all loadded commands"; + public string Description => "This command allows you to check all loaded commands"; /// /// Command usage /// - public string Usage => "help"; + public string Usage => "help "; /// /// Check if the command can be used /> @@ -57,10 +61,10 @@ internal class Help : DBCommand foreach (var item in args) { var e = GenerateHelpCommand(item); - if (e != null) - context.Channel.SendMessageAsync(embed: e.Build()); - else + if (e is null) context.Channel.SendMessageAsync("Unknown Command " + item); + else + context.Channel.SendMessageAsync(embed: e.Build()); } return; @@ -74,10 +78,12 @@ internal class Help : DBCommand foreach (var cmd in PluginLoader.Commands!) { - if (cmd.canUseDM) DMCommands += cmd.Command + " "; + if (cmd.canUseDM) + DMCommands += cmd.Command + " "; if (cmd.requireAdmin) - adminCommands += cmd.Command + " "; - else if (cmd.canUseServer) normalCommands += cmd.Command + " "; + adminCommands += cmd.Command + " "; + if (cmd.canUseServer) + normalCommands += cmd.Command + " "; } embedBuilder.AddField("Admin Commands", adminCommands); @@ -89,11 +95,14 @@ internal class Help : DBCommand private EmbedBuilder GenerateHelpCommand(string command) { var embedBuilder = new EmbedBuilder(); - var cmd = PluginLoader.Commands.Find(p => p.Command == command); + var cmd = PluginLoader.Commands!.Find(p => p.Command == command || (p.Aliases is not null && p.Aliases.Contains(command))); if (cmd == null) return null; embedBuilder.AddField("Usage", cmd.Usage); embedBuilder.AddField("Description", cmd.Description); + if (cmd.Aliases is null) + return embedBuilder; + embedBuilder.AddField("Alias", cmd.Aliases.Count == 0 ? "-" : string.Join(", ", cmd.Aliases)); return embedBuilder; } diff --git a/DiscordBot/Discord/Commands/Restart.cs b/DiscordBot/Discord/Commands/Restart.cs index a567783..d9a7019 100644 --- a/DiscordBot/Discord/Commands/Restart.cs +++ b/DiscordBot/Discord/Commands/Restart.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using Discord.WebSocket; using PluginManager.Interfaces; @@ -17,6 +18,8 @@ internal class Restart : DBCommand /// public string Command => "restart"; + public List Aliases => null; + /// /// Command Description /// diff --git a/DiscordBot/Discord/Commands/Settings.cs b/DiscordBot/Discord/Commands/Settings.cs index 044a2fd..866a91f 100644 --- a/DiscordBot/Discord/Commands/Settings.cs +++ b/DiscordBot/Discord/Commands/Settings.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Discord; using Discord.Commands; using Discord.WebSocket; @@ -14,6 +15,8 @@ internal class Settings : DBCommand /// public string Command => "set"; + public List Aliases => null; + /// /// Command Description /// diff --git a/DiscordBot/Discord/Core/Boot.cs b/DiscordBot/Discord/Core/Boot.cs index 2c6e9f7..e32a198 100644 --- a/DiscordBot/Discord/Core/Boot.cs +++ b/DiscordBot/Discord/Core/Boot.cs @@ -60,7 +60,9 @@ internal class Boot /// Task public async Task Awake() { - client = new DiscordSocketClient(); + DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true }; + + client = new DiscordSocketClient(config); service = new CommandService(); CommonTasks(); diff --git a/DiscordBot/Discord/Core/CommandHandler.cs b/DiscordBot/Discord/Core/CommandHandler.cs index 3a87dbc..c89d84b 100644 --- a/DiscordBot/Discord/Core/CommandHandler.cs +++ b/DiscordBot/Discord/Core/CommandHandler.cs @@ -47,13 +47,16 @@ internal class CommandHandler { try { - if (Message as SocketUserMessage == null) return; + if (Message as SocketUserMessage == null) + return; var message = Message as SocketUserMessage; - if (message == null) return; + if (message == null) + return; - if (!message.Content.StartsWith(botPrefix)) return; + if (!message.Content.StartsWith(botPrefix)) + return; var argPos = 0; @@ -63,17 +66,14 @@ internal class CommandHandler return; } - if (message.Author.IsBot) return; + if (message.Author.IsBot) + return; var context = new SocketCommandContext(client, message); - await commandService.ExecuteAsync( - context, - argPos, - null - ); + await commandService.ExecuteAsync(context, argPos, null); - var plugin = PluginLoader.Commands!.Where(p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length)).FirstOrDefault(); + var plugin = PluginLoader.Commands!.Where(p => p.Command == message.Content.Split(' ')[0].Substring(botPrefix.Length) || (p.Aliases is not null && p.Aliases.Contains(message.Content.Split(' ')[0].Substring(botPrefix.Length)))).FirstOrDefault(); if (plugin != null) diff --git a/DiscordBot/DiscordBot.csproj b/DiscordBot/DiscordBot.csproj index da11f94..fdfaf9e 100644 --- a/DiscordBot/DiscordBot.csproj +++ b/DiscordBot/DiscordBot.csproj @@ -8,7 +8,7 @@ False True - 1.0.0.1 + 1.0.0.2 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 94bac8c..7a72639 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -34,6 +34,38 @@ public class Program Directory.CreateDirectory("./Data/Plugins/Events"); PreLoadComponents().Wait(); + if (!Config.ContainsKey("ServerID")) + { + do + { + Console.Clear(); + Console.WriteLine("Please enter the server ID: "); + Console_Utilities.WriteColorText("You can find it in the Server Settings at &r\"Widget\"&c section"); + Console.WriteLine("Example: 1234567890123456789"); + + Console.WriteLine("This is not required, but is recommended. If you refuse to provide the ID, just press enter.\nThe server id is required to make easier for the bot to interact with the server.\nRemember: this bot is for one server ONLY."); + Console.Write("User Input > "); + ConsoleKeyInfo key = Console.ReadKey(); + if (key.Key == ConsoleKey.Enter) + Config.AddValueToVariables("ServerID", "null", false); + else + { + string SID = key.KeyChar + Console.ReadLine(); + if (SID.Length != 18) + { + Console.WriteLine("Your server ID is not 18 characters long. Please try again."); + continue; + } + + + Config.AddValueToVariables("ServerID", SID, false); + + } + break; + } while (true); + + } + if (!Config.ContainsKey("token") || Config.GetValue("token") == null || Config.GetValue("token")?.Length != 70) { Console.WriteLine("Please insert your token"); @@ -75,9 +107,13 @@ public class Program private static void NoGUI(Boot discordbooter) { var consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client); +#if DEBUG + Console.WriteLine(); + consoleCommandsHandler.HandleCommand("lp"); +#else if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); - +#endif Config.SaveConfig(); while (true) @@ -264,9 +300,9 @@ public class Program Config.PluginConfig.Load(); if (!Config.ContainsKey("Version")) - Config.AddValueToVariables("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), false); + Config.AddValueToVariables("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString(), false); else - Config.SetValue("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); + Config.SetValue("Version", Assembly.GetExecutingAssembly().GetName().Version.ToString()); foreach (var key in OnlineDefaultKeys) { @@ -311,7 +347,7 @@ public class Program Console.WriteLine("\n\n"); await Task.Delay(1000); - int waitTime = 20; //wait time to proceed + int waitTime = 10; //wait time to proceed Console.Write($"The bot will start in {waitTime} seconds"); while (waitTime > 0) diff --git a/MusicCommands/Leave.cs b/MusicCommands/Leave.cs index 3ee6975..79979e8 100644 --- a/MusicCommands/Leave.cs +++ b/MusicCommands/Leave.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -8,6 +9,8 @@ internal class Leave : DBCommand { public string Command => "leave"; + public List Aliases => null; + public string Description => "Leave the voice channel"; public string Usage => "leave"; diff --git a/MusicCommands/MusicPlayer.cs b/MusicCommands/MusicPlayer.cs index 5b5ae17..e1c974a 100644 --- a/MusicCommands/MusicPlayer.cs +++ b/MusicCommands/MusicPlayer.cs @@ -5,7 +5,8 @@ namespace MusicCommands; internal class MusicPlayer { - private Stream outputStream { get; } + private Stream outputStream { get; } + internal AudioFile NowPlaying = null; internal bool isPlaying, isPaused; @@ -14,9 +15,10 @@ internal class MusicPlayer outputStream = outputChannel; } - public async Task Play(Stream source, int byteSize) + public async Task Play(Stream source, int byteSize, AudioFile songPlaying) { - isPlaying = true; + isPlaying = true; + NowPlaying = songPlaying; while (isPlaying) { if (isPaused) diff --git a/MusicCommands/Pause.cs b/MusicCommands/Pause.cs index 5b16b37..065a02a 100644 --- a/MusicCommands/Pause.cs +++ b/MusicCommands/Pause.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; using PluginManager.Interfaces; @@ -8,6 +9,8 @@ internal class Pause : DBCommand { public string Command => "pause"; + public List Aliases => null; + public string Description => "Pause/Unpause the music that is currently running"; public string Usage => "pause"; diff --git a/MusicCommands/Play.cs b/MusicCommands/Play.cs index 68333b9..9b46e7f 100644 --- a/MusicCommands/Play.cs +++ b/MusicCommands/Play.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using Discord; @@ -14,6 +15,8 @@ internal class Play : DBCommand { public string Command => "play"; + public List Aliases => new() { "p" }; + public string Description => "Play music from a file"; public string Usage => "play [name/url]"; @@ -69,11 +72,11 @@ internal class Play : DBCommand if (Data.MusicPlayer is not null) { - await context.Channel.SendMessageAsync("Enqueued your request"); + await context.Channel.SendMessageAsync("Queued your request: " + splitted.MergeStrings(1)); return; } } - while (false); + while (false); // run only one time ! Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; @@ -93,15 +96,14 @@ internal class Play : DBCommand using (var discordChanneAudioOutStream = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) { - if (Data.MusicPlayer is null) - Data.MusicPlayer = new MusicPlayer(discordChanneAudioOutStream); + Data.MusicPlayer ??= new MusicPlayer(discordChanneAudioOutStream); while (Data.Playlist.Count > 0) { var nowPlaying = Data.Playlist.GetNextSong; using (var ffmpeg = CreateStream(nowPlaying.Name)) using (var ffmpegOutputBaseStream = ffmpeg.StandardOutput.BaseStream) { - await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024); + await Data.MusicPlayer.Play(ffmpegOutputBaseStream, 1024, nowPlaying); Console.WriteLine("Finished playing from " + nowPlaying.Url); } } @@ -110,7 +112,7 @@ internal class Play : DBCommand } } - private Process CreateStream(string path) + private static Process CreateStream(string path) { return Process.Start(new ProcessStartInfo { FileName = "ffmpeg", Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", UseShellExecute = false, RedirectStandardOutput = true }); } diff --git a/MusicCommands/Skip.cs b/MusicCommands/Skip.cs index 583363c..0ca23b3 100644 --- a/MusicCommands/Skip.cs +++ b/MusicCommands/Skip.cs @@ -13,6 +13,8 @@ namespace MusicCommands { public string Command => "skip"; + public List Aliases => null; + public string Description => "skip the music that is currently running"; public string Usage => "skip"; @@ -25,7 +27,16 @@ namespace MusicCommands public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) { + var loadedSong = Data.MusicPlayer.NowPlaying; + + if (loadedSong is null || Data.MusicPlayer.isPlaying == false) + { + message.Channel.SendMessageAsync("There is no music playing"); + return; + } + Data.MusicPlayer.isPlaying = false; + message.Channel.SendMessageAsync($"You have skipped {loadedSong.Name}"); } } } diff --git a/MusicCommands/queue.cs b/MusicCommands/queue.cs index a6c762d..d918f30 100644 --- a/MusicCommands/queue.cs +++ b/MusicCommands/queue.cs @@ -11,7 +11,8 @@ namespace MusicCommands { public class queue : DBCommand { - public string Command => "queue"; + public string Command => "queue"; + public List Aliases => new() { "q" }; public string Description => "check queue"; diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index f20434a..644b085 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -67,9 +67,9 @@ namespace PluginManager public static PluginType GetPluginType(string pluginName) { foreach (var tuple in InstalledPlugins) - { - if (tuple.Item1 == pluginName) return tuple.Item2; - } + if (tuple.Item1 == pluginName) + return tuple.Item2; + return PluginType.Unknown; } diff --git a/PluginManager/Interfaces/DBCommand.cs b/PluginManager/Interfaces/DBCommand.cs index 4095427..7dc759d 100644 --- a/PluginManager/Interfaces/DBCommand.cs +++ b/PluginManager/Interfaces/DBCommand.cs @@ -1,4 +1,5 @@ -using Discord.Commands; +using System.Collections.Generic; +using Discord.Commands; using Discord.WebSocket; namespace PluginManager.Interfaces; @@ -11,6 +12,11 @@ public interface DBCommand /// string Command { get; } + /// + /// Command aliases. Users may use this to execute the command + /// + List? Aliases { get; } + /// /// Command description /// @@ -44,8 +50,5 @@ public interface DBCommand /// The message that the user types /// The discord client of the bot /// true if the message was sent from DM, otherwise false. It is always false if canUseDM is false - void Execute(SocketCommandContext context, - SocketMessage message, - DiscordSocketClient client, - bool isDM); + void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM); } diff --git a/PluginManager/Items/Command.cs b/PluginManager/Items/Command.cs index 22cd36a..d6b4ded 100644 --- a/PluginManager/Items/Command.cs +++ b/PluginManager/Items/Command.cs @@ -44,8 +44,8 @@ public class Command public class ConsoleCommand { - public string CommandName { get; set; } - public string Description { get; set; } - public string Usage { get; set; } - public Action Action { get; set; } + public string CommandName { get; init; } + public string Description { get; init; } + public string Usage { get; init; } + public Action Action { get; init; } } \ No newline at end of file diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 351d295..bf08bae 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -233,15 +233,15 @@ public class ConsoleCommandsHandler } ); - AddCommand("sd", "Shuts down the discord bot", async () => + AddCommand("sd", "Shuts down the discord bot", () => { if (client is null) return; - await client.StopAsync(); - await client.DisposeAsync(); + client.StopAsync(); + client.DisposeAsync(); Config.SaveConfig(); Console.WriteLine("Bot is closing in 2 seconds ! Please wait to save data !"); - await Task.Delay(2000); + Thread.Sleep(2000); Environment.Exit(0); } ); @@ -268,7 +268,7 @@ public class ConsoleCommandsHandler public static bool CommandExists(string command) { - return !(GetCommand(command) is null); + return GetCommand(command) is not null; } public static ConsoleCommand? GetCommand(string command) diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 360b7c8..35d29c5 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -57,7 +57,7 @@ namespace PluginManager.Others if (!File.Exists(archFile)) throw new FileNotFoundException("Failed to load file !"); using ZipArchive archive = ZipFile.OpenRead(archFile); - ZipArchiveEntry? entry = archive.GetEntry(FileName); + ZipArchiveEntry? entry = archive.GetEntry(FileName); return entry?.Open(); } @@ -91,8 +91,8 @@ namespace PluginManager.Others /// A string built based on the array public static string MergeStrings(this string[] s, int indexToStart) { - string r = ""; - int len = s.Length; + string r = ""; + int len = s.Length; if (len <= indexToStart) return ""; for (int i = indexToStart; i < len - 1; ++i) { @@ -142,9 +142,9 @@ namespace PluginManager.Others if (!stream.CanRead) throw new InvalidOperationException("The stream is not readable."); if (!destination.CanWrite) throw new ArgumentException("Destination stream is not writable", nameof(destination)); - byte[] buffer = new byte[bufferSize]; - long totalBytesRead = 0; - int bytesRead; + byte[] buffer = new byte[bufferSize]; + long totalBytesRead = 0; + int bytesRead; while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) { await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); @@ -171,11 +171,11 @@ namespace PluginManager.Others { if (type == UnzipProgressType.PercentageFromNumberOfFiles) { - int totalZIPFiles = archive.Entries.Count(); + int totalZIPFiles = archive.Entries.Count(); int currentZIPFile = 0; foreach (ZipArchiveEntry entry in archive.Entries) { - if (entry.FullName.EndsWith("/")) + if (entry.FullName.EndsWith("/")) // it is a folder Directory.CreateDirectory(Path.Combine(folder, entry.FullName)); else @@ -335,7 +335,7 @@ namespace PluginManager.Others using (MD5 md5 = MD5.Create()) { byte[] inputBytes = Encoding.ASCII.GetBytes(input); - byte[] hashBytes = md5.ComputeHash(inputBytes); + byte[] hashBytes = md5.ComputeHash(inputBytes); return Convert.ToHexString(hashBytes); } } diff --git a/SethDiscordBot.sln b/SethDiscordBot.sln index bccffb6..9fa99c8 100644 --- a/SethDiscordBot.sln +++ b/SethDiscordBot.sln @@ -21,6 +21,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EVE_LevelingSystem", "EVE_L EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_LevelingSystem", "CMD_LevelingSystem\CMD_LevelingSystem.csproj", "{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roles", "Roles\Roles.csproj", "{954F2AA9-6624-4554-946D-0F17B84487C3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +53,10 @@ Global {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Debug|Any CPU.Build.0 = Debug|Any CPU {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}.Release|Any CPU.Build.0 = Release|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {954F2AA9-6624-4554-946D-0F17B84487C3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -62,6 +68,7 @@ Global {B1B4976E-5112-4217-B57B-3A03C5207B6E} = {449FA364-0B72-43FF-B3A3-806E2916200E} {EEC445DC-0C4B-43EA-8694-606BA0390B77} = {A290C028-77C4-4D1D-AB43-DDFE6ABD9012} {1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9} = {449FA364-0B72-43FF-B3A3-806E2916200E} + {954F2AA9-6624-4554-946D-0F17B84487C3} = {449FA364-0B72-43FF-B3A3-806E2916200E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF} From 5ab31959561129aca5de3c8bf07d16787c782ce4 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Tue, 16 Aug 2022 23:08:56 +0300 Subject: [PATCH 25/36] --- BUILDS/net6.0/PluginManager.dll | Bin 61440 -> 72192 bytes .../Plugins/Commands/CMD_LevelingSystem.dll | Bin 10240 -> 10240 bytes BUILDS/net6.0/Plugins/Commands/CMD_Utils.dll | Bin 11776 -> 11776 bytes .../Plugins/Commands/Music Commands.dll | Bin 16896 -> 17408 bytes BUILDS/net6.0/Plugins/Commands/Roles.dll | Bin 0 -> 12800 bytes .../Plugins/Events/EVE_LevelingSystem.dll | Bin 12800 -> 12800 bytes DiscordBot/Program.cs | 22 +++-- .../DiscordBotConsoleLauncher.csproj | 14 ++++ DiscordBotConsoleLauncher/Program.cs | 21 +++++ PluginManager/Config.cs | 33 ++++++-- PluginManager/Items/ConsoleCommandsHandler.cs | 48 +++++++++-- PluginManager/Loaders/Loader.cs | 42 +++++----- PluginManager/Loaders/PluginLoader.cs | 50 +++++++++--- PluginManager/Online/Helpers/VersionString.cs | 77 ++++++++++++++++++ PluginManager/Online/Updates/PluginUpdater.cs | 50 ++++++++++++ PluginManager/Online/Updates/Update.cs | 36 ++++++++ PluginManager/Others/Functions.cs | 4 +- SethDiscordBot.sln | 2 +- 18 files changed, 341 insertions(+), 58 deletions(-) create mode 100644 BUILDS/net6.0/Plugins/Commands/Roles.dll create mode 100644 DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj create mode 100644 DiscordBotConsoleLauncher/Program.cs create mode 100644 PluginManager/Online/Helpers/VersionString.cs create mode 100644 PluginManager/Online/Updates/PluginUpdater.cs create mode 100644 PluginManager/Online/Updates/Update.cs diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index b035aeb7e3099892f01bd3c0b6456627ed99f862..030162ff854595754c73f6ff7c17a4b3da5bd9ac 100644 GIT binary patch literal 72192 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 YL;1h^4|ae*IJ1L{@{fQ2-%;Ry1J_rpHUIzs literal 61440 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

nN>Z9W{Ro_Cxi8C9TN7zq*Pb1x8 zY`?LO>e(LSARQ)4eU0X_n{zR1Ry6wAM)d zZP_uC17&QXdm`&+kLh*nHqBzQ*m1VrJrD9aZ4oe=FGDBU+7rNAxRy$BL7irmG=#?U zN?cNp0)u2VqbjBqz>)NG;5e*BB~7H?0;kd+fU~8(2{@G=r=beob-?K|T#MASkWHr2 zD&pR#FNs;Iwi?vNr=lpTsTFfTqxx_ zDaWL|Ov)`%?v=P(YWk&oQp%@rw+EHWQYJ;jj7Y4LxJ+V7B0cGP9_B}AuDqo+WV((W z!Uq-icwOKvRp551pP&{(evwLnMS2DBs9Fj99gPLHXk+bR zzH(~_4a0%-;uJARe#ky#f;d%~kWIYc8KeN@0A)kY0&ic5`>KDK@L(FatLVP zy;T6Lqe7~rZFGq~p+Z){Tq$wT2OoU3(gmD-@!fFuX=ghzzz5vG&PbOB{p!SL3T_e| zUEh7qeuXZEo8~|LK9o&D23C0t%|ViHq{+048c1bxDa0D6irM4+BLZ{UlAX({sVULA zGTu3Tb!S^=_p)lc$6w-|G<|)%wW~8eW%<&j)iw5R|C2S{$vU_zat%!FntzS;DS2F!Zq6{<{f>CBAaQ^4P?S24zX`Q-9IQ>=Ro?r#hDS21&~8Ig5}r>UdtvabZQ zv>jT&O#RgUGFWEqFO7IW4x)vZo2kQQ>X&BfxS2X(rcQ;;)LSTr{i(CM<6}ffM9L&B z9Z-o7_f&B%#^B3m9*@(V85!bZOg73VuNYm(2@y)S45eMi!+@zom|?i_H`8PG7>1!o z6tl-0!V7}@sf&7qnLVi02w^O8O}gwqhRWu5E1J0&WeG|P*Ep)-C?S*{mu9AVb!U)H z9ZG-3qBEw7Fkw~4Y{aU1A}(ewHkX(!c71q^u1BTX{!Vx{n{1yB*SL+!$EMGZjIXS+ zZ-wKm#%|8<8vD_uOV1H&XcP&!4&^%jUa#W^@9rax2R_sZ|7X;Uzu4x8trZmcg3pFx zzdF}CbNA6B`{wNLJ8wT+&^Fpp?z`+L5!+Z;eYv~nsW1O>Ep{#Epz{|jV!v&lF9`DE aQwDAnEM)`UqAwKw!IS}i*(a>8O8+++34;Ov delta 3747 zcmb_feNa@_6+idBeIKl_?ml4oTHx{N3W$gjbtDYLj}|47jVND9G zO5Te0aO;NP%ojcJhwzz~EmJA`d0j~R9k zAw3CCAtNPWLsOE&vEX9%aoA$DhMMR{s?cG&Xtk?D*XTDA=PC2_sk9f}*XXxOk*d*< z>msmH;+=>hh+mQ}iJelTDk8)M*GX9G41ty+a06sF-DZ!&dW;LrZt3|Gr16kHZW*we zhYb&%Fv5mL+qj7H3r%1;b?7FQ@f*;8qKdZP(IOqXpF&y!*XVtz8bctBKI8(|O8M{T zgq!lz0nI~~H4!>UBJ?8Z|8;(dJk+8JO(KmV+7(LRehL}_Qza&IA%7(0H<8Ov2lWK* zCXX>UV)*Gch(=3D^r%(hK8#XK<+B1X)tFf3rCa=zUNOPyFmA!HK(Ot>WLH3T!QV@L z>M^wj%cjEarH`~2OOWiEWEvJzLA%IYG^oK&%cMd&s<*O2%2GEnMonxpu#2?;XRv31 ze`KA&KGqFf%%Z@zfEs*G!*hKq* zp@>w))9WCs=uK8{p+EFOYB{E#QNslL73|>&HUjqD2_|eWOZL||#{1B&-(h!E!3G>w zC~b!vwwJEK7J0*=@w%Wx4*NhA>`08U%dYp4LdzjMv975!HO7q92&z(w!=B_`Fw0@2 zp2gUM4x6f;1DoZr2+%7)Ki&c9d>0H+4AdBuv-B^zT2 zaT@N3GX?Ol)Tk4fO#Q$N8kCw55?vo5(PhSjj}I7`h9f7) zRXWXQ1FstMs7GpY*iBa}or2sBT&8;IC}rx;VZ5WX9hxMz6S!9Eqxo#T@ha7@HO3$v zrUvzOs%5{UpW=uy{Q?EZ#jYXpb@~V7!^U>%WggAN@`W`*CDL3X4L4=tI}ZBdX0m=3 z)aS69l+UWzQ8qhn3FLaM4tSG2%C6E)bro@eF7&giz^A1?QFTH70U5w?EgraA^#R|dWZ(iV*{=0YizLugB=7(^iVw0E$Wam@ zn?R23m<%}?KaSUZ3gi_0IHlr@F_bjO>68IE13!Z*@j+lv73ENr&eA1HW|_6`|%0E$xdpwYRo+HqN5T#oume?r3kRTEA}HtaAI5FW(;bJz;M# zQ-=G^6Po?aw5NtIrj_E7oboia;Emd1XJ-7(JLg<@(~jR4)xGLFe(vYj)}F9a16E6| zYB6RuX+U4}d6&*i3)hpcLoZ{Dd9%pnh9*yU8{F5D>}zG_M$?jYfXAq#d`9y!mPH=L z%{;2bnPI3FnbEykvKj5S4+jb(uN7Eski!V!;bwHmj2<+-@hoX-z?9*$C-HcLPp{K&)jT=K25(7@LKj#o=#5 zr`c&3hHfclrze0*n0(Rmy2Z>+)UxM8a$=sbw`CSC>rgavB}xOz8m@6vNhkr7PLyul z>7!Ez@JhmiTuc>FGF7+bV&+P-!CYhC&75ghWG!VCb~I}aBl|>F3oEztvOE0L)i?VR zv4`u$wh*5|`S_ccZx3asX!{`T%eGHv=X#f3d2h7#%45r)-~N}EKluLsMteNFwcJte zx~CM8DmHd)`Ch@>R>5>&?y+^5nWcB9w`KJ#K|IAv)?0;JC4tsJxS9ogGu&?k2 I>n+p&4YiSi(EtDd diff --git a/BUILDS/net6.0/Plugins/Commands/CMD_Utils.dll b/BUILDS/net6.0/Plugins/Commands/CMD_Utils.dll index d30bcd71d4779c6e994310616fcdd889ae9a65ab..d0b729a039747d0f1ffae51636739c94b7c74168 100644 GIT binary patch delta 4321 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 A)Bpeg diff --git a/BUILDS/net6.0/Plugins/Commands/Roles.dll b/BUILDS/net6.0/Plugins/Commands/Roles.dll new file mode 100644 index 0000000000000000000000000000000000000000..d278f8c9f88132663c58f291f79f20bdf07bf117 GIT binary patch literal 12800 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 DxwWP3 literal 0 HcmV?d00001 diff --git a/BUILDS/net6.0/Plugins/Events/EVE_LevelingSystem.dll b/BUILDS/net6.0/Plugins/Events/EVE_LevelingSystem.dll index 0a08495a730afdd746537bfb4ee6fce4a9134220..8d1dbfcc6ed8a86e78991a132ee7bc3fd3af3065 100644 GIT binary patch delta 2008 zcmY*ae@v8R9RGfw_r3StyWIUzVT z7E_n!^GCWeWv#5l&2?^Vr5kLTPM7GGmW|wzZcUwI)72kYuJ7~ZB7L^!^M1ac@6YGC z_xAQ~?A^HkeLdf~=wftl7JeK3ay4#}hy|9;r2wmBt_aArSb#$^f<4m?EdyTU0s$5n zEdn^04S+J@55?+5z{KBVw>@*|WeS)x9|=1i0&Mjy2C(OM3@BPnH2pC;tbtS(IKbnx z1Nfn17XBZRWCl{@8M{|^+RFCG+xF*r+`3Eml~aCkwMd_7@Ad%bB319sQct%eNmcvxZ#Cu)<#p?#OFbW_scA)8BALonP&t})w;GkZYn1A9613A{?QX+m_-ZCv zmUt$68r@XqiJk`aOy-{b+*5hohCJi&Xojy={^TgGdy$H?FIU}eX1c9n#^Z_cdFE8B zuZ}%apVoaVlv)H(NyDpUr9DX38j}r4A*`4ENqN{H2a^H|PB{R)?*in|(dQ`M*xAvx z<+ZTNT0<9gma@D}jgU1BAcZvVlBQ*g=oujUO_}B_$A(ywGm03Lzb6m(06R z$m<1Fp$%3N?qm$XOT;^2Jz+nzwmy;k2Jz4A?UTtRpau#-D<_0W51T7ReGVN4`ZB&U zX#`k1X+>MJYX^1vW#vzKIu}5%A#tOQN`=XNh z2IkGodznW>COGt?%m-K>VjgGA(Nu1(rm9siuVlV~c{B4~=0_O^G*xX#dtRjtvpdcX z(3R4wOTsu~5USy2SP!qlQ8F4J>-c#OW0x~#IPC3PI-A?Jglji#kKOZL!<2mozZj{Ud$!_}tNJTT|H(ccyE5|x z8ZN783K5GGY(-okANWdbX0UGYs+`%ul2}2Z6H5U`8;?oA<@Gc(Y@>aFzK<99|D;Bu z4-RcN?E=~h>8rBPFI$W9QtB64&R^d)x90fG8#G=g!k!ri!b6zEAsr{f`69SaA$v8$!tp5T*kDERK delta 1893 zcmY+FZERCz6vxkb?rnSfGS;&X0C6S?5+RBmd?2tGjPL=MI6cpypxmUt`#=Bl zob#M}Z*QAyOSbiWq(8oQ^z+ogLfoD@wHo~raki;)F~BP67ZJGzXJeP_!Nj!YCBO%z zK!6FpECuK)0zf%j7EL#bh=J#2w{3dx6fIcbL1M>4fGweV09&wQfF#G>kPV;=M`xFCX(5NI{B=T2uuCN!a;rVx zCPFn-N}Kk|l-<3C2DG_#mmZ>lZRPdC`?O)6-c9rV*HNdAQ@G=P?x>P(U8sxFCp`v0 zf$%)7rFKi@q`iE312x^eOzn4Ty4xgXPCglyXUsE&mUCw6^L}WBa!VmbGpoZwpAYE< z9h5sAQCum{I*PGTUUNjM2JHZW4*&}3N+U`)ZR==%@10InwV3Y8w^S8qZUV%72#>RAaP71MD=H?D3W{4oXW-bwzDzPyX&K$UP=BsPS`^;j;EiZ(g|U6QRQn_9T35IVtE%n~mx4IF_dyKFYTp~#bsZkqdr9g4EixY-1D z2xcQIUKS3h$VNUKr6`(>q~)^6f$D7Zg=JJ$xmFjgrKoH% zT{*&9Xdl8>TwxuNqf-NkNwne{md}XWZ3wU8h{Z{pl$*Pt1YEFFRM0r%L^u3FEP%g= z0q|)R^g{WGb73{{W!Oxth4+aKu#ecp{yJhU#Hm9qeUZmSJ@<^W6IV_`#9s~JFr8RT)6Hp9miE6B2&JOd+40OT~Ed#q~gE98U*uTT;@9_FNd>Me9 za6to9D-qRL2}HG-hN`uOsc?3Ruz!hlhB-@9wSG<2*07GTZeiWZ zI?4Jtb3jwwE@=r>Hq7Y^CqP$DQkTRGvjSd$wXgx+g5z)o?esDrm_Y*rbg=SIQiJxR z0BE-;&a+-8E@Eeq`6lTbaEsV!+$KISt85|OB@SBd3L!Un51Ve{ZG0sE@dnT%1HP4E zj~KP8ud!Jndw9eQP08mx+3#z}KLpq5(SMJJ;VQ1<^F0JePxxlq(=)Tmp9UYu$?}8=wD%v zJXGp6Pmr1@m8VOKox$q9r9;pcJ6iMj+Kv4yAIV=z+h5F@W7o1Kbz189+cp3C=<8!A rg6<7V=x^oe5m$Ov%Ab$T^5e3k?3+`Uo)VeR#EymOyvhfds "); ConsoleKeyInfo key = Console.ReadKey(); @@ -57,15 +61,15 @@ public class Program continue; } - + Config.AddValueToVariables("ServerID", SID, false); - + } break; } while (true); } - + if (!Config.ContainsKey("token") || Config.GetValue("token") == null || Config.GetValue("token")?.Length != 70) { Console.WriteLine("Please insert your token"); @@ -121,12 +125,12 @@ public class Program Console.ForegroundColor = ConsoleColor.White; #if DEBUG - Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); + //Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); var cmd = Console.ReadLine(); if (!consoleCommandsHandler.HandleCommand(cmd!, false) && cmd.Length > 0) Console.WriteLine("Failed to run command " + cmd); #else - Console_Utilities.WriteColorText("&rSethBot &c> ", false); + //Console_Utilities.WriteColorText("&rSethBot &c> ", false); var cmd = Console.ReadLine(); if (!consoleCommandsHandler.HandleCommand(cmd!) && cmd.Length > 0) Console.WriteLine("Failed to run command " + cmd); @@ -189,7 +193,7 @@ public class Program /// Directory path private static Task ClearFolder(string d) { - var files = Directory.GetFiles(d); + var files = Directory.GetFiles(d); var fileNumb = files.Length; for (var i = 0; i < fileNumb; i++) { @@ -210,7 +214,7 @@ public class Program if (len == 3 && args[0] == "/download") { - var url = args[1]; + var url = args[1]; var location = args[2]; await ServerCom.DownloadFileAsync(url, location); @@ -231,7 +235,7 @@ public class Program if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) { - var b = await StartNoGUI(); + var b = await StartNoGUI(); Thread mainThread = new Thread(() => NoGUI(b)); mainThread.Start(); diff --git a/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj b/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj new file mode 100644 index 0000000..396c1aa --- /dev/null +++ b/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj @@ -0,0 +1,14 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + diff --git a/DiscordBotConsoleLauncher/Program.cs b/DiscordBotConsoleLauncher/Program.cs new file mode 100644 index 0000000..47b010d --- /dev/null +++ b/DiscordBotConsoleLauncher/Program.cs @@ -0,0 +1,21 @@ +using PluginManager.Online.Updates; + +try +{ + bool requireUpdate = await PluginUpdater.CheckForUpdates("DiscordBotConsoleLauncher"); + if (requireUpdate) + { + var update = await PluginUpdater.DownloadUpdateInfo("DiscordBotConsoleLauncher"); + if (update == Update.Empty) + return; + + Console.WriteLine("Found an update: "); + Console.WriteLine(update.ToString()); + } +} +catch (Exception ex) +{ + Console.WriteLine("An exception was thrown. "); + Console.WriteLine(ex.Message); + Environment.Exit(-2); +} \ No newline at end of file diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 644b085..1e135ab 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -12,7 +12,9 @@ namespace PluginManager internal class AppConfig { public Dictionary? ApplicationVariables { get; init; } - public List? ProtectedKeyWords { get; init; } + public List? ProtectedKeyWords { get; init; } + + public Dictionary PluginVersions { get; init; } } public static class Config @@ -29,27 +31,27 @@ namespace PluginManager private static void LoadCommands() { - string cmd_path = "./Data/Plugins/Commands/"; - string[] files = Directory.GetFiles(cmd_path, $"*.{Loaders.PluginLoader.pluginCMDExtension}", SearchOption.AllDirectories); + string cmd_path = "./Data/Plugins/Commands/"; + string[] files = Directory.GetFiles(cmd_path, $"*.{Loaders.PluginLoader.pluginCMDExtension}", SearchOption.AllDirectories); foreach (var file in files) if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) { string PluginName = new FileInfo(file).Name; - string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginCMDExtension.Length); + string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginCMDExtension.Length); InstalledPlugins.Add(new(name, PluginType.Command)); } } private static void LoadEvents() { - string eve_path = "./Data/Plugins/Events/"; - string[] files = Directory.GetFiles(eve_path, $"*.{Loaders.PluginLoader.pluginEVEExtension}", SearchOption.AllDirectories); + string eve_path = "./Data/Plugins/Events/"; + string[] files = Directory.GetFiles(eve_path, $"*.{Loaders.PluginLoader.pluginEVEExtension}", SearchOption.AllDirectories); foreach (var file in files) if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) if (!file.Contains("PluginManager", StringComparison.InvariantCultureIgnoreCase)) { string PluginName = new FileInfo(file).Name; - string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginEVEExtension.Length); + string name = PluginName.Substring(0, PluginName.Length - 1 - PluginManager.Loaders.PluginLoader.pluginEVEExtension.Length); InstalledPlugins.Add(new(name, PluginType.Event)); } } @@ -77,6 +79,19 @@ namespace PluginManager private static AppConfig? appConfig { get; set; } + public static string GetPluginVersion(string pluginName) => appConfig.PluginVersions[pluginName]; + public static void SetPluginVersion(string pluginName, string newVersion) + { + if (appConfig.PluginVersions.ContainsKey(pluginName)) + appConfig.PluginVersions[pluginName] = newVersion; + else appConfig.PluginVersions.Add(pluginName, newVersion); + + SaveConfig(); + } + + public static void RemovePluginVersion(string pluginName) => appConfig.PluginVersions.Remove(pluginName); + public static bool PluginVersionsContainsKey(string pluginName) => appConfig.PluginVersions.ContainsKey(pluginName); + public static void AddValueToVariables(string key, T value, bool isProtected) { if (value == null) @@ -183,11 +198,11 @@ namespace PluginManager Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables."); } else - appConfig = new() { ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List() }; + appConfig = new() { ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List(), PluginVersions = new Dictionary() }; } public static bool ContainsValue(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!); - public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key); + public static bool ContainsKey(string key) => appConfig!.ApplicationVariables!.ContainsKey(key); public static ReadOnlyDictionary GetAllVariables() => new(appConfig!.ApplicationVariables!); } diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index bf08bae..d549ed8 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -4,18 +4,26 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; + using Discord.WebSocket; + using PluginManager.Loaders; using PluginManager.Online; +using PluginManager.Online.Helpers; +using PluginManager.Online.Updates; using PluginManager.Others; namespace PluginManager.Items; public class ConsoleCommandsHandler { - private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt"); + private static readonly PluginsManager manager = new("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Plugins.txt"); private static readonly List commandList = new(); - private readonly DiscordSocketClient? client; + private readonly DiscordSocketClient? client; + + + private static bool isDownloading = false; + private static bool pluginsLoaded = false; public ConsoleCommandsHandler(DiscordSocketClient client) { @@ -26,7 +34,7 @@ public class ConsoleCommandsHandler private void InitializeBasicCommands() { - var pluginsLoaded = false; + commandList.Clear(); AddCommand("help", "Show help", "help ", args => @@ -101,8 +109,10 @@ public class ConsoleCommandsHandler AddCommand("dwplug", "download plugin", "dwplug [name]", async args => { + isDownloading = true; if (args.Length == 1) { + isDownloading = false; Console.WriteLine("Please specify plugin name"); return; } @@ -116,10 +126,11 @@ public class ConsoleCommandsHandler { if (name == "") { + isDownloading = false; Console_Utilities.WriteColorText("Name is invalid"); return; } - + isDownloading = false; Console_Utilities.WriteColorText($"Failed to find plugin &b{name} &c!" + " Use &glistplugs &ccommand to display all available plugins !"); return; } @@ -160,9 +171,9 @@ public class ConsoleCommandsHandler if (split[0].EndsWith(".zip") || split[0].EndsWith(".pak") || split[0].EndsWith(".pkg")) { Console.WriteLine($"Extracting {split[1]}"); - var proc = 0f; + var proc = 0f; var isExtracting = true; - var bar = new Console_Utilities.ProgressBar { Max = 100f, Color = ConsoleColor.Green }; + var bar = new Console_Utilities.ProgressBar { Max = 100f, Color = ConsoleColor.Green }; IProgress extractProgress = new Progress(value => { proc = value; }); new Thread(new Task(() => @@ -189,6 +200,12 @@ public class ConsoleCommandsHandler Console.WriteLine(); } + VersionString? ver = await VersionString.GetVersionOfPackageFromWeb(name); + if (ver is null) throw new Exception("Incorrect version"); + Config.SetPluginVersion(name, $"{ver.PackageID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}"); + // Console.WriteLine(); + + isDownloading = false; } ); @@ -209,8 +226,8 @@ public class ConsoleCommandsHandler { if (args.Length < 4) return; - var key = args[1]; - var value = args[2]; + var key = args[1]; + var value = args[2]; var isReadOnly = args[3].Equals("true", StringComparison.CurrentCultureIgnoreCase); try @@ -276,6 +293,20 @@ public class ConsoleCommandsHandler return commandList.FirstOrDefault(t => t.CommandName == command); } + internal static async Task ExecuteCommad(string command) + { + var args = command.Split(' '); + foreach (var item in commandList.ToList()) + if (item.CommandName == args[0]) + { + item.Action.Invoke(args); + Console.WriteLine(); + + while (isDownloading) await Task.Delay(1000); + + } + } + public bool HandleCommand(string command, bool removeCommandExecution = true) { var args = command.Split(' '); @@ -292,6 +323,7 @@ public class ConsoleCommandsHandler Console.WriteLine(); item.Action(args); + return true; } diff --git a/PluginManager/Loaders/Loader.cs b/PluginManager/Loaders/Loader.cs index 82aac6f..d5e10da 100644 --- a/PluginManager/Loaders/Loader.cs +++ b/PluginManager/Loaders/Loader.cs @@ -3,29 +3,32 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Threading.Tasks; + +using PluginManager.Online.Updates; using PluginManager.Others; namespace PluginManager.Loaders; internal class LoaderArgs : EventArgs { - internal string? PluginName { get; init; } - internal string? TypeName { get; init; } - internal bool IsLoaded { get; init; } - internal Exception? Exception { get; init; } - internal object? Plugin { get; init; } + internal string? PluginName { get; init; } + internal string? TypeName { get; init; } + internal bool IsLoaded { get; init; } + internal Exception? Exception { get; init; } + internal object? Plugin { get; init; } } internal class Loader { internal Loader(string path, string extension) { - this.path = path; + this.path = path; this.extension = extension; } - private string path { get; } + private string path { get; } private string extension { get; } @@ -49,16 +52,17 @@ internal class Loader var files = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories); foreach (var file in files) { + Assembly.LoadFrom(file); if (FileLoaded != null) { var args = new LoaderArgs { - Exception = null, - TypeName = nameof(T), - IsLoaded = false, - PluginName = file, - Plugin = null + Exception = null, + TypeName = nameof(T), + IsLoaded = false, + PluginName = new FileInfo(file).Name.Split('.')[0], + Plugin = null }; FileLoaded.Invoke(args); } @@ -83,13 +87,13 @@ internal class Loader if (PluginLoaded != null) PluginLoaded.Invoke(new LoaderArgs - { - Exception = null, - IsLoaded = true, - PluginName = type.FullName, - TypeName = nameof(T), - Plugin = plugin - } + { + Exception = null, + IsLoaded = true, + PluginName = type.FullName, + TypeName = nameof(T), + Plugin = plugin + } ); } catch (Exception ex) diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index c506eaf..f35daf1 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -1,7 +1,14 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; + using Discord.WebSocket; + using PluginManager.Interfaces; +using PluginManager.Online.Updates; using PluginManager.Others; namespace PluginManager.Loaders; @@ -15,8 +22,8 @@ public class PluginLoader private const string pluginCMDFolder = @"./Data/Plugins/Commands/"; private const string pluginEVEFolder = @"./Data/Plugins/Events/"; - internal const string pluginCMDExtension = "dll"; - internal const string pluginEVEExtension = "dll"; + internal const string pluginCMDExtension = "dll"; + internal const string pluginEVEExtension = "dll"; private readonly DiscordSocketClient _client; ///

@@ -52,35 +59,58 @@ public class PluginLoader /// /// The main mathod that is called to load all events /// - public void LoadPlugins() + public async void LoadPlugins() { + + foreach (var file in Directory.GetFiles("./Data/Plugins", "*.dll", SearchOption.AllDirectories)) + { + await Task.Run(async () => + { + string name = new FileInfo(file).Name.Split('.')[0]; + if (!Config.PluginVersionsContainsKey(name)) + Config.SetPluginVersion(name, "0.0.0"); + + if (await PluginUpdater.CheckForUpdates(name)) + await PluginUpdater.Download(name); + }); + + } + Commands = new List(); - Events = new List(); + Events = new List(); Functions.WriteLogFile("Starting plugin loader ... Client: " + _client.CurrentUser.Username); Console.WriteLine("Loading plugins"); var commandsLoader = new Loader(pluginCMDFolder, pluginCMDExtension); - var eventsLoader = new Loader(pluginEVEFolder, pluginEVEExtension); + var eventsLoader = new Loader(pluginEVEFolder, pluginEVEExtension); - commandsLoader.FileLoaded += OnCommandFileLoaded; + commandsLoader.FileLoaded += OnCommandFileLoaded; commandsLoader.PluginLoaded += OnCommandLoaded; - eventsLoader.FileLoaded += EventFileLoaded; + eventsLoader.FileLoaded += EventFileLoaded; eventsLoader.PluginLoaded += OnEventLoaded; Commands = commandsLoader.Load(); - Events = eventsLoader.Load(); + Events = eventsLoader.Load(); + + // Console.WriteLine("Press Enter to enable console commands"); } private void EventFileLoaded(LoaderArgs e) { - if (e.IsLoaded) Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !"); + if (!e.IsLoaded) + { + Functions.WriteLogFile($"[EVENT] Event from file [{e.PluginName}] has been successfully created !"); + } } private void OnCommandFileLoaded(LoaderArgs e) { - if (e.IsLoaded) Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !"); + if (!e.IsLoaded) + { + Functions.WriteLogFile($"[CMD] Command from file [{e.PluginName}] has been successfully loaded !"); + } } private void OnEventLoaded(LoaderArgs e) diff --git a/PluginManager/Online/Helpers/VersionString.cs b/PluginManager/Online/Helpers/VersionString.cs new file mode 100644 index 0000000..2a081b3 --- /dev/null +++ b/PluginManager/Online/Helpers/VersionString.cs @@ -0,0 +1,77 @@ +using PluginManager.Others; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Linq; + +namespace PluginManager.Online.Helpers +{ + public class VersionString + { + public int PackageID; + public int PackageMainVersion; + public int PackageCheckVersion; + + public VersionString(string version) + { + string[] data = version.Split('.'); + try + { + PackageID = int.Parse(data[0]); + PackageMainVersion = int.Parse(data[1]); + PackageCheckVersion = int.Parse(data[2]); + } + catch (Exception ex) + { + throw new Exception("Failed to write Version", ex); + } + } + + public static bool operator >(VersionString s1, VersionString s2) + { + if (s1.PackageID != s2.PackageID) throw new Exception("Can not compare two different paks"); + if (s1.PackageMainVersion > s2.PackageMainVersion) return true; + if (s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion > s2.PackageCheckVersion) return true; + + return false; + } + + public static bool operator <(VersionString s1, VersionString s2) => !(s1 > s2) && s1 != s2; + + public static bool operator ==(VersionString s1, VersionString s2) + { + if (s1.PackageID == s2.PackageID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true; + return false; + } + + public static bool operator !=(VersionString s1, VersionString s2) => !(s1 == s2); + + public static bool operator <=(VersionString s1, VersionString s2) => (s1 < s2 || s1 == s2); + public static bool operator >=(VersionString s1, VersionString s2) => (s1 > s2 || s1 == s2); + + public override string ToString() + { + return "{PackageID: " + PackageID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}"; + } + + public static VersionString? GetVersionOfPackage(string pakName) + { + if (!Config.PluginVersionsContainsKey(pakName)) + return null; + return new VersionString(Config.GetPluginVersion(pakName)); + } + + public static async Task GetVersionOfPackageFromWeb(string pakName) + { + string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions"; + List data = await ServerCom.ReadTextFromURL(url); + string? version = (from item in data + where !item.StartsWith("#") && item.StartsWith(pakName) + select item.Split(',')[1]).FirstOrDefault(); + if (version == default || version == null) return null; + return new VersionString(version); + } + + } +} diff --git a/PluginManager/Online/Updates/PluginUpdater.cs b/PluginManager/Online/Updates/PluginUpdater.cs new file mode 100644 index 0000000..eb53ae3 --- /dev/null +++ b/PluginManager/Online/Updates/PluginUpdater.cs @@ -0,0 +1,50 @@ +using PluginManager.Items; +using PluginManager.Online.Helpers; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace PluginManager.Online.Updates +{ + public class PluginUpdater + { + public static async Task CheckForUpdates(string pakName) + { + try + { + var webV = await VersionString.GetVersionOfPackageFromWeb(pakName); + var local = VersionString.GetVersionOfPackage(pakName); + + if (local is null) return true; + if (webV is null) return false; + + if (webV == local) return false; + if (webV > local) return true; + } + catch (Exception ex) { Console.WriteLine(ex.Message); } + + + return false; + } + + public static async Task DownloadUpdateInfo(string pakName) + { + string url = "https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/Versions"; + List info = await ServerCom.ReadTextFromURL(url); + VersionString? version = await VersionString.GetVersionOfPackageFromWeb(pakName); + + if (version is null) return Update.Empty; + Update update = new Update(pakName, string.Join('\n', info), version); + return update; + } + + public static async Task Download(string pakName) + { + Console.WriteLine("An update was found for " + pakName); + await ConsoleCommandsHandler.ExecuteCommad("dwplug " + pakName); + } + + + } +} diff --git a/PluginManager/Online/Updates/Update.cs b/PluginManager/Online/Updates/Update.cs new file mode 100644 index 0000000..39eaed4 --- /dev/null +++ b/PluginManager/Online/Updates/Update.cs @@ -0,0 +1,36 @@ +using PluginManager.Online.Helpers; + +namespace PluginManager.Online.Updates +{ + public class Update + { + public static Update Empty = new Update(null, null, null); + public string pakName; + public string UpdateMessage; + + public VersionString newVersion; + + private bool isEmpty; + + public Update(string pakName, string updateMessage, VersionString newVersion) + { + this.pakName = pakName; + UpdateMessage = updateMessage; + this.newVersion = newVersion; + + if (pakName is null && updateMessage is null && newVersion is null) + isEmpty = true; + + } + + public override string ToString() + { + if (isEmpty) + throw new System.Exception("The update is EMPTY. Can not print information about an empty update !"); + return $"Package Name: {this.pakName}\n" + + $"Update Message: {UpdateMessage}\n" + + $"Version: {newVersion.ToString()}"; + } + + } +} diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 35d29c5..61a88dd 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -68,7 +68,7 @@ namespace PluginManager.Others public static void WriteLogFile(string LogMessage) { string logsPath = logFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Log.txt"; - if (!Directory.Exists(logFolder)) Directory.CreateDirectory(logFolder); + Directory.CreateDirectory(logFolder); File.AppendAllText(logsPath, LogMessage + " \n"); } @@ -79,7 +79,7 @@ namespace PluginManager.Others public static void WriteErrFile(string ErrMessage) { string errPath = errFolder + $"{DateTime.Today.ToShortDateString().Replace("/", "-").Replace("\\", "-")} Error.txt"; - if (!Directory.Exists(errFolder)) Directory.CreateDirectory(errFolder); + Directory.CreateDirectory(errFolder); File.AppendAllText(errPath, ErrMessage + " \n"); } diff --git a/SethDiscordBot.sln b/SethDiscordBot.sln index 9fa99c8..13ea9af 100644 --- a/SethDiscordBot.sln +++ b/SethDiscordBot.sln @@ -21,7 +21,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EVE_LevelingSystem", "EVE_L EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CMD_LevelingSystem", "CMD_LevelingSystem\CMD_LevelingSystem.csproj", "{1A4E49FF-9A0A-4C54-AF35-CFFBA64353D9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roles", "Roles\Roles.csproj", "{954F2AA9-6624-4554-946D-0F17B84487C3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Roles", "Roles\Roles.csproj", "{954F2AA9-6624-4554-946D-0F17B84487C3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From bbc1c601c999b830820f9fa096665a54e8264dda Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 09:58:54 +0300 Subject: [PATCH 26/36] Patching system build 2 --- PluginManager/Config.cs | 2 +- PluginManager/Loaders/PluginLoader.cs | 5 ++++- PluginManager/Online/Helpers/VersionString.cs | 5 +++++ PluginManager/Online/Updates/PluginUpdater.cs | 3 ++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 1e135ab..9d6d630 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -86,7 +86,7 @@ namespace PluginManager appConfig.PluginVersions[pluginName] = newVersion; else appConfig.PluginVersions.Add(pluginName, newVersion); - SaveConfig(); + // SaveConfig(); } public static void RemovePluginVersion(string pluginName) => appConfig.PluginVersions.Remove(pluginName); diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index f35daf1..f41dab9 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Discord.WebSocket; using PluginManager.Interfaces; +using PluginManager.Online.Helpers; using PluginManager.Online.Updates; using PluginManager.Others; @@ -68,7 +69,7 @@ public class PluginLoader { string name = new FileInfo(file).Name.Split('.')[0]; if (!Config.PluginVersionsContainsKey(name)) - Config.SetPluginVersion(name, "0.0.0"); + Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageID + ".0.0"); if (await PluginUpdater.CheckForUpdates(name)) await PluginUpdater.Download(name); @@ -76,6 +77,8 @@ public class PluginLoader } + Config.SaveConfig(); + Commands = new List(); Events = new List(); diff --git a/PluginManager/Online/Helpers/VersionString.cs b/PluginManager/Online/Helpers/VersionString.cs index 2a081b3..0cbafbf 100644 --- a/PluginManager/Online/Helpers/VersionString.cs +++ b/PluginManager/Online/Helpers/VersionString.cs @@ -55,6 +55,11 @@ namespace PluginManager.Online.Helpers return "{PackageID: " + PackageID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}"; } + public string ToShortString() + { + return $"{PackageID}.{PackageMainVersion}.{PackageCheckVersion}"; + } + public static VersionString? GetVersionOfPackage(string pakName) { if (!Config.PluginVersionsContainsKey(pakName)) diff --git a/PluginManager/Online/Updates/PluginUpdater.cs b/PluginManager/Online/Updates/PluginUpdater.cs index eb53ae3..fb43eb3 100644 --- a/PluginManager/Online/Updates/PluginUpdater.cs +++ b/PluginManager/Online/Updates/PluginUpdater.cs @@ -1,5 +1,6 @@ using PluginManager.Items; using PluginManager.Online.Helpers; +using PluginManager.Others; using System; using System.Collections.Generic; @@ -41,7 +42,7 @@ namespace PluginManager.Online.Updates public static async Task Download(string pakName) { - Console.WriteLine("An update was found for " + pakName); + Console_Utilities.WriteColorText("An update was found for &g" + pakName + "&c. Version: &r" + (await VersionString.GetVersionOfPackageFromWeb(pakName))?.ToShortString() + "&c. Current Version: &y" + VersionString.GetVersionOfPackage(pakName)?.ToShortString()); await ConsoleCommandsHandler.ExecuteCommad("dwplug " + pakName); } From 1f5e5d0611facc5d6575462c4a586f0bb5dd5211 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 10:09:02 +0300 Subject: [PATCH 27/36] patch --- PluginManager/Loaders/PluginLoader.cs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index f41dab9..ad5b796 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -62,8 +62,8 @@ public class PluginLoader /// public async void LoadPlugins() { - - foreach (var file in Directory.GetFiles("./Data/Plugins", "*.dll", SearchOption.AllDirectories)) + //Check for updates in commands + foreach (var file in Directory.GetFiles("./Data/Plugins/Commands", $"*.{pluginCMDExtension}", SearchOption.AllDirectories)) { await Task.Run(async () => { @@ -77,8 +77,28 @@ public class PluginLoader } + //Check for updates in events + foreach (var file in Directory.GetFiles("./Data/Plugins/Events", $"*.{pluginEVEExtension}", SearchOption.AllDirectories)) + { + await Task.Run(async () => + { + string name = new FileInfo(file).Name.Split('.')[0]; + if (!Config.PluginVersionsContainsKey(name)) + Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageID + ".0.0"); + + if (await PluginUpdater.CheckForUpdates(name)) + await PluginUpdater.Download(name); + }); + + } + + + //Save the new config file (after the updates) Config.SaveConfig(); + + //Load all plugins + Commands = new List(); Events = new List(); @@ -97,7 +117,6 @@ public class PluginLoader Commands = commandsLoader.Load(); Events = eventsLoader.Load(); - // Console.WriteLine("Press Enter to enable console commands"); } private void EventFileLoaded(LoaderArgs e) From 8b36c086ef810ab5cbc690d768170c599bae45a1 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 14:19:46 +0300 Subject: [PATCH 28/36] New Command added & Leveling System update --- DiscordBot/DiscordBot.csproj | 4 +-- DiscordBot/Program.cs | 21 +++--------- EVE_LevelingSystem/Level.cs | 8 +++-- .../LevelingSystemCore/LevelCalculator.cs | 15 +++++---- EVE_LevelingSystem/Settings.cs | 2 ++ PluginManager/Items/ConsoleCommandsHandler.cs | 33 +++++++++++++++++++ PluginManager/Others/Functions.cs | 5 +-- 7 files changed, 58 insertions(+), 30 deletions(-) diff --git a/DiscordBot/DiscordBot.csproj b/DiscordBot/DiscordBot.csproj index fdfaf9e..adc235a 100644 --- a/DiscordBot/DiscordBot.csproj +++ b/DiscordBot/DiscordBot.csproj @@ -12,11 +12,11 @@ - none + none - none + none diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index cc19549..77f2207 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -2,18 +2,13 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net.Http; using System.Reflection; -using System.Runtime.Loader; using System.Threading; using System.Threading.Tasks; -using Discord.WebSocket; - using DiscordBot.Discord.Core; using PluginManager; -using PluginManager.Interfaces; using PluginManager.Items; using PluginManager.Online; using PluginManager.Others; @@ -119,22 +114,16 @@ public class Program if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); #endif Config.SaveConfig(); - while (true) { - Console.ForegroundColor = ConsoleColor.White; - -#if DEBUG //Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); var cmd = Console.ReadLine(); - if (!consoleCommandsHandler.HandleCommand(cmd!, false) && cmd.Length > 0) - Console.WriteLine("Failed to run command " + cmd); -#else - //Console_Utilities.WriteColorText("&rSethBot &c> ", false); - var cmd = Console.ReadLine(); - if (!consoleCommandsHandler.HandleCommand(cmd!) && cmd.Length > 0) - Console.WriteLine("Failed to run command " + cmd); + if (!consoleCommandsHandler.HandleCommand(cmd!, +#if DEBUG + false #endif + ) && cmd.Length > 0) + Console.WriteLine("Failed to run command " + cmd); } } diff --git a/EVE_LevelingSystem/Level.cs b/EVE_LevelingSystem/Level.cs index 9afa612..68ece34 100644 --- a/EVE_LevelingSystem/Level.cs +++ b/EVE_LevelingSystem/Level.cs @@ -1,6 +1,8 @@ using Discord; using Discord.WebSocket; + using EVE_LevelingSystem.LevelingSystemCore; + using PluginManager; using PluginManager.Interfaces; using PluginManager.Others; @@ -9,8 +11,8 @@ namespace EVE_LevelingSystem { internal class Level : DBEvent { - public string name => "Leveling System Event Handler"; - public string description => "The Leveling System Event Handler"; + public string name => "Leveling System Event Handler"; + public string description => "The Leveling System Event Handler"; internal static Settings globalSettings = new(); @@ -39,7 +41,7 @@ namespace EVE_LevelingSystem { if (arg.Author.IsBot || arg.IsTTS || arg.Content.StartsWith(Config.GetValue("prefix"))) return; string userID = arg.Author.Id.ToString(); - User user; + User user; if (File.Exists($"{Config.GetValue("LevelingSystemPath")}/{userID}.dat")) { user = await Functions.ConvertFromJson(Config.GetValue("LevelingSystemPath")! + $"/{userID}.dat"); diff --git a/EVE_LevelingSystem/LevelingSystemCore/LevelCalculator.cs b/EVE_LevelingSystem/LevelingSystemCore/LevelCalculator.cs index 733adac..0359c6b 100644 --- a/EVE_LevelingSystem/LevelingSystemCore/LevelCalculator.cs +++ b/EVE_LevelingSystem/LevelingSystemCore/LevelCalculator.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; + using PluginManager; namespace EVE_LevelingSystem.LevelingSystemCore @@ -18,7 +19,7 @@ namespace EVE_LevelingSystem.LevelingSystemCore internal static void LevelUp(this User user) { - user.CurrentEXP = 0; + user.CurrentEXP = 0; user.RequiredEXPToLevelUp = GetNextLevelRequiredEXP(user.CurrentLevel); user.CurrentLevel++; } @@ -26,15 +27,15 @@ namespace EVE_LevelingSystem.LevelingSystemCore internal static bool AddEXP(this User user) { if (OnWaitingList.Contains(user.user.userID.ToString())) return false; - Random r = new Random(); - int exp = r.Next(2, 12); - Int64 userXP = user.CurrentEXP; - Int64 reqEXP = user.RequiredEXPToLevelUp; + Random r = new Random(); + int exp = r.Next(Level.globalSettings.MinEXP, Level.globalSettings.MaxEXP + 1); + Int64 userXP = user.CurrentEXP; + Int64 reqEXP = user.RequiredEXPToLevelUp; if (userXP + exp >= reqEXP) { user.LevelUp(); user.CurrentEXP = exp - (reqEXP - userXP); - Console.WriteLine("Level up"); + //Console.WriteLine("Level up"); return true; } @@ -49,7 +50,7 @@ namespace EVE_LevelingSystem.LevelingSystemCore Thread.Sleep(60000 * minutesToWait); OnWaitingList.Remove(user.user.userID.ToString()); } - ); + ).Start(); return false; } diff --git a/EVE_LevelingSystem/Settings.cs b/EVE_LevelingSystem/Settings.cs index 38a8caa..5225e9d 100644 --- a/EVE_LevelingSystem/Settings.cs +++ b/EVE_LevelingSystem/Settings.cs @@ -9,5 +9,7 @@ namespace EVE_LevelingSystem public class Settings { public int TimeToWaitBetweenMessages { get; set; } + public int MinEXP { get; set; } + public int MaxEXP { get; set; } } } diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index d549ed8..8c67892 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -2,11 +2,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net.Http; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using Discord.WebSocket; +using PluginManager.Interfaces; using PluginManager.Loaders; using PluginManager.Online; using PluginManager.Online.Helpers; @@ -262,6 +265,35 @@ public class ConsoleCommandsHandler Environment.Exit(0); } ); + + AddCommand("extern", "Load an external command", "extern [pluginName]", async (args) => + { + if (args.Length <= 1) return; + string pName = Functions.MergeStrings(args, 1); + HttpClient client = new HttpClient(); + string url = (await manager.GetPluginLinkByName(pName))[1]; + Stream s = await client.GetStreamAsync(url); + MemoryStream str = new MemoryStream(); + await s.CopyToAsync(str); + var asmb = Assembly.Load(str.ToArray()); + + var types = asmb.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && typeof(DBEvent).IsAssignableFrom(type)) + { + DBEvent instance = (DBEvent)Activator.CreateInstance(type); + instance.Start(this.client); + Console.WriteLine($"Loaded external {type.FullName}!"); + } + else if (type.IsClass && typeof(DBCommand).IsAssignableFrom(type)) + { + Console.WriteLine("Only events can be loaded from external sources !"); + return; + } + } + }); + //Sort the commands by name commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName)); } @@ -309,6 +341,7 @@ public class ConsoleCommandsHandler public bool HandleCommand(string command, bool removeCommandExecution = true) { + Console.ForegroundColor = ConsoleColor.White; var args = command.Split(' '); foreach (var item in commandList.ToList()) if (item.CommandName == args[0]) diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 61a88dd..8039902 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -261,7 +261,8 @@ namespace PluginManager.Others /// public static async Task SaveToJsonFile(string file, T Data) { - var s = File.OpenWrite(file); + File.Delete(file); + var s = File.Open(file, FileMode.OpenOrCreate); await JsonSerializer.SerializeAsync(s, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true }); s.Close(); } @@ -276,7 +277,7 @@ namespace PluginManager.Others { Stream text; if (File.Exists(input)) - text = File.Open(input, FileMode.OpenOrCreate); + text = File.OpenRead(input); else text = new MemoryStream(Encoding.ASCII.GetBytes(input)); From debdc58646c879a9ab425d5f2f32ccd3aa226b8e Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 20:12:31 +0300 Subject: [PATCH 29/36] The ability to remove a plugin has been added --- BUILDS/net6.0/PluginManager.dll | Bin 72192 -> 79360 bytes DiscordBot/DiscordBot.csproj | 2 +- DiscordBot/Program.cs | 27 ++++-- PluginManager/Items/ConsoleCommandsHandler.cs | 79 +++++++++++++++++- PluginManager/Others/Functions.cs | 4 +- 5 files changed, 103 insertions(+), 9 deletions(-) diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 030162ff854595754c73f6ff7c17a4b3da5bd9ac..110653e8ed3943d94f6f6a47aed61eb2d5fec4fd 100644 GIT binary patch literal 79360 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 z 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 YL;1h^4|ae*IJ1L{@{fQ2-%;Ry1J_rpHUIzs diff --git a/DiscordBot/DiscordBot.csproj b/DiscordBot/DiscordBot.csproj index adc235a..5aa59c2 100644 --- a/DiscordBot/DiscordBot.csproj +++ b/DiscordBot/DiscordBot.csproj @@ -8,7 +8,7 @@ False True - 1.0.0.2 + 1.0.0.3 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 77f2207..3383372 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -19,6 +19,7 @@ public class Program { private static bool loadPluginsOnStartup; private static bool listPluginsAtStartup; + private static ConsoleCommandsHandler consoleCommandsHandler; /// /// The main entry point for the application. @@ -33,6 +34,7 @@ public class Program Directory.CreateDirectory("./Data/Plugins/Events"); PreLoadComponents().Wait(); + if (!Config.ContainsKey("ServerID")) { do @@ -105,7 +107,7 @@ public class Program /// The discord booter used to start the application private static void NoGUI(Boot discordbooter) { - var consoleCommandsHandler = new ConsoleCommandsHandler(discordbooter.client); + #if DEBUG Console.WriteLine(); consoleCommandsHandler.HandleCommand("lp"); @@ -118,10 +120,11 @@ public class Program { //Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); var cmd = Console.ReadLine(); - if (!consoleCommandsHandler.HandleCommand(cmd!, + if (!consoleCommandsHandler.HandleCommand(cmd! #if DEBUG - false + , false #endif + ) && cmd.Length > 0) Console.WriteLine("Failed to run command " + cmd); } @@ -199,8 +202,11 @@ public class Program /// The arguments private static async Task HandleInput(string[] args) { + var b = await StartNoGUI(); + consoleCommandsHandler = new ConsoleCommandsHandler(b.client); var len = args.Length; + if (len == 3 && args[0] == "/download") { var url = args[1]; @@ -211,6 +217,17 @@ public class Program return; } + if (len > 0 && args[0] == "/remplug") + { + + string plugName = Functions.MergeStrings(args, 1); + Console.WriteLine("Starting to remove " + plugName); + await ConsoleCommandsHandler.ExecuteCommad("remplug " + plugName); + loadPluginsOnStartup = true; + len = 0; + } + + if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage"))) { if (args.Contains("lp") || args.Contains("loadplugins")) @@ -222,10 +239,10 @@ public class Program } + + if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) { - var b = await StartNoGUI(); - Thread mainThread = new Thread(() => NoGUI(b)); mainThread.Start(); return; diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 8c67892..a25ac76 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Net.Http; @@ -168,6 +169,7 @@ public class ConsoleCommandsHandler continue; var split = line.Split(','); Console.WriteLine($"\nDownloading item: {split[1]}"); + if (File.Exists("./" + split[1])) File.Delete("./" + split[1]); await ServerCom.DownloadFileAsync(split[0], "./" + split[1]); Console.WriteLine(); @@ -294,6 +296,80 @@ public class ConsoleCommandsHandler } }); + AddCommand("remplug", "Remove a plugin", "remplug [plugName]", async args => + { + isDownloading = true; + if (args.Length <= 1) return; + string plugName = Functions.MergeStrings(args, 1); + if (pluginsLoaded) + { + if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS) + { + Process.Start("DiscordBot.exe ", $"/remplug {plugName}"); + Environment.Exit(0); + } + else + { + Process.Start("./DiscordBot", $"/remplug {plugName}"); + Environment.Exit(0); + } + isDownloading = false; + return; + } + + + string location = "./Data/Plugins/"; + + location = Config.PluginConfig.GetPluginType(plugName) switch + { + PluginType.Command => location + "Commands/" + plugName + "." + PluginLoader.pluginCMDExtension, + PluginType.Event => location + "Events/" + plugName + "." + PluginLoader.pluginEVEExtension, + PluginType.Unknown => "./", + _ => throw new NotImplementedException("Plugin type incorrect") + }; + + if (!File.Exists(location)) + { + Console.WriteLine("The plugig does not exist"); + return; + } + + File.Delete(location); + if (Config.PluginConfig.Contains(plugName)) + { + var tuple = Config.PluginConfig.InstalledPlugins.Where(t => t.Item1 == plugName).FirstOrDefault(); + Console.WriteLine("Found: " + tuple.ToString()); + Config.PluginConfig.InstalledPlugins.Remove(tuple); + Config.RemovePluginVersion(plugName); + Config.SaveConfig(); + } + Console.WriteLine("Removed the plugin DLL. Checking for other files ..."); + + var info = await manager.GetPluginLinkByName(plugName); + if (info[2] != string.Empty) + { + var lines = await ServerCom.ReadTextFromURL(info[2]); + foreach (var line in lines) + { + if (!(line.Length > 0 && line.Contains(","))) + continue; + var split = line.Split(','); + if (File.Exists("./" + split[1])) + File.Delete("./" + split[1]); + + + Console.WriteLine("Removed: " + split[1]); + } + + + if (Directory.Exists(plugName)) + Directory.Delete(plugName, true); + } + isDownloading = false; + Console.WriteLine(plugName + " has been successfully deleted !"); + + }); + //Sort the commands by name commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName)); } @@ -325,9 +401,10 @@ public class ConsoleCommandsHandler return commandList.FirstOrDefault(t => t.CommandName == command); } - internal static async Task ExecuteCommad(string command) + public static async Task ExecuteCommad(string command) { var args = command.Split(' '); + // Console.WriteLine(command); foreach (var item in commandList.ToList()) if (item.CommandName == args[0]) { diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 8039902..a99bc7f 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -26,12 +26,12 @@ namespace PluginManager.Others /// /// The location for all logs /// - public static readonly string logFolder = @"./Output/Logs/"; + public static readonly string logFolder = @"./Data/Output/Logs/"; /// /// The location for all errors /// - public static readonly string errFolder = @"./Output/Errors/"; + public static readonly string errFolder = @"./Data/Output/Errors/"; /// /// Archives folder From a8520c8c96f70dd4f31ad4ef2af8e8b8d0e20b29 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 20:23:06 +0300 Subject: [PATCH 30/36] fixed some bugs --- BUILDS/net6.0/PluginManager.dll | Bin 79360 -> 79360 bytes PluginManager/Items/ConsoleCommandsHandler.cs | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 110653e8ed3943d94f6f6a47aed61eb2d5fec4fd..2ab25375f2e0030ad504a1886eaf06e576838dae 100644 GIT binary patch delta 18838 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 WiR-Dp*R_RLzT)n!{-qZ6bo?I-DnT{? delta 18709 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 Ha~%H%SO<$% diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index a25ac76..3c93b76 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -298,19 +298,23 @@ public class ConsoleCommandsHandler AddCommand("remplug", "Remove a plugin", "remplug [plugName]", async args => { - isDownloading = true; + if (args.Length <= 1) return; + + isDownloading = true; string plugName = Functions.MergeStrings(args, 1); if (pluginsLoaded) { if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS) { Process.Start("DiscordBot.exe ", $"/remplug {plugName}"); + await Task.Delay(100); Environment.Exit(0); } else { Process.Start("./DiscordBot", $"/remplug {plugName}"); + await Task.Delay(100); Environment.Exit(0); } isDownloading = false; @@ -330,7 +334,7 @@ public class ConsoleCommandsHandler if (!File.Exists(location)) { - Console.WriteLine("The plugig does not exist"); + Console.WriteLine("The plugin does not exist"); return; } From 938c73c81045030ef0a23be44526c73958b3e315 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 20:31:28 +0300 Subject: [PATCH 31/36] Delete DiscordBotConsoleLauncher directory --- .../DiscordBotConsoleLauncher.csproj | 14 ------------- DiscordBotConsoleLauncher/Program.cs | 21 ------------------- 2 files changed, 35 deletions(-) delete mode 100644 DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj delete mode 100644 DiscordBotConsoleLauncher/Program.cs diff --git a/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj b/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj deleted file mode 100644 index 396c1aa..0000000 --- a/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - net6.0 - enable - enable - - - - - - - diff --git a/DiscordBotConsoleLauncher/Program.cs b/DiscordBotConsoleLauncher/Program.cs deleted file mode 100644 index 47b010d..0000000 --- a/DiscordBotConsoleLauncher/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using PluginManager.Online.Updates; - -try -{ - bool requireUpdate = await PluginUpdater.CheckForUpdates("DiscordBotConsoleLauncher"); - if (requireUpdate) - { - var update = await PluginUpdater.DownloadUpdateInfo("DiscordBotConsoleLauncher"); - if (update == Update.Empty) - return; - - Console.WriteLine("Found an update: "); - Console.WriteLine(update.ToString()); - } -} -catch (Exception ex) -{ - Console.WriteLine("An exception was thrown. "); - Console.WriteLine(ex.Message); - Environment.Exit(-2); -} \ No newline at end of file From e440e9794879a1af93e5aae55616ab95c1e48b87 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 17 Aug 2022 20:31:52 +0300 Subject: [PATCH 32/36] --- .../DiscordBotConsoleLauncher.csproj | 14 ------------- DiscordBotConsoleLauncher/Program.cs | 21 ------------------- 2 files changed, 35 deletions(-) delete mode 100644 DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj delete mode 100644 DiscordBotConsoleLauncher/Program.cs diff --git a/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj b/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj deleted file mode 100644 index 396c1aa..0000000 --- a/DiscordBotConsoleLauncher/DiscordBotConsoleLauncher.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - net6.0 - enable - enable - - - - - - - diff --git a/DiscordBotConsoleLauncher/Program.cs b/DiscordBotConsoleLauncher/Program.cs deleted file mode 100644 index 47b010d..0000000 --- a/DiscordBotConsoleLauncher/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using PluginManager.Online.Updates; - -try -{ - bool requireUpdate = await PluginUpdater.CheckForUpdates("DiscordBotConsoleLauncher"); - if (requireUpdate) - { - var update = await PluginUpdater.DownloadUpdateInfo("DiscordBotConsoleLauncher"); - if (update == Update.Empty) - return; - - Console.WriteLine("Found an update: "); - Console.WriteLine(update.ToString()); - } -} -catch (Exception ex) -{ - Console.WriteLine("An exception was thrown. "); - Console.WriteLine(ex.Message); - Environment.Exit(-2); -} \ No newline at end of file From 6da9828e5cdef8f9e4ecf080f4194d4a6de5c97c Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 20 Aug 2022 17:44:19 +0300 Subject: [PATCH 33/36] improved save method --- DiscordBot/Program.cs | 35 +++++++++-- PluginManager/Config.cs | 58 +++++++++++++------ PluginManager/Items/ConsoleCommandsHandler.cs | 22 ++++++- PluginManager/Loaders/PluginLoader.cs | 2 +- PluginManager/Online/Helpers/VersionString.cs | 3 + PluginManager/Others/Enums.cs | 4 +- PluginManager/Others/Functions.cs | 10 ++-- 7 files changed, 101 insertions(+), 33 deletions(-) diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 3383372..98faa69 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -115,10 +115,10 @@ public class Program if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); #endif - Config.SaveConfig(); + Config.SaveConfig(SaveType.NORMAL); while (true) { - //Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); + // Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); var cmd = Console.ReadLine(); if (!consoleCommandsHandler.HandleCommand(cmd! #if DEBUG @@ -149,6 +149,14 @@ public class Program Console_Utilities.WriteColorText("&rRemember to close the bot using the ShutDown command (&ysd&r) or some settings won't be saved\n"); Console.ForegroundColor = ConsoleColor.White; + + if (Config.ContainsKey("LaunchMessage")) + { + Console_Utilities.WriteColorText(Config.GetValue("LaunchMessage")); + Config.RemoveKey("LaunchMessage"); + } + + Console_Utilities.WriteColorText("Please note that the bot saves a backup save file every time you are using the shudown command (&ysd&c)"); Console.WriteLine($"============================ LOG ============================"); try @@ -243,7 +251,26 @@ public class Program if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) { - Thread mainThread = new Thread(() => NoGUI(b)); + + Thread mainThread = new Thread(() => + { + try + { + NoGUI(b); + } + catch (IOException ex) + { + if (ex.Message == "No process is on the other end of the pipe." || (uint)ex.HResult == 0x800700E9) + { + if (!Config.ContainsKey("LaunchMessage")) + Config.AddValueToVariables("LaunchMessage", "An error occured while closing the bot last time. Please consider closing the bot using the &rsd&c method !\nThere is a risk of losing all data or corruption of the save file, which in some cases requires to reinstall the bot !", false); + Functions.WriteErrFile(ex.ToString()); + } + } + + + + }); mainThread.Start(); return; } @@ -377,6 +404,6 @@ public class Program Console_Utilities.Initialize(); - Config.SaveConfig(); + Config.SaveConfig(SaveType.NORMAL); } } diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 9d6d630..881ca8d 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -13,8 +13,7 @@ namespace PluginManager { public Dictionary? ApplicationVariables { get; init; } public List? ProtectedKeyWords { get; init; } - - public Dictionary PluginVersions { get; init; } + public Dictionary? PluginVersions { get; init; } } public static class Config @@ -59,9 +58,8 @@ namespace PluginManager public static bool Contains(string pluginName) { foreach (var tuple in InstalledPlugins) - { - if (tuple.Item1 == pluginName) return true; - } + if (tuple.Item1 == pluginName) + return true; return false; } @@ -79,18 +77,18 @@ namespace PluginManager private static AppConfig? appConfig { get; set; } - public static string GetPluginVersion(string pluginName) => appConfig.PluginVersions[pluginName]; + public static string GetPluginVersion(string pluginName) => appConfig!.PluginVersions![pluginName]; public static void SetPluginVersion(string pluginName, string newVersion) { - if (appConfig.PluginVersions.ContainsKey(pluginName)) + if (appConfig!.PluginVersions!.ContainsKey(pluginName)) appConfig.PluginVersions[pluginName] = newVersion; else appConfig.PluginVersions.Add(pluginName, newVersion); // SaveConfig(); } - public static void RemovePluginVersion(string pluginName) => appConfig.PluginVersions.Remove(pluginName); - public static bool PluginVersionsContainsKey(string pluginName) => appConfig.PluginVersions.ContainsKey(pluginName); + public static void RemovePluginVersion(string pluginName) => appConfig!.PluginVersions!.Remove(pluginName); + public static bool PluginVersionsContainsKey(string pluginName) => appConfig!.PluginVersions!.ContainsKey(pluginName); public static void AddValueToVariables(string key, T value, bool isProtected) { @@ -103,7 +101,7 @@ namespace PluginManager if (isProtected && key != "Version") appConfig.ProtectedKeyWords!.Add(key); - SaveConfig(); + SaveConfig(SaveType.NORMAL); } public static Type GetVariableType(string value) @@ -171,7 +169,7 @@ namespace PluginManager throw new Exception("Key is protected"); appConfig.ApplicationVariables[key] = JsonSerializer.SerializeToElement(value); - SaveConfig(); + SaveConfig(SaveType.NORMAL); } public static void RemoveKey(string key) @@ -180,13 +178,24 @@ namespace PluginManager throw new Exception("Key is protected"); appConfig!.ApplicationVariables!.Remove(key); appConfig.ProtectedKeyWords!.Remove(key); - SaveConfig(); + SaveConfig(SaveType.NORMAL); } - public static async void SaveConfig() + public static async void SaveConfig(SaveType type) { - string path = Functions.dataFolder + "config.json"; - await Functions.SaveToJsonFile(path, appConfig!); + if (type == SaveType.NORMAL) + { + string path = Functions.dataFolder + "config.json"; + await Functions.SaveToJsonFile(path, appConfig!); + return; + } + if (type == SaveType.BACKUP) + { + string path = Functions.dataFolder + "config.json.bak"; + await Functions.SaveToJsonFile(path, appConfig!); + return; + } + } public static async Task LoadConfig() @@ -194,11 +203,24 @@ namespace PluginManager string path = Functions.dataFolder + "config.json"; if (File.Exists(path)) { - appConfig = await Functions.ConvertFromJson(path); + try + { + appConfig = await Functions.ConvertFromJson(path); + } + catch (Exception ex) + { + File.Delete(path); + Console.WriteLine("An error occured while loading the settings. Importing from backup file..."); + path = Functions.dataFolder + "config.json.bak"; + appConfig = await Functions.ConvertFromJson(path); + Functions.WriteErrFile(ex.Message); + } + + Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables."); + return; } - else - appConfig = new() { ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List(), PluginVersions = new Dictionary() }; + appConfig = new() { ApplicationVariables = new Dictionary(), ProtectedKeyWords = new List(), PluginVersions = new Dictionary() }; } public static bool ContainsValue(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!); diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 3c93b76..2532636 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -261,7 +261,8 @@ public class ConsoleCommandsHandler return; client.StopAsync(); client.DisposeAsync(); - Config.SaveConfig(); + Config.SaveConfig(SaveType.NORMAL); + Config.SaveConfig(SaveType.BACKUP); Console.WriteLine("Bot is closing in 2 seconds ! Please wait to save data !"); Thread.Sleep(2000); Environment.Exit(0); @@ -307,7 +308,7 @@ public class ConsoleCommandsHandler { if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS) { - Process.Start("DiscordBot.exe ", $"/remplug {plugName}"); + Process.Start("DiscordBot.exe", $"/remplug {plugName}"); await Task.Delay(100); Environment.Exit(0); } @@ -345,7 +346,7 @@ public class ConsoleCommandsHandler Console.WriteLine("Found: " + tuple.ToString()); Config.PluginConfig.InstalledPlugins.Remove(tuple); Config.RemovePluginVersion(plugName); - Config.SaveConfig(); + Config.SaveConfig(SaveType.NORMAL); } Console.WriteLine("Removed the plugin DLL. Checking for other files ..."); @@ -374,6 +375,21 @@ public class ConsoleCommandsHandler }); + AddCommand("reload", "Reload the bot with all plugins", () => + { + if (Functions.GetOperatingSystem() == Others.OperatingSystem.WINDOWS) + { + Process.Start("DiscordBot.exe", $"lp"); + HandleCommand("sd"); + } + else + { + + Process.Start("./DiscordBot", $"lp"); + HandleCommand("sd"); + } + }); + //Sort the commands by name commandList.Sort((x, y) => x.CommandName.CompareTo(y.CommandName)); } diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index ad5b796..0f20fb8 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -94,7 +94,7 @@ public class PluginLoader //Save the new config file (after the updates) - Config.SaveConfig(); + Config.SaveConfig(SaveType.NORMAL); //Load all plugins diff --git a/PluginManager/Online/Helpers/VersionString.cs b/PluginManager/Online/Helpers/VersionString.cs index 0cbafbf..1cf9732 100644 --- a/PluginManager/Online/Helpers/VersionString.cs +++ b/PluginManager/Online/Helpers/VersionString.cs @@ -37,6 +37,7 @@ namespace PluginManager.Online.Helpers return false; } + #region operators public static bool operator <(VersionString s1, VersionString s2) => !(s1 > s2) && s1 != s2; public static bool operator ==(VersionString s1, VersionString s2) @@ -50,6 +51,8 @@ namespace PluginManager.Online.Helpers public static bool operator <=(VersionString s1, VersionString s2) => (s1 < s2 || s1 == s2); public static bool operator >=(VersionString s1, VersionString s2) => (s1 > s2 || s1 == s2); + #endregion + public override string ToString() { return "{PackageID: " + PackageID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}"; diff --git a/PluginManager/Others/Enums.cs b/PluginManager/Others/Enums.cs index 322230d..e1e3f77 100644 --- a/PluginManager/Others/Enums.cs +++ b/PluginManager/Others/Enums.cs @@ -30,4 +30,6 @@ public enum PluginType { Command, Event, Unknown } public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotalSize } -public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT } \ No newline at end of file +public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT } + +public enum SaveType { NORMAL, BACKUP } \ No newline at end of file diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index a99bc7f..8b17397 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -261,10 +261,9 @@ namespace PluginManager.Others /// public static async Task SaveToJsonFile(string file, T Data) { - File.Delete(file); - var s = File.Open(file, FileMode.OpenOrCreate); - await JsonSerializer.SerializeAsync(s, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true }); - s.Close(); + MemoryStream str = new MemoryStream(); + await JsonSerializer.SerializeAsync(str, Data, typeof(T), new JsonSerializerOptions { WriteIndented = true }); + await File.WriteAllBytesAsync(file, str.ToArray()); } /// @@ -277,8 +276,7 @@ namespace PluginManager.Others { Stream text; if (File.Exists(input)) - text = File.OpenRead(input); - + text = new MemoryStream(await File.ReadAllBytesAsync(input)); else text = new MemoryStream(Encoding.ASCII.GetBytes(input)); text.Position = 0; From f8ebf76f9278d90d261a5455169facdf81e19ed7 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 20 Aug 2022 20:52:21 +0300 Subject: [PATCH 34/36] Delete .idea/.idea.SethDiscordBot/.idea directory --- .idea/.idea.SethDiscordBot/.idea/.gitignore | 13 ------------- .idea/.idea.SethDiscordBot/.idea/.name | 1 - .idea/.idea.SethDiscordBot/.idea/encodings.xml | 4 ---- .idea/.idea.SethDiscordBot/.idea/indexLayout.xml | 8 -------- .idea/.idea.SethDiscordBot/.idea/vcs.xml | 6 ------ 5 files changed, 32 deletions(-) delete mode 100644 .idea/.idea.SethDiscordBot/.idea/.gitignore delete mode 100644 .idea/.idea.SethDiscordBot/.idea/.name delete mode 100644 .idea/.idea.SethDiscordBot/.idea/encodings.xml delete mode 100644 .idea/.idea.SethDiscordBot/.idea/indexLayout.xml delete mode 100644 .idea/.idea.SethDiscordBot/.idea/vcs.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.gitignore b/.idea/.idea.SethDiscordBot/.idea/.gitignore deleted file mode 100644 index 7fa1cfe..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/projectSettingsUpdater.xml -/contentModel.xml -/.idea.SethDiscordBot.iml -/modules.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/.name b/.idea/.idea.SethDiscordBot/.idea/.name deleted file mode 100644 index ac07819..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -SethDiscordBot \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/encodings.xml b/.idea/.idea.SethDiscordBot/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml b/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/vcs.xml b/.idea/.idea.SethDiscordBot/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/.idea.SethDiscordBot/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 77aad985fac63c21b46688cb696b30ded722001e Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Wed, 24 Aug 2022 21:34:06 +0300 Subject: [PATCH 35/36] Added a new ProgressBar type --- BUILDS/net6.0/Music Commands.dll | Bin 17408 -> 17408 bytes BUILDS/net6.0/PluginManager.dll | Bin 79360 -> 81920 bytes DiscordBot/Program.cs | 39 ++++++--- MusicCommands/AudioFile.cs | 11 +-- PluginManager/Items/ConsoleCommandsHandler.cs | 6 +- PluginManager/Online/PluginsManager.cs | 14 ++-- PluginManager/Online/ServerCom.cs | 8 +- PluginManager/Others/Console Utilities.cs | 76 ++++++++++++------ PluginManager/Others/Enums.cs | 3 +- PluginManager/Others/Functions.cs | 10 ++- 10 files changed, 111 insertions(+), 56 deletions(-) diff --git a/BUILDS/net6.0/Music Commands.dll b/BUILDS/net6.0/Music Commands.dll index 2341731440bb69e3bc798bc94f2922f547bc4361..cb4a5fc65e3de3d309fc2744de879887852585d2 100644 GIT binary patch delta 262 zcmZqZU~K4MoY2A2y{PKk#2y*ObrV;HGsaA2WK?H$h-P4rnXJg9GdYq`opHD7d*jOxj8{dk%>`ZbCbw)Mn=EMQetw9 zNs}$b{!6y7Ffb^G1~YIdGB5}*0NL)Lo-ROIVsoJQIXOo4$qHt2?0O8T3>6Hin{Cau zGYUxj$a(4_!Qs>;!Tn^-y|2NWSu7%0g?fPgfPrNow!%b3F`!RcZ5uc9+5KW>+F`v} L(CIznL<4pJ1(i#m diff --git a/BUILDS/net6.0/PluginManager.dll b/BUILDS/net6.0/PluginManager.dll index 2ab25375f2e0030ad504a1886eaf06e576838dae..7c99f4fb00190e8106de6ceec1ea0bcb3fac059e 100644 GIT binary patch literal 81920 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μScP9@<`o2Mc=-$(b3}Nb)$xNA4G%8oXD!=p(_SMzGQ<>4 zAI$!z6m&JQ*H{Rq?V#Jl($y}8h)AnKDsUcx#I19=B?{Wh{O_P5hbV(y)tp83UKSBR zYJtd3Zymfku1=bYNvle8WDeqfgkx7wmWQZ;<#8FuT5ySl+=4?rHmrwZkBkcmqU4q_ zPdwQK1>It?IBgKgje)B|6`&^NHApmj3 zFGh;LkMWGv2=)-9L)${(Ya7iP12HML&1|j&Av?S@NC^@&zBybi&O|9G-hFJI-!o}iZEgwIIdMJ12}@`|unOR66AXIMS-L~|hi(Iv6QxFu zyQGt4(n$$qi?1TPr=IpB{scQBVpVd{1W${_he_h11kEX7lLdy0^#zvhs0%haLJX)Q zrIASSRd_ENQ+QnnavOEE8c|_*7hPc>bcH#bcOQC*L0L>L?N9W>-bO8+S!_%xB6mz|W8@IJ@km`33%dZNqdY>=ts+fh34qhbd z>|fTD7T_72>nye5ViJ1v=flibbR_3hxVvSkYc7_v_B&*fli!cW?|$HUv+_RGvmjZ)Q!K848Dsb3dT!UHQzFxO>?>$eAijN zi=w-Y?|88h<)3btO>;AHx?fS?8?7<uj*=ec13(7K1Pv;b`U?}BJBGOp+izDpt^|QGL^LDQ3E`0@S zhj-E?%a4BGE717yF?CaIW#oNqI=`y#KDu9tST*a94yaw0+WyN3x$tMA`RUtPM9$u% z>Axp}-}P9xYSs_+{-22KoGFr@`Bi%?wey#0_@)E|RX!GmH)W^)LJvO;{C`0#zZI++ z@VXmfWZS}wf*Du;VS>c$2cpc0g5uIpIrq3Il8gZPK{FSpFwCr8kw&4*Ep-M@H{)0S z>?XX zReOG;iccwgc{10XPV+lVYJ}e^b({`Hz{5C0C}#g1W|`|*2W1H$<=@8A6|El108 zW!_}uup6qx3bh;1f>b_!yA_YU@DUU~48#Xt__tI#ZwRS;J~A&4Q@Ia13xj&vyA47u z)QQim=?7(FlfZv&q5f)4N`V+eWm#sVK#%HW|O_jxkPuYP1`+Is@3Tk^VP zz0ZTk7m=|Ji!r!w)AHIUV_ANuJQ-JhLJnm{z)uaiuj}x!vPzBLzrN+iqVPVk4H2%s zeIXgx6~gc1S?G!Cywf#R(UZdO-chG9SPLKB8$nO&CvM+Ak34-yb^q)B+hO7NOqKel Q5B%$H#{aMVzf1%F8-fl2^8f$< literal 79360 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 *E>@~tNGnb$hx%2mL{)Pxz7(`?`H0 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 diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 98faa69..8dd1586 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -6,6 +6,8 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; +using Discord; + using DiscordBot.Discord.Core; using PluginManager; @@ -210,10 +212,8 @@ public class Program /// The arguments private static async Task HandleInput(string[] args) { - var b = await StartNoGUI(); - consoleCommandsHandler = new ConsoleCommandsHandler(b.client); - var len = args.Length; + var len = args.Length; if (len == 3 && args[0] == "/download") { @@ -225,17 +225,23 @@ public class Program return; } - if (len > 0 && args[0] == "/remplug") + if (len > 0 && args[0] == "/test") { + int p = 1; + bool allowed = true; + Console.CancelKeyPress += (sender, e) => allowed = false; + Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(); + Console.WriteLine("Press Ctrl + C to stop."); + while (p <= int.MaxValue - 1 && allowed) + { + bar.Update(ProgressBarType.NO_END, 100 / p); + await Task.Delay(100); + p++; + } - string plugName = Functions.MergeStrings(args, 1); - Console.WriteLine("Starting to remove " + plugName); - await ConsoleCommandsHandler.ExecuteCommad("remplug " + plugName); - loadPluginsOnStartup = true; - len = 0; + return; } - if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage"))) { if (args.Contains("lp") || args.Contains("loadplugins")) @@ -248,6 +254,19 @@ public class Program + var b = await StartNoGUI(); + consoleCommandsHandler = new ConsoleCommandsHandler(b.client); + + if (len > 0 && args[0] == "/remplug") + { + + string plugName = Functions.MergeStrings(args, 1); + Console.WriteLine("Starting to remove " + plugName); + await ConsoleCommandsHandler.ExecuteCommad("remplug " + plugName); + loadPluginsOnStartup = true; + len = 0; + } + if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) { diff --git a/MusicCommands/AudioFile.cs b/MusicCommands/AudioFile.cs index 76daa24..bd7b576 100644 --- a/MusicCommands/AudioFile.cs +++ b/MusicCommands/AudioFile.cs @@ -1,4 +1,5 @@ using AngleSharp.Dom; + using System; using System.Collections.Generic; using System.Diagnostics; @@ -11,20 +12,20 @@ namespace MusicCommands internal class AudioFile { internal string Name { get; set; } - internal string Url { get; set; } + internal string Url { get; set; } internal AudioFile(string name, string url) { Name = name; - Url = url; + Url = url; } internal async Task DownloadAudioFile() { Process proc = new Process(); - proc.StartInfo.FileName = "MusicDownloader.exe"; - proc.StartInfo.Arguments = $"{Url},{Name}"; - proc.StartInfo.UseShellExecute = false; + proc.StartInfo.FileName = "MusicDownloader"; + proc.StartInfo.Arguments = $"{Url},{Name}"; + proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index 2532636..bc95438 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -185,7 +185,7 @@ public class ConsoleCommandsHandler { while (isExtracting) { - bar.Update(proc); + bar.Update(ProgressBarType.NORMAL, proc); if (proc >= 99.9f) isExtracting = false; Thread.Sleep(500); @@ -194,10 +194,10 @@ public class ConsoleCommandsHandler ).Start ).Start(); await Functions.ExtractArchive("./" + split[1], "./", extractProgress, UnzipProgressType.PercentageFromTotalSize); - bar.Update(100f); + bar.Update(ProgressBarType.NORMAL, 100f); isExtracting = false; await Task.Delay(1000); - bar.Update(100); + bar.Update(ProgressBarType.NORMAL, 100); Console.WriteLine("\n"); File.Delete("./" + split[1]); } diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index ddbe61c..2ad44b4 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; + using PluginManager.Others; + using OperatingSystem = PluginManager.Others.OperatingSystem; namespace PluginManager.Online; @@ -30,13 +32,13 @@ public class PluginsManager { try { - var list = await ServerCom.ReadTextFromURL(PluginsLink); + var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); var data = new List(); - var op = Functions.GetOperatingSystem(); + var op = Functions.GetOperatingSystem(); - var len = lines.Length; + var len = lines.Length; string[] titles = { "Name", "Description", "Plugin Type", "Libraries", "Installed" }; data.Add(new[] { "-", "-", "-", "-", "-" }); data.Add(titles); @@ -86,7 +88,7 @@ public class PluginsManager data.Add(new[] { "-", "-", "-", "-", "-" }); - Console_Utilities.FormatAndAlignTable(data); + Console_Utilities.FormatAndAlignTable(data, TableFormat.CENTER_EACH_COLUMN_BASED); } catch (Exception exception) { @@ -104,9 +106,9 @@ public class PluginsManager { try { - var list = await ServerCom.ReadTextFromURL(PluginsLink); + var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); - var len = lines.Length; + var len = lines.Length; for (var i = 0; i < len; i++) { var contents = lines[i].Split(','); diff --git a/PluginManager/Online/ServerCom.cs b/PluginManager/Online/ServerCom.cs index 7ae5834..267042e 100644 --- a/PluginManager/Online/ServerCom.cs +++ b/PluginManager/Online/ServerCom.cs @@ -51,8 +51,8 @@ namespace PluginManager.Online /// public static async Task DownloadFileAsync(string URL, string location) { - bool isDownloading = true; - float c_progress = 0; + bool isDownloading = true; + float c_progress = 0; Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100f, NoColor = true }; @@ -63,7 +63,7 @@ namespace PluginManager.Online { while (isDownloading) { - pbar.Update(c_progress); + pbar.Update(ProgressBarType.NORMAL, c_progress); if (c_progress == 100f) break; Thread.Sleep(500); @@ -76,7 +76,7 @@ namespace PluginManager.Online c_progress = pbar.Max; - pbar.Update(100f); + pbar.Update(ProgressBarType.NORMAL, 100f); isDownloading = false; } } diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index 44a8a42..fc40d3a 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -1,4 +1,5 @@ using Discord; + using System; using System.Collections.Generic; using System.Linq; @@ -32,47 +33,74 @@ namespace PluginManager.Others /// public class ProgressBar { - public float Max { get; init; } - public ConsoleColor Color { get; init; } - public bool NoColor { get; init; } + public float Max { get; init; } + public ConsoleColor Color { get; init; } + public bool NoColor { get; init; } + private int BarLength = 32; + private int position = 1; + private bool positive = true; - public void Update(float progress, double speed = -1, string? unit = null) + public void Update(ProgressBarType type, float progress) + { + switch (type) + { + case ProgressBarType.NORMAL: + UpdateNormal(progress); + return; + case ProgressBarType.NO_END: + if (progress <= 99.9f) + UpdateNoEnd(); + return; + } + } + + private void UpdateNoEnd() { Console.CursorLeft = 0; Console.Write("["); - Console.CursorLeft = 32; + for (int i = 1; i <= position; i++) + Console.Write(" "); + Console.Write("<==()==>"); + position += positive ? 1 : -1; + for (int i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++) + Console.Write(" "); + Console.Write("]"); + + + if (position == BarLength - 1 || position == 1) + positive = !positive; + } + + private void UpdateNormal(float progress) + { + Console.CursorLeft = 0; + Console.Write("["); + Console.CursorLeft = BarLength; Console.Write("]"); Console.CursorLeft = 1; float onechunk = 30.0f / Max; - int position = 1; - for (int i = 0; i < onechunk * progress; i++) { Console.BackgroundColor = NoColor ? ConsoleColor.Black : this.Color; - Console.CursorLeft = position++; + Console.CursorLeft = position++; Console.Write("#"); } - for (int i = position; i <= 31; i++) + for (int i = position; i <= BarLength - 1; i++) { Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray; - Console.CursorLeft = position++; + Console.CursorLeft = position++; Console.Write(" "); } Console.CursorLeft = 35; Console.BackgroundColor = ConsoleColor.Black; - if (speed is -1 || unit == null) - { - if (progress.CanAproximateTo(Max)) - Console.Write(progress + " % ✓"); - else - Console.Write(MathF.Round(progress, 2) + " % "); - } + if (progress.CanAproximateTo(Max)) + Console.Write(progress + " % ✓"); else - Console.Write(progress + $"{speed} {unit}/s "); + Console.Write(MathF.Round(progress, 2) + " % "); } } @@ -84,13 +112,13 @@ namespace PluginManager.Others /// A way to create a table based on input data /// /// The List of arrays of strings that represent the rows. - public static void FormatAndAlignTable(List data, TableFormat format = TableFormat.CENTER_EACH_COLUMN_BASED) + public static void FormatAndAlignTable(List data, TableFormat format) { if (format == TableFormat.CENTER_EACH_COLUMN_BASED) { - char tableLine = '-'; + char tableLine = '-'; char tableCross = '+'; - char tableWall = '|'; + char tableWall = '|'; int[] len = new int[data[0].Length]; foreach (var line in data) @@ -196,8 +224,8 @@ namespace PluginManager.Others if (format == TableFormat.DEFAULT) { - int[] widths = new int[data[0].Length]; - int space_between_columns = int.Parse(Config.GetValue>("TableVariables")?["DefaultSpace"]!); + int[] widths = new int[data[0].Length]; + int space_between_columns = int.Parse(Config.GetValue>("TableVariables")?["DefaultSpace"]!); for (int i = 0; i < data.Count; i++) { for (int j = 0; j < data[i].Length; j++) @@ -230,7 +258,7 @@ namespace PluginManager.Others public static void WriteColorText(string text, bool appendNewLineAtEnd = true) { ConsoleColor initialForeGround = Console.ForegroundColor; - char[] input = text.ToCharArray(); + char[] input = text.ToCharArray(); for (int i = 0; i < input.Length; i++) { if (input[i] == Config.GetValue("ColorPrefix")) diff --git a/PluginManager/Others/Enums.cs b/PluginManager/Others/Enums.cs index e1e3f77..fb63614 100644 --- a/PluginManager/Others/Enums.cs +++ b/PluginManager/Others/Enums.cs @@ -32,4 +32,5 @@ public enum UnzipProgressType { PercentageFromNumberOfFiles, PercentageFromTotal public enum TableFormat { CENTER_EACH_COLUMN_BASED, CENTER_OVERALL_LENGTH, DEFAULT } -public enum SaveType { NORMAL, BACKUP } \ No newline at end of file +public enum SaveType { NORMAL, BACKUP } +public enum ProgressBarType { NORMAL, NO_END } \ No newline at end of file diff --git a/PluginManager/Others/Functions.cs b/PluginManager/Others/Functions.cs index 8b17397..2f26f9e 100644 --- a/PluginManager/Others/Functions.cs +++ b/PluginManager/Others/Functions.cs @@ -36,7 +36,7 @@ namespace PluginManager.Others /// /// Archives folder /// - public static readonly string pakFolder = @"./Data/Resources/PAK/"; + public static readonly string pakFolder = @"./Data/PAKS/"; /// /// Beta testing folder @@ -50,7 +50,7 @@ namespace PluginManager.Others /// The file name that is inside the archive or its full path /// The archive location from the PAKs folder /// A string that represents the content of the file or null if the file does not exists or it has no content - public static Stream? ReadFromPakAsync(string FileName, string archFile) + public static async Task ReadFromPakAsync(string FileName, string archFile) { archFile = pakFolder + archFile; Directory.CreateDirectory(pakFolder); @@ -58,7 +58,11 @@ namespace PluginManager.Others using ZipArchive archive = ZipFile.OpenRead(archFile); ZipArchiveEntry? entry = archive.GetEntry(FileName); - return entry?.Open(); + if (entry is null) return Stream.Null; + MemoryStream stream = new MemoryStream(); + await (entry?.Open()!).CopyToAsync(stream); + + return stream; } /// From f6442af30ca4fcab0dfdcd7adce1c786ed770e9c Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Thu, 25 Aug 2022 15:15:47 +0300 Subject: [PATCH 36/36] patch: listplugs, plugin version system and progress bar --- .../.idea/projectSettingsUpdater.xml | 6 + .../.idea.SethDiscordBot/.idea/workspace.xml | 107 ++++++++++++++++++ DiscordBot/Program.cs | 14 +-- PluginManager/Config.cs | 2 +- PluginManager/Items/ConsoleCommandsHandler.cs | 65 ++++++++--- PluginManager/Loaders/PluginLoader.cs | 6 +- PluginManager/Online/Helpers/VersionString.cs | 30 +++-- PluginManager/Online/PluginsManager.cs | 12 +- PluginManager/Online/ServerCom.cs | 6 +- PluginManager/Others/Console Utilities.cs | 17 ++- 10 files changed, 210 insertions(+), 55 deletions(-) create mode 100644 .idea/.idea.SethDiscordBot/.idea/projectSettingsUpdater.xml create mode 100644 .idea/.idea.SethDiscordBot/.idea/workspace.xml diff --git a/.idea/.idea.SethDiscordBot/.idea/projectSettingsUpdater.xml b/.idea/.idea.SethDiscordBot/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..4bb9f4d --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.SethDiscordBot/.idea/workspace.xml b/.idea/.idea.SethDiscordBot/.idea/workspace.xml new file mode 100644 index 0000000..39f0d0c --- /dev/null +++ b/.idea/.idea.SethDiscordBot/.idea/workspace.xml @@ -0,0 +1,107 @@ + + + + DiscordBot/DiscordBot.csproj + DiscordBot/DiscordBot.csproj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1658854902538 + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscordBot/Program.cs b/DiscordBot/Program.cs index 8dd1586..a94ff80 100644 --- a/DiscordBot/Program.cs +++ b/DiscordBot/Program.cs @@ -112,18 +112,19 @@ public class Program #if DEBUG Console.WriteLine(); - consoleCommandsHandler.HandleCommand("lp"); + ConsoleCommandsHandler.ExecuteCommad("lp").Wait(); #else if (loadPluginsOnStartup) consoleCommandsHandler.HandleCommand("lp"); if (listPluginsAtStartup) consoleCommandsHandler.HandleCommand("listplugs"); #endif - Config.SaveConfig(SaveType.NORMAL); + Config.SaveConfig(SaveType.NORMAL).Wait(); + while (true) { - // Console_Utilities.WriteColorText("&rSethBot (&yDEBUG&r) &c> ", false); + var cmd = Console.ReadLine(); if (!consoleCommandsHandler.HandleCommand(cmd! -#if DEBUG +#if DEBUG , false #endif @@ -177,7 +178,6 @@ public class Program #endif var prefix = Config.GetValue("prefix"); - var discordbooter = new Boot(token, prefix); await discordbooter.Awake(); return discordbooter; @@ -230,11 +230,11 @@ public class Program int p = 1; bool allowed = true; Console.CancelKeyPress += (sender, e) => allowed = false; - Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(); + Console_Utilities.ProgressBar bar = new(ProgressBarType.NO_END);// { NoColor = false, Color = ConsoleColor.DarkRed }; Console.WriteLine("Press Ctrl + C to stop."); while (p <= int.MaxValue - 1 && allowed) { - bar.Update(ProgressBarType.NO_END, 100 / p); + bar.Update(100 / p); await Task.Delay(100); p++; } diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index 881ca8d..9bb7140 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -181,7 +181,7 @@ namespace PluginManager SaveConfig(SaveType.NORMAL); } - public static async void SaveConfig(SaveType type) + public static async Task SaveConfig(SaveType type) { if (type == SaveType.NORMAL) { diff --git a/PluginManager/Items/ConsoleCommandsHandler.cs b/PluginManager/Items/ConsoleCommandsHandler.cs index bc95438..4a31091 100644 --- a/PluginManager/Items/ConsoleCommandsHandler.cs +++ b/PluginManager/Items/ConsoleCommandsHandler.cs @@ -82,30 +82,48 @@ public class ConsoleCommandsHandler if (pluginsLoaded) return; var loader = new PluginLoader(client!); + ConsoleColor cc = Console.ForegroundColor; loader.onCMDLoad += (name, typeName, success, exception) => { - Console.ForegroundColor = ConsoleColor.Green; + if (name == null || name.Length < 2) name = typeName; if (success) + { + Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("[CMD] Successfully loaded command : " + name); + } + else + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("[CMD] Failed to load command : " + name + " because " + exception!.Message); - Console.ForegroundColor = ConsoleColor.Red; + } + Console.ForegroundColor = cc; }; loader.onEVELoad += (name, typeName, success, exception) => { if (name == null || name.Length < 2) name = typeName; - Console.ForegroundColor = ConsoleColor.Green; + if (success) + { + Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("[EVENT] Successfully loaded event : " + name); + } else + { + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[EVENT] Failed to load event : " + name + " because " + exception!.Message); - Console.ForegroundColor = ConsoleColor.Red; + } + Console.ForegroundColor = cc; }; + loader.LoadPlugins(); + Console.ForegroundColor = cc; pluginsLoaded = true; + } ); @@ -178,14 +196,14 @@ public class ConsoleCommandsHandler Console.WriteLine($"Extracting {split[1]}"); var proc = 0f; var isExtracting = true; - var bar = new Console_Utilities.ProgressBar { Max = 100f, Color = ConsoleColor.Green }; + var bar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, Color = ConsoleColor.Green }; IProgress extractProgress = new Progress(value => { proc = value; }); new Thread(new Task(() => { while (isExtracting) { - bar.Update(ProgressBarType.NORMAL, proc); + bar.Update(proc); if (proc >= 99.9f) isExtracting = false; Thread.Sleep(500); @@ -194,10 +212,10 @@ public class ConsoleCommandsHandler ).Start ).Start(); await Functions.ExtractArchive("./" + split[1], "./", extractProgress, UnzipProgressType.PercentageFromTotalSize); - bar.Update(ProgressBarType.NORMAL, 100f); + bar.Update(100f); isExtracting = false; await Task.Delay(1000); - bar.Update(ProgressBarType.NORMAL, 100); + bar.Update(100); Console.WriteLine("\n"); File.Delete("./" + split[1]); } @@ -207,7 +225,7 @@ public class ConsoleCommandsHandler } VersionString? ver = await VersionString.GetVersionOfPackageFromWeb(name); if (ver is null) throw new Exception("Incorrect version"); - Config.SetPluginVersion(name, $"{ver.PackageID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}"); + Config.SetPluginVersion(name, $"{ver.PackageVersionID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}"); // Console.WriteLine(); isDownloading = false; @@ -255,17 +273,30 @@ public class ConsoleCommandsHandler } ); - AddCommand("sd", "Shuts down the discord bot", () => + AddCommand("sd", "Shuts down the discord bot", async () => { if (client is null) return; - client.StopAsync(); - client.DisposeAsync(); - Config.SaveConfig(SaveType.NORMAL); - Config.SaveConfig(SaveType.BACKUP); - Console.WriteLine("Bot is closing in 2 seconds ! Please wait to save data !"); - Thread.Sleep(2000); + bool run = true; + var t = new Thread(() => + { + Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); + while (run) + { + bar.Update(1); + Thread.Sleep(50); + } + }); + t.Start(); + await Config.SaveConfig(SaveType.NORMAL); + await Config.SaveConfig(SaveType.BACKUP); + await Task.Delay(4000); + run = false; + Console.WriteLine(); + await client.StopAsync(); + await client.DisposeAsync(); Environment.Exit(0); + } ); @@ -346,7 +377,7 @@ public class ConsoleCommandsHandler Console.WriteLine("Found: " + tuple.ToString()); Config.PluginConfig.InstalledPlugins.Remove(tuple); Config.RemovePluginVersion(plugName); - Config.SaveConfig(SaveType.NORMAL); + await Config.SaveConfig(SaveType.NORMAL); } Console.WriteLine("Removed the plugin DLL. Checking for other files ..."); diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index 0f20fb8..6e57705 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -69,7 +69,7 @@ public class PluginLoader { string name = new FileInfo(file).Name.Split('.')[0]; if (!Config.PluginVersionsContainsKey(name)) - Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageID + ".0.0"); + Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0"); if (await PluginUpdater.CheckForUpdates(name)) await PluginUpdater.Download(name); @@ -84,7 +84,7 @@ public class PluginLoader { string name = new FileInfo(file).Name.Split('.')[0]; if (!Config.PluginVersionsContainsKey(name)) - Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageID + ".0.0"); + Config.SetPluginVersion(name, (await VersionString.GetVersionOfPackageFromWeb(name))?.PackageVersionID + ".0.0"); if (await PluginUpdater.CheckForUpdates(name)) await PluginUpdater.Download(name); @@ -94,7 +94,7 @@ public class PluginLoader //Save the new config file (after the updates) - Config.SaveConfig(SaveType.NORMAL); + await Config.SaveConfig(SaveType.NORMAL); //Load all plugins diff --git a/PluginManager/Online/Helpers/VersionString.cs b/PluginManager/Online/Helpers/VersionString.cs index 1cf9732..1067228 100644 --- a/PluginManager/Online/Helpers/VersionString.cs +++ b/PluginManager/Online/Helpers/VersionString.cs @@ -9,7 +9,7 @@ namespace PluginManager.Online.Helpers { public class VersionString { - public int PackageID; + public int PackageVersionID; public int PackageMainVersion; public int PackageCheckVersion; @@ -18,7 +18,7 @@ namespace PluginManager.Online.Helpers string[] data = version.Split('.'); try { - PackageID = int.Parse(data[0]); + PackageVersionID = int.Parse(data[0]); PackageMainVersion = int.Parse(data[1]); PackageCheckVersion = int.Parse(data[2]); } @@ -28,21 +28,25 @@ namespace PluginManager.Online.Helpers } } - public static bool operator >(VersionString s1, VersionString s2) - { - if (s1.PackageID != s2.PackageID) throw new Exception("Can not compare two different paks"); - if (s1.PackageMainVersion > s2.PackageMainVersion) return true; - if (s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion > s2.PackageCheckVersion) return true; - return false; - } #region operators + public static bool operator >(VersionString s1, VersionString s2) + { + if (s1.PackageVersionID > s2.PackageVersionID) return true; + if (s1.PackageVersionID == s2.PackageVersionID) + { + if (s1.PackageMainVersion > s2.PackageMainVersion) return true; + if (s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion > s2.PackageCheckVersion) return true; + + } + return false; + } public static bool operator <(VersionString s1, VersionString s2) => !(s1 > s2) && s1 != s2; public static bool operator ==(VersionString s1, VersionString s2) { - if (s1.PackageID == s2.PackageID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true; + if (s1.PackageVersionID == s2.PackageVersionID && s1.PackageMainVersion == s2.PackageMainVersion && s1.PackageCheckVersion == s2.PackageCheckVersion) return true; return false; } @@ -55,12 +59,14 @@ namespace PluginManager.Online.Helpers public override string ToString() { - return "{PackageID: " + PackageID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}"; + return "{PackageID: " + PackageVersionID + ", PackageVersion: " + PackageMainVersion + ", PackageCheckVersion: " + PackageCheckVersion + "}"; } public string ToShortString() { - return $"{PackageID}.{PackageMainVersion}.{PackageCheckVersion}"; + if (PackageVersionID == 0 && PackageCheckVersion == 0 && PackageMainVersion == 0) + return "Unknown"; + return $"{PackageVersionID}.{PackageMainVersion}.{PackageCheckVersion}"; } public static VersionString? GetVersionOfPackage(string pakName) diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 2ad44b4..2e06edb 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading.Tasks; +using PluginManager.Online.Helpers; using PluginManager.Others; using OperatingSystem = PluginManager.Others.OperatingSystem; @@ -39,7 +40,7 @@ public class PluginsManager var op = Functions.GetOperatingSystem(); var len = lines.Length; - string[] titles = { "Name", "Description", "Plugin Type", "Libraries", "Installed" }; + string[] titles = { "Name", "Description", "Type", "Version", "Installed" }; data.Add(new[] { "-", "-", "-", "-", "-" }); data.Add(titles); data.Add(new[] { "-", "-", "-", "-", "-" }); @@ -56,11 +57,7 @@ public class PluginsManager display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; - if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) - display[3] = ((await ServerCom.ReadTextFromURL(content[5])).Count + 1).ToString(); - - else - display[3] = "1"; + display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString(); if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0])) display[4] = "✓"; else @@ -75,8 +72,7 @@ public class PluginsManager display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; - if (content.Length == 6 && (content[5] != null || content[5].Length > 2)) - display[3] = ((await ServerCom.ReadTextFromURL(content[5])).Count + 1).ToString(); + display[3] = (await VersionString.GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")).ToShortString(); if (Config.PluginConfig.Contains(content[0]) || Config.PluginConfig.Contains(content[0])) display[4] = "✓"; else diff --git a/PluginManager/Online/ServerCom.cs b/PluginManager/Online/ServerCom.cs index 267042e..925bbf5 100644 --- a/PluginManager/Online/ServerCom.cs +++ b/PluginManager/Online/ServerCom.cs @@ -54,7 +54,7 @@ namespace PluginManager.Online bool isDownloading = true; float c_progress = 0; - Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar { Max = 100f, NoColor = true }; + Console_Utilities.ProgressBar pbar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, NoColor = true }; IProgress progress = new Progress(percent => { c_progress = percent; }); @@ -63,7 +63,7 @@ namespace PluginManager.Online { while (isDownloading) { - pbar.Update(ProgressBarType.NORMAL, c_progress); + pbar.Update(c_progress); if (c_progress == 100f) break; Thread.Sleep(500); @@ -76,7 +76,7 @@ namespace PluginManager.Online c_progress = pbar.Max; - pbar.Update(ProgressBarType.NORMAL, 100f); + pbar.Update(100f); isDownloading = false; } } diff --git a/PluginManager/Others/Console Utilities.cs b/PluginManager/Others/Console Utilities.cs index fc40d3a..c1277f0 100644 --- a/PluginManager/Others/Console Utilities.cs +++ b/PluginManager/Others/Console Utilities.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; -using System.Linq; namespace PluginManager.Others { @@ -33,15 +32,21 @@ namespace PluginManager.Others /// public class ProgressBar { + public ProgressBar(ProgressBarType type) + { + this.type = type; + } + public float Max { get; init; } public ConsoleColor Color { get; init; } public bool NoColor { get; init; } + public ProgressBarType type { get; set; } private int BarLength = 32; private int position = 1; private bool positive = true; - public void Update(ProgressBarType type, float progress) + public void Update(float progress) { switch (type) { @@ -52,6 +57,8 @@ namespace PluginManager.Others if (progress <= 99.9f) UpdateNoEnd(); return; + default: + return; } } @@ -81,6 +88,8 @@ namespace PluginManager.Others Console.CursorLeft = 1; float onechunk = 30.0f / Max; + int position = 1; + for (int i = 0; i < onechunk * progress; i++) { Console.BackgroundColor = NoColor ? ConsoleColor.Black : this.Color; @@ -88,14 +97,14 @@ namespace PluginManager.Others Console.Write("#"); } - for (int i = position; i <= BarLength - 1; i++) + for (int i = position; i < BarLength; i++) { Console.BackgroundColor = NoColor ? ConsoleColor.Black : ConsoleColor.DarkGray; Console.CursorLeft = position++; Console.Write(" "); } - Console.CursorLeft = 35; + Console.CursorLeft = BarLength + 4; Console.BackgroundColor = ConsoleColor.Black; if (progress.CanAproximateTo(Max)) Console.Write(progress + " % ✓");