1 Commits

Author SHA1 Message Date
d689eee7fa 2022-08-26 10:42:15 +03:00
13 changed files with 297 additions and 328 deletions

View File

@@ -1,11 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using PluginManager;
using PluginManager.Interfaces; using PluginManager.Interfaces;
using PluginManager.Loaders; using PluginManager.Loaders;
using PluginManager.Others; using PluginManager.Others;
@@ -34,6 +31,16 @@ internal class Help : DBCommand
/// </summary> /// </summary>
public string Usage => "help <command>"; public string Usage => "help <command>";
/// <summary>
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
/// </summary>
public bool canUseDM => true;
/// <summary>
/// Check if the command can be used in a server
/// </summary>
public bool canUseServer => true;
/// <summary> /// <summary>
/// Check if the command require administrator to be executed /// Check if the command require administrator to be executed
/// </summary> /// </summary>
@@ -43,9 +50,12 @@ internal class Help : DBCommand
/// The main body of the command /// The main body of the command
/// </summary> /// </summary>
/// <param name="context">The command context</param> /// <param name="context">The command context</param>
public void ExecuteServer(SocketCommandContext context) /// <param name="message">The command message</param>
/// <param name="client">The discord bot client</param>
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
{ {
var args = Functions.GetArguments(context.Message); var args = Functions.GetArguments(message);
if (args.Count != 0) if (args.Count != 0)
{ {
foreach (var item in args) foreach (var item in args)
@@ -62,29 +72,33 @@ internal class Help : DBCommand
var embedBuilder = new EmbedBuilder(); var embedBuilder = new EmbedBuilder();
var adminCommands = ""; var adminCommands = "";
var normalCommands = ""; var normalCommands = "";
var DMCommands = "";
foreach (var cmd in PluginLoader.Commands!) foreach (var cmd in PluginLoader.Commands!)
{ {
if (cmd.canUseDM)
DMCommands += cmd.Command + " ";
if (cmd.requireAdmin) if (cmd.requireAdmin)
adminCommands += cmd.Command + " "; adminCommands += cmd.Command + " ";
else if (cmd.canUseServer)
normalCommands += cmd.Command + " "; normalCommands += cmd.Command + " ";
} }
embedBuilder.AddField("Admin Commands", adminCommands); embedBuilder.AddField("Admin Commands", adminCommands);
embedBuilder.AddField("Normal Commands", normalCommands); embedBuilder.AddField("Normal Commands", normalCommands);
embedBuilder.AddField("DM Commands", DMCommands);
context.Channel.SendMessageAsync(embed: embedBuilder.Build()); context.Channel.SendMessageAsync(embed: embedBuilder.Build());
} }
private EmbedBuilder GenerateHelpCommand(string command) private EmbedBuilder GenerateHelpCommand(string command)
{ {
var embedBuilder = new EmbedBuilder(); var embedBuilder = new EmbedBuilder();
var cmd = PluginLoader.Commands!.Find(p => p.Command == command || (p.Aliases is not null && p.Aliases.Contains(command))); var cmd = PluginLoader.Commands!.Find(p => p.Command == command || (p.Aliases is not null && p.Aliases.Contains(command)));
if (cmd == null) return null; if (cmd == null) return null;
embedBuilder.AddField("Usage", Config.GetValue<string>("prefix") + cmd.Usage); embedBuilder.AddField("Usage", cmd.Usage);
embedBuilder.AddField("Description", cmd.Description); embedBuilder.AddField("Description", cmd.Description);
if (cmd.Aliases is null) if (cmd.Aliases is null)
return embedBuilder; return embedBuilder;

View File

@@ -30,19 +30,33 @@ internal class Restart : DBCommand
/// </summary> /// </summary>
public string Usage => "restart [-p | -c | -args | -cmd] <args>"; public string Usage => "restart [-p | -c | -args | -cmd] <args>";
/// <summary>
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
/// </summary>
public bool canUseDM => false;
/// <summary>
/// Check if the command can be used in a server
/// </summary>
public bool canUseServer => true;
/// <summary> /// <summary>
/// Check if the command require administrator to be executed /// Check if the command require administrator to be executed
/// </summary> /// </summary>
public bool requireAdmin => true; public bool requireAdmin => false;
/// <summary> /// <summary>
/// The main body of the command /// The main body of the command
/// </summary> /// </summary>
/// <param name="context">The command context</param> /// <param name="context">The command context</param>
public async void ExecuteServer(DiscordLibCommands.SocketCommandContext context) /// <param name="message">The command message</param>
/// <param name="client">The discord bot client</param>
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
public async void Execute(DiscordLibCommands.SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
{ {
var args = Functions.GetArguments(context.Message); if (!(message.Author as SocketGuildUser).hasPermission(DiscordLib.GuildPermission.Administrator)) return;
var OS = Functions.GetOperatingSystem(); var args = Functions.GetArguments(message);
var OS = Functions.GetOperatingSystem();
if (args.Count == 0) if (args.Count == 0)
{ {
switch (OS) switch (OS)

View File

@@ -1,10 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using PluginManager; using PluginManager;
using PluginManager.Interfaces; using PluginManager.Interfaces;
@@ -29,6 +27,16 @@ internal class Settings : DBCommand
/// </summary> /// </summary>
public string Usage => "set [keyword] [new Value]"; public string Usage => "set [keyword] [new Value]";
/// <summary>
/// Check if the command can be used <inheritdoca DM <see cref="IChannel" />/>
/// </summary>
public bool canUseDM => true;
/// <summary>
/// Check if the command can be used in a server
/// </summary>
public bool canUseServer => true;
/// <summary> /// <summary>
/// Check if the command require administrator to be executed /// Check if the command require administrator to be executed
/// </summary> /// </summary>
@@ -38,13 +46,16 @@ internal class Settings : DBCommand
/// The main body of the command /// The main body of the command
/// </summary> /// </summary>
/// <param name="context">The command context</param> /// <param name="context">The command context</param>
public async void Execute(SocketCommandContext context) /// <param name="message">The command message</param>
/// <param name="client">The discord bot client</param>
/// <param name="isDM">True if the message was sent from a DM channel, false otherwise</param>
public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM)
{ {
var channel = context.Message.Channel; var channel = message.Channel;
try try
{ {
var content = context.Message.Content; var content = message.Content;
var data = content.Split(' '); var data = content.Split(' ');
var keyword = data[1]; var keyword = data[1];
if (keyword.ToLower() == "help") if (keyword.ToLower() == "help")
{ {

View File

@@ -1,13 +1,10 @@
using System; using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using PluginManager; using PluginManager;
using static PluginManager.Others.Functions; using static PluginManager.Others.Functions;
namespace DiscordBot.Discord.Core; namespace DiscordBot.Discord.Core;
@@ -47,7 +44,7 @@ internal class Boot
public Boot(string botToken, string botPrefix) public Boot(string botToken, string botPrefix)
{ {
this.botPrefix = botPrefix; this.botPrefix = botPrefix;
this.botToken = botToken; this.botToken = botToken;
} }
@@ -65,7 +62,7 @@ internal class Boot
{ {
DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true }; DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true };
client = new DiscordSocketClient(config); client = new DiscordSocketClient(config);
service = new CommandService(); service = new CommandService();
CommonTasks(); CommonTasks();
@@ -84,9 +81,9 @@ internal class Boot
{ {
if (client == null) return; if (client == null) return;
client.LoggedOut += Client_LoggedOut; client.LoggedOut += Client_LoggedOut;
client.Log += Log; client.Log += Log;
client.LoggedIn += LoggedIn; client.LoggedIn += LoggedIn;
client.Ready += Ready; client.Ready += Ready;
} }
private Task Client_LoggedOut() private Task Client_LoggedOut()
@@ -99,7 +96,7 @@ internal class Boot
private Task Ready() private Task Ready()
{ {
Console.Title = "ONLINE"; Console.Title = "ONLINE";
isReady = true; isReady = true;
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -141,5 +138,4 @@ internal class Boot
return Task.CompletedTask; return Task.CompletedTask;
} }
} }

View File

@@ -1,10 +1,8 @@
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using PluginManager.Loaders; using PluginManager.Loaders;
using PluginManager.Others; using PluginManager.Others;
using PluginManager.Others.Permissions; using PluginManager.Others.Permissions;
@@ -13,9 +11,9 @@ namespace DiscordBot.Discord.Core;
internal class CommandHandler internal class CommandHandler
{ {
private readonly string botPrefix; private readonly string botPrefix;
private readonly DiscordSocketClient client; private readonly DiscordSocketClient client;
private readonly CommandService commandService; private readonly CommandService commandService;
/// <summary> /// <summary>
/// Command handler constructor /// Command handler constructor
@@ -25,9 +23,9 @@ internal class CommandHandler
/// <param name="botPrefix">The prefix to watch for</param> /// <param name="botPrefix">The prefix to watch for</param>
public CommandHandler(DiscordSocketClient client, CommandService commandService, string botPrefix) public CommandHandler(DiscordSocketClient client, CommandService commandService, string botPrefix)
{ {
this.client = client; this.client = client;
this.commandService = commandService; this.commandService = commandService;
this.botPrefix = botPrefix; this.botPrefix = botPrefix;
} }
/// <summary> /// <summary>
@@ -77,19 +75,57 @@ internal class CommandHandler
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(); 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 is null) throw new System.Exception("Failed to run command. !");
if (plugin.requireAdmin && !context.Message.Author.isAdmin()) if (plugin != null)
return; {
if (message.Channel == await message.Author.CreateDMChannelAsync())
{
if (plugin.canUseDM)
{
if (plugin.requireAdmin)
{
if (message.Author.isAdmin())
{
plugin.Execute(context, message, client, true);
Functions.WriteLogFile($"[{message.Author.Id}] Executed command (DM) : " + plugin.Command);
return;
}
if (context.Channel is SocketDMChannel) await message.Channel.SendMessageAsync("This command is for administrators only !");
plugin.ExecuteDM(context); return;
else plugin.ExecuteServer(context); }
plugin.Execute(context, message, client, true);
Functions.WriteLogFile($"[{message.Author.Id}] Executed command (DM) : " + plugin.Command);
return;
}
await message.Channel.SendMessageAsync("This command is not for DMs");
return;
}
if (plugin.canUseServer)
{
if (plugin.requireAdmin)
{
if (message.Author.isAdmin())
{
plugin.Execute(context, message, client, false);
Functions.WriteLogFile($"[{message.Author.Id}] Executed command : " + plugin.Command);
return;
}
await message.Channel.SendMessageAsync("This command is for administrators only !");
return;
}
plugin.Execute(context, message, client, false);
Functions.WriteLogFile($"[{message.Author.Id}] Executed command : " + plugin.Command);
}
}
} }
catch (System.Exception ex) catch
{ {
ex.WriteErrFile();
} }
} }
} }

View File

@@ -8,7 +8,7 @@
<StartupObject /> <StartupObject />
<SignAssembly>False</SignAssembly> <SignAssembly>False</SignAssembly>
<IsPublishable>True</IsPublishable> <IsPublishable>True</IsPublishable>
<AssemblyVersion>1.0.0.13</AssemblyVersion> <AssemblyVersion>1.0.0.3</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
@@ -31,14 +30,18 @@ public class Program
[Obsolete] [Obsolete]
public static void Main(string[] args) public static void Main(string[] args)
{ {
Console.WriteLine("Loading resources ...");
Directory.CreateDirectory("./Data/Resources");
Directory.CreateDirectory("./Data/Plugins/Commands");
Directory.CreateDirectory("./Data/Plugins/Events");
PreLoadComponents().Wait(); PreLoadComponents().Wait();
do
if (!Config.ContainsKey("ServerID"))
{ {
if (!Config.ContainsKey("ServerID")) do
{ {
Console.Clear();
Console.WriteLine("Please enter the server ID: "); Console.WriteLine("Please enter the server ID: ");
Console_Utilities.WriteColorText("You can find it in the Server Settings at &r\"Widget\"&c section"); Console_Utilities.WriteColorText("You can find it in the Server Settings at &r\"Widget\"&c section");
Console.WriteLine("Example: 1234567890123456789"); Console.WriteLine("Example: 1234567890123456789");
@@ -53,48 +56,49 @@ public class Program
string SID = key.KeyChar + Console.ReadLine(); string SID = key.KeyChar + Console.ReadLine();
if (SID.Length != 18) if (SID.Length != 18)
{ {
Console.Clear(); Console.WriteLine("Your server ID is not 18 characters long. Please try again.");
Console_Utilities.WriteColorText("&rYour server ID is not 18 characters long. Please try again. \n");
continue; continue;
} }
Config.AddValueToVariables("ServerID", SID, false); Config.AddValueToVariables("ServerID", SID, false);
} }
} break;
} while (true);
if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || (Config.GetValue<string>("token")?.Length != 70 && Config.GetValue<string>("token")?.Length != 59)) }
{
Console.WriteLine("Please insert your token");
Console.Write("Token = ");
var token = Console.ReadLine();
if (token?.Length == 59 || token?.Length == 70)
Config.AddValueToVariables("token", token, true);
else
{
Console.Clear();
Console_Utilities.WriteColorText("&rThe token length is invalid !");
continue;
}
}
if (!Config.ContainsKey("prefix") || Config.GetValue<string>("prefix") == null || Config.GetValue<string>("prefix")?.Length != 1) if (!Config.ContainsKey("token") || Config.GetValue<string>("token") == null || Config.GetValue<string>("token")?.Length != 70)
{ {
Console.WriteLine("Please insert your prefix (max. 1 character long):"); Console.WriteLine("Please insert your token");
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces, numbers, '/' or '\\' allowed"); Console.Write("Token = ");
Console.Write("Prefix = "); var token = Console.ReadLine();
var prefix = Console.ReadLine()![0]; if (token?.Length == 59 || token?.Length == 70)
Config.AddValueToVariables("token", token, true);
else
Console.WriteLine("Invalid token");
if (prefix == ' ' || char.IsDigit(prefix) || prefix == '/' || prefix == '\\') Console.WriteLine("Please insert your prefix (max. 1 character long):");
{ Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces or numbers allowed");
Console.Clear(); Console.Write("Prefix = ");
Console_Utilities.WriteColorText("&rThe prefix is invalid"); var prefix = Console.ReadLine()![0];
continue;
} if (prefix == ' ' || char.IsDigit(prefix))
Config.AddValueToVariables("prefix", prefix.ToString(), false); return;
} Config.AddValueToVariables("prefix", prefix.ToString(), false);
}
if (!Config.ContainsKey("prefix") || Config.GetValue<string>("prefix") == default)
{
Console.WriteLine("Please insert your prefix (max. 1 character long):");
Console.WriteLine("For a prefix longer then one character, the first character will be saved and the others will be ignored.\n No spaces or numbers allowed");
Console.Write("Prefix = ");
var prefix = Console.ReadLine()![0];
if (prefix == ' ') return;
Config.AddValueToVariables("prefix", prefix.ToString(), false);
}
break;
} while (true);
HandleInput(args).Wait(); HandleInput(args).Wait();
} }
@@ -221,6 +225,23 @@ public class Program
return; return;
} }
if (len > 0 && args[0] == "/test")
{
int p = 1;
bool allowed = true;
Console.CancelKeyPress += (sender, e) => allowed = false;
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(100 / p);
await Task.Delay(100);
p++;
}
return;
}
if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage"))) if (len > 0 && (args.Contains("--cmd") || args.Contains("--args") || args.Contains("--nomessage")))
{ {
if (args.Contains("lp") || args.Contains("loadplugins")) if (args.Contains("lp") || args.Contains("loadplugins"))
@@ -246,13 +267,6 @@ public class Program
len = 0; len = 0;
} }
if (len > 0 && args[0] == "/updateplug")
{
string plugName = args.MergeStrings(1);
Console.WriteLine("Updating " + plugName);
await ConsoleCommandsHandler.ExecuteCommad("dwplug" + plugName);
return;
}
if (len == 0 || (args[0] != "--exec" && args[0] != "--execute")) if (len == 0 || (args[0] != "--exec" && args[0] != "--execute"))
{ {
@@ -332,12 +346,6 @@ public class Program
private static async Task PreLoadComponents() private static async Task PreLoadComponents()
{ {
Console_Utilities.ProgressBar main = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
main.Start();
Directory.CreateDirectory("./Data/Resources");
Directory.CreateDirectory("./Data/Plugins/Commands");
Directory.CreateDirectory("./Data/Plugins/Events");
Directory.CreateDirectory("./Data/PAKS");
await Config.LoadConfig(); await Config.LoadConfig();
if (Config.ContainsKey("DeleteLogsAtStartup")) if (Config.ContainsKey("DeleteLogsAtStartup"))
if (Config.GetValue<bool>("DeleteLogsAtStartup")) if (Config.GetValue<bool>("DeleteLogsAtStartup"))
@@ -367,11 +375,7 @@ public class Program
} }
} }
List<string> onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData"); List<string> onlineSettingsList = await ServerCom.ReadTextFromURL("https://raw.githubusercontent.com/Wizzy69/installer/discord-bot-files/OnlineData");
main.Stop("Loaded online settings. Loading updates ...");
foreach (var key in onlineSettingsList) foreach (var key in onlineSettingsList)
{ {
if (key.Length <= 3 || !key.Contains(' ')) continue; if (key.Length <= 3 || !key.Contains(' ')) continue;
@@ -383,47 +387,42 @@ public class Program
string newVersion = s[1]; string newVersion = s[1];
if (!newVersion.Equals(Config.GetValue<string>("Version"))) if (!newVersion.Equals(Config.GetValue<string>("Version")))
{ {
if (Functions.GetOperatingSystem() == PluginManager.Others.OperatingSystem.WINDOWS) Console.WriteLine("A new version has been released on github page.");
Console.WriteLine("Download the new version using the following link wrote in yellow");
Console_Utilities.WriteColorText("&y" + Config.GetValue<string>("GitURL") + "&c");
Console.WriteLine();
Console.WriteLine("Your product will work just fine on this outdated version, but an update is recommended.\n" +
"From now on, this version is no longer supported"
);
Console_Utilities.WriteColorText("&rUse at your own risk&c");
Console_Utilities.WriteColorText("&mCurrent Version: " + Config.GetValue<string>("Version") + "&c");
Console_Utilities.WriteColorText("&gNew Version: " + newVersion + "&c");
Console.WriteLine("\n\n");
await Task.Delay(1000);
int waitTime = 10; //wait time to proceed
Console.Write($"The bot will start in {waitTime} seconds");
while (waitTime > 0)
{ {
await Task.Delay(1000);
string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0.zip"; waitTime--;
//string url2 = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}-preview/net6.0.zip"; Console.SetCursorPosition("The bot will start in ".Length, Console.CursorTop);
Console.Write(" ");
Process.Start(".\\Updater\\Updater.exe", $"{newVersion} {url} {Process.GetCurrentProcess().ProcessName}"); Console.SetCursorPosition("The bot will start in ".Length, Console.CursorTop);
Console.Write(waitTime + " seconds");
} }
else
{
string url = $"https://github.com/Wizzy69/SethDiscordBot/releases/download/v{newVersion}/net6.0_linux.zip";
Process.Start("./Updater/Updater", $"/update {url} ./DiscordBot ./");
}
//Environment.Exit(0);
} }
break;
case "UpdaterVersion":
string updaternewversion = s[1];
if (Config.UpdaterVersion != updaternewversion)
{
Console.Clear();
Console.WriteLine("Installing updater ...\nDo NOT close the bot during update !");
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
bar.Start();
await ServerCom.DownloadFileNoProgressAsync("https://github.com/Wizzy69/installer/releases/download/release-1-discordbot/Updater.zip", "./Updater.zip");
await Functions.ExtractArchive("./Updater.zip", "./", null, UnzipProgressType.PercentageFromTotalSize);
Config.UpdaterVersion = updaternewversion;
File.Delete("Updater.zip");
await Config.SaveConfig(SaveType.NORMAL);
bar.Stop("Updater has been updated !");
Console.Clear();
}
break; break;
} }
} }
Console_Utilities.Initialize(); Console_Utilities.Initialize();
await Config.SaveConfig(SaveType.NORMAL);
Console.Clear(); Config.SaveConfig(SaveType.NORMAL);
} }
} }

