131 lines
No EOL
4.3 KiB
C#
131 lines
No EOL
4.3 KiB
C#
#nullable disable
|
|
using LinqToDB;
|
|
using LinqToDB.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using EllieBot.Db.Models;
|
|
|
|
namespace EllieBot.Modules.Gambling.Services;
|
|
|
|
public class ShopService : IShopService, IEService
|
|
{
|
|
private readonly DbService _db;
|
|
|
|
public ShopService(DbService db)
|
|
=> _db = db;
|
|
|
|
private async Task<IndexedCollection<ShopEntry>> GetEntriesInternal(DbContext uow, ulong guildId)
|
|
{
|
|
var items = await uow.Set<ShopEntry>()
|
|
.Where(x => x.GuildId == guildId)
|
|
.ToListAsyncEF();
|
|
|
|
return items.ToIndexed();
|
|
}
|
|
|
|
public async Task<bool> ChangeEntryPriceAsync(ulong guildId, int index, int newPrice)
|
|
{
|
|
ArgumentOutOfRangeException.ThrowIfNegative(index);
|
|
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(newPrice);
|
|
|
|
await using var uow = _db.GetDbContext();
|
|
|
|
var changed = await uow.GetTable<ShopEntry>()
|
|
.Where(x => x.GuildId == guildId && x.Index == index)
|
|
.UpdateAsync(x => new ShopEntry()
|
|
{
|
|
Price = newPrice,
|
|
});
|
|
|
|
return changed > 0;
|
|
}
|
|
|
|
public async Task<bool> ChangeEntryNameAsync(ulong guildId, int index, string newName)
|
|
{
|
|
ArgumentOutOfRangeException.ThrowIfNegative(index);
|
|
|
|
if (string.IsNullOrWhiteSpace(newName))
|
|
throw new ArgumentNullException(nameof(newName));
|
|
|
|
newName = newName?.TrimTo(100);
|
|
|
|
await using var uow = _db.GetDbContext();
|
|
|
|
var changed = await uow.GetTable<ShopEntry>()
|
|
.Where(x => x.GuildId == guildId && x.Index == index)
|
|
.UpdateAsync(x => new ShopEntry()
|
|
{
|
|
Name = newName,
|
|
});
|
|
return changed > 0;
|
|
}
|
|
|
|
public async Task<bool> SwapEntriesAsync(ulong guildId, int index1, int index2)
|
|
{
|
|
ArgumentOutOfRangeException.ThrowIfNegative(index1);
|
|
ArgumentOutOfRangeException.ThrowIfNegative(index2);
|
|
|
|
await using var uow = _db.GetDbContext();
|
|
var entries = await GetEntriesInternal(uow, guildId);
|
|
|
|
if (index1 >= entries.Count || index2 >= entries.Count || index1 == index2)
|
|
return false;
|
|
|
|
entries[index1].Index = index2;
|
|
entries[index2].Index = index1;
|
|
|
|
await uow.SaveChangesAsync();
|
|
|
|
return true;
|
|
}
|
|
|
|
public async Task<bool> MoveEntryAsync(ulong guildId, int fromIndex, int toIndex)
|
|
{
|
|
ArgumentOutOfRangeException.ThrowIfNegative(fromIndex);
|
|
ArgumentOutOfRangeException.ThrowIfNegative(toIndex);
|
|
|
|
await using var uow = _db.GetDbContext();
|
|
var entries = await GetEntriesInternal(uow, guildId);
|
|
|
|
if (fromIndex >= entries.Count || toIndex >= entries.Count || fromIndex == toIndex)
|
|
return false;
|
|
|
|
var entry = entries[fromIndex];
|
|
entries.RemoveAt(fromIndex);
|
|
entries.Insert(toIndex, entry);
|
|
|
|
await uow.SaveChangesAsync();
|
|
return true;
|
|
}
|
|
|
|
public async Task<bool> SetItemRoleRequirementAsync(ulong guildId, int index, ulong? roleId)
|
|
{
|
|
await using var uow = _db.GetDbContext();
|
|
|
|
var changes = await uow.GetTable<ShopEntry>()
|
|
.Where(x => x.GuildId == guildId && x.Index == index)
|
|
.UpdateAsync(x => new ShopEntry()
|
|
{
|
|
RoleRequirement = roleId,
|
|
});
|
|
return changes > 0;
|
|
}
|
|
|
|
public async Task<ShopEntry> AddShopCommandAsync(
|
|
ulong guildId,
|
|
ulong userId,
|
|
int price,
|
|
string command)
|
|
{
|
|
await using var uow = _db.GetDbContext();
|
|
var entry = await uow.GetTable<ShopEntry>()
|
|
.InsertWithOutputAsync(() => new()
|
|
{
|
|
AuthorId = userId,
|
|
Command = command,
|
|
Type = ShopEntryType.Command,
|
|
Price = price,
|
|
});
|
|
|
|
return entry;
|
|
}
|
|
} |