using DSharpPlus; using DSharpPlus.EventArgs; using Microsoft.Data.Sqlite; using System.Threading.Tasks; using System; namespace T3k3rg0 { public static class ReactionRoleHandler { public static void Register(DiscordClient discord) { discord.MessageReactionAdded += OnReactionAdded; discord.MessageReactionRemoved += OnReactionRemoved; } private static async Task OnReactionAdded(DiscordClient client, MessageReactionAddEventArgs e) { if (e.User.IsBot) return; var dbPath = Environment.GetEnvironmentVariable("DB_ROLES_LOC"); using var connection = new SqliteConnection($"Data Source={dbPath}"); connection.Open(); var command = connection.CreateCommand(); command.CommandText = @"SELECT role_id FROM reaction_roles WHERE message_id = $message_id AND emoji = $emoji"; command.Parameters.AddWithValue("$message_id", e.Message.Id); command.Parameters.AddWithValue("$emoji", e.Emoji.ToString()); var roleId = (long?)command.ExecuteScalar(); if (roleId == null) return; var member = await e.Guild.GetMemberAsync(e.User.Id); var role = e.Guild.GetRole((ulong)roleId); await member.GrantRoleAsync(role); } private static async Task OnReactionRemoved(DiscordClient client, MessageReactionRemoveEventArgs e) { if (e.User.IsBot) return; var dbPath = Environment.GetEnvironmentVariable("DB_ROLES_LOC"); using var connection = new SqliteConnection($"Data Source={dbPath}"); connection.Open(); var command = connection.CreateCommand(); command.CommandText = @"SELECT role_id FROM reaction_roles WHERE message_id = $message_id AND emoji = $emoji"; command.Parameters.AddWithValue("$message_id", e.Message.Id); command.Parameters.AddWithValue("$emoji", e.Emoji.ToString()); var roleId = (long?)command.ExecuteScalar(); if (roleId == null) return; var member = await e.Guild.GetMemberAsync(e.User.Id); var role = e.Guild.GetRole((ulong)roleId); await member.RevokeRoleAsync(role); } } }