feat(pack): wire real gacha-point balance into /pack/info (skip ticket-only packs)
This commit is contained in:
@@ -80,18 +80,48 @@ public class PackController : SVSimController
|
||||
.Select(i => new { ItemId = (long)EF.Property<int>(i, "ItemId"), i.Count })
|
||||
.ToDictionaryAsync(x => x.ItemId, x => x.Count);
|
||||
|
||||
var gachaPointBalancesByPackId = await _db.Viewers
|
||||
.Where(v => v.Id == viewerId)
|
||||
.SelectMany(v => v.GachaPointBalances)
|
||||
.Select(b => new { b.PackId, b.Points })
|
||||
.ToDictionaryAsync(x => x.PackId, x => x.Points);
|
||||
|
||||
return new PackInfoResponse
|
||||
{
|
||||
PackConfigList = packs.Select(p => ToDto(p, openCounts, ownedItemsByItemId)).ToList(),
|
||||
PackConfigList = packs
|
||||
.Select(p => ToDto(p, openCounts, ownedItemsByItemId, gachaPointBalancesByPackId))
|
||||
.ToList(),
|
||||
};
|
||||
}
|
||||
|
||||
private static PackConfigDto ToDto(
|
||||
PackConfigEntry p,
|
||||
IReadOnlyDictionary<int, ViewerPackOpenCount> openCounts,
|
||||
IReadOnlyDictionary<long, int> ownedItemsByItemId)
|
||||
IReadOnlyDictionary<long, int> ownedItemsByItemId,
|
||||
IReadOnlyDictionary<int, int> gachaPointBalancesByPackId)
|
||||
{
|
||||
int openCount = openCounts.TryGetValue(p.Id, out var oc) ? oc.OpenCount : 0;
|
||||
|
||||
// Ticket-only pack: every child is TICKET (4) or TICKET_MULTI (5). These are
|
||||
// gifted-currency packs (tutorial starter, throwback) that don't participate in
|
||||
// gacha-point accrual or exchange, even if GachaPointConfig is set in seed.
|
||||
bool isTicketOnly = p.ChildGachas.All(c => c.TypeDetail == 4 || c.TypeDetail == 5);
|
||||
|
||||
PackGachaPointDto? gachaPointDto = null;
|
||||
if (p.GachaPointConfig is not null && !isTicketOnly)
|
||||
{
|
||||
int balance = gachaPointBalancesByPackId.TryGetValue(p.Id, out var b) ? b : 0;
|
||||
int threshold = p.GachaPointConfig.ExchangeablePoint;
|
||||
gachaPointDto = new PackGachaPointDto
|
||||
{
|
||||
PackId = p.BasePackId.ToString(CultureInfo.InvariantCulture),
|
||||
GachaPoint = balance,
|
||||
IncreaseGachaPoint = p.GachaPointConfig.IncreaseGachaPoint.ToString(CultureInfo.InvariantCulture),
|
||||
ExchangeableGachaPoint = threshold,
|
||||
IsExchangeableGachaPoint = balance >= threshold,
|
||||
};
|
||||
}
|
||||
|
||||
return new PackConfigDto
|
||||
{
|
||||
ParentGachaId = p.Id,
|
||||
@@ -133,14 +163,7 @@ public class PackController : SVSimController
|
||||
OpenCountLimit = p.OpenCountLimit,
|
||||
IsHide = p.IsHide ? 1 : 0,
|
||||
PackCategory = (int)p.PackCategory,
|
||||
GachaPoint = p.GachaPointConfig is null ? null : new PackGachaPointDto
|
||||
{
|
||||
PackId = p.BasePackId.ToString(CultureInfo.InvariantCulture),
|
||||
GachaPoint = 0,
|
||||
IncreaseGachaPoint = p.GachaPointConfig.IncreaseGachaPoint.ToString(CultureInfo.InvariantCulture),
|
||||
ExchangeableGachaPoint = p.GachaPointConfig.ExchangeablePoint,
|
||||
IsExchangeableGachaPoint = false,
|
||||
},
|
||||
GachaPoint = gachaPointDto,
|
||||
IsPreRelease = p.IsPreRelease,
|
||||
ExistsPurchaseReward = false,
|
||||
IsNew = p.IsNew,
|
||||
|
||||
Reference in New Issue
Block a user