diff --git a/commands/react.cs b/commands/react.cs index b41c537..f951f76 100644 --- a/commands/react.cs +++ b/commands/react.cs @@ -27,7 +27,6 @@ namespace T3k3rg0.Commands 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/reactionrolemanager.cs b/commands/reactionrolemanager.cs new file mode 100644 index 0000000..06feab1 --- /dev/null +++ b/commands/reactionrolemanager.cs @@ -0,0 +1,67 @@ +using DSharpPlus.CommandsNext; +using DSharpPlus.CommandsNext.Attributes; +using DSharpPlus.Entities; +using System.Threading.Tasks; +using T3k3rg0.Helpers; + +namespace T3k3rg0.Commands +{ + public class ReactionRoleManager : BaseCommandModule + { + [Command("addreactionrole")] + [Description("Hozzáad egy új reaction role-t ! reactionrole <üzenet> <@szerep>")] + [HasAdminRole] + public async Task AddReactionRole(CommandContext ctx, string channelInput, string messageInput, string emojiInput, DiscordRole role) + { + 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) + return; + + bool inserted = ReactionRoleStorage.TryAddReactionRole(message.Id, emoji.ToString(), role.Id); + if (!inserted) + return; + + await message.CreateReactionAsync(emoji); + } + [Command("removereactionrole")] + [Description("Eltávolít egy meglévő reaction role-t ! removereactionrole <üzenet> ")] + [HasAdminRole] + public async Task RemoveReactionRole(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) + { + return; + } + + bool removed = ReactionRoleStorage.TryRemoveReactionRole(message.Id, emoji.ToString()); + if (!removed) + { + return; + } + + await message.DeleteOwnReactionAsync(emoji); + } + } +} + diff --git a/helpers/reactionrolestorage.cs b/helpers/reactionrolestorage.cs new file mode 100644 index 0000000..dae5288 --- /dev/null +++ b/helpers/reactionrolestorage.cs @@ -0,0 +1,65 @@ +using Microsoft.Data.Sqlite; +using System; + +namespace T3k3rg0.Helpers +{ + public static class ReactionRoleStorage + { + private static readonly string DbPath = Environment.GetEnvironmentVariable("DB_ROLES_LOC"); + + public static ulong? GetRoleId(ulong messageId, string emojiRaw) + { + using var conn = new SqliteConnection($"Data Source={DbPath}"); + conn.Open(); + + using var cmd = conn.CreateCommand(); + cmd.CommandText = @" + SELECT role_id FROM reaction_roles + WHERE message_id = @msg AND emoji = @emoji"; + cmd.Parameters.AddWithValue("@msg", (long)messageId); + cmd.Parameters.AddWithValue("@emoji", emojiRaw); + + using var reader = cmd.ExecuteReader(); + if (reader.Read()) + { + return (ulong)(long)reader["role_id"]; + } + + return null; + } + + public static bool TryAddReactionRole(ulong messageId, string emojiRaw, ulong roleId) + { + using var conn = new SqliteConnection($"Data Source={DbPath}"); + conn.Open(); + + using var cmd = conn.CreateCommand(); + cmd.CommandText = @" + INSERT OR IGNORE INTO reaction_roles (message_id, emoji, role_id) + VALUES (@msg, @emoji, @role)"; + cmd.Parameters.AddWithValue("@msg", (long)messageId); + cmd.Parameters.AddWithValue("@emoji", emojiRaw); + cmd.Parameters.AddWithValue("@role", (long)roleId); + + int rowsAffected = cmd.ExecuteNonQuery(); + return rowsAffected > 0; + } + + public static bool TryRemoveReactionRole(ulong messageId, string emojiRaw) + { + using var conn = new SqliteConnection($"Data Source={DbPath}"); + conn.Open(); + + using var cmd = conn.CreateCommand(); + cmd.CommandText = @" + DELETE FROM reaction_roles + WHERE message_id = @msg AND emoji = @emoji"; + cmd.Parameters.AddWithValue("@msg", (long)messageId); + cmd.Parameters.AddWithValue("@emoji", emojiRaw); + + int rowsAffected = cmd.ExecuteNonQuery(); + return rowsAffected > 0; + } + } +} + diff --git a/program.cs b/program.cs index a87ef95..f4aa47b 100644 --- a/program.cs +++ b/program.cs @@ -33,6 +33,7 @@ namespace T3k3rg0 commands.RegisterCommands(); commands.RegisterCommands(); commands.RegisterCommands(); + commands.RegisterCommands(); ReactionRoleHandler.Register(discord); await discord.ConnectAsync();