diff --git a/FluxPoseDiscordBot/ActionsBase.cs b/FluxPoseDiscordBot/ActionsBase.cs deleted file mode 100644 index a1c11ed..0000000 --- a/FluxPoseDiscordBot/ActionsBase.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FluxPose.DiscordBot -{ - public abstract class ActionsBase(TContext context) where TContext : IInteractionContext - { - public ulong GuildId => context.Interaction.Guild?.Id ?? throw new InvalidOperationException("Action cannot be performed outside of a server."); - } -} diff --git a/FluxPoseDiscordBot/Experimenting/Actions.cs b/FluxPoseDiscordBot/Experimenting/Actions.cs deleted file mode 100644 index 3b8fc95..0000000 --- a/FluxPoseDiscordBot/Experimenting/Actions.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace FluxPose.DiscordBot.Experimenting; - -public class Actions(Users.Actions usersActions, GatewayClient client, TContext context) : ActionsBase(context) where TContext : IInteractionContext -{ - public async Task GetRandomUserFromGuild() - { - var users = await usersActions.GetAllUsersFromGuild(); - - var index = new Random().Next(users.Count); - return users[index]; - } - - public async Task RemoveRoleFromAllUsers(ulong roleId) - { - var users = await usersActions.GetAllUsersFromGuild(); - - foreach (var user in users) - { - if (user.RoleIds.Contains(roleId)) - { - continue; - } - - await client.Rest.RemoveGuildUserRoleAsync(GuildId, user.Id, roleId); - } - } - - public async Task> GetAllGuildEmoji() - { - return await client.Rest.GetGuildEmojisAsync(GuildId); - } -} diff --git a/FluxPoseDiscordBot/Experimenting/ButtonCommands.cs b/FluxPoseDiscordBot/Experimenting/ButtonCommands.cs deleted file mode 100644 index fb14ea1..0000000 --- a/FluxPoseDiscordBot/Experimenting/ButtonCommands.cs +++ /dev/null @@ -1,16 +0,0 @@ -using NetCord.Services.ComponentInteractions; - -namespace FluxPose.DiscordBot.Experimenting; - -public class ButtonCommands : ComponentInteractionModule -{ - [ComponentInteraction("testButton")] - public async Task RespondToTestButton() - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - - await Context.Message.ModifyAsync(message => message.WithContent($"{Context.Message.Content}a")); - - await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Clicked!")); - } -} \ No newline at end of file diff --git a/FluxPoseDiscordBot/Experimenting/SlashCommands.cs b/FluxPoseDiscordBot/Experimenting/SlashCommands.cs deleted file mode 100644 index 0a02fd9..0000000 --- a/FluxPoseDiscordBot/Experimenting/SlashCommands.cs +++ /dev/null @@ -1,107 +0,0 @@ -namespace FluxPose.DiscordBot.Experimenting; - -public class SlashCommands(Actions experimentingActions, Users.Actions usersActions, Roles.Actions rolesActions, GatewayClient client) : ApplicationCommandModule -{ - [SlashCommand("randomuser", "Get a random user from the server")] - public async Task GetRandomUserCommand() - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - var randomUser = await experimentingActions.GetRandomUserFromGuild(); - - if (randomUser == null) - { - return $"Found no users :("; - } - - return $"Here's a random user: {randomUser.Username}"; - } - - [SlashCommand("getroles", "Get all roles on the server")] - public async Task GetRolesCommand() - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - - var roles = await rolesActions.GetRolesFromGuild(); - - roles = [.. roles.Where(role => !role.Name.StartsWith('@'))]; - - if (roles.Count == 0) - { - return $"Found no roles :("; - } - - return $"Roles in the server:\n{String.Join("\n", roles.Select(role => $"- {role.Id}: {role.Name}"))}"; - } - - [SlashCommand("giveroletouser", "Give a role")] - public async Task GiveRoleToAllUsersCommand(string userId, string roleId) - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - - var parsed = ulong.TryParse(userId, out ulong userIdParsed); - if (!parsed) - { - return "Invalid roleId"; - } - - parsed = ulong.TryParse(roleId, out ulong roleIdParsed); - if (!parsed) - { - return "Invalid roleId"; - } - - await rolesActions.GiveRoleToUser(userIdParsed, roleIdParsed); - - return "Done."; - } - - [SlashCommand("removerolefromallusers", "Remove role from all users on the server")] - public async Task RemoveRoleFromAllUsersCommand(string roleId) - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - - var parsed = ulong.TryParse(roleId, out ulong roleIdParsed); - if (!parsed) - { - return "Invalid roleId"; - } - - await experimentingActions.RemoveRoleFromAllUsers(roleIdParsed); - - return "Done."; - } - - [SlashCommand("defer", "Defer")] - public async Task DeferCommand() - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - - Thread.Sleep(2000); - - await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Sup")); - - Thread.Sleep(1000); - - await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Sup bitches")); - } - - [SlashCommand("button", "Gives a button")] - public async Task ButtonCommand() - { - await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); - - var emojis = await experimentingActions.GetAllGuildEmoji(); - - EmojiProperties? emoji = null; - if (emojis.Count > 0) - { - emoji = EmojiProperties.Custom(emojis[new Random().Next(emojis.Count)].Id); - } - - var button = new ButtonProperties("testButton", "Click Me!", emoji!, ButtonStyle.Primary); - - var component = new ActionRowProperties([button]); - - await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Here's a button").WithComponents([component])); - } -} diff --git a/FluxPoseDiscordBot/FluxPoseDiscordBot.csproj b/FluxPoseDiscordBot/FluxPoseDiscordBot.csproj index 2f3866e..50b864a 100644 --- a/FluxPoseDiscordBot/FluxPoseDiscordBot.csproj +++ b/FluxPoseDiscordBot/FluxPoseDiscordBot.csproj @@ -5,7 +5,6 @@ net9.0 enable enable - FluxPose.DiscordBot @@ -21,4 +20,5 @@ PreserveNewest + \ No newline at end of file diff --git a/FluxPoseDiscordBot/GlobalSetup.cs b/FluxPoseDiscordBot/GlobalSetup.cs deleted file mode 100644 index fdee568..0000000 --- a/FluxPoseDiscordBot/GlobalSetup.cs +++ /dev/null @@ -1,10 +0,0 @@ -global using NetCord; -global using NetCord.Gateway; -global using NetCord.Rest; -global using NetCord.Services.ApplicationCommands; -global using NetCord.Services; -global using System; -global using System.Collections.Generic; -global using System.Linq; -global using System.Text; -global using System.Threading.Tasks; \ No newline at end of file diff --git a/FluxPoseDiscordBot/Program.cs b/FluxPoseDiscordBot/Program.cs index f062ed6..4e97f0f 100644 --- a/FluxPoseDiscordBot/Program.cs +++ b/FluxPoseDiscordBot/Program.cs @@ -1,15 +1,20 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.VisualBasic; +using NetCord; +using NetCord.Gateway; using NetCord.Hosting.Gateway; using NetCord.Hosting.Services; using NetCord.Hosting.Services.ApplicationCommands; using NetCord.Hosting.Services.ComponentInteractions; +using NetCord.Rest; +using NetCord.Services.ApplicationCommands; using NetCord.Services.ComponentInteractions; +using System.ComponentModel; +using System.Linq; -namespace FluxPose.DiscordBot; - -internal static class Program +public static class Program { public static void Main(string[] args) { @@ -23,30 +28,204 @@ internal static class Program .AddApplicationCommands() .AddComponentInteractions(); - AddActions(builder.Services); - var host = builder.Build(); var configuration = host.Services.GetRequiredService(); - var token = Environment.GetEnvironmentVariable("BOT_TOKEN"); - if (token != null) - { - configuration["Discord:Token"] = token; - } + //configuration["Discord:Token"] = Environment.GetEnvironmentVariable("BOT_TOKEN"); host.AddModules(typeof(Program).Assembly); host.RunAsync().GetAwaiter().GetResult(); } +} - private static void AddActions(IServiceCollection services) +public class SlashCommands(GatewayClient client) : ApplicationCommandModule +{ + private ulong GuildId => GetGuildId() ?? throw new InvalidOperationException("Command cannot be used outside of a server."); + + [SlashCommand("randomuser", "Get a random user from the server")] + public async Task GetRandomUserCommand() { - services.AddScoped(); - services.AddScoped(); + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + var randomUser = await GetRandomUserFromGuild(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + if (randomUser == null) + { + return $"Found no users :("; + } + + return $"Here's a random user: {randomUser.Username}"; + } + + [SlashCommand("getroles", "Get all roles on the server")] + public async Task GetRolesCommand() + { + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + var roles = await GetRolesFromGuild(); + + roles = [.. roles.Where(role => !role.Name.StartsWith('@'))]; + + if (roles.Count == 0) + { + return $"Found no roles :("; + } + + return $"Roles in the server:\n{String.Join("\n", roles.Select(role => $"- {role.Id}: {role.Name}"))}"; + } + + [SlashCommand("giveroletoallusers", "Give role to all users on the server")] + public async Task GiveRoleToAllUsersCommand(string roleId) + { + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + var parsed = ulong.TryParse(roleId, out ulong roleIdParsed); + if (!parsed) + { + return "Invalid roleId"; + } + + await GiveRoleToAllUsers(roleIdParsed); + + return "Done."; + } + + [SlashCommand("removerolefromallusers", "Remove role from all users on the server")] + public async Task RemoveRoleFromAllUsersCommand(string roleId) + { + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + var parsed = ulong.TryParse(roleId, out ulong roleIdParsed); + if (!parsed) + { + return "Invalid roleId"; + } + + await RemoveRoleFromAllUsers(roleIdParsed); + + return "Done."; + } + + [SlashCommand("defer", "Defer")] + public async Task DeferCommand() + { + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + Thread.Sleep(2000); + + await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Sup")); + + Thread.Sleep(1000); + + await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Sup bitches")); + } + + //[SlashCommand("button", "Gives a button")] + //public async Task ButtonCommand() + //{ + // await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + // var emojis = await client.Rest.GetGuildEmojisAsync(GuildId); + + // EmojiProperties? emoji = null; + // if (emojis.Count > 0) + // { + // emoji = EmojiProperties.Custom(emojis[new Random().Next(emojis.Count)].Id); + // } + + // var button = new ButtonProperties(TestButtonId, "Click Me!", emoji!, ButtonStyle.Primary); + + // var component = new ActionRowProperties([button]); + + // await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Here's a button").WithComponents([component])); + //} + + [SlashCommand("button", "Gives a button")] + public async Task ButtonCommand() + { + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + var emojis = await client.Rest.GetGuildEmojisAsync(GuildId); + + EmojiProperties? emoji = null; + if (emojis.Count > 0) + { + emoji = EmojiProperties.Custom(emojis[new Random().Next(emojis.Count)].Id); + } + + var button = new ButtonProperties("testButton", "Click Me!", emoji!, ButtonStyle.Primary); + + var component = new ActionRowProperties([button]); + + await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Here's a button").WithComponents([component])); + } + + private ulong? GetGuildId() + { + return Context.Guild?.Id; + } + + private async Task GetRandomUserFromGuild() + { + var users = await GetAllUsersFromGuild(); + + var index = new Random().Next(users.Count); + return users[index]; + } + + private async Task> GetAllUsersFromGuild() + { + var users = await client.Rest.GetGuildUsersAsync(GuildId).ToListAsync(); + if (users == null) + { + return []; + } + + return users; + } + + private async Task> GetRolesFromGuild() + { + var roles = (await client.Rest.GetGuildRolesAsync(GuildId)).ToList(); + return roles; + } + + private async Task GiveRoleToAllUsers(ulong roleId) + { + var users = await GetAllUsersFromGuild(); + + foreach (var user in users) + { + await client.Rest.AddGuildUserRoleAsync(GuildId, user.Id, roleId); + } + } + + private async Task RemoveRoleFromAllUsers(ulong roleId) + { + var users = await GetAllUsersFromGuild(); + + foreach (var user in users) + { + if (user.RoleIds.Contains(roleId)) + { + continue; + } + + await client.Rest.RemoveGuildUserRoleAsync(GuildId, user.Id, roleId); + } } } + +public class ButtonCommands : ComponentInteractionModule +{ + [ComponentInteraction("testButton")] + public async Task RespondToTestButton() + { + await Context.Interaction.SendResponseAsync(InteractionCallback.DeferredMessage()); + + await Context.Message.ModifyAsync(message => message.WithContent($"{Context.Message.Content}a")); + + await Context.Interaction.ModifyResponseAsync(message => message.WithContent("Clicked!")); + } +} \ No newline at end of file diff --git a/FluxPoseDiscordBot/Roles/Actions.cs b/FluxPoseDiscordBot/Roles/Actions.cs deleted file mode 100644 index 5f605c8..0000000 --- a/FluxPoseDiscordBot/Roles/Actions.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace FluxPose.DiscordBot.Roles; - -public class Actions(Users.Actions usersActions, GatewayClient client, TContext context) : ActionsBase(context) where TContext : IInteractionContext -{ - public async Task> GetRolesFromGuild() - { - var roles = (await client.Rest.GetGuildRolesAsync(GuildId)).ToList(); - return roles; - } - - public async Task GiveRoleToUser(ulong userId, ulong roleId) - { - await client.Rest.AddGuildUserRoleAsync(GuildId, userId, roleId); - } -} diff --git a/FluxPoseDiscordBot/Roles/SlashCommands.cs b/FluxPoseDiscordBot/Roles/SlashCommands.cs deleted file mode 100644 index 59b8cc2..0000000 --- a/FluxPoseDiscordBot/Roles/SlashCommands.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FluxPose.DiscordBot.Roles; - -public class SlashCommands -{ -} diff --git a/FluxPoseDiscordBot/Users/Actions.cs b/FluxPoseDiscordBot/Users/Actions.cs deleted file mode 100644 index bdf7eab..0000000 --- a/FluxPoseDiscordBot/Users/Actions.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace FluxPose.DiscordBot.Users; - -public class Actions(GatewayClient client, TContext context) : ActionsBase(context) where TContext : IInteractionContext -{ - public async Task> GetAllUsersFromGuild() - { - var users = await client.Rest.GetGuildUsersAsync(GuildId).ToListAsync(); - if (users == null) - { - return []; - } - - return users; - } -} diff --git a/FluxPoseDiscordBot/appsettings.json b/FluxPoseDiscordBot/appsettings.json index 8f9175c..a45fb6d 100644 --- a/FluxPoseDiscordBot/appsettings.json +++ b/FluxPoseDiscordBot/appsettings.json @@ -1,5 +1,5 @@ { "Discord": { - "Token": "MTQzOTk1MjIzMzAxMjY1ODI2Ng.GePLJF.ljh--yyvzz3Os5t8kZlhNnHnJuT-gQxpjGAgyA" + "Token": "Token from Discord Developer Portal" } } \ No newline at end of file