View File

@@ -11,7 +11,6 @@ namespace PluginManager
{ {
internal class AppConfig internal class AppConfig
{ {
public string? UpdaterVersion { get; set; }
public Dictionary<string, object>? ApplicationVariables { get; init; } public Dictionary<string, object>? ApplicationVariables { get; init; }
public List<string>? ProtectedKeyWords { get; init; } public List<string>? ProtectedKeyWords { get; init; }
public Dictionary<string, string>? PluginVersions { get; init; } public Dictionary<string, string>? PluginVersions { get; init; }
@@ -78,8 +77,6 @@ namespace PluginManager
private static AppConfig? appConfig { get; set; } private static AppConfig? appConfig { get; set; }
public static string UpdaterVersion { get => appConfig.UpdaterVersion; set => appConfig.UpdaterVersion = value; }
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) public static void SetPluginVersion(string pluginName, string newVersion)
{ {
@@ -184,11 +181,6 @@ namespace PluginManager
SaveConfig(SaveType.NORMAL); SaveConfig(SaveType.NORMAL);
} }
public static bool IsReadOnly(string key)
{
return appConfig.ProtectedKeyWords.Contains(key);
}
public static async Task SaveConfig(SaveType type) public static async Task SaveConfig(SaveType type)
{ {
if (type == SaveType.NORMAL) if (type == SaveType.NORMAL)
@@ -228,12 +220,12 @@ namespace PluginManager
Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables."); Functions.WriteLogFile($"Loaded {appConfig.ApplicationVariables!.Keys.Count} application variables.\nLoaded {appConfig.ProtectedKeyWords!.Count} readonly variables.");
return; return;
} }
appConfig = new() { ApplicationVariables = new Dictionary<string, object>(), ProtectedKeyWords = new List<string>(), PluginVersions = new Dictionary<string, string>(), UpdaterVersion = "-1" }; appConfig = new() { ApplicationVariables = new Dictionary<string, object>(), ProtectedKeyWords = new List<string>(), PluginVersions = new Dictionary<string, string>() };
} }
public static bool ContainsValue<T>(T value) => appConfig!.ApplicationVariables!.ContainsValue(value!); public static bool ContainsValue<T>(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 IDictionary<string, object> GetAllVariables() => appConfig.ApplicationVariables; public static ReadOnlyDictionary<string, object> GetAllVariables() => new(appConfig!.ApplicationVariables!);
} }
} }

