forked from EllieBotDevs/elliebot
56 lines
2.1 KiB
C#
56 lines
2.1 KiB
C#
|
#nullable disable
|
|||
|
using LinqToDB;
|
|||
|
using LinqToDB.EntityFrameworkCore;
|
|||
|
using Microsoft.EntityFrameworkCore;
|
|||
|
using EllieBot.Db.Models;
|
|||
|
|
|||
|
namespace EllieBot.Db;
|
|||
|
|
|||
|
public static class UserXpExtensions
|
|||
|
{
|
|||
|
public static UserXpStats GetOrCreateUserXpStats(this DbContext ctx, ulong guildId, ulong userId)
|
|||
|
{
|
|||
|
var usr = ctx.Set<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 async Task<List<UserXpStats>> GetTopUserXps(this DbSet<UserXpStats> xps, ulong guildId, int count)
|
|||
|
=> await xps.ToLinqToDBTable()
|
|||
|
.Where(x => x.GuildId == guildId)
|
|||
|
.OrderByDescending(x => x.Xp + x.AwardedXp)
|
|||
|
.Take(count)
|
|||
|
.ToListAsyncLinqToDB();
|
|||
|
|
|||
|
public static async Task<int> GetUserGuildRanking(this DbSet<UserXpStats> xps, ulong userId, ulong guildId)
|
|||
|
=> await xps.ToLinqToDBTable()
|
|||
|
.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())
|
|||
|
.CountAsyncLinqToDB()
|
|||
|
+ 1;
|
|||
|
|
|||
|
public static void ResetGuildXp(this DbSet<UserXpStats> xps, ulong guildId)
|
|||
|
=> xps.Delete(x => x.GuildId == guildId);
|
|||
|
|
|||
|
public static async Task<LevelStats> GetLevelDataFor(this ITable<UserXpStats> userXp, ulong guildId, ulong userId)
|
|||
|
=> await userXp
|
|||
|
.Where(x => x.GuildId == guildId && x.UserId == userId)
|
|||
|
.FirstOrDefaultAsyncLinqToDB() is UserXpStats uxs
|
|||
|
? new(uxs.Xp + uxs.AwardedXp)
|
|||
|
: new(0);
|
|||
|
}
|