diff --git a/bot.csproj b/bot.csproj index e69c23d..8c94810 100644 --- a/bot.csproj +++ b/bot.csproj @@ -12,12 +12,6 @@ - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - diff --git a/commands/napiszar.cs b/commands/napiszar.cs deleted file mode 100644 index 0447649..0000000 --- a/commands/napiszar.cs +++ /dev/null @@ -1,25 +0,0 @@ -using DSharpPlus.CommandsNext; -using DSharpPlus.CommandsNext.Attributes; -using System.Threading.Tasks; -using T3k3rg0.Helpers; - -namespace T3k3rg0.Commands -{ - public class Napiszar : BaseCommandModule - { - [Command("napiszar")] - [Description("Elküld egy napiszart.")] - public async Task GetNapiszar(CommandContext ctx) - { - if (NapiszarService.HasUsedToday(ctx.User.Id)) - { - await ctx.RespondAsync("Ma már megkaptad a szarodat"); - return; - } - - string napiszar = NapiszarService.GetRandomSzar(); - NapiszarService.LogUsage(ctx.User.Id); - await ctx.RespondAsync(napiszar); - } - } -} diff --git a/commands/reactionrolemanager.cs b/commands/reactionrolemanager.cs index 8058f20..06feab1 100644 --- a/commands/reactionrolemanager.cs +++ b/commands/reactionrolemanager.cs @@ -2,7 +2,6 @@ using DSharpPlus.CommandsNext; using DSharpPlus.CommandsNext.Attributes; using DSharpPlus.Entities; using System.Threading.Tasks; -using System.Text; using T3k3rg0.Helpers; namespace T3k3rg0.Commands @@ -12,66 +11,56 @@ namespace T3k3rg0.Commands [Command("addreactionrole")] [Description("Hozzáad egy új reaction role-t ! reactionrole <üzenet> <@szerep>")] [HasAdminRole] - public async Task AddReactionRole(CommandContext ctx, string messageLink, DiscordEmoji emoji, DiscordRole role) + public async Task AddReactionRole(CommandContext ctx, string channelInput, string messageInput, string emojiInput, DiscordRole role) { - var channel = await IdExtractor.ExtractChannelId(messageLink, ctx.Client); - if (channel is null) - { + var channel = await IdExtractor.ExtractChannelId(channelInput, ctx.Client); + if (channel == null) return; - } - var message = await IdExtractor.ExtractMessageId(messageLink, channel); - if (message is null) - { + 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; - } - ReactionRoleService.AddReactionRole(message.Id, emoji.ToString(), role.Id); await message.CreateReactionAsync(emoji); } - [Command("removereactionrole")] - [Description("Eltávolít egy meglévő reaction role-t ! removereactionrole ")] + [Description("Eltávolít egy meglévő reaction role-t ! removereactionrole <üzenet> ")] [HasAdminRole] - public async Task RemoveReactionRole(CommandContext ctx, int id) + public async Task RemoveReactionRole(CommandContext ctx, string channelInput, string messageInput, string emojiInput) { - var result = await ReactionRoleService.RemoveReactionRoleByIdAsync(id); - - if (!result.Success) + var channel = await IdExtractor.ExtractChannelId(channelInput, ctx.Client); + if (channel == null) { - await ctx.RespondAsync(result.Message ?? "❌ Ismeretlen hiba történt."); return; } - await ctx.RespondAsync(result.Message ?? $"✅ A(z) {id}. reakció szerepkör törölve."); - } - [Command("listreactionrole")] - [Description("Felsorolja a reaction role párosításokat.")] - [HasAdminRole] - public async Task ListReactionRoles(CommandContext ctx) - { - // Lekérjük az összes reakció alapú szerepkört az adatbázisból - var allRoles = ReactionRoleService.GetAllReactionRoles(); - - if (allRoles.Count == 0) + var message = await IdExtractor.ExtractMessageId(messageInput, channel); + if (message == null) { - await ctx.RespondAsync("❌ Nincs reakció alapú szerepkör a szerveren."); return; } - var sb = new StringBuilder(); - sb.AppendLine("📜 Reakció alapú szerepkörök:"); - - // Az összes szerepkör kiírása sorszámozva - int index = 1; - foreach (var role in allRoles) + var emoji = await EmojiExtractor.ExtractAsync(emojiInput, ctx.Client); + if (emoji == null) { - var roleObj = ctx.Guild.GetRole(role.RoleId); // Az adott szerepkör lekérése - sb.AppendLine($"{index}. Üzenet ID: {role.MessageId}, Emoji: {role.Emoji}, Szerepkör: {roleObj?.Name ?? "Nincs név"}"); - index++; // Növeljük a sorszámot + return; } - await ctx.RespondAsync(sb.ToString()); + bool removed = ReactionRoleStorage.TryRemoveReactionRole(message.Id, emoji.ToString()); + if (!removed) + { + return; + } + + await message.DeleteOwnReactionAsync(emoji); } } } diff --git a/helpers/dbcontext.cs b/helpers/dbcontext.cs deleted file mode 100644 index 14555cf..0000000 --- a/helpers/dbcontext.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore; -using T3k3rg0.Helpers.Models; - -namespace T3k3rg0.Helpers.Data -{ - public static class DbPaths - { - public static readonly string napiszarDbPath = Environment.GetEnvironmentVariable("DB_NAPISZAR_LOC"); - public static readonly string rolesDbPath = Environment.GetEnvironmentVariable("DB_ROLES_LOC"); - } - - public class NapiszarDbContext : DbContext - { - public DbSet Joslatok { get; set; } - public DbSet DailyUsages { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseSqlite($"Data Source={DbPaths.napiszarDbPath}"); - } - } - - public class RolesDbContext : DbContext - { - public DbSet ReactionRoles { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(r => new { r.MessageId, r.Emoji }); - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseSqlite($"Data Source={DbPaths.rolesDbPath}"); - } - } -} - diff --git a/helpers/dbmodels.cs b/helpers/dbmodels.cs deleted file mode 100644 index 95bc98f..0000000 --- a/helpers/dbmodels.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace T3k3rg0.Helpers.Models -{ - [Table("joslatok")] - public class Joslat - { - [Key] - [Column("id")] - public int Id { get; set; } - - [Column("szoveg")] - public string Szoveg { get; set; } - } - - [Table("daily_usage")] - public class DailyUsage - { - [Key] - [Column("user_id")] - public long UserId { get; set; } - - [Column("last_used")] - public DateTime LastUsed { get; set; } - } - - [Table("reaction_roles")] - public class ReactionRole - { - [Key, Column("message_id", Order = 0)] - public ulong MessageId { get; set; } - - [Key, Column("emoji", Order = 1)] - public string Emoji { get; set; } - - [Column("role_id")] - public ulong RoleId { get; set; } - } -} - diff --git a/helpers/napiszarservice.cs b/helpers/napiszarservice.cs deleted file mode 100644 index 48bf085..0000000 --- a/helpers/napiszarservice.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Linq; -using T3k3rg0.Helpers.Data; -using T3k3rg0.Helpers.Models; - -namespace T3k3rg0.Helpers -{ - public static class NapiszarService - { - private static readonly TimeZoneInfo HungarianTimeZone = - TimeZoneInfo.FindSystemTimeZoneById("Europe/Budapest"); - - public static string GetRandomSzar() - { - using var db = new NapiszarDbContext(); - var count = db.Joslatok.Count(); - - if (count == 0) - return "Nincs elérhető szar"; - - var rnd = new Random(); - var skip = rnd.Next(count); - - var szar = db.Joslatok.Skip(skip).FirstOrDefault(); - return szar?.Szoveg ?? "Valami szar hiba történt"; - } - - public static bool HasUsedToday(ulong userId) - { - using var db = new NapiszarDbContext(); - - var usage = db.DailyUsages.FirstOrDefault(u => u.UserId == (long)userId); - if (usage == null) - return false; - - var today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, HungarianTimeZone).Date; - return usage.LastUsed.Date == today; - } - - public static void LogUsage(ulong userId) - { - using var db = new NapiszarDbContext(); - - var today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, HungarianTimeZone); - - var existing = db.DailyUsages.FirstOrDefault(u => u.UserId == (long)userId); - if (existing == null) - { - db.DailyUsages.Add(new DailyUsage - { - UserId = (long)userId, - LastUsed = today - }); - } - else - { - existing.LastUsed = today; - db.DailyUsages.Update(existing); - } - - db.SaveChanges(); - } - } -} - diff --git a/helpers/reactionroleservice.cs b/helpers/reactionroleservice.cs deleted file mode 100644 index 9a55f66..0000000 --- a/helpers/reactionroleservice.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using T3k3rg0.Helpers.Data; -using T3k3rg0.Helpers.Models; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; - -namespace T3k3rg0.Helpers -{ - public static class ReactionRoleService - { - public static ulong? GetRoleId(ulong messageId, string emoji) - { - using var db = new RolesDbContext(); - var entry = db.ReactionRoles - .FirstOrDefault(r => r.MessageId == messageId && r.Emoji == emoji); - - return entry?.RoleId; - } - - public static List<(string Emoji, ulong RoleId)> GetAllRolesForMessage(ulong messageId) - { - using var db = new RolesDbContext(); - return db.ReactionRoles - .Where(r => r.MessageId == messageId) - .ToList() - .Select(r => (r.Emoji, r.RoleId)) - .ToList(); - } - - public static void AddReactionRole(ulong messageId, string emoji, ulong roleId) - { - using var db = new RolesDbContext(); - db.ReactionRoles.Add(new ReactionRole - { - MessageId = messageId, - Emoji = emoji, - RoleId = roleId - }); - db.SaveChanges(); - } - - public static void RemoveReactionRole(ulong messageId, string emoji) - { - using var db = new RolesDbContext(); - var entry = db.ReactionRoles - .FirstOrDefault(r => r.MessageId == messageId && r.Emoji == emoji); - - if (entry != null) - { - db.ReactionRoles.Remove(entry); - db.SaveChanges(); - } - } - - public static List GetAllReactionRoles() - { - using var db = new RolesDbContext(); - return db.ReactionRoles.ToList(); // Minden rekord lekérése az adatbázisból - } - public static async Task> GetAllReactionRolesAsync() - { - await using var db = new RolesDbContext(); - return await db.ReactionRoles - .OrderBy(r => r.MessageId) - .ThenBy(r => r.Emoji) - .ToListAsync(); - } - - public static async Task<(bool Success, string? Message, string? Emoji, ulong? RoleId)> RemoveReactionRoleByIdAsync(int id) - { - try - { - await using var db = new RolesDbContext(); - - var allRoles = (await db.ReactionRoles.ToListAsync()) - .OrderBy(r => r.MessageId) - .ThenBy(r => r.Emoji) - .ToList(); - - if (id < 1 || id > allRoles.Count) - return (false, "❌ Érvénytelen ID.", null, null); - - var toRemove = allRoles[id - 1]; - db.ReactionRoles.Remove(toRemove); - await db.SaveChangesAsync(); - - return (true, null, toRemove.Emoji, toRemove.RoleId); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - return (false, "❌ Hiba történt az eltávolítás során.", null, null); - } - } - } -} - 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 9166407..f4aa47b 100644 --- a/program.cs +++ b/program.cs @@ -34,7 +34,6 @@ namespace T3k3rg0 commands.RegisterCommands(); commands.RegisterCommands(); commands.RegisterCommands(); - commands.RegisterCommands(); ReactionRoleHandler.Register(discord); await discord.ConnectAsync();