View File

@@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
@@ -29,20 +28,27 @@ public interface DBCommand
/// </summary> /// </summary>
string Usage { get; } string Usage { get; }
/// <summary>
/// true if the command can be used in a DM channel, otherwise false
/// </summary>
bool canUseDM { get; }
/// <summary>
/// true if the command can be used in a server, otherwise false
/// </summary>
bool canUseServer { get; }
/// <summary> /// <summary>
/// true if the command requre admin, otherwise false /// true if the command requre admin, otherwise false
/// </summary> /// </summary>
bool requireAdmin { get; } bool requireAdmin { get; }
/// <summary> /// <summary>
/// The main body of the command. This is what is executed when user calls the command in Server /// The main body of the command. This is what is executed when user calls the command
/// </summary> /// </summary>
/// <param name="context">The disocrd Context</param> /// <param name="context">The disocrd Context</param>
void ExecuteServer(SocketCommandContext context) { } /// <param name="message">The message that the user types</param>
/// <param name="client">The discord client of the bot</param>
/// <summary> /// <param name="isDM">true if the message was sent from DM, otherwise false. It is always false if canUseDM is false</param>
/// The main body of the command. This is what is executed when user calls the command in DM void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM);
/// </summary>
/// <param name="context">The disocrd Context</param>
void ExecuteDM(SocketCommandContext context) { }
} }

