mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	add: Added multiplier option for waifu gifts. For example .waifugift 3xRose @user will give that user 3 roses
This commit is contained in:
		@@ -181,9 +181,9 @@ dotnet_naming_rule.private_readonly_field.symbols = private_readonly_field
 | 
			
		||||
dotnet_naming_rule.private_readonly_field.style = begins_with_underscore
 | 
			
		||||
dotnet_naming_rule.private_readonly_field.severity = warning
 | 
			
		||||
 | 
			
		||||
dotnet_naming_rule.private_field.symbols = private_field
 | 
			
		||||
dotnet_naming_rule.private_field.style = camel_case
 | 
			
		||||
dotnet_naming_rule.private_field.severity = warning
 | 
			
		||||
# dotnet_naming_rule.private_field.symbols = private_field
 | 
			
		||||
# dotnet_naming_rule.private_field.style = camel_case
 | 
			
		||||
# dotnet_naming_rule.private_field.severity = warning
 | 
			
		||||
 | 
			
		||||
dotnet_naming_rule.const_fields.symbols = const_fields
 | 
			
		||||
dotnet_naming_rule.const_fields.style = all_upper
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ using NadekoBot.Modules.Gambling.Common;
 | 
			
		||||
using NadekoBot.Modules.Gambling.Common.Waifu;
 | 
			
		||||
using NadekoBot.Modules.Gambling.Services;
 | 
			
		||||
using NadekoBot.Db.Models;
 | 
			
		||||
using TwitchLib.Api.Helix.Models.Teams;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Gambling;
 | 
			
		||||
 | 
			
		||||
@@ -21,8 +22,8 @@ public partial class Gambling
 | 
			
		||||
        {
 | 
			
		||||
            var price = _service.GetResetPrice(ctx.User);
 | 
			
		||||
            var embed = _sender.CreateEmbed()
 | 
			
		||||
                        .WithTitle(GetText(strs.waifu_reset_confirm))
 | 
			
		||||
                        .WithDescription(GetText(strs.waifu_reset_price(Format.Bold(N(price)))));
 | 
			
		||||
                               .WithTitle(GetText(strs.waifu_reset_confirm))
 | 
			
		||||
                               .WithDescription(GetText(strs.waifu_reset_price(Format.Bold(N(price)))));
 | 
			
		||||
 | 
			
		||||
            if (!await PromptUserConfirmAsync(embed))
 | 
			
		||||
                return;
 | 
			
		||||
@@ -307,24 +308,26 @@ public partial class Gambling
 | 
			
		||||
                fansStr = "-";
 | 
			
		||||
 | 
			
		||||
            var embed = _sender.CreateEmbed()
 | 
			
		||||
                        .WithOkColor()
 | 
			
		||||
                        .WithTitle(GetText(strs.waifu)
 | 
			
		||||
                                   + " "
 | 
			
		||||
                                   + (wi.FullName ?? name ?? targetId.ToString())
 | 
			
		||||
                                   + " - \"the "
 | 
			
		||||
                                   + _service.GetClaimTitle(wi.ClaimCount)
 | 
			
		||||
                                   + "\"")
 | 
			
		||||
                        .AddField(GetText(strs.price), N(wi.Price), true)
 | 
			
		||||
                        .AddField(GetText(strs.claimed_by), wi.ClaimerName ?? nobody, true)
 | 
			
		||||
                        .AddField(GetText(strs.likes), wi.AffinityName ?? nobody, true)
 | 
			
		||||
                        .AddField(GetText(strs.changes_of_heart), $"{wi.AffinityCount} - \"the {affInfo}\"", true)
 | 
			
		||||
                        .AddField(GetText(strs.divorces), wi.DivorceCount.ToString(), true)
 | 
			
		||||
                        .AddField("\u200B", "\u200B", true)
 | 
			
		||||
                        .AddField(GetText(strs.fans(fansList.Count)), fansStr, true)
 | 
			
		||||
                        .AddField($"Waifus ({wi.ClaimCount})",
 | 
			
		||||
                            wi.ClaimCount == 0 ? nobody : claimsStr,
 | 
			
		||||
                            true)
 | 
			
		||||
                        .AddField(GetText(strs.gifts), itemsStr, true);
 | 
			
		||||
                               .WithOkColor()
 | 
			
		||||
                               .WithTitle(GetText(strs.waifu)
 | 
			
		||||
                                          + " "
 | 
			
		||||
                                          + (wi.FullName ?? name ?? targetId.ToString())
 | 
			
		||||
                                          + " - \"the "
 | 
			
		||||
                                          + _service.GetClaimTitle(wi.ClaimCount)
 | 
			
		||||
                                          + "\"")
 | 
			
		||||
                               .AddField(GetText(strs.price), N(wi.Price), true)
 | 
			
		||||
                               .AddField(GetText(strs.claimed_by), wi.ClaimerName ?? nobody, true)
 | 
			
		||||
                               .AddField(GetText(strs.likes), wi.AffinityName ?? nobody, true)
 | 
			
		||||
                               .AddField(GetText(strs.changes_of_heart),
 | 
			
		||||
                                   $"{wi.AffinityCount} - \"the {affInfo}\"",
 | 
			
		||||
                                   true)
 | 
			
		||||
                               .AddField(GetText(strs.divorces), wi.DivorceCount.ToString(), true)
 | 
			
		||||
                               .AddField("\u200B", "\u200B", true)
 | 
			
		||||
                               .AddField(GetText(strs.fans(fansList.Count)), fansStr, true)
 | 
			
		||||
                               .AddField($"Waifus ({wi.ClaimCount})",
 | 
			
		||||
                                   wi.ClaimCount == 0 ? nobody : claimsStr,
 | 
			
		||||
                                   true)
 | 
			
		||||
                               .AddField(GetText(strs.gifts), itemsStr, true);
 | 
			
		||||
 | 
			
		||||
            await Response().Embed(embed).SendAsync();
 | 
			
		||||
        }
 | 
			
		||||
