diff --git a/DiscordBot/Bot/Actions/Extra/SettingsConfigExtra.cs b/DiscordBot/Bot/Actions/Extra/SettingsConfigExtra.cs index eac1966..9d78f7b 100644 --- a/DiscordBot/Bot/Actions/Extra/SettingsConfigExtra.cs +++ b/DiscordBot/Bot/Actions/Extra/SettingsConfigExtra.cs @@ -1,10 +1,12 @@ using System.Linq; using PluginManager; +using PluginManager.Loaders; namespace DiscordBot.Bot.Actions.Extra; internal static class SettingsConfigExtra { + internal static void SetSettings(string key, params string[] value) { if (key is null) return; diff --git a/DiscordBot/Bot/Commands/SlashCommands/Help.cs b/DiscordBot/Bot/Commands/SlashCommands/Help.cs index 7ba6f0a..b36a443 100644 --- a/DiscordBot/Bot/Commands/SlashCommands/Help.cs +++ b/DiscordBot/Bot/Commands/SlashCommands/Help.cs @@ -14,6 +14,8 @@ public class Help: DBSlashCommand public string Description => "This command allows you to check all loaded commands"; public bool canUseDM => true; + public bool HasInteraction => false; + public List Options => new() { @@ -31,7 +33,7 @@ public class Help: DBSlashCommand embedBuilder.WithTitle("Help Command"); embedBuilder.WithColor(Functions.RandomColor); var slashCommands = PluginLoader.SlashCommands; - var options = context.Data.Options; + var options = context.Data.Options; //Console.WriteLine("Options: " + options.Count); if (options is null || options.Count == 0) @@ -40,7 +42,7 @@ public class Help: DBSlashCommand if (options.Count > 0) { - var commandName = options.First().Value; + var commandName = options.First().Value; var slashCommand = slashCommands.FirstOrDefault(x => x.Name.TrimEnd() == commandName.ToString()); if (slashCommand is null) { diff --git a/ExtendedDiscordUIControls/Controls/Dropdown.cs b/ExtendedDiscordUIControls/Controls/Dropdown.cs new file mode 100644 index 0000000..9abb2be --- /dev/null +++ b/ExtendedDiscordUIControls/Controls/Dropdown.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ExtendedDiscordUIControls.Controls.SubItems; + +namespace ExtendedDiscordUIControls.Controls +{ + public class Dropdown + { + public List Items { get; private set; } + + public Dropdown(List items) { + Items = items; + } + + + + } +} diff --git a/ExtendedDiscordUIControls/Controls/SubItems/DropDownItem.cs b/ExtendedDiscordUIControls/Controls/SubItems/DropDownItem.cs new file mode 100644 index 0000000..026ae8f --- /dev/null +++ b/ExtendedDiscordUIControls/Controls/SubItems/DropDownItem.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ExtendedDiscordUIControls.Controls.SubItems +{ + public class DropDownItem + { + public string Title { get; private set; } + public string Description { get; private set; } + + public DropDownItem(string title, string description) + { + Title = title; + Description = description; + } + } +} diff --git a/ExtendedDiscordUIControls/ExtendedDiscordUIControls.csproj b/ExtendedDiscordUIControls/ExtendedDiscordUIControls.csproj new file mode 100644 index 0000000..4b0319f --- /dev/null +++ b/ExtendedDiscordUIControls/ExtendedDiscordUIControls.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/PluginManager/Bot/CommandHandler.cs b/PluginManager/Bot/CommandHandler.cs index 13307e0..1789a80 100644 --- a/PluginManager/Bot/CommandHandler.cs +++ b/PluginManager/Bot/CommandHandler.cs @@ -51,7 +51,6 @@ internal class CommandHandler if (plugin is null) throw new Exception("Failed to run command !"); - if (arg.Channel is SocketDMChannel) plugin.ExecuteDM(arg); else plugin.ExecuteServer(arg); diff --git a/PluginManager/Config.cs b/PluginManager/Config.cs index c195567..d73d5db 100644 --- a/PluginManager/Config.cs +++ b/PluginManager/Config.cs @@ -30,6 +30,9 @@ public class Config public static Logger Logger; public static SettingsDictionary AppSettings; + internal static string PluginDatabase => AppSettings["PluginDatabase"]; + internal static string ServerID => AppSettings["ServerID"]; + public static InternalActionManager InternalActionManager; public static PluginsManager PluginsManager; diff --git a/PluginManager/Interfaces/DBSlashCommand.cs b/PluginManager/Interfaces/DBSlashCommand.cs index 7cb1782..35b06ad 100644 --- a/PluginManager/Interfaces/DBSlashCommand.cs +++ b/PluginManager/Interfaces/DBSlashCommand.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Threading.Tasks; + using Discord; using Discord.WebSocket; @@ -8,14 +10,15 @@ public interface DBSlashCommand { string Name { get; } string Description { get; } - bool canUseDM { get; } + bool HasInteraction { get; } List Options { get; } void ExecuteServer(SocketSlashCommand context) - { - } + { } void ExecuteDM(SocketSlashCommand context) { } + + Task ExecuteInteraction(SocketInteraction interaction) => Task.CompletedTask; } diff --git a/PluginManager/Loaders/PluginLoader.cs b/PluginManager/Loaders/PluginLoader.cs index d009917..692a820 100644 --- a/PluginManager/Loaders/PluginLoader.cs +++ b/PluginManager/Loaders/PluginLoader.cs @@ -36,6 +36,8 @@ public class PluginLoader var loader = new Loader(Config.AppSettings["PluginFolder"], "dll"); + //await this.ResetSlashCommands(); + loader.OnFileLoadedException += FileLoadedException; loader.OnPluginLoaded += OnPluginLoaded; @@ -47,7 +49,7 @@ public class PluginLoader Config.Logger.Log(result.ErrorMessage, typeof(PluginLoader), LogType.ERROR); } - private void OnPluginLoaded(PluginLoadResultData result) + private async void OnPluginLoaded(PluginLoadResultData result) { switch (result.PluginType) { @@ -64,11 +66,15 @@ public class PluginLoader break; case PluginType.SLASH_COMMAND: - if (this.TryStartSlashCommand((DBSlashCommand)result.Plugin)) + if (await this.TryStartSlashCommand((DBSlashCommand)result.Plugin)) { + if(((DBSlashCommand)result.Plugin).HasInteraction) + _Client.InteractionCreated += ((DBSlashCommand)result.Plugin).ExecuteInteraction; SlashCommands.Add((DBSlashCommand)result.Plugin); OnSlashCommandLoaded?.Invoke(result); - } + } + else + Config.Logger.Log($"Failed to start slash command {result.PluginName}", typeof(PluginLoader), LogType.ERROR); break; case PluginType.UNKNOWN: default: @@ -76,6 +82,4 @@ public class PluginLoader break; } } - - } diff --git a/PluginManager/Loaders/PluginLoaderExtensions.cs b/PluginManager/Loaders/PluginLoaderExtensions.cs index 01c99e4..2045040 100644 --- a/PluginManager/Loaders/PluginLoaderExtensions.cs +++ b/PluginManager/Loaders/PluginLoaderExtensions.cs @@ -1,5 +1,10 @@ using System; +using System.Collections.Generic; +using System.Threading.Tasks; + using Discord; +using Discord.WebSocket; + using PluginManager.Interfaces; using PluginManager.Others; @@ -27,22 +32,60 @@ internal static class PluginLoaderExtensions } } - internal static bool TryStartSlashCommand(this PluginLoader pluginLoader, DBSlashCommand? dbSlashCommand) + internal static async Task ResetSlashCommands(this PluginLoader pluginLoader) + { + await pluginLoader._Client.Rest.DeleteAllGlobalCommandsAsync(); + + if(pluginLoader._Client.Guilds.Count == 0) return; + if (!ulong.TryParse(Config.ServerID, out _)) + { + Config.Logger.Log("Invalid ServerID in config file. Can not reset specific guild commands", typeof(PluginLoader), LogType.ERROR); + return; + } + + SocketGuild? guild = pluginLoader._Client.GetGuild(ulong.Parse(Config.ServerID)); + if(guild is null) + { + Config.Logger.Log("Failed to get guild with ID " + Config.ServerID, typeof(PluginLoader), LogType.ERROR); + return; + } + + await guild.DeleteApplicationCommandsAsync(); + + Config.Logger.Log($"Cleared all slash commands from guild {guild.Id}", typeof(PluginLoader)); + } + + internal static async Task TryStartSlashCommand(this PluginLoader pluginLoader, DBSlashCommand? dbSlashCommand) { try { if (dbSlashCommand is null) { - throw new ArgumentNullException(nameof(dbSlashCommand)); + //throw new ArgumentNullException(nameof(dbSlashCommand)); + return false; } + if (pluginLoader._Client.Guilds.Count == 0) return false; + + var builder = new SlashCommandBuilder(); builder.WithName(dbSlashCommand.Name); builder.WithDescription(dbSlashCommand.Description); builder.WithDMPermission(dbSlashCommand.canUseDM); builder.Options = dbSlashCommand.Options; - pluginLoader._Client.CreateGlobalApplicationCommandAsync(builder.Build()); + if (uint.TryParse(Config.ServerID, out uint result)) + { + SocketGuild? guild = pluginLoader._Client.GetGuild(result); + if (guild is null) + { + Config.Logger.Log("Failed to get guild with ID " + Config.ServerID, typeof(PluginLoader), LogType.ERROR); + return false; + } + + await guild.CreateApplicationCommandAsync(builder.Build()); + }else await pluginLoader._Client.CreateGlobalApplicationCommandAsync(builder.Build()); + return true; } catch (Exception e) diff --git a/PluginManager/Online/PluginsManager.cs b/PluginManager/Online/PluginsManager.cs index 8ea82b7..1f61de8 100644 --- a/PluginManager/Online/PluginsManager.cs +++ b/PluginManager/Online/PluginsManager.cs @@ -62,28 +62,28 @@ public class PluginsManager public async Task RemovePluginFromDatabase(string pluginName) { - List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); + List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.PluginDatabase)); installedPlugins.RemoveAll(p => p.PluginName == pluginName); - await JsonManager.SaveToJsonFile( Config.AppSettings["PluginDatabase"],installedPlugins); + await JsonManager.SaveToJsonFile( Config.PluginDatabase,installedPlugins); } public async Task AppendPluginToDatabase(PluginInfo pluginData) { - List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); + List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.PluginDatabase)); installedPlugins.Add(pluginData); - await JsonManager.SaveToJsonFile( Config.AppSettings["PluginDatabase"],installedPlugins); + await JsonManager.SaveToJsonFile( Config.PluginDatabase, installedPlugins); } public async Task> GetInstalledPlugins() { - return await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); + return await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.PluginDatabase)); } public async Task IsPluginInstalled(string pluginName) { - List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); + List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.PluginDatabase)); return installedPlugins.Any(plugin => plugin.PluginName == pluginName); }