View File

@@ -14,7 +14,9 @@ using PluginManager.Interfaces;
using PluginManager.Loaders; using PluginManager.Loaders;
using PluginManager.Online; using PluginManager.Online;
using PluginManager.Online.Helpers; using PluginManager.Online.Helpers;
using PluginManager.Online.Updates;
using PluginManager.Others; using PluginManager.Others;
namespace PluginManager.Items; namespace PluginManager.Items;
public class ConsoleCommandsHandler public class ConsoleCommandsHandler
@@ -160,22 +162,13 @@ public class ConsoleCommandsHandler
path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" ? PluginLoader.pluginCMDExtension : PluginLoader.pluginEVEExtension); path = "./Data/Plugins/" + info[0] + "s/" + name + "." + (info[0] == "Command" ? PluginLoader.pluginCMDExtension : PluginLoader.pluginEVEExtension);
else else
path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}"; path = $"./{info[1].Split('/')[info[1].Split('/').Length - 1]}";
if (Others.OperatingSystem.WINDOWS == Functions.GetOperatingSystem()) //Console.WriteLine("Downloading: " + path + " [" + info[1] + "]");
{ await ServerCom.DownloadFileAsync(info[1], path);
await ServerCom.DownloadFileAsync(info[1], path); if (info[0] == "Command" || info[0] == "Event")
} if (info[0] == "Event")
else if (Others.OperatingSystem.LINUX == Functions.GetOperatingSystem()) Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Event));
{ else if (info[0] == "Command")
Others.Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); Config.PluginConfig.InstalledPlugins.Add(new(name, PluginType.Command));
bar.Start();
await ServerCom.DownloadFileNoProgressAsync(info[1], path);
bar.Stop("Plugin Downloaded !");
}
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));
Console.WriteLine("\n"); Console.WriteLine("\n");
@@ -195,26 +188,34 @@ public class ConsoleCommandsHandler
var split = line.Split(','); var split = line.Split(',');
Console.WriteLine($"\nDownloading item: {split[1]}"); Console.WriteLine($"\nDownloading item: {split[1]}");
if (File.Exists("./" + split[1])) File.Delete("./" + split[1]); if (File.Exists("./" + split[1])) File.Delete("./" + split[1]);
if (Others.OperatingSystem.WINDOWS == Functions.GetOperatingSystem()) await ServerCom.DownloadFileAsync(split[0], "./" + split[1]);
await ServerCom.DownloadFileAsync(split[0], "./" + split[1]);
else if (Others.OperatingSystem.LINUX == Functions.GetOperatingSystem())
{
Others.Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);
bar.Start();
await ServerCom.DownloadFileNoProgressAsync(split[0], "./" + split[1]);
bar.Stop("Item downloaded !");
}
Console.WriteLine(); Console.WriteLine();
if (split[0].EndsWith(".pak"))
File.Move("./" + split[1], "./Data/PAKS/" + split[1], true); if (split[0].EndsWith(".zip") || split[0].EndsWith(".pak") || split[0].EndsWith(".pkg"))
else if (split[0].EndsWith(".zip") || split[0].EndsWith(".pkg"))
{ {
Console.WriteLine($"Extracting {split[1]} ..."); Console.WriteLine($"Extracting {split[1]}");
var bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END);// { Max = 100f, Color = ConsoleColor.Green }; var proc = 0f;
bar.Start(); var isExtracting = true;
await Functions.ExtractArchive("./" + split[1], "./", null, UnzipProgressType.PercentageFromTotalSize); var bar = new Console_Utilities.ProgressBar(ProgressBarType.NORMAL) { Max = 100f, Color = ConsoleColor.Green };
bar.Stop("Extracted");
IProgress<float> extractProgress = new Progress<float>(value => { proc = value; });
new Thread(new Task(() =>
{
while (isExtracting)
{
bar.Update(proc);
if (proc >= 99.9f)
isExtracting = false;
Thread.Sleep(500);
}
}
).Start
).Start();
await Functions.ExtractArchive("./" + split[1], "./", extractProgress, UnzipProgressType.PercentageFromTotalSize);
bar.Update(100f);
isExtracting = false;
await Task.Delay(1000);
bar.Update(100);
Console.WriteLine("\n"); Console.WriteLine("\n");
File.Delete("./" + split[1]); File.Delete("./" + split[1]);
} }
@@ -225,12 +226,10 @@ public class ConsoleCommandsHandler
VersionString? ver = await VersionString.GetVersionOfPackageFromWeb(name); VersionString? ver = await VersionString.GetVersionOfPackageFromWeb(name);
if (ver is null) throw new Exception("Incorrect version"); if (ver is null) throw new Exception("Incorrect version");
Config.SetPluginVersion(name, $"{ver.PackageVersionID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}"); Config.SetPluginVersion(name, $"{ver.PackageVersionID}.{ver.PackageMainVersion}.{ver.PackageCheckVersion}");
// Console.WriteLine();
isDownloading = false; isDownloading = false;
} }
); );
@@ -278,23 +277,30 @@ public class ConsoleCommandsHandler
{ {
if (client is null) if (client is null)
return; return;
Console_Utilities.ProgressBar bar = new Console_Utilities.ProgressBar(ProgressBarType.NO_END); bool run = true;
var t = new Thread(() =>
bar.Start(); {
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.NORMAL);
await Config.SaveConfig(SaveType.BACKUP); await Config.SaveConfig(SaveType.BACKUP);
bar.Stop("Saved config !"); await Task.Delay(4000);
run = false;
Console.WriteLine(); Console.WriteLine();
await client.StopAsync(); await client.StopAsync();
await client.DisposeAsync(); await client.DisposeAsync();
await Task.Delay(1000);
Environment.Exit(0); Environment.Exit(0);
} }
); );
AddCommand("import", "Load an external command", "import [pluginName]", async (args) => AddCommand("extern", "Load an external command", "extern [pluginName]", async (args) =>
{ {
if (args.Length <= 1) return; if (args.Length <= 1) return;
string pName = Functions.MergeStrings(args, 1); string pName = Functions.MergeStrings(args, 1);

View File

@@ -79,11 +79,5 @@ namespace PluginManager.Online
pbar.Update(100f); pbar.Update(100f);
isDownloading = false; isDownloading = false;
} }
public static async Task DownloadFileNoProgressAsync(string URL, string location)
{
IProgress<float> progress = new Progress<float>();
await DownloadFileAsync(URL, location, progress);
}
} }
} }

