mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	dev: Using built in rng.Shuffle, using some new .net types, removed some transactions
This commit is contained in:
		@@ -291,8 +291,7 @@ public class MuteService : INService
 | 
			
		||||
 | 
			
		||||
    public async Task<IRole> GetMuteRole(IGuild guild)
 | 
			
		||||
    {
 | 
			
		||||
        if (guild is null)
 | 
			
		||||
            throw new ArgumentNullException(nameof(guild));
 | 
			
		||||
        ArgumentNullException.ThrowIfNull(guild);
 | 
			
		||||
 | 
			
		||||
        const string defaultMuteRoleName = "nadeko-mute";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -130,8 +130,7 @@ public class VcRoleService : INService
 | 
			
		||||
 | 
			
		||||
    public void AddVcRole(ulong guildId, IRole role, ulong vcId)
 | 
			
		||||
    {
 | 
			
		||||
        if (role is null)
 | 
			
		||||
            throw new ArgumentNullException(nameof(role));
 | 
			
		||||
        ArgumentNullException.ThrowIfNull(role);
 | 
			
		||||
 | 
			
		||||
        var guildVcRoles = VcRoles.GetOrAdd(guildId, new ConcurrentDictionary<ulong, IRole>());
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ public abstract class GamblingModule<TService> : NadekoModule<TService>
 | 
			
		||||
    {
 | 
			
		||||
        if (amount < 1)
 | 
			
		||||
            return false;
 | 
			
		||||
        
 | 
			
		||||
        if (amount < Config.MinBet)
 | 
			
		||||
        {
 | 
			
		||||
            await Response().Error(strs.min_bet_limit(Format.Bold(Config.MinBet.ToString()) + CurrencySign)).SendAsync();
 | 
			
		||||
 
 | 
			
		||||
@@ -267,20 +267,8 @@ public sealed partial class MusicQueue : IMusicQueue
 | 
			
		||||
    {
 | 
			
		||||
        lock (_locker)
 | 
			
		||||
        {
 | 
			
		||||
            var list = tracks.ToList();
 | 
			
		||||
 | 
			
		||||
            for (var i = 0; i < list.Count; i++)
 | 
			
		||||
            {
 | 
			
		||||
                var struck = rng.Next(i, list.Count);
 | 
			
		||||
                (list[struck], list[i]) = (list[i], list[struck]);
 | 
			
		||||
 | 
			
		||||
                // could preserving the index during shuffling be done better?
 | 
			
		||||
                if (i == index)
 | 
			
		||||
                    index = struck;
 | 
			
		||||
                else if (struck == index)
 | 
			
		||||
                    index = i;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var list = tracks.ToArray();
 | 
			
		||||
            rng.Shuffle(list);
 | 
			
		||||
            tracks = new(list);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,6 @@ public sealed class PatronageService
 | 
			
		||||
                var lastDate = lastRun.ToDateOnly();
 | 
			
		||||
 | 
			
		||||
                await using var ctx = _db.GetDbContext();
 | 
			
		||||
                await using var tran = await ctx.Database.BeginTransactionAsync();
 | 
			
		||||
 | 
			
		||||
                if ((lastDate.Day == 1 || (lastDate.Month != nowDate.Month)) && nowDate.Day > 1)
 | 
			
		||||
                {
 | 
			
		||||
@@ -141,7 +140,6 @@ public sealed class PatronageService
 | 
			
		||||
 | 
			
		||||
                // assumes that the code above runs in less than an hour
 | 
			
		||||
                await _cache.AddAsync(_quotaKey, now.ToBinary());
 | 
			
		||||
                await tran.CommitAsync();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@@ -171,7 +169,6 @@ public sealed class PatronageService
 | 
			
		||||
 | 
			
		||||
            var lastChargeUtc = subscriber.LastCharge.Value.ToUniversalTime();
 | 
			
		||||
            var dateInOneMonth = lastChargeUtc.Date.AddMonths(1);
 | 
			
		||||
            // await using var tran = await ctx.Database.BeginTransactionAsync();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var dbPatron = await ctx.GetTable<PatronUser>()
 | 
			
		||||
 
 | 
			
		||||
@@ -1469,7 +1469,6 @@ public class XpService : INService, IReadyExecutor, IExecNoCommand
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        await using var ctx = _db.GetDbContext();
 | 
			
		||||
        // await using var tran = await ctx.Database.BeginTransactionAsync();
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            if (await ctx.GetTable<XpShopOwnedItem>()
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,6 @@ public sealed class NadekoRandom : Random
 | 
			
		||||
    public long NextLong(long minValue, long maxValue)
 | 
			
		||||
    {
 | 
			
		||||
        ArgumentOutOfRangeException.ThrowIfGreaterThan(minValue, maxValue);
 | 
			
		||||
        
 | 
			
		||||
        if (minValue == maxValue)
 | 
			
		||||
            return minValue;
 | 
			
		||||
        var bytes = new byte[sizeof(long)];
 | 
			
		||||
 
 | 
			
		||||
@@ -12,5 +12,5 @@ public abstract class DbService
 | 
			
		||||
    public abstract Task SetupAsync();
 | 
			
		||||
 | 
			
		||||
    public abstract DbContext CreateRawDbContext(string dbType, string connString);
 | 
			
		||||
    public abstract DbContext GetDbContext();
 | 
			
		||||
    public abstract NadekoContext GetDbContext();
 | 
			
		||||
}
 | 
			
		||||
@@ -94,10 +94,8 @@ public class CommandHandler : INService, IReadyExecutor, ICommandHandler
 | 
			
		||||
 | 
			
		||||
    public string SetPrefix(IGuild guild, string prefix)
 | 
			
		||||
    {
 | 
			
		||||
        if (string.IsNullOrWhiteSpace(prefix))
 | 
			
		||||
            throw new ArgumentNullException(nameof(prefix));
 | 
			
		||||
        if (guild is null)
 | 
			
		||||
            throw new ArgumentNullException(nameof(guild));
 | 
			
		||||
        ArgumentNullException.ThrowIfNullOrWhiteSpace(prefix);
 | 
			
		||||
        ArgumentNullException.ThrowIfNull(guild);
 | 
			
		||||
 | 
			
		||||
        using (var uow = _db.GetDbContext())
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -20,10 +20,10 @@ public class DefaultWallet : IWallet
 | 
			
		||||
        await using var ctx = _db.GetDbContext();
 | 
			
		||||
        var userId = UserId;
 | 
			
		||||
        return await ctx
 | 
			
		||||
            .GetTable<DiscordUser>()
 | 
			
		||||
            .Where(x => x.UserId == userId)
 | 
			
		||||
            .Select(x => x.CurrencyAmount)
 | 
			
		||||
            .FirstOrDefaultAsync();
 | 
			
		||||
                     .GetTable<DiscordUser>()
 | 
			
		||||
                     .Where(x => x.UserId == userId)
 | 
			
		||||
                     .Select(x => x.CurrencyAmount)
 | 
			
		||||
                     .FirstOrDefaultAsync();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<bool> Take(long amount, TxData? txData)
 | 
			
		||||
@@ -35,12 +35,12 @@ public class DefaultWallet : IWallet
 | 
			
		||||
 | 
			
		||||
        var userId = UserId;
 | 
			
		||||
        var changed = await ctx
 | 
			
		||||
            .GetTable<DiscordUser>()
 | 
			
		||||
            .Where(x => x.UserId == userId && x.CurrencyAmount >= amount)
 | 
			
		||||
            .UpdateAsync(x => new()
 | 
			
		||||
            {
 | 
			
		||||
                CurrencyAmount = x.CurrencyAmount - amount
 | 
			
		||||
            });
 | 
			
		||||
                            .GetTable<DiscordUser>()
 | 
			
		||||
                            .Where(x => x.UserId == userId && x.CurrencyAmount >= amount)
 | 
			
		||||
                            .UpdateAsync(x => new()
 | 
			
		||||
                            {
 | 
			
		||||
                                CurrencyAmount = x.CurrencyAmount - amount
 | 
			
		||||
                            });
 | 
			
		||||
 | 
			
		||||
        if (changed == 0)
 | 
			
		||||
            return false;
 | 
			
		||||
@@ -48,17 +48,17 @@ public class DefaultWallet : IWallet
 | 
			
		||||
        if (txData is not null)
 | 
			
		||||
        {
 | 
			
		||||
            await ctx
 | 
			
		||||
                .GetTable<CurrencyTransaction>()
 | 
			
		||||
                .InsertAsync(() => new()
 | 
			
		||||
                {
 | 
			
		||||
                    Amount = -amount,
 | 
			
		||||
                    Note = txData.Note,
 | 
			
		||||
                    UserId = userId,
 | 
			
		||||
                    Type = txData.Type,
 | 
			
		||||
                    Extra = txData.Extra,
 | 
			
		||||
                    OtherId = txData.OtherId,
 | 
			
		||||
                    DateAdded = DateTime.UtcNow
 | 
			
		||||
                });
 | 
			
		||||
                  .GetTable<CurrencyTransaction>()
 | 
			
		||||
                  .InsertAsync(() => new()
 | 
			
		||||
                  {
 | 
			
		||||
                      Amount = -amount,
 | 
			
		||||
                      Note = txData.Note,
 | 
			
		||||
                      UserId = userId,
 | 
			
		||||
                      Type = txData.Type,
 | 
			
		||||
                      Extra = txData.Extra,
 | 
			
		||||
                      OtherId = txData.OtherId,
 | 
			
		||||
                      DateAdded = DateTime.UtcNow
 | 
			
		||||
                  });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
@@ -72,43 +72,37 @@ public class DefaultWallet : IWallet
 | 
			
		||||
        await using var ctx = _db.GetDbContext();
 | 
			
		||||
        var userId = UserId;
 | 
			
		||||
 | 
			
		||||
        await using (var tran = await ctx.Database.BeginTransactionAsync())
 | 
			
		||||
        {
 | 
			
		||||
            var changed = await ctx
 | 
			
		||||
                .GetTable<DiscordUser>()
 | 
			
		||||
                .Where(x => x.UserId == userId)
 | 
			
		||||
                .UpdateAsync(x => new()
 | 
			
		||||
                {
 | 
			
		||||
                    CurrencyAmount = x.CurrencyAmount + amount
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            if (changed == 0)
 | 
			
		||||
            {
 | 
			
		||||
                await ctx
 | 
			
		||||
                    .GetTable<DiscordUser>()
 | 
			
		||||
                    .Value(x => x.UserId, userId)
 | 
			
		||||
                    .Value(x => x.Username, "Unknown")
 | 
			
		||||
                    .Value(x => x.Discriminator, "????")
 | 
			
		||||
                    .Value(x => x.CurrencyAmount, amount)
 | 
			
		||||
                    .InsertAsync();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await tran.CommitAsync();
 | 
			
		||||
        }
 | 
			
		||||
        await ctx.GetTable<DiscordUser>()
 | 
			
		||||
                 .InsertOrUpdateAsync(() => new()
 | 
			
		||||
                     {
 | 
			
		||||
                         UserId = userId,
 | 
			
		||||
                         Username = "Unknown",
 | 
			
		||||
                         Discriminator = "????",
 | 
			
		||||
                         CurrencyAmount = amount,
 | 
			
		||||
                     },
 | 
			
		||||
                     (old) => new()
 | 
			
		||||
                     {
 | 
			
		||||
                         CurrencyAmount = old.CurrencyAmount + amount
 | 
			
		||||
                     },
 | 
			
		||||
                     () => new()
 | 
			
		||||
                     {
 | 
			
		||||
                         UserId = userId
 | 
			
		||||
                     });
 | 
			
		||||
 | 
			
		||||
        if (txData is not null)
 | 
			
		||||
        {
 | 
			
		||||
            await ctx.GetTable<CurrencyTransaction>()
 | 
			
		||||
                .InsertAsync(() => new()
 | 
			
		||||
                {
 | 
			
		||||
                    Amount = amount,
 | 
			
		||||
                    UserId = userId,
 | 
			
		||||
                    Note = txData.Note,
 | 
			
		||||
                    Type = txData.Type,
 | 
			
		||||
                    Extra = txData.Extra,
 | 
			
		||||
                    OtherId = txData.OtherId,
 | 
			
		||||
                    DateAdded = DateTime.UtcNow
 | 
			
		||||
                });
 | 
			
		||||
                     .InsertAsync(() => new()
 | 
			
		||||
                     {
 | 
			
		||||
                         Amount = amount,
 | 
			
		||||
                         UserId = userId,
 | 
			
		||||
                         Note = txData.Note,
 | 
			
		||||
                         Type = txData.Type,
 | 
			
		||||
                         Extra = txData.Extra,
 | 
			
		||||
                         OtherId = txData.OtherId,
 | 
			
		||||
                         DateAdded = DateTime.UtcNow
 | 
			
		||||
                     });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user