diff --git a/Abstractions/Entities/User.cs b/Abstractions/Entities/User.cs index d0d0fa1..89ec110 100644 --- a/Abstractions/Entities/User.cs +++ b/Abstractions/Entities/User.cs @@ -6,7 +6,7 @@ namespace Abstractions.Entities public class User: IdentityUser { public int PaseliAmount { get; set; } = 0; - public string Pin { get; init; } = "0000"; + public string Pin { get; set; } = "0000"; public List Cards { get; init; } = null!; } diff --git a/Core/Server/Handlers/Common/Card/AuthPassCardManegementHandler.cs b/Core/Server/Handlers/Common/Card/AuthPassCardManegementHandler.cs index 8354e29..f683ac7 100644 --- a/Core/Server/Handlers/Common/Card/AuthPassCardManegementHandler.cs +++ b/Core/Server/Handlers/Common/Card/AuthPassCardManegementHandler.cs @@ -27,7 +27,7 @@ public class AuthPassCardManegementHandler(ICardService cardService) : Handler +/// Result of resolving a card for an `inquire`/`gninquire`-style request. +/// When is set, the other fields are unpopulated and the +/// caller should return an early-out response carrying that status. +/// +internal sealed record CardInquireLookup( + int? ErrorStatus, + string KonamiId, + Abstractions.Entities.Card? ExistingCard, + IMedusaPlugin? Plugin, + bool ProfileExists) +{ + /// + /// Shared validation/lookup chain used by both InquireCardManagementHandler and + /// GnInquireCardManagementHandler: resolves the plugin for the model's game code, + /// converts the card UID to a Konami ID, and checks whether a profile exists for it. + /// + public static async Task ResolveAsync(string? cardId, string model, + IPluginService pluginService, ICardService cardService) + { + var gameCode = model.Split(':')[0]; + var plugin = pluginService.FindPlugin(gameCode); + + if (string.IsNullOrEmpty(cardId)) + { + return new CardInquireLookup(111, "", null, null, false); + } + + var konamiId = cardService.ConvertUidToKonamiId(cardId); + + if (string.IsNullOrEmpty(konamiId)) + { + return new CardInquireLookup(111, "", null, null, false); + } + + var existingCard = await cardService.FindByKonamiId(konamiId); + + if (existingCard is null) + { + return new CardInquireLookup(112, konamiId, null, null, false); + } + + if (plugin is null) + { + return new CardInquireLookup(113, konamiId, existingCard, null, false); + } + + var profileExists = await pluginService.DoesProfileExistAsync(plugin, cardId); + + return new CardInquireLookup(null, konamiId, existingCard, plugin, profileExists); + } +} \ No newline at end of file diff --git a/Core/Server/Handlers/Common/Card/GnInquire.cs b/Core/Server/Handlers/Common/Card/GnInquire.cs deleted file mode 100644 index d6d3a7d..0000000 --- a/Core/Server/Handlers/Common/Card/GnInquire.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Abstractions.Handlers; -using System.Xml.Linq; - -namespace Server.Handlers.Common.Card; - -public class GnInquire : HandlerWithoutRequest -{ - public override void Configure() - { - Module("cardmng"); - Method("gninquire"); - } - - public override XDocument Handle(string model) { - var response = new XDocument( - new XElement("response", - new XElement("status", "0"), - new XElement("data", - new XElement("inquire", - new XElement("card", - new XElement("cardid", "1234567890123456"), - new XElement("konamiid", "KONAMI123456"), - new XElement("profileexists", "1") - ) - ) - ) - ) - ); - return response; - } -} diff --git a/Core/Server/Handlers/Common/Card/GnInquireCardManagementHandler.cs b/Core/Server/Handlers/Common/Card/GnInquireCardManagementHandler.cs index 28b323f..4e50242 100644 --- a/Core/Server/Handlers/Common/Card/GnInquireCardManagementHandler.cs +++ b/Core/Server/Handlers/Common/Card/GnInquireCardManagementHandler.cs @@ -16,64 +16,29 @@ namespace Server.Handlers.Common.Card public override async Task HandleAsync(InquireRequest req, string model) { - var splitModel = model.Split(':'); - var gameCode = splitModel[0]; + var lookup = await CardInquireLookup.ResolveAsync(req.CardId, model, pluginService, cardService); - var plugin = pluginService.FindPlugin(gameCode); - - var cardId = req.CardId; - - var inquireResponse = new GnInquireResponse() + if (lookup.ErrorStatus is { } errorStatus) { - Status = 0 + return new GnInquireResponse { Status = errorStatus }; + } + + var flag = lookup.ProfileExists ? "1" : "0"; + var newFlag = lookup.ProfileExists ? "0" : "1"; + + return new GnInquireResponse + { + Status = 0, + Binded = 0, + DataId = lookup.KonamiId, + EcFlag = 1, + Expired = 0, + NewFlag = newFlag, + IsGeniune = flag, + ExtidFlag = flag, + RefId = lookup.KonamiId, + UserIdFlag = flag }; - - if (string.IsNullOrEmpty(cardId)) - { - inquireResponse.Status = 111; - return inquireResponse; - } - - var konamiId = cardService.ConvertUidToKonamiId(cardId); - - if (string.IsNullOrEmpty(konamiId)) - { - inquireResponse.Status = 111; - return inquireResponse; - } - - var exisitngCard = await cardService.FindByKonamiId(konamiId); - - if (exisitngCard == null) - { - inquireResponse.Status = 112; - return inquireResponse; - } - - if (plugin is null) - { - inquireResponse.Status = 113; - return inquireResponse; - } - - var profileExists = await pluginService.DoesProfileExistAsync(plugin, cardId); - - var userIdFlag = profileExists ? "1" : "0"; - var extIdFlag = profileExists ? "1" : "0"; - var newFlag = profileExists ? "0" : "1"; - var isGeniune = profileExists ? "1" : "0"; - - inquireResponse.Binded = 0; - inquireResponse.DataId = konamiId; - inquireResponse.EcFlag = 1; - inquireResponse.Expired = 0; - inquireResponse.NewFlag = newFlag; - inquireResponse.IsGeniune = isGeniune; - inquireResponse.ExtidFlag = extIdFlag; - inquireResponse.RefId = konamiId; - inquireResponse.UserIdFlag = userIdFlag; - - return inquireResponse; } } } diff --git a/Core/Server/Handlers/Common/Card/InquireCardManagementHandler.cs b/Core/Server/Handlers/Common/Card/InquireCardManagementHandler.cs index 0bf23f4..1dfbd45 100644 --- a/Core/Server/Handlers/Common/Card/InquireCardManagementHandler.cs +++ b/Core/Server/Handlers/Common/Card/InquireCardManagementHandler.cs @@ -16,62 +16,28 @@ public class InquireCardManagementHandler(IPluginService pluginService, ICardSer public override async Task HandleAsync(InquireRequest req, string model) { - var splitModel = model.Split(':'); - var gameCode = splitModel[0]; - - var plugin = pluginService.FindPlugin(gameCode); + var lookup = await CardInquireLookup.ResolveAsync(req.CardId, model, pluginService, cardService); - var cardId = req.CardId; - - var inquireResponse = new InquireResponse() + if (lookup.ErrorStatus is { } errorStatus) { - Status = 0 + return new InquireResponse { Status = errorStatus }; + } + + var flag = lookup.ProfileExists ? "1" : "0"; + var newFlag = lookup.ProfileExists ? "0" : "1"; + + return new InquireResponse + { + Status = 0, + Binded = 0, + DataId = lookup.KonamiId, + EcFlag = 1, + Expired = 0, + NewFlag = newFlag, + ExtidFlag = flag, + RefId = lookup.ExistingCard!.Id.ToString().PadLeft(16, '0'), + UserIdFlag = flag, + Pcode = lookup.KonamiId }; - - if (string.IsNullOrEmpty(cardId)) - { - inquireResponse.Status = 111; - return inquireResponse; - } - - var konamiId = cardService.ConvertUidToKonamiId(cardId); - - if(string.IsNullOrEmpty(konamiId)) - { - inquireResponse.Status = 111; - return inquireResponse; - } - - var exisitngCard = await cardService.FindByKonamiId(konamiId); - - if (exisitngCard == null) - { - inquireResponse.Status = 112; - return inquireResponse; - } - - if (plugin is null) - { - inquireResponse.Status = 113; - return inquireResponse; - } - - var profileExists = await pluginService.DoesProfileExistAsync(plugin, cardId); - - var userIdFlag = profileExists ? "1" : "0"; - var extIdFlag = profileExists ? "1" : "0"; - var newFlag = profileExists ? "0" : "1"; - - inquireResponse.Binded = 0; - inquireResponse.DataId = konamiId; - inquireResponse.EcFlag = 1; - inquireResponse.Expired = 0; - inquireResponse.NewFlag = newFlag; - inquireResponse.ExtidFlag = extIdFlag; - inquireResponse.RefId = exisitngCard.Id.ToString().PadLeft(16, '0'); - inquireResponse.UserIdFlag = userIdFlag; - inquireResponse.Pcode = konamiId; - - return inquireResponse; } } \ No newline at end of file