View File

@@ -42,95 +42,24 @@ namespace PluginManager.Others
public bool NoColor { get; init; } public bool NoColor { get; init; }
public ProgressBarType type { get; set; } public ProgressBarType type { get; set; }
public int TotalLength { get; private set; }
private int BarLength = 32; private int BarLength = 32;
private int position = 1; private int position = 1;
private bool positive = true; private bool positive = true;
private bool isRunning;
public async void Start()
{
if (type != ProgressBarType.NO_END)
throw new Exception("Only NO_END progress bar can use this method");
if (isRunning)
throw new Exception("This progress bar is already running");
isRunning = true;
while (isRunning)
{
UpdateNoEnd();
await System.Threading.Tasks.Task.Delay(100);
}
}
public async void Start(string message)
{
if (type != ProgressBarType.NO_END)
throw new Exception("Only NO_END progress bar can use this method");
if (isRunning)
throw new Exception("This progress bar is already running");
isRunning = true;
TotalLength = message.Length + BarLength + 5;
while (isRunning)
{
UpdateNoEnd(message);
await System.Threading.Tasks.Task.Delay(100);
}
}
public void Stop()
{
if (type != ProgressBarType.NO_END)
throw new Exception("Only NO_END progress bar can use this method");
if (!isRunning)
throw new Exception("Can not stop a progressbar that did not start");
isRunning = false;
}
public void Stop(string message)
{
Stop();
if (message is not null)
{
Console.CursorLeft = 0;
for (int i = 0; i < BarLength + message.Length + 1; i++)
Console.Write(" ");
Console.CursorLeft = 0;
Console.WriteLine(message);
}
}
public void Update(float progress) public void Update(float progress)
{ {
if (type == ProgressBarType.NO_END) switch (type)
throw new Exception("This function is for progress bars with end"); {
case ProgressBarType.NORMAL:
UpdateNormal(progress); UpdateNormal(progress);
} return;
case ProgressBarType.NO_END:
private void UpdateNoEnd(string message) if (progress <= 99.9f)
{ UpdateNoEnd();
Console.CursorLeft = 0; return;
Console.Write("["); default:
for (int i = 1; i <= position; i++) return;
Console.Write(" "); }
Console.Write("<==()==>");
position += positive ? 1 : -1;
for (int i = position; i <= BarLength - 1 - (positive ? 0 : 2); i++)
Console.Write(" ");
Console.Write("] " + message);
if (position == BarLength - 1 || position == 1)
positive = !positive;
} }
private void UpdateNoEnd() private void UpdateNoEnd()
@@ -146,8 +75,6 @@ namespace PluginManager.Others
Console.Write("]"); Console.Write("]");
if (position == BarLength - 1 || position == 1) if (position == BarLength - 1 || position == 1)
positive = !positive; positive = !positive;
} }

