From 5ab31959561129aca5de3c8bf07d16787c782ce4 Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Tue, 16 Aug 2022 23:08:56 +0300 Subject: [PATCH] --- 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