added napiszar, using MsEntitiFramework, addreactionrole command working just with link

This commit is contained in:
balos 2025-05-06 00:17:21 +02:00
parent 1695770f9f
commit d508bffac1
9 changed files with 318 additions and 94 deletions

40
helpers/dbcontext.cs Normal file
View file

@ -0,0 +1,40 @@
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<Joslat> Joslatok { get; set; }
public DbSet<DailyUsage> DailyUsages { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Data Source={DbPaths.napiszarDbPath}");
}
}
public class RolesDbContext : DbContext
{
public DbSet<ReactionRole> ReactionRoles { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ReactionRole>()
.HasKey(r => new { r.MessageId, r.Emoji });
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Data Source={DbPaths.rolesDbPath}");
}
}
}

42
helpers/dbmodels.cs Normal file
View file

@ -0,0 +1,42 @@
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; }
}
}

View file

@ -0,0 +1,65 @@
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();
}
}
}

View file

@ -0,0 +1,99 @@
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<ReactionRole> GetAllReactionRoles()
{
using var db = new RolesDbContext();
return db.ReactionRoles.ToList(); // Minden rekord lekérése az adatbázisból
}
public static async Task<List<ReactionRole>> 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);
}
}
}
}

View file

@ -1,65 +0,0 @@
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;
}
}
}