View File

@@ -50,42 +50,21 @@ namespace PluginManager.Others
/// <param name="FileName">The file name that is inside the archive or its full path</param> /// <param name="FileName">The file name that is inside the archive or its full path</param>
/// <param name="archFile">The archive location from the PAKs folder</param> /// <param name="archFile">The archive location from the PAKs folder</param>
/// <returns>A string that represents the content of the file or null if the file does not exists or it has no content</returns> /// <returns>A string that represents the content of the file or null if the file does not exists or it has no content</returns>
public static async Task<string> ReadFromPakAsync(string FileName, string archFile) public static async Task<Stream?> ReadFromPakAsync(string FileName, string archFile)
{ {
archFile = pakFolder + archFile; archFile = pakFolder + archFile;
if (!File.Exists(archFile)) Directory.CreateDirectory(pakFolder);
throw new Exception("Failed to load file !"); if (!File.Exists(archFile)) throw new FileNotFoundException("Failed to load file !");
try using ZipArchive archive = ZipFile.OpenRead(archFile);
{ ZipArchiveEntry? entry = archive.GetEntry(FileName);
string textValue = null; if (entry is null) return Stream.Null;
using (var fs = new FileStream(archFile, FileMode.Open)) MemoryStream stream = new MemoryStream();
using (var zip = new ZipArchive(fs, ZipArchiveMode.Read)) await (entry?.Open()!).CopyToAsync(stream);
foreach (var entry in zip.Entries)
{
if (entry.Name == FileName || entry.FullName == FileName)
{
using (Stream s = entry.Open())
using (StreamReader reader = new StreamReader(s))
{
textValue = await reader.ReadToEndAsync();
reader.Close();
s.Close();
fs.Close();
}
}
}
return textValue;
}
catch
{
await Task.Delay(100);
return await ReadFromPakAsync(FileName, archFile);
}
return stream;
} }
/// <summary> /// <summary>
/// Write logs to file /// Write logs to file
/// </summary> /// </summary>
@@ -108,11 +87,6 @@ namespace PluginManager.Others
File.AppendAllText(errPath, ErrMessage + " \n"); File.AppendAllText(errPath, ErrMessage + " \n");
} }
public static void WriteErrFile(this Exception ex)
{
WriteErrFile(ex.ToString());
}
/// <summary> /// <summary>
/// Merge one array of strings into one string /// Merge one array of strings into one string
/// </summary> /// </summary>
@@ -194,7 +168,9 @@ namespace PluginManager.Others
/// <returns></returns> /// <returns></returns>
public static async Task ExtractArchive(string zip, string folder, IProgress<float> progress, UnzipProgressType type) public static async Task ExtractArchive(string zip, string folder, IProgress<float> progress, UnzipProgressType type)
{ {
Directory.CreateDirectory(folder); if (!Directory.Exists(folder)) Directory.CreateDirectory(folder);
using (ZipArchive archive = ZipFile.OpenRead(zip)) using (ZipArchive archive = ZipFile.OpenRead(zip))
{ {
if (type == UnzipProgressType.PercentageFromNumberOfFiles) if (type == UnzipProgressType.PercentageFromNumberOfFiles)
@@ -218,8 +194,7 @@ namespace PluginManager.Others
currentZIPFile++; currentZIPFile++;
await Task.Delay(10); await Task.Delay(10);
if (progress != null) progress.Report((float)currentZIPFile / totalZIPFiles * 100);
progress.Report((float)currentZIPFile / totalZIPFiles * 100);
} }
} }
else if (type == UnzipProgressType.PercentageFromTotalSize) else if (type == UnzipProgressType.PercentageFromTotalSize)
@@ -249,8 +224,7 @@ namespace PluginManager.Others
} }
await Task.Delay(10); await Task.Delay(10);
if (progress != null) progress.Report((float)currentSize / zipSize * 100);
progress.Report((float)currentSize / zipSize * 100);
} }
} }
} }