#nullable disable using Microsoft.EntityFrameworkCore; using LinqToDB; using NadekoBot.Services.Database; using NadekoBot.Services.Database.Models; namespace NadekoBot.Db; public static class UserXpExtensions { public static UserXpStats GetOrCreateUserXpStats(this NadekoContext ctx, ulong guildId, ulong userId) { var usr = ctx.UserXpStats.FirstOrDefault(x => x.UserId == userId && x.GuildId == guildId); if (usr is null) { ctx.Add(usr = new() { Xp = 0, UserId = userId, NotifyOnLevelUp = XpNotificationLocation.None, GuildId = guildId, } ); } return usr; } public static List GetUsersFor(this DbSet xps, ulong guildId, int page) => xps.AsQueryable() .AsNoTracking() .Where(x => x.GuildId == guildId) .OrderByDescending(x => x.Xp + x.AwardedXp) .Skip(page * 9) .Take(9) .ToList(); public static List GetTopUserXps(this DbSet xps, ulong guildId, int count) => xps.AsQueryable() .AsNoTracking() .Where(x => x.GuildId == guildId) .OrderByDescending(x => x.Xp + x.AwardedXp) .Take(count) .ToList(); public static int GetUserGuildRanking(this DbSet xps, ulong userId, ulong guildId) // @"SELECT COUNT(*) + 1 //FROM UserXpStats //WHERE GuildId = @p1 AND ((Xp + AwardedXp) > (SELECT Xp + AwardedXp // FROM UserXpStats // WHERE UserId = @p2 AND GuildId = @p1 // LIMIT 1));"; => xps.AsQueryable() .AsNoTracking() .Where(x => x.GuildId == guildId && x.Xp + x.AwardedXp > xps.AsQueryable() .Where(y => y.UserId == userId && y.GuildId == guildId) .Select(y => y.Xp + y.AwardedXp) .FirstOrDefault() ) .Count() + 1; public static void ResetGuildUserXp(this DbSet xps, ulong userId, ulong guildId) => xps.Delete(x => x.UserId == userId && x.GuildId == guildId); public static void ResetGuildXp(this DbSet xps, ulong guildId) => xps.Delete(x => x.GuildId == guildId); }