From 12199d99b7f8533705994183a1f1441fbda4b9a4 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 4 Feb 2026 12:43:09 +0800 Subject: [PATCH] :bug: Fix perk subscription getter --- .../Account/AccountCurrentController.cs | 6 +++--- .../Account/AccountEventService.cs | 4 ++++ .../Account/AccountPublicController.cs | 2 +- DysonNetwork.Pass/Account/AccountService.cs | 2 +- DysonNetwork.Pass/Account/AccountServiceGrpc.cs | 3 +-- DysonNetwork.Pass/Leveling/ExperienceService.cs | 17 ++++++++++++++++- .../Registry/RemoteSubscriptionService.cs | 8 +++++--- .../Payment/SubscriptionServiceGrpc.cs | 5 +++-- 8 files changed, 34 insertions(+), 13 deletions(-) diff --git a/DysonNetwork.Pass/Account/AccountCurrentController.cs b/DysonNetwork.Pass/Account/AccountCurrentController.cs index f8a47c60..f3a95727 100644 --- a/DysonNetwork.Pass/Account/AccountCurrentController.cs +++ b/DysonNetwork.Pass/Account/AccountCurrentController.cs @@ -47,7 +47,7 @@ public class AccountCurrentController( try { var subscription = await remoteSubscription.GetPerkSubscription(account.Id); - if (subscription != null) + if (subscription is not null) { account.PerkSubscription = SnWalletSubscription.FromProtoValue(subscription).ToReference(); } @@ -344,7 +344,7 @@ public class AccountCurrentController( // Check PerkSubscription via RemoteSubscriptionService instead of relying on currentUser.PerkSubscription // which is not populated when currentUser comes from HttpContext.Items var perkSubscription = await remoteSubscription.GetPerkSubscription(currentUser.Id); - if (perkSubscription == null) + if (perkSubscription is null) return StatusCode(403, ApiError.Unauthorized( message: "You need to have a subscription to check-in backdated.", forbidden: true, @@ -377,7 +377,7 @@ public class AccountCurrentController( true when !await auth.ValidateCaptcha(captchaToken!) => BadRequest(ApiError.Validation( new Dictionary { - ["captchaToken"] = new[] { "Invalid captcha token." } + ["captchaToken"] = ["Invalid captcha token."] }, traceId: HttpContext.TraceIdentifier)), _ => await events.CheckInDaily(currentUser, backdated) }; diff --git a/DysonNetwork.Pass/Account/AccountEventService.cs b/DysonNetwork.Pass/Account/AccountEventService.cs index 54e31efd..5c07cff7 100644 --- a/DysonNetwork.Pass/Account/AccountEventService.cs +++ b/DysonNetwork.Pass/Account/AccountEventService.cs @@ -19,6 +19,7 @@ public class AccountEventService( RingService.RingServiceClient pusher, Pass.Leveling.ExperienceService experienceService, RemotePaymentService payment, + RemoteSubscriptionService subscriptions, INatsConnection nats ) { @@ -223,6 +224,9 @@ public class AccountEventService( public async Task CheckInDailyDoAskCaptcha(SnAccount user) { + var perkSubscription = await subscriptions.GetPerkSubscription(user.Id); + if (perkSubscription is not null) return false; + var cacheKey = $"{CaptchaCacheKey}{user.Id}"; var needsCaptcha = await cache.GetAsync(cacheKey); if (needsCaptcha is not null) diff --git a/DysonNetwork.Pass/Account/AccountPublicController.cs b/DysonNetwork.Pass/Account/AccountPublicController.cs index f8ad77a2..18f11558 100644 --- a/DysonNetwork.Pass/Account/AccountPublicController.cs +++ b/DysonNetwork.Pass/Account/AccountPublicController.cs @@ -32,7 +32,7 @@ public class AccountPublicController( try { var subscription = await remoteSubscription.GetPerkSubscription(account.Id); - if (subscription != null) + if (subscription is not null) { account.PerkSubscription = SnWalletSubscription.FromProtoValue(subscription).ToReference(); } diff --git a/DysonNetwork.Pass/Account/AccountService.cs b/DysonNetwork.Pass/Account/AccountService.cs index 879615dc..1d8c2d0b 100644 --- a/DysonNetwork.Pass/Account/AccountService.cs +++ b/DysonNetwork.Pass/Account/AccountService.cs @@ -768,7 +768,7 @@ public class AccountService( try { var subscription = await remoteSubscription.GetPerkSubscription(account.Id); - if (subscription != null) + if (subscription is not null) { account.PerkSubscription = SnWalletSubscription.FromProtoValue(subscription).ToReference(); } diff --git a/DysonNetwork.Pass/Account/AccountServiceGrpc.cs b/DysonNetwork.Pass/Account/AccountServiceGrpc.cs index 96a79fef..22ce5c50 100644 --- a/DysonNetwork.Pass/Account/AccountServiceGrpc.cs +++ b/DysonNetwork.Pass/Account/AccountServiceGrpc.cs @@ -297,7 +297,7 @@ public class AccountServiceGrpc( try { var subscription = await remoteSubscription.GetPerkSubscription(account.Id); - if (subscription != null) + if (subscription is not null) { account.PerkSubscription = SnWalletSubscription.FromProtoValue(subscription).ToReference(); } @@ -321,7 +321,6 @@ public class AccountServiceGrpc( var subscriptions = await remoteSubscription.GetPerkSubscriptions(accountIds); var subscriptionDict = subscriptions - .Where(s => s != null) .ToDictionary( s => Guid.Parse(s.AccountId), s => SnWalletSubscription.FromProtoValue(s).ToReference() diff --git a/DysonNetwork.Pass/Leveling/ExperienceService.cs b/DysonNetwork.Pass/Leveling/ExperienceService.cs index e10510af..1de2a7b7 100644 --- a/DysonNetwork.Pass/Leveling/ExperienceService.cs +++ b/DysonNetwork.Pass/Leveling/ExperienceService.cs @@ -1,9 +1,10 @@ using DysonNetwork.Shared.Models; +using DysonNetwork.Shared.Registry; using Microsoft.EntityFrameworkCore; namespace DysonNetwork.Pass.Leveling; -public class ExperienceService(AppDatabase db) +public class ExperienceService(AppDatabase db, RemoteSubscriptionService subscriptions) { public async Task AddRecord(string reasonType, string reason, long delta, Guid accountId) { @@ -15,6 +16,20 @@ public class ExperienceService(AppDatabase db) AccountId = accountId, }; + var perkSubscription = await subscriptions.GetPerkSubscription(accountId); + if (perkSubscription is not null) + { + record.BonusMultiplier = perkSubscription.Identifier switch + { + SubscriptionType.Stellar => 1.5, + SubscriptionType.Nova => 2, + SubscriptionType.Supernova => 2.5, + _ => 1 + }; + if (record.Delta >= 0) + record.Delta = (long)Math.Floor(record.Delta * record.BonusMultiplier); + } + db.ExperienceRecords.Add(record); await db.SaveChangesAsync(); diff --git a/DysonNetwork.Shared/Registry/RemoteSubscriptionService.cs b/DysonNetwork.Shared/Registry/RemoteSubscriptionService.cs index 51cf2181..97549dcc 100644 --- a/DysonNetwork.Shared/Registry/RemoteSubscriptionService.cs +++ b/DysonNetwork.Shared/Registry/RemoteSubscriptionService.cs @@ -15,11 +15,12 @@ public class RemoteSubscriptionService(SubscriptionService.SubscriptionServiceCl return response; } - public async Task GetPerkSubscription(Guid accountId) + public async Task GetPerkSubscription(Guid accountId) { var request = new GetPerkSubscriptionRequest { AccountId = accountId.ToString() }; var response = await subscription.GetPerkSubscriptionAsync(request); - return response; + // Return null if subscription is empty (user has no active perk subscription) + return string.IsNullOrEmpty(response.Id) ? null : response; } public async Task> GetPerkSubscriptions(List accountIds) @@ -27,7 +28,8 @@ public class RemoteSubscriptionService(SubscriptionService.SubscriptionServiceCl var request = new GetPerkSubscriptionsRequest(); request.AccountIds.AddRange(accountIds.Select(id => id.ToString())); var response = await subscription.GetPerkSubscriptionsAsync(request); - return response.Subscriptions.ToList(); + // Filter out empty subscriptions (users with no active perk subscription) + return response.Subscriptions.Where(s => !string.IsNullOrEmpty(s.Id)).ToList(); } public async Task CreateSubscription( diff --git a/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs b/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs index 252e5e4d..fa3cc6b9 100644 --- a/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs +++ b/DysonNetwork.Wallet/Payment/SubscriptionServiceGrpc.cs @@ -32,8 +32,9 @@ public class SubscriptionServiceGrpc( var subscription = await subscriptionService.GetPerkSubscriptionAsync( Guid.Parse(request.AccountId) ); - return subscription?.ToProtoValue() - ?? throw new RpcException(new Status(StatusCode.NotFound, "Perk subscription not found")); + // Return empty subscription if user has no active perk subscription (valid case) + // RemoteSubscriptionService will convert empty subscription to null + return subscription?.ToProtoValue() ?? new Subscription { Id = "" }; } public override async Task GetPerkSubscriptions(