From 8274a22f1b0f5625db57bae0db58c33a3f7e4bd5 Mon Sep 17 00:00:00 2001 From: balos Date: Sat, 3 May 2025 16:40:35 +0200 Subject: [PATCH] react command added --- commands/admin.cs | 16 ++++--- commands/react.cs | 36 +++++++++++++++ commands/send.cs | 12 +++-- helpers/emojiextractor.cs | 48 ++++++++++++++++++++ helpers/idextractor.cs | 81 ++++++++++++++++++++++++++++++++++ logger.cs => helpers/logger.cs | 0 idextractor.cs | 62 -------------------------- program.cs | 1 + 8 files changed, 180 insertions(+), 76 deletions(-) create mode 100644 commands/react.cs create mode 100644 helpers/emojiextractor.cs create mode 100644 helpers/idextractor.cs rename logger.cs => helpers/logger.cs (100%) delete mode 100644 idextractor.cs diff --git a/commands/admin.cs b/commands/admin.cs index 4a4c819..0484da2 100644 --- a/commands/admin.cs +++ b/commands/admin.cs @@ -3,16 +3,18 @@ using DSharpPlus.CommandsNext.Attributes; using System.Threading.Tasks; using System.Linq; -public class HasAdminRole : CheckBaseAttribute +namespace T3k3rg0.Commands { - public override async Task ExecuteCheckAsync(CommandContext ctx, bool help) + public class HasAdminRole : CheckBaseAttribute { - bool hasAdminRole = ctx.Member?.Roles.Any(role => role.Name == "Admin") ?? false; - if (!hasAdminRole) + public override async Task ExecuteCheckAsync(CommandContext ctx, bool help) { - await ctx.RespondAsync("Csicskáknak kuss van !"); + bool hasAdminRole = ctx.Member?.Roles.Any(role => role.Name == "Admin") ?? false; + if (!hasAdminRole) + { + await ctx.RespondAsync("Csicskáknak kuss van !"); + } + return (hasAdminRole); } - return (hasAdminRole); } } - diff --git a/commands/react.cs b/commands/react.cs new file mode 100644 index 0000000..b41c537 --- /dev/null +++ b/commands/react.cs @@ -0,0 +1,36 @@ +using DSharpPlus.CommandsNext; +using DSharpPlus.CommandsNext.Attributes; +using System.Threading.Tasks; +using T3k3rg0.Helpers; + +namespace T3k3rg0.Commands +{ + public class React : BaseCommandModule + { + [Command("react")] + [Description("Reagál egy üzenetre ! react <üzenet> ")] + [HasAdminRole] + public async Task ReactToMessage(CommandContext ctx, string channelInput, string messageInput, string emojiInput) + { + var channel = await IdExtractor.ExtractChannelId(channelInput, ctx.Client); + if (channel == null) + { + return; + } + + var message = await IdExtractor.ExtractMessageId(messageInput, channel); + if (message == null) + { + return; + } + + var emoji = await EmojiExtractor.ExtractAsync(emojiInput, ctx.Client); + if (emoji == null) + { + await ctx.RespondAsync("Nem sikerült felismerni az emojit."); + return; + } + await message.CreateReactionAsync(emoji); + } + } +} diff --git a/commands/send.cs b/commands/send.cs index d73980d..6b8579c 100644 --- a/commands/send.cs +++ b/commands/send.cs @@ -1,26 +1,24 @@ using DSharpPlus.CommandsNext; using DSharpPlus.CommandsNext.Attributes; using System.Threading.Tasks; +using T3k3rg0.Helpers; namespace T3k3rg0.Commands { public class Send : BaseCommandModule { - [Command("sendmsg")] - [Description("Üzenetet küld ! sendmsg <üzenet>")] + [Command("send")] + [Description("Üzenetet küld ! send ")] [HasAdminRole] - public async Task SendAsync(CommandContext ctx, string channelParam, [RemainingText] string message) + public async Task SendAsync(CommandContext ctx, string channelInput, [RemainingText] string message) { - // Használjuk a ChannelHelper-t a csatorna kezeléséhez - var channel = await IdExtractor.GetChannelAsync(ctx, channelParam); + var channel = await IdExtractor.ExtractChannelId(channelInput, ctx.Client); if (channel == null) { - // Ha a csatorna érvénytelen, a ChannelHelper már válaszolt, itt nem kell további kód. return; } - // Üzenet küldése a megtalált csatornára await channel.SendMessageAsync(message); } } diff --git a/helpers/emojiextractor.cs b/helpers/emojiextractor.cs new file mode 100644 index 0000000..b602bad --- /dev/null +++ b/helpers/emojiextractor.cs @@ -0,0 +1,48 @@ +using DSharpPlus; +using DSharpPlus.Entities; +using System.Threading.Tasks; + +namespace T3k3rg0.Helpers +{ + public static class EmojiExtractor + { + public static async Task ExtractAsync(string emojInput, DiscordClient client) + { + try + { + var unicodeEmoji = DiscordEmoji.FromUnicode(emojInput); + return unicodeEmoji; + } + catch { } + + try + { + var namedEmoji = DiscordEmoji.FromName(client, emojInput); + return namedEmoji; + } + catch { } + + try + { + ulong emojiId; + + // Ha teljes emojiformátumban van (pl. <:nev:123456789012345678>) + var match = System.Text.RegularExpressions.Regex.Match(emojInput, @""); + if (match.Success && ulong.TryParse(match.Groups[1].Value, out emojiId)) + { + return DiscordEmoji.FromGuildEmote(client, emojiId); + } + + // Ha csak simán az ID-t írta be + if (ulong.TryParse(emojInput, out emojiId)) + { + return DiscordEmoji.FromGuildEmote(client, emojiId); + } + } + catch { } + + return null; + } + } +} + diff --git a/helpers/idextractor.cs b/helpers/idextractor.cs new file mode 100644 index 0000000..957aa63 --- /dev/null +++ b/helpers/idextractor.cs @@ -0,0 +1,81 @@ +using System.Threading.Tasks; +using DSharpPlus; +using DSharpPlus.Entities; + +namespace T3k3rg0.Helpers +{ + public static class IdExtractor + { + public static ulong? ExtractChannel(string channelInput) + { + if (channelInput.StartsWith("https://discord.com/channels/")) + { + var parts = channelInput.Split('/'); + if (parts.Length >= 6 && ulong.TryParse(parts[5], out ulong parsedChannelLinkId)) + return parsedChannelLinkId; + } + + else if (channelInput.StartsWith("<#") && channelInput.EndsWith(">")) + { + var trimmed = channelInput.Trim('<', '#', '>'); + if (ulong.TryParse(trimmed, out ulong parsedChannelMentionId)) + return parsedChannelMentionId; + } + else if (ulong.TryParse(channelInput, out ulong parsedRawCannelId)) + { + return parsedRawCannelId; + } + return null; + } + + public static async Task ExtractChannelId(string channelInput, DiscordClient client) + { + var channelId = ExtractChannel(channelInput); + if (channelId is null) + return null; + + try + { + var channel = await client.GetChannelAsync(channelId.Value); + return channel; + } + catch + { + return null; + } + } + public static ulong? ExtractMessage(string messageInput) + { + + if (messageInput.StartsWith("https://discord.com/channels/")) + { + var parts = messageInput.Split('/'); + if (parts.Length >= 7 && ulong.TryParse(parts[6], out ulong parsedMessageLinkId)) + return parsedMessageLinkId; + } + + else if (ulong.TryParse(messageInput, out ulong parsedRawMessageId)) + { + return parsedRawMessageId; + } + + return null; + } + + public static async Task ExtractMessageId(string messageInput, DiscordChannel channel) + { + var messageId = ExtractMessage(messageInput); + if (messageId is null) + return null; + try + { + var message = await channel.GetMessageAsync(messageId.Value); + return message; + } + catch + { + return null; + } + } + } +} diff --git a/logger.cs b/helpers/logger.cs similarity index 100% rename from logger.cs rename to helpers/logger.cs diff --git a/idextractor.cs b/idextractor.cs deleted file mode 100644 index 625f82c..0000000 --- a/idextractor.cs +++ /dev/null @@ -1,62 +0,0 @@ -using DSharpPlus.CommandsNext; -using DSharpPlus.Entities; -using System.Threading.Tasks; - -namespace T3k3rg0 -{ - class IdExtractor - { - public static async Task GetChannelAsync(CommandContext ctx, string channelParam) - { - ulong channelId; - - if (channelParam.StartsWith("https://discord.com/channels/")) - { - // Linkből szedjük ki - var parts = channelParam.Split('/'); - if (parts.Length >= 4 && ulong.TryParse(parts[4], out ulong parsedChannelId)) - { - channelId = parsedChannelId; - } - else - { - await ctx.RespondAsync("Érvénytelen csatorna link."); - return null; - } - } - else if (channelParam.StartsWith("<#") && channelParam.EndsWith(">")) - { - // Mentionből szedjük ki - var idPart = channelParam.Trim('<', '#', '>'); - if (ulong.TryParse(idPart, out ulong parsedMentionId)) - { - channelId = parsedMentionId; - } - else - { - await ctx.RespondAsync("Érvénytelen csatorna mention."); - return null; - } - } - else if (ulong.TryParse(channelParam, out ulong parsedId)) - { - // Simán ID - channelId = parsedId; - } - else - { - await ctx.RespondAsync("Érvénytelen csatorna azonosító, mention vagy link."); - return null; - } - - var channel = await ctx.Client.GetChannelAsync(channelId); - if (channel == null) - { - await ctx.RespondAsync("Nem találom a csatornát."); - return null; - } - - return channel; - } - } -} diff --git a/program.cs b/program.cs index a464aad..a87ef95 100644 --- a/program.cs +++ b/program.cs @@ -32,6 +32,7 @@ namespace T3k3rg0 commands.RegisterCommands(); commands.RegisterCommands(); + commands.RegisterCommands(); ReactionRoleHandler.Register(discord); await discord.ConnectAsync();