@@ -348,7 +351,7 @@ public partial class Gambling
 | 
			
		||||
                  .Page((items, _) =>
 | 
			
		||||
                  {
 | 
			
		||||
                      var embed = _sender.CreateEmbed().WithTitle(GetText(strs.waifu_gift_shop)).WithOkColor();
 | 
			
		||||
                      
 | 
			
		||||
 | 
			
		||||
                      items
 | 
			
		||||
                          .ToList()
 | 
			
		||||
                          .ForEach(x => embed.AddField(
 | 
			
		||||
@@ -364,30 +367,27 @@ public partial class Gambling
 | 
			
		||||
        [Cmd]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [Priority(0)]
 | 
			
		||||
        public async Task WaifuGift(string itemName, [Leftover] IUser waifu)
 | 
			
		||||
        public async Task WaifuGift(MultipleWaifuItems items, [Leftover] IUser waifu)
 | 
			
		||||
        {
 | 
			
		||||
            if (waifu.Id == ctx.User.Id)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var allItems = _service.GetWaifuItems();
 | 
			
		||||
            var item = allItems.FirstOrDefault(x => x.Name.ToLowerInvariant() == itemName.ToLowerInvariant());
 | 
			
		||||
            if (item is null)
 | 
			
		||||
            {
 | 
			
		||||
                await Response().Error(strs.waifu_gift_not_exist).SendAsync();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var sucess = await _service.GiftWaifuAsync(ctx.User, waifu, item);
 | 
			
		||||
            var sucess = await _service.GiftWaifuAsync(ctx.User, waifu, items.Item, items.Count);
 | 
			
		||||
 | 
			
		||||
            if (sucess)
 | 
			
		||||
            {
 | 
			
		||||
                await Response()
 | 
			
		||||
                      .Confirm(strs.waifu_gift(Format.Bold(item + " " + item.ItemEmoji),
 | 
			
		||||
                      .Confirm(strs.waifu_gift(Format.Bold($"{GetCountString(items)}{items.Item} {items.Item.ItemEmoji}"),
 | 
			
		||||
                          Format.Bold(waifu.ToString())))
 | 
			
		||||
                      .SendAsync();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
                await Response().Error(strs.not_enough(CurrencySign)).SendAsync();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        private static string GetCountString(MultipleWaifuItems items)
 | 
			
		||||
            => items.Count > 1
 | 
			
		||||
                ? $"{items.Count}x "
 | 
			
		||||
                : string.Empty;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,6 +7,7 @@ using NadekoBot.Db;
 | 
			
		||||
using NadekoBot.Db.Models;
 | 
			
		||||
using NadekoBot.Modules.Gambling.Common;
 | 
			
		||||
using NadekoBot.Modules.Gambling.Common.Waifu;
 | 
			
		||||
using SixLabors.ImageSharp;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Gambling.Services;
 | 
			
		||||
 | 
			
		||||
@@ -89,9 +90,14 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
        if (waifu is null)
 | 
			
		||||
            return settings.Waifu.MinPrice;
 | 
			
		||||
 | 
			
		||||
        var divorces = uow.Set<WaifuUpdate>().Count(x
 | 
			
		||||
            => x.Old != null && x.Old.UserId == user.Id && x.UpdateType == WaifuUpdateType.Claimed && x.New == null);
 | 
			
		||||
        var affs = uow.Set<WaifuUpdate>().AsQueryable()
 | 
			
		||||
        var divorces = uow.Set<WaifuUpdate>()
 | 
			
		||||
                          .Count(x
 | 
			
		||||
                              => x.Old != null
 | 
			
		||||
                                 && x.Old.UserId == user.Id
 | 
			
		||||
                                 && x.UpdateType == WaifuUpdateType.Claimed
 | 
			
		||||
                                 && x.New == null);
 | 
			
		||||
        var affs = uow.Set<WaifuUpdate>()
 | 
			
		||||
                      .AsQueryable()
 | 
			
		||||
                      .Where(w => w.User.UserId == user.Id
 | 
			
		||||
                                  && w.UpdateType == WaifuUpdateType.AffinityChanged
 | 
			
		||||
                                  && w.New != null)
 | 
			
		||||
@@ -110,12 +116,14 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
        if (!await _cs.RemoveAsync(user.Id, price, new("waifu", "reset")))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        var affs = uow.Set<WaifuUpdate>().AsQueryable()
 | 
			
		||||
        var affs = uow.Set<WaifuUpdate>()
 | 
			
		||||
                      .AsQueryable()
 | 
			
		||||
                      .Where(w => w.User.UserId == user.Id
 | 
			
		||||
                                  && w.UpdateType == WaifuUpdateType.AffinityChanged
 | 
			
		||||
                                  && w.New != null);
 | 
			
		||||
 | 
			
		||||
        var divorces = uow.Set<WaifuUpdate>().AsQueryable()
 | 
			
		||||
        var divorces = uow.Set<WaifuUpdate>()
 | 
			
		||||
                          .AsQueryable()
 | 
			
		||||
                          .Where(x => x.Old != null
 | 
			
		||||
                                      && x.Old.UserId == user.Id
 | 
			
		||||
                                      && x.UpdateType == WaifuUpdateType.Claimed
 | 
			
		||||
@@ -158,20 +166,22 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                    result = WaifuClaimResult.NotEnoughFunds;
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    uow.Set<WaifuInfo>().Add(w = new()
 | 
			
		||||
                    {
 | 
			
		||||
                        Waifu = waifu,
 | 
			
		||||
                        Claimer = claimer,
 | 
			
		||||
                        Affinity = null,
 | 
			
		||||
                        Price = amount
 | 
			
		||||
                    });
 | 
			
		||||
                    uow.Set<WaifuUpdate>().Add(new()
 | 
			
		||||
                    {
 | 
			
		||||
                        User = waifu,
 | 
			
		||||
                        Old = null,
 | 
			
		||||
                        New = claimer,
 | 
			
		||||
                        UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                    });
 | 
			
		||||
                    uow.Set<WaifuInfo>()
 | 
			
		||||
                       .Add(w = new()
 | 
			
		||||
                       {
 | 
			
		||||
                           Waifu = waifu,
 | 
			
		||||
                           Claimer = claimer,
 | 
			
		||||
                           Affinity = null,
 | 
			
		||||
                           Price = amount
 | 
			
		||||
                       });
 | 
			
		||||
                    uow.Set<WaifuUpdate>()
 | 
			
		||||
                       .Add(new()
 | 
			
		||||
                       {
 | 
			
		||||
                           User = waifu,
 | 
			
		||||
                           Old = null,
 | 
			
		||||
                           New = claimer,
 | 
			
		||||
                           UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                       });
 | 
			
		||||
                    result = WaifuClaimResult.Success;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -186,13 +196,14 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                    w.Price = amount + (amount / 4);
 | 
			
		||||
                    result = WaifuClaimResult.Success;
 | 
			
		||||
 | 
			
		||||
                    uow.Set<WaifuUpdate>().Add(new()
 | 
			
		||||
                    {
 | 
			
		||||
                        User = w.Waifu,
 | 
			
		||||
                        Old = oldClaimer,
 | 
			
		||||
                        New = w.Claimer,
 | 
			
		||||
                        UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                    });
 | 
			
		||||
                    uow.Set<WaifuUpdate>()
 | 
			
		||||
                       .Add(new()
 | 
			
		||||
                       {
 | 
			
		||||
                           User = w.Waifu,
 | 
			
		||||
                           Old = oldClaimer,
 | 
			
		||||
                           New = w.Claimer,
 | 
			
		||||
                           UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                       });
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else if (amount >= w.Price * settings.Waifu.Multipliers.NormalClaim) // if no affinity
 | 
			
		||||
@@ -206,13 +217,14 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                    w.Price = amount;
 | 
			
		||||
                    result = WaifuClaimResult.Success;
 | 
			
		||||
 | 
			
		||||
                    uow.Set<WaifuUpdate>().Add(new()
 | 
			
		||||
                    {
 | 
			
		||||
                        User = w.Waifu,
 | 
			
		||||
                        Old = oldClaimer,
 | 
			
		||||
                        New = w.Claimer,
 | 
			
		||||
                        UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                    });
 | 
			
		||||
                    uow.Set<WaifuUpdate>()
 | 
			
		||||
                       .Add(new()
 | 
			
		||||
                       {
 | 
			
		||||
                           User = w.Waifu,
 | 
			
		||||
                           Old = oldClaimer,
 | 
			
		||||
                           New = w.Claimer,
 | 
			
		||||
                           UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                       });
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
@@ -241,29 +253,31 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
 | 
			
		||||
            remaining = await _cache.GetRatelimitAsync(GetAffinityKey(user.Id),
 | 
			
		||||
                30.Minutes());
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            if (remaining is not null)
 | 
			
		||||
            {
 | 
			
		||||
            }
 | 
			
		||||
            else if (w is null)
 | 
			
		||||
            {
 | 
			
		||||
                var thisUser = uow.GetOrCreateUser(user);
 | 
			
		||||
                uow.Set<WaifuInfo>().Add(new()
 | 
			
		||||
                {
 | 
			
		||||
                    Affinity = newAff,
 | 
			
		||||
                    Waifu = thisUser,
 | 
			
		||||
                    Price = 1,
 | 
			
		||||
                    Claimer = null
 | 
			
		||||
                });
 | 
			
		||||
                uow.Set<WaifuInfo>()
 | 
			
		||||
                   .Add(new()
 | 
			
		||||
                   {
 | 
			
		||||
                       Affinity = newAff,
 | 
			
		||||
                       Waifu = thisUser,
 | 
			
		||||
                       Price = 1,
 | 
			
		||||
                       Claimer = null
 | 
			
		||||
                   });
 | 
			
		||||
                success = true;
 | 
			
		||||
 | 
			
		||||
                uow.Set<WaifuUpdate>().Add(new()
 | 
			
		||||
                {
 | 
			
		||||
                    User = thisUser,
 | 
			
		||||
                    Old = null,
 | 
			
		||||
                    New = newAff,
 | 
			
		||||
                    UpdateType = WaifuUpdateType.AffinityChanged
 | 
			
		||||
                });
 | 
			
		||||
                uow.Set<WaifuUpdate>()
 | 
			
		||||
                   .Add(new()
 | 
			
		||||
                   {
 | 
			
		||||
                       User = thisUser,
 | 
			
		||||
                       Old = null,
 | 
			
		||||
                       New = newAff,
 | 
			
		||||
                       UpdateType = WaifuUpdateType.AffinityChanged
 | 
			
		||||
                   });
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
@@ -272,13 +286,14 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                w.Affinity = newAff;
 | 
			
		||||
                success = true;
 | 
			
		||||
 | 
			
		||||
                uow.Set<WaifuUpdate>().Add(new()
 | 
			
		||||
                {
 | 
			
		||||
                    User = w.Waifu,
 | 
			
		||||
                    Old = oldAff,
 | 
			
		||||
                    New = newAff,
 | 
			
		||||
                    UpdateType = WaifuUpdateType.AffinityChanged
 | 
			
		||||
                });
 | 
			
		||||
                uow.Set<WaifuUpdate>()
 | 
			
		||||
                   .Add(new()
 | 
			
		||||
                   {
 | 
			
		||||
                       User = w.Waifu,
 | 
			
		||||
                       Old = oldAff,
 | 
			
		||||
                       New = newAff,
 | 
			
		||||
                       UpdateType = WaifuUpdateType.AffinityChanged
 | 
			
		||||
                   });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await uow.SaveChangesAsync();
 | 
			
		||||
@@ -301,10 +316,10 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
 | 
			
		||||
    private static TypedKey<long> GetDivorceKey(ulong userId)
 | 
			
		||||
        => new($"waifu:divorce_cd:{userId}");
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    private static TypedKey<long> GetAffinityKey(ulong userId)
 | 
			
		||||
        => new($"waifu:affinity:{userId}");
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    public async Task<(WaifuInfo, DivorceResult, long, TimeSpan?)> DivorceWaifuAsync(IUser user, ulong targetId)
 | 
			
		||||
    {
 | 
			
		||||
        DivorceResult result;
 | 
			
		||||
@@ -343,13 +358,14 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                var oldClaimer = w.Claimer;
 | 
			
		||||
                w.Claimer = null;
 | 
			
		||||
 | 
			
		||||
                uow.Set<WaifuUpdate>().Add(new()
 | 
			
		||||
                {
 | 
			
		||||
                    User = w.Waifu,
 | 
			
		||||
                    Old = oldClaimer,
 | 
			
		||||
                    New = null,
 | 
			
		||||
                    UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                });
 | 
			
		||||
                uow.Set<WaifuUpdate>()
 | 
			
		||||
                   .Add(new()
 | 
			
		||||
                   {
 | 
			
		||||
                       User = w.Waifu,
 | 
			
		||||
                       Old = oldClaimer,
 | 
			
		||||
                       New = null,
 | 
			
		||||
                       UpdateType = WaifuUpdateType.Claimed
 | 
			
		||||
                   });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await uow.SaveChangesAsync();
 | 
			
		||||
@@ -358,40 +374,54 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
        return (w, result, amount, remaining);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<bool> GiftWaifuAsync(IUser from, IUser giftedWaifu, WaifuItemModel itemObj)
 | 
			
		||||
    public async Task<bool> GiftWaifuAsync(
 | 
			
		||||
        IUser from,
 | 
			
		||||
        IUser giftedWaifu,
 | 
			
		||||
        WaifuItemModel itemObj,
 | 
			
		||||
        int count)
 | 
			
		||||
    {
 | 
			
		||||
        if (!await _cs.RemoveAsync(from, itemObj.Price, new("waifu", "item")))
 | 
			
		||||
        ArgumentOutOfRangeException.ThrowIfLessThan(count, 1, nameof(count));
 | 
			
		||||
 | 
			
		||||
        if (!await _cs.RemoveAsync(from, itemObj.Price * count, new("waifu", "item")))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        var totalValue = itemObj.Price * count;
 | 
			
		||||
 | 
			
		||||
        await using var uow = _db.GetDbContext();
 | 
			
		||||
        var w = uow.Set<WaifuInfo>().ByWaifuUserId(giftedWaifu.Id, set => set.Include(x => x.Items).Include(x => x.Claimer));
 | 
			
		||||
        var w = uow.Set<WaifuInfo>()
 | 
			
		||||
                   .ByWaifuUserId(giftedWaifu.Id,
 | 
			
		||||
                       set => set
 | 
			
		||||
                              .Include(x => x.Items)
 | 
			
		||||
                              .Include(x => x.Claimer));
 | 
			
		||||
        if (w is null)
 | 
			
		||||
        {
 | 
			
		||||
            uow.Set<WaifuInfo>().Add(w = new()
 | 
			
		||||
            {
 | 
			
		||||
                Affinity = null,
 | 
			
		||||
                Claimer = null,
 | 
			
		||||
                Price = 1,
 | 
			
		||||
                Waifu = uow.GetOrCreateUser(giftedWaifu)
 | 
			
		||||
            });
 | 
			
		||||
            uow.Set<WaifuInfo>()
 | 
			
		||||
               .Add(w = new()
 | 
			
		||||
               {
 | 
			
		||||
                   Affinity = null,
 | 
			
		||||
                   Claimer = null,
 | 
			
		||||
                   Price = 1,
 | 
			
		||||
                   Waifu = uow.GetOrCreateUser(giftedWaifu)
 | 
			
		||||
               });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!itemObj.Negative)
 | 
			
		||||
        {
 | 
			
		||||
            w.Items.Add(new()
 | 
			
		||||
            {
 | 
			
		||||
                Name = itemObj.Name.ToLowerInvariant(),
 | 
			
		||||
                ItemEmoji = itemObj.ItemEmoji
 | 
			
		||||
            });
 | 
			
		||||
            w.Items.AddRange(Enumerable.Range(0, count)
 | 
			
		||||
                                       .Select((_) => new WaifuItem()
 | 
			
		||||
                                       {
 | 
			
		||||
                                           Name = itemObj.Name.ToLowerInvariant(),
 | 
			
		||||
                                           ItemEmoji = itemObj.ItemEmoji
 | 
			
		||||
                                       }));
 | 
			
		||||
 | 
			
		||||
            if (w.Claimer?.UserId == from.Id)
 | 
			
		||||
                w.Price += (long)(itemObj.Price * _gss.Data.Waifu.Multipliers.GiftEffect);
 | 
			
		||||
                w.Price += (long)(totalValue * _gss.Data.Waifu.Multipliers.GiftEffect);
 | 
			
		||||
            else
 | 
			
		||||
                w.Price += itemObj.Price / 2;
 | 
			
		||||
                w.Price += totalValue / 2;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            w.Price -= (long)(itemObj.Price * _gss.Data.Waifu.Multipliers.NegativeGiftEffect);
 | 
			
		||||
            w.Price -= (long)(totalValue * _gss.Data.Waifu.Multipliers.NegativeGiftEffect);
 | 
			
		||||
            if (w.Price < 1)
 | 
			
		||||
                w.Price = 1;
 | 
			
		||||
        }
 | 
			
		||||
@@ -492,6 +522,7 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static readonly TypedKey<long> _waifuDecayKey = $"waifu:last_decay";
 | 
			
		||||
 | 
			
		||||
    public async Task OnReadyAsync()
 | 
			
		||||
    {
 | 
			
		||||
        // only decay waifu values from shard 0
 | 
			
		||||
@@ -513,7 +544,7 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                var nowB = now.ToBinary();
 | 
			
		||||
 | 
			
		||||
                var result = await _cache.GetAsync(_waifuDecayKey);
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                if (result.TryGetValue(out var val))
 | 
			
		||||
                {
 | 
			
		||||
                    var lastDecay = DateTime.FromBinary(val);
 | 
			
		||||
@@ -533,7 +564,6 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
                         {
 | 
			
		||||
                             Price = (long)(old.Price * multi)
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
@@ -550,33 +580,35 @@ public class WaifuService : INService, IReadyExecutor
 | 
			
		||||
    {
 | 
			
		||||
        await using var ctx = _db.GetDbContext();
 | 
			
		||||
        return await ctx.GetTable<DiscordUser>()
 | 
			
		||||
            .Where(x => ctx.GetTable<WaifuInfo>()
 | 
			
		||||
                .Where(wi => wi.ClaimerId == waifuId)
 | 
			
		||||
                .Select(wi => wi.WaifuId)
 | 
			
		||||
                .Contains(x.Id))
 | 
			
		||||
            .Select(x => $"{x.Username}#{x.Discriminator}")
 | 
			
		||||
            .ToListAsyncEF();
 | 
			
		||||
                        .Where(x => ctx.GetTable<WaifuInfo>()
 | 
			
		||||
                                       .Where(wi => wi.ClaimerId == waifuId)
 | 
			
		||||
                                       .Select(wi => wi.WaifuId)
 | 
			
		||||
                                       .Contains(x.Id))
 | 
			
		||||
                        .Select(x => $"{x.Username}#{x.Discriminator}")
 | 
			
		||||
                        .ToListAsyncEF();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<IReadOnlyCollection<string>> GetFansNames(int waifuId)
 | 
			
		||||
    {
 | 
			
		||||
        await using var ctx = _db.GetDbContext();
 | 
			
		||||
        return await ctx.GetTable<DiscordUser>()
 | 
			
		||||
            .Where(x => ctx.GetTable<WaifuInfo>()
 | 
			
		||||
                .Where(wi => wi.AffinityId == waifuId)
 | 
			
		||||
                .Select(wi => wi.WaifuId)
 | 
			
		||||
                .Contains(x.Id))
 | 
			
		||||
            .Select(x => $"{x.Username}#{x.Discriminator}")
 | 
			
		||||
            .ToListAsyncEF();
 | 
			
		||||
                        .Where(x => ctx.GetTable<WaifuInfo>()
 | 
			
		||||
                                       .Where(wi => wi.AffinityId == waifuId)
 | 
			
		||||
                                       .Select(wi => wi.WaifuId)
 | 
			
		||||
                                       .Contains(x.Id))
 | 
			
		||||
                        .Select(x => $"{x.Username}#{x.Discriminator}")
 | 
			
		||||
                        .ToListAsyncEF();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<IReadOnlyCollection<WaifuItem>> GetItems(int waifuId)
 | 
			
		||||
    {
 | 
			
		||||
        await using var ctx = _db.GetDbContext();
 | 
			
		||||
        return await ctx.GetTable<WaifuItem>()
 | 
			
		||||
            .Where(x => x.WaifuInfoId == ctx.GetTable<WaifuInfo>()
 | 
			
		||||
                .Where(x => x.WaifuId == waifuId)
 | 
			
		||||
                .Select(x => x.Id)
 | 
			
		||||
                .FirstOrDefault())
 | 
			
		||||
            .ToListAsyncEF();
 | 
			
		||||
                        .Where(x => x.WaifuInfoId
 | 
			
		||||
                                    == ctx.GetTable<WaifuInfo>()
 | 
			
		||||
                                          .Where(x => x.WaifuId == waifuId)
 | 
			
		||||
                                          .Select(x => x.Id)
 | 
			
		||||
                                          .FirstOrDefault())
 | 
			
		||||
                        .ToListAsyncEF();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
using NadekoBot.Modules.Gambling.Common;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Gambling;
 | 
			
		||||
 | 
			
		||||
public record class MultipleWaifuItems(int Count, WaifuItemModel Item);
 | 
			
		||||
@@ -0,0 +1,47 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
using NadekoBot.Common.TypeReaders;
 | 
			
		||||
using NadekoBot.Modules.Gambling.Services;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Gambling;
 | 
			
		||||
 | 
			
		||||
public partial class MultipleWaifuItemsTypeReader : NadekoTypeReader<MultipleWaifuItems>
 | 
			
		||||
{
 | 
			
		||||
    private readonly WaifuService _service;
 | 
			
		||||
    
 | 
			
		||||
    [GeneratedRegex(@"(?:(?<count>\d+)[x*])?(?<item>.+)")]
 | 
			
		||||
    private static partial Regex ItemRegex();
 | 
			
		||||
 | 
			
		||||
    public MultipleWaifuItemsTypeReader(WaifuService service)
 | 
			
		||||
    {
 | 
			
		||||
        _service = service;
 | 
			
		||||
    }
 | 
			
		||||
    public override ValueTask<TypeReaderResult<MultipleWaifuItems>> ReadAsync(ICommandContext ctx, string input)
 | 
			
		||||
    {
 | 
			
		||||
        input = input.ToLowerInvariant();
 | 
			
		||||
        var match = ItemRegex().Match(input);
 | 
			
		||||
        if (!match.Success)
 | 
			
		||||
        {
 | 
			
		||||
            return new(Discord.Commands.TypeReaderResult.FromError(CommandError.ParseFailed, "Invalid input."));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var count = 1;
 | 
			
		||||
        if (match.Groups["count"].Success)
 | 
			
		||||
        {
 | 
			
		||||
            if (!int.TryParse(match.Groups["count"].Value, out count) || count < 1)
 | 
			
		||||
            {
 | 
			
		||||
                return new(Discord.Commands.TypeReaderResult.FromError(CommandError.ParseFailed, "Invalid count."));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        var itemName = match.Groups["item"].Value?.ToLowerInvariant();
 | 
			
		||||
        var allItems = _service.GetWaifuItems();
 | 
			
		||||
        var item = allItems.FirstOrDefault(x => x.Name.ToLowerInvariant() == itemName);
 | 
			
		||||
        if (item is null)
 | 
			
		||||
        {
 | 
			
		||||
            return new(Discord.Commands.TypeReaderResult.FromError(CommandError.ParseFailed, "Waifu gift does not exist."));
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        return new(Discord.Commands.TypeReaderResult.FromSuccess(new MultipleWaifuItems(count, item)));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2753,8 +2753,10 @@ waifutransfer:
 | 
			
		||||
        desc: "The user to whom ownership of the waifu is being transferred."
 | 
			
		||||
waifugift:
 | 
			
		||||
  desc: -| 
 | 
			
		||||
    Gift an item to someone.
 | 
			
		||||
    This will increase their waifu value by a percentage of the gift's value. 
 | 
			
		||||
    Gift an item to a waifu user.
 | 
			
		||||
    The waifu's value will be increased by the percentage of the gift's value.
 | 
			
		||||
    You can optionally prefix the gift with a multiplier to gift the item that many times.
 | 
			
		||||
    For example, 3xRose will give the waifu 3 roses, 10xBread will give the waifu 10 breads. Do not use plural forms.
 | 
			
		||||
    Negative gifts will not show up in waifuinfo. 
 | 
			
		||||
    Provide no parameters to see a list of items that you can gift.
 | 
			
		||||
  ex:
 | 
			
		||||
@@ -2762,9 +2764,9 @@ waifugift:
 | 
			
		||||
    - Rose @Himesama
 | 
			
		||||
  params:
 | 
			
		||||
    - page:
 | 
			
		||||
        desc: "The number of pages to display when listing available gifting options."
 | 
			
		||||
    - itemName:
 | 
			
		||||
        desc: "The name of an item to be gifted, which is used to determine the percentage increase in waifu value."
 | 
			
		||||
        desc: "The number of the page to display."
 | 
			
		||||
    - items:
 | 
			
		||||
        desc: "The name of an item to be gifted. With an optional multiplier prefix."
 | 
			
		||||
      waifu:
 | 
			
		||||
        desc: "The user who is receiving the gift."
 | 
			
		||||
waifulb:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user