From 23176551b74942fa5ac35e3d4163b3a589719f11 Mon Sep 17 00:00:00 2001 From: bcjang Date: Thu, 1 May 2025 07:23:28 +0900 Subject: [PATCH] =?UTF-8?q?250501=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BrokerApiCore/ApiModels/AccountApiModel.cs | 6 +- BrokerApiCore/ApiModels/AdminModel.cs | 6 +- BrokerApiCore/ApiModels/CommonApiModel.cs | 5 +- BrokerApiCore/ApiModels/ExchangeApiModel.cs | 13 +- BrokerApiCore/ApiModels/PlanetAuthApiModel.cs | 6 +- .../ApiModels/PlanetItemExchangeApiModel.cs | 6 +- .../ApiModels/PlanetItemExchangeOrderDto.cs | 9 +- BrokerApiCore/ApiModels/UserApiModel.cs | 2 +- .../LogActor/PlanetProviderLogActor.cs | 4 +- .../LogActor/PlanetUserLogActor.cs | 16 +- .../PlanetItemExchangeBusinessLog.cs | 5 +- .../PlanetProviderAuthBusinessLog.cs | 7 +- .../PlanetUserAuthBusinessLog.cs | 9 +- BrokerApiCore/BrokerServerLogic.cs | 22 +- BrokerApiCore/Common/ApiException.cs | 2 +- BrokerApiCore/Common/ApiExtensions.cs | 6 +- BrokerApiCore/Common/Guard.cs | 10 +- BrokerApiCore/Common/Helpers.cs | 25 +- BrokerApiCore/Common/JwtOption.cs | 2 +- BrokerApiCore/Common/ResultFailException.cs | 2 +- BrokerApiCore/DbEntity/PlanetInfo.cs | 2 +- .../DbEntity/PlanetItemExchangeOrder.cs | 2 +- ...PlanetItemExchangeOrderAmountTotalLimit.cs | 2 +- .../PlanetItemExchangeOrderAmountUserLimit.cs | 2 +- .../DbEntity/SapphireExchangeOrder.cs | 2 +- BrokerApiCore/DbEntity/SsoAccountInfo.cs | 4 +- .../Entity/Actions/BrokerMailSendAction.cs | 10 +- .../Entity/Actions/UserAuthAction.cs | 13 +- BrokerApiCore/Entity/BrokerMailEntity.cs | 9 +- .../Entity/Helpers/EntityExtensions.cs | 6 +- BrokerApiCore/Entity/Helpers/EntityHelper.cs | 14 +- .../Entity/Helpers/MailSendOption.cs | 4 +- BrokerApiCore/Entity/PlanetUserEntity.cs | 11 +- .../Meta/BrokerApiMetaDataManager.cs | 2 +- BrokerApiCore/Meta/BrokerMetaDataManager.cs | 6 +- .../Meta/PlanetItemExchangePolicy.cs | 23 - ...217015116_SchemaChanges_105106.Designer.cs | 7 +- .../20250217015116_SchemaChanges_105106.cs | 2 +- ...224031421_SchemaChanges_121410.Designer.cs | 6 +- .../20250224031421_SchemaChanges_121410.cs | 2 +- ...314055515_SchemaChanges_145503.Designer.cs | 7 +- .../20250314055515_SchemaChanges_145503.cs | 2 +- ...314062930_SchemaChanges_152918.Designer.cs | 6 +- .../20250314062930_SchemaChanges_152918.cs | 2 +- ...314063529_SchemaChanges_153518.Designer.cs | 6 +- .../20250314063529_SchemaChanges_153518.cs | 2 +- ...314070903_SchemaChanges_160851.Designer.cs | 6 +- .../20250314070903_SchemaChanges_160851.cs | 2 +- ...317020124_SchemaChanges_110113.Designer.cs | 6 +- .../20250317020124_SchemaChanges_110113.cs | 2 +- ...317030502_SchemaChanges_120450.Designer.cs | 6 +- .../20250317030502_SchemaChanges_120450.cs | 2 +- ...317032756_SchemaChanges_122745.Designer.cs | 6 +- .../20250317032756_SchemaChanges_122745.cs | 2 +- ...321034709_SchemaChanges_124658.Designer.cs | 6 +- .../20250321034709_SchemaChanges_124658.cs | 2 +- ...324074920_SchemaChanges_164908.Designer.cs | 6 +- .../20250324074920_SchemaChanges_164908.cs | 2 +- .../MetaverseBrokerDbContextModelSnapshot.cs | 7 +- BrokerApiCore/Repository/PlanetInfoRepo.cs | 10 +- ...etItemExchangeOrderAmountTotalLimitRepo.cs | 7 +- ...netItemExchangeOrderAmountUserLimitRepo.cs | 7 +- .../Repository/PlanetItemExchangeOrderRepo.cs | 9 +- .../Repository/SapphireExchangeOrderRepo.cs | 240 -- .../SqlConfig/PlanetExchangeOrderConfig.cs | 4 +- .../Repository/SqlConfig/PlanetInfoConfig.cs | 6 +- ...ItemExchangeOrderAmountTotalLimitConfig.cs | 3 +- ...tItemExchangeOrderAmountUserLimitConfig.cs | 4 +- .../SqlConfig/SapphireExchangeOrderConfig.cs | 6 +- .../SqlContext/MetaverseBrokerDbContext.cs | 17 +- .../SqlContext/SsoAccountDbContext.cs | 4 +- BrokerApiCore/Repository/SsoAccountRepo.cs | 4 +- BrokerApiCore/Repository/UserBaseDocRepo.cs | 6 +- BrokerApiCore/Services/EchoSystemService.cs | 11 +- BrokerApiCore/Services/JwtGenerator.cs | 5 +- BrokerApiCore/Services/JwtService.cs | 185 -- BrokerApiCore/Services/PlanetService.cs | 14 +- .../DailyAmountLimitChecker.cs | 14 +- .../Interfaces/IOrderCompletionStrategy.cs | 8 +- .../Interfaces/IOrderCreationStrategy.cs | 4 +- .../Interfaces/IOrderStrategyProvider.cs | 2 +- .../Interfaces/OrderStrategyProvider.cs | 6 +- .../PlanetItemExchangeService.cs | 22 +- .../ServiceCollectionExtensions.cs | 5 +- .../CurrencyExchangeCreationStrategy.cs | 19 +- .../CurrencyOrderCompletionStrategy.cs | 6 +- .../ProductExchangeCreationStrategy.cs | 12 +- .../ProductOrderCompletionStrategy.cs | 21 +- BrokerApiCore/Services/UserAuthService.cs | 17 +- .../BrokerApiCore.csproj.nuget.dgspec.json | 352 ++- .../obj/BrokerApiCore.csproj.nuget.g.props | 13 +- .../obj/BrokerApiCore.csproj.nuget.g.targets | 5 +- .../obj/Debug/BrokerApiCore.assets.cache | Bin 89902 -> 111234 bytes ...okerApiCore.csproj.AssemblyReference.cache | Bin 40747 -> 60502 bytes BrokerApiCore/obj/project.assets.json | 2198 +++++++++++++--- BrokerApiCore/obj/project.nuget.cache | 97 +- BrokerApiCore/obj/project.packagespec.json | 2 +- BrokerApiCore/obj/rider.project.restore.info | 2 +- BrokerApiServer/Common/ApiControllerBase.cs | 5 +- BrokerApiServer/Common/CommandLineOption.cs | 5 +- BrokerApiServer/Common/Const.cs | 2 +- .../Common/PlanetAuthControllerBase.cs | 2 +- .../Common/RequireAdminAuthAttribute.cs | 9 +- .../Common/RequirePlanetAuthAttribute.cs | 7 +- .../Common/RequireUserJwtAuthAttribute.cs | 6 +- .../Common/ResultExceptionFilter.cs | 11 +- .../Common/ResultLoggingMiddleware.cs | 4 +- .../Common/SwaggerSettingHelper.cs | 2 +- .../Controllers/AdminController.cs | 18 +- .../Controllers/PlanetController.cs | 9 +- .../Controllers/PlanetUserController.cs | 15 +- .../Extensions/AppBuilderExtensions.cs | 24 +- .../ForceStopServerPacketHandler.cs | 18 +- .../StopServerPacketHandler.cs | 12 +- BrokerApiServer/Program.cs | 24 +- .../Properties/launchSettings.json | 2 +- .../ControllerTests/AccontControllerTests.cs | 163 -- .../CurrencyControllerTests.cs | 13 +- .../DevCurrencyControllerTests.cs | 14 +- .../Dev_PlanetUserControllerTests.cs | 179 -- .../ControllerTests/PlanetControllerTests.cs | 52 +- .../PlanetUserControllerTests.cs | 8 +- .../QAPlanetUserControllerTests.cs | 13 +- .../QaCurrencyControllerTests.cs | 115 - .../StagePlanetUserControllerTests.cs | 14 +- BrokerApiTest/DocQuery/DataExample.cs | 120 +- BrokerApiTest/DocQuery/DynamoDbClientTests.cs | 2 +- BrokerApiTest/DocQuery/EntityBaseTests.cs | 11 +- BrokerApiTest/DocQuery/UserTestAttrib.cs | 1 + .../DocQuery/UserTestDeleteOneAction.cs | 5 +- BrokerApiTest/DocQuery/UserTestDoc.cs | 4 +- BrokerApiTest/DocQuery/UserTestEntity.cs | 8 +- .../DocQuery/UserTestEntityAttribute.cs | 1 + .../DocQuery/UserTestFindOneAction.cs | 5 +- .../DocQuery/UserTestInsertAction.cs | 1 + .../DocQuery/UserTestUpdateOneAction.cs | 4 +- BrokerApiTest/EntityTests/EntityMailTests.cs | 14 +- BrokerApiTest/EntityTests/EntityTests.cs | 31 +- BrokerApiTest/Etc/SecurityKeyTests.cs | 25 +- BrokerApiTest/Helper/BrokerTestServer.cs | 20 +- .../Helper/DocRepo/AccountDocRepo.cs | 19 - .../Helper/DocRepo/CaliumEventDocRepo.cs | 53 - .../Helper/DocRepo/CaliumStorageDocRepo.cs | 28 - .../Helper/DocRepo/CaliumStorageRepo.cs | 30 - BrokerApiTest/Helper/DocRepo/MoneyDocRepo.cs | 445 ---- .../Helper/DocRepo/PlanetInfoCache.cs | 71 - .../Helper/DocRepo/UserBaseDocRepo.cs | 67 - BrokerApiTest/Helper/MetaTableTestHelper.cs | 3 +- BrokerApiTest/Helper/TestUserHelper.cs | 14 +- BrokerApiTest/Helper/ValueResult.cs | 18 - BrokerApiTest/Jwt/JwtBasicTests.cs | 18 +- BrokerApiTest/Jwt/SSOTests.cs | 48 - .../Services/ExchangeServiceTests.cs | 6 - .../Services/UserAuthServiceTests.cs | 1 - .../TestHelper/DocRepo/AccountDocRepo.cs | 19 - .../TestHelper/DocRepo/CaliumEventDocRepo.cs | 53 - .../DocRepo/CaliumStorageDocRepo.cs | 28 - .../TestHelper/DocRepo/CaliumStorageRepo.cs | 30 - .../TestHelper/DocRepo/MoneyDocRepo.cs | 445 ---- .../TestHelper/DocRepo/PlanetInfoCache.cs | 71 - .../TestHelper/DocRepo/UserBaseDocRepo.cs | 67 - BrokerApiTest/TestHelper/Helpers.cs | 93 - BrokerApiTest/TestHelper/ValueResult.cs | 18 - BrokerApiTest/User/UserDocRepoTests.cs | 133 - ...msCoverageSourceRootsMapping_BrokerApiTest | Bin 3336 -> 5246 bytes .../BrokerApiTest.csproj.nuget.dgspec.json | 472 +++- .../obj/BrokerApiTest.csproj.nuget.g.props | 13 +- .../obj/BrokerApiTest.csproj.nuget.g.targets | 5 +- .../Debug/net8.0/BrokerApiTest.assets.cache | Bin 111094 -> 133027 bytes ...okerApiTest.csproj.AssemblyReference.cache | Bin 62417 -> 83075 bytes BrokerApiTest/obj/project.assets.json | 2222 ++++++++++++++--- BrokerApiTest/obj/project.nuget.cache | 95 +- BrokerApiTest/obj/project.packagespec.json | 2 +- BrokerApiTest/obj/rider.project.restore.info | 2 +- .../BeaconShop/Action/BeaconShopAction.cs | 196 +- .../Contents/BeaconShop/BeaconShopItem.cs | 4 +- .../BeaconShop/Helper/BeaconShopHelper.cs | 40 +- .../Log/BeaconShopBusinessLogHelper.cs | 8 +- .../PacketHandler/BeaconShopNotifyHelper.cs | 7 +- .../Contents/Craft/Action/CraftAction.cs | 2 +- .../GameMode/Action/GameGameObjectAction.cs | 44 + .../GameMode/Helper/GameModeConstants.cs | 8 + .../GameMode/Helper/GameModeHelper.cs | 253 +- .../GameMode/Helper/GameNotifyHelper.cs | 35 + .../GameMode/InteractionObject/GameObject.cs | 76 + .../Manage/GameModeInitHandlerBase.cs | 30 - .../Manage/GameModeJoinHandlerBase.cs | 30 - .../GameMode/Manage/GameRoomInitHandler.cs | 24 - .../GameMode/Manage/GameRoomJoinHandler.cs | 27 - .../GameMode/Manage/IGameModeJoinHandler.cs | 13 - .../JoinManage/GameModeInitHandlerBase.cs | 55 + .../JoinManage/GameModeJoinHandlerBase.cs | 20 + .../GameModeJoinSuccessHandlerBase.cs | 22 +- .../{ => JoinManage}/IGameModeInitHandler.cs | 2 +- .../Manage/JoinManage/IGameModeJoinHandler.cs | 9 + .../IGameModeJoinSuccessHandler.cs | 3 +- .../LeaveManage/GameModeDestroyHandlerBase.cs | 76 + .../LeaveManage/GameModeLeaveHandlerBase.cs | 125 + .../LeaveManage/IGameModeDestroyHandler.cs | 7 + .../LeaveManage/IGameModeLeaveHandler.cs | 6 + .../Manage/PlayManage/GameModeBase.cs | 135 + .../PlayManage/GameModeLifeCycleTicker.cs | 54 + .../Manage/PlayManage/GameModeManager.cs | 71 + .../Manage/PlayManage/IDeadHandler.cs | 6 + .../GameMode/Manage/PlayManage/IGameMode.cs | 6 + .../Manage/PlayManage/IGameModeGenre.cs | 6 + .../GameMode/Manage/PlayManage/IGameObject.cs | 6 + .../Manage/StateManage/GameModeStateBase.cs | 42 + .../Manage/StateManage/IGameModeState.cs | 14 + .../GameMode/Mode-Battle/Cheat/BattleCheat.cs | 179 -- .../Manage/BattleInstanceInitHandler.cs | 37 - .../Manage/BattleInstanceJoinHandler.cs | 47 - .../Manage/BattleInstanceManager.cs | 326 +-- .../Mode-Battle/Manage/BattleInstanceRoom.cs | 56 +- .../Manage/BattleInstanceRoomHandler.cs | 30 +- .../Mode-Battle/Manage/GameModeTPS.cs | 27 + .../Mode-Battle/Manage/IBattleMode.cs | 6 + .../GameMode/Mode-Battle/Manage/ITPSMode.cs | 6 + .../Action/BattleInstanceAction.cs | 144 +- .../Action/BattleInstanceStateUpdateAction.cs | 78 +- .../Action/BattleInstanceUpdateAction.cs | 178 +- .../Action/BattleLocationAction.cs | 3 +- .../Action/BattleObjectInteractAction.cs | 12 +- .../Action/BattleObjectRewardAction.cs | 11 +- .../Action/BattleZoneMoveAction.cs | 12 +- .../FfaGameObjectPodStorageInteractAction.cs | 57 + .../ModeFreeForAll/Cheat/BattleCheat.cs | 145 ++ .../Doc/BattleEventDoc.cs | 3 +- .../Entity/BattleInstanceRoom.cs | 78 + .../Entity/BattleInstanceSnapshotAttribute.cs | 3 +- .../Entity/BattleInstanceSnapshotDoc.cs | 3 +- .../Entity/BattlePlayer.cs | 9 +- .../Entity/SystemBattleEvent.cs | 2 +- .../Helper/BattleConstant.cs | 0 .../Helper/BattleInstancePlayModeHelper.cs | 10 +- .../BattleObjectInteractionLogicHandler.cs | 10 +- .../Helper/BattleRoomHelper.cs | 27 +- .../Helper/BattleRoomNotifyHelper.cs | 78 +- .../Log/BattleEventLog.cs | 9 - .../Log/BattleInstanceActorLog.cs | 8 - .../Log/BattleObjectInteractionBusinessLog.cs | 11 +- .../Log/BattleObjectStateUpdateBusinessLog.cs | 12 +- .../Log/BattlePodCombatRewardBusinessLog.cs | 11 +- .../Log/BattleRespawnBusinessLog.cs | 14 +- .../Log/BattleRoomJoinBusinessLog.cs | 11 +- .../Log/BattleRoomPlayerDeadBusinessLog.cs | 11 +- .../Log/BattleRoundUpdateBusinessLog.cs | 14 +- .../Log/BattleSnapShotBusinessLog.cs | 24 +- .../Manage/GameModeTPSFreeForAll.cs} | 386 ++- .../Manage/GameModeTPSFreeForAllData.cs | 12 + .../Manage/TPSFreeForAllDestroyHandler.cs | 76 + .../Manage/TPSFreeForAllInitHandler.cs | 46 + .../Manage/TPSFreeForAllJoinHandler.cs | 48 + .../TPSFreeForAllJoinSuccessHandler.cs} | 69 +- .../Manage/TPSFreeForAllLeaveHandler.cs | 47 + .../BattleObjectInteractionPacketHandler.cs | 75 +- .../BattlePlayerDeadPacketHandler.cs | 43 +- .../BattlePlayerRespawnPacketHandler.cs | 49 +- .../JoinBattleInstancePacketHandler.cs | 15 +- .../LeaveBattleInstancePacketHandler.cs | 24 +- ...onForLeavingBattleInstancePacketHandler.cs | 39 +- .../Redis/BattleInstanceRoomStorage.cs | 17 +- .../Reward/RewardPickupPod.cs | 0 .../Reward/RewardPodCombat.cs | 13 +- .../Reward/RewardPodStorage.cs | 0 .../Tickers/BattleEventCheckTicker.cs | 5 +- .../Tickers/BattleEventNotifyTicker.cs | 17 +- .../Manage/GameModeTPSTeamDeathMatch.cs | 19 + .../Manage/GameModeTPSTeamDeathMatchData.cs | 13 + .../Manage/TPSTeamDeathMatchDestroyHandler.cs | 21 + .../Manage/TPSTeamDeathMatchInitHandler.cs | 17 + .../Manage/TPSTeamDeathMatchJoinHandler.cs | 30 + .../TPSTeamDeathMatchJoinSuccessHandler.cs | 48 + .../Manage/TPSTeamDeathMatchLeaveHandler.cs | 39 + .../ArcadeRunningInstanceInitHandler.cs | 37 - .../ArcadeRunningInstanceJoinHandler.cs | 36 - ...ArcadeRunningInstanceJoinSuccessHandler.cs | 45 - .../Mode-Running/Manage/GameModeRun.cs | 40 + .../Mode-Running/Manage/IRunningMode.cs | 6 + .../Manage/GameModeRunAdventure.cs | 18 + .../Manage/GameModeRunAdventureData.cs | 12 + .../Manage/RunAdventureDestroyHandler.cs | 20 + .../Manage/RunAdventureInitHandler.cs | 18 + .../Manage/RunAdventureJoinHandler.cs | 30 + .../Manage/RunAdventureJoinSuccessHandler.cs} | 12 +- .../Manage/RunAdventureLeaveHandler.cs | 38 + .../RaceGameObjectSavePointInteractAction.cs | 43 + .../ModeRace/Actions/RaceStateCheckAction.cs | 63 + .../ModeRace/Helper/RunRaceHelper.cs | 27 + .../ModeRace/Manage/GameModeRunRace.cs | 88 + .../ModeRace/Manage/GameModeRunRaceData.cs | 21 + .../ModeRace/Manage/RunRaceDestroyHandler.cs | 24 + .../ModeRace/Manage/RunRaceInitHandler.cs | 21 + .../ModeRace/Manage/RunRaceJoinHandler.cs | 31 + .../Manage/RunRaceJoinSuccessHandler.cs | 65 + .../ModeRace/Manage/RunRaceLeaveHandler.cs | 37 + .../ModeRace/State/RaceStateDestroyed.cs | 34 + .../ModeRace/State/RaceStateEnd.cs | 33 + .../ModeRace/State/RaceStateReady.cs | 38 + .../ModeRace/State/RaceStateStart.cs | 45 + .../GameObjectInteractionPacketHandler.cs | 121 + .../ItemCloth/Action/ItemClothAction.cs | 2 +- .../Loginout/Action/GameLogoutAction.cs | 17 - .../SaveMyhomeUgcPacketHandler.cs | 15 + GameServer/Contents/Quest/QuestCheat.cs | 43 +- .../Rental/Action/RentalAgentAction.cs | 15 + GameServer/Contents/Shop/Action/ShopAction.cs | 2 +- .../Base/Action/InventoryActionBase.cs | 16 +- .../Entity/Npc/UgcNpc/Action/UgcNpcAction.cs | 2 +- .../UgcNpc/Action/UgcNpcBeaconShopAction.cs | 11 + GameServer/GameServer.csproj | 4 - .../NtfBeaconShopUpdateItemMQPacketHandler.cs | 5 +- GameServer/Room/InstanceRoom.cs | 12 +- GameServer/Ticker/BuildingUpdateTicker.cs | 7 + ...84d37dc17d97d2ff284ad3fcd7b54aa74.svn-base | 65 + ...99025188018cf545592fb1296325f3377.svn-base | 459 ++++ Protocol/client-proto/.svn/wc.db | Bin 122880 -> 122880 bytes Protocol/client-proto/Packet.proto | 8 +- Protocol/client-proto/Protocol.proto | 3 +- Protocol/proto/ClientToGame.proto | 50 +- Protocol/proto/Define_Result.proto | 7 +- Protocol/proto/Game_Define.proto | 50 +- Protocol/proto/ServerMessage.proto | 1 + ServerBase/Entity/Task/EntityTicker.cs | 2 +- ServerBase/Helper/ResultHelper.cs | 147 +- ServerBase/MessageQueue/RabbitMqConnector.cs | 57 +- .../Battle/BattleInstancesObjects.cs | 1 - .../BusinessLog/Domain/BeaconShopData.cs | 3 + .../Domain/PlanetItemExchangeLogData.cs | 2 +- .../Domain/PlanetProviderAuthLogData.cs | 2 +- .../Domain/PlanetUserAuthLogData.cs | 2 +- .../1. Define/BusinessLog/Enum/LogEnum.cs | 2 + ServerCommon/1. Define/TypeDefine.cs | 20 + .../Doc/OwnerContents/BeaconShopItemDoc.cs | 3 + ServerCommon/Doc/OwnerContents/ItemDoc.cs | 5 +- .../Attribute/BeaconShopItemAttribute.cs | 27 +- .../Entity/Attribute/ItemAttributeBase.cs | 14 +- .../Entity/Attribute/MyhomeItemAttribute.cs | 2 +- .../Entity/Attribute/UgcNpcItemAttribute.cs | 2 +- .../Entity/Attribute/UserItemAttribute.cs | 4 +- ServerCommon/MetaData/MetaEnums.cs | 13 + ServerCommon/ProudNet/ProudNetListener.cs | 7 +- ServerCore/Config/ConfigManager.cs | 194 +- .../ConfigManagerConfigurationProvider.cs | 66 + .../ConfigManagerConfigurationSource.cs | 19 + ServerCore/Config/ConfigManagerHelper.cs | 31 + ServerCore/Exception/ConditionCheckHelper.cs | 54 +- .../Exception/NullReferenceCheckHelper.cs | 32 +- ServerCore/Log/Logger.cs | 224 -- ServerCore/Log/NLog.cs | 116 + ServerCore/Log/NLogHelper.cs | 112 + ServerCore/ServerCore.csproj | 14 + UGQDataAccess/UGQDataAccess.csproj | 12 - 353 files changed, 9972 insertions(+), 6652 deletions(-) delete mode 100644 BrokerApiCore/Meta/PlanetItemExchangePolicy.cs delete mode 100644 BrokerApiCore/Repository/SapphireExchangeOrderRepo.cs delete mode 100644 BrokerApiCore/Services/JwtService.cs delete mode 100644 BrokerApiTest/ControllerTests/AccontControllerTests.cs delete mode 100644 BrokerApiTest/ControllerTests/Dev_PlanetUserControllerTests.cs delete mode 100644 BrokerApiTest/ControllerTests/QaCurrencyControllerTests.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/AccountDocRepo.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/CaliumEventDocRepo.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/CaliumStorageDocRepo.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/CaliumStorageRepo.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/MoneyDocRepo.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/PlanetInfoCache.cs delete mode 100644 BrokerApiTest/Helper/DocRepo/UserBaseDocRepo.cs delete mode 100644 BrokerApiTest/Helper/ValueResult.cs delete mode 100644 BrokerApiTest/Jwt/SSOTests.cs delete mode 100644 BrokerApiTest/Services/ExchangeServiceTests.cs delete mode 100644 BrokerApiTest/Services/UserAuthServiceTests.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/AccountDocRepo.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/CaliumEventDocRepo.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/CaliumStorageDocRepo.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/CaliumStorageRepo.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/MoneyDocRepo.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/PlanetInfoCache.cs delete mode 100644 BrokerApiTest/TestHelper/DocRepo/UserBaseDocRepo.cs delete mode 100644 BrokerApiTest/TestHelper/Helpers.cs delete mode 100644 BrokerApiTest/TestHelper/ValueResult.cs delete mode 100644 BrokerApiTest/User/UserDocRepoTests.cs create mode 100644 GameServer/Contents/GameMode/Action/GameGameObjectAction.cs create mode 100644 GameServer/Contents/GameMode/Helper/GameModeConstants.cs create mode 100644 GameServer/Contents/GameMode/Helper/GameNotifyHelper.cs create mode 100644 GameServer/Contents/GameMode/InteractionObject/GameObject.cs delete mode 100644 GameServer/Contents/GameMode/Manage/GameModeInitHandlerBase.cs delete mode 100644 GameServer/Contents/GameMode/Manage/GameModeJoinHandlerBase.cs delete mode 100644 GameServer/Contents/GameMode/Manage/GameRoomInitHandler.cs delete mode 100644 GameServer/Contents/GameMode/Manage/GameRoomJoinHandler.cs delete mode 100644 GameServer/Contents/GameMode/Manage/IGameModeJoinHandler.cs create mode 100644 GameServer/Contents/GameMode/Manage/JoinManage/GameModeInitHandlerBase.cs create mode 100644 GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinHandlerBase.cs rename GameServer/Contents/GameMode/Manage/{ => JoinManage}/GameModeJoinSuccessHandlerBase.cs (67%) rename GameServer/Contents/GameMode/Manage/{ => JoinManage}/IGameModeInitHandler.cs (70%) create mode 100644 GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinHandler.cs rename GameServer/Contents/GameMode/Manage/{ => JoinManage}/IGameModeJoinSuccessHandler.cs (63%) create mode 100644 GameServer/Contents/GameMode/Manage/LeaveManage/GameModeDestroyHandlerBase.cs create mode 100644 GameServer/Contents/GameMode/Manage/LeaveManage/GameModeLeaveHandlerBase.cs create mode 100644 GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeDestroyHandler.cs create mode 100644 GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeLeaveHandler.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/GameModeLifeCycleTicker.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/GameModeManager.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/IDeadHandler.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/IGameMode.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/IGameModeGenre.cs create mode 100644 GameServer/Contents/GameMode/Manage/PlayManage/IGameObject.cs create mode 100644 GameServer/Contents/GameMode/Manage/StateManage/GameModeStateBase.cs create mode 100644 GameServer/Contents/GameMode/Manage/StateManage/IGameModeState.cs delete mode 100644 GameServer/Contents/GameMode/Mode-Battle/Cheat/BattleCheat.cs delete mode 100644 GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceInitHandler.cs delete mode 100644 GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/Manage/GameModeTPS.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/Manage/IBattleMode.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/Manage/ITPSMode.cs rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleInstanceAction.cs (68%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleInstanceStateUpdateAction.cs (85%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleInstanceUpdateAction.cs (82%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleLocationAction.cs (99%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleObjectInteractAction.cs (95%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleObjectRewardAction.cs (92%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Action/BattleZoneMoveAction.cs (99%) create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/FfaGameObjectPodStorageInteractAction.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Cheat/BattleCheat.cs rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Doc/BattleEventDoc.cs (99%) create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceRoom.cs rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Entity/BattleInstanceSnapshotAttribute.cs (99%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Entity/BattleInstanceSnapshotDoc.cs (99%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Entity/BattlePlayer.cs (81%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Entity/SystemBattleEvent.cs (94%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Helper/BattleConstant.cs (100%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Helper/BattleInstancePlayModeHelper.cs (95%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Helper/BattleObjectInteractionLogicHandler.cs (94%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Helper/BattleRoomHelper.cs (91%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Helper/BattleRoomNotifyHelper.cs (72%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleEventLog.cs (71%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleInstanceActorLog.cs (84%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleObjectInteractionBusinessLog.cs (73%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleObjectStateUpdateBusinessLog.cs (76%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattlePodCombatRewardBusinessLog.cs (80%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleRespawnBusinessLog.cs (73%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleRoomJoinBusinessLog.cs (76%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleRoomPlayerDeadBusinessLog.cs (79%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleRoundUpdateBusinessLog.cs (71%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Log/BattleSnapShotBusinessLog.cs (77%) rename GameServer/Contents/GameMode/Mode-Battle/{Entity/BattleInstanceRoom.cs => ModeFreeForAll/Manage/GameModeTPSFreeForAll.cs} (58%) create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAllData.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllDestroyHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllInitHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinHandler.cs rename GameServer/Contents/GameMode/Mode-Battle/{Manage/BattleInstanceJoinSuccessHandler.cs => ModeFreeForAll/Manage/TPSFreeForAllJoinSuccessHandler.cs} (52%) create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllLeaveHandler.cs rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/PacketHandler/BattleObjectInteractionPacketHandler.cs (82%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/PacketHandler/BattlePlayerDeadPacketHandler.cs (85%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/PacketHandler/BattlePlayerRespawnPacketHandler.cs (78%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/PacketHandler/JoinBattleInstancePacketHandler.cs (97%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/PacketHandler/LeaveBattleInstancePacketHandler.cs (95%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs (83%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Redis/BattleInstanceRoomStorage.cs (97%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Reward/RewardPickupPod.cs (100%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Reward/RewardPodCombat.cs (77%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Reward/RewardPodStorage.cs (100%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Tickers/BattleEventCheckTicker.cs (99%) rename GameServer/Contents/GameMode/Mode-Battle/{ => ModeFreeForAll}/Tickers/BattleEventNotifyTicker.cs (82%) create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatch.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatchData.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchDestroyHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchInitHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinSuccessHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchLeaveHandler.cs delete mode 100644 GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceInitHandler.cs delete mode 100644 GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinHandler.cs delete mode 100644 GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinSuccessHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/Manage/GameModeRun.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/Manage/IRunningMode.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventure.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventureData.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureDestroyHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureInitHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinHandler.cs rename GameServer/Contents/GameMode/{Manage/GameRoomJoinSuccessHandler.cs => Mode-Running/ModeAdventure/Manage/RunAdventureJoinSuccessHandler.cs} (59%) create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureLeaveHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceGameObjectSavePointInteractAction.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceStateCheckAction.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Helper/RunRaceHelper.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRace.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRaceData.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceDestroyHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceInitHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinSuccessHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceLeaveHandler.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateDestroyed.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateEnd.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateReady.cs create mode 100644 GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateStart.cs create mode 100644 GameServer/Contents/GameMode/PacketHandler/GameObjectInteractionPacketHandler.cs create mode 100644 Protocol/client-proto/.svn/pristine/b3/b319b4e84d37dc17d97d2ff284ad3fcd7b54aa74.svn-base create mode 100644 Protocol/client-proto/.svn/pristine/d5/d58580b99025188018cf545592fb1296325f3377.svn-base create mode 100644 ServerCore/Config/ConfigManagerConfigurationProvider.cs create mode 100644 ServerCore/Config/ConfigManagerConfigurationSource.cs create mode 100644 ServerCore/Config/ConfigManagerHelper.cs delete mode 100644 ServerCore/Log/Logger.cs create mode 100644 ServerCore/Log/NLog.cs create mode 100644 ServerCore/Log/NLogHelper.cs diff --git a/BrokerApiCore/ApiModels/AccountApiModel.cs b/BrokerApiCore/ApiModels/AccountApiModel.cs index 71fc2de..bb9c9a4 100644 --- a/BrokerApiCore/ApiModels/AccountApiModel.cs +++ b/BrokerApiCore/ApiModels/AccountApiModel.cs @@ -1,9 +1,9 @@ -namespace BrokerCore.ApiModels; - -using System.ComponentModel; +using System.ComponentModel; using Swashbuckle.AspNetCore.Annotations; +namespace BrokerApiCore; + public class DummyRequest { public required string Dummy { get; set; } diff --git a/BrokerApiCore/ApiModels/AdminModel.cs b/BrokerApiCore/ApiModels/AdminModel.cs index 9895c85..3acfd75 100644 --- a/BrokerApiCore/ApiModels/AdminModel.cs +++ b/BrokerApiCore/ApiModels/AdminModel.cs @@ -1,10 +1,8 @@ -namespace BrokerCore.ApiModels; - -using System.ComponentModel; +using System.ComponentModel; using System.Text.Json.Serialization; - using Swashbuckle.AspNetCore.Annotations; +namespace BrokerApiCore; public class AdminSapphireChangeRequest { public string AccountId { get; set; } = string.Empty; diff --git a/BrokerApiCore/ApiModels/CommonApiModel.cs b/BrokerApiCore/ApiModels/CommonApiModel.cs index cb77f89..1d890b2 100644 --- a/BrokerApiCore/ApiModels/CommonApiModel.cs +++ b/BrokerApiCore/ApiModels/CommonApiModel.cs @@ -1,7 +1,6 @@ -namespace BrokerCore.ApiModels; - -using System.ComponentModel; +using System.ComponentModel; +namespace BrokerApiCore; public class ApiErrorResponse { [Description("에러 추척용 id")] diff --git a/BrokerApiCore/ApiModels/ExchangeApiModel.cs b/BrokerApiCore/ApiModels/ExchangeApiModel.cs index d5e46c2..fcb59c3 100644 --- a/BrokerApiCore/ApiModels/ExchangeApiModel.cs +++ b/BrokerApiCore/ApiModels/ExchangeApiModel.cs @@ -1,17 +1,8 @@ using System.ComponentModel; +using ServerCommon; using Swashbuckle.AspNetCore.Annotations; -namespace BrokerCore.ApiModels; - -using System.Runtime.Serialization; -using System.Text.Json.Serialization; - -using Common; - -using DbEntity; - -using ServerCommon; - +namespace BrokerApiCore; [SwaggerSchema("사파이어 잔액 요청")] public class SapphireRequest { diff --git a/BrokerApiCore/ApiModels/PlanetAuthApiModel.cs b/BrokerApiCore/ApiModels/PlanetAuthApiModel.cs index 9d2713c..400e376 100644 --- a/BrokerApiCore/ApiModels/PlanetAuthApiModel.cs +++ b/BrokerApiCore/ApiModels/PlanetAuthApiModel.cs @@ -1,9 +1,7 @@ -namespace BrokerCore.ApiModels; - -using System.ComponentModel; - +using System.ComponentModel; using Swashbuckle.AspNetCore.Annotations; +namespace BrokerApiCore; [SwaggerSchema("플래닛 인증 요청")] public class PlanetAuthRequest { diff --git a/BrokerApiCore/ApiModels/PlanetItemExchangeApiModel.cs b/BrokerApiCore/ApiModels/PlanetItemExchangeApiModel.cs index 3561e8a..0ae73be 100644 --- a/BrokerApiCore/ApiModels/PlanetItemExchangeApiModel.cs +++ b/BrokerApiCore/ApiModels/PlanetItemExchangeApiModel.cs @@ -1,10 +1,10 @@ -namespace BrokerCore.ApiModels; - -using System.ComponentModel; +using System.ComponentModel; using System.Text.Json.Serialization; using Swashbuckle.AspNetCore.Annotations; +namespace BrokerApiCore; + [SwaggerSchema("재화 잔액 요청")] public class CurrencyBalanceRequest { diff --git a/BrokerApiCore/ApiModels/PlanetItemExchangeOrderDto.cs b/BrokerApiCore/ApiModels/PlanetItemExchangeOrderDto.cs index f38d79d..1ac42ab 100644 --- a/BrokerApiCore/ApiModels/PlanetItemExchangeOrderDto.cs +++ b/BrokerApiCore/ApiModels/PlanetItemExchangeOrderDto.cs @@ -1,14 +1,11 @@ -namespace BrokerCore.ApiModels; - + using System.ComponentModel; using System.Text.Json.Serialization; - -using DbEntity; - using ServerCommon; - using Swashbuckle.AspNetCore.Annotations; +namespace BrokerApiCore; + [SwaggerSchema("플래닛 아이템 교환 주문 정보")] public class PlanetItemExchangeOrderDto { diff --git a/BrokerApiCore/ApiModels/UserApiModel.cs b/BrokerApiCore/ApiModels/UserApiModel.cs index bc7b9a9..7d06e9e 100644 --- a/BrokerApiCore/ApiModels/UserApiModel.cs +++ b/BrokerApiCore/ApiModels/UserApiModel.cs @@ -1,7 +1,7 @@ using System.ComponentModel; using Swashbuckle.AspNetCore.Annotations; -namespace BrokerCore.ApiModels; +namespace BrokerApiCore; [SwaggerSchema("유저 사파이어 잔액 요청")] public class UserSapphireRequest diff --git a/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetProviderLogActor.cs b/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetProviderLogActor.cs index 61e6ba5..c6158b8 100644 --- a/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetProviderLogActor.cs +++ b/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetProviderLogActor.cs @@ -1,9 +1,9 @@ -namespace BrokerCore.BrokerBusinessLog; - + using Newtonsoft.Json; using ServerBase; +namespace BrokerApiCore; public class PlanetProviderLogActor : IWithLogActor { // 로그 행위자 정보 diff --git a/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetUserLogActor.cs b/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetUserLogActor.cs index 656dee8..340b52b 100644 --- a/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetUserLogActor.cs +++ b/BrokerApiCore/BrokerBusinessLog/LogActor/PlanetUserLogActor.cs @@ -1,19 +1,7 @@ - -using Newtonsoft.Json; -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using Newtonsoft.Json; using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - - -namespace BrokerCore.BrokerBusinessLog; +namespace BrokerApiCore; public class PlanetUserLogActor : ILogActor { [JsonProperty] public ServerType ServerType { get; init; } = ServerType.BrokerApi; diff --git a/BrokerApiCore/BrokerBusinessLog/PlanetItemExchangeBusinessLog.cs b/BrokerApiCore/BrokerBusinessLog/PlanetItemExchangeBusinessLog.cs index f1aeb90..121ab3d 100644 --- a/BrokerApiCore/BrokerBusinessLog/PlanetItemExchangeBusinessLog.cs +++ b/BrokerApiCore/BrokerBusinessLog/PlanetItemExchangeBusinessLog.cs @@ -1,15 +1,16 @@  using ServerBase; using ServerCommon; +using ServerCommon.BusinessLogDomain; -namespace BrokerCore.BrokerBusinessLog; +namespace BrokerApiCore; public class PlanetItemExchangeBusinessLog : ILogInvokerEx { private readonly PlanetItemExchangeLogData m_log_data; - public PlanetItemExchangeBusinessLog(LogActionEx logAction, PlanetItemExchangeLogData logData) + public PlanetItemExchangeBusinessLog(LogActionEx logAction, PlanetItemExchangeLogData logData) : base(LogDomainType.BrokerApi, logAction) { m_log_data = new PlanetItemExchangeLogData(this, logData); diff --git a/BrokerApiCore/BrokerBusinessLog/PlanetProviderAuthBusinessLog.cs b/BrokerApiCore/BrokerBusinessLog/PlanetProviderAuthBusinessLog.cs index 18d9585..42cb602 100644 --- a/BrokerApiCore/BrokerBusinessLog/PlanetProviderAuthBusinessLog.cs +++ b/BrokerApiCore/BrokerBusinessLog/PlanetProviderAuthBusinessLog.cs @@ -1,10 +1,9 @@ - - -using ServerBase; +using ServerBase; using ServerCommon; +using ServerCommon.BusinessLogDomain; -namespace BrokerCore.BrokerBusinessLog; +namespace BrokerApiCore; public class PlanetProviderAuthBusinessLog : ILogInvokerEx { diff --git a/BrokerApiCore/BrokerBusinessLog/PlanetUserAuthBusinessLog.cs b/BrokerApiCore/BrokerBusinessLog/PlanetUserAuthBusinessLog.cs index 906c76c..a64c25a 100644 --- a/BrokerApiCore/BrokerBusinessLog/PlanetUserAuthBusinessLog.cs +++ b/BrokerApiCore/BrokerBusinessLog/PlanetUserAuthBusinessLog.cs @@ -1,14 +1,17 @@ -using ServerBase; +using BrokerApiServer; + +using ServerBase; using ServerCommon; +using ServerCommon.BusinessLogDomain; -namespace BrokerCore.BrokerBusinessLog; +namespace BrokerApiCore; public class PlanetUserAuthBusinessLog : ILogInvokerEx { private readonly PlanetUserAuthLogData m_log_data; - public PlanetUserAuthBusinessLog(PlanetUserAuthLogData logData, LogActionType logActionType) + public PlanetUserAuthBusinessLog(PlanetUserAuthLogData logData, LogActionType logActionType) : base(LogDomainType.BrokerApi, new LogActionEx(logActionType)) { m_log_data = new PlanetUserAuthLogData(this, logData); diff --git a/BrokerApiCore/BrokerServerLogic.cs b/BrokerApiCore/BrokerServerLogic.cs index c542349..d2fbaa8 100644 --- a/BrokerApiCore/BrokerServerLogic.cs +++ b/BrokerApiCore/BrokerServerLogic.cs @@ -1,15 +1,11 @@ - -using ServerCore; +using NLog.Config; + using ServerBase; using ServerCommon; - - -namespace BrokerCore; - - -using NLog.Config; +using ServerCore; using MODULE_ID = System.UInt32; +namespace BrokerApiCore; public sealed class BrokerServerLogic : IServerLogic, IWithLogActor, IInitializer { @@ -25,9 +21,15 @@ public sealed class BrokerServerLogic : IServerLogic, IWithLogActor, IInitialize m_server_config = serverConfig; } - public IModule getModule(MODULE_ID moduleId) { throw new NullReferenceException(); } + public IModule getModule(MODULE_ID moduleId) + { + return null; + } - public Result registerEntityTicker(EntityTicker entityTicker) { throw new NullReferenceException(); } + public Result registerEntityTicker(EntityTicker entityTicker) + { + return null; + } public async Task onInit() diff --git a/BrokerApiCore/Common/ApiException.cs b/BrokerApiCore/Common/ApiException.cs index 1eeb69c..77fdbc4 100644 --- a/BrokerApiCore/Common/ApiException.cs +++ b/BrokerApiCore/Common/ApiException.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.Common; +namespace BrokerApiCore; public class ApiException: Exception { diff --git a/BrokerApiCore/Common/ApiExtensions.cs b/BrokerApiCore/Common/ApiExtensions.cs index 909223c..43e42be 100644 --- a/BrokerApiCore/Common/ApiExtensions.cs +++ b/BrokerApiCore/Common/ApiExtensions.cs @@ -1,8 +1,4 @@ -namespace BrokerCore.Common; - -using ApiModels; - -using DbEntity; +namespace BrokerApiCore; public static class ApiExtensions { diff --git a/BrokerApiCore/Common/Guard.cs b/BrokerApiCore/Common/Guard.cs index 27af2ce..6af4004 100644 --- a/BrokerApiCore/Common/Guard.cs +++ b/BrokerApiCore/Common/Guard.cs @@ -1,13 +1,7 @@ -using System; -using System.Diagnostics.CodeAnalysis; - - -using ServerCore; +using System.Diagnostics.CodeAnalysis; using ServerBase; -using ServerCommon; - -namespace BrokerCore.Common; +namespace BrokerApiCore; public static class Guard { diff --git a/BrokerApiCore/Common/Helpers.cs b/BrokerApiCore/Common/Helpers.cs index 39b07df..bbc55a4 100644 --- a/BrokerApiCore/Common/Helpers.cs +++ b/BrokerApiCore/Common/Helpers.cs @@ -1,19 +1,12 @@ -namespace BrokerCore.Common; - -using System.Security.Cryptography; - -using BrokerBusinessLog; - -using DbEntity; - -using Entity.Actions; +using System.Security.Cryptography; using MetaAssets; - using ServerCommon; +using ServerCommon.BusinessLogDomain; -using ServerCore; using ServerBase; +using ServerCore; +namespace BrokerApiCore; public class Helpers { public static string generateSecureKey(int keySizeInBytes = 32, bool isBase64 = true) @@ -46,25 +39,25 @@ public class Helpers Title = mailMeta.Mail_Title, Text = mailMeta.Mail_Desc, ExpireDate = expire_date, - ItemList = getMailItems(productMeta).ToList(), + ItemList = getMailItems(productMeta), PackageOrderId = string.Empty, }; return mail_send_option; } - public static IEnumerable getMailItems(ProductMetaData productMetaData) + public static List getMailItems(ProductMetaData productMetaData) { if (productMetaData.ItemID_First != 0) { - return productMetaData.First_List.Select(itemMeta => new MailItem() + return productMetaData.First_List.Select(itemMeta => new ServerCommon.MailItem { ItemId = (UInt32)itemMeta.Id, Count = itemMeta.Value, ProductId = (UInt32)productMetaData.Id, isRepeatProduct = false - }); + }).ToList(); } - return new List(); + return []; } public static PlanetItemExchangeLogData createFromExchangeOrderLog(PlanetItemExchangeOrder order) diff --git a/BrokerApiCore/Common/JwtOption.cs b/BrokerApiCore/Common/JwtOption.cs index 64c0253..206b0b9 100644 --- a/BrokerApiCore/Common/JwtOption.cs +++ b/BrokerApiCore/Common/JwtOption.cs @@ -1,7 +1,7 @@ //============================================================== // JWT 설정 정보를 담고있는 클래스입니다. //============================================================== -namespace BrokerCore.Common; +namespace BrokerApiCore; public class JwtOption { public string ValidIssuer { get; set; } = string.Empty; diff --git a/BrokerApiCore/Common/ResultFailException.cs b/BrokerApiCore/Common/ResultFailException.cs index b936b0b..3b5a1c9 100644 --- a/BrokerApiCore/Common/ResultFailException.cs +++ b/BrokerApiCore/Common/ResultFailException.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.Common; +namespace BrokerApiCore; public class ResultFailException : ApiException { public ResultFailException(Result result, string? message = null) : base((int)result.ErrorCode, diff --git a/BrokerApiCore/DbEntity/PlanetInfo.cs b/BrokerApiCore/DbEntity/PlanetInfo.cs index 6a2b611..023c1fa 100644 --- a/BrokerApiCore/DbEntity/PlanetInfo.cs +++ b/BrokerApiCore/DbEntity/PlanetInfo.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.DbEntity; +namespace BrokerApiCore; public class PlanetInfo { diff --git a/BrokerApiCore/DbEntity/PlanetItemExchangeOrder.cs b/BrokerApiCore/DbEntity/PlanetItemExchangeOrder.cs index 3b7b6d1..952a40d 100644 --- a/BrokerApiCore/DbEntity/PlanetItemExchangeOrder.cs +++ b/BrokerApiCore/DbEntity/PlanetItemExchangeOrder.cs @@ -1,6 +1,6 @@ -namespace BrokerCore.DbEntity; using ServerCommon; +namespace BrokerApiCore; //================================================================================ // 교환 거래 주문 정보 //================================================================================ diff --git a/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountTotalLimit.cs b/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountTotalLimit.cs index b5d66b7..5b5618e 100644 --- a/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountTotalLimit.cs +++ b/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountTotalLimit.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.DbEntity; +namespace BrokerApiCore; public class PlanetItemExchangeOrderAmountTotalLimit { diff --git a/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountUserLimit.cs b/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountUserLimit.cs index 54f6d12..0acde8e 100644 --- a/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountUserLimit.cs +++ b/BrokerApiCore/DbEntity/PlanetItemExchangeOrderAmountUserLimit.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.DbEntity; +namespace BrokerApiCore; public class PlanetItemExchangeOrderAmountUserLimit { diff --git a/BrokerApiCore/DbEntity/SapphireExchangeOrder.cs b/BrokerApiCore/DbEntity/SapphireExchangeOrder.cs index 590cc18..76711e3 100644 --- a/BrokerApiCore/DbEntity/SapphireExchangeOrder.cs +++ b/BrokerApiCore/DbEntity/SapphireExchangeOrder.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.DbEntity; +namespace BrokerApiCore; public enum ExchangeOrderStatus { diff --git a/BrokerApiCore/DbEntity/SsoAccountInfo.cs b/BrokerApiCore/DbEntity/SsoAccountInfo.cs index a7593f2..966600e 100644 --- a/BrokerApiCore/DbEntity/SsoAccountInfo.cs +++ b/BrokerApiCore/DbEntity/SsoAccountInfo.cs @@ -1,6 +1,6 @@ -namespace BrokerCore.DbEntity; +using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; +namespace BrokerApiCore; [Keyless] public class SsoAccountInfo diff --git a/BrokerApiCore/Entity/Actions/BrokerMailSendAction.cs b/BrokerApiCore/Entity/Actions/BrokerMailSendAction.cs index a6f624a..59b5086 100644 --- a/BrokerApiCore/Entity/Actions/BrokerMailSendAction.cs +++ b/BrokerApiCore/Entity/Actions/BrokerMailSendAction.cs @@ -1,12 +1,8 @@ using System.Text; +using ServerBase; +using ServerCommon; using ServerCore; -using BrokerCore.BrokerBusinessLog; - -using ServerCommon; - -using ServerCore; using ServerBase; - -namespace BrokerCore.Entity.Actions; +namespace BrokerApiCore; using MetaAssets; diff --git a/BrokerApiCore/Entity/Actions/UserAuthAction.cs b/BrokerApiCore/Entity/Actions/UserAuthAction.cs index b7358ca..1b539dd 100644 --- a/BrokerApiCore/Entity/Actions/UserAuthAction.cs +++ b/BrokerApiCore/Entity/Actions/UserAuthAction.cs @@ -1,16 +1,7 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; +using ServerBase; -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - - -namespace BrokerCore.Entity; +namespace BrokerApiCore; using ServerCommon; diff --git a/BrokerApiCore/Entity/BrokerMailEntity.cs b/BrokerApiCore/Entity/BrokerMailEntity.cs index e5f941b..7a0d148 100644 --- a/BrokerApiCore/Entity/BrokerMailEntity.cs +++ b/BrokerApiCore/Entity/BrokerMailEntity.cs @@ -1,13 +1,10 @@  -using ServerCore; using ServerBase; using ServerCommon; +using ServerCore; -namespace BrokerCore.Entity; - -using Actions; - +namespace BrokerApiCore; public class BrokerMailEntity : EntityBase, IWithLogActor { @@ -16,7 +13,7 @@ public class BrokerMailEntity : EntityBase, IWithLogActor // !! 주의 현상태에서는 EntityBase는 반드시 UserBase여야 한다. // !! MailAttribute가 AccountAttribute를 참조하고, AccountAttribute는 UserBase를 참조하기 때문 - public BrokerMailEntity(EntityBase parent, IServerLogic serverLogic) + public BrokerMailEntity(EntityBase parent, IServerLogic serverLogic) : base(EntityType.Mail, parent) { this.m_parent = parent; diff --git a/BrokerApiCore/Entity/Helpers/EntityExtensions.cs b/BrokerApiCore/Entity/Helpers/EntityExtensions.cs index 8fd1ed4..ca3fa9e 100644 --- a/BrokerApiCore/Entity/Helpers/EntityExtensions.cs +++ b/BrokerApiCore/Entity/Helpers/EntityExtensions.cs @@ -1,8 +1,6 @@ -namespace BrokerCore.Entity; +namespace BrokerApiCore; -using ServerCommon; - -using ServerCore; using ServerBase; +using ServerBase; using ServerCore; public static class EntityExtensions { diff --git a/BrokerApiCore/Entity/Helpers/EntityHelper.cs b/BrokerApiCore/Entity/Helpers/EntityHelper.cs index 6ec1c96..0ccc5fc 100644 --- a/BrokerApiCore/Entity/Helpers/EntityHelper.cs +++ b/BrokerApiCore/Entity/Helpers/EntityHelper.cs @@ -1,17 +1,7 @@ - - -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; +using ServerBase; -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace BrokerCore.Entity; +namespace BrokerApiCore; public static class EntityHelper diff --git a/BrokerApiCore/Entity/Helpers/MailSendOption.cs b/BrokerApiCore/Entity/Helpers/MailSendOption.cs index 6357fe8..d6098f3 100644 --- a/BrokerApiCore/Entity/Helpers/MailSendOption.cs +++ b/BrokerApiCore/Entity/Helpers/MailSendOption.cs @@ -1,8 +1,8 @@ -namespace BrokerCore.Entity.Actions; +namespace BrokerApiCore; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; public record class MailSendOption { diff --git a/BrokerApiCore/Entity/PlanetUserEntity.cs b/BrokerApiCore/Entity/PlanetUserEntity.cs index 205c83a..c71c6b8 100644 --- a/BrokerApiCore/Entity/PlanetUserEntity.cs +++ b/BrokerApiCore/Entity/PlanetUserEntity.cs @@ -1,13 +1,8 @@ -namespace BrokerCore.Entity; - -using Actions; - -using BrokerBusinessLog; - +using ServerBase; using ServerCommon; +using ServerCore; -using ServerCore; using ServerBase; - +namespace BrokerApiCore; public sealed class PlanetUserEntity : EntityBase, IWithLogActor { private readonly DynamoDbClient m_dynamo_db_client; diff --git a/BrokerApiCore/Meta/BrokerApiMetaDataManager.cs b/BrokerApiCore/Meta/BrokerApiMetaDataManager.cs index 360d88e..b558768 100644 --- a/BrokerApiCore/Meta/BrokerApiMetaDataManager.cs +++ b/BrokerApiCore/Meta/BrokerApiMetaDataManager.cs @@ -1,4 +1,4 @@ -namespace BrokerCore.Meta; +namespace BrokerApiCore; using Microsoft.Extensions.Hosting; diff --git a/BrokerApiCore/Meta/BrokerMetaDataManager.cs b/BrokerApiCore/Meta/BrokerMetaDataManager.cs index a59dd58..c7c1998 100644 --- a/BrokerApiCore/Meta/BrokerMetaDataManager.cs +++ b/BrokerApiCore/Meta/BrokerMetaDataManager.cs @@ -1,11 +1,9 @@ using System.Collections.Concurrent; - - +using MetaAssets; using ServerBase; using ServerCommon; -using MetaAssets; - +namespace BrokerApiCore; public class BrokerMetaTable { public string Version { get; private set; } diff --git a/BrokerApiCore/Meta/PlanetItemExchangePolicy.cs b/BrokerApiCore/Meta/PlanetItemExchangePolicy.cs deleted file mode 100644 index 01d3788..0000000 --- a/BrokerApiCore/Meta/PlanetItemExchangePolicy.cs +++ /dev/null @@ -1,23 +0,0 @@ -// namespace BrokerCore.Meta; -// -// public class PlanetItemExchangePolicy -// { -// // ID -// // PlanetId -// // CaliverseItemType -// // CaliverseItemId -// // CaliverseItemAmount -// // PlanetItemType -// // PlanetItemId -// // PlanetItemAmount -// // Description -// -// public string? Id { get; set; } -// public string? PlanetId { get; set; } -// public string? CaliverseItemType { get; set; } -// public string? CaliverseItemId { get; set; } -// public long CaliverseItemAmount { get; set; } -// public string? PlanetItemType { get; set; } -// public string? PlanetItemId { get; set; } -// public long PlanetItemAmount { get; set; } -// } diff --git a/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.Designer.cs b/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.Designer.cs index 362a42a..31a3ff5 100644 --- a/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.Designer.cs +++ b/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.Designer.cs @@ -1,6 +1,9 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + +using BrokerApiServer; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +12,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250217015116_SchemaChanges_105106")] diff --git a/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.cs b/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.cs index 2c99da0..5c8e12d 100644 --- a/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.cs +++ b/BrokerApiCore/Migrations/20250217015116_SchemaChanges_105106.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_105106 : Migration diff --git a/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.Designer.cs b/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.Designer.cs index 30b888f..1d2eec1 100644 --- a/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.Designer.cs +++ b/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250224031421_SchemaChanges_121410")] diff --git a/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.cs b/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.cs index c7308a5..3065e44 100644 --- a/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.cs +++ b/BrokerApiCore/Migrations/20250224031421_SchemaChanges_121410.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_121410 : Migration diff --git a/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.Designer.cs b/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.Designer.cs index 8db2a63..3bd8eda 100644 --- a/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.Designer.cs +++ b/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.Designer.cs @@ -1,6 +1,9 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + +using BrokerApiServer; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +12,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250314055515_SchemaChanges_145503")] diff --git a/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.cs b/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.cs index 104649c..ec46c41 100644 --- a/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.cs +++ b/BrokerApiCore/Migrations/20250314055515_SchemaChanges_145503.cs @@ -2,7 +2,7 @@ #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_145503 : Migration diff --git a/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.Designer.cs b/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.Designer.cs index cf696cd..dfb373d 100644 --- a/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.Designer.cs +++ b/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250314062930_SchemaChanges_152918")] diff --git a/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.cs b/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.cs index cfea74d..cc48a9c 100644 --- a/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.cs +++ b/BrokerApiCore/Migrations/20250314062930_SchemaChanges_152918.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_152918 : Migration diff --git a/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.Designer.cs b/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.Designer.cs index 2f53d8a..c331929 100644 --- a/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.Designer.cs +++ b/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250314063529_SchemaChanges_153518")] diff --git a/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.cs b/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.cs index b66e61b..18585fb 100644 --- a/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.cs +++ b/BrokerApiCore/Migrations/20250314063529_SchemaChanges_153518.cs @@ -2,7 +2,7 @@ #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_153518 : Migration diff --git a/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.Designer.cs b/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.Designer.cs index 9c00d80..cf0c9a2 100644 --- a/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.Designer.cs +++ b/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250314070903_SchemaChanges_160851")] diff --git a/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.cs b/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.cs index 9866b8e..d3ec061 100644 --- a/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.cs +++ b/BrokerApiCore/Migrations/20250314070903_SchemaChanges_160851.cs @@ -2,7 +2,7 @@ #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_160851 : Migration diff --git a/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.Designer.cs b/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.Designer.cs index c8d7ee1..819abdb 100644 --- a/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.Designer.cs +++ b/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250317020124_SchemaChanges_110113")] diff --git a/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.cs b/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.cs index 98504b1..d65d401 100644 --- a/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.cs +++ b/BrokerApiCore/Migrations/20250317020124_SchemaChanges_110113.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_110113 : Migration diff --git a/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.Designer.cs b/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.Designer.cs index b5b3414..8973806 100644 --- a/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.Designer.cs +++ b/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250317030502_SchemaChanges_120450")] diff --git a/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.cs b/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.cs index 192d720..dd62554 100644 --- a/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.cs +++ b/BrokerApiCore/Migrations/20250317030502_SchemaChanges_120450.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_120450 : Migration diff --git a/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.Designer.cs b/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.Designer.cs index dd32861..2379c83 100644 --- a/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.Designer.cs +++ b/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250317032756_SchemaChanges_122745")] diff --git a/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.cs b/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.cs index bbd635f..5b85195 100644 --- a/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.cs +++ b/BrokerApiCore/Migrations/20250317032756_SchemaChanges_122745.cs @@ -2,7 +2,7 @@ #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_122745 : Migration diff --git a/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.Designer.cs b/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.Designer.cs index 40956e6..15c012f 100644 --- a/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.Designer.cs +++ b/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250321034709_SchemaChanges_124658")] diff --git a/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.cs b/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.cs index d597219..6dda9ca 100644 --- a/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.cs +++ b/BrokerApiCore/Migrations/20250321034709_SchemaChanges_124658.cs @@ -2,7 +2,7 @@ #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_124658 : Migration diff --git a/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.Designer.cs b/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.Designer.cs index 4046f9f..1868edd 100644 --- a/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.Designer.cs +++ b/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.Designer.cs @@ -1,6 +1,8 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -9,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] [Migration("20250324074920_SchemaChanges_164908")] diff --git a/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.cs b/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.cs index 9929d0d..992b91f 100644 --- a/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.cs +++ b/BrokerApiCore/Migrations/20250324074920_SchemaChanges_164908.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { /// public partial class SchemaChanges_164908 : Migration diff --git a/BrokerApiCore/Migrations/MetaverseBrokerDbContextModelSnapshot.cs b/BrokerApiCore/Migrations/MetaverseBrokerDbContextModelSnapshot.cs index 14d5d98..3b06bab 100644 --- a/BrokerApiCore/Migrations/MetaverseBrokerDbContextModelSnapshot.cs +++ b/BrokerApiCore/Migrations/MetaverseBrokerDbContextModelSnapshot.cs @@ -1,6 +1,9 @@ // using System; -using BrokerCore.Repository.Context; + +using BrokerApiCore; + +using BrokerApiServer; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; @@ -8,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace BrokerApiCore.Migrations +namespace BrokerApiServer.Migrations { [DbContext(typeof(MetaverseBrokerDbContext))] partial class MetaverseBrokerDbContextModelSnapshot : ModelSnapshot diff --git a/BrokerApiCore/Repository/PlanetInfoRepo.cs b/BrokerApiCore/Repository/PlanetInfoRepo.cs index 410d83e..1f051b7 100644 --- a/BrokerApiCore/Repository/PlanetInfoRepo.cs +++ b/BrokerApiCore/Repository/PlanetInfoRepo.cs @@ -1,14 +1,8 @@ -namespace BrokerCore.Repository; - -using Context; - -using DbEntity; - -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using ServerBase; -using ServerCommon; +namespace BrokerApiCore; public class PlanetInfoRepo { private readonly MetaverseBrokerDbContext m_db; diff --git a/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountTotalLimitRepo.cs b/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountTotalLimitRepo.cs index e3ba286..3859a63 100644 --- a/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountTotalLimitRepo.cs +++ b/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountTotalLimitRepo.cs @@ -1,13 +1,8 @@ using Microsoft.EntityFrameworkCore; using ServerBase; -using ServerCommon; -namespace BrokerCore.Repository; - -using DbEntity; - -using Context; +namespace BrokerApiCore; public class PlanetItemExchangeOrderAmountTotalLimitRepo { diff --git a/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountUserLimitRepo.cs b/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountUserLimitRepo.cs index f52ed6a..56c0e72 100644 --- a/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountUserLimitRepo.cs +++ b/BrokerApiCore/Repository/PlanetItemExchangeOrderAmountUserLimitRepo.cs @@ -1,13 +1,8 @@ using Microsoft.EntityFrameworkCore; using ServerBase; -using ServerCommon; -namespace BrokerCore.Repository; - -using DbEntity; - -using Context; +namespace BrokerApiCore; public class PlanetItemExchangeOrderAmountUserLimitRepo { diff --git a/BrokerApiCore/Repository/PlanetItemExchangeOrderRepo.cs b/BrokerApiCore/Repository/PlanetItemExchangeOrderRepo.cs index 7629d26..5daa03e 100644 --- a/BrokerApiCore/Repository/PlanetItemExchangeOrderRepo.cs +++ b/BrokerApiCore/Repository/PlanetItemExchangeOrderRepo.cs @@ -2,16 +2,9 @@ using Microsoft.EntityFrameworkCore; using ServerBase; -using ServerCommon; -namespace BrokerCore.Repository; - -using Common; - -using DbEntity; - -using Context; +namespace BrokerApiCore; public class PlanetItemExchangeOrderRepo { diff --git a/BrokerApiCore/Repository/SapphireExchangeOrderRepo.cs b/BrokerApiCore/Repository/SapphireExchangeOrderRepo.cs deleted file mode 100644 index aaa4b09..0000000 --- a/BrokerApiCore/Repository/SapphireExchangeOrderRepo.cs +++ /dev/null @@ -1,240 +0,0 @@ -// using Microsoft.EntityFrameworkCore; -// -// using ServerCommon; -// -// namespace BrokerCore.Repository; -// -// using Common; -// -// using DbEntity; -// using Context; -// -// public class SapphireExchangeOrderRepo -// { -// private readonly MetaverseBrokerDbContext m_db_context; -// -// public SapphireExchangeOrderRepo(MetaverseBrokerDbContext dbContext) -// { -// m_db_context = dbContext; -// } -// -// //================================================================================ -// // 사파이어 교환 주문을 추가한다. -// // 트랜잭션을 사용한다. -// //================================================================================ -// public async Task add(SapphireExchangeOrder order, CancellationToken cancellationToken = default) -// { -// var result = new Result(); -// try -// { -// m_db_context.SapphireExchangeOrders.Add(order); -// await m_db_context.SaveChangesAsync(cancellationToken); -// return result; -// } -// catch (Exception e) -// { -// result.setFail(ServerErrorCode.InternalServerError, e.Message); -// } -// -// return result; -// } -// -// public async Task delete(SapphireExchangeOrder order, CancellationToken cancellationToken = default) -// { -// var result = new Result(); -// try -// { -// m_db_context.SapphireExchangeOrders.Remove(order); -// await m_db_context.SaveChangesAsync(cancellationToken); -// } -// catch (Exception e) -// { -// result.setFail(ServerErrorCode.InternalServerError, e.Message); -// } -// -// return result; -// } -// -// //================================================================================ -// // 사파이어 교환 주문을 비동기로 업데이트한다. -// // 트랜잭션을 사용한다. -// // OrderId를 키로 사용한다. -// // OrderType과 OrderCompletedAt만 업데이트한다. -// //================================================================================ -// public async Task<(Result, SapphireExchangeOrder?)> findAndComplete(string orderId, -// CancellationToken cancellationToken = default) -// { -// var result = new Result(); -// // var transaction = await m_db_context.Database.BeginTransactionAsync(cancellationToken).ConfigureAwait(false); -// // await using var transaction1 = transaction.ConfigureAwait(false); -// try -// { -// var order = await m_db_context.SapphireExchangeOrders.Where(x => x.OrderId == orderId).FirstOrDefaultAsync(cancellationToken); -// Guard.Against.isNull(order, ServerErrorCode.ExchangeOrderIdNotFound, "Invalid orderId"); -// if (order.OrderStatus != ExchangeOrderStatus.Pending) -// { -// result.setFail(ServerErrorCode.Success, $"Fail To Complete OrderStatus Not Pending: orderId {orderId}, order_status {order.OrderStatus}"); -// return (result, order); -// } -// -// order.OrderStatus = ExchangeOrderStatus.Completed; -// order.CompletedAt = DateTime.Now; -// m_db_context.SapphireExchangeOrders.Attach(order); -// m_db_context.Entry(order).Property(x => x.OrderStatus).IsModified = true; -// m_db_context.Entry(order).Property(x => x.CompletedAt).IsModified = true; -// await m_db_context.SaveChangesAsync(cancellationToken).ConfigureAwait(false); -// // await transaction.CommitAsync(cancellationToken).ConfigureAwait(false); -// return (new Result(), order); -// } -// catch (Exception e) -// { -// // await transaction.RollbackAsync(cancellationToken).ConfigureAwait(false); -// return (new Result { ResultString = e.Message }, null); -// } -// } -// -// // public async Task updateForPending(SapphireExchangeOrder order, -// // CancellationToken cancellationToken = default) -// // { -// // // await using var transaction = await m_db_context.Database.BeginTransactionAsync(cancellationToken); -// // try -// // { -// // m_db_context.SapphireExchangeOrders.Attach(order); -// // m_db_context.Entry(order).Property(x => x.OrderStatus).IsModified = true; -// // await m_db_context.SaveChangesAsync(cancellationToken); -// // // await transaction.CommitAsync(cancellationToken); -// // return new Result(); -// // } -// // catch (Exception e) -// // { -// // // await transaction.RollbackAsync(cancellationToken); -// // return new Result { ResultString = e.Message }; -// // } -// // } -// //========================================================================== -// //SELECT * -// // FROM `sapphire_exchange_order` -// // WHERE `PlanetId` = @planetId -// // AND `UserGuid` = @userGuid -// // AND (@orderStatus IS NULL OR `OrderStatus` = @orderStatus) -// // ORDER BY `CreatedAt` ASC -// // LIMIT @pageSize OFFSET @offset; -// //========================================================================== -// public async Task<(Result, IEnumerable?)> findList( -// string planetId, -// string userGuid, -// ExchangeOrderStatus? orderStatus = null, -// int pageIndex = 1, -// int pageSize = 20, -// string sortOrder = "asc", -// CancellationToken cancellationToken = default) -// { -// var result = new Result(); -// try -// { -// var query = m_db_context.SapphireExchangeOrders.AsQueryable(); -// -// if (!string.IsNullOrEmpty(planetId)) -// { -// query = query.Where(x => x.PlanetId == planetId); -// } -// -// if (!string.IsNullOrEmpty(userGuid)) -// { -// query = query.Where(x => x.UserGuid == userGuid); -// } -// -// //orderStatus.HasValue는 orderStatus가 null일 때도 에러가 발생하지 않음. orderStatus가 null이면 HasValue는 false를 반환. -// if (orderStatus.HasValue) -// { -// query = query.Where(x => x.OrderStatus == orderStatus); -// } -// -// query = sortOrder.ToLower() == "desc" -// ? query.OrderByDescending(o => o.CreatedAt) -// : query.OrderBy(o => o.CreatedAt); -// -// var orders = await query -// .Skip((pageIndex - 1) * pageSize) -// .Take(pageSize) -// .ToArrayAsync(cancellationToken); -// -// return (result, orders); -// } -// catch (Exception e) -// { -// result.setFail(ServerErrorCode.DynamoDbException, e.Message); -// return (result, null); -// } -// } -// -// //================================================================================ -// // 사파이어 교환 주문 목록을 비동기로 조회한다. -// // OrderType과 PlanetId로 검색한다. -// // Result, IEnumerable<>를 반환한다. -// // 조건에 맞는 값이 없다면 빈 배열을 반환한다. -// //================================================================================ -// public async Task<(Result, IEnumerable?)> findList_old(string planetId, string userGuid, -// ExchangeOrderStatus? orderStatus = null, int pageIndex = 1, int pageSize = 20, CancellationToken cancellationToken = default) -// { -// var result = new Result(); -// try -// { -// if (orderStatus == null) -// { -// var orders = await m_db_context.SapphireExchangeOrders -// .OrderBy(o => o.CreatedAt) -// .Skip((pageIndex - 1) * pageSize) -// .Take(pageSize) -// .Where(x => x.PlanetId == planetId && x.UserGuid == userGuid).ToArrayAsync(cancellationToken); -// return (result, orders); -// } -// else -// { -// var orders = await m_db_context.SapphireExchangeOrders -// .Where(x => x.PlanetId == planetId && x.UserGuid == userGuid && x.OrderStatus == orderStatus) -// .Skip((pageIndex - 1) * pageSize) -// .Take(pageSize) -// .ToArrayAsync(cancellationToken); -// return (result, orders); -// } -// } -// catch (Exception e) -// { -// result.setFail(ServerErrorCode.RdbError, e.Message); -// return (result, null); -// } -// } -// -// public async Task> getSapphireExchangeOrders(int pageIndex, int pageSize) -// { -// var query = m_db_context.Set().AsNoTracking(); -// -// var count = await query.CountAsync(); -// var items = await query -// .OrderBy(o => o.CreatedAt) -// .Skip((pageIndex - 1) * pageSize) -// .Take(pageSize) -// .ToListAsync(); -// -// return new PaginatedList(items, count, pageIndex, pageSize); -// } -// -// public class PaginatedList : List -// { -// public int PageIndex { get; private set; } -// public int TotalPages { get; private set; } -// public int TotalCount { get; private set; } -// -// public PaginatedList(List items, int count, int pageIndex, int pageSize) -// { -// PageIndex = pageIndex; -// TotalCount = count; -// -// this.AddRange(items); -// } -// -// public bool HasPreviousPage => PageIndex > 1; -// public bool HasNextPage => PageIndex < TotalPages; -// } -// } diff --git a/BrokerApiCore/Repository/SqlConfig/PlanetExchangeOrderConfig.cs b/BrokerApiCore/Repository/SqlConfig/PlanetExchangeOrderConfig.cs index b462933..fbbeb2d 100644 --- a/BrokerApiCore/Repository/SqlConfig/PlanetExchangeOrderConfig.cs +++ b/BrokerApiCore/Repository/SqlConfig/PlanetExchangeOrderConfig.cs @@ -1,8 +1,8 @@ -namespace BrokerCore.DbEntity; - + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; +namespace BrokerApiCore; public class PlanetExchangeOrderConfig : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) diff --git a/BrokerApiCore/Repository/SqlConfig/PlanetInfoConfig.cs b/BrokerApiCore/Repository/SqlConfig/PlanetInfoConfig.cs index ae726ff..8c6c5be 100644 --- a/BrokerApiCore/Repository/SqlConfig/PlanetInfoConfig.cs +++ b/BrokerApiCore/Repository/SqlConfig/PlanetInfoConfig.cs @@ -1,10 +1,8 @@ -namespace BrokerCore.Repository.SqlConfig; - -using DbEntity; - + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; +namespace BrokerApiCore; public class PlanetInfoConfig : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) diff --git a/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountTotalLimitConfig.cs b/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountTotalLimitConfig.cs index af92e77..fe4909c 100644 --- a/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountTotalLimitConfig.cs +++ b/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountTotalLimitConfig.cs @@ -1,8 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace BrokerApiCore.Repository.SqlConfig; -using BrokerCore.DbEntity; +namespace BrokerApiCore; public class PlanetItemExchangeOrderAmountTotalLimitConfig : IEntityTypeConfiguration { diff --git a/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountUserLimitConfig.cs b/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountUserLimitConfig.cs index 189df23..6b63844 100644 --- a/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountUserLimitConfig.cs +++ b/BrokerApiCore/Repository/SqlConfig/PlanetItemExchangeOrderAmountUserLimitConfig.cs @@ -2,9 +2,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -namespace BrokerApiCore.Repository.SqlConfig; - -using BrokerCore.DbEntity; +namespace BrokerApiCore; public class PlanetItemExchangeOrderAmountUserLimitConfig : IEntityTypeConfiguration { diff --git a/BrokerApiCore/Repository/SqlConfig/SapphireExchangeOrderConfig.cs b/BrokerApiCore/Repository/SqlConfig/SapphireExchangeOrderConfig.cs index f718ac8..e5f20a3 100644 --- a/BrokerApiCore/Repository/SqlConfig/SapphireExchangeOrderConfig.cs +++ b/BrokerApiCore/Repository/SqlConfig/SapphireExchangeOrderConfig.cs @@ -1,10 +1,8 @@ -namespace BrokerCore.Repository.SqlConfig; - -using DbEntity; - + using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; +namespace BrokerApiCore; public class SapphireExchangeOrderConfig : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) diff --git a/BrokerApiCore/Repository/SqlContext/MetaverseBrokerDbContext.cs b/BrokerApiCore/Repository/SqlContext/MetaverseBrokerDbContext.cs index ec58edc..f3d360c 100644 --- a/BrokerApiCore/Repository/SqlContext/MetaverseBrokerDbContext.cs +++ b/BrokerApiCore/Repository/SqlContext/MetaverseBrokerDbContext.cs @@ -1,20 +1,9 @@ -using ServerCore; -using ServerBase; -using ServerCommon; - - using Microsoft.EntityFrameworkCore; - -namespace BrokerCore.Repository.Context; - -using BrokerApiCore.Repository.SqlConfig; - -using DbEntity; - using Microsoft.EntityFrameworkCore.Design; +using ServerBase; +using ServerCore; -using SqlConfig; - +namespace BrokerApiCore; public class MetaverseBrokerDbContext: DbContext { public DbSet SapphireExchangeOrders { get; set; } diff --git a/BrokerApiCore/Repository/SqlContext/SsoAccountDbContext.cs b/BrokerApiCore/Repository/SqlContext/SsoAccountDbContext.cs index e533f2f..20ad976 100644 --- a/BrokerApiCore/Repository/SqlContext/SsoAccountDbContext.cs +++ b/BrokerApiCore/Repository/SqlContext/SsoAccountDbContext.cs @@ -1,7 +1,5 @@ using Microsoft.EntityFrameworkCore; -namespace BrokerCore.Repository.Context; - -using DbEntity; +namespace BrokerApiCore; public class SsoAccountDbContext: DbContext { diff --git a/BrokerApiCore/Repository/SsoAccountRepo.cs b/BrokerApiCore/Repository/SsoAccountRepo.cs index 4b03ee1..f101df5 100644 --- a/BrokerApiCore/Repository/SsoAccountRepo.cs +++ b/BrokerApiCore/Repository/SsoAccountRepo.cs @@ -1,8 +1,6 @@ using Microsoft.EntityFrameworkCore; -namespace BrokerCore.Repository; -using Context; -using DbEntity; +namespace BrokerApiCore; public class SsoAccountRepo { private readonly SsoAccountDbContext m_db_context; diff --git a/BrokerApiCore/Repository/UserBaseDocRepo.cs b/BrokerApiCore/Repository/UserBaseDocRepo.cs index fdf7ba8..52ca323 100644 --- a/BrokerApiCore/Repository/UserBaseDocRepo.cs +++ b/BrokerApiCore/Repository/UserBaseDocRepo.cs @@ -1,9 +1,7 @@ using ServerCommon; +using ServerBase; using ServerCore; -namespace BrokerCore.Repository; - -using ServerCore; using ServerBase; - +namespace BrokerApiCore; public class UserBaseDocRepo { private readonly DynamoDbClient m_dynamo_db_client; diff --git a/BrokerApiCore/Services/EchoSystemService.cs b/BrokerApiCore/Services/EchoSystemService.cs index 322f5e9..d16c97b 100644 --- a/BrokerApiCore/Services/EchoSystemService.cs +++ b/BrokerApiCore/Services/EchoSystemService.cs @@ -1,14 +1,9 @@ - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; +using ServerCore; - - -namespace BrokerCore.Services; - -using Common; +namespace BrokerApiCore; public class EchoSystemService { diff --git a/BrokerApiCore/Services/JwtGenerator.cs b/BrokerApiCore/Services/JwtGenerator.cs index 466e4e7..56ce60a 100644 --- a/BrokerApiCore/Services/JwtGenerator.cs +++ b/BrokerApiCore/Services/JwtGenerator.cs @@ -4,10 +4,9 @@ using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; -using ServerCore; using ServerBase; +using ServerCore; -namespace BrokerCore.Services; -using Common; +namespace BrokerApiCore; public class JwtGenerator { diff --git a/BrokerApiCore/Services/JwtService.cs b/BrokerApiCore/Services/JwtService.cs deleted file mode 100644 index 2a212bd..0000000 --- a/BrokerApiCore/Services/JwtService.cs +++ /dev/null @@ -1,185 +0,0 @@ -// namespace BrokerCore.Services; -// -// using System.IdentityModel.Tokens.Jwt; -// using System.Security.Claims; -// using System.Security.Cryptography; -// using System.Text; -// -// using Microsoft.IdentityModel.Tokens; -// -// public interface IJwtUser -// { -// public string Id { get; } -// } -// -// public interface IJwtAuth -// { -// -// } -// -// public class RefreshToken -// { -// public int Id { get; set; } -// public string Token { get; set; } = string.Empty; -// public DateTime Created { get; set; } = DateTime.UtcNow; -// public DateTime Expires { get; set; } -// public bool IsExpired => DateTime.UtcNow >= Expires; -// public DateTime? Revoked { get; set; } -// public bool IsActive => Revoked == null && !IsExpired; -// public string? ReplacedByToken { get; set; } -// public string? ReasonRevoked { get; set; } -// public int UserId { get; set; } -// public IJwtUser User { get; set; } = null!; -// } -// -// public interface IJwtService where TUser : class -// { -// string generateJwtToken(TUser user, string secretKey, int expirationMinutes = 15); -// string generateRefreshToken(); -// int? validateJwtToken(string token); -// Task refreshTokenAsync(string token, string ipAddress); -// Task revokeTokenAsync(string token, string ipAddress, string? reason = null); -// } -// public class JwtService: IJwtService -// { -// private string m_secret_key = string.Empty; -// private int m_expiration_minutes = 15; -// private string m_issuer = string.Empty; -// private string m_audience = string.Empty; -// -// public string generateJwtToken(IJwtUser user) -// { -// if (user == null) -// throw new ArgumentNullException(nameof(user)); -// -// if (string.IsNullOrEmpty(m_secret_key)) -// throw new ArgumentNullException(nameof(m_secret_key)); -// -// if (m_expiration_minutes <= 0) -// throw new ArgumentOutOfRangeException(nameof(m_expiration_minutes), "Expiration minutes must be greater than zero."); -// -// var token_handler = new JwtSecurityTokenHandler(); -// var key = Encoding.ASCII.GetBytes(m_secret_key); -// -// var claims = new List -// { -// new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), -// // new Claim(ClaimTypes.Name, user.Username), -// // new Claim(ClaimTypes.Email, user.Email) -// // 필요한 경우 추가 클레임 정의 (역할 등) -// }; -// -// var token_descriptor = new SecurityTokenDescriptor -// { -// Subject = new ClaimsIdentity(claims), -// Expires = DateTime.UtcNow.AddMinutes(15), // 액세스 토큰 만료 시간 (짧게 설정) -// Issuer = string.Empty, -// Audience = string.Empty, -// SigningCredentials = new SigningCredentials( -// new SymmetricSecurityKey(key), -// SecurityAlgorithms.HmacSha256Signature) -// }; -// -// var token = token_handler.CreateToken(token_descriptor); -// return token_handler.WriteToken(token); -// } -// -// public string generateRefreshToken() -// { -// var random_number = new byte[16]; -// using var rng = RandomNumberGenerator.Create(); -// rng.GetBytes(random_number); -// return Convert.ToBase64String(random_number); -// } -// -// public int? validateJwtToken(string token) -// { -// if (string.IsNullOrEmpty(token)) -// return null; -// -// var token_handler = new JwtSecurityTokenHandler(); -// var key = Encoding.ASCII.GetBytes(m_secret_key); -// -// try -// { -// token_handler.ValidateToken(token, new TokenValidationParameters -// { -// ValidateIssuerSigningKey = true, -// IssuerSigningKey = new SymmetricSecurityKey(key), -// ValidateIssuer = true, -// ValidIssuer = this.m_issuer, -// ValidateAudience = true, -// ValidAudience = this.m_audience, -// // 시간 검증 설정 -// ValidateLifetime = true, -// ClockSkew = TimeSpan.Zero -// }, out SecurityToken validated_token); -// -// var jwt_token = (JwtSecurityToken)validated_token; -// var user_id = int.Parse(jwt_token.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value); -// -// return user_id; -// } -// catch -// { -// // 토큰 검증 실패 -// return null; -// } -// } -// -// public Task refreshTokenAsync(string token) -// { -// // 리프레시 토큰으로 유저 정보를 가져온다. -// var user; -// -// // 사용자가 없거나 토큰이 존재하지 않음 -// if (user == null) -// throw new SecurityTokenException("Invalid token"); -// -// var refreshToken = user.RefreshTokens.Single(x => x.Token == token); -// -// // 토큰이 더 이상 활성 상태가 아니면 오류 -// if (!refreshToken.IsActive) -// throw new SecurityTokenException("Invalid token"); -// -// // 새 리프레시 토큰 생성 -// var newRefreshToken = generateRefreshTokenEntity(); -// -// // 이전 토큰 폐기 -// refreshToken.Revoked = DateTime.UtcNow; -// refreshToken.ReplacedByToken = newRefreshToken.Token; -// refreshToken.ReasonRevoked = "Replaced by new token"; -// -// // 새 리프레시 토큰 추가 -// user.RefreshTokens.Add(newRefreshToken); -// _context.Update(user); -// await _context.SaveChangesAsync(); -// -// // 새 JWT 생성 -// var jwtToken = generateJwtToken(user); -// -// return new -// { -// Id = user.Id, -// Username = user.Username, -// Email = user.Email, -// AccessToken = jwtToken, -// RefreshToken = newRefreshToken.Token -// }; -// } -// -// public Task revokeTokenAsync(string token, string ipAddress, string? reason = null) -// { -// throw new NotImplementedException(); -// } -// -// private RefreshToken generateRefreshTokenEntity() -// { -// return new RefreshToken -// { -// Token = generateRefreshToken(), -// Expires = DateTime.UtcNow.AddDays(32), // 리프레시 토큰 만료 시간 (길게 설정) -// Created = DateTime.UtcNow -// }; -// } -// } diff --git a/BrokerApiCore/Services/PlanetService.cs b/BrokerApiCore/Services/PlanetService.cs index 8b4cbcb..43be094 100644 --- a/BrokerApiCore/Services/PlanetService.cs +++ b/BrokerApiCore/Services/PlanetService.cs @@ -1,17 +1,11 @@ -namespace BrokerCore.Services; - -using System.Security.Claims; - -using BrokerBusinessLog; - +using System.Security.Claims; using Microsoft.IdentityModel.JsonWebTokens; -using Repository; - -using Common; - using ServerBase; using ServerCommon; +using ServerCommon.BusinessLogDomain; + +namespace BrokerApiCore; public class PlanetService { diff --git a/BrokerApiCore/Services/PlanetitemExchange/DailyAmountLimitChecker.cs b/BrokerApiCore/Services/PlanetitemExchange/DailyAmountLimitChecker.cs index c78f984..dfa4acb 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/DailyAmountLimitChecker.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/DailyAmountLimitChecker.cs @@ -1,16 +1,6 @@ -namespace BrokerCore.Services; - -using Common; - -using DbEntity; - +using MetaAssets; using ServerBase; -using ServerCommon; -using MetaAssets; - -using Repository; - - +namespace BrokerApiCore; public class DailyAmountLimitChecker { private readonly PlanetItemExchangeOrderAmountTotalLimitRepo m_planet_item_exchange_order_amount_total_limit; diff --git a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCompletionStrategy.cs b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCompletionStrategy.cs index c95f9cd..4b064ee 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCompletionStrategy.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCompletionStrategy.cs @@ -1,11 +1,5 @@ -namespace BrokerCore.Services; - - -using DbEntity; -using Entity; - - +namespace BrokerApiCore; public interface IOrderCompletionStrategy { diff --git a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCreationStrategy.cs b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCreationStrategy.cs index fa2635b..3a28629 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCreationStrategy.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderCreationStrategy.cs @@ -1,8 +1,6 @@ -using BrokerCore.DbEntity; - using MetaAssets; -namespace BrokerCore.Services; +namespace BrokerApiCore; public interface IOrderCreationStrategy { diff --git a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderStrategyProvider.cs b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderStrategyProvider.cs index 2202f20..8bd32f2 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderStrategyProvider.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/IOrderStrategyProvider.cs @@ -1,6 +1,6 @@ using ServerCommon; -namespace BrokerCore.Services; +namespace BrokerApiCore; public interface IOrderStrategyProvider { diff --git a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/OrderStrategyProvider.cs b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/OrderStrategyProvider.cs index 1f0d3b9..15abd58 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Interfaces/OrderStrategyProvider.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Interfaces/OrderStrategyProvider.cs @@ -1,10 +1,8 @@ +using System.Collections.Concurrent; using Microsoft.Extensions.DependencyInjection; - using ServerCommon; -using System.Collections.Concurrent; - -namespace BrokerCore.Services; +namespace BrokerApiCore; public class OrderStrategyProvider : IOrderStrategyProvider { diff --git a/BrokerApiCore/Services/PlanetitemExchange/PlanetItemExchangeService.cs b/BrokerApiCore/Services/PlanetitemExchange/PlanetItemExchangeService.cs index 7011bdc..e8db19b 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/PlanetItemExchangeService.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/PlanetItemExchangeService.cs @@ -1,23 +1,9 @@ -namespace BrokerCore.Services; - +using MetaAssets; +using ServerBase; using ServerCommon; +using ServerCore; -using Common; - -using DbEntity; - -using Repository; - -using Entity; - -using System.Collections.Generic; - -using BrokerBusinessLog; - -using MetaAssets; - -using ServerCore; using ServerBase; - +namespace BrokerApiCore; public class PlanetItemExchangeService { readonly PlanetUserEntity m_planet_user; diff --git a/BrokerApiCore/Services/PlanetitemExchange/ServiceCollectionExtensions.cs b/BrokerApiCore/Services/PlanetitemExchange/ServiceCollectionExtensions.cs index cfd8a72..f1ea234 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/ServiceCollectionExtensions.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/ServiceCollectionExtensions.cs @@ -1,9 +1,6 @@ using Microsoft.Extensions.DependencyInjection; -namespace BrokerCore.Services; - -using Entity; - +namespace BrokerApiCore; public static class ServiceCollectionExtensions { public static IServiceCollection addExchangeServices(this IServiceCollection services) diff --git a/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyExchangeCreationStrategy.cs b/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyExchangeCreationStrategy.cs index c91ce0f..99daecd 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyExchangeCreationStrategy.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyExchangeCreationStrategy.cs @@ -1,22 +1,11 @@ -using BrokerCore.DbEntity; -using BrokerCore.Entity; -using BrokerCore.Repository; - -using Microsoft.Extensions.Logging; -// using Polly; -// using Polly.Retry; using MetaAssets; - -using ServerCommon; - -namespace BrokerCore.Services; -using Common; - using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; -using Repository.Context; -using ServerCore; using ServerBase; +using Microsoft.Extensions.Logging; +using ServerBase; +using ServerCommon; +namespace BrokerApiCore; //========================================================================================= // 플래닛의 아이템을 칼리버스 재화로 교환하는 주문 생성 // Broker의 rdb(순수 교환 정보)와 DynamoDB(유저의 게임정보)를 사용하여 교환 주문을 생성한다. diff --git a/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyOrderCompletionStrategy.cs b/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyOrderCompletionStrategy.cs index cd76ff1..4edb1d6 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyOrderCompletionStrategy.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Strategies/CurrencyOrderCompletionStrategy.cs @@ -1,8 +1,4 @@ -namespace BrokerCore.Services; -using Common; -using DbEntity; -using Entity; -using Repository; +namespace BrokerApiCore; // 화폐(Currency) 주문 완료 전략 public class CurrencyOrderCompletionStrategy : IOrderCompletionStrategy diff --git a/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductExchangeCreationStrategy.cs b/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductExchangeCreationStrategy.cs index b841099..2e93335 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductExchangeCreationStrategy.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductExchangeCreationStrategy.cs @@ -1,18 +1,8 @@ -namespace BrokerCore.Services; - -using Common; - -using DbEntity; - -using Repository; - using MetaAssets; - using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; -using Repository.Context; - +namespace BrokerApiCore; public class ProductExchangeCreationStrategy : IOrderCreationStrategy { private readonly MetaverseBrokerDbContext m_broker_db_context; diff --git a/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductOrderCompletionStrategy.cs b/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductOrderCompletionStrategy.cs index 23fe8b7..90cb8c0 100644 --- a/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductOrderCompletionStrategy.cs +++ b/BrokerApiCore/Services/PlanetitemExchange/Strategies/ProductOrderCompletionStrategy.cs @@ -1,26 +1,9 @@ -using ServerCore; -using ServerBase; -using ServerCommon; - - -namespace BrokerCore.Services; - -using BrokerBusinessLog; - -using Common; - -using DbEntity; - -using Entity; -using Entity.Actions; - using MetaAssets; - using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; +using ServerBase; -using Repository; -using Repository.Context; +namespace BrokerApiCore; // 아이템 주문 완료 전략 public class ProductOrderCompletionStrategy : IOrderCompletionStrategy diff --git a/BrokerApiCore/Services/UserAuthService.cs b/BrokerApiCore/Services/UserAuthService.cs index 9fb2e81..1cd7b28 100644 --- a/BrokerApiCore/Services/UserAuthService.cs +++ b/BrokerApiCore/Services/UserAuthService.cs @@ -1,22 +1,13 @@ using System.IdentityModel.Tokens.Jwt; using System.Text; - using Microsoft.IdentityModel.Tokens; -using ServerCore; using ServerBase; - +using ServerCore; +using ServerBase; using ServerCommon; +using ServerCommon.BusinessLogDomain; -namespace BrokerCore.Services; - -using BrokerBusinessLog; - -using Repository; - -using Common; - -using Entity; - +namespace BrokerApiCore; public class UserAuthService { private readonly PlanetUserEntity m_planet_user_entity; diff --git a/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.dgspec.json b/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.dgspec.json index dbe23bd..ec6a865 100644 --- a/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.dgspec.json +++ b/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.dgspec.json @@ -90,16 +90,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -129,7 +139,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -138,8 +148,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -163,7 +173,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -172,7 +182,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -262,16 +272,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -301,7 +321,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -310,8 +330,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -335,7 +355,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -344,7 +364,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -427,16 +447,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -466,7 +496,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -475,8 +505,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -500,7 +530,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -509,7 +539,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -598,16 +628,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -637,7 +677,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -646,8 +686,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -671,7 +711,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -680,7 +720,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -756,22 +796,27 @@ }, "AWSSDK.Core": { "target": "Package", - "version": "[3.7.402.39, )", + "version": "[3.7.402.46, )", "versionCentrallyManaged": true }, "AWSSDK.DynamoDBv2": { "target": "Package", - "version": "[3.7.406.21, )", + "version": "[3.7.407, )", "versionCentrallyManaged": true }, "AWSSDK.OpenSearchService": { "target": "Package", - "version": "[3.7.404.75, )", + "version": "[3.7.404.81, )", "versionCentrallyManaged": true }, "AWSSDK.S3": { "target": "Package", - "version": "[3.7.416.9, )", + "version": "[3.7.416.15, )", + "versionCentrallyManaged": true + }, + "AWSSDK.SecurityToken": { + "target": "Package", + "version": "[3.7.401.89, )", "versionCentrallyManaged": true }, "AsyncStateMachine": { @@ -779,11 +824,66 @@ "version": "[1.3.2, )", "versionCentrallyManaged": true }, + "AutoMapper": { + "target": "Package", + "version": "[14.0.0, )", + "versionCentrallyManaged": true + }, + "AutoMapper.AspNetCore.OData.EFCore": { + "target": "Package", + "version": "[7.0.1, )", + "versionCentrallyManaged": true + }, + "AutoMapper.Collection": { + "target": "Package", + "version": "[11.0.0, )", + "versionCentrallyManaged": true + }, + "AutoMapper.Collection.EntityFrameworkCore": { + "target": "Package", + "version": "[11.0.0, )", + "versionCentrallyManaged": true + }, + "AutoMapper.Contrib.Autofac.DependencyInjection": { + "target": "Package", + "version": "[9.0.0, )", + "versionCentrallyManaged": true + }, + "AutoMapper.Data": { + "target": "Package", + "version": "[9.0.0, )", + "versionCentrallyManaged": true + }, + "AutoMapper.EF6": { + "target": "Package", + "version": "[3.0.1, )", + "versionCentrallyManaged": true + }, + "AutoMapper.Extensions.EnumMapping": { + "target": "Package", + "version": "[4.1.0, )", + "versionCentrallyManaged": true + }, + "AutoMapper.Extensions.ExpressionMapping": { + "target": "Package", + "version": "[8.0.0, )", + "versionCentrallyManaged": true + }, "Axion.ConcurrentHashSet": { "target": "Package", "version": "[1.0.0, )", "versionCentrallyManaged": true }, + "BCrypt.Net-Next": { + "target": "Package", + "version": "[4.0.3, )", + "versionCentrallyManaged": true + }, + "BouncyCastle.Cryptography": { + "target": "Package", + "version": "[2.5.1, )", + "versionCentrallyManaged": true + }, "CommandLineParser": { "target": "Package", "version": "[2.9.1, )", @@ -814,6 +914,16 @@ "version": "[0.2.621003, )", "versionCentrallyManaged": true }, + "Microsoft.Extensions.Configuration": { + "target": "Package", + "version": "[9.0.4, )", + "versionCentrallyManaged": true + }, + "Microsoft.Extensions.Options": { + "target": "Package", + "version": "[9.0.4, )", + "versionCentrallyManaged": true + }, "MongoDB.Analyzer": { "target": "Package", "version": "[1.5.0, )", @@ -866,7 +976,7 @@ }, "SSH.NET": { "target": "Package", - "version": "[2024.2.0, )", + "version": "[2025.0.0, )", "versionCentrallyManaged": true }, "StackExchange.Redis": { @@ -891,7 +1001,7 @@ }, "System.IdentityModel.Tokens.Jwt": { "target": "Package", - "version": "[8.8.0, )", + "version": "[8.9.0, )", "versionCentrallyManaged": true }, "YamlDotNet": { @@ -905,16 +1015,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -944,7 +1064,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -953,8 +1073,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -978,7 +1098,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -987,7 +1107,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -1070,16 +1190,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -1109,7 +1239,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -1118,8 +1248,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -1143,7 +1273,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -1152,7 +1282,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -1249,16 +1379,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -1288,7 +1428,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -1297,8 +1437,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -1322,7 +1462,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -1331,7 +1471,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -1418,16 +1558,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -1457,7 +1607,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -1466,8 +1616,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -1491,7 +1641,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -1500,7 +1650,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", @@ -1600,16 +1750,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -1639,7 +1799,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -1648,8 +1808,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -1673,7 +1833,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -1682,7 +1842,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", diff --git a/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.props b/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.props index 75a9ff2..5f34edd 100644 --- a/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.props +++ b/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.props @@ -14,15 +14,18 @@ - + + C:\Users\user\.nuget\packages\mongodb.analyzer\1.5.0 - C:\Users\user\.nuget\packages\awssdk.core\3.7.402.39 - C:\Users\user\.nuget\packages\awssdk.s3\3.7.416.9 - C:\Users\user\.nuget\packages\awssdk.opensearchservice\3.7.404.75 - C:\Users\user\.nuget\packages\awssdk.dynamodbv2\3.7.406.21 + C:\Users\user\.nuget\packages\entityframework\6.5.1 + C:\Users\user\.nuget\packages\awssdk.core\3.7.402.46 + C:\Users\user\.nuget\packages\awssdk.securitytoken\3.7.401.89 + C:\Users\user\.nuget\packages\awssdk.s3\3.7.416.15 + C:\Users\user\.nuget\packages\awssdk.opensearchservice\3.7.404.81 + C:\Users\user\.nuget\packages\awssdk.dynamodbv2\3.7.407 C:\Users\user\.nuget\packages\awssdk.cloudwatchlogs\3.7.305.15 C:\Users\user\.nuget\packages\awssdk.ec2\3.7.330.4 C:\Users\user\.nuget\packages\microsoft.codeanalysis.analyzers\3.3.3 diff --git a/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.targets b/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.targets index 59e6b29..81dbdb8 100644 --- a/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.targets +++ b/BrokerApiCore/obj/BrokerApiCore.csproj.nuget.g.targets @@ -3,8 +3,9 @@ - - + + + \ No newline at end of file diff --git a/BrokerApiCore/obj/Debug/BrokerApiCore.assets.cache b/BrokerApiCore/obj/Debug/BrokerApiCore.assets.cache index 6579e20f57c6742b02830ccffcb49a0cf8f006e0..34c90ebca3ceaf30ce23dea9451ac0fad9b754fd 100644 GIT binary patch literal 111234 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
=3TSC$;x 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 T@CO>|I55NE(Sd!Bgf*m6Q|fcor-BHCL~6NBMe zEp4sxD`~JfS4cP7H8D_n^RSd2E1%y~?b8ILgpg#^dz10N{SNt^8F0VI#Cne&)14Jz zt5XjwP9}YrGIKQ zfM5N^Jg0yntr*`f`=Gd5iW=kgQ;Ta_T7Y7_8wMn>UfUD0kbhRq@D`y~Gcntz z#?GBZt&I3hMQR74p1ng3eqPJIG<+S}FK@nB7U7GM|yx z-p)!x#|=FOeMiHjg}F13>+nJ`Vjxm#8xfPJ$Q7~XMkVq8hdkJ03du*aBDV2kIZ;9n zc7^3b%IM5kBNM^D2PG&SkCl9w(1p4Kk*6?Hep|M?Ix&&G3-3 HttpContext.Items["planet_id"]?.ToString() ?? string.Empty; diff --git a/BrokerApiServer/Common/CommandLineOption.cs b/BrokerApiServer/Common/CommandLineOption.cs index 05ba410..3ebd587 100644 --- a/BrokerApiServer/Common/CommandLineOption.cs +++ b/BrokerApiServer/Common/CommandLineOption.cs @@ -1,6 +1,6 @@ using CommandLine; -namespace BrokerApiServer.Common; +namespace BrokerApiServer; public class CommandLineOption { @@ -9,7 +9,4 @@ public class CommandLineOption [Option('s', "swagger", Default = false, Required = false, HelpText = "Show Swagger Mode")] public bool UseSwagger { get; init; } = false; - - [Option('n', "named-pipe", Default = false, Required = false, HelpText = "User Named Pipe")] - public bool UseNamedPipe { get; init; } = false; } diff --git a/BrokerApiServer/Common/Const.cs b/BrokerApiServer/Common/Const.cs index 05cdc09..e729d46 100644 --- a/BrokerApiServer/Common/Const.cs +++ b/BrokerApiServer/Common/Const.cs @@ -1,4 +1,4 @@ -namespace BrokerApiServer.Common; +namespace BrokerApiServer; public static class Const { diff --git a/BrokerApiServer/Common/PlanetAuthControllerBase.cs b/BrokerApiServer/Common/PlanetAuthControllerBase.cs index 9a5dab3..f1c75de 100644 --- a/BrokerApiServer/Common/PlanetAuthControllerBase.cs +++ b/BrokerApiServer/Common/PlanetAuthControllerBase.cs @@ -1,4 +1,4 @@ -namespace BrokerApiServer.Common; +namespace BrokerApiServer; using Microsoft.AspNetCore.Mvc; diff --git a/BrokerApiServer/Common/RequireAdminAuthAttribute.cs b/BrokerApiServer/Common/RequireAdminAuthAttribute.cs index 47a8163..f0b84c1 100644 --- a/BrokerApiServer/Common/RequireAdminAuthAttribute.cs +++ b/BrokerApiServer/Common/RequireAdminAuthAttribute.cs @@ -1,18 +1,17 @@ using Microsoft.AspNetCore.Mvc.Filters; -namespace BrokerCore.Common; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; -using BrokerApiServer.Common; - using Microsoft.IdentityModel.Tokens; -using ServerCore; using ServerBase; +using ServerCore; -using Services; +namespace BrokerApiServer; + +using BrokerApiCore; /// /// 엑세스 토큰 인증이 필요한 컨트롤러를 지정하는 애노테이션(Attribute) 정의 diff --git a/BrokerApiServer/Common/RequirePlanetAuthAttribute.cs b/BrokerApiServer/Common/RequirePlanetAuthAttribute.cs index 2507ff0..fd61d87 100644 --- a/BrokerApiServer/Common/RequirePlanetAuthAttribute.cs +++ b/BrokerApiServer/Common/RequirePlanetAuthAttribute.cs @@ -1,10 +1,7 @@ using Microsoft.AspNetCore.Mvc.Filters; +using BrokerApiCore; -namespace BrokerCore.Common; - -using BrokerApiServer.Common; - -using Services; +namespace BrokerApiServer; /// /// 엑세스 토큰 인증이 필요한 컨트롤러를 지정하는 애노테이션(Attribute) 정의 diff --git a/BrokerApiServer/Common/RequireUserJwtAuthAttribute.cs b/BrokerApiServer/Common/RequireUserJwtAuthAttribute.cs index fa7e3f1..9432403 100644 --- a/BrokerApiServer/Common/RequireUserJwtAuthAttribute.cs +++ b/BrokerApiServer/Common/RequireUserJwtAuthAttribute.cs @@ -1,8 +1,8 @@ -namespace BrokerCore.Common; +using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.AspNetCore.Mvc.Filters; +using BrokerApiCore; -using Services; +namespace BrokerApiServer; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class RequireUserJwtAuthAttribute : System.Attribute, IAsyncActionFilter diff --git a/BrokerApiServer/Common/ResultExceptionFilter.cs b/BrokerApiServer/Common/ResultExceptionFilter.cs index 93501c3..9fff12d 100644 --- a/BrokerApiServer/Common/ResultExceptionFilter.cs +++ b/BrokerApiServer/Common/ResultExceptionFilter.cs @@ -1,15 +1,10 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using BrokerApiServer.Common; +using ServerCore; +using BrokerApiCore; -using BrokerCore.ApiModels; -using BrokerCore.Common; - -namespace CaliGameApi.Middlewares; - -using ServerCore; -using ServerBase; +namespace BrokerApiServer; public class ResultExceptionFilter : IExceptionFilter { diff --git a/BrokerApiServer/Common/ResultLoggingMiddleware.cs b/BrokerApiServer/Common/ResultLoggingMiddleware.cs index 081d2ac..b3ba8b5 100644 --- a/BrokerApiServer/Common/ResultLoggingMiddleware.cs +++ b/BrokerApiServer/Common/ResultLoggingMiddleware.cs @@ -1,6 +1,6 @@ -namespace BrokerApiServer.Common; +namespace BrokerApiServer; -using ServerCore; using ServerBase; +using ServerCore; public class ResultLoggingMiddleware : IMiddleware { diff --git a/BrokerApiServer/Common/SwaggerSettingHelper.cs b/BrokerApiServer/Common/SwaggerSettingHelper.cs index 5eaa95e..80a5312 100644 --- a/BrokerApiServer/Common/SwaggerSettingHelper.cs +++ b/BrokerApiServer/Common/SwaggerSettingHelper.cs @@ -2,7 +2,7 @@ using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; -namespace BrokerApiServer.Common; +namespace BrokerApiServer; using Microsoft.OpenApi.Any; diff --git a/BrokerApiServer/Controllers/AdminController.cs b/BrokerApiServer/Controllers/AdminController.cs index 3528974..0dc8b19 100644 --- a/BrokerApiServer/Controllers/AdminController.cs +++ b/BrokerApiServer/Controllers/AdminController.cs @@ -1,17 +1,13 @@ -using Microsoft.AspNetCore.Mvc; -using ServerCommon; -using BrokerCore.ApiModels; -using BrokerCore.Services; - -namespace BrokerApiServer.Controllers; - -using BrokerCore.Common; -using BrokerCore.DbEntity; - -using Common; +using BrokerApiServer; +using Microsoft.AspNetCore.Mvc; using ServerBase; +using ServerCommon; using Swashbuckle.AspNetCore.Annotations; + +using BrokerApiCore; +namespace BrokerApiServer.Controllers; + [Route("api/v1/admin")] [ApiController] // 운영자만 접근 가능한 컨트롤러 diff --git a/BrokerApiServer/Controllers/PlanetController.cs b/BrokerApiServer/Controllers/PlanetController.cs index 5b043e1..6f6a744 100644 --- a/BrokerApiServer/Controllers/PlanetController.cs +++ b/BrokerApiServer/Controllers/PlanetController.cs @@ -1,14 +1,9 @@ -using BrokerCore.ApiModels; -using BrokerCore.Services; - -using Microsoft.AspNetCore.Mvc; - +using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; +using BrokerApiCore; namespace BrokerApiServer.Controllers; -using BrokerCore.Common; - [Route("api/v1/planet")] [ApiController, SwaggerTag("플래닛의 인증 처리")] // 플래닛 인증 컨트롤러 diff --git a/BrokerApiServer/Controllers/PlanetUserController.cs b/BrokerApiServer/Controllers/PlanetUserController.cs index 9c78bbb..f777463 100644 --- a/BrokerApiServer/Controllers/PlanetUserController.cs +++ b/BrokerApiServer/Controllers/PlanetUserController.cs @@ -1,17 +1,10 @@ -using Microsoft.AspNetCore.Mvc; - +using System.ComponentModel; +using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; -namespace BrokerApiServer.Controllers; +using BrokerApiCore; -using System.ComponentModel; - -using BrokerCore.ApiModels; -using BrokerCore.Common; -using BrokerCore.DbEntity; -using BrokerCore.Services; - -using Common; +namespace BrokerApiServer; [Route("api/v1/planet/user")] [ApiController, SwaggerTag("**플래닛 유저의 로그인 및 교환 처리**
- /api/v1/planet/auth를 통해 accessToken을 발급받은 후 사용
- Bearer 형식 Hearder로 인증")] diff --git a/BrokerApiServer/Extensions/AppBuilderExtensions.cs b/BrokerApiServer/Extensions/AppBuilderExtensions.cs index 262d6c8..267c5e4 100644 --- a/BrokerApiServer/Extensions/AppBuilderExtensions.cs +++ b/BrokerApiServer/Extensions/AppBuilderExtensions.cs @@ -1,27 +1,13 @@ -using Microsoft.EntityFrameworkCore; +using System.Text; using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; -using System.Text; - -using ServerCore; using ServerBase; -using ServerCommon; +using ServerCore; +using BrokerApiCore; - -using BrokerCore; -using BrokerCore.Repository; -using BrokerCore.Repository.Context; -using BrokerCore.Services; -using BrokerCore.Common; - -namespace BrokerApiServer.Extensions; - -using BrokerCore.Meta; - -using Common; - -using NLog.Config; +namespace BrokerApiServer; public static class AppBuilderExtensions { diff --git a/BrokerApiServer/NamedPipePacketHandler/ForceStopServerPacketHandler.cs b/BrokerApiServer/NamedPipePacketHandler/ForceStopServerPacketHandler.cs index 28bb91a..9a2f16a 100644 --- a/BrokerApiServer/NamedPipePacketHandler/ForceStopServerPacketHandler.cs +++ b/BrokerApiServer/NamedPipePacketHandler/ForceStopServerPacketHandler.cs @@ -1,24 +1,16 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ControlCenter.NamedPipe; +using ControlCenter.NamedPipe; using ControlCenter.NamedPipeHost.Manager; using ServerControlCenter; using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; -namespace BrokerApiServer.NamedPipePacketHandler; +namespace BrokerApiServer; public class ForceStopServerMessageReceiver : NamedPipeReceiver { private readonly ServerInfoManager m_info_manager; - + public ForceStopServerMessageReceiver(ServerInfoManager infoManager) { m_info_manager = infoManager; @@ -32,8 +24,8 @@ public class ForceStopServerMessageReceiver : NamedPipeReceiver { private readonly ServerInfoManager m_info_manager; - + public StopServerMessageReceiver(ServerInfoManager infoManager) { m_info_manager = infoManager; @@ -19,11 +19,11 @@ public class StopServerMessageReceiver : NamedPipeReceiver Log.getLogger().debug($"{nameof(StopServerMessageReceiver)}: Receive - message_id[{message_id}] / message[{message}]"); m_info_manager.setServerStatus(ServerStatus.Stop); - + // 정보 전달 대기 await Task.Delay(1_000); - + // process 종료 Environment.Exit(0); } -} \ No newline at end of file +} diff --git a/BrokerApiServer/Program.cs b/BrokerApiServer/Program.cs index b7fe774..5e1435d 100644 --- a/BrokerApiServer/Program.cs +++ b/BrokerApiServer/Program.cs @@ -1,27 +1,19 @@ using System.Reflection; - -using ServerCore; -using ServerBase; -using ServerCommon; - -using BrokerApiServer.Common; -using BrokerApiServer.Extensions; -using CaliGameApi.Middlewares; +using BrokerApiServer; using CommandLine; using ControlCenter.NamedPipeHost.Extensions; +using ServerCore; //============================================================================= // 인자 설정 //============================================================================= var port = 12000; var use_swagger = false; -var use_named_pipe = false; var parsed_arguments = Parser.Default.ParseArguments(args); if (parsed_arguments is Parsed parsed) { port = parsed.Value.Port; use_swagger = parsed.Value.UseSwagger ? true : false; - use_named_pipe = parsed.Value.UseNamedPipe ? true : false; } var cmd_options = new string[] { "--urls", $"http://*:{port}" }; @@ -35,11 +27,8 @@ builder.Services.AddHealthChecks(); builder.Services.AddSwaggerGen(SwaggerSettingHelper.setSwaggerGen); var assemblies = new List(AppDomain.CurrentDomain.GetAssemblies()); -if (use_named_pipe) -{ - builder.Services.AddNamedPipelineClientManager(assemblies, ServerControlCenter.ServerType.BrokerApi, - ServiceCategory.Caliverse.ToString(), NetworkHelper.getEthernetLocalIPv4(), port); -} +builder.Services.AddNamedPipelineClientManager(assemblies, ServerControlCenter.ServerType.BrokerApi, + ServiceCategory.Caliverse.ToString(), NetworkHelper.getEthernetLocalIPv4(), port); var app = builder.Build(); app.UseCors("Everything"); @@ -69,9 +58,6 @@ app.Services.GetRequiredService().ApplicationStarted.R }); app.Services.GetRequiredService().ApplicationStopped.Register(Log.shutdown); -if (use_named_pipe) -{ - app.UseNamedPipelineClientManager(); -} +app.UseNamedPipelineClientManager(); app.Run(); diff --git a/BrokerApiServer/Properties/launchSettings.json b/BrokerApiServer/Properties/launchSettings.json index 93f56cf..d16a905 100644 --- a/BrokerApiServer/Properties/launchSettings.json +++ b/BrokerApiServer/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "http": { "commandName": "Project", - "commandLineArgs": "-p 12000 -s", + "commandLineArgs": "-p 12000 -s --named-pipe true", "launchBrowser": true, "launchUrl": "swagger", "environmentVariables": { diff --git a/BrokerApiTest/ControllerTests/AccontControllerTests.cs b/BrokerApiTest/ControllerTests/AccontControllerTests.cs deleted file mode 100644 index 6342285..0000000 --- a/BrokerApiTest/ControllerTests/AccontControllerTests.cs +++ /dev/null @@ -1,163 +0,0 @@ -namespace BrokerTest.Controllers; - -using System.Net; -using System.Net.Http.Json; -using System.Text.Json; - -using BrokerCore.ApiModels; -using Helper; -using Xunit; - -public class AccountControllerTests -{ - private readonly BrokerTestServer m_server = new BrokerTestServer(); - - [Fact] - public async Task initializeAsync() - { - await Task.CompletedTask; - } - - [Fact] - public async Task Login_ValidRequest_ReturnsOkWithLoginResponse() - { - // Arrange - const string validToken = "valid_web_portal_token"; - const string userGuid = "test_user_guid"; - const string nickname = "test_nickname"; - - var client = m_server.getTestClient(); - Assert.NotNull(client); - var request = new LoginRequest { WebPortalToken = validToken }; - // Act - var response = await client.PostAsJsonAsync("/api/v1/account/login", request); - - // Assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - - // ReadFromJsonAsync 사용 시, 올바른 options 주입 - var login_response = await response.Content.ReadFromJsonAsync(); - - Assert.NotNull(login_response); - Assert.Equal(userGuid, login_response.UserGuid); - Assert.Equal(nickname, login_response.Nickname); - - // mockUserAuthService.Verify(m => m.authByWebPortalToken(validToken), Times.Once); //정확히 한번 호출되었는지 확인 - // mockUserAuthService.VerifyGet(x=>x.UserGuid, Times.AtLeastOnce); //최소 한번 호출되었는지 확인 - // mockUserAuthService.VerifyGet(x=>x.Nickname, Times.AtLeastOnce); - } - - // [Fact] - // public async Task Login_InvalidRequest_EmptyToken_ReturnsBadRequest() - // { - // // Arrange - // var client = _factory.CreateClient(); - // var request = new LoginRequest { WebPortalToken = "" }; // Empty token - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/account/login", request); - // - // // Assert - // Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - // - // //응답 내용 확인 (선택) - // var errorResponse = await response.Content.ReadFromJsonAsync(_jsonOptions); - // Assert.NotNull(errorResponse); - // Assert.Equal((int)ServerErrorCode.InvalidRequest, errorResponse.Code); - // Assert.Contains("WebPortalToken does not exist", errorResponse.Message); - // - // } - // - // [Fact] - // public async Task Login_InvalidRequest_NullToken_ReturnsBadRequest() - // { - // // Arrange - // var client = _factory.CreateClient(); - // var request = new LoginRequest { WebPortalToken = null }; // null token - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/account/login", request); - // - // - // // Assert - // Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - // - // //응답 내용 확인 (선택) - // var errorResponse = await response.Content.ReadFromJsonAsync(_jsonOptions); - // Assert.NotNull(errorResponse); - // Assert.Equal((int)ServerErrorCode.InvalidRequest, errorResponse.Code); - // Assert.Contains("WebPortalToken does not exist", errorResponse.Message); - // } - // [Fact] - // public async Task Login_InvalidRequest_NullRequest_ReturnsBadRequest() - // { - // // Arrange - // var client = _factory.CreateClient(); - // LoginRequest? request = null; // Null request - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/account/login", request); - // - // // Assert - // Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - // - // //응답 내용 확인 (선택) - // var errorResponse = await response.Content.ReadFromJsonAsync(_jsonOptions); - // Assert.NotNull(errorResponse); - // Assert.Equal((int)ServerErrorCode.InvalidRequest, errorResponse.Code); - // Assert.Contains("Request is empty", errorResponse.Message); - // } - // - // [Fact] - // public async Task Login_AuthServiceReturnsFail_ReturnsBadRequest() - // { - // // Arrange - // const string invalidToken = "invalid_token"; - // - // // Mock UserAuthService - // var mockUserAuthService = new Mock(MockBehavior.Strict, null, null,null,null,null); - // mockUserAuthService.Setup(m => m.authByWebPortalToken(invalidToken)) - // .ReturnsAsync(Result.Fail(ServerErrorCode.InvalidToken, "Invalid token")); - // - // - // var client = _factory.WithWebHostBuilder(builder => - // { - // builder.ConfigureTestServices(services => - // { - // services.AddScoped(_ => mockUserAuthService.Object); - // }); - // }).CreateClient(); - // - // - // var request = new LoginRequest { WebPortalToken = invalidToken }; - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/account/login", request); - // - // // Assert - // Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - // var errorResponse = await response.Content.ReadFromJsonAsync(_jsonOptions); - // Assert.NotNull(errorResponse); - // Assert.Equal((int)ServerErrorCode.InvalidToken, errorResponse.Code); - // Assert.Equal("Invalid token", errorResponse.Message); - // - // mockUserAuthService.Verify(m=>m.authByWebPortalToken(invalidToken), Times.Once); - // } - // - // [Fact] - // public async Task Dummy_ValidRequest_ReturnsOk() - // { - // // Arrange - // var client = _factory.CreateClient(); - // var request = new DummyRequest { Dummy = "test" }; - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/account/dummy", request); - // - // // Assert - // Assert.Equal(HttpStatusCode.OK, response.StatusCode); - // var dummyResponse = await response.Content.ReadFromJsonAsync(); - // Assert.NotNull(dummyResponse); - // Assert.Equal("test", dummyResponse.Dummy); - // } -} diff --git a/BrokerApiTest/ControllerTests/CurrencyControllerTests.cs b/BrokerApiTest/ControllerTests/CurrencyControllerTests.cs index 7443022..91ebeeb 100644 --- a/BrokerApiTest/ControllerTests/CurrencyControllerTests.cs +++ b/BrokerApiTest/ControllerTests/CurrencyControllerTests.cs @@ -1,17 +1,8 @@ -using System.IdentityModel.Tokens.Jwt; -using System.Net.Http.Json; -using System.Security.Claims; -using System.Text.Json; - -using BrokerCore.ApiModels; -using BrokerCore.Common; -using BrokerCore.DbEntity; -using BrokerCore.Services; - +using System.Net.Http.Json; +using BrokerApiCore; using BrokerTest.Helper; namespace BrokerTest.Controllers; - public class CurrencyControllerTests { private readonly BrokerTestServer m_server = new BrokerTestServer(); diff --git a/BrokerApiTest/ControllerTests/DevCurrencyControllerTests.cs b/BrokerApiTest/ControllerTests/DevCurrencyControllerTests.cs index 5b086b7..3cd1431 100644 --- a/BrokerApiTest/ControllerTests/DevCurrencyControllerTests.cs +++ b/BrokerApiTest/ControllerTests/DevCurrencyControllerTests.cs @@ -1,16 +1,10 @@ -using System.IdentityModel.Tokens.Jwt; -using System.Net.Http.Json; -using System.Security.Claims; -using System.Text.Json; +using System.Net.Http.Json; -using BrokerCore.ApiModels; -using BrokerCore.Common; -using BrokerCore.DbEntity; -using BrokerCore.Services; +using BrokerApiCore; -using BrokerTest.Helper; +using BrokerApiServer; -namespace BrokerTest.Controllers; +namespace BrokerTest; public class DevCurrencyControllerTests { diff --git a/BrokerApiTest/ControllerTests/Dev_PlanetUserControllerTests.cs b/BrokerApiTest/ControllerTests/Dev_PlanetUserControllerTests.cs deleted file mode 100644 index afde523..0000000 --- a/BrokerApiTest/ControllerTests/Dev_PlanetUserControllerTests.cs +++ /dev/null @@ -1,179 +0,0 @@ -// using System.Net; -// using System.Net.Http.Json; -// -// using BrokerCore.ApiModels; -// using BrokerCore.DbEntity; -// -// using BrokerTest.Helper; -// -// using ServerCommon; -// -// using Xunit.Abstractions; -// -// namespace BrokerTest.Controllers; -// -// public class DevPlanetUserControllerTests : IAsyncLifetime -// { -// private readonly ITestOutputHelper m_test_output_helper; -// const string m_planet_id = "new_earth"; -// const string m_planet_secret_key = "A8h$KmP3sWxZqL5vYnR7uTgBdEjHkMlQoT1wXzCv"; -// const string m_user_guid = "1052b08b52ef4d69a27ee1f40911a72f"; -// private string m_planet_token = string.Empty; -// const string m_remote_server_url = "https://dev.planethub.caliverse.io:12000"; -// private readonly MetaTableTestHelper m_meta_table_test_helper = new(); -// -// private readonly IBrokerTestServer m_server = new BrokerTestRemoteServer(m_remote_server_url); -// -// public DevPlanetUserControllerTests(ITestOutputHelper testOutputHelper) -// { -// m_test_output_helper = testOutputHelper; -// } -// -// private HttpClient getTestClient() -// { -// var client = m_server.getTestClient(); -// if (m_planet_token != string.Empty) -// { -// client.DefaultRequestHeaders.Add("Authorization", $"Bearer {m_planet_token}"); -// } -// -// return client; -// } -// -// private HttpClient getTestClientWithBearer() -// { -// var client = m_server.getTestClient(); -// if (m_planet_token != string.Empty) -// { -// client.DefaultRequestHeaders.Add("Authorization", $"Bearer {m_planet_token}"); -// } -// -// return client; -// } -// -// public async Task InitializeAsync() -// { -// m_meta_table_test_helper.load(); -// -// // Arrange -// var client = getTestClient(); -// var request = new PlanetAuthRequest { PlanetId = m_planet_id, PlanetSecretKey = m_planet_secret_key }; -// -// // Act -// var response = await client.PostAsJsonAsync("/api/v1/planet/auth", request); -// -// // Assert -// response.EnsureSuccessStatusCode(); -// var response_body = await response.Content.ReadFromJsonAsync(); -// Assert.NotNull(response_body); -// Assert.NotEmpty(response_body.AccessToken); -// m_planet_token = response_body.AccessToken; -// } -// -// public async Task DisposeAsync() -// { -// await Task.CompletedTask; -// } -// -// private bool checkError(HttpResponseMessage responseMessage) -// { -// if (responseMessage.StatusCode != HttpStatusCode.OK) -// { -// var error_body = responseMessage.Content.ReadFromJsonAsync().Result; -// Assert.NotNull(error_body); -// m_test_output_helper.WriteLine(error_body.ErrorMessage ?? string.Empty); -// Assert.True(false); -// } -// -// return true; -// } -// -// [Fact(DisplayName = "아이템 교환 주문 컨트롤러 테스트 모든 Meta")] -// public async Task allMetaTests() -// { -// var meta = m_meta_table_test_helper.getMetaTableRef(); -// var meta_tuples = meta.MetaTable.PlanetItemExchangePolicyMetaTable.PlanetItemExchangePolicyDataList -// .Select(x => -// string.Equals(x.CaliverseItemType, CaliverseItemType.Currency.ToString(), -// StringComparison.CurrentCultureIgnoreCase) -// ? (x.ID, Random.Shared.Next(10, 201)) -// : (x.ID, 1)); -// foreach (var meta_tuple in meta_tuples) -// { -// await orderTest(meta_tuple.Item1, meta_tuple.Item2); -// } -// } -// -// private async Task orderTest(string metaId, int metaAmount) -// { -// string order_id; -// { -// // Arrange -// var request_uri = "/api/v1/planet/user/exchange/order/create"; -// var client = getTestClientWithBearer(); -// var exchange_request = new PlanetItemExchangeRequest -// { -// SeasonId = "TEST_SEASON_ID", -// UserGuid = m_user_guid, ExchangeMetaId = metaId, ExchangeMetaAmount = metaAmount, -// }; -// -// // Act -// var exchange_response = await client.PostAsJsonAsync(request_uri, exchange_request); -// -// // Assert -// checkError(exchange_response); -// var exchange_response_body = -// await exchange_response.Content.ReadFromJsonAsync(); -// Assert.NotNull(exchange_response_body); -// Assert.NotNull(exchange_response_body.ExchangeOrder.OrderId); -// order_id = exchange_response_body.ExchangeOrder.OrderId; -// } -// { -// // Arrange -// var request_uri = "/api/v1/planet/user/exchange/order/list"; -// var client = getTestClientWithBearer(); -// var list_request = new PlanetItemExchangeOrderListRequest -// { -// UserGuid = m_user_guid, Option = FindOption.All, ExchangeMetaId = metaId, -// }; -// -// // Act -// var list_response = await client.PostAsJsonAsync(request_uri, list_request); -// checkError(list_response); -// -// // Assert -// list_response.EnsureSuccessStatusCode(); -// var list_response_body = -// await list_response.Content.ReadFromJsonAsync(); -// Assert.NotNull(list_response_body); -// Assert.NotNull(list_response_body.Orders); -// -// var order = list_response_body.Orders.FirstOrDefault(x => x.OrderId == order_id); -// Assert.NotNull(order); -// Assert.Equal(ExchangeOrderStatus.Pending, order.OrderStatus); -// } -// { -// // Arrange -// var request_uri = "/api/v1/planet/user/exchange/order/complete"; -// var client = getTestClientWithBearer(); -// -// // Act -// var complete_request = new PlanetItemExchangeCompleteRequest -// { -// UserGuid = m_user_guid, ExchangeOrderId = order_id -// }; -// var complete_response = -// await client.PostAsJsonAsync(request_uri, complete_request); -// checkError(complete_response); -// -// // Assert -// complete_response.EnsureSuccessStatusCode(); -// var complete_response_body = -// await complete_response.Content.ReadFromJsonAsync(); -// Assert.NotNull(complete_response_body); -// Assert.NotNull(complete_response_body.ExchangeOrder); -// Assert.Equal(order_id, complete_response_body.ExchangeOrder.OrderId); -// Assert.Equal(ExchangeOrderStatus.Completed, complete_response_body.ExchangeOrder.OrderStatus); -// } -// } -// } diff --git a/BrokerApiTest/ControllerTests/PlanetControllerTests.cs b/BrokerApiTest/ControllerTests/PlanetControllerTests.cs index 8ee591f..df3f1e4 100644 --- a/BrokerApiTest/ControllerTests/PlanetControllerTests.cs +++ b/BrokerApiTest/ControllerTests/PlanetControllerTests.cs @@ -1,16 +1,14 @@ -namespace BrokerTest.Controllers; - -using System.IdentityModel.Tokens.Jwt; -using System.Net; +using System.IdentityModel.Tokens.Jwt; using System.Net.Http.Json; using System.Security.Claims; using System.Text.Json; -using BrokerCore.ApiModels; -using BrokerCore.Common; -using BrokerCore.Services; -using Helper; -using Xunit; +using BrokerApiCore; + +using BrokerApiServer; +using BrokerTest.Helper; + +namespace BrokerTest; public class PlanetControllerTests { private readonly BrokerTestServer m_server = new(); @@ -49,40 +47,4 @@ public class PlanetControllerTests Assert.NotNull(auth_response.AccessToken); Assert.NotEqual(auth_response.AccessToken, string.Empty); } - - // [Fact] - // public async Task Auth_InvalidRequest_EmptyPlanetId_ReturnsBadRequest() - // { - // // Arrange - // var client = m_server.getTestClient(); - // var request = new PlanetAuthRequest { PlanetId = "", PlanetSecretKey = "test_secret_key" }; - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/planet/auth", request); - // - // // Assert - // Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - // var error_response = await response.Content.ReadFromJsonAsync(m_json_options); - // Assert.NotNull(error_response); - // Assert.Equal((int)ServerErrorCode.InvalidRequest, error_response.Code); - // Assert.Contains("planet id is required", error_response.Message); - // } - // - // [Fact] - // public async Task Auth_InvalidRequest_NullPlanetSecretKey_ReturnsBadRequest() - // { - // // Arrange - // var client = m_server.getTestClient(); - // var request = new PlanetAuthRequest { PlanetId = "test_planet_id", PlanetSecretKey = null }; - // - // // Act - // var response = await client.PostAsJsonAsync("/api/v1/planet/auth", request); - // - // // Assert - // Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - // var error_response = await response.Content.ReadFromJsonAsync(m_json_options); - // Assert.NotNull(error_response); - // Assert.Equal((int)ServerErrorCode.InvalidRequest, error_response.Code); - // Assert.Contains("planet access key is required", error_response.Message); - // } } diff --git a/BrokerApiTest/ControllerTests/PlanetUserControllerTests.cs b/BrokerApiTest/ControllerTests/PlanetUserControllerTests.cs index d201ea2..fa9c23e 100644 --- a/BrokerApiTest/ControllerTests/PlanetUserControllerTests.cs +++ b/BrokerApiTest/ControllerTests/PlanetUserControllerTests.cs @@ -1,8 +1,9 @@ using System.Net; using System.Net.Http.Json; -using BrokerCore.ApiModels; -using BrokerCore.DbEntity; +using BrokerApiCore; + +using BrokerApiServer; using BrokerTest.Helper; @@ -10,8 +11,7 @@ using ServerCommon; using Xunit.Abstractions; -namespace BrokerTest.Controllers; - +namespace BrokerTest; public class PlanetUserControllerTests : IAsyncLifetime { private readonly ITestOutputHelper m_test_output_helper; diff --git a/BrokerApiTest/ControllerTests/QAPlanetUserControllerTests.cs b/BrokerApiTest/ControllerTests/QAPlanetUserControllerTests.cs index 942cd71..0fdafe5 100644 --- a/BrokerApiTest/ControllerTests/QAPlanetUserControllerTests.cs +++ b/BrokerApiTest/ControllerTests/QAPlanetUserControllerTests.cs @@ -1,19 +1,16 @@ using System.Net; using System.Net.Http.Json; -using BrokerCore.ApiModels; -using BrokerCore.DbEntity; +using BrokerApiCore; -using BrokerTest.Helper; - -using Microsoft.IdentityModel.Tokens; +using Xunit.Abstractions; using ServerCommon; using ServerCore; -using Xunit.Abstractions; - -namespace BrokerTest.Controllers; +using BrokerApiServer; +using BrokerTest.Helper; +namespace BrokerTest; public class QaPlanetUserControllerTests : IAsyncLifetime { private readonly ITestOutputHelper m_test_output_helper; diff --git a/BrokerApiTest/ControllerTests/QaCurrencyControllerTests.cs b/BrokerApiTest/ControllerTests/QaCurrencyControllerTests.cs deleted file mode 100644 index 3f5c866..0000000 --- a/BrokerApiTest/ControllerTests/QaCurrencyControllerTests.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System.IdentityModel.Tokens.Jwt; -using System.Net; -using System.Net.Http.Json; -using System.Security.Claims; -using System.Text.Json; - -using BrokerCore.ApiModels; -using BrokerCore.Common; -using BrokerCore.DbEntity; -using BrokerCore.Services; - -using BrokerTest.Helper; - -using Xunit.Abstractions; - -namespace BrokerTest.Controllers; - -public class QaCurrencyControllerTests -{ - private readonly ITestOutputHelper m_test_output_helper; - - public QaCurrencyControllerTests(ITestOutputHelper testOutputHelper) - { - m_test_output_helper = testOutputHelper; - } - // private readonly BrokerTestServer m_server = new BrokerTestServer(); - - public HttpClient getTestClient() - { - return new HttpClient { BaseAddress = new Uri("https://qa.planethub.caliverse.io:12000") }; - } - - [Fact] - public async Task initializeAsync() - { - await Task.CompletedTask; - } - - [Fact] - public async Task Auth_ValidRequest_ReturnsOkWithAccessToken() - { - // Arrange - const string planet_id = "new_earth"; - const string planet_secret_key = "A8h$KmP3sWxZqL5vYnR7uTgBdEjHkMlQoT1wXzCv"; - var planet_token = string.Empty; - var order_id = string.Empty; - { - var client = getTestClient(); - var request = new PlanetAuthRequest { PlanetId = planet_id, PlanetSecretKey = planet_secret_key }; - - // Act - var response = await client.PostAsJsonAsync("/api/v1/planet/auth", request); - - // Assert - response.EnsureSuccessStatusCode(); - var response_body = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(response_body); - planet_token = response_body.AccessToken; - } - { - var client = getTestClient(); - var request = new ExchangeOrderRequest - { - UserGuid = "1052b08b52ef4d69a27ee1f40911a72f", Sapphire = 10, Emerald = 10 - }; - client.DefaultRequestHeaders.Add("Authorization", $"Bearer {planet_token}"); - var response = await client.PostAsJsonAsync("/api/v1/exchange/order/create", request); - if (response.StatusCode == HttpStatusCode.BadRequest) - { - var response_body_error = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(response_body_error); - m_test_output_helper.WriteLine(response_body_error.ErrorMessage); - // Assert.Contains("Insufficient balance", response_body_error); - return; - } - response.EnsureSuccessStatusCode(); - var response_body = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(response_body); - Assert.NotNull(response_body.OrderId); - order_id = response_body.OrderId; - // Assert - } - - //UserGuid:1052b08b52ef4d69a27ee1f40911a72f - { - var client = getTestClient(); - var request = new ExchangeOrderListRequest - { - UserGuid = "1052b08b52ef4d69a27ee1f40911a72f", Option = FindOption.All - }; - client.DefaultRequestHeaders.Add("Authorization", $"Bearer {planet_token}"); - var response = await client.PostAsJsonAsync("/api/v1/exchange/order/list", request); - response.EnsureSuccessStatusCode(); - var response_body = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(response_body); - Assert.NotNull(response_body.Orders); - // Assert - } - - { - var client = getTestClient(); - var request = - new ExchangeOrderCompleteRequest { UserGuid = "1052b08b52ef4d69a27ee1f40911a72f", OrderId = order_id }; - client.DefaultRequestHeaders.Add("Authorization", $"Bearer {planet_token}"); - var response = await client.PostAsJsonAsync("/api/v1/exchange/order/complete", request); - response.EnsureSuccessStatusCode(); - var response_body = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(response_body); - Assert.NotNull(response_body.OrderId); - Assert.Equal(order_id, response_body.OrderId); - Assert.Equal(ExchangeOrderStatus.Completed, response_body.Status); - // Assert - } - } -} diff --git a/BrokerApiTest/ControllerTests/StagePlanetUserControllerTests.cs b/BrokerApiTest/ControllerTests/StagePlanetUserControllerTests.cs index e9c6a32..6cb9783 100644 --- a/BrokerApiTest/ControllerTests/StagePlanetUserControllerTests.cs +++ b/BrokerApiTest/ControllerTests/StagePlanetUserControllerTests.cs @@ -1,19 +1,17 @@ using System.Net; using System.Net.Http.Json; -using BrokerCore.ApiModels; -using BrokerCore.DbEntity; +using BrokerApiCore; -using BrokerTest.Helper; - -using Microsoft.IdentityModel.Tokens; +using Xunit.Abstractions; using ServerCommon; using ServerCore; -using Xunit.Abstractions; -namespace BrokerTest.Controllers; +using BrokerApiServer; +using BrokerTest.Helper; +namespace BrokerTest; public class StagePlanetUserControllerTests : IAsyncLifetime { private readonly ITestOutputHelper m_test_output_helper; @@ -28,7 +26,7 @@ public class StagePlanetUserControllerTests : IAsyncLifetime private readonly MetaTableTestHelper m_meta_table_test_helper = new(); // private readonly IBrokerTestServer m_server = new BrokerTestServer(); - private readonly IBrokerTestServer m_server = new BrokerTestRemoteServer("https://qa.planethub.caliverse.io:12000"); + private readonly IBrokerTestServer m_server = new BrokerTestRemoteServer("https://stage.planethub.caliverse.io:12000"); public StagePlanetUserControllerTests(ITestOutputHelper testOutputHelper) { diff --git a/BrokerApiTest/DocQuery/DataExample.cs b/BrokerApiTest/DocQuery/DataExample.cs index 1a786a4..39e2780 100644 --- a/BrokerApiTest/DocQuery/DataExample.cs +++ b/BrokerApiTest/DocQuery/DataExample.cs @@ -1,123 +1,7 @@ -using PlatformTest.DbQuery; - -using ServerCommon; - + using ServerCore; using ServerBase; -using USER_GUID = System.String; - - -// public class DBQUserTest : QueryExecutorBase -// { -// private string m_combination_key_for_pk = string.Empty; -// private string m_combination_key_for_sk = string.Empty; -// private UserTestEntity? m_user_test; -// private DynamoDbClient m_dynamoDbClient; -// -// public DBQUserTest(string combinationKeyForPK, string combinationKeyForSK, DynamoDbClient dynamoDbClient) -// : base(nameof(DBQUserTest)) -// { -// m_combination_key_for_pk = combinationKeyForPK; -// m_combination_key_for_sk = combinationKeyForSK; -// m_dynamoDbClient = dynamoDbClient; -// } -// -// //=================================================================================================== -// // DB 쿼리 직전에 준비해야 할 로직들을 작성한다. -// //=================================================================================================== -// public override async Task onPrepareQuery() -// { -// var result = new Result(); -// -// var user_test = getOwner(); -// NullReferenceCheckHelper.throwIfNull(user_test, () => "user is null !!!"); -// -// var query_batch = getQueryBatch(); -// NullReferenceCheckHelper.throwIfNull(query_batch, -// () => $"query_batch is null !!! - {user_test.toBasicString()}"); -// -// var db_connector = query_batch.getDynamoDbConnector(); -// NullReferenceCheckHelper.throwIfNull(db_connector, -// () => $"db_connector is null !!! - {user_test.toBasicString()}"); -// -// await DynamoDBDocBaseHelper.makePrimaryKey(m_combination_key_for_pk, m_combination_key_for_sk); -// -// // var ctxs = new List(); -// // -// // (result, var user_doc) = await m_user_test.onCopyToDocument(); -// -// -// return Task.FromResult(result); -// } -// -// //=================================================================================================== -// // onPrepareQuery()를 성공할 경우 호출된다. -// //=================================================================================================== -// public override async Task onQuery() -// { -// var result = new Result(); -// var err_msg = string.Empty; -// -// var user = getOwner(); -// NullReferenceCheckHelper.throwIfNull(user, () => "user is null !!!"); -// -// var query_batch = getQueryBatch(); -// NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {user.toBasicString()}"); -// -// var db_connector = query_batch.getDynamoDbConnector(); -// -// var user_doc = new UserTestDoc(m_combination_key_for_pk, m_combination_key_for_sk); -// var user_test_base = new UserTestEntity(EntityType.None); -// var user_test_base_attrib = user_test_base.getEntityAttribute(); -// NullReferenceCheckHelper.throwIfNull(user_test_base_attrib, () => $"user_test_base_attrib is null !!!"); -// -// user_test_base_attrib.UserId = m_combination_key_for_pk; -// user_test_base_attrib.Name = m_combination_key_for_sk; -// -// var user_test_base_action = user_test_base.getEntityAction(); -// NullReferenceCheckHelper.throwIfNull(user_test_base_action, () => $"user_test_base_action is null !!!"); -// -// result = await user_test_base_action.tryInsertUser(m_combination_key_for_pk, m_combination_key_for_sk); -// if (result.isFail()) -// { -// return result; -// } -// -// var query_context = new DynamoDbDocumentQueryContext(user_doc, QueryType.Insert); -// await query_batch.addQuery(new QueryExecutorBase("InsertUser") -// { -// onPrepareQuery = () => Task.FromResult(new Result()), -// onQuery = () => Task.FromResult(new Result()), -// onQueryResponseCommit = () => Task.CompletedTask, -// onQueryResponseRollback = (errorResult) => Task.CompletedTask -// }); -// -// var result = await QueryHelper.sendQueryAndBusinessLog(query_batch); -// if (result.isFail()) -// { -// return result; -// } -// -// return result; -// } -// -// //=================================================================================================== -// // DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다. -// //=================================================================================================== -// public override Task onQueryResponseCommit() -// { -// return Task.CompletedTask; -// } -// -// //=================================================================================================== -// // DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다. -// //=================================================================================================== -// public override Task onQueryResponseRollback(Result errorResult) -// { -// return Task.CompletedTask; -// } -// } - +namespace BrokerTest; public class UserTestActorLog : ILogActor { } diff --git a/BrokerApiTest/DocQuery/DynamoDbClientTests.cs b/BrokerApiTest/DocQuery/DynamoDbClientTests.cs index 5c827e2..db20e2f 100644 --- a/BrokerApiTest/DocQuery/DynamoDbClientTests.cs +++ b/BrokerApiTest/DocQuery/DynamoDbClientTests.cs @@ -1,4 +1,3 @@ -namespace PlatformTest.DbQuery; using System.Threading.Tasks; @@ -13,6 +12,7 @@ using ServerBase; using ServerCommon; +namespace BrokerTest; public class DynamoDbClientTests { private ServerConfig? m_config; diff --git a/BrokerApiTest/DocQuery/EntityBaseTests.cs b/BrokerApiTest/DocQuery/EntityBaseTests.cs index 1b6bbca..9f68a24 100644 --- a/BrokerApiTest/DocQuery/EntityBaseTests.cs +++ b/BrokerApiTest/DocQuery/EntityBaseTests.cs @@ -1,12 +1,7 @@ -namespace PlatformTest.DbQuery; - -using Amazon; -using Amazon.DynamoDBv2; - -using ServerCommon; - -using ServerCore; using ServerBase; +using ServerCore; +using ServerBase; +namespace BrokerTest; public class EntityBaseTests { private readonly DynamoDbClient m_dynamo_db_client; diff --git a/BrokerApiTest/DocQuery/UserTestAttrib.cs b/BrokerApiTest/DocQuery/UserTestAttrib.cs index 513cf6a..5e62470 100644 --- a/BrokerApiTest/DocQuery/UserTestAttrib.cs +++ b/BrokerApiTest/DocQuery/UserTestAttrib.cs @@ -3,6 +3,7 @@ using ServerBase; using ServerCommon; +namespace BrokerTest; public class UserTestAttrib : AttribBase { [JsonProperty("user_id")] diff --git a/BrokerApiTest/DocQuery/UserTestDeleteOneAction.cs b/BrokerApiTest/DocQuery/UserTestDeleteOneAction.cs index 55aa2f4..2844063 100644 --- a/BrokerApiTest/DocQuery/UserTestDeleteOneAction.cs +++ b/BrokerApiTest/DocQuery/UserTestDeleteOneAction.cs @@ -1,11 +1,10 @@ -namespace PlatformTest.DbQuery; - + using Microsoft.AspNetCore.Identity; using ServerCommon; using ServerCore; using ServerBase; - +namespace BrokerTest; public class UserTestDeleteOneAction : EntityActionBase { public UserTestDeleteOneAction(EntityBase owner) : base(owner) diff --git a/BrokerApiTest/DocQuery/UserTestDoc.cs b/BrokerApiTest/DocQuery/UserTestDoc.cs index 831b00b..fcfad34 100644 --- a/BrokerApiTest/DocQuery/UserTestDoc.cs +++ b/BrokerApiTest/DocQuery/UserTestDoc.cs @@ -1,9 +1,7 @@ using ServerCommon; using ServerCore; using ServerBase; - -// DynamoDbDocBase는 리파지토리로 이해하면 편할 듯 -// AttribBase: db에 저장될 데이터 +namespace BrokerTest; public sealed class UserTestDoc : DynamoDbDocBase { private const string m_prefix_of_pk = "user_test#"; diff --git a/BrokerApiTest/DocQuery/UserTestEntity.cs b/BrokerApiTest/DocQuery/UserTestEntity.cs index 5bf5f0f..e179914 100644 --- a/BrokerApiTest/DocQuery/UserTestEntity.cs +++ b/BrokerApiTest/DocQuery/UserTestEntity.cs @@ -1,9 +1,7 @@ -using PlatformTest.DbQuery; - -using ServerCommon; - -using ServerCore; using ServerBase; +using ServerCore; +using ServerBase; +namespace BrokerTest; // EntityBase: EntityAttribute와 EntityAction을 관리하는 컨테이너 public class UserTestEntity : EntityBase, IWithLogActor { diff --git a/BrokerApiTest/DocQuery/UserTestEntityAttribute.cs b/BrokerApiTest/DocQuery/UserTestEntityAttribute.cs index f0c6fd5..84e633f 100644 --- a/BrokerApiTest/DocQuery/UserTestEntityAttribute.cs +++ b/BrokerApiTest/DocQuery/UserTestEntityAttribute.cs @@ -4,6 +4,7 @@ using ServerCore; using ServerBase; using ThirdParty.Json.LitJson; +namespace BrokerTest; // EntityAttributeBase를 상속 받은 개체는 메모리에 사용될 내용임 // 스토리지에 저장은 UsrTestDoc:DynamoDbDocBase에서 처리함 public class UserTestEntityAttribute : EntityAttributeBase diff --git a/BrokerApiTest/DocQuery/UserTestFindOneAction.cs b/BrokerApiTest/DocQuery/UserTestFindOneAction.cs index 61019fd..cc3782c 100644 --- a/BrokerApiTest/DocQuery/UserTestFindOneAction.cs +++ b/BrokerApiTest/DocQuery/UserTestFindOneAction.cs @@ -1,7 +1,10 @@ -using ServerCommon; +using BrokerTest; + +using ServerCommon; using ServerCore; using ServerBase; +namespace BrokerTest; public class UserTestFindOneAction : EntityActionBase { public UserTestFindOneAction(UserTestEntity owner) : base(owner) diff --git a/BrokerApiTest/DocQuery/UserTestInsertAction.cs b/BrokerApiTest/DocQuery/UserTestInsertAction.cs index 007af7f..01c7364 100644 --- a/BrokerApiTest/DocQuery/UserTestInsertAction.cs +++ b/BrokerApiTest/DocQuery/UserTestInsertAction.cs @@ -2,6 +2,7 @@ using ServerCore; using ServerBase; +namespace BrokerTest; public class UserTestInsertAction : EntityActionBase { public UserTestInsertAction(EntityBase owner) : base(owner) diff --git a/BrokerApiTest/DocQuery/UserTestUpdateOneAction.cs b/BrokerApiTest/DocQuery/UserTestUpdateOneAction.cs index 3580862..4cc19e4 100644 --- a/BrokerApiTest/DocQuery/UserTestUpdateOneAction.cs +++ b/BrokerApiTest/DocQuery/UserTestUpdateOneAction.cs @@ -1,4 +1,6 @@ -using ServerCommon; +using BrokerTest; + +using ServerCommon; using ServerCore; using ServerBase; diff --git a/BrokerApiTest/EntityTests/EntityMailTests.cs b/BrokerApiTest/EntityTests/EntityMailTests.cs index 89efb75..50a3d85 100644 --- a/BrokerApiTest/EntityTests/EntityMailTests.cs +++ b/BrokerApiTest/EntityTests/EntityMailTests.cs @@ -1,8 +1,5 @@ -using BrokerCore.Common; -using BrokerCore.Entity; -using BrokerCore.Entity.Actions; - -using BrokerTest.Helper; + +using BrokerApiCore; using Microsoft.Extensions.DependencyInjection; @@ -10,10 +7,9 @@ using ServerCore; using ServerBase; using ServerCommon; -using BrokerApiServer.Extensions; - -namespace BrokerTest.Entity; - +using BrokerApiServer; +using BrokerTest.Helper; +namespace BrokerTest; public class EntityMailTests : IAsyncLifetime { private readonly IServiceCollection m_services; diff --git a/BrokerApiTest/EntityTests/EntityTests.cs b/BrokerApiTest/EntityTests/EntityTests.cs index 776a79e..d917a78 100644 --- a/BrokerApiTest/EntityTests/EntityTests.cs +++ b/BrokerApiTest/EntityTests/EntityTests.cs @@ -1,14 +1,11 @@ -namespace BrokerTest.Entity; +using BrokerApiCore; - -using BrokerCore; -using BrokerCore.Entity; - - -using ServerCore; using ServerBase; using ServerCommon; +using BrokerApiServer; + +namespace BrokerTest; public class EntityTests { private readonly BrokerServerLogic m_logic; @@ -34,26 +31,6 @@ public class EntityTests m_dynamo_db_client = m_logic.getDynamoDbClient(); } - [Fact] - public async Task userBaseTest() - { - // var server_logic = new BrokerServerLogic(); - // var user = new UserEntity(); - // var initializers = new Initializers(); - // initializers.appendInitializer(user); - // - // foreach (var user_entity in initializers.getInitializers().Cast()) - // { - // _ = user_entity?.onInit(); - // } - // - // var action = user.getEntityAction(); - // var result = await action.onInit(); - // result = await action.login("account_id"); - // Assert.True(result.isSuccess()); - await Task.CompletedTask; - } - [Fact] public async Task userAuthEntityTest() { diff --git a/BrokerApiTest/Etc/SecurityKeyTests.cs b/BrokerApiTest/Etc/SecurityKeyTests.cs index 7ad3c44..3eb9f66 100644 --- a/BrokerApiTest/Etc/SecurityKeyTests.cs +++ b/BrokerApiTest/Etc/SecurityKeyTests.cs @@ -1,20 +1,8 @@ -using BrokerCore.Common; - -using Microsoft.Extensions.Logging; - -namespace BrokerTest.Etc; +using BrokerApiCore; +namespace BrokerTest; public class SecurityKeyTests { - // Constructor - // public SecurityKeyTests(ILogger logger) - // { - // this.m_logger = logger; - // } - // - // private readonly ILogger m_logger; - - // Test method to check if the security key is generated correctly [Fact] public void testSecurityKeyGeneration() { @@ -23,13 +11,4 @@ public class SecurityKeyTests Assert.NotNull(result_hex); Assert.NotEmpty(result_base64); } - // - // // Test method to check if the security key is valid - // [Fact] - // public void testSecurityKey() - // { - // var result_key = Helpers.generateSecureKey(); - // Assert.NotNull(result_key); - // Assert.NotEmpty(result_key); - // } } diff --git a/BrokerApiTest/Helper/BrokerTestServer.cs b/BrokerApiTest/Helper/BrokerTestServer.cs index 483887a..cd1d2d5 100644 --- a/BrokerApiTest/Helper/BrokerTestServer.cs +++ b/BrokerApiTest/Helper/BrokerTestServer.cs @@ -2,22 +2,16 @@ using NLog.Extensions.Logging; -using ServerCore; using ServerBase; - -namespace BrokerTest.Helper; - -using System.Reflection; - -using BrokerApiServer.Common; -using BrokerApiServer.Controllers; -using BrokerApiServer.Extensions; - -using CaliGameApi.Middlewares; - using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using System.Reflection; + +using BrokerApiServer; +using BrokerApiServer.Controllers; + +namespace BrokerTest; public interface IBrokerTestServer { HttpClient getTestClient(); @@ -86,7 +80,7 @@ public class BrokerTestServer: IBrokerTestServerLocal var assembly = Assembly.GetAssembly(typeof(PlanetUserController)); Assert.NotNull(assembly); builder.Services.AddControllers(options => { options.Filters.Add(new ResultExceptionFilter()); }) - .AddApplicationPart(assembly); // 이유는 모르겠지만 이게 없으면 테스트에서 404 에러 발생 - 컨트롤러가 없음 + .AddApplicationPart(assembly); // 이게 없으면 테스트에서 404 에러 발생 - 컨트롤러가 없음 builder.Services.AddHealthChecks(); builder.Services.AddEndpointsApiExplorer(); diff --git a/BrokerApiTest/Helper/DocRepo/AccountDocRepo.cs b/BrokerApiTest/Helper/DocRepo/AccountDocRepo.cs deleted file mode 100644 index ab7fc2f..0000000 --- a/BrokerApiTest/Helper/DocRepo/AccountDocRepo.cs +++ /dev/null @@ -1,19 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using ServerCommon; -// -// public class AccountDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public AccountDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, AccountBaseAttrib?)> findAccountBaseAttrib(string accountId) -// { -// var (result, doc) = await AccountBaseDoc.findUserGuidFromAccountId(m_dynamo_db_client, accountId); -// return (result, doc?.getAttrib()); -// } -// } diff --git a/BrokerApiTest/Helper/DocRepo/CaliumEventDocRepo.cs b/BrokerApiTest/Helper/DocRepo/CaliumEventDocRepo.cs deleted file mode 100644 index 09c1739..0000000 --- a/BrokerApiTest/Helper/DocRepo/CaliumEventDocRepo.cs +++ /dev/null @@ -1,53 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using ServerCommon; -// using ServerCommon.EchoSystem.Models; -// -// using ServerCore; using ServerBase; -// -// public class CaliumEventDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public CaliumEventDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// // public async Task<(Result, CaliumEventAttrib?)> createOne(string userGuid) -// // { -// // var (result_pk, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// // if (result_pk.isFail() || primary_key_object == null) -// // { -// // return (result_pk, null); -// // } -// // -// // var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// // var (result, doc) = -// // await m_dynamo_db_client.simpleInsertDocument(config); -// // var attrib = doc?.getAttrib(); -// // return (result, attrib); -// // } -// public async Task createOne(string userGuid, CaliumEventRequest request, bool isRetry) -// { -// var doc = new CaliumEventDoc(request.m_event_id); -// var attrib = doc.getAttrib(); -// NullReferenceCheckHelper.throwIfNull(attrib, () => $"calium event attrib is null !!! - userGuid[{userGuid}]"); -// -// attrib.UserGuid = userGuid; -// attrib.EventData.m_server_type = request.m_server_type; -// attrib.EventData.m_event_type = request.m_event_type; -// attrib.EventData.m_sub_type = request.m_sub_type; -// attrib.EventData.m_div_type = request.m_div_type; -// attrib.EventData.m_div_id = request.m_div_id; -// attrib.EventData.m_calium_delta = request.m_calium_delta; -// attrib.EventData.m_sapphire_delta = request.m_sapphire_delta; -// attrib.EventData.m_current_epoch = request.m_current_epoch; -// attrib.EventData.m_current_inflation_rate = request.m_current_inflation_rate; -// attrib.Status = isRetry ? CaliumEventStatus.Regist : CaliumEventStatus.Failed; -// -// await m_dynamo_db_client.simpleInsertDocumentWithDocType(doc); -// return request.m_event_id; -// } -// -// } diff --git a/BrokerApiTest/Helper/DocRepo/CaliumStorageDocRepo.cs b/BrokerApiTest/Helper/DocRepo/CaliumStorageDocRepo.cs deleted file mode 100644 index 5cf6446..0000000 --- a/BrokerApiTest/Helper/DocRepo/CaliumStorageDocRepo.cs +++ /dev/null @@ -1,28 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using ServerCommon; -// -// public class CaliumStorageDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public CaliumStorageDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, CaliumStorageAttrib?)> findOne(string userGuid) -// { -// var (result_pk, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result_pk.isFail() || primary_key_object == null) -// { -// return (result_pk, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// var (result, doc) = -// await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// var attrib = doc?.getAttrib(); -// return (result, attrib); -// } -// } diff --git a/BrokerApiTest/Helper/DocRepo/CaliumStorageRepo.cs b/BrokerApiTest/Helper/DocRepo/CaliumStorageRepo.cs deleted file mode 100644 index 0804d4b..0000000 --- a/BrokerApiTest/Helper/DocRepo/CaliumStorageRepo.cs +++ /dev/null @@ -1,30 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using Common; -// -// using ServerCommon; -// -// public class CaliumStorageRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public CaliumStorageRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, CaliumStorageAttrib?)> findOne(string userGuid) -// { -// var (result_pk, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result_pk.isFail() || primary_key_object == null) -// { -// return (result_pk, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// var (result, doc) = -// await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// var attrib = doc?.getAttrib(); -// return (result, attrib); -// } -// } diff --git a/BrokerApiTest/Helper/DocRepo/MoneyDocRepo.cs b/BrokerApiTest/Helper/DocRepo/MoneyDocRepo.cs deleted file mode 100644 index caddd1a..0000000 --- a/BrokerApiTest/Helper/DocRepo/MoneyDocRepo.cs +++ /dev/null @@ -1,445 +0,0 @@ -// using Amazon.DynamoDBv2; -// using Amazon.DynamoDBv2.Model; -// -// using ServerCommon; -// -// using ServerCore; using ServerBase; -// -// namespace BrokerCore.Repository; -// -// using BrokerApiServer.Common; -// -// public class BrokerApiLogActor : ILogActor -// { -// public string getActorGuid() => "broker"; -// } -// -// public class BrokerApiWithLogActor : EntityBase, IWithLogActor -// { -// public readonly EntityType m_entity_type = EntityType.Money; -// -// public BrokerApiWithLogActor() : base(EntityType.Money) -// { -// } -// -// //public BrokerApiWithLogActor(string masterGuid) : base(EntityType.Money, masterGuid) -// //{ -// //} -// -// public ILogActor toLogActor() -// { -// return new BrokerApiLogActor(); -// } -// } -// -// public class DbqChangeSapphire : QueryExecutorBase -// { -// private readonly double m_delta; -// private PrimaryKey? m_primary_key; -// private readonly string m_user_guid; -// -// public DbqChangeSapphire(string userGuid, double delta) : base(nameof(DbqChangeSapphire)) -// { -// m_delta = delta; -// m_user_guid = userGuid; -// } -// -// public override async Task onPrepareQuery() -// { -// (var result, m_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey(m_user_guid); -// return result; -// } -// -// public override async Task onQuery() -// { -// var owner = getOwner(); -// -// // 부모 인스턴스의 정보를 사용하여 필요한 데이터를 가져온다. (여기서는 ...) -// var query_batch = getQueryBatch() as QueryBatch; -// NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}"); -// -// var query_runner_with_item_request = query_batch.getQueryRunner(); -// NullReferenceCheckHelper.throwIfNull(query_runner_with_item_request, -// () => $"query_runner_with_item_request is null !!! - {owner.toBasicString()}"); -// -// var db_connector = query_batch.getDynamoDbConnector(); -// var (result, update_request) = makeUpdateItemRequest(); -// if (result.isFail()) -// { -// return result; -// } -// -// NullReferenceCheckHelper.throwIfNull(update_request, -// () => $"update_request is null !!! - {owner.toBasicString()}"); -// -// var exception_handler = new DynamoDbQueryExceptionNotifier.ExceptionHandler( -// DynamoDbQueryExceptionNotifier.ConditionalCheckFailed, ServerErrorCode.LackOfTotalCalium); -// -// var query_context = update_request.createItemRequestQueryContext(QueryType.Update, exception_handler); -// return await query_runner_with_item_request.tryRegisterQueryContext(query_context); -// } -// -// //===================================================================================== -// // DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다. -// //===================================================================================== -// public override Task onQueryResponseCommit() -// { -// return Task.CompletedTask; -// } -// -// //===================================================================================== -// // DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다. -// //===================================================================================== -// public override Task onQueryResponseRollback(Result errorResult) -// { -// return Task.CompletedTask; -// } -// -// private (Result, UpdateItemRequest?) makeUpdateItemRequest() -// { -// Guard.Against.isNull(m_primary_key, (BrokerApiErrorCode)ServerErrorCode.DynamoDbPrimaryKeyNotFound, "primary key is null"); -// var attribute_value_with_primary_key = m_primary_key.toKeyWithAttributeValue(); -// -// var currency_name = MoneyAttribExtensions.getKeyNameFromType(CurrencyType.Sapphire); -// var result = new Result(); -// var dynamo_db_client = getQueryBatch()?.getDynamoDbConnector(); -// NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!!"); -// -// var query_builder = new DynamoDbItemRequestHelper.UpdateItemRequestBuilder(dynamo_db_client.getTableName()); -// query_builder.withKeys(attribute_value_with_primary_key); -// -// var target_doc = new MoneyDoc(); -// var attrib_path_json_string = target_doc.toJsonStringOfAttribs(); -// var target_key = JsonHelper.getJsonPropertyName(currency_name); -// var (is_success, attribute_expression) = -// DynamoDbClientHelper.toAttributeExpressionFromJson(attrib_path_json_string, target_key); -// if (false == is_success) -// { -// var err_msg = -// $"Failed to DynamoDbClientHelper.toAttributeExpressionFromJson() !!! : attribPath:{attrib_path_json_string}, targetKey:{target_key}"; -// result.setFail(ServerErrorCode.AttribPathMakeFailed, err_msg); -// Log.getLogger().error(result.toBasicString()); -// -// return (result, null); -// } -// -// query_builder.withExpressionAttributeNames( -// DynamoDbClientHelper.toExpressionAttributeNamesFromJson(attrib_path_json_string, target_key)); -// -// var update_expression = (m_delta >= 0) -// ? $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) + :changeValue" -// : $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) - :changeValue"; -// query_builder.withUpdateExpression(update_expression); -// -// var expression_attribute_values = new Dictionary -// { -// { ":changeValue", new AttributeValue { N = Math.Abs(m_delta).ToString() } }, -// { ":start", new AttributeValue { N = "0" } } -// }; -// query_builder.withExpressionAttributeValues(expression_attribute_values); -// query_builder.withReturnValues(ReturnValue.ALL_NEW); -// return query_builder.build(); -// } -// } -// -// public class MoneyDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public MoneyDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, MoneyDoc?)> findMoneyDoc(string userGuid) -// { -// var (result, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result.isFail() || primary_key_object == null) -// { -// return (result, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// return await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// } -// -// public async Task<(Result, MoneyAttrib?)> findMoneyAttrib(string userGuid, CancellationToken cancellationToken) -// { -// var (result, doc) = await findMoneyDoc(userGuid); -// return (result, doc?.getAttrib()); -// } -// -// public async Task<(Result, MoneyAttrib?)> changeSapphire(string userGuid, double delta) -// { -// var (result, make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// // 프라이머리 키 생성 실패 -// if (result.isFail() || make_primary_key == null) -// { -// return (result, null); -// } -// -// (result, var request) = makeUpdateItemRequest( -// make_primary_key.toKeyWithAttributeValue(), -// MoneyAttribExtensions.getKeyNameFromType(CurrencyType.Sapphire), -// delta); -// // 업데이트 쿼리 생성 실패 -// if (result.isFail() || request == null) -// { -// return (result, null); -// } -// -// (result, var update_doc) = await m_dynamo_db_client.simpleQueryDocTypesWithUpdateItemRequest(request); -// // 업데이트 쿼리 실패 -// if (result.isFail() || update_doc == null) return (result, null); -// -// var attrib = update_doc.getAttrib(); -// // 업데이트 된 문서에서 MoneyAttrib을 찾을 수 없음 -// if (attrib == null) -// { -// result.setFail(ServerErrorCode.AttribNotFound, $"attrib is null !!!"); -// return (result, null); -// } -// return (result, attrib); -// } -// -// private async Task sendQuery(QueryBatchBase batch) -// { -// var result = new Result(); -// var err_msg = string.Empty; -// -// if (batch == null) -// { -// err_msg = $"Failed to sendQuery !!!, QueryBatchBase is null"; -// result.setFail(ServerErrorCode.FunctionInvalidParam, err_msg); -// return result; -// } -// -// if (false == batch.hasQuery()) -// { -// err_msg = $"Not has DBQuery !!!"; -// result.setFail(ServerErrorCode.DynamoDbQueryNoRequested, err_msg); -// return result; -// } -// -// result = await batch.prepareQueryWithStopwatch(); -// if (result.isFail()) -// { -// return result; -// } -// -// result = await batch.doQueryWithStopwatch(); -// if (result.isFail()) -// { -// return result; -// } -// -// return result; -// } -// -// private (Result, UpdateItemRequest?) makeUpdateItemRequest( -// Dictionary attributeValueWithPrimaryKey -// , string targetAttribName -// , double deltaCount) -// { -// var result = new Result(); -// var query_builder = new DynamoDbItemRequestHelper.UpdateItemRequestBuilder(m_dynamo_db_client.getTableName()); -// query_builder.withKeys(attributeValueWithPrimaryKey); -// -// var target_doc = new MoneyDoc(); -// var attrib_path_json_string = target_doc.toJsonStringOfAttribs(); -// var target_key = JsonHelper.getJsonPropertyName(targetAttribName); -// var (is_success, attribute_expression) = -// DynamoDbClientHelper.toAttributeExpressionFromJson(attrib_path_json_string, target_key); -// if (false == is_success) -// { -// var err_msg = -// $"Failed to DynamoDbClientHelper.toAttributeExpressionFromJson() !!! : attribPath:{attrib_path_json_string}, targetKey:{target_key}"; -// result.setFail(ServerErrorCode.AttribPathMakeFailed, err_msg); -// Log.getLogger().error(result.toBasicString()); -// return (result, null); -// } -// -// query_builder.withExpressionAttributeNames( -// DynamoDbClientHelper.toExpressionAttributeNamesFromJson(attrib_path_json_string, target_key)); -// -// var update_expression = (deltaCount >= 0) -// ? $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) + :changeValue" -// : $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) - :changeValue"; -// query_builder.withUpdateExpression(update_expression); -// -// var expression_attribute_values = new Dictionary -// { -// { ":changeValue", new AttributeValue { N = Math.Abs(deltaCount).ToString() } }, -// { ":start", new AttributeValue { N = "0" } } -// }; -// query_builder.withExpressionAttributeValues(expression_attribute_values); -// query_builder.withReturnValues(ReturnValue.ALL_NEW); -// return query_builder.build(); -// } -// -// // //============================================================================================= -// // // delta 만큼 금전을 변경(음수, 양수) 한다. -// // //============================================================================================= -// // public async Task changeMoney(CurrencyType currencyType, double delta, bool isTrimExcess = false, -// // bool useCaliumEvent = true) -// // { -// // var result = new Result(); -// // -// // // var owner = getOwner() as Player; -// // // NullReferenceCheckHelper.throwIfNull(owner, () => $"player is null !!!"); -// // -// // // if (currencyType == CurrencyType.Beam) -// // // { -// // // var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents); -// // // found_transaction_runner?.addRemoteChargeAIPoint(this, delta); -// // // return result; -// // // } -// // -// // result = changeMoneyFromCurrencyType(currencyType, delta, isTrimExcess); -// // if (result.isSuccess() && useCaliumEvent) -// // { -// // var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents); -// // var event_name = found_transaction_runner?.getTransactionName() ?? "None"; -// // found_transaction_runner?.addNotifyCaliumEvent(this, event_name, currencyType, delta); -// // } -// // -// // return await Task.FromResult(result); -// // } -// // -// // private Result changeMoneyFromCurrencyType(CurrencyType type, double delta, bool isTrimExcess = false) -// // { -// // var result = new Result(); -// // var err_msg = string.Empty; -// // -// // // var owner = getOwner() as Player; -// // // NullReferenceCheckHelper.throwIfNull(owner, () => $"player is null !!!"); -// // -// // if (MetaData.Instance._CurrencyMetaTableByCurrencyType.TryGetValue(type, out var currencyMetaData) == false) -// // { -// // // err_msg = $"Not found CurrencyMetaData !!! : currencyType:{type} - {owner.toBasicString()}"; -// // result.setFail(ServerErrorCode.CurrencyMetaDataNotFound, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return result; -// // } -// // -// // // var money_attribute = owner.getEntityAttribute(); -// // // NullReferenceCheckHelper.throwIfNull(money_attribute, -// // // () => $"money_attribute is null !!! - {owner.toBasicString()}"); -// // -// // var currency = money_attribute.getCurrencyFromType(type); -// // var change = currency + delta; -// // if (change < 0) -// // { -// // err_msg = -// // $"Failed to change getCurrencyFromType() !!!, not enough Money : deltaMoney:{delta}, changeCurrency:{change}, currencyType:{type} - {owner.toBasicString()}"; -// // result.setFail(ServerErrorCode.MoneyNotEnough, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return result; -// // } -// // -// // if (change >= currencyMetaData.MaxCount) -// // { -// // MoneyNotifyHelper.send_GS2C_NTF_CURRENCY_MAX_ALERT(owner, type, currencyMetaData.MaxCount); -// // -// // if (change > currencyMetaData.MaxCount -// // && false == isTrimExcess) -// // { -// // err_msg = -// // $"Money exceeded Max Count !!! : toDelta:{delta}, toChange:{change} <= MaxCount:{currencyMetaData.MaxCount}, currencyType:{type} - {owner.toBasicString()}"; -// // result.setFail(ServerErrorCode.MoneyMaxCountExceeded, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return result; -// // } -// // -// // var trim_money = change - currencyMetaData.MaxCount; -// // change = double.Min(change, currencyMetaData.MaxCount); -// // -// // err_msg = -// // $"Exceeded MaxCount of Money !!!, Trimming Money : currencyType:{type}, changeMoney:{change}, trimMoney:{trim_money}, deltaMoney:{delta}, maxMoney:{currencyMetaData.MaxCount} - {owner.toBasicString()}"; -// // Log.getLogger().info(err_msg); -// // } -// // -// // money_attribute.setCurrencyFromType(type, change); -// // -// // money_attribute.modifiedEntityAttribute(); -// // -// // return result; -// // } -// // -// // -// // public TransactionRunner? findTransactionRunner(TransactionIdType transactionIdType) -// // { -// // TransactionRunner? found_transaction_runner = null; -// // -// // var err_msg = string.Empty; -// // -// // if (true == hasMasterGuid()) -// // { -// // var master_guid = getMasterGuid(); -// // var found_master_entity = onGetMasterEntity(); -// // if(null == found_master_entity) -// // { -// // return null; -// // } -// // -// // found_transaction_runner = found_master_entity.findTransactionRunner(transactionIdType); -// // } -// // else -// // { -// // if (false == m_transaction_runners.TryGetValue(transactionIdType, out found_transaction_runner)) -// // { -// // return null; -// // } -// // } -// // -// // return found_transaction_runner; -// // } -// -// // private (Result, UpdateItemRequest?) makeUpdateItemRequest( -// // Dictionary attributeValueWithPrimaryKey -// // , string targetAttribName -// // , double deltaCount) -// // { -// // var result = new Result(); -// // -// // var query_builder = new DynamoDbItemRequestHelper.UpdateItemRequestBuilder(m_dynamo_db_client.getTableName()); -// // query_builder.withKeys(attributeValueWithPrimaryKey); -// // -// // var target_doc = new MoneyDoc(); -// // var attrib_path_json_string = target_doc.toJsonStringOfAttribs(); -// // var target_key = JsonHelper.getJsonPropertyName(targetAttribName); -// // (var is_success, var attribute_expression) = -// // DynamoDbClientHelper.toAttributeExpressionFromJson(attrib_path_json_string, target_key); -// // if (false == is_success) -// // { -// // var err_msg = -// // $"Failed to DynamoDbClientHelper.toAttributeExpressionFromJson() !!! : attribPath:{attrib_path_json_string}, targetKey:{target_key}"; -// // result.setFail(ServerErrorCode.AttribPathMakeFailed, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return (result, null); -// // } -// // -// // query_builder.withExpressionAttributeNames( -// // DynamoDbClientHelper.toExpressionAttributeNamesFromJson(attrib_path_json_string, target_key)); -// // -// // var update_expression = (deltaCount >= 0) -// // ? $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) + :changeValue" -// // : $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) - :changeValue"; -// // query_builder.withUpdateExpression(update_expression); -// // -// // var expression_attribute_values = new Dictionary -// // { -// // { ":changeValue", new AttributeValue { N = Math.Abs(deltaCount).ToString() } }, -// // { ":start", new AttributeValue { N = "0" } } -// // }; -// // query_builder.withExpressionAttributeValues(expression_attribute_values); -// // -// // query_builder.withReturnValues(ReturnValue.ALL_NEW); -// // -// // return query_builder.build(); -// // } -// } diff --git a/BrokerApiTest/Helper/DocRepo/PlanetInfoCache.cs b/BrokerApiTest/Helper/DocRepo/PlanetInfoCache.cs deleted file mode 100644 index efaaba9..0000000 --- a/BrokerApiTest/Helper/DocRepo/PlanetInfoCache.cs +++ /dev/null @@ -1,71 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using DbEntity; -// -// using Microsoft.Extensions.DependencyInjection; -// using Microsoft.Extensions.Hosting; -// -// using ServerCommon; -// -// using ServerCore; using ServerBase; -// -// //================================================== -// // 행성 정보 캐시를 갱신한다. -// //================================================== -// public class PlanetInfoCache : BackgroundService -// { -// private readonly object m_lock = new(); -// private IEnumerable m_planets = []; -// private readonly IServiceScopeFactory m_scope_factory; -// -// public PlanetInfoCache(IServiceScopeFactory scopeFactory, IHostApplicationLifetime lifetime) -// { -// m_scope_factory = scopeFactory; -// } -// -// public IEnumerable Planets -// { -// get -// { -// lock (m_planets) -// { -// return m_planets; -// } -// } -// } -// -// protected override async Task ExecuteAsync(CancellationToken stoppingToken) -// { -// while (!stoppingToken.IsCancellationRequested) -// { -// try -// { -// await updateData(); -// } -// catch (Exception e) -// { -// Console.WriteLine(e); -// throw; -// } -// -// await Task.Delay(TimeSpan.FromSeconds(120), stoppingToken); // 120초마다 데이터 갱신 -// } -// } -// -// private async Task updateData() -// { -// using var scope = m_scope_factory.CreateScope(); -// var planet_info_repo = scope.ServiceProvider.GetRequiredService(); -// var (result, planet_infos) = await planet_info_repo.findAll(); -// if (result.isFail() || planet_infos == null) -// { -// Log.getLogger().error("Failed to find planet infos"); -// return; -// } -// -// lock (m_lock) -// { -// m_planets = planet_infos; -// } -// } -// } diff --git a/BrokerApiTest/Helper/DocRepo/UserBaseDocRepo.cs b/BrokerApiTest/Helper/DocRepo/UserBaseDocRepo.cs deleted file mode 100644 index a1b2236..0000000 --- a/BrokerApiTest/Helper/DocRepo/UserBaseDocRepo.cs +++ /dev/null @@ -1,67 +0,0 @@ -// using ServerCommon; -// -// namespace BrokerCore.Repository; -// -// using ServerCore; using ServerBase; -// -// public class UserBaseDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public UserBaseDocRepo(DynamoDbClient dynamoDbClient) -// { -// this.m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, UserBaseDoc?)> findUserBaseDoc(string userGuid) -// { -// var (result, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result.isFail() || primary_key_object == null) -// { -// return (result, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// // var (result, user_doc) = await m_dynamoDbClient.simpleQueryDocTypeWithQueryOperationConfig(config); -// return await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// } -// -// public async Task<(Result, UserBaseAttrib?)> findUserBaseAttrib(string userGuid) -// { -// var (result, doc) = await findUserBaseDoc(userGuid); -// return (result, doc?.getAttrib()); -// } -// -// public async Task<(Result, string)> findNickname(string userGuid) -// { -// var (result, found_nickname_attrib) = await NicknameDoc.findNicknameFromGuid(m_dynamo_db_client, userGuid); -// if(result.isFail()) -// { -// return (result, string.Empty); -// } -// NullReferenceCheckHelper.throwIfNull(found_nickname_attrib, () => $"found_nickname_attrib is null !!!, userGuid:{userGuid}"); -// return (result, found_nickname_attrib.Nickname); -// } -// -// //=================================================================================================== -// // 로그아웃 여부만 체크 -// // TODO: 레디스 캐시를 이용하여 로그인 여부를 체크하는 것이 더 효율적일 수 있음 -// //=================================================================================================== -// public bool isUserLoggedIn(UserBaseAttrib userAttrib) -// { -// return userAttrib.GameLoginDateTime > userAttrib.GameLogoutDateTime; -// } -// -// // public async Task insertUserBaseDoc(UserBaseAttrib userAttrib) -// // { -// // var user_doc = new UserBaseDoc(userAttrib.UserGuid); -// // var user_attrib = user_doc.getAttrib(); -// // NullReferenceCheckHelper.throwIfNull(user_attrib, () => $"insertUserBaseDoc : user_attrib is null !!! - {userAttrib.UserGuid}"); -// // user_attrib.UserGuid = userAttrib.UserGuid; -// // user_attrib.AccountId = userAttrib.AccountId; -// // user_attrib.EOA = userAttrib.EOA; -// // user_attrib.SelectedCharacterGuid = userAttrib.SelectedCharacterGuid; -// // user_attrib.IsIntroCompleted = userAttrib.IsIntroCompleted; -// // return await m_dynamoDbClient.simpleInsertDocumentWithDocType(user_doc); -// // } -// } diff --git a/BrokerApiTest/Helper/MetaTableTestHelper.cs b/BrokerApiTest/Helper/MetaTableTestHelper.cs index 93cbf3f..2afa688 100644 --- a/BrokerApiTest/Helper/MetaTableTestHelper.cs +++ b/BrokerApiTest/Helper/MetaTableTestHelper.cs @@ -1,5 +1,6 @@ -namespace BrokerTest.Helper; +using BrokerApiCore; +namespace BrokerTest; public class MetaTableTestHelper { readonly BrokerApiMetaLoader m_meta_loader = new(); diff --git a/BrokerApiTest/Helper/TestUserHelper.cs b/BrokerApiTest/Helper/TestUserHelper.cs index cb7ab38..7c3f528 100644 --- a/BrokerApiTest/Helper/TestUserHelper.cs +++ b/BrokerApiTest/Helper/TestUserHelper.cs @@ -1,16 +1,12 @@ -using BrokerApiServer.Extensions; +using BrokerApiCore; -using BrokerCore; -using BrokerCore.Entity; -using BrokerCore.Repository; -using BrokerCore.Services; +using BrokerApiServer; +using ServerCore; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; - -namespace BrokerTest.Helper; - +namespace BrokerTest; public class TestUserHelper { readonly BrokerServerLogic m_server_logic; diff --git a/BrokerApiTest/Helper/ValueResult.cs b/BrokerApiTest/Helper/ValueResult.cs deleted file mode 100644 index bb5b44a..0000000 --- a/BrokerApiTest/Helper/ValueResult.cs +++ /dev/null @@ -1,18 +0,0 @@ -// namespace BrokerCore.Common; -// -// public class ValueResult -// { -// public Result Result { get; init; } -// public TValue? Value { get; set; } -// -// public ValueResult() -// { -// Result = new Result(); -// } -// -// public ValueResult(Result result, TValue? value) -// { -// Result = result; -// Value = value; -// } -// } diff --git a/BrokerApiTest/Jwt/JwtBasicTests.cs b/BrokerApiTest/Jwt/JwtBasicTests.cs index 1a3fc18..440dd6c 100644 --- a/BrokerApiTest/Jwt/JwtBasicTests.cs +++ b/BrokerApiTest/Jwt/JwtBasicTests.cs @@ -1,17 +1,17 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using BrokerApiCore; + +using Xunit.Abstractions; + +using BrokerApiServer; + +namespace BrokerTest.Jwt; //============================================================================================= // Jwt 토큰 생성 및 파싱 기본 라이브러리 사용 테스트 //============================================================================================= -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using Xunit.Abstractions; - -using BrokerCore.Common; -using BrokerCore.Services; - -namespace BrokerTest.Jwt; - public class JwtBasicTests { private readonly ITestOutputHelper m_test_output_helper; diff --git a/BrokerApiTest/Jwt/SSOTests.cs b/BrokerApiTest/Jwt/SSOTests.cs deleted file mode 100644 index 2892ea7..0000000 --- a/BrokerApiTest/Jwt/SSOTests.cs +++ /dev/null @@ -1,48 +0,0 @@ -// using ServerCommon; -// using ServerCore; using ServerBase; -// using Services; -// -// namespace BrokerTest.Jwt; -// public class SsoTests -// { -// private readonly ServerConfig m_server_config; -// private readonly string m_web_portal_token_secret; -// private readonly string m_account_db; -// -// public SsoTests() -// { -// Log.NLogFileName = "./TestConfig/nlog-BrokerApiServer.config"; -// Log.initLog("BrokerApiServerTest", "Developer"); -// var path = "./TestConfig/ServerConfig-Local.json"; -// var full_path = Path.GetFullPath(path); -// m_server_config = new ServerConfig(); -// m_server_config.setConfigFilePath(full_path); -// m_server_config.loadConfig(); -// m_account_db = m_server_config.AccountNftDb; -// m_web_portal_token_secret = m_server_config.SsoAccountAuthJwtSecretKey; -// } -// -// private async Task findTestAccount() -// { -// var sso_account_auth = new WebPortalTokenAuthService(m_account_db, m_web_portal_token_secret); -// var result = await sso_account_auth.mysqlAuthWithEmail("tenafter71@gmail.com", 1); -// Assert.True(result.isSuccess()); -// // m_account_id = result.getAccountId(); -// } -// -// [Fact] -// public async Task ssoFailTest() -// { -// var sso_account_auth = new WebPortalTokenAuthService(m_account_db, m_web_portal_token_secret); -// var result = await sso_account_auth.mysqlAuthWithEmail("test", 1); -// Assert.True(result.isFail()); -// } -// -// [Fact] -// public async Task ssoSuccessTest() -// { -// var sso_account_auth = new WebPortalTokenAuthService(m_account_db, m_web_portal_token_secret); -// var result = await sso_account_auth.mysqlAuthWithEmail("test@test.com", 1); -// Assert.True(result.isSuccess()); -// } -// } diff --git a/BrokerApiTest/Services/ExchangeServiceTests.cs b/BrokerApiTest/Services/ExchangeServiceTests.cs deleted file mode 100644 index 603d691..0000000 --- a/BrokerApiTest/Services/ExchangeServiceTests.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace BrokerTest.Services; - -public class ExchangeServiceTests -{ - -} diff --git a/BrokerApiTest/Services/UserAuthServiceTests.cs b/BrokerApiTest/Services/UserAuthServiceTests.cs deleted file mode 100644 index 5f28270..0000000 --- a/BrokerApiTest/Services/UserAuthServiceTests.cs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/BrokerApiTest/TestHelper/DocRepo/AccountDocRepo.cs b/BrokerApiTest/TestHelper/DocRepo/AccountDocRepo.cs deleted file mode 100644 index ab7fc2f..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/AccountDocRepo.cs +++ /dev/null @@ -1,19 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using ServerCommon; -// -// public class AccountDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public AccountDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, AccountBaseAttrib?)> findAccountBaseAttrib(string accountId) -// { -// var (result, doc) = await AccountBaseDoc.findUserGuidFromAccountId(m_dynamo_db_client, accountId); -// return (result, doc?.getAttrib()); -// } -// } diff --git a/BrokerApiTest/TestHelper/DocRepo/CaliumEventDocRepo.cs b/BrokerApiTest/TestHelper/DocRepo/CaliumEventDocRepo.cs deleted file mode 100644 index 09c1739..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/CaliumEventDocRepo.cs +++ /dev/null @@ -1,53 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using ServerCommon; -// using ServerCommon.EchoSystem.Models; -// -// using ServerCore; using ServerBase; -// -// public class CaliumEventDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public CaliumEventDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// // public async Task<(Result, CaliumEventAttrib?)> createOne(string userGuid) -// // { -// // var (result_pk, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// // if (result_pk.isFail() || primary_key_object == null) -// // { -// // return (result_pk, null); -// // } -// // -// // var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// // var (result, doc) = -// // await m_dynamo_db_client.simpleInsertDocument(config); -// // var attrib = doc?.getAttrib(); -// // return (result, attrib); -// // } -// public async Task createOne(string userGuid, CaliumEventRequest request, bool isRetry) -// { -// var doc = new CaliumEventDoc(request.m_event_id); -// var attrib = doc.getAttrib(); -// NullReferenceCheckHelper.throwIfNull(attrib, () => $"calium event attrib is null !!! - userGuid[{userGuid}]"); -// -// attrib.UserGuid = userGuid; -// attrib.EventData.m_server_type = request.m_server_type; -// attrib.EventData.m_event_type = request.m_event_type; -// attrib.EventData.m_sub_type = request.m_sub_type; -// attrib.EventData.m_div_type = request.m_div_type; -// attrib.EventData.m_div_id = request.m_div_id; -// attrib.EventData.m_calium_delta = request.m_calium_delta; -// attrib.EventData.m_sapphire_delta = request.m_sapphire_delta; -// attrib.EventData.m_current_epoch = request.m_current_epoch; -// attrib.EventData.m_current_inflation_rate = request.m_current_inflation_rate; -// attrib.Status = isRetry ? CaliumEventStatus.Regist : CaliumEventStatus.Failed; -// -// await m_dynamo_db_client.simpleInsertDocumentWithDocType(doc); -// return request.m_event_id; -// } -// -// } diff --git a/BrokerApiTest/TestHelper/DocRepo/CaliumStorageDocRepo.cs b/BrokerApiTest/TestHelper/DocRepo/CaliumStorageDocRepo.cs deleted file mode 100644 index 5cf6446..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/CaliumStorageDocRepo.cs +++ /dev/null @@ -1,28 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using ServerCommon; -// -// public class CaliumStorageDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public CaliumStorageDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, CaliumStorageAttrib?)> findOne(string userGuid) -// { -// var (result_pk, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result_pk.isFail() || primary_key_object == null) -// { -// return (result_pk, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// var (result, doc) = -// await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// var attrib = doc?.getAttrib(); -// return (result, attrib); -// } -// } diff --git a/BrokerApiTest/TestHelper/DocRepo/CaliumStorageRepo.cs b/BrokerApiTest/TestHelper/DocRepo/CaliumStorageRepo.cs deleted file mode 100644 index 0804d4b..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/CaliumStorageRepo.cs +++ /dev/null @@ -1,30 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using Common; -// -// using ServerCommon; -// -// public class CaliumStorageRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public CaliumStorageRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, CaliumStorageAttrib?)> findOne(string userGuid) -// { -// var (result_pk, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result_pk.isFail() || primary_key_object == null) -// { -// return (result_pk, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// var (result, doc) = -// await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// var attrib = doc?.getAttrib(); -// return (result, attrib); -// } -// } diff --git a/BrokerApiTest/TestHelper/DocRepo/MoneyDocRepo.cs b/BrokerApiTest/TestHelper/DocRepo/MoneyDocRepo.cs deleted file mode 100644 index caddd1a..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/MoneyDocRepo.cs +++ /dev/null @@ -1,445 +0,0 @@ -// using Amazon.DynamoDBv2; -// using Amazon.DynamoDBv2.Model; -// -// using ServerCommon; -// -// using ServerCore; using ServerBase; -// -// namespace BrokerCore.Repository; -// -// using BrokerApiServer.Common; -// -// public class BrokerApiLogActor : ILogActor -// { -// public string getActorGuid() => "broker"; -// } -// -// public class BrokerApiWithLogActor : EntityBase, IWithLogActor -// { -// public readonly EntityType m_entity_type = EntityType.Money; -// -// public BrokerApiWithLogActor() : base(EntityType.Money) -// { -// } -// -// //public BrokerApiWithLogActor(string masterGuid) : base(EntityType.Money, masterGuid) -// //{ -// //} -// -// public ILogActor toLogActor() -// { -// return new BrokerApiLogActor(); -// } -// } -// -// public class DbqChangeSapphire : QueryExecutorBase -// { -// private readonly double m_delta; -// private PrimaryKey? m_primary_key; -// private readonly string m_user_guid; -// -// public DbqChangeSapphire(string userGuid, double delta) : base(nameof(DbqChangeSapphire)) -// { -// m_delta = delta; -// m_user_guid = userGuid; -// } -// -// public override async Task onPrepareQuery() -// { -// (var result, m_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey(m_user_guid); -// return result; -// } -// -// public override async Task onQuery() -// { -// var owner = getOwner(); -// -// // 부모 인스턴스의 정보를 사용하여 필요한 데이터를 가져온다. (여기서는 ...) -// var query_batch = getQueryBatch() as QueryBatch; -// NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}"); -// -// var query_runner_with_item_request = query_batch.getQueryRunner(); -// NullReferenceCheckHelper.throwIfNull(query_runner_with_item_request, -// () => $"query_runner_with_item_request is null !!! - {owner.toBasicString()}"); -// -// var db_connector = query_batch.getDynamoDbConnector(); -// var (result, update_request) = makeUpdateItemRequest(); -// if (result.isFail()) -// { -// return result; -// } -// -// NullReferenceCheckHelper.throwIfNull(update_request, -// () => $"update_request is null !!! - {owner.toBasicString()}"); -// -// var exception_handler = new DynamoDbQueryExceptionNotifier.ExceptionHandler( -// DynamoDbQueryExceptionNotifier.ConditionalCheckFailed, ServerErrorCode.LackOfTotalCalium); -// -// var query_context = update_request.createItemRequestQueryContext(QueryType.Update, exception_handler); -// return await query_runner_with_item_request.tryRegisterQueryContext(query_context); -// } -// -// //===================================================================================== -// // DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다. -// //===================================================================================== -// public override Task onQueryResponseCommit() -// { -// return Task.CompletedTask; -// } -// -// //===================================================================================== -// // DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다. -// //===================================================================================== -// public override Task onQueryResponseRollback(Result errorResult) -// { -// return Task.CompletedTask; -// } -// -// private (Result, UpdateItemRequest?) makeUpdateItemRequest() -// { -// Guard.Against.isNull(m_primary_key, (BrokerApiErrorCode)ServerErrorCode.DynamoDbPrimaryKeyNotFound, "primary key is null"); -// var attribute_value_with_primary_key = m_primary_key.toKeyWithAttributeValue(); -// -// var currency_name = MoneyAttribExtensions.getKeyNameFromType(CurrencyType.Sapphire); -// var result = new Result(); -// var dynamo_db_client = getQueryBatch()?.getDynamoDbConnector(); -// NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!!"); -// -// var query_builder = new DynamoDbItemRequestHelper.UpdateItemRequestBuilder(dynamo_db_client.getTableName()); -// query_builder.withKeys(attribute_value_with_primary_key); -// -// var target_doc = new MoneyDoc(); -// var attrib_path_json_string = target_doc.toJsonStringOfAttribs(); -// var target_key = JsonHelper.getJsonPropertyName(currency_name); -// var (is_success, attribute_expression) = -// DynamoDbClientHelper.toAttributeExpressionFromJson(attrib_path_json_string, target_key); -// if (false == is_success) -// { -// var err_msg = -// $"Failed to DynamoDbClientHelper.toAttributeExpressionFromJson() !!! : attribPath:{attrib_path_json_string}, targetKey:{target_key}"; -// result.setFail(ServerErrorCode.AttribPathMakeFailed, err_msg); -// Log.getLogger().error(result.toBasicString()); -// -// return (result, null); -// } -// -// query_builder.withExpressionAttributeNames( -// DynamoDbClientHelper.toExpressionAttributeNamesFromJson(attrib_path_json_string, target_key)); -// -// var update_expression = (m_delta >= 0) -// ? $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) + :changeValue" -// : $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) - :changeValue"; -// query_builder.withUpdateExpression(update_expression); -// -// var expression_attribute_values = new Dictionary -// { -// { ":changeValue", new AttributeValue { N = Math.Abs(m_delta).ToString() } }, -// { ":start", new AttributeValue { N = "0" } } -// }; -// query_builder.withExpressionAttributeValues(expression_attribute_values); -// query_builder.withReturnValues(ReturnValue.ALL_NEW); -// return query_builder.build(); -// } -// } -// -// public class MoneyDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public MoneyDocRepo(DynamoDbClient dynamoDbClient) -// { -// m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, MoneyDoc?)> findMoneyDoc(string userGuid) -// { -// var (result, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result.isFail() || primary_key_object == null) -// { -// return (result, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// return await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// } -// -// public async Task<(Result, MoneyAttrib?)> findMoneyAttrib(string userGuid, CancellationToken cancellationToken) -// { -// var (result, doc) = await findMoneyDoc(userGuid); -// return (result, doc?.getAttrib()); -// } -// -// public async Task<(Result, MoneyAttrib?)> changeSapphire(string userGuid, double delta) -// { -// var (result, make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// // 프라이머리 키 생성 실패 -// if (result.isFail() || make_primary_key == null) -// { -// return (result, null); -// } -// -// (result, var request) = makeUpdateItemRequest( -// make_primary_key.toKeyWithAttributeValue(), -// MoneyAttribExtensions.getKeyNameFromType(CurrencyType.Sapphire), -// delta); -// // 업데이트 쿼리 생성 실패 -// if (result.isFail() || request == null) -// { -// return (result, null); -// } -// -// (result, var update_doc) = await m_dynamo_db_client.simpleQueryDocTypesWithUpdateItemRequest(request); -// // 업데이트 쿼리 실패 -// if (result.isFail() || update_doc == null) return (result, null); -// -// var attrib = update_doc.getAttrib(); -// // 업데이트 된 문서에서 MoneyAttrib을 찾을 수 없음 -// if (attrib == null) -// { -// result.setFail(ServerErrorCode.AttribNotFound, $"attrib is null !!!"); -// return (result, null); -// } -// return (result, attrib); -// } -// -// private async Task sendQuery(QueryBatchBase batch) -// { -// var result = new Result(); -// var err_msg = string.Empty; -// -// if (batch == null) -// { -// err_msg = $"Failed to sendQuery !!!, QueryBatchBase is null"; -// result.setFail(ServerErrorCode.FunctionInvalidParam, err_msg); -// return result; -// } -// -// if (false == batch.hasQuery()) -// { -// err_msg = $"Not has DBQuery !!!"; -// result.setFail(ServerErrorCode.DynamoDbQueryNoRequested, err_msg); -// return result; -// } -// -// result = await batch.prepareQueryWithStopwatch(); -// if (result.isFail()) -// { -// return result; -// } -// -// result = await batch.doQueryWithStopwatch(); -// if (result.isFail()) -// { -// return result; -// } -// -// return result; -// } -// -// private (Result, UpdateItemRequest?) makeUpdateItemRequest( -// Dictionary attributeValueWithPrimaryKey -// , string targetAttribName -// , double deltaCount) -// { -// var result = new Result(); -// var query_builder = new DynamoDbItemRequestHelper.UpdateItemRequestBuilder(m_dynamo_db_client.getTableName()); -// query_builder.withKeys(attributeValueWithPrimaryKey); -// -// var target_doc = new MoneyDoc(); -// var attrib_path_json_string = target_doc.toJsonStringOfAttribs(); -// var target_key = JsonHelper.getJsonPropertyName(targetAttribName); -// var (is_success, attribute_expression) = -// DynamoDbClientHelper.toAttributeExpressionFromJson(attrib_path_json_string, target_key); -// if (false == is_success) -// { -// var err_msg = -// $"Failed to DynamoDbClientHelper.toAttributeExpressionFromJson() !!! : attribPath:{attrib_path_json_string}, targetKey:{target_key}"; -// result.setFail(ServerErrorCode.AttribPathMakeFailed, err_msg); -// Log.getLogger().error(result.toBasicString()); -// return (result, null); -// } -// -// query_builder.withExpressionAttributeNames( -// DynamoDbClientHelper.toExpressionAttributeNamesFromJson(attrib_path_json_string, target_key)); -// -// var update_expression = (deltaCount >= 0) -// ? $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) + :changeValue" -// : $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) - :changeValue"; -// query_builder.withUpdateExpression(update_expression); -// -// var expression_attribute_values = new Dictionary -// { -// { ":changeValue", new AttributeValue { N = Math.Abs(deltaCount).ToString() } }, -// { ":start", new AttributeValue { N = "0" } } -// }; -// query_builder.withExpressionAttributeValues(expression_attribute_values); -// query_builder.withReturnValues(ReturnValue.ALL_NEW); -// return query_builder.build(); -// } -// -// // //============================================================================================= -// // // delta 만큼 금전을 변경(음수, 양수) 한다. -// // //============================================================================================= -// // public async Task changeMoney(CurrencyType currencyType, double delta, bool isTrimExcess = false, -// // bool useCaliumEvent = true) -// // { -// // var result = new Result(); -// // -// // // var owner = getOwner() as Player; -// // // NullReferenceCheckHelper.throwIfNull(owner, () => $"player is null !!!"); -// // -// // // if (currencyType == CurrencyType.Beam) -// // // { -// // // var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents); -// // // found_transaction_runner?.addRemoteChargeAIPoint(this, delta); -// // // return result; -// // // } -// // -// // result = changeMoneyFromCurrencyType(currencyType, delta, isTrimExcess); -// // if (result.isSuccess() && useCaliumEvent) -// // { -// // var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents); -// // var event_name = found_transaction_runner?.getTransactionName() ?? "None"; -// // found_transaction_runner?.addNotifyCaliumEvent(this, event_name, currencyType, delta); -// // } -// // -// // return await Task.FromResult(result); -// // } -// // -// // private Result changeMoneyFromCurrencyType(CurrencyType type, double delta, bool isTrimExcess = false) -// // { -// // var result = new Result(); -// // var err_msg = string.Empty; -// // -// // // var owner = getOwner() as Player; -// // // NullReferenceCheckHelper.throwIfNull(owner, () => $"player is null !!!"); -// // -// // if (MetaData.Instance._CurrencyMetaTableByCurrencyType.TryGetValue(type, out var currencyMetaData) == false) -// // { -// // // err_msg = $"Not found CurrencyMetaData !!! : currencyType:{type} - {owner.toBasicString()}"; -// // result.setFail(ServerErrorCode.CurrencyMetaDataNotFound, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return result; -// // } -// // -// // // var money_attribute = owner.getEntityAttribute(); -// // // NullReferenceCheckHelper.throwIfNull(money_attribute, -// // // () => $"money_attribute is null !!! - {owner.toBasicString()}"); -// // -// // var currency = money_attribute.getCurrencyFromType(type); -// // var change = currency + delta; -// // if (change < 0) -// // { -// // err_msg = -// // $"Failed to change getCurrencyFromType() !!!, not enough Money : deltaMoney:{delta}, changeCurrency:{change}, currencyType:{type} - {owner.toBasicString()}"; -// // result.setFail(ServerErrorCode.MoneyNotEnough, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return result; -// // } -// // -// // if (change >= currencyMetaData.MaxCount) -// // { -// // MoneyNotifyHelper.send_GS2C_NTF_CURRENCY_MAX_ALERT(owner, type, currencyMetaData.MaxCount); -// // -// // if (change > currencyMetaData.MaxCount -// // && false == isTrimExcess) -// // { -// // err_msg = -// // $"Money exceeded Max Count !!! : toDelta:{delta}, toChange:{change} <= MaxCount:{currencyMetaData.MaxCount}, currencyType:{type} - {owner.toBasicString()}"; -// // result.setFail(ServerErrorCode.MoneyMaxCountExceeded, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return result; -// // } -// // -// // var trim_money = change - currencyMetaData.MaxCount; -// // change = double.Min(change, currencyMetaData.MaxCount); -// // -// // err_msg = -// // $"Exceeded MaxCount of Money !!!, Trimming Money : currencyType:{type}, changeMoney:{change}, trimMoney:{trim_money}, deltaMoney:{delta}, maxMoney:{currencyMetaData.MaxCount} - {owner.toBasicString()}"; -// // Log.getLogger().info(err_msg); -// // } -// // -// // money_attribute.setCurrencyFromType(type, change); -// // -// // money_attribute.modifiedEntityAttribute(); -// // -// // return result; -// // } -// // -// // -// // public TransactionRunner? findTransactionRunner(TransactionIdType transactionIdType) -// // { -// // TransactionRunner? found_transaction_runner = null; -// // -// // var err_msg = string.Empty; -// // -// // if (true == hasMasterGuid()) -// // { -// // var master_guid = getMasterGuid(); -// // var found_master_entity = onGetMasterEntity(); -// // if(null == found_master_entity) -// // { -// // return null; -// // } -// // -// // found_transaction_runner = found_master_entity.findTransactionRunner(transactionIdType); -// // } -// // else -// // { -// // if (false == m_transaction_runners.TryGetValue(transactionIdType, out found_transaction_runner)) -// // { -// // return null; -// // } -// // } -// // -// // return found_transaction_runner; -// // } -// -// // private (Result, UpdateItemRequest?) makeUpdateItemRequest( -// // Dictionary attributeValueWithPrimaryKey -// // , string targetAttribName -// // , double deltaCount) -// // { -// // var result = new Result(); -// // -// // var query_builder = new DynamoDbItemRequestHelper.UpdateItemRequestBuilder(m_dynamo_db_client.getTableName()); -// // query_builder.withKeys(attributeValueWithPrimaryKey); -// // -// // var target_doc = new MoneyDoc(); -// // var attrib_path_json_string = target_doc.toJsonStringOfAttribs(); -// // var target_key = JsonHelper.getJsonPropertyName(targetAttribName); -// // (var is_success, var attribute_expression) = -// // DynamoDbClientHelper.toAttributeExpressionFromJson(attrib_path_json_string, target_key); -// // if (false == is_success) -// // { -// // var err_msg = -// // $"Failed to DynamoDbClientHelper.toAttributeExpressionFromJson() !!! : attribPath:{attrib_path_json_string}, targetKey:{target_key}"; -// // result.setFail(ServerErrorCode.AttribPathMakeFailed, err_msg); -// // Log.getLogger().error(result.toBasicString()); -// // -// // return (result, null); -// // } -// // -// // query_builder.withExpressionAttributeNames( -// // DynamoDbClientHelper.toExpressionAttributeNamesFromJson(attrib_path_json_string, target_key)); -// // -// // var update_expression = (deltaCount >= 0) -// // ? $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) + :changeValue" -// // : $"SET {attribute_expression} = if_not_exists({attribute_expression}, :start) - :changeValue"; -// // query_builder.withUpdateExpression(update_expression); -// // -// // var expression_attribute_values = new Dictionary -// // { -// // { ":changeValue", new AttributeValue { N = Math.Abs(deltaCount).ToString() } }, -// // { ":start", new AttributeValue { N = "0" } } -// // }; -// // query_builder.withExpressionAttributeValues(expression_attribute_values); -// // -// // query_builder.withReturnValues(ReturnValue.ALL_NEW); -// // -// // return query_builder.build(); -// // } -// } diff --git a/BrokerApiTest/TestHelper/DocRepo/PlanetInfoCache.cs b/BrokerApiTest/TestHelper/DocRepo/PlanetInfoCache.cs deleted file mode 100644 index efaaba9..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/PlanetInfoCache.cs +++ /dev/null @@ -1,71 +0,0 @@ -// namespace BrokerCore.Repository; -// -// using DbEntity; -// -// using Microsoft.Extensions.DependencyInjection; -// using Microsoft.Extensions.Hosting; -// -// using ServerCommon; -// -// using ServerCore; using ServerBase; -// -// //================================================== -// // 행성 정보 캐시를 갱신한다. -// //================================================== -// public class PlanetInfoCache : BackgroundService -// { -// private readonly object m_lock = new(); -// private IEnumerable m_planets = []; -// private readonly IServiceScopeFactory m_scope_factory; -// -// public PlanetInfoCache(IServiceScopeFactory scopeFactory, IHostApplicationLifetime lifetime) -// { -// m_scope_factory = scopeFactory; -// } -// -// public IEnumerable Planets -// { -// get -// { -// lock (m_planets) -// { -// return m_planets; -// } -// } -// } -// -// protected override async Task ExecuteAsync(CancellationToken stoppingToken) -// { -// while (!stoppingToken.IsCancellationRequested) -// { -// try -// { -// await updateData(); -// } -// catch (Exception e) -// { -// Console.WriteLine(e); -// throw; -// } -// -// await Task.Delay(TimeSpan.FromSeconds(120), stoppingToken); // 120초마다 데이터 갱신 -// } -// } -// -// private async Task updateData() -// { -// using var scope = m_scope_factory.CreateScope(); -// var planet_info_repo = scope.ServiceProvider.GetRequiredService(); -// var (result, planet_infos) = await planet_info_repo.findAll(); -// if (result.isFail() || planet_infos == null) -// { -// Log.getLogger().error("Failed to find planet infos"); -// return; -// } -// -// lock (m_lock) -// { -// m_planets = planet_infos; -// } -// } -// } diff --git a/BrokerApiTest/TestHelper/DocRepo/UserBaseDocRepo.cs b/BrokerApiTest/TestHelper/DocRepo/UserBaseDocRepo.cs deleted file mode 100644 index a1b2236..0000000 --- a/BrokerApiTest/TestHelper/DocRepo/UserBaseDocRepo.cs +++ /dev/null @@ -1,67 +0,0 @@ -// using ServerCommon; -// -// namespace BrokerCore.Repository; -// -// using ServerCore; using ServerBase; -// -// public class UserBaseDocRepo -// { -// private readonly DynamoDbClient m_dynamo_db_client; -// -// public UserBaseDocRepo(DynamoDbClient dynamoDbClient) -// { -// this.m_dynamo_db_client = dynamoDbClient; -// } -// -// public async Task<(Result, UserBaseDoc?)> findUserBaseDoc(string userGuid) -// { -// var (result, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(userGuid); -// if (result.isFail() || primary_key_object == null) -// { -// return (result, null); -// } -// -// var config = m_dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); -// // var (result, user_doc) = await m_dynamoDbClient.simpleQueryDocTypeWithQueryOperationConfig(config); -// return await m_dynamo_db_client.simpleQueryDocTypeWithQueryOperationConfig(config); -// } -// -// public async Task<(Result, UserBaseAttrib?)> findUserBaseAttrib(string userGuid) -// { -// var (result, doc) = await findUserBaseDoc(userGuid); -// return (result, doc?.getAttrib()); -// } -// -// public async Task<(Result, string)> findNickname(string userGuid) -// { -// var (result, found_nickname_attrib) = await NicknameDoc.findNicknameFromGuid(m_dynamo_db_client, userGuid); -// if(result.isFail()) -// { -// return (result, string.Empty); -// } -// NullReferenceCheckHelper.throwIfNull(found_nickname_attrib, () => $"found_nickname_attrib is null !!!, userGuid:{userGuid}"); -// return (result, found_nickname_attrib.Nickname); -// } -// -// //=================================================================================================== -// // 로그아웃 여부만 체크 -// // TODO: 레디스 캐시를 이용하여 로그인 여부를 체크하는 것이 더 효율적일 수 있음 -// //=================================================================================================== -// public bool isUserLoggedIn(UserBaseAttrib userAttrib) -// { -// return userAttrib.GameLoginDateTime > userAttrib.GameLogoutDateTime; -// } -// -// // public async Task insertUserBaseDoc(UserBaseAttrib userAttrib) -// // { -// // var user_doc = new UserBaseDoc(userAttrib.UserGuid); -// // var user_attrib = user_doc.getAttrib(); -// // NullReferenceCheckHelper.throwIfNull(user_attrib, () => $"insertUserBaseDoc : user_attrib is null !!! - {userAttrib.UserGuid}"); -// // user_attrib.UserGuid = userAttrib.UserGuid; -// // user_attrib.AccountId = userAttrib.AccountId; -// // user_attrib.EOA = userAttrib.EOA; -// // user_attrib.SelectedCharacterGuid = userAttrib.SelectedCharacterGuid; -// // user_attrib.IsIntroCompleted = userAttrib.IsIntroCompleted; -// // return await m_dynamoDbClient.simpleInsertDocumentWithDocType(user_doc); -// // } -// } diff --git a/BrokerApiTest/TestHelper/Helpers.cs b/BrokerApiTest/TestHelper/Helpers.cs deleted file mode 100644 index 8a73e5f..0000000 --- a/BrokerApiTest/TestHelper/Helpers.cs +++ /dev/null @@ -1,93 +0,0 @@ -// -// using System.Globalization; -// using System.Security.Cryptography; -// using System.Text; -// -// namespace BrokerCore.Common; -// public static class Helpers -// { -// public static string generateAccessKey(string inputString, int keyLength = 24) -// { -// var salt = DateTime.Now.ToString(CultureInfo.InvariantCulture); -// using var pbkdf2 = -// new Rfc2898DeriveBytes(inputString, Encoding.UTF8.GetBytes(salt), 10000, HashAlgorithmName.SHA256); -// byte[] key_bytes = pbkdf2.GetBytes(keyLength); // 원하는 길이의 바이트 배열 생성 -// return BitConverter.ToString(key_bytes).Replace("-", "").ToLower()[..keyLength]; // 원하는 길이만큼 잘라서 반환 -// } -// -// public static string generateAccessToken(string inputString, string secret, int keyLength = 32) -// { -// var salt = DateTime.Now.ToString(CultureInfo.InvariantCulture); -// using var pbkdf2 = -// new Rfc2898DeriveBytes(inputString, Encoding.UTF8.GetBytes(salt), 10000, HashAlgorithmName.SHA256); -// byte[] key_bytes = pbkdf2.GetBytes(keyLength); // 원하는 길이의 바이트 배열 생성 -// return BitConverter.ToString(key_bytes).Replace("-", "").ToLower()[..keyLength]; // 원하는 길이만큼 잘라서 반환 -// } -// -// public static string generateAccessKeyTest() -// { -// var key = generateAccessKey("test"); -// return key; -// } -// -// public static string getErrorName(int errorCode) -// { -// try -// { -// var error_name = (BrokerApiErrorCode)errorCode; -// return error_name.ToString(); -// } -// catch (Exception) -// { -// return errorCode.ToString(); -// } -// } -// -// public static string encrypt(string plainText, string planetSecretKey, string tokenSecret) -// { -// var key = Encoding.UTF8.GetBytes(tokenSecret); -// var iv = Encoding.UTF8.GetBytes(planetSecretKey); -// using Aes aes_alg = Aes.Create(); -// aes_alg.Key = key; -// aes_alg.IV = iv; -// -// ICryptoTransform encryptor = aes_alg.CreateEncryptor(aes_alg.Key, aes_alg.IV); -// -// using (MemoryStream ms_encrypt = new MemoryStream()) -// { -// using (CryptoStream cs_encrypt = new CryptoStream(ms_encrypt, encryptor, CryptoStreamMode.Write)) -// { -// using (StreamWriter sw_encrypt = new StreamWriter(cs_encrypt)) -// { -// sw_encrypt.Write(plainText); -// } -// -// return Convert.ToBase64String(ms_encrypt.ToArray()); -// } -// } -// } -// -// public static string decrypt(string cipherText, string planetSecretKey, string tokenSecret) -// { -// var key = Encoding.UTF8.GetBytes(tokenSecret); -// var iv = Encoding.UTF8.GetBytes(planetSecretKey); -// -// byte[] buffer = Convert.FromBase64String(cipherText); -// using Aes aes_alg = Aes.Create(); -// aes_alg.Key = key; -// aes_alg.IV = iv; -// -// ICryptoTransform decryptor = aes_alg.CreateDecryptor(aes_alg.Key, aes_alg.IV); -// -// using (MemoryStream ms_decrypt = new MemoryStream(buffer)) -// { -// using (CryptoStream cs_decrypt = new CryptoStream(ms_decrypt, decryptor, CryptoStreamMode.Read)) -// { -// using (StreamReader sr_decrypt = new StreamReader(cs_decrypt)) -// { -// return sr_decrypt.ReadToEnd(); -// } -// } -// } -// } -// } diff --git a/BrokerApiTest/TestHelper/ValueResult.cs b/BrokerApiTest/TestHelper/ValueResult.cs deleted file mode 100644 index bb5b44a..0000000 --- a/BrokerApiTest/TestHelper/ValueResult.cs +++ /dev/null @@ -1,18 +0,0 @@ -// namespace BrokerCore.Common; -// -// public class ValueResult -// { -// public Result Result { get; init; } -// public TValue? Value { get; set; } -// -// public ValueResult() -// { -// Result = new Result(); -// } -// -// public ValueResult(Result result, TValue? value) -// { -// Result = result; -// Value = value; -// } -// } diff --git a/BrokerApiTest/User/UserDocRepoTests.cs b/BrokerApiTest/User/UserDocRepoTests.cs deleted file mode 100644 index bbe44f8..0000000 --- a/BrokerApiTest/User/UserDocRepoTests.cs +++ /dev/null @@ -1,133 +0,0 @@ -using ServerCore; -using ServerBase; -using ServerCommon; - - -using MODULE_ID = System.UInt32; - - -namespace BrokerTest.User; - -public class TestServerLogic : IServerLogic -{ - private DynamoDbClient m_dynamo_db_client; - private ServerConfig m_server_config; - - public TestServerLogic(DynamoDbClient dynamoDbClient, ServerConfig serverConfig) - { - m_dynamo_db_client = dynamoDbClient; - m_server_config = serverConfig; - } - - public DynamoDbClient getDynamoDbClient() => m_dynamo_db_client; - - public RedisConnector getRedisConnector() - { - throw new NotImplementedException(); - } - - public ServerConfig getServerConfig() => m_server_config; - - public string getServerName() => "TestServer"; - - public string getServerType() => "BrokerApi"; - - public string toBasicString() => "TestServerLogic"; - - public IModule getModule(MODULE_ID moduleId) { throw new NullReferenceException(); } - - public Result registerEntityTicker(EntityTicker entityTicker) { throw new NullReferenceException(); } -} - -// public class UserDocRepoTests -// { -// private readonly ServerConfig m_server_config = new ServerConfig(); -// private DynamoDbClient? m_dynamo_db_client; -// private bool m_is_init = false; -// private TestServerLogic? m_server_logic; -// -// // public UserDocRepoTests() -// // { -// // // var user = new UserEntity(); -// // // user.OnInit(); -// // } -// -// private async Task init() -// { -// if (m_is_init) return; -// Log.NLogFileName = "./Config/nlog-BrokerApiServer.config"; -// Log.initLog("BrokerApiServerTest", "Developer"); -// var path = "./Config/ServerConfig-Local.json"; -// var full_path = Path.GetFullPath(path); -// m_server_config.setConfigFilePath(full_path); -// var result =m_server_config.loadConfig(); -// Assert.True(result.isSuccess()); -// Assert.NotNull(m_dynamo_db_client); -// m_server_logic = new TestServerLogic(m_dynamo_db_client, m_server_config); -// ServerLogicApp.setServerLogicApp(m_server_logic); -// -// m_dynamo_db_client = new DynamoDbClient(); -// var connection_result = m_dynamo_db_client.connectToDb(m_server_config); -// await m_dynamo_db_client.createDBIfNotExists(false); -// Assert.True(connection_result.isSuccess()); -// -// m_is_init = true; -// } -// -// [Fact] -// public async Task findTests() -// { -// await init(); -// -// //============================================================================================= -// // db에 "heon3" 계정이 존재한다는 전제로 테스트 진행 -// //============================================================================================= -// -// // TODO: 계정을 생성하는 절차를 추가할 것 -// -// var account_id = "heon3"; -// Assert.NotNull(m_dynamo_db_client); -// var account_repo = new AccountDocRepo(m_dynamo_db_client); -// var (result_account, account_attrib) = await account_repo.findAccountBaseAttrib(account_id); -// Assert.True(result_account.isSuccess()); -// Assert.NotNull(account_attrib); -// -// var user_guid = account_attrib.UserGuid; -// Assert.NotNull(user_guid); -// -// var user_doc_repo = new UserBaseDocRepo(m_dynamo_db_client); -// var (result_user, user_attrib) = await user_doc_repo.findUserBaseAttrib(user_guid); -// Assert.True(result_user.isSuccess()); -// Assert.NotNull(user_attrib); -// Assert.True(user_attrib.UserGuid == user_guid); -// Assert.True(user_attrib.AccountId == account_id); -// -// // var money_doc_repo = new MoneyDocRepo(m_dynamo_db_client); -// // var (result_money, money_attrib) = await money_doc_repo.findMoneyAttrib(user_guid, CancellationToken.None); -// // Assert.True(result_money.isSuccess()); -// // Assert.NotNull(money_attrib); -// // Assert.True(money_attrib.Sapphire >= 0); -// // Assert.True(money_attrib.Gold >= 0); -// // Assert.True(money_attrib.Ruby >= 0); -// // Assert.True(money_attrib.Calium >= 0); -// } -// -// private async Task findUser(string accountId) -// { -// await init(); -// Assert.NotNull(m_dynamo_db_client); -// var account_repo = new AccountDocRepo(m_dynamo_db_client); -// var (result_account, account_attrib) = await account_repo.findAccountBaseAttrib(accountId); -// Assert.True(result_account.isSuccess()); -// Assert.NotNull(account_attrib); -// -// var user_guid = account_attrib.UserGuid; -// Assert.NotNull(user_guid); -// -// var user_doc_repo = new UserBaseDocRepo(m_dynamo_db_client); -// var (result_user, user_attrib) = await user_doc_repo.findUserBaseAttrib(user_guid); -// Assert.True(result_user.isSuccess()); -// Assert.NotNull(user_attrib); -// return user_attrib.UserGuid; -// } -// } diff --git a/BrokerApiTest/bin/Debug/net8.0/.msCoverageSourceRootsMapping_BrokerApiTest b/BrokerApiTest/bin/Debug/net8.0/.msCoverageSourceRootsMapping_BrokerApiTest index 5925da82b30d3473146d5a913f0ba4c9c29f8a12..fca25bf1688d76b2ecbf19c23e9fdefeaa5a4c95 100644 GIT binary patch delta 176 zcmeB>`lm7B39})C{^UZ=@Xa=i9Gr}XljXTHC$Hfu0kf{cBq#gu?3u)5GkF7t*kl_< zp^0fWP~OCQOQ0-9+sXfd7^I?zGi>rP4kK(56JVy;aV - + + @@ -24,10 +25,12 @@ C:\Users\user\.nuget\packages\xunit.analyzers\1.18.0 C:\Users\user\.nuget\packages\mongodb.analyzer\1.5.0 - C:\Users\user\.nuget\packages\awssdk.core\3.7.402.39 - C:\Users\user\.nuget\packages\awssdk.s3\3.7.416.9 - C:\Users\user\.nuget\packages\awssdk.opensearchservice\3.7.404.75 - C:\Users\user\.nuget\packages\awssdk.dynamodbv2\3.7.406.21 + C:\Users\user\.nuget\packages\entityframework\6.5.1 + C:\Users\user\.nuget\packages\awssdk.core\3.7.402.46 + C:\Users\user\.nuget\packages\awssdk.securitytoken\3.7.401.89 + C:\Users\user\.nuget\packages\awssdk.s3\3.7.416.15 + C:\Users\user\.nuget\packages\awssdk.opensearchservice\3.7.404.81 + C:\Users\user\.nuget\packages\awssdk.dynamodbv2\3.7.407 C:\Users\user\.nuget\packages\awssdk.cloudwatchlogs\3.7.305.15 C:\Users\user\.nuget\packages\awssdk.ec2\3.7.330.4 diff --git a/BrokerApiTest/obj/BrokerApiTest.csproj.nuget.g.targets b/BrokerApiTest/obj/BrokerApiTest.csproj.nuget.g.targets index f7b410a..6483626 100644 --- a/BrokerApiTest/obj/BrokerApiTest.csproj.nuget.g.targets +++ b/BrokerApiTest/obj/BrokerApiTest.csproj.nuget.g.targets @@ -4,8 +4,9 @@ - - + + + diff --git a/BrokerApiTest/obj/Debug/net8.0/BrokerApiTest.assets.cache b/BrokerApiTest/obj/Debug/net8.0/BrokerApiTest.assets.cache index 92e2cedb0296fdd0cd744cf276b6fd09155395d5..4d3a90e252b701adbc10c8287d1ac7ea19fa131b 100644 GIT binary patch literal 133027 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 DnU!3$ literal 111094 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 diff --git a/BrokerApiTest/obj/Debug/net8.0/BrokerApiTest.csproj.AssemblyReference.cache b/BrokerApiTest/obj/Debug/net8.0/BrokerApiTest.csproj.AssemblyReference.cache index b52f46d2bee3d797b558e8d94a7e716fb1430d00..b01eccf7268f8cc7ab1a9a016937dec406a956c3 100644 GIT binary patch delta 9388 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Π;XS)*zkS7ME zTBXJ{M7ima20oIay>~1mj9Mm}TWF43WYvc>J>C+TP0o{Q^# zKGW6>eqJ1)YZ=zQVAJqsK}L>)Q$)t+b?(y-F34A(8a=LSeK87v58dO(uzLm_C-piHC22lEiW@pGU~ze<48R`7o= zz&3>$nBVodfvk3RzR~lz6b8Lat?cc4>bW`vwx_Bs*5??P*Y_B`?QRVr4_}$cryhCM zEoLuzY!9h7k88Pou&VV+u}WM4FIiAHnqN0jIGTI4G_~4bzRb)kC?2RNE!CWq`P^q;#xfC8*>7Uir8Yw{*YM$vn5&gRa(;zeuPc{FXPa4tF z=~=si+D(P`VaKvHg!_o|5#@a#djUP_iolaQ?CDxce2o|;xe6HKN|-TT7~!cDEQN&8 zG`q7_P=Rh%-3m!ZiLY5?D}X5?KpbEL>_!-@$PqW<9Y5{pAQpkL8?o?wVcd4;LFrA4 z4S?a?&2|hPNkT?b6EWQ+5(W{U8iZz$#DOGqE}gmR+kP8-jq z!L;t-zr9a!8{7|`swQBMDh;Kappt&DW=Gf;nhC?mkf~?GM>6v>R&NQZE@4?Bp%yPM lW+C4xd5(A548uOYV!GJw6I1T~6G3YR^ML63f>V7g5X5j6`E9Ec7g6(%2%FeVxsiWrKo zll~$zuuI!H=zv+yslBn(ETd+Vgb_95oH-3}0oA1I6a{R)kqb3g{6xDM9kyAt;^jl{ zl^5p8yroS{a%zsb;L0@(Ie5{!jr88CrHSIf4`35$4qAOICH^gcDJ*FA#ki+C=+Q57 zPsO|hZJq`k=p4oCRvB0K#N2Ete!rWJQ_l`NvtHQP;fjqmDLrxTkKE4qD-(Fe(h+UX zlGP5S5YP4=h|k}JVrI7t zJA0)>^lA)n;#(Mgexq3z<-ew}JlKtwEy-=XEHgNMUDn#=ga0#AUD8eBWH6$(MS+Ra z?&v$@BP*`ln_Rsh0f0a(m{M>xSIi%xK!TMcvlu(9=khR@hA)RxHj#NFZd*6rxb<>m zay2H7=s-d$N5tSn`UXSMW7=I-R$g3OVkyowG8;$djnSI~SI$S-1!G~(V-vf zr{j_ABC;|b>$2X2O7^wc-`To~Z{6lXQxb0F9IY43goBa5oQIH1enM}O`ZGsFa(}(h za7$ufy%Z3*D|PX{RmjionpJ2ql`z?-%^8JfV3`&Og!bj-KES$+c=nD0p3oe}=omfL zr3dtsDPhhH`v%plHXLa7qYiw*$gb%ihT?CO)$74I4XZPNa~zC3;sAOk4bTKV`(hzQ F`VTG=N1gxx diff --git a/BrokerApiTest/obj/project.assets.json b/BrokerApiTest/obj/project.assets.json index a0d01e4..4e53e0c 100644 --- a/BrokerApiTest/obj/project.assets.json +++ b/BrokerApiTest/obj/project.assets.json @@ -66,6 +66,161 @@ "lib/net7.0/AsyncStateMachine.dll": {} } }, + "Autofac/8.2.0": { + "type": "package", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "8.0.1" + }, + "compile": { + "lib/net8.0/Autofac.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Autofac.dll": { + "related": ".xml" + } + } + }, + "AutoMapper/14.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Options": "8.0.0" + }, + "compile": { + "lib/net8.0/AutoMapper.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/AutoMapper.dll": { + "related": ".xml" + } + } + }, + "AutoMapper.AspNetCore.OData.EFCore/7.0.1": { + "type": "package", + "dependencies": { + "AutoMapper.Extensions.ExpressionMapping": "[8.0.0, 9.0.0)", + "LogicBuilder.Expressions.Utils": "7.0.0", + "Microsoft.AspNetCore.OData": "9.1.1", + "Microsoft.EntityFrameworkCore": "8.0.11" + }, + "compile": { + "lib/net8.0/AutoMapper.AspNetCore.OData.EFCore.dll": {} + }, + "runtime": { + "lib/net8.0/AutoMapper.AspNetCore.OData.EFCore.dll": {} + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "AutoMapper.Collection/11.0.0": { + "type": "package", + "dependencies": { + "AutoMapper": "[14.0.0, 15.0.0)" + }, + "compile": { + "lib/net8.0/AutoMapper.Collection.dll": {} + }, + "runtime": { + "lib/net8.0/AutoMapper.Collection.dll": {} + } + }, + "AutoMapper.Collection.EntityFrameworkCore/11.0.0": { + "type": "package", + "dependencies": { + "AutoMapper.Collection": "[11.0.0, 12.0.0)", + "AutoMapper.Extensions.ExpressionMapping": "[8.0.0, 9.0.0)", + "Microsoft.EntityFrameworkCore": "9.0.2" + }, + "compile": { + "lib/net8.0/AutoMapper.Collection.EntityFrameworkCore.dll": {} + }, + "runtime": { + "lib/net8.0/AutoMapper.Collection.EntityFrameworkCore.dll": {} + } + }, + "AutoMapper.Contrib.Autofac.DependencyInjection/9.0.0": { + "type": "package", + "dependencies": { + "AutoMapper": "14.0.0", + "Autofac": "8.2.0" + }, + "compile": { + "lib/net8.0/AutoMapper.Contrib.Autofac.DependencyInjection.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/AutoMapper.Contrib.Autofac.DependencyInjection.dll": { + "related": ".pdb" + } + } + }, + "AutoMapper.Data/9.0.0": { + "type": "package", + "dependencies": { + "AutoMapper": "[14.0.0, 15.0.0)" + }, + "compile": { + "lib/net8.0/AutoMapper.Data.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/AutoMapper.Data.dll": { + "related": ".xml" + } + } + }, + "AutoMapper.EF6/3.0.1": { + "type": "package", + "dependencies": { + "AutoMapper": "10.1.1", + "DelegateDecompiler.EntityFramework": "0.34.0", + "EntityFramework": "6.5.1" + }, + "compile": { + "lib/netstandard2.1/AutoMapper.EF6.dll": {} + }, + "runtime": { + "lib/netstandard2.1/AutoMapper.EF6.dll": {} + } + }, + "AutoMapper.Extensions.EnumMapping/4.1.0": { + "type": "package", + "dependencies": { + "AutoMapper": "[14.0.0, 15.0.0)" + }, + "compile": { + "lib/net8.0/AutoMapper.Extensions.EnumMapping.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/AutoMapper.Extensions.EnumMapping.dll": { + "related": ".xml" + } + } + }, + "AutoMapper.Extensions.ExpressionMapping/8.0.0": { + "type": "package", + "dependencies": { + "AutoMapper": "[14.0.0, 15.0.0)" + }, + "compile": { + "lib/net8.0/AutoMapper.Extensions.ExpressionMapping.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/AutoMapper.Extensions.ExpressionMapping.dll": { + "related": ".xml" + } + } + }, "AWS.Logger.Core/3.3.3": { "type": "package", "dependencies": { @@ -115,7 +270,7 @@ } } }, - "AWSSDK.Core/3.7.402.39": { + "AWSSDK.Core/3.7.402.46": { "type": "package", "compile": { "lib/net8.0/AWSSDK.Core.dll": { @@ -128,10 +283,10 @@ } } }, - "AWSSDK.DynamoDBv2/3.7.406.21": { + "AWSSDK.DynamoDBv2/3.7.407": { "type": "package", "dependencies": { - "AWSSDK.Core": "[3.7.402.39, 4.0.0)" + "AWSSDK.Core": "[3.7.402.45, 4.0.0)" }, "compile": { "lib/net8.0/AWSSDK.DynamoDBv2.dll": { @@ -160,10 +315,10 @@ } } }, - "AWSSDK.OpenSearchService/3.7.404.75": { + "AWSSDK.OpenSearchService/3.7.404.81": { "type": "package", "dependencies": { - "AWSSDK.Core": "[3.7.402.39, 4.0.0)" + "AWSSDK.Core": "[3.7.402.45, 4.0.0)" }, "compile": { "lib/net8.0/AWSSDK.OpenSearchService.dll": { @@ -176,10 +331,10 @@ } } }, - "AWSSDK.S3/3.7.416.9": { + "AWSSDK.S3/3.7.416.15": { "type": "package", "dependencies": { - "AWSSDK.Core": "[3.7.402.39, 4.0.0)" + "AWSSDK.Core": "[3.7.402.45, 4.0.0)" }, "compile": { "lib/net8.0/AWSSDK.S3.dll": { @@ -192,6 +347,22 @@ } } }, + "AWSSDK.SecurityToken/3.7.401.89": { + "type": "package", + "dependencies": { + "AWSSDK.Core": "[3.7.402.46, 4.0.0)" + }, + "compile": { + "lib/net8.0/AWSSDK.SecurityToken.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net8.0/AWSSDK.SecurityToken.dll": { + "related": ".pdb;.xml" + } + } + }, "Axion.ConcurrentHashSet/1.0.0": { "type": "package", "compile": { @@ -205,7 +376,20 @@ } } }, - "BouncyCastle.Cryptography/2.4.0": { + "BCrypt.Net-Next/4.0.3": { + "type": "package", + "compile": { + "lib/net6.0/BCrypt.Net-Next.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/BCrypt.Net-Next.dll": { + "related": ".xml" + } + } + }, + "BouncyCastle.Cryptography/2.5.1": { "type": "package", "compile": { "lib/net6.0/BouncyCastle.Cryptography.dll": { @@ -260,6 +444,31 @@ } } }, + "DelegateDecompiler/0.34.0": { + "type": "package", + "dependencies": { + "Mono.Reflection": "2.0.0" + }, + "compile": { + "lib/netstandard2.1/DelegateDecompiler.dll": {} + }, + "runtime": { + "lib/netstandard2.1/DelegateDecompiler.dll": {} + } + }, + "DelegateDecompiler.EntityFramework/0.34.0": { + "type": "package", + "dependencies": { + "DelegateDecompiler": "0.34.0", + "EntityFramework": "6.3.0" + }, + "compile": { + "lib/netstandard2.1/DelegateDecompiler.EntityFramework.dll": {} + }, + "runtime": { + "lib/netstandard2.1/DelegateDecompiler.EntityFramework.dll": {} + } + }, "DnsClient/1.6.1": { "type": "package", "dependencies": { @@ -298,6 +507,36 @@ "lib/netcoreapp2.0/DumpExtensions.dll": {} } }, + "EntityFramework/6.5.1": { + "type": "package", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "System.CodeDom": "6.0.0", + "System.ComponentModel.Annotations": "5.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Data.SqlClient": "4.8.6" + }, + "compile": { + "lib/netstandard2.1/EntityFramework.SqlServer.dll": { + "related": ".xml" + }, + "lib/netstandard2.1/EntityFramework.dll": { + "related": ".SqlServer.xml;.xml" + } + }, + "runtime": { + "lib/netstandard2.1/EntityFramework.SqlServer.dll": { + "related": ".xml" + }, + "lib/netstandard2.1/EntityFramework.dll": { + "related": ".SqlServer.xml;.xml" + } + }, + "build": { + "buildTransitive/net6.0/EntityFramework.props": {}, + "buildTransitive/net6.0/EntityFramework.targets": {} + } + }, "Google.Protobuf/3.27.1": { "type": "package", "compile": { @@ -481,6 +720,29 @@ } } }, + "LogicBuilder.Expressions.Utils/7.0.0": { + "type": "package", + "dependencies": { + "LogicBuilder.Structures": "7.0.0", + "Microsoft.CSharp": "4.7.0", + "System.Reflection.Emit": "4.7.0" + }, + "compile": { + "lib/netstandard2.0/LogicBuilder.Expressions.Utils.dll": {} + }, + "runtime": { + "lib/netstandard2.0/LogicBuilder.Expressions.Utils.dll": {} + } + }, + "LogicBuilder.Structures/7.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/LogicBuilder.Structures.dll": {} + }, + "runtime": { + "lib/netstandard2.0/LogicBuilder.Structures.dll": {} + } + }, "MediatR/12.3.0": { "type": "package", "dependencies": { @@ -554,6 +816,25 @@ "buildTransitive/net8.0/Microsoft.AspNetCore.Mvc.Testing.targets": {} } }, + "Microsoft.AspNetCore.OData/9.1.1": { + "type": "package", + "dependencies": { + "Microsoft.OData.Core": "[8.2.2, 9.0.0)", + "Microsoft.OData.Edm": "[8.2.2, 9.0.0)", + "Microsoft.OData.ModelBuilder": "[2.0.0, 3.0.0)", + "Microsoft.Spatial": "[8.2.2, 9.0.0)" + }, + "compile": { + "lib/net8.0/Microsoft.AspNetCore.OData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.AspNetCore.OData.dll": { + "related": ".xml" + } + } + }, "Microsoft.AspNetCore.TestHost/8.0.2": { "type": "package", "dependencies": { @@ -573,6 +854,19 @@ "Microsoft.AspNetCore.App" ] }, + "Microsoft.Bcl.AsyncInterfaces/8.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + } + }, "Microsoft.Bcl.Memory/9.0.0": { "type": "package", "compile": { @@ -602,6 +896,15 @@ "build/netstandard2.0/Microsoft.CodeCoverage.targets": {} } }, + "Microsoft.CSharp/4.7.0": { + "type": "package", + "compile": { + "ref/netcoreapp2.0/_._": {} + }, + "runtime": { + "lib/netcoreapp2.0/_._": {} + } + }, "Microsoft.Diagnostics.NETCore.Client/0.2.621003": { "type": "package", "dependencies": { @@ -618,13 +921,13 @@ } } }, - "Microsoft.EntityFrameworkCore/8.0.2": { + "Microsoft.EntityFrameworkCore/9.0.2": { "type": "package", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.2", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.2", - "Microsoft.Extensions.Caching.Memory": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0" + "Microsoft.EntityFrameworkCore.Abstractions": "9.0.2", + "Microsoft.EntityFrameworkCore.Analyzers": "9.0.2", + "Microsoft.Extensions.Caching.Memory": "9.0.2", + "Microsoft.Extensions.Logging": "9.0.2" }, "compile": { "lib/net8.0/Microsoft.EntityFrameworkCore.dll": { @@ -640,7 +943,7 @@ "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props": {} } }, - "Microsoft.EntityFrameworkCore.Abstractions/8.0.2": { + "Microsoft.EntityFrameworkCore.Abstractions/9.0.2": { "type": "package", "compile": { "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": { @@ -653,14 +956,8 @@ } } }, - "Microsoft.EntityFrameworkCore.Analyzers/8.0.2": { - "type": "package", - "compile": { - "lib/netstandard2.0/_._": {} - }, - "runtime": { - "lib/netstandard2.0/_._": {} - } + "Microsoft.EntityFrameworkCore.Analyzers/9.0.2": { + "type": "package" }, "Microsoft.EntityFrameworkCore.Relational/8.0.2": { "type": "package", @@ -679,10 +976,10 @@ } } }, - "Microsoft.Extensions.Caching.Abstractions/8.0.0": { + "Microsoft.Extensions.Caching.Abstractions/9.0.2": { "type": "package", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Primitives": "9.0.2" }, "compile": { "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll": { @@ -695,17 +992,17 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, - "Microsoft.Extensions.Caching.Memory/8.0.0": { + "Microsoft.Extensions.Caching.Memory/9.0.2": { "type": "package", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Caching.Abstractions": "9.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.2", + "Microsoft.Extensions.Options": "9.0.2", + "Microsoft.Extensions.Primitives": "9.0.2" }, "compile": { "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll": { @@ -718,14 +1015,14 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, - "Microsoft.Extensions.Configuration/8.0.0": { + "Microsoft.Extensions.Configuration/9.0.4": { "type": "package", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" }, "compile": { "lib/net8.0/Microsoft.Extensions.Configuration.dll": { @@ -738,13 +1035,13 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, - "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { + "Microsoft.Extensions.Configuration.Abstractions/9.0.4": { "type": "package", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Primitives": "9.0.4" }, "compile": { "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll": { @@ -757,7 +1054,7 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, "Microsoft.Extensions.Configuration.Binder/8.0.0": { @@ -888,10 +1185,10 @@ "buildTransitive/net6.0/Microsoft.Extensions.Configuration.UserSecrets.targets": {} } }, - "Microsoft.Extensions.DependencyInjection/8.0.0": { + "Microsoft.Extensions.DependencyInjection/9.0.2": { "type": "package", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2" }, "compile": { "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": { @@ -904,10 +1201,10 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, - "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": { + "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.4": { "type": "package", "compile": { "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { @@ -920,7 +1217,7 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, "Microsoft.Extensions.DependencyModel/8.0.0": { @@ -1128,12 +1425,12 @@ "buildTransitive/net6.0/_._": {} } }, - "Microsoft.Extensions.Logging/8.0.0": { + "Microsoft.Extensions.Logging/9.0.2": { "type": "package", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.DependencyInjection": "9.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.2", + "Microsoft.Extensions.Options": "9.0.2" }, "compile": { "lib/net8.0/Microsoft.Extensions.Logging.dll": { @@ -1146,13 +1443,14 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, - "Microsoft.Extensions.Logging.Abstractions/8.0.2": { + "Microsoft.Extensions.Logging.Abstractions/9.0.2": { "type": "package", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2", + "System.Diagnostics.DiagnosticSource": "9.0.2" }, "compile": { "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": { @@ -1165,7 +1463,7 @@ } }, "build": { - "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {} + "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets": {} } }, "Microsoft.Extensions.Logging.Configuration/8.0.0": { @@ -1286,11 +1584,24 @@ "buildTransitive/net6.0/_._": {} } }, - "Microsoft.Extensions.Options/8.0.0": { + "Microsoft.Extensions.ObjectPool/6.0.3": { + "type": "package", + "compile": { + "lib/net6.0/Microsoft.Extensions.ObjectPool.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.ObjectPool.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.Options/9.0.4": { "type": "package", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" }, "compile": { "lib/net8.0/Microsoft.Extensions.Options.dll": { @@ -1303,7 +1614,7 @@ } }, "build": { - "buildTransitive/net6.0/Microsoft.Extensions.Options.targets": {} + "buildTransitive/net8.0/Microsoft.Extensions.Options.targets": {} } }, "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { @@ -1329,7 +1640,7 @@ "buildTransitive/net6.0/_._": {} } }, - "Microsoft.Extensions.Primitives/8.0.0": { + "Microsoft.Extensions.Primitives/9.0.4": { "type": "package", "compile": { "lib/net8.0/Microsoft.Extensions.Primitives.dll": { @@ -1342,10 +1653,10 @@ } }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, - "Microsoft.IdentityModel.Abstractions/8.8.0": { + "Microsoft.IdentityModel.Abstractions/8.9.0": { "type": "package", "compile": { "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll": { @@ -1358,10 +1669,10 @@ } } }, - "Microsoft.IdentityModel.JsonWebTokens/8.8.0": { + "Microsoft.IdentityModel.JsonWebTokens/8.9.0": { "type": "package", "dependencies": { - "Microsoft.IdentityModel.Tokens": "8.8.0" + "Microsoft.IdentityModel.Tokens": "8.9.0" }, "compile": { "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll": { @@ -1374,10 +1685,10 @@ } } }, - "Microsoft.IdentityModel.Logging/8.8.0": { + "Microsoft.IdentityModel.Logging/8.9.0": { "type": "package", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "8.8.0" + "Microsoft.IdentityModel.Abstractions": "8.9.0" }, "compile": { "lib/net8.0/Microsoft.IdentityModel.Logging.dll": { @@ -1424,12 +1735,12 @@ } } }, - "Microsoft.IdentityModel.Tokens/8.8.0": { + "Microsoft.IdentityModel.Tokens/8.9.0": { "type": "package", "dependencies": { "Microsoft.Bcl.Memory": "9.0.0", "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.IdentityModel.Logging": "8.8.0" + "Microsoft.IdentityModel.Logging": "8.9.0" }, "compile": { "lib/net8.0/Microsoft.IdentityModel.Tokens.dll": { @@ -1462,13 +1773,59 @@ "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {} } }, - "Microsoft.NETCore.Platforms/5.0.0": { + "Microsoft.OData.Core/8.2.2": { "type": "package", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "6.0.3", + "Microsoft.OData.Edm": "[8.2.2]", + "Microsoft.Spatial": "[8.2.2]" + }, "compile": { - "lib/netstandard1.0/_._": {} + "lib/net8.0/Microsoft.OData.Core.dll": { + "related": ".xml" + } }, "runtime": { - "lib/netstandard1.0/_._": {} + "lib/net8.0/Microsoft.OData.Core.dll": { + "related": ".xml" + } + } + }, + "Microsoft.OData.Edm/8.2.2": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + }, + "compile": { + "lib/net8.0/Microsoft.OData.Edm.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.OData.Edm.dll": { + "related": ".xml" + } + } + }, + "Microsoft.OData.ModelBuilder/2.0.0": { + "type": "package", + "dependencies": { + "Microsoft.OData.Edm": "[8.0.0, 9.0.0)", + "Microsoft.Spatial": "[8.0.0, 9.0.0)", + "System.ComponentModel.Annotations": "4.6.0" + }, + "compile": { + "lib/net8.0/Microsoft.OData.ModelBuilder.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.OData.ModelBuilder.dll": { + "related": ".xml" + } } }, "Microsoft.OpenApi/1.6.22": { @@ -1484,6 +1841,19 @@ } } }, + "Microsoft.Spatial/8.2.2": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.Spatial.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Spatial.dll": { + "related": ".xml" + } + } + }, "Microsoft.TestPlatform.ObjectModel/17.12.0": { "type": "package", "dependencies": { @@ -1756,6 +2126,28 @@ } } }, + "Microsoft.Win32.SystemEvents/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/Microsoft.Win32.SystemEvents.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Win32.SystemEvents.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, "MongoDB.Analyzer/1.5.0": { "type": "package" }, @@ -1798,6 +2190,19 @@ } } }, + "Mono.Reflection/2.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/Mono.Reflection.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/netstandard2.0/Mono.Reflection.dll": { + "related": ".pdb" + } + } + }, "Moq/4.20.72": { "type": "package", "dependencies": { @@ -2095,6 +2500,41 @@ } } }, + "runtime.native.System.Data.SqlClient.sni/4.7.0": { + "type": "package", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0": { + "type": "package", + "runtimeTargets": { + "runtimes/win-arm64/native/sni.dll": { + "assetType": "native", + "rid": "win-arm64" + } + } + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0": { + "type": "package", + "runtimeTargets": { + "runtimes/win-x64/native/sni.dll": { + "assetType": "native", + "rid": "win-x64" + } + } + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": { + "type": "package", + "runtimeTargets": { + "runtimes/win-x86/native/sni.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, "SharpCompress/0.30.1": { "type": "package", "compile": { @@ -2117,10 +2557,11 @@ } } }, - "SSH.NET/2024.2.0": { + "SSH.NET/2025.0.0": { "type": "package", "dependencies": { - "BouncyCastle.Cryptography": "2.4.0" + "BouncyCastle.Cryptography": "2.5.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3" }, "compile": { "lib/net8.0/Renci.SshNet.dll": { @@ -2264,6 +2705,22 @@ "lib/netcoreapp2.0/_._": {} } }, + "System.CodeDom/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/System.CodeDom.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.CodeDom.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + } + }, "System.Collections.Immutable/1.7.1": { "type": "package", "compile": { @@ -2277,7 +2734,68 @@ } } }, - "System.Diagnostics.DiagnosticSource/8.0.0": { + "System.ComponentModel.Annotations/5.0.0": { + "type": "package", + "compile": { + "ref/netstandard2.1/System.ComponentModel.Annotations.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/System.ComponentModel.Annotations.dll": { + "related": ".xml" + } + } + }, + "System.Configuration.ConfigurationManager/6.0.1": { + "type": "package", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Configuration.ConfigurationManager.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Configuration.ConfigurationManager.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + } + }, + "System.Data.SqlClient/4.8.6": { + "type": "package", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + }, + "compile": { + "ref/netcoreapp2.1/System.Data.SqlClient.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netcoreapp2.1/System.Data.SqlClient.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/unix/lib/netcoreapp2.1/System.Data.SqlClient.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/netcoreapp2.1/System.Data.SqlClient.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Diagnostics.DiagnosticSource/9.0.2": { "type": "package", "compile": { "lib/net8.0/System.Diagnostics.DiagnosticSource.dll": { @@ -2289,8 +2807,15 @@ "related": ".xml" } }, + "contentFiles": { + "contentFiles/any/any/_._": { + "buildAction": "None", + "codeLanguage": "any", + "copyToOutput": false + } + }, "build": { - "buildTransitive/net6.0/_._": {} + "buildTransitive/net8.0/_._": {} } }, "System.Diagnostics.EventLog/8.0.0": { @@ -2319,11 +2844,40 @@ } } }, - "System.IdentityModel.Tokens.Jwt/8.8.0": { + "System.Drawing.Common/6.0.0": { "type": "package", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "8.8.0", - "Microsoft.IdentityModel.Tokens": "8.8.0" + "Microsoft.Win32.SystemEvents": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Drawing.Common.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Drawing.Common.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + }, + "runtimeTargets": { + "runtimes/unix/lib/net6.0/System.Drawing.Common.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/net6.0/System.Drawing.Common.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.IdentityModel.Tokens.Jwt/8.9.0": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.9.0", + "Microsoft.IdentityModel.Tokens": "8.9.0" }, "compile": { "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll": { @@ -2377,6 +2931,15 @@ "buildTransitive/net6.0/_._": {} } }, + "System.Reflection.Emit/4.7.0": { + "type": "package", + "compile": { + "ref/netcoreapp2.0/_._": {} + }, + "runtime": { + "lib/netcoreapp2.0/_._": {} + } + }, "System.Reflection.Metadata/1.6.0": { "type": "package", "compile": { @@ -2403,29 +2966,70 @@ } } }, - "System.Security.AccessControl/5.0.0": { + "System.Security.AccessControl/6.0.0": { "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - }, "compile": { - "ref/netstandard2.0/System.Security.AccessControl.dll": { + "lib/net6.0/System.Security.AccessControl.dll": { "related": ".xml" } }, "runtime": { - "lib/netstandard2.0/System.Security.AccessControl.dll": { + "lib/net6.0/System.Security.AccessControl.dll": { "related": ".xml" } }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + }, "runtimeTargets": { - "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": { + "runtimes/win/lib/net6.0/System.Security.AccessControl.dll": { "assetType": "runtime", "rid": "win" } } }, + "System.Security.Cryptography.ProtectedData/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net6.0/System.Security.Cryptography.ProtectedData.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Security.Permissions/6.0.0": { + "type": "package", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Security.Permissions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Security.Permissions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + } + }, "System.Security.Principal.Windows/5.0.0": { "type": "package", "compile": { @@ -2506,6 +3110,28 @@ "buildTransitive/net6.0/_._": {} } }, + "System.Windows.Extensions/6.0.0": { + "type": "package", + "dependencies": { + "System.Drawing.Common": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Windows.Extensions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Windows.Extensions.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/win/lib/net6.0/System.Windows.Extensions.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, "xunit/2.9.3": { "type": "package", "dependencies": { @@ -2797,18 +3423,32 @@ "framework": ".NETCoreApp,Version=v8.0", "dependencies": { "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "Axion.ConcurrentHashSet": "1.0.0", + "BCrypt.Net-Next": "4.0.3", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "DotNet.MultiMap": "2.2.1", "DumpExtensions": "2.0.0", "Google.Protobuf": "3.27.1", "JWT": "11.0.0", "Microsoft.Diagnostics.NETCore.Client": "0.2.621003", + "Microsoft.Extensions.Configuration": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "MongoDB.Analyzer": "1.5.0", "MongoDB.Bson": "3.3.0", "MongoDB.Driver": "3.3.0", @@ -2819,12 +3459,12 @@ "Nito.AsyncEx": "5.1.2", "Otp.NET": "1.4.0", "RabbitMQ.Client": "6.8.1", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", "StackExchange.Redis.MultiplexerPool": "2.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "YamlDotNet": "16.3.0" }, "compile": { @@ -2919,6 +3559,156 @@ "lib/netstandard2.0/AsyncStateMachine.dll" ] }, + "Autofac/8.2.0": { + "sha512": "T+4+W4byzyUOarCbIcFRbxpYKC+cndfQm/+VeWpB60P2MCN0JMsewUhZqvH5Ooe936HQjn5uHvEY9tq6BfbiIw==", + "type": "package", + "path": "autofac/8.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "autofac.8.2.0.nupkg.sha512", + "autofac.nuspec", + "icon.png", + "lib/net6.0/Autofac.dll", + "lib/net6.0/Autofac.xml", + "lib/net7.0/Autofac.dll", + "lib/net7.0/Autofac.xml", + "lib/net8.0/Autofac.dll", + "lib/net8.0/Autofac.xml", + "lib/netstandard2.0/Autofac.dll", + "lib/netstandard2.0/Autofac.xml", + "lib/netstandard2.1/Autofac.dll", + "lib/netstandard2.1/Autofac.xml" + ] + }, + "AutoMapper/14.0.0": { + "sha512": "OC+1neAPM4oCCqQj3g2GJ2shziNNhOkxmNB9cVS8jtx4JbgmRzLcUOxB9Tsz6cVPHugdkHgCaCrTjjSI0Z5sCQ==", + "type": "package", + "path": "automapper/14.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "automapper.14.0.0.nupkg.sha512", + "automapper.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.dll", + "lib/net8.0/AutoMapper.xml" + ] + }, + "AutoMapper.AspNetCore.OData.EFCore/7.0.1": { + "sha512": "VfJFmLdPjdKX1gOlUx9+n1hdi9tFadsEDd28iSsTy26SdOe8AuV9fWozVMXg6663qBbw/7LiaPP19VgRlfFkOA==", + "type": "package", + "path": "automapper.aspnetcore.odata.efcore/7.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "automapper.aspnetcore.odata.efcore.7.0.1.nupkg.sha512", + "automapper.aspnetcore.odata.efcore.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.AspNetCore.OData.EFCore.dll", + "lib/net9.0/AutoMapper.AspNetCore.OData.EFCore.dll" + ] + }, + "AutoMapper.Collection/11.0.0": { + "sha512": "26CXTuPsIbfk121na1sWt/QcJ4EkXtlWy6R+LJFvsxiF80d2srbUgL0WgZn9mDyrJo4Hvvyqr/WFwNrVOKMiHQ==", + "type": "package", + "path": "automapper.collection/11.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "automapper.collection.11.0.0.nupkg.sha512", + "automapper.collection.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.Collection.dll" + ] + }, + "AutoMapper.Collection.EntityFrameworkCore/11.0.0": { + "sha512": "+IHCGSLfdc2pNXEUF2Kz8P1I1anCqPlEGWswMzTz1tZ2eRod9bY609TS55dg2NlS8e9CKebIoT3e/c4m90jCoQ==", + "type": "package", + "path": "automapper.collection.entityframeworkcore/11.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "automapper.collection.entityframeworkcore.11.0.0.nupkg.sha512", + "automapper.collection.entityframeworkcore.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.Collection.EntityFrameworkCore.dll" + ] + }, + "AutoMapper.Contrib.Autofac.DependencyInjection/9.0.0": { + "sha512": "vomQXQ4vqWUhl5tpbUbD3200BtlVJxdAUdCMa08a/vzRL6S9MJb2mN6EplaXXA3FLH1a3lPT1KpiHu6AlooQ/w==", + "type": "package", + "path": "automapper.contrib.autofac.dependencyinjection/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "automapper.contrib.autofac.dependencyinjection.9.0.0.nupkg.sha512", + "automapper.contrib.autofac.dependencyinjection.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.Contrib.Autofac.DependencyInjection.dll", + "lib/net8.0/AutoMapper.Contrib.Autofac.DependencyInjection.pdb" + ] + }, + "AutoMapper.Data/9.0.0": { + "sha512": "OI0+nHZaVGZCys2Nz7YV1I5ZjKjuTM2NXlAUmd2Nx68s4qX5m8piUfSapVjxInoQDf5PJ7Mox7a1lEZHpSHYpg==", + "type": "package", + "path": "automapper.data/9.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "automapper.data.9.0.0.nupkg.sha512", + "automapper.data.nuspec", + "lib/net8.0/AutoMapper.Data.dll", + "lib/net8.0/AutoMapper.Data.xml" + ] + }, + "AutoMapper.EF6/3.0.1": { + "sha512": "4w8gqn6NixT69TmH5Iup2nFoC6bYtjwh/QozOvOEbnu6imnegZE2DE4EqEG6Fis1dKKJ6WT9NCbiWC4NZv7Abw==", + "type": "package", + "path": "automapper.ef6/3.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "automapper.ef6.3.0.1.nupkg.sha512", + "automapper.ef6.nuspec", + "lib/net462/AutoMapper.EF6.dll", + "lib/netstandard2.1/AutoMapper.EF6.dll" + ] + }, + "AutoMapper.Extensions.EnumMapping/4.1.0": { + "sha512": "4i6FVLOequZNLgU6CRFbT900tBHb6JxyJty7Q8Rf7wMiwIBy/PkjsOT7Vz6svacFykghEy7PURSxpO9Fl2OUsA==", + "type": "package", + "path": "automapper.extensions.enummapping/4.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "automapper.extensions.enummapping.4.1.0.nupkg.sha512", + "automapper.extensions.enummapping.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.Extensions.EnumMapping.dll", + "lib/net8.0/AutoMapper.Extensions.EnumMapping.xml" + ] + }, + "AutoMapper.Extensions.ExpressionMapping/8.0.0": { + "sha512": "fR55QEOt8GiaVQPuEpyWJAzZxFSInCIYg6E1EoqQByWnjzQnQ5zHwQvMMF3E+AdtvAzbG7Intm08/8pK8eUTvQ==", + "type": "package", + "path": "automapper.extensions.expressionmapping/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "automapper.extensions.expressionmapping.8.0.0.nupkg.sha512", + "automapper.extensions.expressionmapping.nuspec", + "icon.png", + "lib/net8.0/AutoMapper.Extensions.ExpressionMapping.dll", + "lib/net8.0/AutoMapper.Extensions.ExpressionMapping.xml" + ] + }, "AWS.Logger.Core/3.3.3": { "sha512": "JEXjiwIwAws5YJZDVwSqUoZIjMxsAuaZOQFZfLk6lYTg9NLrFY1dHafy6qifz/8ZQSlBiuSs+MAAHlBqHF9Cfw==", "type": "package", @@ -2991,15 +3781,15 @@ "tools/uninstall.ps1" ] }, - "AWSSDK.Core/3.7.402.39": { - "sha512": "tfhDM14yy3P/Hrrq6pxmG+DojJcghnCYpuEAHPgTPAcMlffL3nVIHRtzsUTnCrR1B6qwGtxHd6f3IOhL6m+fSA==", + "AWSSDK.Core/3.7.402.46": { + "sha512": "/W2Y/8PmNilP4qONoPJz5/AgHwvwblmE8wvf1nG+oqqd2fX88vUNRToHmdVxZUqjLtx64VryI7iGKRaPUDMkTA==", "type": "package", - "path": "awssdk.core/3.7.402.39", + "path": "awssdk.core/3.7.402.46", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", - "awssdk.core.3.7.402.39.nupkg.sha512", + "awssdk.core.3.7.402.46.nupkg.sha512", "awssdk.core.nuspec", "images/AWSLogo.png", "lib/net35/AWSSDK.Core.dll", @@ -3020,17 +3810,17 @@ "tools/account-management.ps1" ] }, - "AWSSDK.DynamoDBv2/3.7.406.21": { - "sha512": "WMfkpnUTqXMfwbdsg2neC9ZEmueNAXjkbuITh9oVEe7TLVkE9O2+8jo/qZOfwa16dYsDgPigBGyO+pJAKfp8yg==", + "AWSSDK.DynamoDBv2/3.7.407": { + "sha512": "YhenYMRx4d//UI6oEzvOPx/z8lBpSYQDel+JcFTIyR1IuRq1S3Fj3EOKUkjO8Rc24tcW9iO7fwvQldCYm50AyQ==", "type": "package", - "path": "awssdk.dynamodbv2/3.7.406.21", + "path": "awssdk.dynamodbv2/3.7.407", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "analyzers/dotnet/cs/AWSSDK.DynamoDBv2.CodeAnalysis.dll", "analyzers/dotnet/cs/SharedAnalysisCode.dll", - "awssdk.dynamodbv2.3.7.406.21.nupkg.sha512", + "awssdk.dynamodbv2.3.7.407.nupkg.sha512", "awssdk.dynamodbv2.nuspec", "images/AWSLogo.png", "lib/net35/AWSSDK.DynamoDBv2.dll", @@ -3084,17 +3874,17 @@ "tools/uninstall.ps1" ] }, - "AWSSDK.OpenSearchService/3.7.404.75": { - "sha512": "O4k6MR2SpKf/bplYdfTgAtm7x9oiI66gx32DaSTuTB6UY39sG9AddmSTNGWTqU6qI+3zgb3BJq4YIXhKHWdPXA==", + "AWSSDK.OpenSearchService/3.7.404.81": { + "sha512": "ozC9j1qTmCu+01U5aA2/tp2aPYDUvhtc94eGNq/Z4qp1ybjjxpH5mY00v7vL9xC4OY6NnxY2miLS/VvxsqsTsg==", "type": "package", - "path": "awssdk.opensearchservice/3.7.404.75", + "path": "awssdk.opensearchservice/3.7.404.81", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "analyzers/dotnet/cs/AWSSDK.OpenSearchService.CodeAnalysis.dll", "analyzers/dotnet/cs/SharedAnalysisCode.dll", - "awssdk.opensearchservice.3.7.404.75.nupkg.sha512", + "awssdk.opensearchservice.3.7.404.81.nupkg.sha512", "awssdk.opensearchservice.nuspec", "images/AWSLogo.png", "lib/net35/AWSSDK.OpenSearchService.dll", @@ -3116,17 +3906,17 @@ "tools/uninstall.ps1" ] }, - "AWSSDK.S3/3.7.416.9": { - "sha512": "o+Rnsn6mVVl/51FN8kIOvJqByXYm9ek545ZUV1zdkYqepAhKRJ1VUBeM3PxrlZmkoeW3Lrf6tMVcqHTU2onnpA==", + "AWSSDK.S3/3.7.416.15": { + "sha512": "jacDKz1W4udfELs1kUMh+joJfy3cxk5MTQ6V8KhN5U0UsdSigticS6p5/8xY3L1RpZrwNTdE4EFE5IV7I4tFDg==", "type": "package", - "path": "awssdk.s3/3.7.416.9", + "path": "awssdk.s3/3.7.416.15", "hasTools": true, "files": [ ".nupkg.metadata", ".signature.p7s", "analyzers/dotnet/cs/AWSSDK.S3.CodeAnalysis.dll", "analyzers/dotnet/cs/SharedAnalysisCode.dll", - "awssdk.s3.3.7.416.9.nupkg.sha512", + "awssdk.s3.3.7.416.15.nupkg.sha512", "awssdk.s3.nuspec", "images/AWSLogo.png", "lib/net35/AWSSDK.S3.dll", @@ -3148,6 +3938,38 @@ "tools/uninstall.ps1" ] }, + "AWSSDK.SecurityToken/3.7.401.89": { + "sha512": "HZ/tPaMoxKYlgTW7k0nLC/9QjyDXY3i+1yI7ptMKlZR378ikmFe4QgMf73MQeG+dIhAKf1SBTAXDytdlPtttcg==", + "type": "package", + "path": "awssdk.securitytoken/3.7.401.89", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "analyzers/dotnet/cs/AWSSDK.SecurityToken.CodeAnalysis.dll", + "analyzers/dotnet/cs/SharedAnalysisCode.dll", + "awssdk.securitytoken.3.7.401.89.nupkg.sha512", + "awssdk.securitytoken.nuspec", + "images/AWSLogo.png", + "lib/net35/AWSSDK.SecurityToken.dll", + "lib/net35/AWSSDK.SecurityToken.pdb", + "lib/net35/AWSSDK.SecurityToken.xml", + "lib/net45/AWSSDK.SecurityToken.dll", + "lib/net45/AWSSDK.SecurityToken.pdb", + "lib/net45/AWSSDK.SecurityToken.xml", + "lib/net8.0/AWSSDK.SecurityToken.dll", + "lib/net8.0/AWSSDK.SecurityToken.pdb", + "lib/net8.0/AWSSDK.SecurityToken.xml", + "lib/netcoreapp3.1/AWSSDK.SecurityToken.dll", + "lib/netcoreapp3.1/AWSSDK.SecurityToken.pdb", + "lib/netcoreapp3.1/AWSSDK.SecurityToken.xml", + "lib/netstandard2.0/AWSSDK.SecurityToken.dll", + "lib/netstandard2.0/AWSSDK.SecurityToken.pdb", + "lib/netstandard2.0/AWSSDK.SecurityToken.xml", + "tools/install.ps1", + "tools/uninstall.ps1" + ] + }, "Axion.ConcurrentHashSet/1.0.0": { "sha512": "lpDLMEHO6chrdOWWojzEyGsnev/6jFjyL7Z0bcQXWYWupyTqz+3V7frzC/bonvMbZXEwyNzsKkUa3SdkIYBazA==", "type": "package", @@ -3163,16 +3985,47 @@ "lib/netstandard2.0/Axion.ConcurrentHashSet.xml" ] }, - "BouncyCastle.Cryptography/2.4.0": { - "sha512": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==", + "BCrypt.Net-Next/4.0.3": { + "sha512": "W+U9WvmZQgi5cX6FS5GDtDoPzUCV4LkBLkywq/kRZhuDwcbavOzcDAr3LXJFqHUi952Yj3LEYoWW0jbEUQChsA==", "type": "package", - "path": "bouncycastle.cryptography/2.4.0", + "path": "bcrypt.net-next/4.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "bcrypt.net-next.4.0.3.nupkg.sha512", + "bcrypt.net-next.nuspec", + "ico.png", + "lib/net20/BCrypt.Net-Next.dll", + "lib/net20/BCrypt.Net-Next.xml", + "lib/net35/BCrypt.Net-Next.dll", + "lib/net35/BCrypt.Net-Next.xml", + "lib/net462/BCrypt.Net-Next.dll", + "lib/net462/BCrypt.Net-Next.xml", + "lib/net472/BCrypt.Net-Next.dll", + "lib/net472/BCrypt.Net-Next.xml", + "lib/net48/BCrypt.Net-Next.dll", + "lib/net48/BCrypt.Net-Next.xml", + "lib/net5.0/BCrypt.Net-Next.dll", + "lib/net5.0/BCrypt.Net-Next.xml", + "lib/net6.0/BCrypt.Net-Next.dll", + "lib/net6.0/BCrypt.Net-Next.xml", + "lib/netstandard2.0/BCrypt.Net-Next.dll", + "lib/netstandard2.0/BCrypt.Net-Next.xml", + "lib/netstandard2.1/BCrypt.Net-Next.dll", + "lib/netstandard2.1/BCrypt.Net-Next.xml", + "readme.md" + ] + }, + "BouncyCastle.Cryptography/2.5.1": { + "sha512": "zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==", + "type": "package", + "path": "bouncycastle.cryptography/2.5.1", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "README.md", - "bouncycastle.cryptography.2.4.0.nupkg.sha512", + "bouncycastle.cryptography.2.5.1.nupkg.sha512", "bouncycastle.cryptography.nuspec", "lib/net461/BouncyCastle.Cryptography.dll", "lib/net461/BouncyCastle.Cryptography.xml", @@ -3252,6 +4105,36 @@ "lib/netstandard2.1/CommunityToolkit.Diagnostics.xml" ] }, + "DelegateDecompiler/0.34.0": { + "sha512": "blUx3XMP4lJynw2y34NrnHzrshF2YGOPirxVUhHnAT09L/LwQc8Q6szmNGFi9hLd9AcM4nVAmXIX2DDyqCfwLg==", + "type": "package", + "path": "delegatedecompiler/0.34.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "delegatedecompiler.0.34.0.nupkg.sha512", + "delegatedecompiler.nuspec", + "lib/net40/DelegateDecompiler.dll", + "lib/net45/DelegateDecompiler.dll", + "lib/netstandard2.0/DelegateDecompiler.dll", + "lib/netstandard2.1/DelegateDecompiler.dll" + ] + }, + "DelegateDecompiler.EntityFramework/0.34.0": { + "sha512": "U55TkUKhrAsssd+cgXsEZqYXdT20nJBlEOBdLInsCRt1UghtWhYNZqbnR9oPIV4phrtgmkqj/6kXhfdczYNn4g==", + "type": "package", + "path": "delegatedecompiler.entityframework/0.34.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "delegatedecompiler.entityframework.0.34.0.nupkg.sha512", + "delegatedecompiler.entityframework.nuspec", + "lib/net45/DelegateDecompiler.EntityFramework.dll", + "lib/netstandard2.1/DelegateDecompiler.EntityFramework.dll" + ] + }, "DnsClient/1.6.1": { "sha512": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==", "type": "package", @@ -3303,6 +4186,68 @@ "lib/netstandard2.0/DumpExtensions.dll" ] }, + "EntityFramework/6.5.1": { + "sha512": "sQRP2lWg1i3aAGWqdliAM8zrGx7LHMUk+9/MoxUjwfTZYGMXvZ2JYZTlyTm1PqDxvn3c9E3U76TWDON7Y5+CVA==", + "type": "package", + "path": "entityframework/6.5.1", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "README.md", + "build/EntityFramework.DefaultItems.props", + "build/EntityFramework.props", + "build/EntityFramework.targets", + "build/Microsoft.Data.Entity.Build.Tasks.dll", + "build/net6.0/EntityFramework.props", + "build/net6.0/EntityFramework.targets", + "buildTransitive/EntityFramework.props", + "buildTransitive/EntityFramework.targets", + "buildTransitive/net6.0/EntityFramework.props", + "buildTransitive/net6.0/EntityFramework.targets", + "content/net40/App.config.install.xdt", + "content/net40/App.config.transform", + "content/net40/Web.config.install.xdt", + "content/net40/Web.config.transform", + "entityframework.6.5.1.nupkg.sha512", + "entityframework.nuspec", + "lib/net40/EntityFramework.SqlServer.dll", + "lib/net40/EntityFramework.SqlServer.xml", + "lib/net40/EntityFramework.dll", + "lib/net40/EntityFramework.xml", + "lib/net45/EntityFramework.SqlServer.dll", + "lib/net45/EntityFramework.SqlServer.xml", + "lib/net45/EntityFramework.dll", + "lib/net45/EntityFramework.xml", + "lib/netstandard2.1/EntityFramework.SqlServer.dll", + "lib/netstandard2.1/EntityFramework.SqlServer.xml", + "lib/netstandard2.1/EntityFramework.dll", + "lib/netstandard2.1/EntityFramework.xml", + "tools/EntityFramework6.PS2.psd1", + "tools/EntityFramework6.PS2.psm1", + "tools/EntityFramework6.psd1", + "tools/EntityFramework6.psm1", + "tools/about_EntityFramework6.help.txt", + "tools/init.ps1", + "tools/install.ps1", + "tools/net40/any/ef6.exe", + "tools/net40/any/ef6.pdb", + "tools/net40/win-arm64/ef6.exe", + "tools/net40/win-arm64/ef6.pdb", + "tools/net40/win-x86/ef6.exe", + "tools/net40/win-x86/ef6.pdb", + "tools/net45/any/ef6.exe", + "tools/net45/any/ef6.pdb", + "tools/net45/win-arm64/ef6.exe", + "tools/net45/win-arm64/ef6.pdb", + "tools/net45/win-x86/ef6.exe", + "tools/net45/win-x86/ef6.pdb", + "tools/net6.0/any/ef6.dll", + "tools/net6.0/any/ef6.pdb", + "tools/net6.0/any/ef6.runtimeconfig.json" + ] + }, "Google.Protobuf/3.27.1": { "sha512": "7IVz9TzhYCZ8qY0rPhXUnyJSXYdshUqmmxmTI763XmDDSJJFnyfKH43FFcMJu/CZgBcE98xlFztrKwhzcRkiPg==", "type": "package", @@ -3566,6 +4511,32 @@ "lib/netstandard2.0/JWT.xml" ] }, + "LogicBuilder.Expressions.Utils/7.0.0": { + "sha512": "nTlL/5nGPHZ0s987Kta4lFnzU79Px/9R9rFhJi6AxCMHZUz5BUX4Aab1A29iBTLmIMu2DKyQM8iN8q1NK3+CUA==", + "type": "package", + "path": "logicbuilder.expressions.utils/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/netstandard2.0/LogicBuilder.Expressions.Utils.dll", + "logicbuilder.expressions.utils.7.0.0.nupkg.sha512", + "logicbuilder.expressions.utils.nuspec" + ] + }, + "LogicBuilder.Structures/7.0.0": { + "sha512": "KDfzBB7cYk2ras9Nb3xYXuUKs+rvje0vVyGzkXPQCpKsSbugFi2fXz+0MIQ108K+f/mOde7ZBECkkmYObyPf2Q==", + "type": "package", + "path": "logicbuilder.structures/7.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/netstandard2.0/LogicBuilder.Structures.dll", + "logicbuilder.structures.7.0.0.nupkg.sha512", + "logicbuilder.structures.nuspec" + ] + }, "MediatR/12.3.0": { "sha512": "DuXRw/qux2n7pTRPond4WK9XImO+30TZrGPCeOmjYIXDWokpjZQDFRsdZMoP0WqWU7inC4m0D+Zbu5dSc4z6NQ==", "type": "package", @@ -3630,6 +4601,20 @@ "tasks/netstandard2.0/Microsoft.AspNetCore.Mvc.Testing.Tasks.dll" ] }, + "Microsoft.AspNetCore.OData/9.1.1": { + "sha512": "if1N+q3dTgUbUZ4KjLXCHYDQLKEEv0gpx8dLaSRp2StrYuWcRVCKjncI7fPcndFkt/nEJcIYzNKxtws4L5OO8Q==", + "type": "package", + "path": "microsoft.aspnetcore.odata/9.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "images/odata.png", + "lib/net8.0/Microsoft.AspNetCore.OData.dll", + "lib/net8.0/Microsoft.AspNetCore.OData.xml", + "microsoft.aspnetcore.odata.9.1.1.nupkg.sha512", + "microsoft.aspnetcore.odata.nuspec" + ] + }, "Microsoft.AspNetCore.TestHost/8.0.2": { "sha512": "4omKCTKqoIQsJH7LgDPjD8itGoili1WcDghr2jxRS8dYBbFEaX3mkV8A02wH+BC0aHFLwpCkEqFdYSHh1LRrUA==", "type": "package", @@ -3645,6 +4630,30 @@ "microsoft.aspnetcore.testhost.nuspec" ] }, + "Microsoft.Bcl.AsyncInterfaces/8.0.0": { + "sha512": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", + "type": "package", + "path": "microsoft.bcl.asyncinterfaces/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Bcl.AsyncInterfaces.targets", + "buildTransitive/net462/_._", + "lib/net462/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/net462/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml", + "microsoft.bcl.asyncinterfaces.8.0.0.nupkg.sha512", + "microsoft.bcl.asyncinterfaces.nuspec", + "useSharedDesignerContext.txt" + ] + }, "Microsoft.Bcl.Memory/9.0.0": { "sha512": "bTUtGfpGyJnohQzjdXbtc7MqNzkv7CWUSRz54+ucNm0i32rZiIU0VdVPHDBShOl1qhVKRjW8mnEBz3d2vH93tQ==", "type": "package", @@ -3741,6 +4750,75 @@ "microsoft.codecoverage.nuspec" ] }, + "Microsoft.CSharp/4.7.0": { + "sha512": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==", + "type": "package", + "path": "microsoft.csharp/4.7.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/Microsoft.CSharp.dll", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.3/Microsoft.CSharp.dll", + "lib/netstandard2.0/Microsoft.CSharp.dll", + "lib/netstandard2.0/Microsoft.CSharp.xml", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/uap10.0.16299/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "microsoft.csharp.4.7.0.nupkg.sha512", + "microsoft.csharp.nuspec", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/Microsoft.CSharp.dll", + "ref/netcore50/Microsoft.CSharp.xml", + "ref/netcore50/de/Microsoft.CSharp.xml", + "ref/netcore50/es/Microsoft.CSharp.xml", + "ref/netcore50/fr/Microsoft.CSharp.xml", + "ref/netcore50/it/Microsoft.CSharp.xml", + "ref/netcore50/ja/Microsoft.CSharp.xml", + "ref/netcore50/ko/Microsoft.CSharp.xml", + "ref/netcore50/ru/Microsoft.CSharp.xml", + "ref/netcore50/zh-hans/Microsoft.CSharp.xml", + "ref/netcore50/zh-hant/Microsoft.CSharp.xml", + "ref/netcoreapp2.0/_._", + "ref/netstandard1.0/Microsoft.CSharp.dll", + "ref/netstandard1.0/Microsoft.CSharp.xml", + "ref/netstandard1.0/de/Microsoft.CSharp.xml", + "ref/netstandard1.0/es/Microsoft.CSharp.xml", + "ref/netstandard1.0/fr/Microsoft.CSharp.xml", + "ref/netstandard1.0/it/Microsoft.CSharp.xml", + "ref/netstandard1.0/ja/Microsoft.CSharp.xml", + "ref/netstandard1.0/ko/Microsoft.CSharp.xml", + "ref/netstandard1.0/ru/Microsoft.CSharp.xml", + "ref/netstandard1.0/zh-hans/Microsoft.CSharp.xml", + "ref/netstandard1.0/zh-hant/Microsoft.CSharp.xml", + "ref/netstandard2.0/Microsoft.CSharp.dll", + "ref/netstandard2.0/Microsoft.CSharp.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/uap10.0.16299/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, "Microsoft.Diagnostics.NETCore.Client/0.2.621003": { "sha512": "22YdSeB53xk4Pd1Xz92HigUy8ySJMzd8hpEZHlFWeaefzYox4VJnW+gJEzGrxbSvl3oGCpiIFKqh8the0xhzSA==", "type": "package", @@ -3757,46 +4835,48 @@ "microsoft.diagnostics.netcore.client.nuspec" ] }, - "Microsoft.EntityFrameworkCore/8.0.2": { - "sha512": "6QlvBx4rdawW3AkkCsGVV+8qRLk34aknV5JD40s1hbVR18vKmT2KDl2DW83nHcPX7f4oebQ3BD1UMNCI/gkE0g==", + "Microsoft.EntityFrameworkCore/9.0.2": { + "sha512": "P90ZuybgcpW32y985eOYxSoZ9IiL0UTYQlY0y1Pt1iHAnpZj/dQHREpSpry1RNvk8YjAeoAkWFdem5conqB9zQ==", "type": "package", - "path": "microsoft.entityframeworkcore/8.0.2", + "path": "microsoft.entityframeworkcore/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", + "PACKAGE.md", "buildTransitive/net8.0/Microsoft.EntityFrameworkCore.props", "lib/net8.0/Microsoft.EntityFrameworkCore.dll", "lib/net8.0/Microsoft.EntityFrameworkCore.xml", - "microsoft.entityframeworkcore.8.0.2.nupkg.sha512", + "microsoft.entityframeworkcore.9.0.2.nupkg.sha512", "microsoft.entityframeworkcore.nuspec" ] }, - "Microsoft.EntityFrameworkCore.Abstractions/8.0.2": { - "sha512": "DjDKp++BTKFZmX+xLTow7grQTY+pImKfhGW68Zf8myiL3zyJ3b8RZbnLsWGNCqKQIF6hJIz/zA/zmERobFwV0A==", + "Microsoft.EntityFrameworkCore.Abstractions/9.0.2": { + "sha512": "oVSjNSIYHsk0N66eqAWgDcyo9etEFbUswbz7SmlYR6nGp05byHrJAYM5N8U2aGWJWJI6WvIC2e4TXJgH6GZ6HQ==", "type": "package", - "path": "microsoft.entityframeworkcore.abstractions/8.0.2", + "path": "microsoft.entityframeworkcore.abstractions/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", + "PACKAGE.md", "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll", "lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.xml", - "microsoft.entityframeworkcore.abstractions.8.0.2.nupkg.sha512", + "microsoft.entityframeworkcore.abstractions.9.0.2.nupkg.sha512", "microsoft.entityframeworkcore.abstractions.nuspec" ] }, - "Microsoft.EntityFrameworkCore.Analyzers/8.0.2": { - "sha512": "LI7awhc0fiAKvcUemsqxXUWqzAH9ywTSyM1rpC1un4p5SE1bhr5nRLvyRVbKRzKakmnNNY3to8NPDnoySEkxVw==", + "Microsoft.EntityFrameworkCore.Analyzers/9.0.2": { + "sha512": "w4jzX7XI+L3erVGzbHXpx64A3QaLXxqG3f1vPpGYYZGpxOIHkh7e4iLLD7cq4Ng1vjkwzWl5ZJp0Kj/nHsgFYg==", "type": "package", - "path": "microsoft.entityframeworkcore.analyzers/8.0.2", + "path": "microsoft.entityframeworkcore.analyzers/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll", - "lib/netstandard2.0/_._", - "microsoft.entityframeworkcore.analyzers.8.0.2.nupkg.sha512", + "docs/PACKAGE.md", + "microsoft.entityframeworkcore.analyzers.9.0.2.nupkg.sha512", "microsoft.entityframeworkcore.analyzers.nuspec" ] }, @@ -3814,10 +4894,10 @@ "microsoft.entityframeworkcore.relational.nuspec" ] }, - "Microsoft.Extensions.Caching.Abstractions/8.0.0": { - "sha512": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", + "Microsoft.Extensions.Caching.Abstractions/9.0.2": { + "sha512": "a7QhA25n+BzSM5r5d7JznfyluMBGI7z3qyLlFviZ1Eiqv6DdiK27sLZdP/rpYirBM6UYAKxu5TbmfhIy13GN9A==", "type": "package", - "path": "microsoft.extensions.caching.abstractions/8.0.0", + "path": "microsoft.extensions.caching.abstractions/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -3827,27 +4907,25 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.Caching.Abstractions.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Abstractions.targets", "lib/net462/Microsoft.Extensions.Caching.Abstractions.dll", "lib/net462/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.Caching.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.Caching.Abstractions.xml", "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll", "lib/net8.0/Microsoft.Extensions.Caching.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.Caching.Abstractions.xml", "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.xml", - "microsoft.extensions.caching.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.caching.abstractions.9.0.2.nupkg.sha512", "microsoft.extensions.caching.abstractions.nuspec", "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Caching.Memory/8.0.0": { - "sha512": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", + "Microsoft.Extensions.Caching.Memory/9.0.2": { + "sha512": "AlEfp0DMz8E1h1Exi8LBrUCNmCYcGDfSM4F/uK1D1cYx/R3w0LVvlmjICqxqXTsy7BEZaCf5leRZY2FuPEiFaw==", "type": "package", - "path": "microsoft.extensions.caching.memory/8.0.0", + "path": "microsoft.extensions.caching.memory/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -3857,27 +4935,25 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.Caching.Memory.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Caching.Memory.targets", "lib/net462/Microsoft.Extensions.Caching.Memory.dll", "lib/net462/Microsoft.Extensions.Caching.Memory.xml", - "lib/net6.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net6.0/Microsoft.Extensions.Caching.Memory.xml", - "lib/net7.0/Microsoft.Extensions.Caching.Memory.dll", - "lib/net7.0/Microsoft.Extensions.Caching.Memory.xml", "lib/net8.0/Microsoft.Extensions.Caching.Memory.dll", "lib/net8.0/Microsoft.Extensions.Caching.Memory.xml", + "lib/net9.0/Microsoft.Extensions.Caching.Memory.dll", + "lib/net9.0/Microsoft.Extensions.Caching.Memory.xml", "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll", "lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.xml", - "microsoft.extensions.caching.memory.8.0.0.nupkg.sha512", + "microsoft.extensions.caching.memory.9.0.2.nupkg.sha512", "microsoft.extensions.caching.memory.nuspec", "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Configuration/8.0.0": { - "sha512": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "Microsoft.Extensions.Configuration/9.0.4": { + "sha512": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==", "type": "package", - "path": "microsoft.extensions.configuration/8.0.0", + "path": "microsoft.extensions.configuration/9.0.4", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -3887,27 +4963,25 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.Configuration.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.targets", "lib/net462/Microsoft.Extensions.Configuration.dll", "lib/net462/Microsoft.Extensions.Configuration.xml", - "lib/net6.0/Microsoft.Extensions.Configuration.dll", - "lib/net6.0/Microsoft.Extensions.Configuration.xml", - "lib/net7.0/Microsoft.Extensions.Configuration.dll", - "lib/net7.0/Microsoft.Extensions.Configuration.xml", "lib/net8.0/Microsoft.Extensions.Configuration.dll", "lib/net8.0/Microsoft.Extensions.Configuration.xml", + "lib/net9.0/Microsoft.Extensions.Configuration.dll", + "lib/net9.0/Microsoft.Extensions.Configuration.xml", "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", - "microsoft.extensions.configuration.8.0.0.nupkg.sha512", + "microsoft.extensions.configuration.9.0.4.nupkg.sha512", "microsoft.extensions.configuration.nuspec", "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { - "sha512": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "Microsoft.Extensions.Configuration.Abstractions/9.0.4": { + "sha512": "0LN/DiIKvBrkqp7gkF3qhGIeZk6/B63PthAHjQsxymJfIBcz0kbf4/p/t4lMgggVxZ+flRi5xvTwlpPOoZk8fg==", "type": "package", - "path": "microsoft.extensions.configuration.abstractions/8.0.0", + "path": "microsoft.extensions.configuration.abstractions/9.0.4", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -3917,19 +4991,17 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.Configuration.Abstractions.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.Abstractions.targets", "lib/net462/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/net462/Microsoft.Extensions.Configuration.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.xml", "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.Configuration.Abstractions.xml", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", - "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.configuration.abstractions.9.0.4.nupkg.sha512", "microsoft.extensions.configuration.abstractions.nuspec", "useSharedDesignerContext.txt" ] @@ -4131,10 +5203,10 @@ "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.DependencyInjection/8.0.0": { - "sha512": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "Microsoft.Extensions.DependencyInjection/9.0.2": { + "sha512": "ZffbJrskOZ40JTzcTyKwFHS5eACSWp2bUQBBApIgGV+es8RaTD4OxUG7XxFr3RIPLXtYQ1jQzF2DjKB5fZn7Qg==", "type": "package", - "path": "microsoft.extensions.dependencyinjection/8.0.0", + "path": "microsoft.extensions.dependencyinjection/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4144,29 +5216,27 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", "lib/net462/Microsoft.Extensions.DependencyInjection.dll", "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.xml", "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.xml", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512", + "microsoft.extensions.dependencyinjection.9.0.2.nupkg.sha512", "microsoft.extensions.dependencyinjection.nuspec", "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": { - "sha512": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==", + "Microsoft.Extensions.DependencyInjection.Abstractions/9.0.4": { + "sha512": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==", "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2", + "path": "microsoft.extensions.dependencyinjection.abstractions/9.0.4", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4176,21 +5246,19 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512", + "microsoft.extensions.dependencyinjection.abstractions.9.0.4.nupkg.sha512", "microsoft.extensions.dependencyinjection.abstractions.nuspec", "useSharedDesignerContext.txt" ] @@ -4465,10 +5533,10 @@ "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Logging/8.0.0": { - "sha512": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "Microsoft.Extensions.Logging/9.0.2": { + "sha512": "loV/0UNpt2bD+6kCDzFALVE63CDtqzPeC0LAetkdhiEr/tTNbvOlQ7CBResH7BQBd3cikrwiBfaHdyHMFUlc2g==", "type": "package", - "path": "microsoft.extensions.logging/8.0.0", + "path": "microsoft.extensions.logging/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4478,29 +5546,27 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.Logging.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", "lib/net462/Microsoft.Extensions.Logging.dll", "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net6.0/Microsoft.Extensions.Logging.dll", - "lib/net6.0/Microsoft.Extensions.Logging.xml", - "lib/net7.0/Microsoft.Extensions.Logging.dll", - "lib/net7.0/Microsoft.Extensions.Logging.xml", "lib/net8.0/Microsoft.Extensions.Logging.dll", "lib/net8.0/Microsoft.Extensions.Logging.xml", + "lib/net9.0/Microsoft.Extensions.Logging.dll", + "lib/net9.0/Microsoft.Extensions.Logging.xml", "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.8.0.0.nupkg.sha512", + "microsoft.extensions.logging.9.0.2.nupkg.sha512", "microsoft.extensions.logging.nuspec", "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Logging.Abstractions/8.0.2": { - "sha512": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", + "Microsoft.Extensions.Logging.Abstractions/9.0.2": { + "sha512": "dV9s2Lamc8jSaqhl2BQSPn/AryDIH2sSbQUyLitLXV0ROmsb+SROnn2cH939JFbsNrnf3mIM3GNRKT7P0ldwLg==", "type": "package", - "path": "microsoft.extensions.logging.abstractions/8.0.2", + "path": "microsoft.extensions.logging.abstractions/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4552,20 +5618,18 @@ "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net8.0/Microsoft.Extensions.Logging.Abstractions.targets", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml", "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net9.0/Microsoft.Extensions.Logging.Abstractions.xml", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512", + "microsoft.extensions.logging.abstractions.9.0.2.nupkg.sha512", "microsoft.extensions.logging.abstractions.nuspec", "useSharedDesignerContext.txt" ] @@ -4717,10 +5781,29 @@ "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Options/8.0.0": { - "sha512": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "Microsoft.Extensions.ObjectPool/6.0.3": { + "sha512": "IbQUEZr/LxxpPxkXDmKaemMeQNPjdHfk87HtTsI18a3RVgad0NOJSRaJ20hcesqL45PLcpQHR8xrPP7wZKbFQQ==", "type": "package", - "path": "microsoft.extensions.options/8.0.0", + "path": "microsoft.extensions.objectpool/6.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/Microsoft.Extensions.ObjectPool.dll", + "lib/net461/Microsoft.Extensions.ObjectPool.xml", + "lib/net6.0/Microsoft.Extensions.ObjectPool.dll", + "lib/net6.0/Microsoft.Extensions.ObjectPool.xml", + "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll", + "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.xml", + "microsoft.extensions.objectpool.6.0.3.nupkg.sha512", + "microsoft.extensions.objectpool.nuspec" + ] + }, + "Microsoft.Extensions.Options/9.0.4": { + "sha512": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "type": "package", + "path": "microsoft.extensions.options/9.0.4", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4744,22 +5827,20 @@ "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", "buildTransitive/net461/Microsoft.Extensions.Options.targets", "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net6.0/Microsoft.Extensions.Options.targets", + "buildTransitive/net8.0/Microsoft.Extensions.Options.targets", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", "lib/net462/Microsoft.Extensions.Options.dll", "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net6.0/Microsoft.Extensions.Options.dll", - "lib/net6.0/Microsoft.Extensions.Options.xml", - "lib/net7.0/Microsoft.Extensions.Options.dll", - "lib/net7.0/Microsoft.Extensions.Options.xml", "lib/net8.0/Microsoft.Extensions.Options.dll", "lib/net8.0/Microsoft.Extensions.Options.xml", + "lib/net9.0/Microsoft.Extensions.Options.dll", + "lib/net9.0/Microsoft.Extensions.Options.xml", "lib/netstandard2.0/Microsoft.Extensions.Options.dll", "lib/netstandard2.0/Microsoft.Extensions.Options.xml", "lib/netstandard2.1/Microsoft.Extensions.Options.dll", "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.8.0.0.nupkg.sha512", + "microsoft.extensions.options.9.0.4.nupkg.sha512", "microsoft.extensions.options.nuspec", "useSharedDesignerContext.txt" ] @@ -4794,10 +5875,10 @@ "useSharedDesignerContext.txt" ] }, - "Microsoft.Extensions.Primitives/8.0.0": { - "sha512": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "Microsoft.Extensions.Primitives/9.0.4": { + "sha512": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==", "type": "package", - "path": "microsoft.extensions.primitives/8.0.0", + "path": "microsoft.extensions.primitives/9.0.4", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4807,27 +5888,25 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", "lib/net462/Microsoft.Extensions.Primitives.dll", "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net6.0/Microsoft.Extensions.Primitives.dll", - "lib/net6.0/Microsoft.Extensions.Primitives.xml", - "lib/net7.0/Microsoft.Extensions.Primitives.dll", - "lib/net7.0/Microsoft.Extensions.Primitives.xml", "lib/net8.0/Microsoft.Extensions.Primitives.dll", "lib/net8.0/Microsoft.Extensions.Primitives.xml", + "lib/net9.0/Microsoft.Extensions.Primitives.dll", + "lib/net9.0/Microsoft.Extensions.Primitives.xml", "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.8.0.0.nupkg.sha512", + "microsoft.extensions.primitives.9.0.4.nupkg.sha512", "microsoft.extensions.primitives.nuspec", "useSharedDesignerContext.txt" ] }, - "Microsoft.IdentityModel.Abstractions/8.8.0": { - "sha512": "0lKw+f3vkmV9t3PLe6sY3xPrYrHYiMRFxuOse5CMkKPxhQYiabpfJsuk6wX2RrVQ86Dn+t/8poHpH0nbp6sFvA==", + "Microsoft.IdentityModel.Abstractions/8.9.0": { + "sha512": "b/87S+lb86U7Ns7xgTKnqql6XGNr8hBE+k0rj5sRWwXeJe6uA+3mSjvpZ9GoQo3cB9zlwzcbGBU8KM44qX0t1g==", "type": "package", - "path": "microsoft.identitymodel.abstractions/8.8.0", + "path": "microsoft.identitymodel.abstractions/8.9.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4844,14 +5923,14 @@ "lib/net9.0/Microsoft.IdentityModel.Abstractions.xml", "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll", "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.xml", - "microsoft.identitymodel.abstractions.8.8.0.nupkg.sha512", + "microsoft.identitymodel.abstractions.8.9.0.nupkg.sha512", "microsoft.identitymodel.abstractions.nuspec" ] }, - "Microsoft.IdentityModel.JsonWebTokens/8.8.0": { - "sha512": "lepOkZZTMfJCPSnWITXxV+4Wxb54g+9oIybs9YovlOzZWuR1i2DOpzaDgSe+piDJaGtnSrcUlcB9fZ5Swur7Uw==", + "Microsoft.IdentityModel.JsonWebTokens/8.9.0": { + "sha512": "QcNC57hJLc6LIcy2PTYlD8iRBQBm6bqPKbCjsRYWlp7QTyJisF0ImUWaa3mx6wWaS1upwYneYVPiIiNSlAy16g==", "type": "package", - "path": "microsoft.identitymodel.jsonwebtokens/8.8.0", + "path": "microsoft.identitymodel.jsonwebtokens/8.9.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4868,14 +5947,14 @@ "lib/net9.0/Microsoft.IdentityModel.JsonWebTokens.xml", "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.dll", "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.xml", - "microsoft.identitymodel.jsonwebtokens.8.8.0.nupkg.sha512", + "microsoft.identitymodel.jsonwebtokens.8.9.0.nupkg.sha512", "microsoft.identitymodel.jsonwebtokens.nuspec" ] }, - "Microsoft.IdentityModel.Logging/8.8.0": { - "sha512": "sUyoxzg/WBZobbFLJK8loT9IILKtS9ePmWu5B11ogQqhSHppE6SRZKw0fhI6Fd16X6ey52cbbWc2rvMBC98EQA==", + "Microsoft.IdentityModel.Logging/8.9.0": { + "sha512": "rswvH4ZANbFsJYEn+PGEOj7nkkBRjnsb7LcYGAS16VUJpSeKULLeYSy/7SK6jLO1WTT12xqdeL4mj3dYT7GdoQ==", "type": "package", - "path": "microsoft.identitymodel.logging/8.8.0", + "path": "microsoft.identitymodel.logging/8.9.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4892,7 +5971,7 @@ "lib/net9.0/Microsoft.IdentityModel.Logging.xml", "lib/netstandard2.0/Microsoft.IdentityModel.Logging.dll", "lib/netstandard2.0/Microsoft.IdentityModel.Logging.xml", - "microsoft.identitymodel.logging.8.8.0.nupkg.sha512", + "microsoft.identitymodel.logging.8.9.0.nupkg.sha512", "microsoft.identitymodel.logging.nuspec" ] }, @@ -4942,10 +6021,10 @@ "microsoft.identitymodel.protocols.openidconnect.nuspec" ] }, - "Microsoft.IdentityModel.Tokens/8.8.0": { - "sha512": "09hnbUJh/18gUmu5nCVFMvyzAFC4l1qyc4bwSJaKzUBqHN7aNDwmSx8dE3/MMJImbvnKq9rEtkkgnrS/OUBtjA==", + "Microsoft.IdentityModel.Tokens/8.9.0": { + "sha512": "qK6kW5qZvDj7E5RLWQ9gzJxQe5GUz7+7bXrLQQydSDF9hTf5Ip2qHuAQW3Fg9GND6jkjTr7IXAZFmBHadNQi4Q==", "type": "package", - "path": "microsoft.identitymodel.tokens/8.8.0", + "path": "microsoft.identitymodel.tokens/8.9.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -4962,7 +6041,7 @@ "lib/net9.0/Microsoft.IdentityModel.Tokens.xml", "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.dll", "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.xml", - "microsoft.identitymodel.tokens.8.8.0.nupkg.sha512", + "microsoft.identitymodel.tokens.8.9.0.nupkg.sha512", "microsoft.identitymodel.tokens.nuspec" ] }, @@ -4988,22 +6067,44 @@ "microsoft.net.test.sdk.nuspec" ] }, - "Microsoft.NETCore.Platforms/5.0.0": { - "sha512": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==", + "Microsoft.OData.Core/8.2.2": { + "sha512": "VY3sZzBOxePvRuCeBlEiJ2LNxjr8ReOKj6YWXi5i8vG3TLWo+CmIc9fiE8WDoe90NcCaBnwK6Ub2fWnpNEbLxA==", "type": "package", - "path": "microsoft.netcore.platforms/5.0.0", + "path": "microsoft.odata.core/8.2.2", "files": [ ".nupkg.metadata", ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/netstandard1.0/_._", - "microsoft.netcore.platforms.5.0.0.nupkg.sha512", - "microsoft.netcore.platforms.nuspec", - "runtime.json", - "useSharedDesignerContext.txt", - "version.txt" + "lib/net8.0/Microsoft.OData.Core.dll", + "lib/net8.0/Microsoft.OData.Core.xml", + "microsoft.odata.core.8.2.2.nupkg.sha512", + "microsoft.odata.core.nuspec" + ] + }, + "Microsoft.OData.Edm/8.2.2": { + "sha512": "cHMsoV059EPNLD+SJFxIM8rKLUA3kKifflfUQy+7hWKZpmw+YhLi7qeWSSA9UDRVd0sqApFU8gdqHjordJoTIg==", + "type": "package", + "path": "microsoft.odata.edm/8.2.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net8.0/Microsoft.OData.Edm.dll", + "lib/net8.0/Microsoft.OData.Edm.xml", + "microsoft.odata.edm.8.2.2.nupkg.sha512", + "microsoft.odata.edm.nuspec" + ] + }, + "Microsoft.OData.ModelBuilder/2.0.0": { + "sha512": "QzySAMGhLCMyLNHSTIYKFjJXetoDeGkRS/7JEjm7eMJlyu1Qv4MfL1CXQFg2uijizNu2jQojT0mdCpawXbyv8Q==", + "type": "package", + "path": "microsoft.odata.modelbuilder/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "images/odata.png", + "lib/net8.0/Microsoft.OData.ModelBuilder.dll", + "lib/net8.0/Microsoft.OData.ModelBuilder.xml", + "microsoft.odata.modelbuilder.2.0.0.nupkg.sha512", + "microsoft.odata.modelbuilder.nuspec" ] }, "Microsoft.OpenApi/1.6.22": { @@ -5021,6 +6122,19 @@ "microsoft.openapi.nuspec" ] }, + "Microsoft.Spatial/8.2.2": { + "sha512": "iG0pF7o7bR9/J+WcSNGEW0DzewO8Te/T+5FJ9EIuXcPkVE96cqc6Cf57ygqlQZj5jmf+D/gOtBJjPc4iyeI0Aw==", + "type": "package", + "path": "microsoft.spatial/8.2.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net8.0/Microsoft.Spatial.dll", + "lib/net8.0/Microsoft.Spatial.xml", + "microsoft.spatial.8.2.2.nupkg.sha512", + "microsoft.spatial.nuspec" + ] + }, "Microsoft.TestPlatform.ObjectModel/17.12.0": { "sha512": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", "type": "package", @@ -5233,6 +6347,35 @@ "version.txt" ] }, + "Microsoft.Win32.SystemEvents/6.0.0": { + "sha512": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==", + "type": "package", + "path": "microsoft.win32.systemevents/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/Microsoft.Win32.SystemEvents.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/Microsoft.Win32.SystemEvents.dll", + "lib/net461/Microsoft.Win32.SystemEvents.xml", + "lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "lib/net6.0/Microsoft.Win32.SystemEvents.xml", + "lib/netcoreapp3.1/Microsoft.Win32.SystemEvents.dll", + "lib/netcoreapp3.1/Microsoft.Win32.SystemEvents.xml", + "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll", + "lib/netstandard2.0/Microsoft.Win32.SystemEvents.xml", + "microsoft.win32.systemevents.6.0.0.nupkg.sha512", + "microsoft.win32.systemevents.nuspec", + "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.xml", + "runtimes/win/lib/netcoreapp3.1/Microsoft.Win32.SystemEvents.dll", + "runtimes/win/lib/netcoreapp3.1/Microsoft.Win32.SystemEvents.xml", + "useSharedDesignerContext.txt" + ] + }, "MongoDB.Analyzer/1.5.0": { "sha512": "ujrUe6NeLGW9q8ABseYY/NFx7pc1G/LshtVfLMONV02+fEy0jUDsXLHU7YvuARjJhJI7Mgz88tfvCncccUmerw==", "type": "package", @@ -5291,6 +6434,21 @@ "packageIcon.png" ] }, + "Mono.Reflection/2.0.0": { + "sha512": "gipqt3dO1NsgM9wfUsQeNVLYmSskDfaN+muNQHLJYkCuYxx2bIp6gAA8j2Rp+Ey6YNHloZv+BJY56r9fl3tfew==", + "type": "package", + "path": "mono.reflection/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net40/Mono.Reflection.dll", + "lib/net40/Mono.Reflection.pdb", + "lib/netstandard2.0/Mono.Reflection.dll", + "lib/netstandard2.0/Mono.Reflection.pdb", + "mono.reflection.2.0.0.nupkg.sha512", + "mono.reflection.nuspec" + ] + }, "Moq/4.20.72": { "sha512": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", "type": "package", @@ -5690,6 +6848,69 @@ "rabbitmq.client.nuspec" ] }, + "runtime.native.System.Data.SqlClient.sni/4.7.0": { + "sha512": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "type": "package", + "path": "runtime.native.system.data.sqlclient.sni/4.7.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512", + "runtime.native.system.data.sqlclient.sni.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0": { + "sha512": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==", + "type": "package", + "path": "runtime.win-arm64.runtime.native.system.data.sqlclient.sni/4.4.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "runtime.win-arm64.runtime.native.system.data.sqlclient.sni.nuspec", + "runtimes/win-arm64/native/sni.dll", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0": { + "sha512": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==", + "type": "package", + "path": "runtime.win-x64.runtime.native.system.data.sqlclient.sni/4.4.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "runtime.win-x64.runtime.native.system.data.sqlclient.sni.nuspec", + "runtimes/win-x64/native/sni.dll", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0": { + "sha512": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==", + "type": "package", + "path": "runtime.win-x86.runtime.native.system.data.sqlclient.sni/4.4.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "runtime.win-x86.runtime.native.system.data.sqlclient.sni.nuspec", + "runtimes/win-x86/native/sni.dll", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, "SharpCompress/0.30.1": { "sha512": "XqD4TpfyYGa7QTPzaGlMVbcecKnXy4YmYLDWrU+JIj7IuRNl7DH2END+Ll7ekWIY8o3dAMWLFDE1xdhfIWD1nw==", "type": "package", @@ -5726,10 +6947,10 @@ "snappier.nuspec" ] }, - "SSH.NET/2024.2.0": { - "sha512": "9r+4UF2P51lTztpd+H7SJywk7WgmlWB//Cm2o96c6uGVZU5r58ys2/cD9pCgTk0zCdSkfflWL1WtqQ9I4IVO9Q==", + "SSH.NET/2025.0.0": { + "sha512": "AKYbB+q2zFkNQbBFx5gXdv+Wje0baBtADQ35WnMKi4bg1ka74wTQtWoPd+fOWcydohdfsD0nfT8ErMOAPxtSfA==", "type": "package", - "path": "ssh.net/2024.2.0", + "path": "ssh.net/2025.0.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -5737,17 +6958,15 @@ "SS-NET-icon-h500.png", "lib/net462/Renci.SshNet.dll", "lib/net462/Renci.SshNet.xml", - "lib/net6.0/Renci.SshNet.dll", - "lib/net6.0/Renci.SshNet.xml", - "lib/net7.0/Renci.SshNet.dll", - "lib/net7.0/Renci.SshNet.xml", "lib/net8.0/Renci.SshNet.dll", "lib/net8.0/Renci.SshNet.xml", + "lib/net9.0/Renci.SshNet.dll", + "lib/net9.0/Renci.SshNet.xml", "lib/netstandard2.0/Renci.SshNet.dll", "lib/netstandard2.0/Renci.SshNet.xml", "lib/netstandard2.1/Renci.SshNet.dll", "lib/netstandard2.1/Renci.SshNet.xml", - "ssh.net.2024.2.0.nupkg.sha512", + "ssh.net.2025.0.0.nupkg.sha512", "ssh.net.nuspec" ] }, @@ -5948,6 +7167,29 @@ "version.txt" ] }, + "System.CodeDom/6.0.0": { + "sha512": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==", + "type": "package", + "path": "system.codedom/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.CodeDom.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.CodeDom.dll", + "lib/net461/System.CodeDom.xml", + "lib/net6.0/System.CodeDom.dll", + "lib/net6.0/System.CodeDom.xml", + "lib/netstandard2.0/System.CodeDom.dll", + "lib/netstandard2.0/System.CodeDom.xml", + "system.codedom.6.0.0.nupkg.sha512", + "system.codedom.nuspec", + "useSharedDesignerContext.txt" + ] + }, "System.Collections.Immutable/1.7.1": { "sha512": "B43Zsz5EfMwyEbnObwRxW5u85fzJma3lrDeGcSAV1qkhSRTNY5uXAByTn9h9ddNdhM+4/YoLc/CI43umjwIl9Q==", "type": "package", @@ -5974,10 +7216,211 @@ "version.txt" ] }, - "System.Diagnostics.DiagnosticSource/8.0.0": { - "sha512": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", + "System.ComponentModel.Annotations/5.0.0": { + "sha512": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==", "type": "package", - "path": "system.diagnostics.diagnosticsource/8.0.0", + "path": "system.componentmodel.annotations/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net461/System.ComponentModel.Annotations.dll", + "lib/netcore50/System.ComponentModel.Annotations.dll", + "lib/netstandard1.4/System.ComponentModel.Annotations.dll", + "lib/netstandard2.0/System.ComponentModel.Annotations.dll", + "lib/netstandard2.1/System.ComponentModel.Annotations.dll", + "lib/netstandard2.1/System.ComponentModel.Annotations.xml", + "lib/portable-net45+win8/_._", + "lib/win8/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net461/System.ComponentModel.Annotations.dll", + "ref/net461/System.ComponentModel.Annotations.xml", + "ref/netcore50/System.ComponentModel.Annotations.dll", + "ref/netcore50/System.ComponentModel.Annotations.xml", + "ref/netcore50/de/System.ComponentModel.Annotations.xml", + "ref/netcore50/es/System.ComponentModel.Annotations.xml", + "ref/netcore50/fr/System.ComponentModel.Annotations.xml", + "ref/netcore50/it/System.ComponentModel.Annotations.xml", + "ref/netcore50/ja/System.ComponentModel.Annotations.xml", + "ref/netcore50/ko/System.ComponentModel.Annotations.xml", + "ref/netcore50/ru/System.ComponentModel.Annotations.xml", + "ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml", + "ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/System.ComponentModel.Annotations.dll", + "ref/netstandard1.1/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/de/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/es/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/it/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml", + "ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/System.ComponentModel.Annotations.dll", + "ref/netstandard1.3/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/de/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/es/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/it/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml", + "ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/System.ComponentModel.Annotations.dll", + "ref/netstandard1.4/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/de/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/es/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/it/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml", + "ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml", + "ref/netstandard2.0/System.ComponentModel.Annotations.dll", + "ref/netstandard2.0/System.ComponentModel.Annotations.xml", + "ref/netstandard2.1/System.ComponentModel.Annotations.dll", + "ref/netstandard2.1/System.ComponentModel.Annotations.xml", + "ref/portable-net45+win8/_._", + "ref/win8/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.componentmodel.annotations.5.0.0.nupkg.sha512", + "system.componentmodel.annotations.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Configuration.ConfigurationManager/6.0.1": { + "sha512": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "type": "package", + "path": "system.configuration.configurationmanager/6.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Configuration.ConfigurationManager.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Configuration.ConfigurationManager.dll", + "lib/net461/System.Configuration.ConfigurationManager.xml", + "lib/net6.0/System.Configuration.ConfigurationManager.dll", + "lib/net6.0/System.Configuration.ConfigurationManager.xml", + "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll", + "lib/netstandard2.0/System.Configuration.ConfigurationManager.xml", + "runtimes/win/lib/net461/System.Configuration.ConfigurationManager.dll", + "runtimes/win/lib/net461/System.Configuration.ConfigurationManager.xml", + "system.configuration.configurationmanager.6.0.1.nupkg.sha512", + "system.configuration.configurationmanager.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Data.SqlClient/4.8.6": { + "sha512": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "type": "package", + "path": "system.data.sqlclient/4.8.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net451/System.Data.SqlClient.dll", + "lib/net46/System.Data.SqlClient.dll", + "lib/net461/System.Data.SqlClient.dll", + "lib/net461/System.Data.SqlClient.xml", + "lib/netcoreapp2.1/System.Data.SqlClient.dll", + "lib/netcoreapp2.1/System.Data.SqlClient.xml", + "lib/netstandard1.2/System.Data.SqlClient.dll", + "lib/netstandard1.2/System.Data.SqlClient.xml", + "lib/netstandard1.3/System.Data.SqlClient.dll", + "lib/netstandard1.3/System.Data.SqlClient.xml", + "lib/netstandard2.0/System.Data.SqlClient.dll", + "lib/netstandard2.0/System.Data.SqlClient.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net451/System.Data.SqlClient.dll", + "ref/net46/System.Data.SqlClient.dll", + "ref/net461/System.Data.SqlClient.dll", + "ref/net461/System.Data.SqlClient.xml", + "ref/netcoreapp2.1/System.Data.SqlClient.dll", + "ref/netcoreapp2.1/System.Data.SqlClient.xml", + "ref/netstandard1.2/System.Data.SqlClient.dll", + "ref/netstandard1.2/System.Data.SqlClient.xml", + "ref/netstandard1.2/de/System.Data.SqlClient.xml", + "ref/netstandard1.2/es/System.Data.SqlClient.xml", + "ref/netstandard1.2/fr/System.Data.SqlClient.xml", + "ref/netstandard1.2/it/System.Data.SqlClient.xml", + "ref/netstandard1.2/ja/System.Data.SqlClient.xml", + "ref/netstandard1.2/ko/System.Data.SqlClient.xml", + "ref/netstandard1.2/ru/System.Data.SqlClient.xml", + "ref/netstandard1.2/zh-hans/System.Data.SqlClient.xml", + "ref/netstandard1.2/zh-hant/System.Data.SqlClient.xml", + "ref/netstandard1.3/System.Data.SqlClient.dll", + "ref/netstandard1.3/System.Data.SqlClient.xml", + "ref/netstandard1.3/de/System.Data.SqlClient.xml", + "ref/netstandard1.3/es/System.Data.SqlClient.xml", + "ref/netstandard1.3/fr/System.Data.SqlClient.xml", + "ref/netstandard1.3/it/System.Data.SqlClient.xml", + "ref/netstandard1.3/ja/System.Data.SqlClient.xml", + "ref/netstandard1.3/ko/System.Data.SqlClient.xml", + "ref/netstandard1.3/ru/System.Data.SqlClient.xml", + "ref/netstandard1.3/zh-hans/System.Data.SqlClient.xml", + "ref/netstandard1.3/zh-hant/System.Data.SqlClient.xml", + "ref/netstandard2.0/System.Data.SqlClient.dll", + "ref/netstandard2.0/System.Data.SqlClient.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/unix/lib/netcoreapp2.1/System.Data.SqlClient.dll", + "runtimes/unix/lib/netcoreapp2.1/System.Data.SqlClient.xml", + "runtimes/unix/lib/netstandard1.3/System.Data.SqlClient.dll", + "runtimes/unix/lib/netstandard2.0/System.Data.SqlClient.dll", + "runtimes/unix/lib/netstandard2.0/System.Data.SqlClient.xml", + "runtimes/win/lib/net451/System.Data.SqlClient.dll", + "runtimes/win/lib/net46/System.Data.SqlClient.dll", + "runtimes/win/lib/net461/System.Data.SqlClient.dll", + "runtimes/win/lib/net461/System.Data.SqlClient.xml", + "runtimes/win/lib/netcoreapp2.1/System.Data.SqlClient.dll", + "runtimes/win/lib/netcoreapp2.1/System.Data.SqlClient.xml", + "runtimes/win/lib/netstandard1.3/System.Data.SqlClient.dll", + "runtimes/win/lib/netstandard2.0/System.Data.SqlClient.dll", + "runtimes/win/lib/netstandard2.0/System.Data.SqlClient.xml", + "runtimes/win/lib/uap10.0.16299/System.Data.SqlClient.dll", + "runtimes/win/lib/uap10.0.16299/System.Data.SqlClient.xml", + "system.data.sqlclient.4.8.6.nupkg.sha512", + "system.data.sqlclient.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Diagnostics.DiagnosticSource/9.0.2": { + "sha512": "z5CMQNLzk8UKnTEHRKb4nq03CCDWBMEF2gfP3oPKZn4F8wip6LFZCP5rF90DREHqdNddScIGAfszXJSjh4drSw==", + "type": "package", + "path": "system.diagnostics.diagnosticsource/9.0.2", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -5986,19 +7429,22 @@ "THIRD-PARTY-NOTICES.TXT", "buildTransitive/net461/System.Diagnostics.DiagnosticSource.targets", "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", + "buildTransitive/net8.0/_._", "buildTransitive/netcoreapp2.0/System.Diagnostics.DiagnosticSource.targets", + "content/ILLink/ILLink.Descriptors.LibraryBuild.xml", + "contentFiles/any/net462/ILLink/ILLink.Descriptors.LibraryBuild.xml", + "contentFiles/any/net8.0/ILLink/ILLink.Descriptors.LibraryBuild.xml", + "contentFiles/any/net9.0/ILLink/ILLink.Descriptors.LibraryBuild.xml", + "contentFiles/any/netstandard2.0/ILLink/ILLink.Descriptors.LibraryBuild.xml", "lib/net462/System.Diagnostics.DiagnosticSource.dll", "lib/net462/System.Diagnostics.DiagnosticSource.xml", - "lib/net6.0/System.Diagnostics.DiagnosticSource.dll", - "lib/net6.0/System.Diagnostics.DiagnosticSource.xml", - "lib/net7.0/System.Diagnostics.DiagnosticSource.dll", - "lib/net7.0/System.Diagnostics.DiagnosticSource.xml", "lib/net8.0/System.Diagnostics.DiagnosticSource.dll", "lib/net8.0/System.Diagnostics.DiagnosticSource.xml", + "lib/net9.0/System.Diagnostics.DiagnosticSource.dll", + "lib/net9.0/System.Diagnostics.DiagnosticSource.xml", "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.dll", "lib/netstandard2.0/System.Diagnostics.DiagnosticSource.xml", - "system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512", + "system.diagnostics.diagnosticsource.9.0.2.nupkg.sha512", "system.diagnostics.diagnosticsource.nuspec", "useSharedDesignerContext.txt" ] @@ -6042,10 +7488,49 @@ "useSharedDesignerContext.txt" ] }, - "System.IdentityModel.Tokens.Jwt/8.8.0": { - "sha512": "/oIQ5jhVxpzutFOPYIxmvkVMCLLDwpN0CLcXjyxPflVRQGZRYi5x2IqHeJw+xJ2k2HUPmeTaM18La5wDbhJcQA==", + "System.Drawing.Common/6.0.0": { + "sha512": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", "type": "package", - "path": "system.identitymodel.tokens.jwt/8.8.0", + "path": "system.drawing.common/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Drawing.Common.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net461/System.Drawing.Common.dll", + "lib/net461/System.Drawing.Common.xml", + "lib/net6.0/System.Drawing.Common.dll", + "lib/net6.0/System.Drawing.Common.xml", + "lib/netcoreapp3.1/System.Drawing.Common.dll", + "lib/netcoreapp3.1/System.Drawing.Common.xml", + "lib/netstandard2.0/System.Drawing.Common.dll", + "lib/netstandard2.0/System.Drawing.Common.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "runtimes/unix/lib/net6.0/System.Drawing.Common.xml", + "runtimes/unix/lib/netcoreapp3.1/System.Drawing.Common.dll", + "runtimes/unix/lib/netcoreapp3.1/System.Drawing.Common.xml", + "runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "runtimes/win/lib/net6.0/System.Drawing.Common.xml", + "runtimes/win/lib/netcoreapp3.1/System.Drawing.Common.dll", + "runtimes/win/lib/netcoreapp3.1/System.Drawing.Common.xml", + "system.drawing.common.6.0.0.nupkg.sha512", + "system.drawing.common.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.IdentityModel.Tokens.Jwt/8.9.0": { + "sha512": "7Pu9UjF1+so0s8zgzcIxSxbRQoiM2DMdwazVGmNptX3O6gDfMyeWZBd/Zn6VueDteN0ZTHw2acsf6+mAe8UpMw==", + "type": "package", + "path": "system.identitymodel.tokens.jwt/8.9.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -6062,7 +7547,7 @@ "lib/net9.0/System.IdentityModel.Tokens.Jwt.xml", "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.dll", "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.xml", - "system.identitymodel.tokens.jwt.8.8.0.nupkg.sha512", + "system.identitymodel.tokens.jwt.8.9.0.nupkg.sha512", "system.identitymodel.tokens.jwt.nuspec" ] }, @@ -6146,6 +7631,60 @@ "system.reactive.nuspec" ] }, + "System.Reflection.Emit/4.7.0": { + "sha512": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==", + "type": "package", + "path": "system.reflection.emit/4.7.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.dll", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.1/System.Reflection.Emit.dll", + "lib/netstandard1.1/System.Reflection.Emit.xml", + "lib/netstandard1.3/System.Reflection.Emit.dll", + "lib/netstandard2.0/System.Reflection.Emit.dll", + "lib/netstandard2.0/System.Reflection.Emit.xml", + "lib/netstandard2.1/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcoreapp2.0/_._", + "ref/netstandard1.1/System.Reflection.Emit.dll", + "ref/netstandard1.1/System.Reflection.Emit.xml", + "ref/netstandard1.1/de/System.Reflection.Emit.xml", + "ref/netstandard1.1/es/System.Reflection.Emit.xml", + "ref/netstandard1.1/fr/System.Reflection.Emit.xml", + "ref/netstandard1.1/it/System.Reflection.Emit.xml", + "ref/netstandard1.1/ja/System.Reflection.Emit.xml", + "ref/netstandard1.1/ko/System.Reflection.Emit.xml", + "ref/netstandard1.1/ru/System.Reflection.Emit.xml", + "ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml", + "ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml", + "ref/netstandard2.0/System.Reflection.Emit.dll", + "ref/netstandard2.0/System.Reflection.Emit.xml", + "ref/netstandard2.1/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/aot/lib/netcore50/System.Reflection.Emit.dll", + "runtimes/aot/lib/netcore50/System.Reflection.Emit.xml", + "system.reflection.emit.4.7.0.nupkg.sha512", + "system.reflection.emit.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, "System.Reflection.Metadata/1.6.0": { "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", "type": "package", @@ -6199,51 +7738,97 @@ "version.txt" ] }, - "System.Security.AccessControl/5.0.0": { - "sha512": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "System.Security.AccessControl/6.0.0": { + "sha512": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==", "type": "package", - "path": "system.security.accesscontrol/5.0.0", + "path": "system.security.accesscontrol/6.0.0", "files": [ ".nupkg.metadata", ".signature.p7s", "Icon.png", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", - "lib/net46/System.Security.AccessControl.dll", + "buildTransitive/netcoreapp2.0/System.Security.AccessControl.targets", + "buildTransitive/netcoreapp3.1/_._", "lib/net461/System.Security.AccessControl.dll", "lib/net461/System.Security.AccessControl.xml", - "lib/netstandard1.3/System.Security.AccessControl.dll", + "lib/net6.0/System.Security.AccessControl.dll", + "lib/net6.0/System.Security.AccessControl.xml", "lib/netstandard2.0/System.Security.AccessControl.dll", "lib/netstandard2.0/System.Security.AccessControl.xml", - "lib/uap10.0.16299/_._", - "ref/net46/System.Security.AccessControl.dll", - "ref/net461/System.Security.AccessControl.dll", - "ref/net461/System.Security.AccessControl.xml", - "ref/netstandard1.3/System.Security.AccessControl.dll", - "ref/netstandard1.3/System.Security.AccessControl.xml", - "ref/netstandard1.3/de/System.Security.AccessControl.xml", - "ref/netstandard1.3/es/System.Security.AccessControl.xml", - "ref/netstandard1.3/fr/System.Security.AccessControl.xml", - "ref/netstandard1.3/it/System.Security.AccessControl.xml", - "ref/netstandard1.3/ja/System.Security.AccessControl.xml", - "ref/netstandard1.3/ko/System.Security.AccessControl.xml", - "ref/netstandard1.3/ru/System.Security.AccessControl.xml", - "ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml", - "ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml", - "ref/netstandard2.0/System.Security.AccessControl.dll", - "ref/netstandard2.0/System.Security.AccessControl.xml", - "ref/uap10.0.16299/_._", - "runtimes/win/lib/net46/System.Security.AccessControl.dll", "runtimes/win/lib/net461/System.Security.AccessControl.dll", "runtimes/win/lib/net461/System.Security.AccessControl.xml", - "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll", - "runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.xml", - "runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll", - "runtimes/win/lib/uap10.0.16299/_._", - "system.security.accesscontrol.5.0.0.nupkg.sha512", + "runtimes/win/lib/net6.0/System.Security.AccessControl.dll", + "runtimes/win/lib/net6.0/System.Security.AccessControl.xml", + "runtimes/win/lib/netstandard2.0/System.Security.AccessControl.dll", + "runtimes/win/lib/netstandard2.0/System.Security.AccessControl.xml", + "system.security.accesscontrol.6.0.0.nupkg.sha512", "system.security.accesscontrol.nuspec", - "useSharedDesignerContext.txt", - "version.txt" + "useSharedDesignerContext.txt" + ] + }, + "System.Security.Cryptography.ProtectedData/6.0.0": { + "sha512": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==", + "type": "package", + "path": "system.security.cryptography.protecteddata/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Security.Cryptography.ProtectedData.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net461/System.Security.Cryptography.ProtectedData.dll", + "lib/net461/System.Security.Cryptography.ProtectedData.xml", + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net6.0/System.Security.Cryptography.ProtectedData.xml", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "runtimes/win/lib/net461/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.ProtectedData.xml", + "runtimes/win/lib/net6.0/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/net6.0/System.Security.Cryptography.ProtectedData.xml", + "runtimes/win/lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "runtimes/win/lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "system.security.cryptography.protecteddata.6.0.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Security.Permissions/6.0.0": { + "sha512": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "type": "package", + "path": "system.security.permissions/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Security.Permissions.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Security.Permissions.dll", + "lib/net461/System.Security.Permissions.xml", + "lib/net5.0/System.Security.Permissions.dll", + "lib/net5.0/System.Security.Permissions.xml", + "lib/net6.0/System.Security.Permissions.dll", + "lib/net6.0/System.Security.Permissions.xml", + "lib/netcoreapp3.1/System.Security.Permissions.dll", + "lib/netcoreapp3.1/System.Security.Permissions.xml", + "lib/netstandard2.0/System.Security.Permissions.dll", + "lib/netstandard2.0/System.Security.Permissions.xml", + "runtimes/win/lib/net461/System.Security.Permissions.dll", + "runtimes/win/lib/net461/System.Security.Permissions.xml", + "system.security.permissions.6.0.0.nupkg.sha512", + "system.security.permissions.nuspec", + "useSharedDesignerContext.txt" ] }, "System.Security.Principal.Windows/5.0.0": { @@ -6438,6 +8023,29 @@ "useSharedDesignerContext.txt" ] }, + "System.Windows.Extensions/6.0.0": { + "sha512": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "type": "package", + "path": "system.windows.extensions/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net6.0/System.Windows.Extensions.dll", + "lib/net6.0/System.Windows.Extensions.xml", + "lib/netcoreapp3.1/System.Windows.Extensions.dll", + "lib/netcoreapp3.1/System.Windows.Extensions.xml", + "runtimes/win/lib/net6.0/System.Windows.Extensions.dll", + "runtimes/win/lib/net6.0/System.Windows.Extensions.xml", + "runtimes/win/lib/netcoreapp3.1/System.Windows.Extensions.dll", + "runtimes/win/lib/netcoreapp3.1/System.Windows.Extensions.xml", + "system.windows.extensions.6.0.0.nupkg.sha512", + "system.windows.extensions.nuspec", + "useSharedDesignerContext.txt" + ] + }, "xunit/2.9.3": { "sha512": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", "type": "package", @@ -6772,16 +8380,26 @@ "Asp.Versioning.Mvc.ApiExplorer": "8.1.0", "AspNetCore.Swagger.Fluent.Annotations": "1.0.4", "AsyncStateMachine": "1.3.2", + "AutoMapper": "14.0.0", + "AutoMapper.AspNetCore.OData.EFCore": "7.0.1", + "AutoMapper.Collection": "11.0.0", + "AutoMapper.Collection.EntityFrameworkCore": "11.0.0", + "AutoMapper.Contrib.Autofac.DependencyInjection": "9.0.0", + "AutoMapper.Data": "9.0.0", + "AutoMapper.EF6": "3.0.1", + "AutoMapper.Extensions.EnumMapping": "4.1.0", + "AutoMapper.Extensions.ExpressionMapping": "8.0.0", "AWS.Logger.NLog": "3.3.4", - "AWSSDK.Core": "3.7.402.39", - "AWSSDK.DynamoDBv2": "3.7.406.21", + "AWSSDK.Core": "3.7.402.46", + "AWSSDK.DynamoDBv2": "3.7.407", "AWSSDK.EC2": "3.7.330.4", "AWSSDK.ElasticLoadBalancingV2": "3.7.303.15", - "AWSSDK.OpenSearchService": "3.7.404.75", - "AWSSDK.S3": "3.7.416.9", + "AWSSDK.OpenSearchService": "3.7.404.81", + "AWSSDK.S3": "3.7.416.15", + "AWSSDK.SecurityToken": "3.7.401.89", "Axion.ConcurrentHashSet": "1.0.0", "BCrypt.Net-Next": "4.0.3", - "BouncyCastle.Cryptography": "2.4.0", + "BouncyCastle.Cryptography": "2.5.1", "CommandLineParser": "2.9.1", "CommunityToolkit.Diagnostics": "8.2.2", "CommunityToolkit.Mvvm": "8.2.2", @@ -6811,7 +8429,7 @@ "Microsoft.EntityFrameworkCore.Design": "8.0.2", "Microsoft.EntityFrameworkCore.Tools": "8.0.2", "Microsoft.Extensions.Caching.StackExchangeRedis": "8.0.6", - "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration": "9.0.4", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", "Microsoft.Extensions.DependencyInjection": "8.0.0", @@ -6820,8 +8438,8 @@ "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", "Microsoft.Extensions.Http": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0", "Microsoft.NET.Test.Sdk": "17.12.0", "Microsoft.OpenApi": "1.6.22", @@ -6845,7 +8463,7 @@ "RabbitMQ.Client": "6.8.1", "SharpSvn": "1.14003.272", "sqlite-net-pcl": "1.9.172", - "SSH.NET": "2024.2.0", + "SSH.NET": "2025.0.0", "StackExchange.Redis": "2.8.31", "StackExchange.Redis.Extensions.Core": "11.0.0", "StackExchange.Redis.Extensions.Newtonsoft": "11.0.0", @@ -6854,7 +8472,7 @@ "Swashbuckle.AspNetCore.Annotations": "7.2.0", "Swashbuckle.AspNetCore.Filters": "8.0.2", "Swashbuckle.AspNetCore.SwaggerUI": "7.2.0", - "System.IdentityModel.Tokens.Jwt": "8.8.0", + "System.IdentityModel.Tokens.Jwt": "8.9.0", "xunit": "2.9.3", "xunit.assert": "2.9.2", "xunit.runner.visualstudio": "3.0.1", diff --git a/BrokerApiTest/obj/project.nuget.cache b/BrokerApiTest/obj/project.nuget.cache index 6ad6801..222f2f7 100644 --- a/BrokerApiTest/obj/project.nuget.cache +++ b/BrokerApiTest/obj/project.nuget.cache @@ -1,6 +1,6 @@ { "version": 2, - "dgSpecHash": "mcFSESevTrE=", + "dgSpecHash": "Q+hbkpSpm30=", "success": true, "projectFilePath": "D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\BrokerApiTest.csproj", "expectedPackageFiles": [ @@ -8,22 +8,37 @@ "C:\\Users\\user\\.nuget\\packages\\asp.versioning.http\\8.1.0\\asp.versioning.http.8.1.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\asp.versioning.mvc\\8.1.0\\asp.versioning.mvc.8.1.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\asyncstatemachine\\1.3.2\\asyncstatemachine.1.3.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\autofac\\8.2.0\\autofac.8.2.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper\\14.0.0\\automapper.14.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.aspnetcore.odata.efcore\\7.0.1\\automapper.aspnetcore.odata.efcore.7.0.1.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.collection\\11.0.0\\automapper.collection.11.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.collection.entityframeworkcore\\11.0.0\\automapper.collection.entityframeworkcore.11.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.contrib.autofac.dependencyinjection\\9.0.0\\automapper.contrib.autofac.dependencyinjection.9.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.data\\9.0.0\\automapper.data.9.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.ef6\\3.0.1\\automapper.ef6.3.0.1.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.extensions.enummapping\\4.1.0\\automapper.extensions.enummapping.4.1.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\automapper.extensions.expressionmapping\\8.0.0\\automapper.extensions.expressionmapping.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\aws.logger.core\\3.3.3\\aws.logger.core.3.3.3.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\aws.logger.nlog\\3.3.4\\aws.logger.nlog.3.3.4.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\awssdk.cloudwatchlogs\\3.7.305.15\\awssdk.cloudwatchlogs.3.7.305.15.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\awssdk.core\\3.7.402.39\\awssdk.core.3.7.402.39.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\awssdk.dynamodbv2\\3.7.406.21\\awssdk.dynamodbv2.3.7.406.21.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\awssdk.core\\3.7.402.46\\awssdk.core.3.7.402.46.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\awssdk.dynamodbv2\\3.7.407\\awssdk.dynamodbv2.3.7.407.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\awssdk.ec2\\3.7.330.4\\awssdk.ec2.3.7.330.4.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\awssdk.opensearchservice\\3.7.404.75\\awssdk.opensearchservice.3.7.404.75.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\awssdk.s3\\3.7.416.9\\awssdk.s3.3.7.416.9.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\awssdk.opensearchservice\\3.7.404.81\\awssdk.opensearchservice.3.7.404.81.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\awssdk.s3\\3.7.416.15\\awssdk.s3.3.7.416.15.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\awssdk.securitytoken\\3.7.401.89\\awssdk.securitytoken.3.7.401.89.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\axion.concurrenthashset\\1.0.0\\axion.concurrenthashset.1.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\bouncycastle.cryptography\\2.4.0\\bouncycastle.cryptography.2.4.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\bcrypt.net-next\\4.0.3\\bcrypt.net-next.4.0.3.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\bouncycastle.cryptography\\2.5.1\\bouncycastle.cryptography.2.5.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\castle.core\\5.1.1\\castle.core.5.1.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\commandlineparser\\2.9.1\\commandlineparser.2.9.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\communitytoolkit.diagnostics\\8.2.2\\communitytoolkit.diagnostics.8.2.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\delegatedecompiler\\0.34.0\\delegatedecompiler.0.34.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\delegatedecompiler.entityframework\\0.34.0\\delegatedecompiler.entityframework.0.34.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\dnsclient\\1.6.1\\dnsclient.1.6.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\dotnet.multimap\\2.2.1\\dotnet.multimap.2.2.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\dumpextensions\\2.0.0\\dumpextensions.2.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\entityframework\\6.5.1\\entityframework.6.5.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\google.protobuf\\3.27.1\\google.protobuf.3.27.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\grpc.aspnetcore\\2.63.0\\grpc.aspnetcore.2.63.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\grpc.aspnetcore.server\\2.63.0\\grpc.aspnetcore.server.2.63.0.nupkg.sha512", @@ -35,30 +50,35 @@ "C:\\Users\\user\\.nuget\\packages\\grpc.net.common\\2.63.0\\grpc.net.common.2.63.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\grpc.reflection\\2.63.0\\grpc.reflection.2.63.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\jwt\\11.0.0\\jwt.11.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\logicbuilder.expressions.utils\\7.0.0\\logicbuilder.expressions.utils.7.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\logicbuilder.structures\\7.0.0\\logicbuilder.structures.7.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\mediatr\\12.3.0\\mediatr.12.3.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\mediatr.contracts\\2.0.1\\mediatr.contracts.2.0.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.aspnetcore.authentication.jwtbearer\\8.0.2\\microsoft.aspnetcore.authentication.jwtbearer.8.0.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.aspnetcore.mvc.testing\\8.0.2\\microsoft.aspnetcore.mvc.testing.8.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.aspnetcore.odata\\9.1.1\\microsoft.aspnetcore.odata.9.1.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.aspnetcore.testhost\\8.0.2\\microsoft.aspnetcore.testhost.8.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.bcl.asyncinterfaces\\8.0.0\\microsoft.bcl.asyncinterfaces.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.bcl.memory\\9.0.0\\microsoft.bcl.memory.9.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.codecoverage\\17.12.0\\microsoft.codecoverage.17.12.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.csharp\\4.7.0\\microsoft.csharp.4.7.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.diagnostics.netcore.client\\0.2.621003\\microsoft.diagnostics.netcore.client.0.2.621003.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore\\8.0.2\\microsoft.entityframeworkcore.8.0.2.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\8.0.2\\microsoft.entityframeworkcore.abstractions.8.0.2.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\8.0.2\\microsoft.entityframeworkcore.analyzers.8.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore\\9.0.2\\microsoft.entityframeworkcore.9.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\9.0.2\\microsoft.entityframeworkcore.abstractions.9.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\9.0.2\\microsoft.entityframeworkcore.analyzers.9.0.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.entityframeworkcore.relational\\8.0.2\\microsoft.entityframeworkcore.relational.8.0.2.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\8.0.0\\microsoft.extensions.caching.abstractions.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.caching.memory\\8.0.0\\microsoft.extensions.caching.memory.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration\\8.0.0\\microsoft.extensions.configuration.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\8.0.0\\microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\9.0.2\\microsoft.extensions.caching.abstractions.9.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.caching.memory\\9.0.2\\microsoft.extensions.caching.memory.9.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration\\9.0.4\\microsoft.extensions.configuration.9.0.4.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\9.0.4\\microsoft.extensions.configuration.abstractions.9.0.4.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.binder\\8.0.0\\microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.commandline\\8.0.0\\microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\8.0.0\\microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\8.0.0\\microsoft.extensions.configuration.fileextensions.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.json\\8.0.0\\microsoft.extensions.configuration.json.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.configuration.usersecrets\\8.0.0\\microsoft.extensions.configuration.usersecrets.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\8.0.0\\microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.2\\microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\9.0.2\\microsoft.extensions.dependencyinjection.9.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\9.0.4\\microsoft.extensions.dependencyinjection.abstractions.9.0.4.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.dependencymodel\\8.0.0\\microsoft.extensions.dependencymodel.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.diagnostics\\8.0.0\\microsoft.extensions.diagnostics.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.diagnostics.abstractions\\8.0.0\\microsoft.extensions.diagnostics.abstractions.8.0.0.nupkg.sha512", @@ -68,31 +88,37 @@ "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.hosting\\8.0.0\\microsoft.extensions.hosting.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\8.0.0\\microsoft.extensions.hosting.abstractions.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.http\\8.0.0\\microsoft.extensions.http.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging\\8.0.0\\microsoft.extensions.logging.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.2\\microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging\\9.0.2\\microsoft.extensions.logging.9.0.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\9.0.2\\microsoft.extensions.logging.abstractions.9.0.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.configuration\\8.0.0\\microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.console\\8.0.0\\microsoft.extensions.logging.console.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.debug\\8.0.0\\microsoft.extensions.logging.debug.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.eventlog\\8.0.0\\microsoft.extensions.logging.eventlog.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.logging.eventsource\\8.0.0\\microsoft.extensions.logging.eventsource.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.options\\8.0.0\\microsoft.extensions.options.8.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.objectpool\\6.0.3\\microsoft.extensions.objectpool.6.0.3.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.options\\9.0.4\\microsoft.extensions.options.9.0.4.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.options.configurationextensions\\8.0.0\\microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.primitives\\8.0.0\\microsoft.extensions.primitives.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.abstractions\\8.8.0\\microsoft.identitymodel.abstractions.8.8.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.jsonwebtokens\\8.8.0\\microsoft.identitymodel.jsonwebtokens.8.8.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.logging\\8.8.0\\microsoft.identitymodel.logging.8.8.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.4\\microsoft.extensions.primitives.9.0.4.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.abstractions\\8.9.0\\microsoft.identitymodel.abstractions.8.9.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.jsonwebtokens\\8.9.0\\microsoft.identitymodel.jsonwebtokens.8.9.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.logging\\8.9.0\\microsoft.identitymodel.logging.8.9.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.protocols\\7.1.2\\microsoft.identitymodel.protocols.7.1.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.protocols.openidconnect\\7.1.2\\microsoft.identitymodel.protocols.openidconnect.7.1.2.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.tokens\\8.8.0\\microsoft.identitymodel.tokens.8.8.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.identitymodel.tokens\\8.9.0\\microsoft.identitymodel.tokens.8.9.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.net.test.sdk\\17.12.0\\microsoft.net.test.sdk.17.12.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\microsoft.netcore.platforms\\5.0.0\\microsoft.netcore.platforms.5.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.odata.core\\8.2.2\\microsoft.odata.core.8.2.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.odata.edm\\8.2.2\\microsoft.odata.edm.8.2.2.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.odata.modelbuilder\\2.0.0\\microsoft.odata.modelbuilder.2.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.openapi\\1.6.22\\microsoft.openapi.1.6.22.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.spatial\\8.2.2\\microsoft.spatial.8.2.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.12.0\\microsoft.testplatform.objectmodel.17.12.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.testplatform.testhost\\17.12.0\\microsoft.testplatform.testhost.17.12.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\microsoft.win32.registry\\5.0.0\\microsoft.win32.registry.5.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\microsoft.win32.systemevents\\6.0.0\\microsoft.win32.systemevents.6.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\mongodb.analyzer\\1.5.0\\mongodb.analyzer.1.5.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\mongodb.bson\\3.3.0\\mongodb.bson.3.3.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\mongodb.driver\\3.3.0\\mongodb.driver.3.3.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\mono.reflection\\2.0.0\\mono.reflection.2.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\moq\\4.20.72\\moq.4.20.72.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\mysqlconnector\\2.4.0\\mysqlconnector.2.4.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\neosmart.asynclock\\3.2.1\\neosmart.asynclock.3.2.1.nupkg.sha512", @@ -113,9 +139,13 @@ "C:\\Users\\user\\.nuget\\packages\\pipelines.sockets.unofficial\\2.2.8\\pipelines.sockets.unofficial.2.2.8.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\pomelo.entityframeworkcore.mysql\\8.0.2\\pomelo.entityframeworkcore.mysql.8.0.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\rabbitmq.client\\6.8.1\\rabbitmq.client.6.8.1.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\runtime.native.system.data.sqlclient.sni\\4.7.0\\runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\sharpcompress\\0.30.1\\sharpcompress.0.30.1.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\snappier\\1.0.0\\snappier.1.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\ssh.net\\2024.2.0\\ssh.net.2024.2.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\ssh.net\\2025.0.0\\ssh.net.2025.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\stackexchange.redis\\2.8.31\\stackexchange.redis.2.8.31.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\stackexchange.redis.extensions.core\\11.0.0\\stackexchange.redis.extensions.core.11.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\stackexchange.redis.extensions.newtonsoft\\11.0.0\\stackexchange.redis.extensions.newtonsoft.11.0.0.nupkg.sha512", @@ -125,20 +155,29 @@ "C:\\Users\\user\\.nuget\\packages\\swashbuckle.aspnetcore.swaggergen\\7.2.0\\swashbuckle.aspnetcore.swaggergen.7.2.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\swashbuckle.aspnetcore.swaggerui\\7.2.0\\swashbuckle.aspnetcore.swaggerui.7.2.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.buffers\\4.5.1\\system.buffers.4.5.1.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.codedom\\6.0.0\\system.codedom.6.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.collections.immutable\\1.7.1\\system.collections.immutable.1.7.1.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\system.diagnostics.diagnosticsource\\8.0.0\\system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.componentmodel.annotations\\5.0.0\\system.componentmodel.annotations.5.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.configuration.configurationmanager\\6.0.1\\system.configuration.configurationmanager.6.0.1.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.data.sqlclient\\4.8.6\\system.data.sqlclient.4.8.6.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.diagnostics.diagnosticsource\\9.0.2\\system.diagnostics.diagnosticsource.9.0.2.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.0\\system.diagnostics.eventlog.8.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\system.identitymodel.tokens.jwt\\8.8.0\\system.identitymodel.tokens.jwt.8.8.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.drawing.common\\6.0.0\\system.drawing.common.6.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.identitymodel.tokens.jwt\\8.9.0\\system.identitymodel.tokens.jwt.8.9.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.io.pipelines\\8.0.0\\system.io.pipelines.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.memory\\4.5.5\\system.memory.4.5.5.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.reactive\\6.0.0\\system.reactive.6.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.reflection.emit\\4.7.0\\system.reflection.emit.4.7.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\5.0.0\\system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512", - "C:\\Users\\user\\.nuget\\packages\\system.security.accesscontrol\\5.0.0\\system.security.accesscontrol.5.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.security.accesscontrol\\6.0.0\\system.security.accesscontrol.6.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.security.cryptography.protecteddata\\6.0.0\\system.security.cryptography.protecteddata.6.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.security.permissions\\6.0.0\\system.security.permissions.6.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.text.encodings.web\\8.0.0\\system.text.encodings.web.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.text.json\\8.0.0\\system.text.json.8.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\system.threading.channels\\7.0.0\\system.threading.channels.7.0.0.nupkg.sha512", + "C:\\Users\\user\\.nuget\\packages\\system.windows.extensions\\6.0.0\\system.windows.extensions.6.0.0.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\xunit\\2.9.3\\xunit.2.9.3.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\xunit.abstractions\\2.0.3\\xunit.abstractions.2.0.3.nupkg.sha512", "C:\\Users\\user\\.nuget\\packages\\xunit.analyzers\\1.18.0\\xunit.analyzers.1.18.0.nupkg.sha512", diff --git a/BrokerApiTest/obj/project.packagespec.json b/BrokerApiTest/obj/project.packagespec.json index 494cb26..ce77971 100644 --- a/BrokerApiTest/obj/project.packagespec.json +++ b/BrokerApiTest/obj/project.packagespec.json @@ -1 +1 @@ -"restore":{"projectUniqueName":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\BrokerApiTest.csproj","projectName":"BrokerApiTest","projectPath":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\BrokerApiTest.csproj","outputPath":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\obj\\","projectStyle":"PackageReference","centralPackageVersionsManagementEnabled":true,"originalTargetFrameworks":["net8.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiServer\\BrokerApiServer.csproj":{"projectPath":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiServer\\BrokerApiServer.csproj"}}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Microsoft.AspNetCore.Mvc.Testing":{"target":"Package","version":"[8.0.2, )","versionCentrallyManaged":true},"Microsoft.NET.Test.Sdk":{"target":"Package","version":"[17.12.0, )","versionCentrallyManaged":true},"Moq":{"target":"Package","version":"[4.20.72, )","versionCentrallyManaged":true},"xunit":{"target":"Package","version":"[2.9.3, )","versionCentrallyManaged":true},"xunit.runner.visualstudio":{"include":"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive","suppressParent":"All","target":"Package","version":"[3.0.1, )","versionCentrallyManaged":true}},"centralPackageVersions":{"Asp.Versioning.Mvc":"8.1.0","Asp.Versioning.Mvc.ApiExplorer":"8.1.0","AspNetCore.Swagger.Fluent.Annotations":"1.0.4","AsyncStateMachine":"1.3.2","AWS.Logger.NLog":"3.3.4","AWSSDK.Core":"3.7.402.39","AWSSDK.DynamoDBv2":"3.7.406.21","AWSSDK.EC2":"3.7.330.4","AWSSDK.ElasticLoadBalancingV2":"3.7.303.15","AWSSDK.OpenSearchService":"3.7.404.75","AWSSDK.S3":"3.7.416.9","Axion.ConcurrentHashSet":"1.0.0","BCrypt.Net-Next":"4.0.3","BouncyCastle.Cryptography":"2.4.0","CommandLineParser":"2.9.1","CommunityToolkit.Diagnostics":"8.2.2","CommunityToolkit.Mvvm":"8.2.2","Costura.Fody":"5.7.0","Csv":"2.0.93","DocumentFormat.OpenXml":"2.20.0","DotNet.MultiMap":"2.2.1","DumpExtensions":"2.0.0","ExcelDataReader":"3.6.0","ExcelDataReader.DataSet":"3.6.0","ExcelNumberFormat":"1.1.0","Google.Protobuf":"3.27.1","Grpc.AspNetCore":"2.63.0","Grpc.AspNetCore.Server.Reflection":"2.63.0","Grpc.Tools":"2.64.0","JWT":"11.0.0","MaterialDesignColors":"3.1.1-ci850","MaterialDesignThemes":"5.1.1-ci850","MaxMind.Db":"4.1.0","MaxMind.GeoIP2":"5.2.0","MediatR":"12.3.0","Microsoft.AspNetCore.Authentication.JwtBearer":"8.0.2","Microsoft.AspNetCore.Mvc.Testing":"8.0.2","Microsoft.AspNetCore.OpenApi":"8.0.6","Microsoft.Data.Sqlite":"8.0.6","Microsoft.Diagnostics.NETCore.Client":"0.2.621003","Microsoft.EntityFrameworkCore.Design":"8.0.2","Microsoft.EntityFrameworkCore.Tools":"8.0.2","Microsoft.Extensions.Caching.StackExchangeRedis":"8.0.6","Microsoft.Extensions.Configuration":"8.0.0","Microsoft.Extensions.Configuration.Abstractions":"8.0.0","Microsoft.Extensions.Configuration.UserSecrets":"8.0.0","Microsoft.Extensions.DependencyInjection":"8.0.0","Microsoft.Extensions.DependencyInjection.Abstractions":"8.0.1","Microsoft.Extensions.Hosting":"8.0.0","Microsoft.Extensions.Hosting.Abstractions":"8.0.0","Microsoft.Extensions.Http":"8.0.0","Microsoft.Extensions.Logging":"8.0.0","Microsoft.Extensions.Logging.Abstractions":"8.0.1","Microsoft.Extensions.Options":"8.0.2","Microsoft.Extensions.Options.ConfigurationExtensions":"8.0.0","Microsoft.NET.Test.Sdk":"17.12.0","Microsoft.OpenApi":"1.6.22","Microsoft.Xaml.Behaviors.Wpf":"1.1.122","MongoDB.Analyzer":"1.5.0","MongoDB.Bson":"3.3.0","MongoDB.Driver":"3.3.0","MongoDB.Driver.Core":"2.30.0","Moq":"4.20.72","MySqlConnector":"2.4.0","NeoSmart.AsyncLock":"3.2.1","Newtonsoft.Json":"13.0.3","Nito.AsyncEx":"5.1.2","NJsonSchema.CodeGeneration.CSharp":"10.9.0","NLog":"5.4.0","NLog.Web.AspNetCore":"5.3.11","Otp.NET":"1.4.0","p4api.net":"2023.1.248.4623","Polly":"8.5.1","Pomelo.EntityFrameworkCore.MySql":"8.0.2","RabbitMQ.Client":"6.8.1","SharpSvn":"1.14003.272","sqlite-net-pcl":"1.9.172","SSH.NET":"2024.2.0","StackExchange.Redis":"2.8.31","StackExchange.Redis.Extensions.Core":"11.0.0","StackExchange.Redis.Extensions.Newtonsoft":"11.0.0","StackExchange.Redis.MultiplexerPool":"2.2.0","Swashbuckle.AspNetCore":"7.2.0","Swashbuckle.AspNetCore.Annotations":"7.2.0","Swashbuckle.AspNetCore.Filters":"8.0.2","Swashbuckle.AspNetCore.SwaggerUI":"7.2.0","System.IdentityModel.Tokens.Jwt":"8.8.0","xunit":"2.9.3","xunit.assert":"2.9.2","xunit.runner.visualstudio":"3.0.1","YamlDotNet":"16.3.0"},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\8.0.303/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file +"restore":{"projectUniqueName":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\BrokerApiTest.csproj","projectName":"BrokerApiTest","projectPath":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\BrokerApiTest.csproj","outputPath":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiTest\\obj\\","projectStyle":"PackageReference","centralPackageVersionsManagementEnabled":true,"originalTargetFrameworks":["net8.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiServer\\BrokerApiServer.csproj":{"projectPath":"D:\\03.SVN\\03.caliverse\\Server\\CaliServer\\BrokerApiServer\\BrokerApiServer.csproj"}}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Microsoft.AspNetCore.Mvc.Testing":{"target":"Package","version":"[8.0.2, )","versionCentrallyManaged":true},"Microsoft.NET.Test.Sdk":{"target":"Package","version":"[17.12.0, )","versionCentrallyManaged":true},"Moq":{"target":"Package","version":"[4.20.72, )","versionCentrallyManaged":true},"xunit":{"target":"Package","version":"[2.9.3, )","versionCentrallyManaged":true},"xunit.runner.visualstudio":{"include":"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive","suppressParent":"All","target":"Package","version":"[3.0.1, )","versionCentrallyManaged":true}},"centralPackageVersions":{"Asp.Versioning.Mvc":"8.1.0","Asp.Versioning.Mvc.ApiExplorer":"8.1.0","AspNetCore.Swagger.Fluent.Annotations":"1.0.4","AsyncStateMachine":"1.3.2","AutoMapper":"14.0.0","AutoMapper.AspNetCore.OData.EFCore":"7.0.1","AutoMapper.Collection":"11.0.0","AutoMapper.Collection.EntityFrameworkCore":"11.0.0","AutoMapper.Contrib.Autofac.DependencyInjection":"9.0.0","AutoMapper.Data":"9.0.0","AutoMapper.EF6":"3.0.1","AutoMapper.Extensions.EnumMapping":"4.1.0","AutoMapper.Extensions.ExpressionMapping":"8.0.0","AWS.Logger.NLog":"3.3.4","AWSSDK.Core":"3.7.402.46","AWSSDK.DynamoDBv2":"3.7.407","AWSSDK.EC2":"3.7.330.4","AWSSDK.ElasticLoadBalancingV2":"3.7.303.15","AWSSDK.OpenSearchService":"3.7.404.81","AWSSDK.S3":"3.7.416.15","AWSSDK.SecurityToken":"3.7.401.89","Axion.ConcurrentHashSet":"1.0.0","BCrypt.Net-Next":"4.0.3","BouncyCastle.Cryptography":"2.5.1","CommandLineParser":"2.9.1","CommunityToolkit.Diagnostics":"8.2.2","CommunityToolkit.Mvvm":"8.2.2","Costura.Fody":"5.7.0","Csv":"2.0.93","DocumentFormat.OpenXml":"2.20.0","DotNet.MultiMap":"2.2.1","DumpExtensions":"2.0.0","ExcelDataReader":"3.6.0","ExcelDataReader.DataSet":"3.6.0","ExcelNumberFormat":"1.1.0","Google.Protobuf":"3.27.1","Grpc.AspNetCore":"2.63.0","Grpc.AspNetCore.Server.Reflection":"2.63.0","Grpc.Tools":"2.64.0","JWT":"11.0.0","MaterialDesignColors":"3.1.1-ci850","MaterialDesignThemes":"5.1.1-ci850","MaxMind.Db":"4.1.0","MaxMind.GeoIP2":"5.2.0","MediatR":"12.3.0","Microsoft.AspNetCore.Authentication.JwtBearer":"8.0.2","Microsoft.AspNetCore.Mvc.Testing":"8.0.2","Microsoft.AspNetCore.OpenApi":"8.0.6","Microsoft.Data.Sqlite":"8.0.6","Microsoft.Diagnostics.NETCore.Client":"0.2.621003","Microsoft.EntityFrameworkCore.Design":"8.0.2","Microsoft.EntityFrameworkCore.Tools":"8.0.2","Microsoft.Extensions.Caching.StackExchangeRedis":"8.0.6","Microsoft.Extensions.Configuration":"9.0.4","Microsoft.Extensions.Configuration.Abstractions":"8.0.0","Microsoft.Extensions.Configuration.UserSecrets":"8.0.0","Microsoft.Extensions.DependencyInjection":"8.0.0","Microsoft.Extensions.DependencyInjection.Abstractions":"8.0.1","Microsoft.Extensions.Hosting":"8.0.0","Microsoft.Extensions.Hosting.Abstractions":"8.0.0","Microsoft.Extensions.Http":"8.0.0","Microsoft.Extensions.Logging":"8.0.0","Microsoft.Extensions.Logging.Abstractions":"9.0.4","Microsoft.Extensions.Options":"9.0.4","Microsoft.Extensions.Options.ConfigurationExtensions":"8.0.0","Microsoft.NET.Test.Sdk":"17.12.0","Microsoft.OpenApi":"1.6.22","Microsoft.Xaml.Behaviors.Wpf":"1.1.122","MongoDB.Analyzer":"1.5.0","MongoDB.Bson":"3.3.0","MongoDB.Driver":"3.3.0","MongoDB.Driver.Core":"2.30.0","Moq":"4.20.72","MySqlConnector":"2.4.0","NeoSmart.AsyncLock":"3.2.1","Newtonsoft.Json":"13.0.3","Nito.AsyncEx":"5.1.2","NJsonSchema.CodeGeneration.CSharp":"10.9.0","NLog":"5.4.0","NLog.Web.AspNetCore":"5.3.11","Otp.NET":"1.4.0","p4api.net":"2023.1.248.4623","Polly":"8.5.1","Pomelo.EntityFrameworkCore.MySql":"8.0.2","RabbitMQ.Client":"6.8.1","SharpSvn":"1.14003.272","sqlite-net-pcl":"1.9.172","SSH.NET":"2025.0.0","StackExchange.Redis":"2.8.31","StackExchange.Redis.Extensions.Core":"11.0.0","StackExchange.Redis.Extensions.Newtonsoft":"11.0.0","StackExchange.Redis.MultiplexerPool":"2.2.0","Swashbuckle.AspNetCore":"7.2.0","Swashbuckle.AspNetCore.Annotations":"7.2.0","Swashbuckle.AspNetCore.Filters":"8.0.2","Swashbuckle.AspNetCore.SwaggerUI":"7.2.0","System.IdentityModel.Tokens.Jwt":"8.9.0","xunit":"2.9.3","xunit.assert":"2.9.2","xunit.runner.visualstudio":"3.0.1","YamlDotNet":"16.3.0"},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\8.0.303/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/BrokerApiTest/obj/rider.project.restore.info b/BrokerApiTest/obj/rider.project.restore.info index 7b67913..43b5b0b 100644 --- a/BrokerApiTest/obj/rider.project.restore.info +++ b/BrokerApiTest/obj/rider.project.restore.info @@ -1 +1 @@ -17455459552361144 \ No newline at end of file +17460517968346217 \ No newline at end of file diff --git a/GameServer/Contents/BeaconShop/Action/BeaconShopAction.cs b/GameServer/Contents/BeaconShop/Action/BeaconShopAction.cs index 6135dc4..548fac6 100644 --- a/GameServer/Contents/BeaconShop/Action/BeaconShopAction.cs +++ b/GameServer/Contents/BeaconShop/Action/BeaconShopAction.cs @@ -14,6 +14,7 @@ using META_ID = System.UInt32; using BEACON_GUID = System.String; using ITEM_GUID = System.String; using USER_GUID = System.String; +using Amazon.S3.Model; namespace GameServer; @@ -74,11 +75,6 @@ public class BeaconShopAction : EntityActionBase } } - public bool hasBeaconShopSoldRecord(BEACON_GUID beaconGuid) - { - return m_beacon_shop_sold_records.TryGetValue(beaconGuid, out var record); - } - public async Task AddBeaconShopSoldRecordsFromDocs(List beaconShopSoldRecordDocs) { var result = new Result(); @@ -174,6 +170,13 @@ public class BeaconShopAction : EntityActionBase return result; } + if (isRentalSafeTime(ugc_npc) == false) + { + err_msg = $"Rental Safe Time is over - {player.toBasicString()}"; + result.setFail(ServerErrorCode.BeaconShopOverRentalSafeTime, err_msg); + return result; + } + var fn_start_register_beacon_shop_item = async delegate () { var result = new Result(); @@ -280,7 +283,7 @@ public class BeaconShopAction : EntityActionBase ); if (result.isFail()) { return result; } - var task_log_data = BeaconShopBusinessLogHelper.toLogInfo(beaconShopMongoDoc); + var task_log_data = BeaconShopBusinessLogHelper.toLogInfo(beaconShopMongoDoc, beacon_shop_attribute.IsActiveSelling); invokers.Add(new BeaconShopBusinessLog(task_log_data)); result = await m_beacon_shop_repository.insert(beaconShopMongoDoc); @@ -317,7 +320,9 @@ public class BeaconShopAction : EntityActionBase return result; } - BeaconShopHelper.send_GS2GS_NTF_UPDATE_BEACON_SHOP_ITEM(player.getUserGuid(), BeaconGuid); + var hasBeaconShopItem = ugc_npc_beacon_shop_action.hasBeaconShopItem(); + + BeaconShopHelper.send_GS2GS_NTF_UPDATE_BEACON_SHOP_ITEM(player.getUserGuid(), BeaconGuid, hasBeaconShopItem); PacketHandler.BeaconShopRegisterItemPacketHandler.send_S2C_ACK_BEACON_SHOP_REGISTER_ITEM(player, result, beacon_shop_item, found_transaction_runner.getCommonResult()); return result; @@ -352,6 +357,31 @@ public class BeaconShopAction : EntityActionBase return result; } + var ugc_npc_beacon_shop_action = found_ugc_npc.getEntityAction(); + + //1. 아이템 찾기 + var found_item = ugc_npc_beacon_shop_action.getBeaconShopItem(itemGuid); + if (found_item == null) + { + err_msg = $"Failed to tryGetItemByItemGuid BeaconShopItem !!! : itemGuid : {itemGuid}, {player.toBasicString()}"; + result.setFail(ServerErrorCode.ItemNotFound, err_msg); + PacketHandler.BeaconShopReturnItemPacketHandler.send_S2C_ACK_BEACON_SHOP_RETURN_ITEM(player, result); + return result; + } + + //2. 판매 아이템 활성화 확인 + var beacon_shop_item_attribute = found_item.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attribute, () => $"beacon_shop_item_attribute is null !!! - {player.toBasicString()}"); + if (beacon_shop_item_attribute.IsActiveSelling == true) + { + if (isRentalSafeTime(found_ugc_npc) == false) + { + err_msg = $"Rental Safe Time is over - {player.toBasicString()}"; + result.setFail(ServerErrorCode.BeaconShopOverRentalSafeTime, err_msg); + return result; + } + } + var fn_start_return_item = async delegate () { using (var runner_with_scope = new EntityTransactionRunnerWithScopLock(found_ugc_npc)) @@ -455,7 +485,7 @@ public class BeaconShopAction : EntityActionBase { PacketHandler.BeaconShopReturnItemPacketHandler.send_S2C_ACK_BEACON_SHOP_RETURN_ITEM(player, result); ugc_npc_beacon_shop_action.setUpdateBeaconShopItem(); - player.send_S2C_NTF_BEACON_SHOP_REFRESH(beaconGuid); + player.send_S2C_NTF_BEACON_SHOP_REFRESH(beaconGuid, BoolType.True); return result; } @@ -493,6 +523,39 @@ public class BeaconShopAction : EntityActionBase return result; } + var ugc_npc_beacon_shop_action = found_ugc_npc.getEntityAction(); + var beacon_shop_item = ugc_npc_beacon_shop_action.getBeaconShopItem(itemGuid); + if (beacon_shop_item == null) + { + err_msg = $"Not found Beacon Shop Item !!! : itemGuid:{itemGuid} beaconOwner:{beaconOwnerGuid} - {player.toBasicString()}"; + result.setFail(ServerErrorCode.BeaconShopNotFoundItem, err_msg); + return result; + } + + // 판매 아이템 활성화 확인 + var beacon_shop_item_attribute = beacon_shop_item.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attribute, () => $"beacon_shop_item_attribute is null !!! - {player.toBasicString()}"); + if (beacon_shop_item_attribute.IsActiveSelling == false) + { + err_msg = $"Is Deactive Selling Item !! - {player.toBasicString()}"; + result.setFail(ServerErrorCode.BeaconShopDeactiveItemForSell, err_msg); + return result; + } + + if (isRentalMyhome(found_ugc_npc) == false) + { + err_msg = $"Beacon is not in myHome !!! - {player.toBasicString()}"; + result.setFail(ServerErrorCode.BeaconShopBeaconIsNotInRentalHome, err_msg); + return result; + } + + if (isRentalSafeTime(found_ugc_npc) == false) + { + err_msg = $"Rental Safe Time is over - {player.toBasicString()}"; + result.setFail(ServerErrorCode.BeaconShopOverRentalSafeTime, err_msg); + return result; + } + var fn_start_purchase_item = async delegate () { var result = new Result(); @@ -677,7 +740,7 @@ public class BeaconShopAction : EntityActionBase { PacketHandler.BeaconShopReturnItemPacketHandler.send_S2C_ACK_BEACON_SHOP_RETURN_ITEM(player, result); ugc_npc_beacon_shop_action.setUpdateBeaconShopItem(); - player.send_S2C_NTF_BEACON_SHOP_REFRESH(beaconGuid); + player.send_S2C_NTF_BEACON_SHOP_REFRESH(beaconGuid, BoolType.True); return result; } @@ -702,7 +765,9 @@ public class BeaconShopAction : EntityActionBase PacketHandler.BeaconShopPurchaseItemPacketHandler.send_S2C_ACK_BEACON_SHOP_PURCHASE_ITEM(player, result, itemGuid, beaconGuid, left_item_stack_count, found_transaction_runner.getCommonResult()); - BeaconShopHelper.send_GS2GS_NTF_UPDATE_BEACON_SHOP_ITEM(beacon_owner_guid, beaconGuid); + var hasBeaconShopItem = ugc_npc_beacon_shop_action.hasBeaconShopItem(); + + BeaconShopHelper.send_GS2GS_NTF_UPDATE_BEACON_SHOP_ITEM(beacon_owner_guid, beaconGuid, hasBeaconShopItem); var player_manager = server_logic.getPlayerManager(); if (player_manager.tryGetUserByPrimaryKey(beacon_owner_guid, out var found_user) == true) @@ -724,6 +789,91 @@ public class BeaconShopAction : EntityActionBase return result; } + private bool isRentalMyhome(UgcNpc ugcNpc) + { + var player = getOwner() as Player; + NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); + + var beacon_attribute = ugcNpc.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_attribute, () => $"beacon_attribute is null !!!"); + + var rental_agent_action = player.getEntityAction(); + + if (beacon_attribute.State != EntityStateType.UsingByMyHome || + rental_agent_action.isRentalMyhome(beacon_attribute.LocatedInstanceGuid) == false) + { + return false; + } + + return true; + } + + // 랜탈 기간이 안전한 시간 내 인지 확인 + private bool isRentalSafeTime(UgcNpc ugcNpc) + { + var player = getOwner() as Player; + NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); + + var beacon_attribute = ugcNpc.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_attribute, () => $"beacon_attribute is null !!!"); + + var rental_agent_action = player.getEntityAction(); + + var rental_finish_time = rental_agent_action.getRentalMyhomeFinishTime(beacon_attribute.LocatedInstanceGuid); + if (rental_finish_time.HasValue == false) + { + return false; + } + + var now = DateTime.UtcNow; + if (rental_finish_time.Value.AddSeconds(-5) < now) + { + return false; + } + + return true; + } + public async Task BeaconShopDeactiveItems(BEACON_GUID beaconGuid, USER_GUID beaconOwnerGuid, List invokers) + { + var result = new Result(); + var err_msg = string.Empty; + + var player = getOwner() as Player; + NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); + + // 1. 아이템 비활성화 + (result, var found_ugc_npc, var ugc_npc_owner) = await NpcHelper.findUgcNpc(beaconGuid, beaconOwnerGuid); + if (found_ugc_npc == null) + { + if (result.isSuccess()) + result.setFail(ServerErrorCode.UgcNpcNotFound, err_msg); + err_msg = $"Not found Beacon !!! : beaconOwner:{beaconOwnerGuid} - {player.toBasicString()}"; + return result; + } + + var ugc_npc_attribute = found_ugc_npc.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {player.toBasicString()}"); + + var ugc_npc_beacon_shop_action = found_ugc_npc.getEntityAction(); + ugc_npc_beacon_shop_action.setDeactiveAllItems(); + + //2. mongo에서 제거 & 비지니스 로그 작성 + var beacon_shop_item_list = ugc_npc_beacon_shop_action.getHasBeaconShopItem(); + foreach (var beacon_shop_item in beacon_shop_item_list) + { + var beacon_shop_item_attribute = beacon_shop_item.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attribute, () => $"beacon_shop_item_attribute is null !!! - {toBasicString()}"); + + await m_beacon_shop_repository.delete(beacon_shop_item_attribute.ItemGuid); + + var task_log_data = BeaconShopBusinessLogHelper.toLogInfo(beacon_shop_item_attribute, ugc_npc_attribute, player.getUserGuid()); + invokers.Add(new BeaconShopBusinessLog(task_log_data)); + } + + return result; + } + + private (Result, DynamoDbItemRequestQueryContext?) BeaconShopSoldPriceUpdate(string combinationKeyForPK, string combinationKeyForSK, double givenPrice, double taxPrice, int numOfReceiptNotReceived) { var result = new Result(); @@ -1062,19 +1212,24 @@ public class BeaconShopAction : EntityActionBase return result; } - int numOfReceiptNotReceived = 0; - - if (m_beacon_shop_sold_price.TryGetValue(beaconGuid, out var beaconShopSoldPrice) == true) - { - var beacon_shop_sold_price_attribute = beaconShopSoldPrice.getEntityAttribute(); - NullReferenceCheckHelper.throwIfNull(beacon_shop_sold_price_attribute, () => $"beacon_shop_sold_price_attribute is null !!! - {player.toBasicString()}"); - numOfReceiptNotReceived = beacon_shop_sold_price_attribute.NumOfReceiptNotReceived; - } + int numOfReceiptNotReceived = getBeaconShopNumOfReceiptNotReceived(beaconGuid); PacketHandler.BeaconShopGetItemInfosPacketHandler.send_S2C_ACK_BEACON_SHOP_GET_ITEM_INFOS(player, result, beacon_shop_item_reload_data, beacon_shop_profile_attribute.DailyRegisterCount, numOfReceiptNotReceived); return result; } + public int getBeaconShopNumOfReceiptNotReceived(BEACON_GUID beaconGuid) + { + if (m_beacon_shop_sold_price.TryGetValue(beaconGuid, out var beaconShopSoldPrice) == true) + { + var beacon_shop_sold_price_attribute = beaconShopSoldPrice.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_shop_sold_price_attribute, () => $"beacon_shop_sold_price_attribute is null !!! - {getOwner().toBasicString()}"); + return beacon_shop_sold_price_attribute.NumOfReceiptNotReceived; + } + + return 0; + } + private async Task ProcessUpdateDailyRegisterCount(UgcNpc found_ugc_npc) { var result = new Result(); @@ -1134,10 +1289,7 @@ public class BeaconShopAction : EntityActionBase NullReferenceCheckHelper.throwIfNull(beacon_attribute, () => $"beacon_attribute is null !!!"); // 1. 비컨 체크 - var rental_agent_action = player.getEntityAction(); - - if (beacon_attribute.State != EntityStateType.UsingByMyHome || - rental_agent_action.isRentalMyhome(beacon_attribute.LocatedInstanceGuid) == false) + if (isRentalMyhome(ugcNpc) == false) { err_msg = $"Beacon is not in myHome !!! : beacon State:{beacon_attribute.State} - {player.toBasicString()}"; result.setFail(ServerErrorCode.BeaconShopBeaconIsNotInRentalHome, err_msg); diff --git a/GameServer/Contents/BeaconShop/BeaconShopItem.cs b/GameServer/Contents/BeaconShop/BeaconShopItem.cs index 55d684f..80dc99d 100644 --- a/GameServer/Contents/BeaconShop/BeaconShopItem.cs +++ b/GameServer/Contents/BeaconShop/BeaconShopItem.cs @@ -89,12 +89,13 @@ namespace GameServer beacon_shop_attribute.BeaconGuid = beacon_guid; beacon_shop_attribute.SellingFinishTime = selling_finish_time; beacon_shop_attribute.PriceForUnit = price_for_unit; + beacon_shop_attribute.IsActiveSelling = true; beacon_shop_attribute.ItemMetaId = deleted_item_attribute.ItemMetaId; beacon_shop_attribute.ItemStackCount = amount; beacon_shop_attribute.Level = deleted_item_attribute.Level; beacon_shop_attribute.Attributes = deleted_item_attribute.Attributes.Select(x => x).ToList(); - beacon_shop_attribute.EquipedIvenType = deleted_item_attribute.EquipedIvenType; + beacon_shop_attribute.EquipedInvenType = deleted_item_attribute.EquipedInvenType; beacon_shop_attribute.EquipedPos = deleted_item_attribute.EquipedPos; beacon_shop_attribute.newEntityAttribute(); @@ -132,6 +133,7 @@ namespace GameServer beacon_shop_4_client.ItemMetaid = (int)beacon_shop_attribute.ItemMetaId; beacon_shop_4_client.SellingFinishTime = Timestamp.FromDateTime(beacon_shop_attribute.SellingFinishTime); beacon_shop_4_client.PriceForUnit = beacon_shop_attribute.PriceForUnit; + beacon_shop_4_client.IsActiveSelling = beacon_shop_attribute.IsActiveSelling == true ? BoolType.True : BoolType.False; beacon_shop_4_client.Amount = beacon_shop_attribute.ItemStackCount; return beacon_shop_4_client; diff --git a/GameServer/Contents/BeaconShop/Helper/BeaconShopHelper.cs b/GameServer/Contents/BeaconShop/Helper/BeaconShopHelper.cs index 167a812..5a96c70 100644 --- a/GameServer/Contents/BeaconShop/Helper/BeaconShopHelper.cs +++ b/GameServer/Contents/BeaconShop/Helper/BeaconShopHelper.cs @@ -10,6 +10,41 @@ namespace GameServer { internal static class BeaconShopHelper { + public static async Task DeactiveBeaconShopItems(string beaconGuid) + { + var server_logic = GameServerApp.getServerLogic(); + var dynamo_db_client = server_logic.getDynamoDbClient(); + + var (result, primary_key_object) = await DynamoDBDocBaseHelper.makePrimaryKey(beaconGuid); + if (result.isFail() || primary_key_object == null) + { + return result; + } + + var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(primary_key_object.PK); + (result, var read_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); + if (result.isFail()) + { + return result; + } + + foreach (var beacon_shop_item_doc in read_docs) + { + var beaconShopItemAttrib = beacon_shop_item_doc.getAttrib(); + NullReferenceCheckHelper.throwIfNull(beaconShopItemAttrib, () => $"beaconShopItemAttrib is null !!"); + beaconShopItemAttrib.IsActiveSelling = false; + beacon_shop_item_doc.setQueryType(QueryType.Update); + + result = await dynamo_db_client.simpleUpdateDocumentWithDocType(beacon_shop_item_doc); + if (result.isFail()) + { + return result; + } + } + + return result; + } + public static BeaconShopItemBoardInfo toBeaconShopItemMongoDataClient(this BeaconShopMongoDoc beaconShopMongoDoc) { var beacon_shop_4_client = new BeaconShopItemBoardInfo(); @@ -81,7 +116,7 @@ namespace GameServer rabbit_mq_4_game.SendMessage(targetServer, ntf_packet); } - public static void send_GS2GS_NTF_UPDATE_BEACON_SHOP_ITEM(USER_GUID targetUserGuid, BEACON_GUID targetBeaconGuid) + public static void send_GS2GS_NTF_UPDATE_BEACON_SHOP_ITEM(USER_GUID targetUserGuid, BEACON_GUID targetBeaconGuid, bool hasBeaconShopItem) { var server_logic = GameServerApp.getServerLogic(); @@ -94,6 +129,7 @@ namespace GameServer ntf_update_beacon_shop_item.TargetUserGuid = targetUserGuid; ntf_update_beacon_shop_item.TargetBeaconGuid = targetBeaconGuid; + ntf_update_beacon_shop_item.HasBeaconShopItem = hasBeaconShopItem == true ? BoolType.True : BoolType.False; rabbit_mq_4_game.sendMessageToExchangeAllGame(ntf_packet); } @@ -112,7 +148,7 @@ namespace GameServer item_attrib.ItemStackCount = itemStackCount; item_attrib.Level = beacon_shop_item_attrib.Level; item_attrib.Attributes = beacon_shop_item_attrib.Attributes.Select(x => x).ToList(); - item_attrib.EquipedIvenType = beacon_shop_item_attrib.EquipedIvenType; + item_attrib.EquipedInvenType = beacon_shop_item_attrib.EquipedInvenType; item_attrib.EquipedPos = beacon_shop_item_attrib.EquipedPos; return itemDoc; diff --git a/GameServer/Contents/BeaconShop/Log/BeaconShopBusinessLogHelper.cs b/GameServer/Contents/BeaconShop/Log/BeaconShopBusinessLogHelper.cs index b6d0a8b..4533654 100644 --- a/GameServer/Contents/BeaconShop/Log/BeaconShopBusinessLogHelper.cs +++ b/GameServer/Contents/BeaconShop/Log/BeaconShopBusinessLogHelper.cs @@ -6,14 +6,14 @@ namespace GameServer { static public class BeaconShopBusinessLogHelper { - static public BeaconShopLogData toLogInfo(BeaconShopMongoDoc beaconShopMongoDoc) + static public BeaconShopLogData toLogInfo(BeaconShopMongoDoc beaconShopMongoDoc, bool isActiveSelling) { var logData = new BeaconShopLogData(); - logData.setInfo(beaconShopMongoDoc); + logData.setInfo(beaconShopMongoDoc, isActiveSelling); return logData; } - static public void setInfo(this BeaconShopLogData logData, BeaconShopMongoDoc beaconShopMongoDoc) + static public void setInfo(this BeaconShopLogData logData, BeaconShopMongoDoc beaconShopMongoDoc, bool isActiveSelling) { logData.ItemGuid = beaconShopMongoDoc.ItemGuid; logData.TagId = beaconShopMongoDoc.TagId; @@ -28,6 +28,7 @@ namespace GameServer logData.BeaconMyHomeGuid = beaconShopMongoDoc.BeaconMyHomeGuid; logData.SellingFinishTime = beaconShopMongoDoc.SellingFinishTime; logData.BuyerGuid = string.Empty; + logData.IsActiveSelling = isActiveSelling; } static public BeaconShopLogData toLogInfo(BeaconShopItemAttribute beaconShopItemAttribute, UgcNpcAttribute ugcNpcAttribute, string buyerGuid) @@ -51,6 +52,7 @@ namespace GameServer logData.BeaconMyHomeGuid = ugcNpcAttribute.LocatedInstanceGuid; logData.SellingFinishTime = beaconShopItemAttribute.SellingFinishTime; logData.BuyerGuid = buyerGuid; + logData.IsActiveSelling = beaconShopItemAttribute.IsActiveSelling; } static public BeaconShopSoldRecordLogData toLogInfo(BeaconShopSoldRecordAttribute beaconShopSoldRecordAttribute) diff --git a/GameServer/Contents/BeaconShop/PacketHandler/BeaconShopNotifyHelper.cs b/GameServer/Contents/BeaconShop/PacketHandler/BeaconShopNotifyHelper.cs index ddf143e..ab3203c 100644 --- a/GameServer/Contents/BeaconShop/PacketHandler/BeaconShopNotifyHelper.cs +++ b/GameServer/Contents/BeaconShop/PacketHandler/BeaconShopNotifyHelper.cs @@ -5,9 +5,9 @@ namespace GameServer { public static class BeaconShopNotifyHelper { - public static bool send_S2C_NTF_BEACON_SHOP_REFRESH(this Player player, BEACON_GUID beaconGuid) + public static bool send_S2C_NTF_BEACON_SHOP_REFRESH(this Player player, BEACON_GUID beaconGuid, BoolType hasBeaconShopItem) { - var noti_packet = makeAckBeaconShopRefreshPacket(beaconGuid); + var noti_packet = makeAckBeaconShopRefreshPacket(beaconGuid, hasBeaconShopItem); if (false == GameServerApp.getServerLogic().onSendPacket(player, noti_packet)) { @@ -17,13 +17,14 @@ namespace GameServer return true; } - public static ClientToGame makeAckBeaconShopRefreshPacket(BEACON_GUID beaconGuid) + public static ClientToGame makeAckBeaconShopRefreshPacket(BEACON_GUID beaconGuid, BoolType hasBeaconShopItem) { var noti_packet = new ClientToGame(); noti_packet.Message = new(); noti_packet.Message.NtfBeaconShopRefresh = new(); noti_packet.Message.NtfBeaconShopRefresh.BeaconGuid = beaconGuid; + noti_packet.Message.NtfBeaconShopRefresh.HasBeaconShopItem = hasBeaconShopItem; return noti_packet; } diff --git a/GameServer/Contents/Craft/Action/CraftAction.cs b/GameServer/Contents/Craft/Action/CraftAction.cs index 72a9dc0..70f51e4 100644 --- a/GameServer/Contents/Craft/Action/CraftAction.cs +++ b/GameServer/Contents/Craft/Action/CraftAction.cs @@ -908,7 +908,7 @@ namespace GameServer foreach (var craft in craftList) { - var craft_attribute = craft.getOriginEntityAttribute(); + var craft_attribute = craft.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(craft_attribute, () => $"craft_attribute is null !!!"); craft_attribute.CraftFinishTime = DateTimeHelper.Current; diff --git a/GameServer/Contents/GameMode/Action/GameGameObjectAction.cs b/GameServer/Contents/GameMode/Action/GameGameObjectAction.cs new file mode 100644 index 0000000..f701288 --- /dev/null +++ b/GameServer/Contents/GameMode/Action/GameGameObjectAction.cs @@ -0,0 +1,44 @@ +using System.Collections.Concurrent; +using GameServer.Contents.GameMode.InteractionObject; +using GameServer.Contents.GameMode.Manage.PlayManage; +using MetaAssets; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Action; + +public class GameGameObjectAction : EntityActionBase, IGameObject +{ + //todo : 장르별로 구분할 필요 있으면 depth 하나 더 둔다. + + protected EGameObjectType m_object_type = EGameObjectType.None; + public GameGameObjectAction (EntityBase owner, EGameObjectType objectType) + : base(owner) + { + m_object_type = objectType; + } + + public virtual Task interact(string anchorGuid, DateTime interactionTime) + { + Log.getLogger().error($"interact Not implemant, {toBasicString()}"); + throw new NotImplementedException(); + } + + public override Task onInit() + { + Log.getLogger().error($"onInit Not implemant, {toBasicString()}"); + throw new NotImplementedException(); + } + + public override void onClear() + { + Log.getLogger().error($"onClear Not implemant, {toBasicString()}"); + throw new NotImplementedException(); + } + + public override string toBasicString() + { + return $"GameObjectType : {m_object_type}, " + base.toBasicString(); + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Helper/GameModeConstants.cs b/GameServer/Contents/GameMode/Helper/GameModeConstants.cs new file mode 100644 index 0000000..7233ef2 --- /dev/null +++ b/GameServer/Contents/GameMode/Helper/GameModeConstants.cs @@ -0,0 +1,8 @@ +namespace GameServer.Contents.GameMode.Helper; + +public class GameModeConstants +{ + public static readonly int GAME_MODE_DEFAULT_INTERVAL_MSECS = 200; + public static readonly int GAME_MODE_RUN_RACE_CHECK_INTERVAL_MSECS = 200; + public static readonly int GAME_MODE_TPS_FFA_CHECK_INTERVAL_MSECS = 200; +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Helper/GameModeHelper.cs b/GameServer/Contents/GameMode/Helper/GameModeHelper.cs index 268ae64..7d90a86 100644 --- a/GameServer/Contents/GameMode/Helper/GameModeHelper.cs +++ b/GameServer/Contents/GameMode/Helper/GameModeHelper.cs @@ -1,4 +1,11 @@ -using Google.Protobuf; +using GameServer.Contents.GameMode.Manage; +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using GameServer.Contents.GameMode.Mode_Battle.ModeFreeForAll.Manage; +using GameServer.Contents.GameMode.Mode_Running.Manage; +using GameServer.Contents.GameMode.Mode_Running.ModeRace.Manage; +using Google.Protobuf; using Google.Protobuf.WellKnownTypes; @@ -15,57 +22,243 @@ namespace GameServer; public class GameModeHelper { - public static (Result, IGameModeJoinHandler) getGameModeJoinHandler(InstanceRoom instanceRoom, EPlaceType placeType) + public static (Result, IGameModeJoinHandler) getGameModeJoinHandler(InstanceRoom instanceRoom, int gameModeId, string roomId) { + (var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId); var result = new Result(); - switch (placeType) + switch (mode_type) { - case EPlaceType.BattleRoom: - return (result, new BattleInstanceJoinHandler(instanceRoom)); - case EPlaceType.ArcadeRunning: - return (result, new ArcadeRunningInstanceJoinHandler(instanceRoom)); - case EPlaceType.GameRoom: - return (result, new GameRoomJoinHandler(instanceRoom)); + case GameModeType.TPS_FFA: + return (result, new TPSFreeForAllJoinHandler(instanceRoom)); + case GameModeType.TPS_TDM: + return (result, new TPSTeamDeathMatchJoinHandler(instanceRoom)); + case GameModeType.RUN_ADV: + return (result, new RunAdventureJoinHandler(instanceRoom)); + case GameModeType.RUN_RACE: + return (result, new RunRaceJoinHandler(instanceRoom)); + //case GameModeType.DANCE_: + // return (result, new (instanceRoom)); default: - var err_msg = $"invalid placeType in this mode!!!! placeType : {placeType}"; + var err_msg = $"invalid gameMode !!! gameModeId : {gameModeId}"; result.setFail(ServerErrorCode.GameModeJoinHandlerNotExist, err_msg); - return (result, new BattleInstanceJoinHandler(instanceRoom)); + return (result, new TPSFreeForAllJoinHandler(instanceRoom)); } } - public static (Result, IGameModeInitHandler) getGameModeInitHandler(InstanceRoom instanceRoom, EPlaceType placeType) + public static (Result, IGameModeInitHandler) getGameModeInitHandler(InstanceRoom instanceRoom, int gameModeId, string roomId) { + (var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId); var result = new Result(); - switch (placeType) + switch (mode_type) { - case EPlaceType.BattleRoom: - return (result, new BattleInstanceInitHandler(instanceRoom)); - case EPlaceType.ArcadeRunning: - return (result, new ArcadeRunningInstanceInitHandler(instanceRoom)); - case EPlaceType.GameRoom: - return (result, new GameRoomInitHandler(instanceRoom)); + case GameModeType.TPS_FFA: + return (result, new TPSFreeForAllInitHandler(instanceRoom)); + case GameModeType.TPS_TDM: + return (result, new TPSTeamDeathMatchInitHandler(instanceRoom)); + case GameModeType.RUN_ADV: + return (result, new RunAdventureInitHandler(instanceRoom)); + case GameModeType.RUN_RACE: + return (result, new RunRaceInitHandler(instanceRoom)); default: - var err_msg = $"getGameModeInitHandler not!!!! placeType : {placeType}"; + var err_msg = $"getGameModeInitHandler not exist!!!! mode_type : {mode_type}"; result.setFail(ServerErrorCode.GameModeInitHandlerNotExist, err_msg); - return (result, new BattleInstanceInitHandler(instanceRoom)); + return (result, new TPSFreeForAllInitHandler(instanceRoom)); } } - public static (Result, IGameModeJoinSuccessHandler?) getGameModeJoinSuccessHandler(Player player, InstanceRoom instanceRoom, EPlaceType placeType) + public static (Result, IGameModeJoinSuccessHandler?) getGameModeJoinSuccessHandler(Player player, InstanceRoom instanceRoom, int gameModeId, string roomId) { var result = new Result(); - switch (placeType) + (var genre_type, var mode_type) = getGameModeMeta(gameModeId, roomId); + switch (mode_type) { - case EPlaceType.BattleRoom: - return (result, new BattleInstanceJoinSuccessHandler(player, instanceRoom)); - case EPlaceType.ArcadeRunning: - return (result, new ArcadeRunningInstanceJoinSuccessHandler(player, instanceRoom)); - case EPlaceType.GameRoom: - return (result, new GameRoomJoinSuccessHandler(player, instanceRoom)); + case GameModeType.TPS_FFA: + return (result, new TPSFreeForAllJoinSuccessHandler(player, instanceRoom)); + case GameModeType.TPS_TDM: + return (result, new TPSTeamDeathMatchJoinSuccessHandler(player, instanceRoom)); + case GameModeType.RUN_ADV: + return (result, new RunAdventureJoinSuccessHandler(player, instanceRoom)); + case GameModeType.RUN_RACE: + return (result, new RunRaceJoinSuccessHandler(player, instanceRoom)); default: - var err_msg = $"getGameModeInitHandler not!!!! placeType : {placeType}"; + var err_msg = $"getGameModeInitHandler not exist !!!! mode_type : {mode_type}"; result.setFail(ServerErrorCode.GameModeJoinSuccessHandlerNotExist, err_msg); return (result, null); } } + + public static (Result, IGameMode?) createGameMode(InstanceRoom instanceRoom, GameModeType modeType) + { + var result = new Result(); + switch (modeType) + { + case GameModeType.TPS_FFA: + return (result, new GameModeTPSFreeForAll(new GameModeTPSFreeForAllData(), instanceRoom)); + case GameModeType.TPS_TDM: + return (result, new GameModeTPSTeamDeathMatch(new GameModeTPSTeamDeathMatchData(), instanceRoom)); + case GameModeType.RUN_ADV: + return (result, new GameModeRunAdventure(new GameModeRunAdventureData(), instanceRoom)); + case GameModeType.RUN_RACE: + return (result, new GameModeRunRace(new GameModeRunRaceData(), instanceRoom)); + default: + var err_msg = $"createGameMode not exist !!!! mode_type : {modeType}"; + result.setFail(ServerErrorCode.GameModeCreateFail, err_msg); + return (result, null); + } + } + + public static (Result, IGameModeLeaveHandler?) getGameModeLeaveHandler(Player player, string roomId) + { + var result = new Result(); + (var genre_type, var mode_type) = getGameModeMeta(1, roomId); + switch (mode_type) + { + case GameModeType.TPS_FFA: + return (result, new TPSFreeForAllLeaveHandler(player, roomId)); + case GameModeType.TPS_TDM: + return (result, new TPSTeamDeathMatchLeaveHandler(player, roomId)); + case GameModeType.RUN_ADV: + return (result, new RunAdventureLeaveHandler(player, roomId)); + case GameModeType.RUN_RACE: + return (result, new RunRaceLeaveHandler(player, roomId)); + default: + var err_msg = $"getGameModeInitHandler not exist !!!! mode_type : {mode_type}"; + result.setFail(ServerErrorCode.GameModeJoinSuccessHandlerNotExist, err_msg); + return (result, null); + } + } + + public static (Result, IGameModeDestroyHandler?) getGameModeDestroyHandler(string roomId) + { + var result = new Result(); + (var genre_type, var mode_type) = getGameModeMeta(1, roomId); + switch (mode_type) + { + case GameModeType.TPS_FFA: + return (result, new TPSFreeForAllDestroyHandler(roomId)); + case GameModeType.TPS_TDM: + return (result, new TPSTeamDeathMatchDestroyHandler(roomId)); + case GameModeType.RUN_ADV: + return (result, new RunAdventureDestroyHandler(roomId)); + case GameModeType.RUN_RACE: + return (result, new RunRaceDestroyHandler(roomId)); + default: + var err_msg = $"getGameModeInitHandler not exist !!!! mode_type : {mode_type}"; + result.setFail(ServerErrorCode.GameModeJoinSuccessHandlerNotExist, err_msg); + return (result, null); + } + } + + + public static IHostMigrator createHostMigrator(int gameModeId) + { + var result = new Result(); + (var genre_type, var mode_type) = getGameModeMeta(gameModeId, "battle"); //kihoon 임시 마이그레이터 나중에 수정 필요 + switch (mode_type) + { + case GameModeType.TPS_FFA: + //return HostMigrationFactory.createCommonHostMigrator((int) BattlePlayMode.PodCombat, GameServerApp.getServerLogic()); + return new BattleFFAModeHostMigrator(); + default: + Log.getLogger().error($"createHostMigrator Not implements mode : {mode_type}"); + return new BattleFFAModeHostMigrator(); + } + } + + + public static (GameGenreType genreType, GameModeType modeType) getGameModeMeta(int gameModeId, string roomid) + { + // kihoon todo : Meta에서 데이터 가져와야 한다. + // kihoon todo : Meta가 없을경우의 result 처리 필요 + + //kihoon todo : roomid 는 임시 나중에 mode id로 넣어서 처리 해줘야 된다. + if (roomid.Contains("battle")) + { + return (GameGenreType.TPS, GameModeType.TPS_FFA); + } + else if (roomid.Contains("1017101")) + { + return (GameGenreType.Running, GameModeType.RUN_RACE); + } + + return (GameGenreType.TPS, GameModeType.TPS_FFA); + } + + public static GameModeBase toGameModeBase(IGameMode gameMode) + { + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); + return game_mode_base; + } + + public static async Task leaveGameInstanceRoom(string userGuid, string roomId) + { + var result = new Result(); + var err_msg = string.Empty; + + var server_logic = GameServerApp.getServerLogic(); + + var instance_room_storage = new InstanceRoomStorage(); + instance_room_storage.Init(server_logic.getRedisDb(), ""); + + await instance_room_storage.leaveInstanceRoom(userGuid, roomId); + + var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(roomId); + await instance_room_storage.decreaseInstanceRoomScore(instance_room_id_base, roomId); + + return result; + } + + public static string getInstanceRoomIdBaseFromInstanceRoomId(string instanceRoomId) + { + var instance_room_Id_element = instanceRoomId.Split(":"); + + if (instance_room_Id_element.Length >= 2) + { + return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}"; + } + Log.getLogger().error($"Instance room id weired : {instanceRoomId}"); + return string.Empty; + } + + public static IGameObject? getObjectInteractAction(GameModeBase gameModeBase, Anchor anchor) + { + var entity_type = gameModeBase.getEntityType(); + + switch (entity_type) + { + case EntityType.GameModeTpsfreeForAll: + //kihoon todo : table id 넘겨서 pickup, combat, weapon, buff, 인지 전달 받아야 된다. + return getTpsFreeForAllInteractAction(gameModeBase, anchor); + case EntityType.GameModeTpsteamDeathMatch: + return getTpsTeamDeathMatchInteractAction(gameModeBase, anchor); + case EntityType.GameModeRunAdventure: + return getRunAcventureInteractAction(gameModeBase, anchor); + case EntityType.GameModeRunRace: + return getRunRaceInteractAction(gameModeBase, anchor); + default: + return null; + } + } + + public static IGameObject? getRunRaceInteractAction(GameModeBase gameModeBase, Anchor anchor) + { + //kihoon todo :현재 savePoint 밖에 없어서 그거 넘긴다. + return gameModeBase.getEntityAction(); + } + + public static IGameObject? getTpsFreeForAllInteractAction(GameModeBase gameModeBase, Anchor anchor) + { + return null; + } + + public static IGameObject? getTpsTeamDeathMatchInteractAction(GameModeBase gameModeBase, Anchor anchor) + { + return null; + } + + public static IGameObject? getRunAcventureInteractAction(GameModeBase gameModeBase, Anchor anchor) + { + return null; + } } \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Helper/GameNotifyHelper.cs b/GameServer/Contents/GameMode/Helper/GameNotifyHelper.cs new file mode 100644 index 0000000..d5794af --- /dev/null +++ b/GameServer/Contents/GameMode/Helper/GameNotifyHelper.cs @@ -0,0 +1,35 @@ +using Google.Protobuf.WellKnownTypes; +using Newtonsoft.Json; +using ServerCore; + +namespace GameServer.Contents.GameMode.Helper; + +public class GameNotifyHelper +{ + public static void broadcast_GS2C_NTF_GAME_STATE_UPDATE(InstanceRoom instanceRoom, GameModeState state, DateTime nextUpdatableTime) + { + var ntf = makeNtfGameStateUpdate(instanceRoom, state, nextUpdatableTime); + Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE ntf instanceRoom Id : {instanceRoom.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfGameStateUpdate)}"); + instanceRoom.Broadcast(ntf); + } + + public static void send_GS2C_NTF_GAME_STATE_UPDATE(Player player, InstanceRoom instanceRoom, GameModeState state, DateTime nextUpdatableTime) + { + var ntf = makeNtfGameStateUpdate(instanceRoom, state, nextUpdatableTime); + Log.getLogger().debug($"send_GS2C_NTF_GAME_STATE_UPDATE ntf instanceRoom Id : {instanceRoom.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfGameStateUpdate)}"); + GameServerApp.getServerLogic().onSendPacket(player, ntf); + } + + public static ClientToGame makeNtfGameStateUpdate(InstanceRoom instanceRoom, GameModeState state, DateTime nextUpdatableTime) + { + ClientToGame ntf = new ClientToGame(); + ntf.Message = new ClientToGameMessage(); + ntf.Message.NtfGameStateUpdate = new ClientToGameMessage.Types.GS2C_NTF_GAME_STATE_UPDATE_NOTI(); + ntf.Message.NtfGameStateUpdate.CurrentState = state; + ntf.Message.NtfGameStateUpdate.NextUpdatableTime = Timestamp.FromDateTime(nextUpdatableTime); + + return ntf; + } + + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/InteractionObject/GameObject.cs b/GameServer/Contents/GameMode/InteractionObject/GameObject.cs new file mode 100644 index 0000000..93f5192 --- /dev/null +++ b/GameServer/Contents/GameMode/InteractionObject/GameObject.cs @@ -0,0 +1,76 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using MetaAssets; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.InteractionObject; + +public class GameObject : EntityBase +{ + public EntityType m_type = EntityType.None; + public string m_anchor_guid { get; set; } = string.Empty; + public DateTime m_active_time { get; set; } = DateTimeHelper.Current; + public bool m_is_active { get; set; } = true; + + public GameObject(EntityType type, string guid) : base(type) + { + m_type = type; + m_anchor_guid = guid; + } + + public GameObject(EntityType type, string guid, bool isActive) : base(type) + { + m_type = type; + m_anchor_guid = guid; + m_is_active = isActive; + } + +} + +public class GameObjectSavePoint : GameObject +{ + public GameObjectSavePoint(string anchorGuid) : base(EntityType.GameObjectSavePoint, anchorGuid) + { + } +} + +public class GameObjectWeapon : GameObject +{ + public GameObjectWeapon(string anchorGuid) : base(EntityType.GameObjectWeapon, anchorGuid) + { + } +} + +public class GameObjectBuff : GameObject +{ + public GameObjectBuff(string anchorGuid) : base(EntityType.GameObjectBuff, anchorGuid) + { + + } +} + +public class GameObjectPodStorage : GameObject +{ + public GameObjectPodStorage(string anchorGuid) : base(EntityType.GameObjectPodStorage, anchorGuid) + { + + } +} + +public class GameObjectCombatPod : GameObject +{ + public GameObjectCombatPod(string anchorGuid) : base(EntityType.GameObjectCombatPod, anchorGuid) + { + + } +} + + +public class GameObjectPickupPod : GameObject +{ + public GameObjectPickupPod(string anchorGuid) : base(EntityType.GameObjectPickupPod, anchorGuid) + { + + } +} diff --git a/GameServer/Contents/GameMode/Manage/GameModeInitHandlerBase.cs b/GameServer/Contents/GameMode/Manage/GameModeInitHandlerBase.cs deleted file mode 100644 index cb393d1..0000000 --- a/GameServer/Contents/GameMode/Manage/GameModeInitHandlerBase.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; - - -public abstract class GameModeInitHandlerBase : IGameModeInitHandler -{ - protected readonly EPlaceType m_place_type; - protected readonly InstanceRoom m_instance_room; - - public GameModeInitHandlerBase(InstanceRoom instanceRoom, EPlaceType placeType) - { - m_instance_room = instanceRoom; - m_place_type = placeType; - - } - - public abstract Result gamedModeInstanceInitValidate(); - - public abstract Result gamedModeInstanceInit(); -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/GameModeJoinHandlerBase.cs b/GameServer/Contents/GameMode/Manage/GameModeJoinHandlerBase.cs deleted file mode 100644 index 78b7d7b..0000000 --- a/GameServer/Contents/GameMode/Manage/GameModeJoinHandlerBase.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; - - -public abstract class GameModeJoinHandlerBase : IGameModeJoinHandler -{ - protected readonly InstanceRoom m_instance_room; - protected readonly EPlaceType m_place_type = EPlaceType.NONE; - - public GameModeJoinHandlerBase(InstanceRoom instanceRoom, EPlaceType placeType) - { - m_instance_room = instanceRoom; - m_place_type = placeType; - } - - public abstract Result gamedModeInstanceJoinValidate(EPlaceType placeType); //kihoon todo : 여기에 나중에 EPlaceType 대신 GameModeType이란걸 넣어야 한다. - public abstract Result gamedModeInstanceJoin(Player player); - - -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/GameRoomInitHandler.cs b/GameServer/Contents/GameMode/Manage/GameRoomInitHandler.cs deleted file mode 100644 index 1edf1ba..0000000 --- a/GameServer/Contents/GameMode/Manage/GameRoomInitHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ServerCommon; - - -namespace GameServer; - - -public class GameRoomInitHandler : GameModeInitHandlerBase -{ - public GameRoomInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.GameRoom) - { - } - - public override Result gamedModeInstanceInitValidate() - { - var result = new Result(); - return result; - } - - public override Result gamedModeInstanceInit() - { - var result = new Result(); - return result; - } -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/GameRoomJoinHandler.cs b/GameServer/Contents/GameMode/Manage/GameRoomJoinHandler.cs deleted file mode 100644 index d0bd793..0000000 --- a/GameServer/Contents/GameMode/Manage/GameRoomJoinHandler.cs +++ /dev/null @@ -1,27 +0,0 @@ -using ServerCommon; - - -namespace GameServer; - -public class GameRoomJoinHandler : GameModeJoinHandlerBase -{ - public GameRoomJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.GameRoom) - { - - } - - public override Result gamedModeInstanceJoinValidate(EPlaceType placeType) - { - var result = new Result(); - return result; - } - - public override Result gamedModeInstanceJoin(Player player) - { - var result = new Result(); - string err_msg = string.Empty; - - - return result; - } -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/IGameModeJoinHandler.cs b/GameServer/Contents/GameMode/Manage/IGameModeJoinHandler.cs deleted file mode 100644 index f89f4df..0000000 --- a/GameServer/Contents/GameMode/Manage/IGameModeJoinHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ - -using ServerCore; -using ServerBase; -using ServerCommon; - - -namespace GameServer; - -public interface IGameModeJoinHandler -{ - public Result gamedModeInstanceJoinValidate(EPlaceType placeType); //kihoon todo : 여기에 나중에 EPlaceType 대신 GameModeType이란걸 넣어야 한다. - public Result gamedModeInstanceJoin(Player player); -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/JoinManage/GameModeInitHandlerBase.cs b/GameServer/Contents/GameMode/Manage/JoinManage/GameModeInitHandlerBase.cs new file mode 100644 index 0000000..8179c52 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/JoinManage/GameModeInitHandlerBase.cs @@ -0,0 +1,55 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer; + +public abstract class GameModeInitHandlerBase : IGameModeInitHandler +{ + protected readonly GameModeType m_game_mode_type; + protected readonly InstanceRoom m_instance_room; + + public GameModeInitHandlerBase(InstanceRoom instanceRoom, GameModeType gameModeType) + { + m_instance_room = instanceRoom; + m_game_mode_type = gameModeType; + + } + + public abstract Result gamedModeInstanceInitValidate(); + + public virtual async Task gamedModeInstanceInit() + { + var result = await GameModeManager.It.createGameMode(m_instance_room, m_game_mode_type); //kihoon todo : 이렇게 짜는게 맞는지...고민좀 해보자 + if (result.isFail()) return result; + + var room_id = m_instance_room.getMap().m_room_id; + if(false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) + { + var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {room_id}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); + return result; + } + + var initializer = gameMode as IInitializer; + NullReferenceCheckHelper.throwIfNull(initializer, () => $"initializer is null !!! casting error"); + + var gamd_mod_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(gamd_mod_base, () => $"gamd_mod_base is null !!! casting error"); + + //모드별로 필요한 내용 초기화 + using (var releaser = await gamd_mod_base.getAsyncLock()) + { + if (gamd_mod_base.isLoadCompleted()) return result; + + result = await initializer.onInit(); + if (result.isFail()) return result; + } + + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinHandlerBase.cs b/GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinHandlerBase.cs new file mode 100644 index 0000000..eb9f3bf --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinHandlerBase.cs @@ -0,0 +1,20 @@ +using ServerCommon; + +namespace GameServer.Contents.GameMode.Manage; + +public abstract class GameModeJoinHandlerBase : IGameModeJoinHandler +{ + protected readonly InstanceRoom m_instance_room; + protected readonly GameModeType m_game_mode_type; + + public GameModeJoinHandlerBase(InstanceRoom instanceRoom, GameModeType gameModeType) + { + m_instance_room = instanceRoom; + m_game_mode_type = gameModeType; + } + + public abstract Result gamedModeInstanceJoinValidate(); + public abstract Result gamedModeInstanceJoin(Player player); + + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/GameModeJoinSuccessHandlerBase.cs b/GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinSuccessHandlerBase.cs similarity index 67% rename from GameServer/Contents/GameMode/Manage/GameModeJoinSuccessHandlerBase.cs rename to GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinSuccessHandlerBase.cs index 44ab44d..d565f93 100644 --- a/GameServer/Contents/GameMode/Manage/GameModeJoinSuccessHandlerBase.cs +++ b/GameServer/Contents/GameMode/Manage/JoinManage/GameModeJoinSuccessHandlerBase.cs @@ -1,29 +1,21 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - -namespace GameServer; +namespace GameServer.Contents.GameMode.Manage; public abstract class GameModeJoinSuccessHandlerBase : IGameModeJoinSuccessHandler { protected Player m_player; - //protected InstanceRoom m_instance_room; - protected EPlaceType m_place_type; + protected GameModeType m_game_mode_type; protected List m_log_invorkers; + protected InstanceRoom m_instance_room; - public GameModeJoinSuccessHandlerBase(Player player, EPlaceType placeType) + public GameModeJoinSuccessHandlerBase(Player player, GameModeType gameModeType, InstanceRoom instanceRoom) { m_player = player; - //m_instance_room = instanceRoom; - m_place_type = placeType; + m_game_mode_type = gameModeType; m_log_invorkers = new(); + m_instance_room = instanceRoom; } public async Task joinSuccess() diff --git a/GameServer/Contents/GameMode/Manage/IGameModeInitHandler.cs b/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeInitHandler.cs similarity index 70% rename from GameServer/Contents/GameMode/Manage/IGameModeInitHandler.cs rename to GameServer/Contents/GameMode/Manage/JoinManage/IGameModeInitHandler.cs index 4ca686d..05e91bc 100644 --- a/GameServer/Contents/GameMode/Manage/IGameModeInitHandler.cs +++ b/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeInitHandler.cs @@ -3,5 +3,5 @@ public interface IGameModeInitHandler { public Result gamedModeInstanceInitValidate(); - public Result gamedModeInstanceInit(); + public Task gamedModeInstanceInit(); } \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinHandler.cs b/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinHandler.cs new file mode 100644 index 0000000..7c1e75b --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinHandler.cs @@ -0,0 +1,9 @@ +using ServerCommon; + +namespace GameServer.Contents.GameMode.Manage; + +public interface IGameModeJoinHandler +{ + public Result gamedModeInstanceJoinValidate(); + public Result gamedModeInstanceJoin(Player player); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/IGameModeJoinSuccessHandler.cs b/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinSuccessHandler.cs similarity index 63% rename from GameServer/Contents/GameMode/Manage/IGameModeJoinSuccessHandler.cs rename to GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinSuccessHandler.cs index b67b2f5..20b321c 100644 --- a/GameServer/Contents/GameMode/Manage/IGameModeJoinSuccessHandler.cs +++ b/GameServer/Contents/GameMode/Manage/JoinManage/IGameModeJoinSuccessHandler.cs @@ -1,5 +1,4 @@ - -namespace GameServer; +namespace GameServer.Contents.GameMode.Manage; public interface IGameModeJoinSuccessHandler { diff --git a/GameServer/Contents/GameMode/Manage/LeaveManage/GameModeDestroyHandlerBase.cs b/GameServer/Contents/GameMode/Manage/LeaveManage/GameModeDestroyHandlerBase.cs new file mode 100644 index 0000000..5e17294 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/LeaveManage/GameModeDestroyHandlerBase.cs @@ -0,0 +1,76 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Manage.LeaveManage; + +public abstract class GameModeDestroyHandlerBase : IGameModeDestroyHandler +{ + protected readonly GameModeType m_game_mode_type; + protected string m_room_id; + protected IGameMode? m_game_mode; + + public GameModeDestroyHandlerBase(string roomId, GameModeType gameModeType) + { + m_game_mode_type = gameModeType; + m_room_id = roomId; + } + + public abstract Task postDestroy(IGameMode gameMode); + + public async Task gameModeDestroy() + { + var result = new Result(); + if (false == GameModeManager.It.tryGetGameMode(m_room_id, out var gameMode)) + { + var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {m_room_id}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); + return result; + } + + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!! casting error"); + + using (var releaser = await game_mode_base.getAsyncLock()) + { + var ticker = game_mode_base.getEntityTicker(); + if (ticker is not null) + { + try + { + ticker.cancel(); + ticker = null; + } + catch(Exception e) + { + var err_msg = $"Exception !!!, Failed to cancel ||| : Exception:{e}"; + Log.getLogger().debug(err_msg); + } + } + + //모드별 destroy 처리 + await postDestroy(gameMode); + + if (false == GameModeManager.It.tryRemoveGameMode(m_room_id, out var _)) + { + var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {m_room_id}"; + Log.getLogger().warn(err_msg); + } + + + } + + + return result; + } + + + + + + + + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/LeaveManage/GameModeLeaveHandlerBase.cs b/GameServer/Contents/GameMode/Manage/LeaveManage/GameModeLeaveHandlerBase.cs new file mode 100644 index 0000000..6324849 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/LeaveManage/GameModeLeaveHandlerBase.cs @@ -0,0 +1,125 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Manage.LeaveManage; + +public abstract class GameModeLeaveHandlerBase : IGameModeLeaveHandler +{ + protected readonly GameModeType m_game_mode_type; + protected Player m_player; + protected string m_room_id; + + public GameModeLeaveHandlerBase(Player player, string roomId, GameModeType gameModeType) + { + m_game_mode_type = gameModeType; + m_player = player; + m_room_id = roomId; + } + + public virtual async Task gameModeLeave() + { + var result = new Result(); + + if (false == GameModeManager.It.tryGetGameMode(m_room_id, out var gameMode)) + { + var err_msg = $"battle_instance_room is null : room_id - {m_room_id}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg); + return result; + } + + await removeUserFromInstanceRoom(m_player, gameMode); + await leaveGameZone(gameMode); + await removeHost(gameMode); + + + result = await postLeave(gameMode); + if(result.isFail()) return result; + + result = await notifyAfterLeave(gameMode); + if(result.isFail()) return result; + + result = await logAfterLeave(gameMode); + if(result.isFail()) return result; + + + + await destroyCheck(gameMode); + return result; + } + + public async Task removeUserFromInstanceRoom(Player player, IGameMode gameMode) + { + var game_mode_base = GameModeHelper.toGameModeBase(gameMode); + await Task.CompletedTask; + + var instance_room = game_mode_base.getInstanceRoom(); + var user_guid = player.getUserGuid(); + + var result = instance_room.getMap().tryRemovePlayer(player); + if (result.isFail()) return; + + await GameModeHelper.leaveGameInstanceRoom(user_guid, m_room_id); + + } + + public async Task removeHost(IGameMode gameMode) + { + var game_mode_base = GameModeHelper.toGameModeBase(gameMode); + var host_user_guid = game_mode_base.m_host_migrator.getHostUserGuid(); + if (m_player.getUserGuid().Equals(host_user_guid)) + { + using (var releaser = await game_mode_base.getAsyncLock()) + { + game_mode_base.m_host_migrator.removeHost(); + } + } + } + + public async Task leaveGameZone(IGameMode gameMode) + { + var game_mode_base = GameModeHelper.toGameModeBase(gameMode); + await Task.CompletedTask; + var location_attribute = m_player.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"LocationAttribute is null !!! - player:{m_player.toBasicString()}"); + location_attribute.CurrentIndunLocation.clear(); + + var game_zone_action = m_player.getEntityAction(); + await game_zone_action.tryLeaveGameZone(); + + var instance_room = game_mode_base.getInstanceRoom(); + + if (instance_room.SessionCount + instance_room.getMap().getCurrCountAsAddConnectedUser() > 0) + { + ClientToGame clientToGame = new ClientToGame(); + clientToGame.Message = new ClientToGameMessage(); + clientToGame.Message.LeaveInstanceRoomMember = new ClientToGameMessage.Types.LeaveInstanceRoomMember(); + clientToGame.Message.LeaveInstanceRoomMember.MemberGuid = m_player.getUserGuid(); + + instance_room.Broadcast(clientToGame); + } + } + + public async Task destroyCheck(IGameMode gameMode) + { + var game_mode_base = GameModeHelper.toGameModeBase(gameMode); + if (game_mode_base.getInstanceRoom().isDestroy) + { + (var result, var destroy_handler) = GameModeHelper.getGameModeDestroyHandler(game_mode_base.getRoomId()); + if (result.isSuccess() && destroy_handler is not null) + { + await destroy_handler.gameModeDestroy(); + } + } + + await Task.CompletedTask; + } + + public abstract Task postLeave(IGameMode gameMode); + public abstract Task notifyAfterLeave(IGameMode gameMode); + + public abstract Task logAfterLeave(IGameMode gameMode); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeDestroyHandler.cs b/GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeDestroyHandler.cs new file mode 100644 index 0000000..438eb96 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeDestroyHandler.cs @@ -0,0 +1,7 @@ +namespace GameServer.Contents.GameMode.Manage.LeaveManage; + +public interface IGameModeDestroyHandler +{ + Task gameModeDestroy(); + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeLeaveHandler.cs b/GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeLeaveHandler.cs new file mode 100644 index 0000000..c177820 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/LeaveManage/IGameModeLeaveHandler.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Manage.LeaveManage; + +public interface IGameModeLeaveHandler +{ + Task gameModeLeave(); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs b/GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs new file mode 100644 index 0000000..340db4a --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/GameModeBase.cs @@ -0,0 +1,135 @@ +using Amazon.DynamoDBv2.Model; +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.StateManage; +using NeoSmart.AsyncLock; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Manage.PlayManage; + +public abstract class GameModeBase : EntityBase, IGameMode, IWithLogActor +{ + protected bool m_is_init_completed = false; + protected InstanceRoom m_instance_room; + public readonly IHostMigrator m_host_migrator; + protected EntityTicker? m_ticker; + protected Int32 m_ticker_interval_msecs = GameModeConstants.GAME_MODE_DEFAULT_INTERVAL_MSECS; + protected IGameModeState? m_current_game_mode_state; //kihoon todo: 이거 수정해야된다. IGameMode를 받으면 안될듯...아니면 받더래도 + + public GameModeBase(EntityType type, InstanceRoom instanceRoom) : base(type) + { + m_is_init_completed = false; + m_instance_room = instanceRoom; + ArgumentNullReferenceCheckHelper.throwIfNull(instanceRoom, () => $"GameModeBase constructor instanceRoom is null !!!"); + m_host_migrator = HostMigrationFactory.createCommonHostMigrator(1, GameServerApp.getServerLogic()); //kihoon todo : gamemodeID를 넘겨야 한다; + } + + public override async Task onInit() + { + var result = new Result(); + + //action 추가 + addEntityActions(); + + //GameModeBase 쪽 로직 더 넣을것 있으면 여기에 + + result = await base.onInit(); + if (result.isFail()) return result; + + + //init이 다 되면 ticker 만든다. + result = await createTask(); + if (result.isFail()) return result; + + //타이머 생성후 초기해야될 것이 있으면 한다. + await initAfterTimerCreate(); + + m_is_init_completed = true; + + return result; + } + + + public void addEntityActions() + { + + } + + public string getRoomId() + { + return m_instance_room.getMap().m_room_id; + } + + private async Task createTask() + { + var result = new Result(); + + m_ticker = createTaskTicker(); + NullReferenceCheckHelper.throwIfNull(m_ticker, () => $"m_ticker is null !!! - id"); + await m_ticker.onInit(); + + await Task.CompletedTask; + + return result; + } + + public EntityTicker createTaskTicker() //나중에 모드별로 별도 정의 필요하면 그때 virtual로 + { + var ticker = new GameModeLifeCycleTicker(this, m_ticker_interval_msecs, gameModeTaskTick); + return ticker; + } + + private async Task gameModeTaskTick() + { + if (!m_is_init_completed) return; + + try + { + await taskUpdate(); + } + catch(Exception e) + { + Log.getLogger().error($"Exception !!!, new gameModeTaskTick() : exception:{e}, basicString : {toBasicString()}"); + } + } + + public abstract Task taskUpdate(); + public abstract Task initAfterTimerCreate(); + + public override string toBasicString() + { + var basic_string = base.toBasicString() + $"GameModeBase.... room_id : {getRoomId()}"; + return basic_string; + } + + public bool isLoadCompleted() + { + return m_is_init_completed; + } + + + + public IGameModeState getGameModeState() + { + NullReferenceCheckHelper.throwIfNull(m_current_game_mode_state, () => $"m_current_game_mode_state is null !!"); + return m_current_game_mode_state; + } + + public void setGameModeState(IGameModeState state) + { + m_current_game_mode_state = state; + } + + public InstanceRoom getInstanceRoom() => m_instance_room; + public EntityTicker? getEntityTicker() => m_ticker; + public ILogActor toLogActor() + { + var server_logic = GameServerApp.getServerLogic(); + var region_id = server_logic.getServerConfig().getRegionId(); + var server_name = server_logic.getServerName(); + + var log_info = new BattleInstanceActorLog(region_id, server_name, getRoomId(), m_instance_room.getInstanceId()); + return log_info; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/GameModeLifeCycleTicker.cs b/GameServer/Contents/GameMode/Manage/PlayManage/GameModeLifeCycleTicker.cs new file mode 100644 index 0000000..ed3f45f --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/GameModeLifeCycleTicker.cs @@ -0,0 +1,54 @@ +using System.Diagnostics; +using Amazon.Runtime; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer; + +public class GameModeLifeCycleTicker : EntityTicker +{ + private Func m_task_tick; + public GameModeLifeCycleTicker(EntityBase parent, Int32 onTickIntervalMilliseconds, Func taskTick) + : base(EntityType.GameModeLifeCycleTicker, parent, onTickIntervalMilliseconds, null) + { + m_task_tick = taskTick; + } + public override async Task onTaskTick() + { + var result = new Result(); + var err_msg = string.Empty; + + Stopwatch? stopwatch = null; + var event_tid = string.Empty; + + var server_logic = GameServerApp.getServerLogic(); + var server_config = server_logic.getServerConfig(); + var seasonPassManager = server_logic.getSeasonPassManager(); + + if (true == server_config.PerformanceCheckEnable) + { + event_tid = System.Guid.NewGuid().ToString("N"); + stopwatch = Stopwatch.StartNew(); + } + //logic 처리 + await m_task_tick(); + + if (null != stopwatch) + { + var elapsed_msec = stopwatch.ElapsedMilliseconds; + stopwatch.Stop(); + Log.getLogger().debug($"{GetType()} Ticker Stopwatch Stop : ETID:{event_tid}, ElapsedMSec:{elapsed_msec}, TickIntervalMSec:{getOnTickIntervalMilliseconds()}"); + } + } + + public override string toBasicString() + { + return $"{this.getTypeName()}"; + } + + public override string toSummaryString() + { + return $"{this.getTypeName()}"; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/GameModeManager.cs b/GameServer/Contents/GameMode/Manage/PlayManage/GameModeManager.cs new file mode 100644 index 0000000..01f150f --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/GameModeManager.cs @@ -0,0 +1,71 @@ +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCore; +using NeoSmart.AsyncLock; +using ServerBase; +using ServerCommon; + +namespace GameServer; + +public class GameModeManager : Singleton +{ + private AsyncLock m_lock = new(); + private ConcurrentDictionary m_game_modes = new(); /**/ + + public async Task onInit() + { + //1. 이벤트 관리하는 Task 추가 + //var result = await createBattleEventCheckerTask(); //kihoon todo : 이부분은 GameModeEventCheckerTask라는 걸로 변경 처리 해준다. 여기서 처리 안해줄수 도 있다. + await Task.CompletedTask; + } + + + public async Task createGameMode(InstanceRoom instanceRoom, GameModeType gameModeType) + { + (var result, var game_mode) = GameModeHelper.createGameMode(instanceRoom, gameModeType); + if (result.isFail()) return result; + if (game_mode is null) + { + var err_msg = $"game_mode is null !!!! gameModeType : {gameModeType}, instanceRoomId : {instanceRoom.getMap().m_room_id}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); + return result; + } + var room_id = instanceRoom.getMap().m_room_id; + + if (false == tryAdd(room_id, game_mode)) + { + //이미 들어가져 있으므로 로그만 남겨놓고 리턴 + Log.getLogger().warn($"game_mode already exist...... gameModeType : {gameModeType}, instanceRoomId : {instanceRoom.getMap().m_room_id}"); + } + + await Task.CompletedTask; + return result; + } + + public bool tryGetGameMode(string roomId, [MaybeNullWhen(false)] out IGameMode gameMode) + { + var ret = m_game_modes.TryGetValue(roomId, out gameMode); + + if (ret == false) + { + var err_msg = $"gameMode is null : room_id - {roomId}"; + Log.getLogger().error(err_msg); + } + + return ret; + } + + public bool tryRemoveGameMode(string roomId, [MaybeNullWhen(false)] out IGameMode gameMode) + { + return m_game_modes.TryRemove(roomId, out gameMode); + } + + public bool tryAdd(string roomId, IGameMode gameMode) + { + return m_game_modes.TryAdd(roomId, gameMode); + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/IDeadHandler.cs b/GameServer/Contents/GameMode/Manage/PlayManage/IDeadHandler.cs new file mode 100644 index 0000000..88e6d75 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/IDeadHandler.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Manage.PlayManage; + +public interface IDeadHandler +{ + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/IGameMode.cs b/GameServer/Contents/GameMode/Manage/PlayManage/IGameMode.cs new file mode 100644 index 0000000..7d7787f --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/IGameMode.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Manage.PlayManage; + +public interface IGameMode +{ + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/IGameModeGenre.cs b/GameServer/Contents/GameMode/Manage/PlayManage/IGameModeGenre.cs new file mode 100644 index 0000000..c0f1d3f --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/IGameModeGenre.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Manage.PlayManage; + +public interface IGameModeGenre +{ + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/PlayManage/IGameObject.cs b/GameServer/Contents/GameMode/Manage/PlayManage/IGameObject.cs new file mode 100644 index 0000000..49dba80 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/PlayManage/IGameObject.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Manage.PlayManage; + +public interface IGameObject +{ + Task interact(string anchorGuid, DateTime interactionTime); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/StateManage/GameModeStateBase.cs b/GameServer/Contents/GameMode/Manage/StateManage/GameModeStateBase.cs new file mode 100644 index 0000000..83245af --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/StateManage/GameModeStateBase.cs @@ -0,0 +1,42 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCore; + +namespace GameServer.Contents.GameMode.Manage.StateManage; + + + +public abstract class GameModeStateBase : IGameModeState +{ + protected IGameMode m_game_mode; + protected GameModeBase m_game_mode_base; + private GameModeState m_state = GameModeState.None; + protected DateTime m_next_state_change_time; + + + public GameModeStateBase(IGameMode gameMode, GameModeState state) + { + m_game_mode = gameMode; + var game_mode_base = m_game_mode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!"); + m_game_mode_base = game_mode_base; + + + m_next_state_change_time = DateTimeHelper.Current.AddSeconds(10); //kihoon todo: 대기시간은 나중에 meta로 반영해야 된다. + m_state = state; + } + + public abstract void enter(); + public abstract void update(); + public abstract void exit(); + public abstract GameModeState checkState(); + + public GameModeState getStateType() + { + return m_state; + } + + public DateTime getNextStateChangeTime() + { + return m_next_state_change_time; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/StateManage/IGameModeState.cs b/GameServer/Contents/GameMode/Manage/StateManage/IGameModeState.cs new file mode 100644 index 0000000..b14a4e8 --- /dev/null +++ b/GameServer/Contents/GameMode/Manage/StateManage/IGameModeState.cs @@ -0,0 +1,14 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; + +namespace GameServer; + +public interface IGameModeState +{ + public void enter(); + public void exit(); + + + public void update(); + public GameModeState checkState(); + public GameModeState getStateType(); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Cheat/BattleCheat.cs b/GameServer/Contents/GameMode/Mode-Battle/Cheat/BattleCheat.cs deleted file mode 100644 index c5a70cc..0000000 --- a/GameServer/Contents/GameMode/Mode-Battle/Cheat/BattleCheat.cs +++ /dev/null @@ -1,179 +0,0 @@ -using Nettention.Proud; - - -using ServerCore; -using ServerBase; -using ServerCommon; - - - -namespace GameServer; - - - - -[ChatCommandAttribute("battleinstanceinit", typeof(CheatBattleInstanceInit), AuthAdminLevelType.Developer, - AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] -public class CheatBattleInstanceInit : ChatCommandBase -{ - public override async Task invoke(Player player, string token, string[] args) - { - Log.getLogger().info($"battleinstanceinit"); - - var server_logic = GameServerApp.getServerLogic(); - - var room_id = player.getCurrentInstanceRoomId(); - if (room_id.Equals(string.Empty)) - { - Log.getLogger().error($"cheat:battleinstanceinit.... this cheat only use in instance"); - return; - } - - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room is null) - { - Log.getLogger().error($"cheat:battleinstanceinit.... battle_instance_room is null room_id : {room_id}"); - return; - } - - using (var releaser = await battle_instance_room.getAsyncLock()) - { - var attribute = battle_instance_room.getEntityAttribute(); - NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); - - if (false == attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.RoundEndAll) && - false == attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.Destroyed)) - { - Log.getLogger().error($"cheat:battleinstanceinit.... this cheat only RoundEndAll room_id : {room_id}"); - return; - } - - var now = DateTimeHelper.Current; - battle_instance_room.setEventStartTime(now); - - attribute.m_combat_pod_mode.m_round_state_type = BattleRoundStateType.Rounding; - attribute.m_combat_pod_mode.m_current_state_start_time = now; - attribute.m_combat_pod_mode.m_current_round = 1; - attribute.m_combat_pod_mode.m_charged_step = 0; - attribute.m_combat_pod_mode.m_rewarded_step = 0; - - attribute.m_combat_pod_mode.m_pod_combat.setActive(now); - - - (Result result, var anchor_guid) = - BattleRoomHelper.getRandomCombatPodAnchorGuid(attribute, battle_instance_room); - if (result.isFail()) - { - Log.getLogger().error("get Random pod combat anchor guid faile !!! "); - return; - } - - attribute.m_combat_pod_mode.m_pod_combat.m_source_storage_anchor_guid = anchor_guid; - - BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE(battle_instance_room); - - var update_action = battle_instance_room.getEntityAction(); - NullReferenceCheckHelper.throwIfNull(update_action, () => $"attribute is null !!!"); - update_action.battleObjectStateInitAndNotify(battle_instance_room, attribute); - - BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battle_instance_room); - } - } -} - -[ChatCommandAttribute("gamemodeoccupyhost", typeof(BattleHostOccupy), AuthAdminLevelType.Developer, - AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] -public class BattleHostOccupy : ChatCommandBase -{ - public override async Task invoke(Player player, string token, string[] args) - { - //Log.getLogger().info($"battleinstanceinit"); - - var server_logic = GameServerApp.getServerLogic(); - - var room_id = player.getCurrentInstanceRoomId(); - if (room_id.Equals(string.Empty)) - { - Log.getLogger().error($"cheat:gamemodeoccupyhost.... this cheat only use in instance"); - return; - } - - - //kihoon todo : 임시 분기 처리 - //나중에 게임모드로 분리되면 그때 재작업 - if (room_id.Contains("battle")) - { - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room is null) - { - Log.getLogger().error($"cheat:gamemodeoccupyhost.... battle_instance_room is null room_id : {room_id}"); - return; - } - - using (var releaser = await battle_instance_room.getAsyncLock()) - { - battle_instance_room.m_host_migrator.modifyHost(player.getUserGuid()); - } - - BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(battle_instance_room.m_instance_room, - player.getUserGuid()); - } - else if (room_id.Contains("1017101")) - { - var instance_room = InstanceRoomManager.Instance.getInstanceRoomByRoomId(room_id); - if (instance_room is null) - { - Log.getLogger().error($"cheat:gamemodeoccupyhost.... instance_room is null room_id : {room_id}"); - return; - } - - BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(instance_room, player.getUserGuid()); - } - } -} - -//====================================================================================================================== -// -//====================================================================================================================== -[ChatCommandAttribute("gamehostmigration", typeof(BattleHostMigration), AuthAdminLevelType.Developer, - AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] -public class BattleHostMigration : ChatCommandBase -{ - public override async Task invoke(Player player, string token, string[] args) - { - Log.getLogger().info($"gamehostmigration"); - - var server_logic = GameServerApp.getServerLogic(); - - var room_id = player.getCurrentInstanceRoomId(); - if (room_id.Equals(string.Empty)) - { - Log.getLogger().error($"cheat:gamehostmigration.... this cheat only use in instance"); - return; - } - - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room is null) - { - Log.getLogger().error($"cheat:gamehostmigration.... battle_instance_room is null room_id : {room_id}"); - return; - } - - using var releaser = await battle_instance_room.getAsyncLock(); - if (battle_instance_room.m_host_migrator is CommonHostMigrator common_hot_migrator) - { - common_hot_migrator.HostMigrationSystem.setIgnoreMigrationCondition(true); - common_hot_migrator.migrateCheck(true); - var super_peer_guid_id = common_hot_migrator.getHostUserGuid(); - BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE( - battle_instance_room.m_instance_room, super_peer_guid_id); - common_hot_migrator.HostMigrationSystem.setIgnoreMigrationCondition(false); - } - else - { - Log.getLogger() - .error( - $"cheat:gamehostmigration.... battle_instance_room is not CommonHostMigrator room_id : {room_id}"); - } - } -} diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceInitHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceInitHandler.cs deleted file mode 100644 index 937132b..0000000 --- a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceInitHandler.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; - - -public class BattleInstanceInitHandler : GameModeInitHandlerBase -{ - public BattleInstanceInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.BattleRoom) - { - } - - public override Result gamedModeInstanceInitValidate() - { - var result = BattleRoomHelper.checkBattleActive(m_place_type); - return result; - } - - public override Result gamedModeInstanceInit() - { - var result = BattleInstanceManager.It.battleInstanceInit(m_instance_room, m_instance_room.getMap().m_room_id).Result; //kihoon todo :이거 리팩토링 대상 - if (result.isFail()) - { - Log.getLogger().error(result.toBasicString()); - } - - return result; - } -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinHandler.cs deleted file mode 100644 index 57328ef..0000000 --- a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinHandler.cs +++ /dev/null @@ -1,47 +0,0 @@ - -using ServerCore; -using ServerBase; -using ServerCommon; - - -namespace GameServer; - - -public class BattleInstanceJoinHandler : GameModeJoinHandlerBase -{ - public BattleInstanceJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.BattleRoom) - { - - } - - public override Result gamedModeInstanceJoinValidate(EPlaceType placeType) - { - var result = BattleRoomHelper.checkBattleActive(m_place_type); - return result; - } - - public override Result gamedModeInstanceJoin(Player player) - { - var result = new Result(); - string err_msg = string.Empty; - - //instanceroom 정보는 남아있는데 battleinstance만 없어지는 케이스가 있어서 예외 처리를 위해 넣어놓음 - var room_id = m_instance_room.getMap().m_room_id; - - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); //리팩토링 대상 - if (battle_instance_room is null) - { - Log.getLogger().error($"Battle Room Instance is null.. so init start roomId : {room_id}"); - - result = Task.Run(() => BattleInstanceManager.It.battleInstanceInit(m_instance_room, room_id)).GetAwaiter().GetResult(); - if (result.isFail()) - { - err_msg = $"BattleIntanceJoin init error, _roomId : {room_id}"; - Log.getLogger().error(err_msg); - return result; - } - } - - return result; - } -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceManager.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceManager.cs index 0c0f8da..9819849 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceManager.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceManager.cs @@ -1,18 +1,18 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; - +using GameServer.Contents.Battle.Tickers; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using Google.Protobuf.WellKnownTypes; using NeoSmart.AsyncLock; using Newtonsoft.Json; -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; + using ServerCore; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; +using Constant = System.Reflection.Metadata.Constant; namespace GameServer; @@ -20,191 +20,19 @@ namespace GameServer; public class BattleInstanceManager : Singleton { private AsyncLock m_lock_init = new(); - public AsyncLock m_lock_data_load = new(); - - private ConcurrentDictionary m_battle_instances = new(); //인스턴스 생성 삭제를 주로 관리 하기 위한 Dictionary ... 아...이거 구조 별론데,.... + //private ConcurrentDictionary m_battle_instances = new(); //인스턴스 생성 삭제를 주로 관리 하기 위한 Dictionary ... 아...이거 구조 별론데,.... private ConcurrentDictionary m_battle_events = new(); - + public async Task onInit() { //1. 이벤트 관리하는 Task 추가 var result = await createBattleEventCheckerTask(); - } - - public bool hasBattleInstance(string roomId) - { - return m_battle_instances.ContainsKey(roomId); - } - - public BattleInstanceRoom? getBattleInstanceRoom(string roomId) - { - if (false == m_battle_instances.TryGetValue(roomId, out var room)) - { - return null; - } - - return room; - - } - - public ConcurrentDictionary getBattleInstanceRooms() - { - return m_battle_instances; - } - - // - // public bool isLoadComplete(string roomId) - // { - // if (false == m_battle_instances.TryGetValue(roomId, out var battleInstanceRoom)) - // { - // return false; - // } - // return battleInstanceRoom.m_is_load_complete; - // } - - public async Task battleInstanceInit(InstanceRoom instanceRoom, string roomId) - { - var result = new Result(); - var err_msg = string.Empty; - - using (await m_lock_init.LockAsync()) - { - //1. 배틀 인스턴스에 대한 정보 생성 - Log.getLogger().info($"Battle Instance Create And Init : {roomId}"); - if (hasBattleInstance(roomId)) return result; - - // instance 정보 추가 등록 - var server_logic = GameServerApp.getServerLogic(); - var instance_room_storage = new InstanceRoomStorage(); - instance_room_storage.Init(server_logic.getRedisDb(), ""); - - DateTime start_time = DateTimeHelper.Current; - Int32 config_id = 1; - Int32 reward_id = 1; - Int32 hot_time = 1; - Int32 round_count = 8; - var system_battle_event = BattleRoomHelper.getBattleRoomStartTimeByEventId(roomId); - if (system_battle_event is null) - { - Log.getLogger().error($"system_battle_event is null!!! : {result.toBasicString()} - instanceRoomId:{roomId}"); - } - else - { - start_time = system_battle_event.m_start_time; - config_id = system_battle_event.m_ffa_config_data_id; - reward_id = system_battle_event.m_ffa_reward_group_id; - hot_time = system_battle_event.m_ffa_hot_time; - round_count = system_battle_event.m_round_count; - } - - - result = await instance_room_storage.setInstanceRoomExtraInfo(roomId, EPlaceType.BattleRoom, start_time); - if (result.isFail()) - { - Log.getLogger().error($"Failed to BattleRoom setInstanceRoomExtraInfo() !!! : {result.toBasicString()} - instanceRoomId:{roomId}"); - return result; - } - - BattleInstanceRoom battle_instance_room = new BattleInstanceRoom(instanceRoom, start_time, config_id, reward_id, hot_time, round_count); - if (false == m_battle_instances.TryAdd(roomId, battle_instance_room)) - { - //이미 존재하는 경우는 onInit 절차를 거쳤다고 생각하고, init 처리 안해주고 리턴 - err_msg = $"Battle Instance Room Already exist room_id : {roomId}"; - result.setFail(ServerErrorCode.BattleInstanceInfoAlreadyExist, err_msg); - Log.getLogger().warn(result.toBasicString()); - - return result; - } - - //2. 초기화 - result = await battle_instance_room.init(); - if (result.isFail()) - { - Log.getLogger().warn(result.toBasicString()); - return result; - } - } - Log.getLogger().info($"battleInstanceInit done roomId : {roomId}"); - - return result; - } - - public Result addOrUpatePlayer(string roomId, Player player) - { - var result = new Result(); - string err_msg = string.Empty; - - if (false == m_battle_instances.TryGetValue(roomId, out var battle_instance_room)) - { - err_msg = $"m_battle_instances not exist battleRoomInstance, roomId : {roomId}"; - result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg); - Log.getLogger().error(result.toBasicString()); - return result; - } - - //유저 정보 추가 해줘야 한다. - result = battle_instance_room.AddOrUpdatePlayer(player); - - return result; - } - - private async Task createBattleEventCheckerTask() - { - - var result = new Result(); - - var battle_entity_ticker_initializers = new Initializers(); - - //채널 인던 다 필요한가? - //이벤트 인스턴스 관련 생성 삭제에 대한 관리 Ticker - - //battle_entity_ticker_initializers.appendInitializer(new BattleEventCheckTicker(1000, null)); - //battle_entity_ticker_initializers.appendInitializer(new BattleEventNotifyTicker(ServerCommon.Constant.EVENT_UPDATE_INTERVAL_MMIN, null)); - - result = await battle_entity_ticker_initializers.init("BattleEntityTickers"); - if (result.isFail()) - { - Log.getLogger().error($"Failed to init() !!! : {result.toBasicString()}"); - return result; - } - - var battle_event_check_ticker = new BattleEventCheckTicker(BattleConstant.BATTLE_EVENT_CHECK_INTERVAL, null); - await battle_event_check_ticker.onInit(); - await createTask(battle_event_check_ticker); - var battle_event_notify_ticker = new BattleEventNotifyTicker(ServerCommon.Constant.EVENT_UPDATE_INTERVAL_MMIN, null); - await battle_event_check_ticker.onInit(); - await createTask(battle_event_notify_ticker); - - return result; - } - - private async Task createTask(EntityTicker ticker) - { - var result = new Result(); - - await Task.CompletedTask; - try - { - - new PeriodicTaskTimer( ticker.getTypeName() , ticker.getOnTickIntervalMilliseconds(), ticker.getCancelToken(), ticker.onTaskTick); - Log.getLogger().debug("createTask done"); - } - catch(Exception e) - { - var err_msg = $"Exception !!!, new PeriodicTaskTimer() : exception:{e}"; - result.setFail(ServerErrorCode.TryCatchException, err_msg); - return result; - } - - return result; } public async Task tryLeaveBattelInstance(Player player, string instanceRoomId) { - if (false == BattleRoomHelper.checkBattleActive()) return; - Log.getLogger().debug($"tryLeaveBattelInstance start instanceRoomId : {instanceRoomId}"); var location_attribute = player.getEntityAttribute(); @@ -214,87 +42,74 @@ public class BattleInstanceManager : Singleton if (instanceRoomId == string.Empty) { Log.getLogger().warn($"tryLeaveBattelInstance IntanceRoomId is Empty"); - removeBattlePlayer(player.getUserGuid()); return; } - if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleInstanceRoom)) + + if (false == GameModeManager.It.tryGetGameMode(instanceRoomId, out var gameMode)) { - removeBattlePlayer(player.getUserGuid()); return; } + + var ffa = gameMode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}"); + + await ffa.removePodCombat(player); - await battleInstanceRoom.removePodCombat(player); - - var host_user_guid = battleInstanceRoom.m_host_migrator.getHostUserGuid(); + var host_user_guid = ffa.m_host_migrator.getHostUserGuid(); if (player.getUserGuid().Equals(host_user_guid)) { - using (var releaser = await battleInstanceRoom.getAsyncLock()) + using (var releaser = await ffa.getAsyncLock()) { - battleInstanceRoom.m_host_migrator.removeHost(); + ffa.m_host_migrator.removeHost(); } } //여기서 instanceroom 이 is Destroy 면 DestroyBattleRoom 호출 해줄것 - if (battleInstanceRoom.m_instance_room.isDestroy) + if (ffa.getInstanceRoom().isDestroy) { - m_battle_instances.TryRemove(instanceRoomId, out var _); - await battleInstanceRoom.destroyBattleRoom(); + //kihoon todo : 이부분 수정 필요 + //m_battle_instances.TryRemove(instanceRoomId, out var _); + //await battleInstanceRoom.destroyBattleRoom(); Log.getLogger().debug($"tryLeaveBattelInstance destroy battle room instanceRoomId : {instanceRoomId}"); } } - public async Task tryDestroyBattleRoom(string instanceRoomId) - { - if (false == BattleRoomHelper.checkBattleActive()) return; - - if (false == instanceRoomId.Contains(BattleConstant.PREFIX_BATTLE_INSTANCE_ROOM_ID)) return; - - if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleInstanceRoom)) - { - Log.getLogger().error($"instanceRoomId : {instanceRoomId} is not exist instnaces"); - return; - } - - var is_destroy = battleInstanceRoom.m_instance_room.isDestroy; - if (is_destroy) - { - await battleInstanceRoom.destroyBattleRoom(); - m_battle_instances.TryRemove(instanceRoomId, out _); - } - } + // public async Task tryDestroyBattleRoom(string instanceRoomId) + // { + // await Task.CompletedTask; + // if (false == instanceRoomId.Contains(BattleConstant.PREFIX_BATTLE_INSTANCE_ROOM_ID)) return; + // + // // if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleInstanceRoom)) + // // { + // // Log.getLogger().error($"instanceRoomId : {instanceRoomId} is not exist instnaces"); + // // return; + // // } + // + // // var is_destroy = battleInstanceRoom.m_instance_room.isDestroy; + // // if (is_destroy) + // // { + // // await battleInstanceRoom.destroyBattleRoom(); + // // //m_battle_instances.TryRemove(instanceRoomId, out _); + // // } + // } - private void removeBattlePlayer(string userGuid) - { - foreach (var battle_instance_room in m_battle_instances.Values) - { - battle_instance_room.removeBattlePlayerIfExist(userGuid); - } - } + public async Task LeaveBattleRoom(Player player, string instanceRoomId, bool disconnected = false) { - - if (false == m_battle_instances.TryGetValue(instanceRoomId, out var battleRoom)) - { - Log.getLogger().info($"LeaveBattleRoom m_battle_instances.TryGetValue false instanceRoomId : {instanceRoomId}"); - return false; - } - - await battleRoom.LeaveBattleRoom(player, instanceRoomId, disconnected); + (var result, var leeave_handler) = GameModeHelper.getGameModeLeaveHandler(player, instanceRoomId); + if (result.isFail() || leeave_handler is null) return false; - // if (battleRoom.m_instance_room.isDestroy) - // { - // InstanceRoomManager.Instance.DestroyRoom(instanceRoomId); - // } + await leeave_handler.gameModeLeave(); Log.getLogger().debug($"leave battle room player : {player.toBasicString()}, instanceRoomId : {instanceRoomId}"); return true; } - public async Task sendNtfAboutBattleInstance(BattleInstanceRoom battieInstanceRoom, Player player) + public async Task sendNtfAboutBattleInstance(GameModeTPSFreeForAll battieInstanceRoom, Player player) { var result = new Result(); @@ -313,7 +128,7 @@ public class BattleInstanceManager : Singleton } - private void sendNtfBattleObjectsState(BattleInstanceRoom battleInstanceRoom, Player player) + private void sendNtfBattleObjectsState(GameModeTPSFreeForAll battleInstanceRoom, Player player) { List infos = new(); var attribute = battleInstanceRoom.getEntityAttribute(); @@ -496,6 +311,55 @@ public class BattleInstanceManager : Singleton return true; } + + private async Task createBattleEventCheckerTask() + { + + var result = new Result(); - public BattleInstanceManager Self => this; + var battle_entity_ticker_initializers = new Initializers(); + + //채널 인던 다 필요한가? + //이벤트 인스턴스 관련 생성 삭제에 대한 관리 Ticker + + //battle_entity_ticker_initializers.appendInitializer(new BattleEventCheckTicker(1000, null)); + //battle_entity_ticker_initializers.appendInitializer(new BattleEventNotifyTicker(Constant.EVENT_UPDATE_INTERVAL_MMIN, null)); + + result = await battle_entity_ticker_initializers.init("BattleEntityTickers"); + if (result.isFail()) + { + Log.getLogger().error($"Failed to init() !!! : {result.toBasicString()}"); + return result; + } + + var battle_event_check_ticker = new BattleEventCheckTicker(BattleConstant.BATTLE_EVENT_CHECK_INTERVAL, null); + await battle_event_check_ticker.onInit(); + await createTask(battle_event_check_ticker); + var battle_event_notify_ticker = new BattleEventNotifyTicker(ServerCommon.Constant.EVENT_UPDATE_INTERVAL_MMIN, null); + await battle_event_check_ticker.onInit(); + await createTask(battle_event_notify_ticker); + + return result; + } + + private async Task createTask(EntityTicker ticker) + { + var result = new Result(); + + await Task.CompletedTask; + try + { + + new PeriodicTaskTimer( ticker.getTypeName() , ticker.getOnTickIntervalMilliseconds(), ticker.getCancelToken(), ticker.onTaskTick); + Log.getLogger().debug("createTask done"); + } + catch(Exception e) + { + var err_msg = $"Exception !!!, new PeriodicTaskTimer() : exception:{e}"; + result.setFail(ServerErrorCode.TryCatchException, err_msg); + return result; + } + + return result; + } } \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoom.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoom.cs index ae50a61..b986bf1 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoom.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoom.cs @@ -17,13 +17,13 @@ public partial class InstanceRoom { public async Task battleInstanceInit() { - var result = await BattleInstanceManager.It.battleInstanceInit(this, _roomId); - if (result.isFail()) - { - Log.getLogger().error(result.toBasicString()); - return false; - } - + // var result = await BattleInstanceManager.It.battleInstanceInit(this, _roomId); + // if (result.isFail()) + // { + // Log.getLogger().error(result.toBasicString()); + // return false; + // } + await Task.CompletedTask; return true; } @@ -60,47 +60,5 @@ public partial class InstanceRoom return users; } - - public async Task LeaveBattleInstanceRoom(Player player, bool disconnected) - { - var user_guid = player.getUserGuid(); - - Log.getLogger().info($"BattleInstanceRoom.Leave() Start !!! - userGuid:{user_guid}, instanceRoomId:{_roomId}, sessionCount:{SessionCount}, addConnectedUser:{getMap().getCurrCountAsAddConnectedUser()}"); - - if (m_players.TryRemove(player.getUserGuid(), out _)) - { - await BattleInstanceRoomHandler.leaveBattleInstanceRoom(user_guid, _roomId); - } - - var location_attribute = player.getEntityAttribute(); - NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"LocationAttribute is null !!! - player:{player.toBasicString()}"); - location_attribute.CurrentIndunLocation.clear(); - - var game_zone_action = player.getEntityAction(); - await game_zone_action.tryLeaveGameZone(); - - if (SessionCount + getMap().getCurrCountAsAddConnectedUser() == 0) - { - if (!_isPartyInstance || _concertEnd) - { - await destroyRoom(); - } - } - else - { - { - ClientToGame clientToGame = new ClientToGame(); - clientToGame.Message = new ClientToGameMessage(); - clientToGame.Message.LeaveInstanceRoomMember = new ClientToGameMessage.Types.LeaveInstanceRoomMember(); - clientToGame.Message.LeaveInstanceRoomMember.MemberGuid = player.getUserGuid(); - - Broadcast(clientToGame); - } - } - - - - Log.getLogger().info($"InstanceRoom.Leave() Finish !!! - userGuid:{user_guid}, instanceRoomId:{_roomId}, sessionCount:{SessionCount}, addConnectedUser:{getMap().getCurrCountAsAddConnectedUser()}"); - } } \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoomHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoomHandler.cs index 68904bd..45764b2 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoomHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceRoomHandler.cs @@ -373,33 +373,7 @@ public class BattleInstanceRoomHandler } - public static async Task leaveBattleInstanceRoom(string userGuid, string instanceRoomId) - { - var result = new Result(); - var err_msg = string.Empty; - - var server_logic = GameServerApp.getServerLogic(); - - var instance_room_storage = new InstanceRoomStorage(); - instance_room_storage.Init(server_logic.getRedisDb(), ""); - - await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId); - - var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId); - await instance_room_storage.decreaseInstanceRoomScore(instance_room_id_base, instanceRoomId); - - return result; - } - public static string getInstanceRoomIdBaseFromInstanceRoomId(string instanceRoomId) - { - var instance_room_Id_element = instanceRoomId.Split(":"); - - if (instance_room_Id_element.Length >= 2) - { - return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}"; - } - Log.getLogger().error($"Instance room id weired : {instanceRoomId}"); - return string.Empty; - } + + } \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/GameModeTPS.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/GameModeTPS.cs new file mode 100644 index 0000000..f9a33da --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/Manage/GameModeTPS.cs @@ -0,0 +1,27 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class GameModeTPS: GameModeBase, IGameModeGenre +{ + public GameModeTPS(EntityType type, InstanceRoom instanceRoom) : base(type, instanceRoom) + { + } + + + public override Task taskUpdate() + { + return Task.CompletedTask; + } + + public override string toBasicString() + { + var basic_string = base.toBasicString() + $"GameModeTPS...."; + return basic_string; + } + + public override Task initAfterTimerCreate() + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/IBattleMode.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/IBattleMode.cs new file mode 100644 index 0000000..f7dd4ea --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/Manage/IBattleMode.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public interface IBattleMode +{ + public Task init(); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/ITPSMode.cs b/GameServer/Contents/GameMode/Mode-Battle/Manage/ITPSMode.cs new file mode 100644 index 0000000..61897f8 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/Manage/ITPSMode.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public interface ITPSMode +{ + Task initTPSMode(); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceAction.cs similarity index 68% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceAction.cs index 75cca8a..f5133e9 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceAction.cs @@ -1,14 +1,11 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using System.Net; +using GameServer.Contents.Battle.Log; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using MetaAssets; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - +using ServerCore; namespace GameServer; @@ -30,13 +27,13 @@ public class BattleInstanceAction : EntityActionBase { var result = new Result(); - var battle_instance_room = getOwner() as BattleInstanceRoom; - NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room_owner is null !!!"); + var game_mode_base = getOwner() as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); var server_logic = GameServerApp.getServerLogic(); var dynamodb_client = server_logic.getDynamoDbClient(); - string room_id = battle_instance_room.m_instance_room.getMap().m_room_id; + string room_id = game_mode_base.getRoomId(); var config = dynamodb_client.makeQueryConfigForReadByPKSK(BattleInstanceSnapshotDoc.pk, room_id); (result, var read_docs) = await dynamodb_client.simpleQueryDocTypesWithQueryOperationConfig(config); @@ -47,18 +44,18 @@ public class BattleInstanceAction : EntityActionBase var event_id = BattleRoomHelper.getBattleEventIdFromRoomId(room_id); BattleInstanceSnapshotDoc doc = new(room_id); - string snapshot_load_type = "LOAD"; + //string snapshot_load_type = "LOAD"; if (read_docs.Count == 0 || event_id == 0) { //데이터가 없으므로 생성 처리 result = await createBattleInstanceSnapshot(room_id); if (result.isFail()) return result; - snapshot_load_type = "CREATE"; + // snapshot_load_type = "CREATE"; } else if (read_docs.Count > 0) { doc = read_docs[0]; - var battle_instance_action = battle_instance_room.getEntityAction(); + var battle_instance_action = game_mode_base.getEntityAction(); NullReferenceCheckHelper.throwIfNull(battle_instance_action, () => $"battle_instance_action is null !!!"); result = battle_instance_action.setSnapshotFromDoc(doc); } @@ -66,18 +63,19 @@ public class BattleInstanceAction : EntityActionBase if (result.isFail()) return result; - Log.getLogger().debug($"loadOrCreateSnapshot room_id : {battle_instance_room.toBasicString()}"); + Log.getLogger().debug($"loadOrCreateSnapshot room_id : {game_mode_base.toBasicString()}"); - var attribute = battle_instance_room.getEntityAttribute(); + var attribute = game_mode_base.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); - var invokers = new List(); - var log_action = new LogActionEx(LogActionType.BattleInstanceSnapshotCreate); - BattleSnapShotBusinessLog business_log = new(battle_instance_room, snapshot_load_type); - invokers.Add(business_log); - BusinessLogger.collectLogs(log_action, battle_instance_room, invokers); + //kihoon todo : 이거 Base쪽으로 올려야 된다. + //var invokers = new List(); + //var log_action = new LogAction(LogActionType.BattleInstanceSnapshotCreate); + //BattleSnapShotBusinessLog business_log = new(battle_instance_room, snapshot_load_type); + //invokers.Add(business_log); + //BusinessLogger.collectLogs(log_action, battle_instance_room, invokers); return result; } @@ -90,53 +88,57 @@ public class BattleInstanceAction : EntityActionBase BattleInstanceSnapshotDoc doc = new(roomId); - var battle_instance_room = getOwner() as BattleInstanceRoom; - NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); + var game_mode_base = getOwner() as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"battle_instance_room is null !!!"); + var game_mode_ffa = getOwner() as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(game_mode_ffa, () => $"battle_instance_room is null !!!"); + var server_logic = GameServerApp.getServerLogic(); var fn_create_battle_instance_snapshot = async delegate() { - var battle_instance_snaptshot_attribute = battle_instance_room.getEntityAttribute(); + var battle_instance_snaptshot_attribute = game_mode_base.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_snaptshot_attribute, () => $"battle_instance_snaptshot_attribute is null !!!"); battle_instance_snaptshot_attribute.m_room_id = roomId; - battle_instance_snaptshot_attribute.m_combat_pod_mode.m_current_state_start_time = battle_instance_room.m_battle_instance_event_start_time; + battle_instance_snaptshot_attribute.m_combat_pod_mode.m_current_state_start_time = game_mode_ffa.m_battle_instance_event_start_time; - addRespawnPosInfoFromMeta(battle_instance_room, battle_instance_snaptshot_attribute); - addStorageInfoFromMeta(battle_instance_room, battle_instance_snaptshot_attribute); - addPickupPodInfoFromMeta(battle_instance_room, battle_instance_snaptshot_attribute); + //kihoon 이거다 수정해야된다. + addRespawnPosInfoFromMeta(game_mode_ffa, battle_instance_snaptshot_attribute); + addStorageInfoFromMeta(game_mode_ffa, battle_instance_snaptshot_attribute); + addPickupPodInfoFromMeta(game_mode_ffa, battle_instance_snaptshot_attribute); - var anchors = battle_instance_room.m_instance_room.getMap().getAnchors(); + var anchors = game_mode_base.getInstanceRoom().getMap().getAnchors(); foreach (var anchor in anchors) { addBattleObjectWeapon(battle_instance_snaptshot_attribute, anchor.Value); addBattleObjectBuff(battle_instance_snaptshot_attribute, anchor.Value); } - var result = await createBattleObjectCombatPod(battle_instance_room, battle_instance_snaptshot_attribute); + var result = await createBattleObjectCombatPod(game_mode_ffa, battle_instance_snaptshot_attribute); if (result.isFail()) return result; - result = await createBattleObjectPickupPodReward(battle_instance_room, battle_instance_snaptshot_attribute); + result = await createBattleObjectPickupPodReward(game_mode_ffa, battle_instance_snaptshot_attribute); if (result.isFail()) return result; battle_instance_snaptshot_attribute.modifiedEntityAttribute(true); - var batch = new QueryBatchEx(battle_instance_room, LogActionType.BattleInstanceSnapshotCreate, server_logic.getDynamoDbClient()); + //kihoon todo : 이거 수정해야된다. + var batch = new QueryBatchEx(game_mode_base, LogActionType.BattleInstanceSnapshotCreate, server_logic.getDynamoDbClient()); { - batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); + batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } - result = await QueryHelper.sendQueryAndBusinessLog(batch); return result; }; - result = await battle_instance_room.runTransactionRunnerSafelyWithTransGuid(battle_instance_room.m_instance_room.getMap().m_room_id, + result = await game_mode_base.runTransactionRunnerSafelyWithTransGuid(game_mode_base.getRoomId(), TransactionIdType.PrivateContents, BattleConstant.BATTLE_INSTANCE_TRANSACTION_NAME, fn_create_battle_instance_snapshot); if (result.isFail()) { - var err_msg = $"Failed to runTransactionRunnerSafelyWithTransGuid() !!! : {result.toBasicString()} - CreateBattleInstanceSnapshot, {battle_instance_room.toBasicString()}"; + var err_msg = $"Failed to runTransactionRunnerSafelyWithTransGuid() !!! : {result.toBasicString()} - CreateBattleInstanceSnapshot, {game_mode_base.toBasicString()}"; Log.getLogger().error(err_msg); return result; } @@ -152,7 +154,7 @@ public class BattleInstanceAction : EntityActionBase var battle_instance_snapshot_attrib = doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(battle_instance_snapshot_attrib, () => $"battle_instance_snapshot_attrib is null !!!"); - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeBase; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); var attribute = battle_instance_room.getEntityAttribute(); @@ -164,25 +166,25 @@ public class BattleInstanceAction : EntityActionBase return result; } - private void deleteChangedGuidAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) - { - deleteChangedBattleObjectPodStorageAnchor(battleInstanceRoom, attribute, attrib); - deleteChangedBattleObjectPickupPodAnchor(battleInstanceRoom, attribute, attrib); - deleteChangedRespawnAnchor(battleInstanceRoom, attribute, attrib); - deleteChangedBattleObjectWeaponAnchor(battleInstanceRoom, attribute, attrib); - deleteChangedBattleObjectBuffAnchor(battleInstanceRoom, attribute, attrib); - - //pod combat은 timer에서 처리해준다. - } + // private void deleteChangedGuidAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) + // { + // deleteChangedBattleObjectPodStorageAnchor(battleInstanceRoom, attribute, attrib); + // deleteChangedBattleObjectPickupPodAnchor(battleInstanceRoom, attribute, attrib); + // deleteChangedRespawnAnchor(battleInstanceRoom, attribute, attrib); + // deleteChangedBattleObjectWeaponAnchor(battleInstanceRoom, attribute, attrib); + // deleteChangedBattleObjectBuffAnchor(battleInstanceRoom, attribute, attrib); + // + // //pod combat은 timer에서 처리해준다. + // } - private void setNewGuidAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private void setNewGuidAnchor(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { addRespawnPosInfoFromMeta(battleInstanceRoom, attribute); addStorageInfoFromMeta(battleInstanceRoom, attribute); addPickupPodInfoFromMeta(battleInstanceRoom, attribute); - var anchors = battleInstanceRoom.m_instance_room.getMap().getAnchors(); + var anchors = battleInstanceRoom.getInstanceRoom().getMap().getAnchors(); foreach (var anchor in anchors) { addBattleObjectWeapon(attribute, anchor.Value); @@ -193,15 +195,15 @@ public class BattleInstanceAction : EntityActionBase } - private void deleteChangedBattleObjectPodStorageAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) + private void deleteChangedBattleObjectPodStorageAnchor(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) { List delete_keys = new(); foreach (var stand in attrib.m_combat_pod_attrib.m_pod_storages) { //기존에 들고 있던 guid 가 map에서 없어지거나 바뀌었을 경우가 있을수 있으므로 예외 처리 - if (false == battleInstanceRoom.m_instance_room.getMap().getAnchors().ContainsKey(stand.Key)) + if (false == battleInstanceRoom.getInstanceRoom().getMap().getAnchors().ContainsKey(stand.Key)) { - Log.getLogger().warn($"stand : {stand.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"); + Log.getLogger().warn($"stand : {stand.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.getRoomId()}"); delete_keys.Add(stand.Key); continue; } @@ -214,15 +216,15 @@ public class BattleInstanceAction : EntityActionBase } } - private void deleteChangedBattleObjectPickupPodAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) + private void deleteChangedBattleObjectPickupPodAnchor(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) { List delete_keys = new(); foreach (var box in attrib.m_combat_pod_attrib.m_pickup_pods) { //기존에 들고 있던 guid 가 map에서 없어지거나 바뀌었을 경우가 있을수 있으므로 예외 처리 - if (false == battleInstanceRoom.m_instance_room.getMap().getAnchors().ContainsKey(box.Key)) + if (false == battleInstanceRoom.getInstanceRoom().getMap().getAnchors().ContainsKey(box.Key)) { - Log.getLogger().info($"box : {box.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"); + Log.getLogger().info($"box : {box.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.getRoomId()}"); delete_keys.Add(box.Key); continue; } @@ -235,7 +237,7 @@ public class BattleInstanceAction : EntityActionBase } } - private void deleteChangedRespawnAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) + private void deleteChangedRespawnAnchor(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) { List delete_keys = new(); foreach (var each in attrib.m_combat_pod_attrib.m_respawns) @@ -243,7 +245,7 @@ public class BattleInstanceAction : EntityActionBase //map에 respawn pos가 없어지거나 바뀌었을 경우가 있을수 있으므로 예외 처리 if (false == battleInstanceRoom.m_respawn_pos_anchors_meta.Contains(each.Key)) { - Log.getLogger().warn($"spawn idx : {each.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"); + Log.getLogger().warn($"spawn idx : {each.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.getRoomId()}"); delete_keys.Add(each.Key); continue; } @@ -255,15 +257,15 @@ public class BattleInstanceAction : EntityActionBase } } - private void deleteChangedBattleObjectWeaponAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) + private void deleteChangedBattleObjectWeaponAnchor(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) { List delete_keys = new(); foreach (var weapon in attrib.m_combat_pod_attrib.m_weapons) { //기존에 들고 있던 guid 가 map에서 없어지거나 바뀌었을 경우가 있을수 있으므로 예외 처리 - if (false == battleInstanceRoom.m_instance_room.getMap().getAnchors().ContainsKey(weapon.Key)) + if (false == battleInstanceRoom.getInstanceRoom().getMap().getAnchors().ContainsKey(weapon.Key)) { - Log.getLogger().warn($"weapon : {weapon.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"); + Log.getLogger().warn($"weapon : {weapon.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.getRoomId()}"); delete_keys.Add(weapon.Key); continue; } @@ -276,15 +278,15 @@ public class BattleInstanceAction : EntityActionBase } } - private void deleteChangedBattleObjectBuffAnchor(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) + private void deleteChangedBattleObjectBuffAnchor(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, BattleInstanceSnapshotAttrib attrib) { List delete_keys = new(); foreach (var buff in attrib.m_combat_pod_attrib.m_buffs) { //map에 respawn pos가 없어지거나 바뀌었을 경우가 있을수 있으므로 예외 처리 - if (false == battleInstanceRoom.m_instance_room.getMap().getAnchors().ContainsKey(buff.Key)) + if (false == battleInstanceRoom.getInstanceRoom().getMap().getAnchors().ContainsKey(buff.Key)) { - Log.getLogger().warn($"buff : {buff.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"); + Log.getLogger().warn($"buff : {buff.Key} is not exist.. so don't add attribute.... roomId : {battleInstanceRoom.getInstanceRoom().getMap().m_room_id}"); delete_keys.Add(buff.Key); continue; } @@ -297,7 +299,7 @@ public class BattleInstanceAction : EntityActionBase } } - private void addRespawnPosInfoFromMeta(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private void addRespawnPosInfoFromMeta(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var now = DateTimeHelper.Current; @@ -308,9 +310,9 @@ public class BattleInstanceAction : EntityActionBase } } - private void addStorageInfoFromMeta(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private void addStorageInfoFromMeta(GameModeTPSFreeForAll ffa, BattleInstanceSnapshotAttribute attribute) { - foreach (var storage_group in battleInstanceRoom.m_battle_pod_storage_guid_group.Values) + foreach (var storage_group in ffa.m_battle_pod_storage_guid_group.Values) { foreach (var anchor_guid in storage_group) { @@ -319,9 +321,9 @@ public class BattleInstanceAction : EntityActionBase } } - private void addPickupPodInfoFromMeta(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private void addPickupPodInfoFromMeta(GameModeTPSFreeForAll ffa, BattleInstanceSnapshotAttribute attribute) { - foreach (var pickup_pod_group in battleInstanceRoom.m_battle_pickup_pod_guid_group.Values) + foreach (var pickup_pod_group in ffa.m_battle_pickup_pod_guid_group.Values) { foreach (var anchor_guid in pickup_pod_group) { @@ -377,7 +379,7 @@ public class BattleInstanceAction : EntityActionBase } - private async Task createBattleObjectPickupPodReward(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task createBattleObjectPickupPodReward(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); @@ -389,7 +391,7 @@ public class BattleInstanceAction : EntityActionBase return result; } - private async Task createBattleObjectCombatPod(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task createBattleObjectCombatPod(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var battle_update_action = battleInstanceRoom.getEntityAction(); NullReferenceCheckHelper.throwIfNull(battle_update_action, () => $"battle_update_action is null !!!"); diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceStateUpdateAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceStateUpdateAction.cs similarity index 85% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceStateUpdateAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceStateUpdateAction.cs index ca04c34..10c91d7 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceStateUpdateAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceStateUpdateAction.cs @@ -1,21 +1,17 @@ -using Newtonsoft.Json; -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using MetaAssets; +using Newtonsoft.Json; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - +using ServerCore; namespace GameServer; public partial class BattleInstanceUpdateAction { - private async Task battleInstanceStateUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task battleInstanceStateUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); var round_state = attribute.m_combat_pod_mode.m_round_state_type; @@ -36,13 +32,13 @@ public partial class BattleInstanceUpdateAction case BattleRoundStateType.Destroyed: break; default: - Log.getLogger().error($"BattleRoundStateType None error room_id : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"); + Log.getLogger().error($"BattleRoundStateType None error room_id : {battleInstanceRoom.getRoomId()}"); return result; } return result; } - private async Task battleInstanceWaitStateUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task battleInstanceWaitStateUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); await Task.CompletedTask; @@ -86,21 +82,21 @@ public partial class BattleInstanceUpdateAction //로그 추가 var invokers = new List(); - var log_action = new LogActionEx(LogActionType.BattleRoundStateUpdate); + var log_action = new LogAction(LogActionType.BattleRoundStateUpdate.ToString()); - var room_id = battleInstanceRoom.m_instance_room.getMap().m_room_id; + var room_id = battleInstanceRoom.getRoomId(); var ended_round = attribute.m_combat_pod_mode.m_current_round; var round_state = attribute.m_combat_pod_mode.m_round_state_type; - var users = battleInstanceRoom.m_instance_room.tryGetInstanceExistUserForLog(); + var users = battleInstanceRoom.getInstanceRoom().tryGetInstanceExistUserForLog(); BattleRoundUpdateBusinessLog business_log = new(room_id, ended_round, round_state, users); invokers.Add(business_log); - BusinessLogger.collectLogs(log_action, battleInstanceRoom, invokers); + //BusinessLogger.collectLogs(log_action, battleInstanceRoom, invokers); //kihoon todo : 이거 수정해야된다. return result; } - private async Task battleInstanceRoundingStateUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task battleInstanceRoundingStateUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); @@ -122,7 +118,7 @@ public partial class BattleInstanceUpdateAction return result; } - private async Task roundingUpdate(BattleInstanceRoom battleInstanceRoom, DateTime roundEndTime) + private async Task roundingUpdate(GameModeTPSFreeForAll battleInstanceRoom, DateTime roundEndTime) { var result = new Result(); string occupier_guid = string.Empty; @@ -137,7 +133,7 @@ public partial class BattleInstanceUpdateAction Player? rewarded_player = null; if (!occupier_guid.Equals(string.Empty)) { - if (false == battleInstanceRoom.m_instance_room.tryGetInstanceMember(occupier_guid, out rewarded_player)) + if (false == battleInstanceRoom.getInstanceRoom().tryGetInstanceMember(occupier_guid, out rewarded_player)) { //보상은 안되더라도 라운드는 진행 가능하게 처리해야할듯... var err_msg = $"not exist user in instance_room !!! user_guid : {occupier_guid}"; @@ -160,7 +156,7 @@ public partial class BattleInstanceUpdateAction } } - private async Task roundingUpdateWithReward(BattleInstanceRoom battleInstanceRoom, DateTime roundEndTime, Player player) + private async Task roundingUpdateWithReward(GameModeTPSFreeForAll battleInstanceRoom, DateTime roundEndTime, Player player) { var result = new Result(); @@ -214,10 +210,10 @@ public partial class BattleInstanceUpdateAction } //로그 추가 - var room_id = battleInstanceRoom.m_instance_room.getMap().m_room_id; + var room_id = battleInstanceRoom.getRoomId(); var ended_round = attribute.m_combat_pod_mode.m_current_round; var round_state = attribute.m_combat_pod_mode.m_round_state_type; - var users = battleInstanceRoom.m_instance_room.tryGetInstanceExistUserForLog(); + var users = battleInstanceRoom.getInstanceRoom().tryGetInstanceExistUserForLog(); BattleRoundUpdateBusinessLog business_log = new(room_id, ended_round, round_state, users); batch.appendBusinessLog(business_log); @@ -254,7 +250,7 @@ public partial class BattleInstanceUpdateAction } - private async Task roundingUpdateWithoutReward(BattleInstanceRoom battleInstanceRoom, DateTime roundEndTime) + private async Task roundingUpdateWithoutReward(GameModeTPSFreeForAll battleInstanceRoom, DateTime roundEndTime) { var result = new Result(); @@ -289,21 +285,21 @@ public partial class BattleInstanceUpdateAction attribute.modifiedEntityAttribute(true); //batch 처리 - var batch = new QueryBatchEx(battleInstanceRoom, LogActionType.BattleRoundStateUpdate, server_logic.getDynamoDbClient()); - { - batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); - } + // var batch = new QueryBatch(battleInstanceRoom, LogActionType.BattleRoundStateUpdate, server_logic.getDynamoDbClient()); + // { + // batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); + // } //로그 추가 - var room_id = battleInstanceRoom.m_instance_room.getMap().m_room_id; + var room_id = battleInstanceRoom.getRoomId(); var ended_round = attribute.m_combat_pod_mode.m_current_round; var round_state = attribute.m_combat_pod_mode.m_round_state_type; - var users = battleInstanceRoom.m_instance_room.tryGetInstanceExistUserForLog(); + var users = battleInstanceRoom.getInstanceRoom().tryGetInstanceExistUserForLog(); BattleRoundUpdateBusinessLog business_log = new(room_id, ended_round, round_state, users); - batch.appendBusinessLog(business_log); + //batch.appendBusinessLog(business_log); //kihoon todo : 로그랑 배치 수정해서 올려야 된다. - result = await QueryHelper.sendQueryAndBusinessLog(batch); - + //result = await QueryHelper.sendQueryAndBusinessLog(batch); + await Task.CompletedTask; if (result.isFail()) return result; @@ -311,7 +307,7 @@ public partial class BattleInstanceUpdateAction return result; }; - result = await battleInstanceRoom.runTransactionRunnerSafelyWithTransGuid(battleInstanceRoom.m_instance_room.getMap().m_room_id, + result = await battleInstanceRoom.runTransactionRunnerSafelyWithTransGuid(battleInstanceRoom.getRoomId(), TransactionIdType.PrivateContents, BattleConstant.BATTLE_INSTANCE_TRANSACTION_NAME, fn_battle_round_update); if (result.isFail()) { @@ -332,7 +328,7 @@ public partial class BattleInstanceUpdateAction return result; } - private async Task stepUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, DateTime now) + private async Task stepUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, DateTime now) { var max_charge_level = battleInstanceRoom.m_ffa_reward_meta .Where(kvp => kvp.Key == battleInstanceRoom.m_ffa_reward_meta.Keys.Max()) @@ -365,7 +361,7 @@ public partial class BattleInstanceUpdateAction } } - private async Task podCombatRewardUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, DateTime now) + private async Task podCombatRewardUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, DateTime now) { var occupier_guid = string.Empty; CommonResult common_result = new(); @@ -375,7 +371,7 @@ public partial class BattleInstanceUpdateAction occupier_guid = attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid; if (occupier_guid.Equals(string.Empty)) return; - if (false == battleInstanceRoom.m_instance_room.tryGetInstanceMember(occupier_guid, out var player)) + if (false == battleInstanceRoom.getInstanceRoom().tryGetInstanceMember(occupier_guid, out var player)) { Log.getLogger().error($"Not Exist Player in battle instance room occupier_guid : {occupier_guid}"); return; @@ -440,7 +436,7 @@ public partial class BattleInstanceUpdateAction info.m_battle_object_type = EBattleObjectType.Pod_Combat; List log_infos = new(); - var room_id = battleInstanceRoom.m_instance_room.getMap().m_room_id; + var room_id = battleInstanceRoom.getRoomId(); var current_round = attribute.m_combat_pod_mode.m_current_round; var round_state_type = attribute.m_combat_pod_mode.m_round_state_type; var business_log = new BattlePodCombatRewardBusinessLog(room_id, current_round, round_state_type @@ -478,7 +474,7 @@ public partial class BattleInstanceUpdateAction } } - private async Task battleInstanceEndStateUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task battleInstanceEndStateUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); await Task.CompletedTask; @@ -495,21 +491,21 @@ public partial class BattleInstanceUpdateAction attribute.m_combat_pod_mode.m_current_state_start_time = end_time; } - var users = battleInstanceRoom.m_instance_room.tryGetInstanceExistUserForLog(); + var users = battleInstanceRoom.getInstanceRoom().tryGetInstanceExistUserForLog(); //여기서 배틀 인스턴스가 완전히 shutdown 됐다는 Noti 전달 BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE(battleInstanceRoom); //log 추가 var invokers = new List(); - var log_action = new LogActionEx(LogActionType.BattleRoundStateUpdate); + var log_action = new LogAction(LogActionType.BattleRoundStateUpdate.ToString()); - var room_id = battleInstanceRoom.m_instance_room.getMap().m_room_id; + var room_id = battleInstanceRoom.getRoomId(); var ended_round = attribute.m_combat_pod_mode.m_current_round; var round_state = attribute.m_combat_pod_mode.m_round_state_type; BattleRoundUpdateBusinessLog business_log = new(room_id, ended_round, round_state, users); invokers.Add(business_log); - BusinessLogger.collectLogs(log_action, battleInstanceRoom, invokers); + //BusinessLogger.collectLogs(log_action, battleInstanceRoom, invokers);// kihoon todo : 이거 수정해야된다. return result; } diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceUpdateAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceUpdateAction.cs similarity index 82% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceUpdateAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceUpdateAction.cs index 0ee9b89..00ab6ae 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleInstanceUpdateAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleInstanceUpdateAction.cs @@ -1,15 +1,12 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; +using GameServer.Contents.Battle.Reward; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using MetaAssets; using Nettention.Proud; using Newtonsoft.Json; - - -using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - +using ServerCore; namespace GameServer; @@ -21,20 +18,20 @@ public partial class BattleInstanceUpdateAction : EntityActionBase public override async Task onInit() { await Task.CompletedTask; - + var result = new Result(); - - + + return result; } public override void onClear() { - + } - + public async Task update() { - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeTPSFreeForAll; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); var attribute = battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); @@ -45,7 +42,7 @@ public partial class BattleInstanceUpdateAction : EntityActionBase Log.getLogger().error($"battleObjectStateUpdate result error !!! result : {result.toBasicString()}"); return result; } - + result = await battleInstanceStateUpdate(battle_instance_room, attribute); if (result.isFail()) { @@ -59,41 +56,37 @@ public partial class BattleInstanceUpdateAction : EntityActionBase Log.getLogger().error($"battleInstancHostUpdate result error !!! result : {result.toBasicString()}"); return result; } - + return result; } - private async Task battleInstancHostUpdate(BattleInstanceRoom battleInstanceRoom) + private async Task battleInstancHostUpdate(GameModeTPSFreeForAll battleInstanceRoom) { var result = new Result(); + string host_user_guid = string.Empty; - var is_migrated = false; using (var releaser = await battleInstanceRoom.getAsyncLock()) { //이미 host 지정이 끝났으면 리턴 - //kihoon todo : 일단 계속 체크해서 호스트가 얼마나 바뀌는지 확인 해보고 적절한 주기 찾아볼것 - //if (!battleInstanceRoom.m_host_migrator.getHostUserGuid().Equals(string.Empty)) return result; - var host_migrator = battleInstanceRoom.m_host_migrator; - // TODO : 인터페이스 변경 예정 - (result, is_migrated) = host_migrator.migrateCheck(); + //kihoon todo : 일단 계속 체크해서 호스트가 얼마나 바뀌는지 확인 해보고 적절한 주기 찾아볼것 + if (!battleInstanceRoom.m_host_migrator.getHostUserGuid().Equals(string.Empty)) return result; + + var p2p_group_id = battleInstanceRoom.getInstanceRoom().getMap().getP2PGroupId(); + result = battleInstanceRoom.m_host_migrator.defineHost(p2p_group_id, new SuperPeerSelectionPolicy(), new HostID[1]); if (result.isFail()) return result; - if (is_migrated) - { - host_user_guid = host_migrator.getHostUserGuid(); - } + host_user_guid = battleInstanceRoom.m_host_migrator.getHostUserGuid(); + + Log.getLogger().info($"battleInstancHost set complete host_user_guid : {host_user_guid}"); } - if (is_migrated) - { - Log.getLogger().info($"battleInstancHost set complete host_user_guid : {host_user_guid}"); - BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(battleInstanceRoom.m_instance_room, host_user_guid); - } + BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(battleInstanceRoom.getInstanceRoom(), host_user_guid); + return result; } - private async Task battleObjectStateUpdate(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + private async Task battleObjectStateUpdate(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); await Task.CompletedTask; @@ -104,42 +97,42 @@ public partial class BattleInstanceUpdateAction : EntityActionBase using (var releaser = await battleInstanceRoom.getAsyncLock()) { (var weapon_info, var weapon_log_info) = battleObjectWeaponStateUpdate(attribute, now); - infos.AddRange(weapon_info); + infos.AddRange(weapon_info); log_infos.AddRange(weapon_log_info); - + (var buff_info, var buff_log_info) = battleObjectBuffStateUpdate(attribute, now); - infos.AddRange(buff_info); + infos.AddRange(buff_info); log_infos.AddRange(buff_log_info); - + (var pickup_pod_info, var pickup_pod_log_info) = battleObjectPickupPodUpdate(attribute, now); - infos.AddRange(pickup_pod_info); - log_infos.AddRange(pickup_pod_log_info); + infos.AddRange(pickup_pod_info); + log_infos.AddRange(pickup_pod_log_info); } - + if (infos.Count > 0) { BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(battleInstanceRoom, infos); - + var invokers = new List(); - var log_action = new LogActionEx(LogActionType.BattleObjectStateUpdate); - var business_log = new BattleObjectStateUpdateBusinessLog(battleInstanceRoom.m_instance_room.getMap().m_room_id, log_infos); + var log_action = new LogAction(LogActionType.BattleObjectStateUpdate.ToString()); + var business_log = new BattleObjectStateUpdateBusinessLog(battleInstanceRoom.getInstanceRoom().getMap().m_room_id, log_infos); invokers.Add(business_log); - BusinessLogger.collectLogs(log_action, battleInstanceRoom, invokers); + BusinessLogger.collectLogs(log_action, battleInstanceRoom, invokers); //kihoon todo : 이거 수정해야된다. } return result; } private (List, List) battleObjectPickupPodUpdate(BattleInstanceSnapshotAttribute attribute, DateTime now) { - // if (attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.RoundEndAll) || + // if (attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.RoundEndAll) || // attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.Destroyed)) return new(); - + List infos = new(); List log_infos = new(); - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeTPSFreeForAll; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); - + foreach (var generated_info in attribute.m_combat_pod_mode.m_pickup_pod_generated_info) { var group_id = generated_info.Key.Item1; @@ -153,24 +146,24 @@ public partial class BattleInstanceUpdateAction : EntityActionBase var anchor_guid = generatedInfo.m_anchor_guid; var next_generated_time = generatedInfo.m_next_generate_time; - + //아직 시간이 안됐거나, 할당된게 있으면 continue; if (now < next_generated_time || anchor_guid.Equals(string.Empty) == false) continue; - - //비어 있으면 할당 해준다. 시간체크는 보상 받았을때 해준다. + + //비어 있으면 할당 해준다. 시간체크는 보상 받았을때 해준다. (var result, var allocated_anchor_guid) = BattleRoomHelper.getRandomPickupPod(group_id, idx, battle_instance_room, attribute); if (result.isFail()) { Log.getLogger(result.toBasicString()); continue; } - - if(false == battle_instance_room.m_instance_room.getMap().getAnchors().TryGetValue(allocated_anchor_guid, out var anchorInfo)) + + if(false == battle_instance_room.getInstanceRoom().getMap().getAnchors().TryGetValue(allocated_anchor_guid, out var anchorInfo)) { Log.getLogger().error($"not exist anchor anchor_guid : {allocated_anchor_guid}"); continue; } - + var table_id = anchorInfo.AnchorProp.TableId; if (false == MetaData.Instance._BattleObjectSpawnGroupMetaTable.TryGetValue(table_id, out var battle_object_spawn_group)) { @@ -179,11 +172,11 @@ public partial class BattleInstanceUpdateAction : EntityActionBase } PickupPodGeneratedInfo new_generated_info = new(generated_info.Key.Item1, generated_info.Key.Item2, allocated_anchor_guid, generatedInfo.m_anchor_guid, generatedInfo.m_next_generate_time); - - attribute.m_combat_pod_mode.m_pickup_pod_generated_info.AddOrUpdate(generated_info.Key, new_generated_info, (i, tuple) => new_generated_info); + + attribute.m_combat_pod_mode.m_pickup_pod_generated_info.AddOrUpdate(generated_info.Key, new_generated_info, (i, tuple) => new_generated_info); if (false == attribute.m_combat_pod_mode.m_pickup_pods.TryGetValue(allocated_anchor_guid, out var pickupPod)) { - var err_msg = $"pickup pod date not exist !! allocated_anchor_guid : {allocated_anchor_guid}, roomId : {battle_instance_room.m_instance_room.getMap().m_room_id}"; + var err_msg = $"pickup pod date not exist !! allocated_anchor_guid : {allocated_anchor_guid}, roomId : {battle_instance_room.getRoomId()}"; Log.getLogger().error(err_msg); continue; } @@ -194,14 +187,14 @@ public partial class BattleInstanceUpdateAction : EntityActionBase info.AnchorGuid = allocated_anchor_guid; info.IsActive = pickupPod.m_is_active ? BoolType.True : BoolType.False; infos.Add(info); - + BattleObjectLogInfo log_info = new(); log_info.m_anchor_guid = pickupPod.m_anchor_guid; log_info.m_battle_object_type = pickupPod.m_type; log_info.m_active_time = pickupPod.m_active_time; log_infos.Add(log_info); } - + return (infos, log_infos); } @@ -215,12 +208,12 @@ public partial class BattleInstanceUpdateAction : EntityActionBase if (buff.m_active_time <= now && buff.m_is_active == false) { buff.m_is_active = true; - + BattleObjectInfo info = new(); info.AnchorGuid = buff.m_anchor_guid; info.IsActive = BoolType.True; infos.Add(info); - + BattleObjectLogInfo log_info = new(); log_info.m_anchor_guid = buff.m_anchor_guid; log_info.m_battle_object_type = buff.m_type; @@ -241,7 +234,7 @@ public partial class BattleInstanceUpdateAction : EntityActionBase if (weapon.m_active_time <= now && weapon.m_is_active == false) { weapon.m_is_active = true; - + BattleObjectInfo info = new(); info.AnchorGuid = weapon.m_anchor_guid; info.IsActive = BoolType.True; @@ -257,16 +250,16 @@ public partial class BattleInstanceUpdateAction : EntityActionBase return (infos, log_infos); } - - public Result battleObjectStateInitAndNotify(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + + public Result battleObjectStateInitAndNotify(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var infos = new List(); var result = new Result(); - + foreach (BattleObjectPodStorage storage in attribute.m_combat_pod_mode.m_pod_storages.Values) { storage.m_reward_cnt = 0; - + storage.m_is_active = true; BattleObjectInfo info = new(); info.AnchorGuid = storage.m_anchor_guid; @@ -277,25 +270,25 @@ public partial class BattleInstanceUpdateAction : EntityActionBase return result; } + + - - - public async Task createCombatPod(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + public async Task createCombatPod(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { await Task.CompletedTask; var result = new Result(); var combat_pod_guid = System.Guid.NewGuid().ToString("N"); - + (result, var anchor_guid) = BattleRoomHelper.getRandomCombatPodAnchorGuid(attribute, battleInstanceRoom); if (result.isFail()) return result; attribute.m_combat_pod_mode.m_pod_combat = new BattleObjectPodCombat(combat_pod_guid, anchor_guid, DateTimeHelper.Current); - + return result; } + - - public async Task createPickupPodReward(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + public async Task createPickupPodReward(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { await Task.CompletedTask; var result = new Result(); @@ -309,7 +302,7 @@ public partial class BattleInstanceUpdateAction : EntityActionBase foreach (var guid in pickup_pod_guids) { - if (false == battleInstanceRoom.m_instance_room.getMap().getAnchors().TryGetValue(guid, out var anchorInfo)) + if (false == battleInstanceRoom.getInstanceRoom().getMap().getAnchors().TryGetValue(guid, out var anchorInfo)) { var err_msg = $"Not exitst anchorInfo guid : {guid}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); @@ -325,7 +318,7 @@ public partial class BattleInstanceUpdateAction : EntityActionBase Log.getLogger(result.toBasicString()); continue; } - + max_reward_count = objectSpawnGroupMetaData.MaxSpawnQuantity; break; } @@ -340,10 +333,10 @@ public partial class BattleInstanceUpdateAction : EntityActionBase } - public async Task createPickupPodRewardByGroup(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, Int32 groupId, Int32 maxRewardCount) + public async Task createPickupPodRewardByGroup(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, Int32 groupId, Int32 maxRewardCount) { await Task.CompletedTask; - + var result = new Result(); for (int i = 0; i < maxRewardCount; i++) { @@ -354,7 +347,7 @@ public partial class BattleInstanceUpdateAction : EntityActionBase } PickupPodGeneratedInfo new_generated_info = new(groupId, i, anchor_guid, string.Empty, DateTimeHelper.Current); - + if(false == attribute.m_combat_pod_mode.m_pickup_pod_generated_info.TryGetValue((groupId, i), out var generatedInfo)) { attribute.m_combat_pod_mode.m_pickup_pod_generated_info.TryAdd((groupId, i), new_generated_info); @@ -363,9 +356,9 @@ public partial class BattleInstanceUpdateAction : EntityActionBase { new_generated_info.m_before_anchor_guid = generatedInfo.m_anchor_guid; } - + Log.getLogger().info($"create pickup pod generation info new_generated_info : {JsonConvert.SerializeObject(new_generated_info)}"); - + attribute.m_combat_pod_mode.m_pickup_pod_generated_info.AddOrUpdate((groupId, i), new_generated_info, (key, tuple) => new_generated_info); if (false == attribute.m_combat_pod_mode.m_pickup_pods.TryGetValue(anchor_guid, out var pickupPod)) { @@ -375,9 +368,10 @@ public partial class BattleInstanceUpdateAction : EntityActionBase pickupPod.m_is_active = true; } return result; + } - public async Task<(Result, List, int, int)> podCombatUpdateIfHasOccupier(BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, Player player) + public async Task<(Result, List, int, int)> podCombatUpdateIfHasOccupier(GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute, Player player) { var result = new Result(); var occupier_guid = attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid; @@ -397,12 +391,12 @@ public partial class BattleInstanceUpdateAction : EntityActionBase attribute.m_combat_pod_mode.m_rewarded_step = max_charge_level; attribute.m_combat_pod_mode.m_charged_step = max_charge_level; - + return (result, rewards, rewardable_step_start, rewardable_step_end); } - private async Task addPodCommbatOccupyReward(Player player, BattleInstanceRoom battleInstanceRoom, List rewards) + private async Task addPodCommbatOccupyReward(Player player, GameModeTPSFreeForAll battleInstanceRoom, List rewards) { IReward reward_proc = new RewardPodCombat(player, player.getUserGuid(), rewards); var result = await RewardManager.It.proceedRewardProcess(reward_proc); @@ -414,7 +408,7 @@ public partial class BattleInstanceUpdateAction : EntityActionBase return result; } - private List makePodCombatOccupyReward(int start, int end, BattleInstanceRoom battleInstanceRoom) + private List makePodCombatOccupyReward(int start, int end, GameModeTPSFreeForAll battleInstanceRoom) { List rewards = new(); @@ -429,27 +423,27 @@ public partial class BattleInstanceUpdateAction : EntityActionBase var item_id = ffaRewardData.RewardItemID; var item_count = ffaRewardData.RewardCount * battleInstanceRoom.m_hot_time_reward; - + RewardMutable reward_metable = new(); reward_metable.Item = new(); reward_metable.Item.Id = item_id; reward_metable.Item.Count = item_count; - + MetaAssets.Reward reward = new MetaAssets.Reward(reward_metable); rewards.Add(reward); - + Log.getLogger().Debug($"pod Combat reward Added step : {i}, ItemId : {item_id}, itemCount : {item_count}"); } - + return rewards; } - + private List battleObjectPickupPodsDeactive(BattleInstanceSnapshotAttribute attribute) { List infos = new(); - + foreach (var pickup in attribute.m_combat_pod_mode.m_pickup_pods.Values) { pickup.m_is_active = false; @@ -467,8 +461,8 @@ public partial class BattleInstanceUpdateAction : EntityActionBase var next_generated_time = generated_info.Value.m_next_generate_time; PickupPodGeneratedInfo new_info = new(idx.Item1, idx.Item2, string.Empty, string.Empty, now); - - attribute.m_combat_pod_mode.m_pickup_pod_generated_info.AddOrUpdate(idx, new_info, (i, tuple) => new_info); + + attribute.m_combat_pod_mode.m_pickup_pod_generated_info.AddOrUpdate(idx, new_info, (i, tuple) => new_info); } return infos; @@ -489,4 +483,4 @@ public partial class BattleInstanceUpdateAction : EntityActionBase return infos; } -} +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleLocationAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleLocationAction.cs similarity index 99% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleLocationAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleLocationAction.cs index 95a0330..9785895 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleLocationAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleLocationAction.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleObjectInteractAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleObjectInteractAction.cs similarity index 95% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleObjectInteractAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleObjectInteractAction.cs index c823a1c..e421bdd 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleObjectInteractAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleObjectInteractAction.cs @@ -1,6 +1,8 @@ -using MetaAssets; +using GameServer.Contents.GameMode.Manage.PlayManage; +using MetaAssets; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; @@ -42,7 +44,7 @@ public class BattleObjectInteractAction : EntityActionBase Log.getLogger().info($"interaction pickup pod player : {player.toBasicString()}, guid : {handler.m_interaction_anchor_guid}, next active time : {handler.m_battle_object.m_active_time}"); - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeBase; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); var attribute = battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); @@ -60,7 +62,7 @@ public class BattleObjectInteractAction : EntityActionBase await Task.CompletedTask; var result = new Result(); - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeBase; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); var attribute = battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); @@ -121,7 +123,7 @@ public class BattleObjectInteractAction : EntityActionBase var result = new Result(); - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeBase; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); string err_msg = string.Empty; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleObjectRewardAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleObjectRewardAction.cs similarity index 92% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleObjectRewardAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleObjectRewardAction.cs index 9744dbc..a178ba8 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleObjectRewardAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleObjectRewardAction.cs @@ -1,8 +1,11 @@ using GameServer.Contents.Battle.Reward; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; using MetaAssets; using Newtonsoft.Json; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; @@ -41,7 +44,7 @@ public class BattleObjectRewardAction : EntityActionBase var reward_id = pod_storage_meta.TypeID; var reward_count = pod_storage_meta.ObjectValue; - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeTPSFreeForAll; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); RewardMutable reward_metable = new(); @@ -76,7 +79,7 @@ public class BattleObjectRewardAction : EntityActionBase return result; } - var battle_instance_room = getOwner() as BattleInstanceRoom; + var battle_instance_room = getOwner() as GameModeTPSFreeForAll; NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"battle_instance_room is null !!!"); Int32 idx = Int32.MinValue; @@ -100,7 +103,7 @@ public class BattleObjectRewardAction : EntityActionBase } if (idx == Int32.MinValue) return result; //보상줄게 없다는 얘기이므로 그량 리턴 - if(false == battle_instance_room.m_instance_room.getMap().getAnchors().TryGetValue(handler.m_interaction_anchor_guid, out var anchorInfo)) + if(false == battle_instance_room.getInstanceRoom().getMap().getAnchors().TryGetValue(handler.m_interaction_anchor_guid, out var anchorInfo)) { err_msg = $"not exist anchor anchor_guid : {handler.m_interaction_anchor_guid}"; Log.getLogger().error(err_msg); diff --git a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleZoneMoveAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleZoneMoveAction.cs similarity index 99% rename from GameServer/Contents/GameMode/Mode-Battle/Action/BattleZoneMoveAction.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleZoneMoveAction.cs index aee8bc8..1e819d0 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Action/BattleZoneMoveAction.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleZoneMoveAction.cs @@ -1,18 +1,12 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; +using Google.Protobuf.WellKnownTypes; +using MetaAssets; using Newtonsoft.Json; - - -using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - - +using ServerCore; using USER_GUID = System.String; - namespace GameServer; public partial class GameZoneMoveAction diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/FfaGameObjectPodStorageInteractAction.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/FfaGameObjectPodStorageInteractAction.cs new file mode 100644 index 0000000..ce5655b --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/FfaGameObjectPodStorageInteractAction.cs @@ -0,0 +1,57 @@ +using GameServer.Contents.GameMode.Action; +using GameServer.Contents.GameMode.Manage.PlayManage; +using MetaAssets; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer; + +public class FfaGameObjectPodStorageInteractAction : GameGameObjectAction +{ + public FfaGameObjectPodStorageInteractAction(EntityBase owner) + : base(owner, EGameObjectType.Pod_Combat) + { + } + + public override async Task onInit() + { + await Task.CompletedTask; + var result = new Result(); + return result; + } + + public override void onClear() + { + return; + } + + public override async Task interact(string anchorGuid, DateTime interactionTime) + { + await Task.CompletedTask; + var result = new Result(); + + var game_mode_base = getOwner() as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); + var attribute = game_mode_base.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); + + bool has_pod_combat = hasPodCombat(anchorGuid, attribute); + + + return result; + } + + public override string toBasicString() + { + return $"class name : {nameof(FfaGameObjectPodStorageInteractAction)}...." + base.toBasicString(); + } + + + private bool hasPodCombat(string anchorGuid, BattleInstanceSnapshotAttribute attribute) + { + var pod_combat = attribute.m_combat_pod_mode.m_pod_combat; + if (pod_combat.m_source_storage_anchor_guid.Equals(anchorGuid) && pod_combat.m_state.Equals(PodCombatStateType.Active)) return true; + return false; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Cheat/BattleCheat.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Cheat/BattleCheat.cs new file mode 100644 index 0000000..202ef35 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Cheat/BattleCheat.cs @@ -0,0 +1,145 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer; + + +[ChatCommandAttribute("battleinstanceinit", typeof(CheatBattleInstanceInit), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] +public class CheatBattleInstanceInit : ChatCommandBase +{ + public override async Task invoke(Player player, string token, string[] args) + { + Log.getLogger().info($"battleinstanceinit"); + + var server_logic = GameServerApp.getServerLogic(); + + var room_id = player.getCurrentInstanceRoomId(); + if (room_id.Equals(string.Empty)) + { + Log.getLogger().error($"cheat:battleinstanceinit.... this cheat only use in instance"); + return; + } + + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) + { + Log.getLogger().error($"cheat:battleinstanceinit.... battle_instance_room is null room_id : {room_id}"); + return; + } + + var game_mode_base = gameMode as GameModeBase; + + // var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + if (game_mode_base is null) + { + Log.getLogger().error($"cheat:battleinstanceinit.... game_mode_base is null room_id : {room_id}"); + return; + } + + using (var releaser = await game_mode_base.getAsyncLock()) + { + var attribute = game_mode_base.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); + + if (false == attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.RoundEndAll) && false == attribute.m_combat_pod_mode.m_round_state_type.Equals(BattleRoundStateType.Destroyed)) + { + Log.getLogger().error($"cheat:battleinstanceinit.... this cheat only RoundEndAll room_id : {room_id}"); + return; + } + + var now = DateTimeHelper.Current; + + var ffa = gameMode as GameModeTPSFreeForAll; + if (ffa is null) + { + Log.getLogger().error($"cheat:battleinstanceinit.... ffa is null room_id : {room_id}"); + return; + } + + ffa.setEventStartTime(now); + + attribute.m_combat_pod_mode.m_round_state_type = BattleRoundStateType.Rounding; + attribute.m_combat_pod_mode.m_current_state_start_time = now; + attribute.m_combat_pod_mode.m_current_round = 1; + attribute.m_combat_pod_mode.m_charged_step = 0; + attribute.m_combat_pod_mode.m_rewarded_step = 0; + + attribute.m_combat_pod_mode.m_pod_combat.setActive(now); + + + (Result result, var anchor_guid) = BattleRoomHelper.getRandomCombatPodAnchorGuid(attribute, ffa); + if (result.isFail()) + { + Log.getLogger().error("get Random pod combat anchor guid faile !!! "); + return; + } + attribute.m_combat_pod_mode.m_pod_combat.m_source_storage_anchor_guid = anchor_guid; + + BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE(ffa); + + var update_action = game_mode_base.getEntityAction(); + NullReferenceCheckHelper.throwIfNull(update_action, () => $"attribute is null !!!"); + update_action.battleObjectStateInitAndNotify(ffa, attribute); + + BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(ffa); + + } + } +} + + + +[ChatCommandAttribute("gamemodeoccupyhost", typeof(BattleHostOccupy), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)] +public class BattleHostOccupy : ChatCommandBase +{ + public override async Task invoke(Player player, string token, string[] args) + { + //Log.getLogger().info($"battleinstanceinit"); + + var server_logic = GameServerApp.getServerLogic(); + + var room_id = player.getCurrentInstanceRoomId(); + if (room_id.Equals(string.Empty)) + { + Log.getLogger().error($"cheat:gamemodeoccupyhost.... this cheat only use in instance"); + return; + } + + + //kihoon todo : 임시 분기 처리 + //나중에 게임모드로 분리되면 그때 재작업 + if (room_id.Contains("battle")) + { + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) + { + Log.getLogger().error($"cheat:gamemodeoccupyhost.... battle_instance_room is null room_id : {room_id}"); + return; + } + + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); + + using (var releaser = await game_mode_base.getAsyncLock()) + { + game_mode_base.m_host_migrator.modifyHost(player.getUserGuid()); + } + BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(game_mode_base.getInstanceRoom(), player.getUserGuid()); + } + else if (room_id.Contains("1017101")) + { + var instance_room = InstanceRoomManager.Instance.getInstanceRoomByRoomId(room_id); + if (instance_room is null) + { + Log.getLogger().error($"cheat:gamemodeoccupyhost.... instance_room is null room_id : {room_id}"); + return; + } + BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(instance_room, player.getUserGuid()); + } + + + + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Doc/BattleEventDoc.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Doc/BattleEventDoc.cs similarity index 99% rename from GameServer/Contents/GameMode/Mode-Battle/Doc/BattleEventDoc.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Doc/BattleEventDoc.cs index d7b875e..64969f4 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Doc/BattleEventDoc.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Doc/BattleEventDoc.cs @@ -1,7 +1,8 @@ using MetaAssets; using Newtonsoft.Json; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer.Contents.Battle.Doc; diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceRoom.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceRoom.cs new file mode 100644 index 0000000..6d88dd5 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceRoom.cs @@ -0,0 +1,78 @@ +using System.Collections.Concurrent; +using Axion.Collections.Concurrent; +using GameServer.Contents.Battle.Log; +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using MetaAssets; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Org.BouncyCastle.Tls.Crypto.Impl; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer; + + + + + +public class BattleInstanceRoom : EntityBase, IWithLogActor, IBattleMode +{ + + public BattleInstanceRoom() + : base(EntityType.BattleInstance) + { + + } + + + public override async Task onInit() + { + await Task.CompletedTask; + var result = new Result(); + return result; + } + + public ILogActor toLogActor() + { + var server_logic = GameServerApp.getServerLogic(); + var region_id = server_logic.getServerConfig().getRegionId(); + var server_name = server_logic.getServerName(); + + var log_info = new BattleInstanceActorLog(region_id, server_name, "", 0); + return log_info; + } + + + public async Task LeaveBattleRoom(Player player, string roomId, bool disconnected = false) + { + if (false == GameModeManager.It.tryGetGameMode(roomId, out var gameMode)) return false; + + var game_mode_base = GameModeHelper.toGameModeBase(gameMode); + Log.getLogger().info($"LeaveBattleRoom, player : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}"); + + //await game_mode_base.getInstanceRoom().LeaveGameInstanceRoom(player, disconnected); + await Task.CompletedTask; + if (game_mode_base.getInstanceRoom().isDestroy) + { + Log.getLogger().info($"m_instance_room.isDestroy, so destroyBattleRoom : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}"); + InstanceRoomManager.Instance.DestroyRoom(roomId); + Log.getLogger().info($"destroy InstanceRoomManager room Player : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}"); + } + + return true; + } + + public override string toBasicString() + { + return $"BattleInstanceRoom room_id"; + } + + + public Task init() + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceSnapshotAttribute.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceSnapshotAttribute.cs similarity index 99% rename from GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceSnapshotAttribute.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceSnapshotAttribute.cs index 9bbcd1f..563f051 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceSnapshotAttribute.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceSnapshotAttribute.cs @@ -4,7 +4,8 @@ using System.Collections.Generic; using Amazon.DynamoDBv2.Model; using Newtonsoft.Json; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; +using ServerBase; namespace GameServer; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceSnapshotDoc.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceSnapshotDoc.cs similarity index 99% rename from GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceSnapshotDoc.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceSnapshotDoc.cs index 6f273ee..2ed237b 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceSnapshotDoc.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattleInstanceSnapshotDoc.cs @@ -1,7 +1,8 @@ using System.Collections.Concurrent; using Newtonsoft.Json; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattlePlayer.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattlePlayer.cs similarity index 81% rename from GameServer/Contents/GameMode/Mode-Battle/Entity/BattlePlayer.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattlePlayer.cs index 2de785c..1d49638 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattlePlayer.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/BattlePlayer.cs @@ -1,9 +1,6 @@ - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; - namespace GameServer; public class BattlePlayer : EntityBase @@ -12,5 +9,7 @@ public class BattlePlayer : EntityBase public BattlePlayer(Player player) : base(EntityType.BattlePlayer) { m_player = player; - } + } + + } \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Entity/SystemBattleEvent.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/SystemBattleEvent.cs similarity index 94% rename from GameServer/Contents/GameMode/Mode-Battle/Entity/SystemBattleEvent.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/SystemBattleEvent.cs index ac45b78..7261acc 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Entity/SystemBattleEvent.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Entity/SystemBattleEvent.cs @@ -1,5 +1,5 @@ using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleConstant.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleConstant.cs similarity index 100% rename from GameServer/Contents/GameMode/Mode-Battle/Helper/BattleConstant.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleConstant.cs diff --git a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleInstancePlayModeHelper.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleInstancePlayModeHelper.cs similarity index 95% rename from GameServer/Contents/GameMode/Mode-Battle/Helper/BattleInstancePlayModeHelper.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleInstancePlayModeHelper.cs index 6b7b62f..c3f35d6 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleInstancePlayModeHelper.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleInstancePlayModeHelper.cs @@ -1,6 +1,8 @@ -using MetaAssets; +using GameServer.Contents.GameMode.Manage.PlayManage; +using MetaAssets; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; @@ -80,9 +82,9 @@ public static class BattleInstancePlayModeHelper } - public static (Result, BattleObjectMetaData) getBattleObjectMeta(string anchorGuid, BattleInstanceRoom battleInstanceRoom) + public static (Result, BattleObjectMetaData) getBattleObjectMeta(string anchorGuid, GameModeBase battleInstanceRoom) { - var map = battleInstanceRoom.m_instance_room.getMap(); + var map = battleInstanceRoom.getInstanceRoom().getMap(); string err_msg = string.Empty; var result = new Result(); if(false == map.m_anchors.TryGetValue(anchorGuid, out var anchorInfo)) diff --git a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleObjectInteractionLogicHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleObjectInteractionLogicHandler.cs similarity index 94% rename from GameServer/Contents/GameMode/Mode-Battle/Helper/BattleObjectInteractionLogicHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleObjectInteractionLogicHandler.cs index 444932c..fb95f29 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleObjectInteractionLogicHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleObjectInteractionLogicHandler.cs @@ -1,13 +1,7 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using MetaAssets; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - +using ServerCore; namespace GameServer; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleRoomHelper.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleRoomHelper.cs similarity index 91% rename from GameServer/Contents/GameMode/Mode-Battle/Helper/BattleRoomHelper.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleRoomHelper.cs index 5a3ec81..a7f6290 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleRoomHelper.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleRoomHelper.cs @@ -1,6 +1,8 @@ -using Newtonsoft.Json; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using Newtonsoft.Json; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; @@ -36,7 +38,7 @@ public class BattleRoomHelper } - public static (Result, string) getRandomCombatPodAnchorGuid(BattleInstanceSnapshotAttribute attribute, BattleInstanceRoom battleInstanceRoom) + public static (Result, string) getRandomCombatPodAnchorGuid(BattleInstanceSnapshotAttribute attribute, GameModeTPSFreeForAll battleInstanceRoom) { var result = new Result(); @@ -44,7 +46,7 @@ public class BattleRoomHelper var keys = new List(battleInstanceRoom.m_battle_pod_storage_guid_group.Keys); if (keys.Count == 0) { - err_msg = $"battle_instance_room.m_battle_pod_stand_group_pos_meta Keys Count is zero battle_instance_room : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; + err_msg = $"battle_instance_room.m_battle_pod_stand_group_pos_meta Keys Count is zero battle_instance_room : {battleInstanceRoom.getRoomId()}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); @@ -61,7 +63,7 @@ public class BattleRoomHelper // 선택된 battle_group_id의 List 가져오기 if (false == battleInstanceRoom.m_battle_pod_storage_guid_group.TryGetValue(selected_battle_group_id, out var battle_pos_metas)) { - err_msg = $"battle_instance_room.m_battle_pod_stand_group_pos_meta value not exist battle_instance_room : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; + err_msg = $"battle_instance_room.m_battle_pod_stand_group_pos_meta value not exist battle_instance_room : {battleInstanceRoom.getRoomId()}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return (result, string.Empty); } @@ -75,12 +77,12 @@ public class BattleRoomHelper return (result, anchor_guid); } - err_msg = $"not exist anchorGuid {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; + err_msg = $"not exist anchorGuid {battleInstanceRoom.getRoomId()}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return (result, string.Empty); } - public static (Result, string) getRandomRespawnPos(BattleInstanceSnapshotAttribute attribute, BattleInstanceRoom battleInstanceRoom) + public static (Result, string) getRandomRespawnPos(BattleInstanceSnapshotAttribute attribute, GameModeTPSFreeForAll battleInstanceRoom) { List active_respawns = new(); var now = DateTimeHelper.Current; @@ -110,7 +112,7 @@ public class BattleRoomHelper } - public static (Result, string) getRandomPickupPod(int groupId, int idx, BattleInstanceRoom battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) + public static (Result, string) getRandomPickupPod(int groupId, int idx, GameModeTPSFreeForAll battleInstanceRoom, BattleInstanceSnapshotAttribute attribute) { var result = new Result(); @@ -120,7 +122,7 @@ public class BattleRoomHelper //선택된 battle_group_id의 List 가져오기 if (false == battleInstanceRoom.m_battle_pickup_pod_guid_group.TryGetValue(groupId, out var pickup_pod_guid_group)) { - err_msg = $"battle_instance_room.m_battle_pickup_pod_group_pos_meta value not exist battle_instance_room : {battleInstanceRoom.m_instance_room.getMap().m_room_id}"; + err_msg = $"battle_instance_room.m_battle_pickup_pod_group_pos_meta value not exist battle_instance_room : {battleInstanceRoom.getInstanceRoom().getMap().m_room_id}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return (result, string.Empty); } @@ -252,12 +254,15 @@ public class BattleRoomHelper switch (mode) { case BattlePlayMode.PodCombat: - return HostMigrationFactory.createCommonHostMigrator((int) BattlePlayMode.PodCombat, GameServerApp.getServerLogic()); - //return new BattleFFAModeHostMigrator(); + + //return HostMigrationFactory.createCommonHostMigrator((int) BattlePlayMode.PodCombat, GameServerApp.getServerLogic()); + return new BattleFFAModeHostMigrator(); default: Log.getLogger($"createHostMigrator Not implements mode : {mode}"); throw new NotImplementedException(); } } + + } diff --git a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleRoomNotifyHelper.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleRoomNotifyHelper.cs similarity index 72% rename from GameServer/Contents/GameMode/Mode-Battle/Helper/BattleRoomNotifyHelper.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleRoomNotifyHelper.cs index 052a409..126cbe9 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Helper/BattleRoomNotifyHelper.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Helper/BattleRoomNotifyHelper.cs @@ -1,28 +1,30 @@ -using Google.Protobuf.WellKnownTypes; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using Google.Protobuf.WellKnownTypes; using Newtonsoft.Json; -using ServerCore; using ServerBase; +using ServerCommon; +using ServerCore; namespace GameServer; public static class BattleRoomNotifyHelper { - public static void send_GS2C_NTF_POD_COMBAT_STATE(BattleInstanceRoom battleInstanceRoom, Player player) + public static void send_GS2C_NTF_POD_COMBAT_STATE(GameModeTPSFreeForAll battleInstanceRoom, Player player) { var ntf = makePodCombatStateNotify(battleInstanceRoom); GameServerApp.getServerLogic().onSendPacket(player, ntf); } - public static void broadcast_GS2C_NTF_POD_COMBAT_STATE(BattleInstanceRoom battleInstanceRoom) + public static void broadcast_GS2C_NTF_POD_COMBAT_STATE(GameModeTPSFreeForAll battleInstanceRoom) { var ntf = makePodCombatStateNotify(battleInstanceRoom); - Log.getLogger().debug($"broadcast_GS2C_NTF_POD_COMBAT_STATE ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfPodCombatState)}"); + Log.getLogger().debug($"broadcast_GS2C_NTF_POD_COMBAT_STATE ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data : {JsonConvert.SerializeObject(ntf.Message.NtfPodCombatState)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } - private static ClientToGame makePodCombatStateNotify(BattleInstanceRoom battleInstanceRoom) + private static ClientToGame makePodCombatStateNotify(GameModeTPSFreeForAll battleInstanceRoom) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); @@ -49,22 +51,22 @@ public static class BattleRoomNotifyHelper } - public static void send_GS2C_NTF_BATTLE_INSTANCE_STATE(BattleInstanceRoom battleInstanceRoom, Player player) + public static void send_GS2C_NTF_BATTLE_INSTANCE_STATE(GameModeTPSFreeForAll battleInstanceRoom, Player player) { var ntf = makeBattleInstanceStateNotify(battleInstanceRoom); - Log.getLogger().debug($"send_GS2C_NTF_BATTLE_INSTANCE_STATE ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattleInstanceState)}"); + Log.getLogger().debug($"send_GS2C_NTF_BATTLE_INSTANCE_STATE ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattleInstanceState)}"); GameServerApp.getServerLogic().onSendPacket(player, ntf); } - public static void broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE(BattleInstanceRoom battleInstanceRoom) + public static void broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE(GameModeTPSFreeForAll battleInstanceRoom) { var ntf = makeBattleInstanceStateNotify(battleInstanceRoom); - Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattleInstanceState)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_INSTANCE_STATE ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattleInstanceState)}"); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } - private static ClientToGame makeBattleInstanceStateNotify(BattleInstanceRoom battleInstanceRoom) + private static ClientToGame makeBattleInstanceStateNotify(GameModeTPSFreeForAll battleInstanceRoom) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); @@ -83,7 +85,7 @@ public static class BattleRoomNotifyHelper return ntf; } - public static void send_GS2C_NTF_PLAYER_DEATH(BattleInstanceRoom battleInstanceRoom, string killerGuid, string deadUserGuid, Player player) + public static void send_GS2C_NTF_PLAYER_DEATH(GameModeTPSFreeForAll battleInstanceRoom, string killerGuid, string deadUserGuid, Player player) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); @@ -91,13 +93,13 @@ public static class BattleRoomNotifyHelper ntf.Message.NtfBattlePlayerDeath.DeadUserGuid = deadUserGuid; ntf.Message.NtfBattlePlayerDeath.KillerUserGuid = killerGuid; - Log.getLogger().debug($"send_GS2C_NTF_PLAYER_DEATH ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattlePlayerDeath)}"); + Log.getLogger().debug($"send_GS2C_NTF_PLAYER_DEATH ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattlePlayerDeath)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } - public static void send_GS2C_NTF_PLAYER_RESPAWN(BattleInstanceRoom battleInstanceRoom, Pos pos, Player player) + public static void send_GS2C_NTF_PLAYER_RESPAWN(GameModeTPSFreeForAll battleInstanceRoom, Pos pos, Player player) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); @@ -105,12 +107,12 @@ public static class BattleRoomNotifyHelper ntf.Message.NtfBattlePlayerRespawn.RespawnUserGuid = player.getUserGuid(); ntf.Message.NtfBattlePlayerRespawn.Pos = pos; - Log.getLogger().debug($"send_GS2C_NTF_PLAYER_RESPAWN ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattlePlayerRespawn)}"); + Log.getLogger().debug($"send_GS2C_NTF_PLAYER_RESPAWN ntf battleInstanceRoom Id : {battleInstanceRoom.getInstanceRoom().getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattlePlayerRespawn)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } - public static void broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(BattleInstanceRoom battleInstanceRoom, BattleObjectInteractionLogicHandler handler) + public static void broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(GameModeTPSFreeForAll battleInstanceRoom, BattleObjectInteractionLogicHandler handler) { BattleObjectInfo info = new(); info.AnchorGuid = handler.m_battle_object.m_anchor_guid; @@ -124,16 +126,16 @@ public static class BattleRoomNotifyHelper broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(battleInstanceRoom, infos); } - public static void broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(BattleInstanceRoom battleInstanceRoom, List infos) + public static void broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(GameModeTPSFreeForAll battleInstanceRoom, List infos) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); ntf.Message.NtfBattleObjectStateInfo = new ClientToGameMessage.Types.GS2C_NTF_BATTLE_OBJECT_STATE_INFO(); ntf.Message.NtfBattleObjectStateInfo.BattleObjectInfos.AddRange(infos); - Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data :{JsonConvert.SerializeObject(infos)}"); + Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data :{JsonConvert.SerializeObject(infos)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } public static void send_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(List infos, Player player) @@ -150,7 +152,7 @@ public static class BattleRoomNotifyHelper } - public static void broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION(BattleInstanceRoom battleInstanceRoom, string userGuid, string anchorGuid) + public static void broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION(GameModeTPSFreeForAll battleInstanceRoom, string userGuid, string anchorGuid) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); @@ -158,12 +160,12 @@ public static class BattleRoomNotifyHelper ntf.Message.NtfBattleObjectInteraction.AnchorGuid = anchorGuid; ntf.Message.NtfBattleObjectInteraction.UserGuid = userGuid; - Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattleObjectInteraction)}"); + Log.getLogger().debug($"broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data : {JsonConvert.SerializeObject(ntf.Message.NtfBattleObjectInteraction)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } - public static void broadcast_GS2C_NTF_BATTLE_REWARD(BattleInstanceRoom battleInstanceRoom, string acquireUserGuid, CommonResult commonResult) + public static void broadcast_GS2C_NTF_BATTLE_REWARD(GameModeTPSFreeForAll battleInstanceRoom, string acquireUserGuid, CommonResult commonResult) { if (commonResult.EntityCommonResults.Count == 0) return; if (acquireUserGuid.Equals(string.Empty)) return; @@ -175,23 +177,11 @@ public static class BattleRoomNotifyHelper ntf.Message.NtfBattleInstanceReward.AcquireUserGuid = acquireUserGuid; Log.getLogger().debug($"send battle reward ntf acquireUserGuid : {acquireUserGuid}, commonResult : {JsonConvert.SerializeObject(commonResult)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } - - public static void broadcast_GS2C_NTF_BATTLE_INSTANCE_DESTROYED(BattleInstanceRoom battleInstanceRoom) - { - ClientToGame ntf = new ClientToGame(); - ntf.Message = new ClientToGameMessage(); - ntf.Message.NtfBattleInstanceDestroyed = new ClientToGameMessage.Types.GS2C_NTF_BATTLE_INSTANCE_DESTROYED(); - battleInstanceRoom.m_instance_room.Broadcast(ntf); - } - - public static void send_GS2C_NTF_BATTLE_EVENT(Player player) { - if (false == BattleRoomHelper.checkBattleActive()) return; - ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); ntf.Message.NtfBattleEvent = new ClientToGameMessage.Types.GS2C_NTF_BATTLE_EVENT(); @@ -202,8 +192,6 @@ public static class BattleRoomNotifyHelper public static void broadcast_GS2C_NTF_BATTLE_EVENT(List infos) { - if (false == BattleRoomHelper.checkBattleActive()) return; - ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); ntf.Message.NtfBattleEvent = new ClientToGameMessage.Types.GS2C_NTF_BATTLE_EVENT(); @@ -216,16 +204,16 @@ public static class BattleRoomNotifyHelper } } - public static void broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE(BattleInstanceRoom battleInstanceRoom, string leavingUserGuid) + public static void broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE(GameModeTPSFreeForAll battleInstanceRoom, string leavingUserGuid) { ClientToGame ntf = new ClientToGame(); ntf.Message = new ClientToGameMessage(); ntf.Message.NtfPreparationForLeavingBattleInstance = new ClientToGameMessage.Types.GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE(); ntf.Message.NtfPreparationForLeavingBattleInstance.LeavingUserGuid = leavingUserGuid; - Log.getLogger().debug($"broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE ntf battleInstanceRoom Id : {battleInstanceRoom.m_instance_room.getMap().m_room_id} data : {JsonConvert.SerializeObject(ntf.Message.NtfPreparationForLeavingBattleInstance)}"); + Log.getLogger().debug($"broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE ntf battleInstanceRoom Id : {battleInstanceRoom.getRoomId()} data : {JsonConvert.SerializeObject(ntf.Message.NtfPreparationForLeavingBattleInstance)}"); - battleInstanceRoom.m_instance_room.Broadcast(ntf); + battleInstanceRoom.getInstanceRoom().Broadcast(ntf); } public static void broadcast_GS2C_NTF_P2P_HOST_UPDATE(InstanceRoom instanceRoom, string hostUserGuid) diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleEventLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleEventLog.cs similarity index 71% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleEventLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleEventLog.cs index b49b6b8..43d94be 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleEventLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleEventLog.cs @@ -1,18 +1,9 @@ using Newtonsoft.Json; -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - namespace GameServer; - public class BattleEventLog : ILogActor { [JsonProperty] diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleInstanceActorLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleInstanceActorLog.cs similarity index 84% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleInstanceActorLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleInstanceActorLog.cs index fc201de..66d93fa 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleInstanceActorLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleInstanceActorLog.cs @@ -1,14 +1,6 @@ using Newtonsoft.Json; -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - namespace GameServer; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleObjectInteractionBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleObjectInteractionBusinessLog.cs similarity index 73% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleObjectInteractionBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleObjectInteractionBusinessLog.cs index ad864c5..8c90fe4 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleObjectInteractionBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleObjectInteractionBusinessLog.cs @@ -1,17 +1,10 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - namespace GameServer; -public class BattleObjectInteractionBusinessLog : ILogInvokerEx +public class BattleObjectInteractionBusinessLog : ILogInvokerEx { private BattleObjectInteractionLogInfo m_info; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleObjectStateUpdateBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleObjectStateUpdateBusinessLog.cs similarity index 76% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleObjectStateUpdateBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleObjectStateUpdateBusinessLog.cs index c03dd7c..3a7b869 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleObjectStateUpdateBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleObjectStateUpdateBusinessLog.cs @@ -1,18 +1,10 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - - namespace GameServer; -public class BattleObjectStateUpdateBusinessLog : ILogInvokerEx +public class BattleObjectStateUpdateBusinessLog : ILogInvokerEx { private BattleObjectStateUpdateLogInfo m_info; public BattleObjectStateUpdateBusinessLog(string roomId, List infos) : base(LogDomainType.BattleObjectStateUpdate) diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattlePodCombatRewardBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattlePodCombatRewardBusinessLog.cs similarity index 80% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattlePodCombatRewardBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattlePodCombatRewardBusinessLog.cs index 0609023..3b1592e 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattlePodCombatRewardBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattlePodCombatRewardBusinessLog.cs @@ -1,17 +1,10 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - namespace GameServer; -public class BattlePodCombatRewardBusinessLog : ILogInvokerEx +public class BattlePodCombatRewardBusinessLog : ILogInvokerEx { private BattlePodCombatRewardLogInfo m_info; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRespawnBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRespawnBusinessLog.cs similarity index 73% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleRespawnBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRespawnBusinessLog.cs index 0d5bfc3..3ee362b 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRespawnBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRespawnBusinessLog.cs @@ -1,17 +1,9 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; +namespace GameServer.Contents.Battle.Log; -namespace GameServer; - -public class BattleRespawnBusinessLog : ILogInvokerEx +public class BattleRespawnBusinessLog : ILogInvokerEx { private BattleRespawnLogInfo m_info; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoomJoinBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoomJoinBusinessLog.cs similarity index 76% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoomJoinBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoomJoinBusinessLog.cs index 075b50e..7dc5df0 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoomJoinBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoomJoinBusinessLog.cs @@ -1,17 +1,10 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - namespace GameServer; -public class BattleRoomJoinBusinessLog : ILogInvokerEx +public class BattleRoomJoinBusinessLog : ILogInvokerEx { private BattleRoomJoinSuccessLogInfo m_info; public BattleRoomJoinBusinessLog(string joinUserGuid, string joinUserNickname, string roomId, int joinRound) : base(LogDomainType.BattleRoomJoin) diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoomPlayerDeadBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoomPlayerDeadBusinessLog.cs similarity index 79% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoomPlayerDeadBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoomPlayerDeadBusinessLog.cs index dfd16eb..f5d5bd3 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoomPlayerDeadBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoomPlayerDeadBusinessLog.cs @@ -1,17 +1,10 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - namespace GameServer; -public class BattleRoomPlayerDeadBusinessLog : ILogInvokerEx +public class BattleRoomPlayerDeadBusinessLog : ILogInvokerEx { private BattleRoomPlayerDeadLogInfo m_info; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoundUpdateBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoundUpdateBusinessLog.cs similarity index 71% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoundUpdateBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoundUpdateBusinessLog.cs index 535a4a6..51a7254 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleRoundUpdateBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleRoundUpdateBusinessLog.cs @@ -1,17 +1,9 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; +using ServerBase; using ServerCommon.BusinessLogDomain; -using MetaAssets; +namespace ServerCommon; -namespace GameServer; - -public class BattleRoundUpdateBusinessLog : ILogInvokerEx +public class BattleRoundUpdateBusinessLog : ILogInvokerEx { private BattleRoundingUpdateLogInfo m_info; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleSnapShotBusinessLog.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleSnapShotBusinessLog.cs similarity index 77% rename from GameServer/Contents/GameMode/Mode-Battle/Log/BattleSnapShotBusinessLog.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleSnapShotBusinessLog.cs index fe2c225..55a95d4 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Log/BattleSnapShotBusinessLog.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Log/BattleSnapShotBusinessLog.cs @@ -1,23 +1,19 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using GameServer.Contents.GameMode.Mode_Battle.Manage; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; +using ServerCore; +namespace GameServer.Contents.Battle.Log; -namespace GameServer; - -public class BattleSnapShotBusinessLog : ILogInvokerEx +public class BattleSnapShotBusinessLog : ILogInvokerEx { private BattleSnapshotLogInfo m_info; - public BattleSnapShotBusinessLog(BattleInstanceRoom battleInstanceRoom, string loadType): base(LogDomainType.BattleSnapshot) + public BattleSnapShotBusinessLog(GameModeTPSFreeForAll battleInstanceRoom, string loadType): base(LogDomainType.BattleSnapshot) { - m_info = createBattleSnapshotLogInfo(this, battleInstanceRoom, loadType); + //kihoon todo : GameModeTPSFreeForAll 이걸로 받을지 아니면 고칠지 고민 필요 + m_info = createBattleSnapshotLogInfo(this, battleInstanceRoom, loadType); } public override bool hasLog() @@ -31,9 +27,9 @@ public class BattleSnapShotBusinessLog : ILogInvokerEx - public BattleSnapshotLogInfo createBattleSnapshotLogInfo(ILogInvokerEx parent, BattleInstanceRoom battleInstanceRoom, string loadType) + public BattleSnapshotLogInfo createBattleSnapshotLogInfo(ILogInvoker parent, GameModeTPSFreeForAll battleInstanceRoom, string loadType) { - var room_id = battleInstanceRoom.m_instance_room.getMap().m_room_id; + var room_id = battleInstanceRoom.getRoomId(); BattleSnapshotLogInfo info = new(parent, room_id, loadType); var attribute = battleInstanceRoom.getEntityAttribute(); @@ -43,7 +39,7 @@ public class BattleSnapShotBusinessLog : ILogInvokerEx return info; } - info.m_play_mode = battleInstanceRoom.m_play_mode; + //info.m_play_mode = battleInstanceRoom.m_play_mode; info.m_battle_instance_event_start_time = battleInstanceRoom.m_battle_instance_event_start_time; info.m_pod_combat_reward_group_id = battleInstanceRoom.m_pod_combat_reward_group_id; info.m_pod_combat_ffa_id = battleInstanceRoom.m_pod_combat_ffa_id; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceRoom.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAll.cs similarity index 58% rename from GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceRoom.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAll.cs index ad880e8..f4e0db4 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Entity/BattleInstanceRoom.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAll.cs @@ -1,79 +1,50 @@ using System.Collections.Concurrent; - - using Axion.Collections.Concurrent; +using GameServer.Contents.Battle.Log; +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using MetaAssets; using Newtonsoft.Json; - - -using ServerCore; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - +using ServerCore; namespace GameServer; - -public class BattleInstanceRoom : EntityBase, IWithLogActor +public class GameModeTPSFreeForAll : GameModeTPS where T : ITPSMode { - //public string m_instance_room_guid { get; } = string.Empty; - public bool m_is_load_complete { get; private set; } = false; - public InstanceRoom m_instance_room { get; } - - private readonly CancellationTokenSource m_cancel_token = new(); - - public readonly IHostMigrator m_host_migrator; //생성자에서 모드에 맞춰서 할당한다. - - - public BattlePlayMode m_play_mode { get; set; } = BattlePlayMode.PodCombat; + T m_tps_mode_data; public DateTime m_battle_instance_event_start_time { get; private set; } = DateTimeHelper.Current; //실제 이벤트 시작시간 //public DateTime m_battle_instance_load_time { get; } = DateTimeHelper.Current; //이벤트 시작시간과 관계 없이 메모리에 로드 될때의 시간 이 변수가 필요할지 모르겠다. - - //todo : 모드별 관리 메타를 따로 구성해야할듯... - //todo : 제네릭으로 받아도 되려나?.. 고민 필요 우선 임시데이터 + + //kihoon todo : 이거 위치 수정해야됨 + //todo : 제네릭으로 받아도 되려나?.. 고민 필요 우선 임시데이터 public Int32 m_pod_combat_reward_group_id = 1; public Int32 m_pod_combat_ffa_id = 1; - public BattleFFAConfigData m_ffa_config_meta; + public BattleFFAConfigData m_ffa_config_meta; public Dictionary m_ffa_reward_meta = new(); public Int32 m_hot_time_reward = 1; public Int32 m_round_count = 8; - //public Int32 m_pickup_pod_reward_max_count { get; } = 2; - //public int m_max_step_per_round { get; set; } = 10; public ConcurrentHashSet m_respawn_pos_anchors_meta { get; private set; } = new(); //이건 랜덤 돌릴 일이 잦아서 그냥 들고 있는다... public ConcurrentDictionary> m_battle_pod_storage_guid_group { get; private set; } = new(); //pod combat을 생성해줄때 필요 public ConcurrentDictionary> m_battle_pickup_pod_guid_group { get; private set; } = new(); - - - public BattleInstanceRoom(InstanceRoom room, DateTime eventStartTime, Int32 configId, Int32 rewardId, Int32 hotTime, Int32 roundCount) - : base(EntityType.BattleInstance) + + public GameModeTPSFreeForAll(T tpsModeData, InstanceRoom instanceRoom) : base(EntityType.GameModeRunRace, instanceRoom) { - m_instance_room = room; - NullReferenceCheckHelper.throwIfNull(m_instance_room, () => $"m_instance_room is null !!!"); - - m_battle_instance_event_start_time = eventStartTime; - m_play_mode = BattlePlayMode.PodCombat; - - m_host_migrator = BattleRoomHelper.createHostMigrator(m_play_mode); - - m_pod_combat_ffa_id = configId; - m_pod_combat_reward_group_id = rewardId; - m_hot_time_reward = hotTime; - m_round_count = roundCount; - - //m_instance_room_guid = BattleConstant.PREFIX_BATTLE_TRANSACTION_GUID + System.Guid.NewGuid(); - - // BattleFFAConfigData + m_tps_mode_data = tpsModeData; + + + // kihoon todo : 이것도 위치 이동이 필요하다. if (false == MetaData.Instance._BattleFFAConfigMetaTable.TryGetValue(m_pod_combat_ffa_id, out var configData)) { var err_msg = $"Not exist Battle Conig Data id : {m_pod_combat_ffa_id}"; Log.getLogger().error(err_msg); NullReferenceCheckHelper.throwIfNull(configData, () => $"configData is null !!!"); } - m_ffa_config_meta = new BattleFFAConfigData(new BattleFFAConfigDataMutable() { Id = configData.Id, @@ -89,58 +60,107 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor CurrencyCount = configData.CurrencyCount, TPSGuideURL = configData.TPSGuideURL }); - - - if (false == MetaData.Instance._BattleFFARewardMetaTable.TryGetValue(m_pod_combat_reward_group_id, out var rewardMeta)) - { - var err_msg = $"Not exist reward Meta Data id : {m_pod_combat_ffa_id}"; - Log.getLogger().error(err_msg); - NullReferenceCheckHelper.throwIfNull(rewardMeta, () => $"rewardMeta is null !!!"); - } - - foreach (var meta_set in rewardMeta) - { - var val = meta_set.Value; - var key = meta_set.Key; - - BattleFFARewardData data = new BattleFFARewardData(new BattleFFARewardDataMutable() - { - Id = val.Id, - GroupID = val.GroupID, - ChargeLevel = val.ChargeLevel, - ChargeTime = val.ChargeTime, - RewardItemID = val.RewardItemID, - RewardCount = val.RewardCount - }); - - m_ffa_reward_meta.TryAdd(key, data); - } - Log.getLogger().info($"BattleInstanceRoom construct done roomId : " + - $"{room.getMap().m_room_id}, eventStartTime : {eventStartTime}, configId : {configId}, rewardId : {rewardId}, hotTime : {hotTime}, roundCount : {roundCount}"); } + + - - public async Task init() + public override async Task onInit() { - string err_msg = string.Empty; + Log.getLogger().debug("run race onInit called"); + + //제너릭 init + await m_tps_mode_data.initTPSMode(); + + + //레이스 모드에 필요한 액션 추가 + addFFAEntityAction(); + //게임 모드에 필요한 상수값 입력 + setDefaultMetaConstants(); + + await initBattleRoom(); + + + + //다 마무리 되면 부모 init 호출 + var result = await base.onInit(); + + Log.getLogger().debug("run race onInit done"); + + return result; + + + + + } + + private void addFFAEntityAction() + { + Log.getLogger().debug("FFA addEntityAction called"); + //Action 추가 + //kihoon todo : 이거 아래 걸로 일부 수정 필요 addEntityAction(new BattleInstanceAction(this)); addEntityAction(new BattleInstanceUpdateAction(this)); addEntityAction(new BattleObjectInteractAction(this)); addEntityAction(new BattleObjectRewardAction(this)); - - + + + addEntityAction(new FfaGameObjectPodStorageInteractAction(this)); + + //Attribute 추가 - addEntityAttribute(new BattleInstanceSnapshotAttribute(this)); + addEntityAttribute(new BattleInstanceSnapshotAttribute(this)); //ㅏkihoon todo : 이거 여기에 넣는게 맞나? + + Log.getLogger().debug("FFA addEntityAction done"); + } + public async Task initBattleRoom() + { + var result = new Result(); + + // instance 정보 추가 등록 + var server_logic = GameServerApp.getServerLogic(); + var instance_room_storage = new InstanceRoomStorage(); + instance_room_storage.Init(server_logic.getRedisDb(), ""); + + + + DateTime start_time = DateTimeHelper.Current; + Int32 config_id = 1; + Int32 reward_id = 1; + Int32 hot_time = 1; + Int32 round_count = 8; + var system_battle_event = BattleRoomHelper.getBattleRoomStartTimeByEventId(getRoomId()); + if (system_battle_event is null) + { + Log.getLogger().error($"system_battle_event is null!!! : {result.toBasicString()} - instanceRoomId:{getRoomId()}"); + } + else + { + start_time = system_battle_event.m_start_time; + config_id = system_battle_event.m_ffa_config_data_id; + reward_id = system_battle_event.m_ffa_reward_group_id; + hot_time = system_battle_event.m_ffa_hot_time; + round_count = system_battle_event.m_round_count; + } + + result = await instance_room_storage.setInstanceRoomExtraInfo(getRoomId(), EPlaceType.BattleRoom, start_time); //kihoon todo : 이거 나중에 GameRoom으로 바뀔때 문제 되니까 코드 바꿔야 된다. + if (result.isFail()) + { + Log.getLogger().error($"Failed to BattleRoom setInstanceRoomExtraInfo() !!! : {result.toBasicString()} - instanceRoomId:{getRoomId()}"); + return result; + } + //Anchor 정보 로드 loadAnchorPos(); - + //스냅샷 데이터 로드, 없으면 신규 생성 var battle_instance_action = getEntityAction(); NullReferenceCheckHelper.throwIfNull(battle_instance_action, () => $"battle_instance_action is null !!!"); - var result = await battle_instance_action.loadOrCreateSnapshot(); + + var err_msg = string.Empty; + result = await battle_instance_action.loadOrCreateSnapshot(); if (result.isFail()) { err_msg = $"loadSnapshot error instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}"; @@ -149,58 +169,11 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor } Log.getLogger().info($"load Snapshot done instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}"); - //태스크 생성 - result = await createTask(); - if (result.isFail()) - { - err_msg = $"battle instance room onCreateTask error instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}"; - Log.getLogger().error(err_msg); - return result; - } - Log.getLogger().info($"createTask done instanceId : {m_instance_room.getInstanceId()}, roomId : {m_instance_room.getMap().m_room_id}"); - - m_is_load_complete = true; - - // P2P Host Migrator p2p 그룹 id 설정 - m_host_migrator.setGroupHostId(m_instance_room.getMap().getP2PGroupId()); - return result; - } - - public override async Task onInit() - { + await Task.CompletedTask; - var result = new Result(); return result; } - - private async Task createTask() - { - var result = new Result(); - - //Timer에서 사용할 Action 초기화 - var battle_update_action = getEntityAction(); - NullReferenceCheckHelper.throwIfNull(battle_update_action, () => $"battle_update_action is null !!!"); - - try - { - //임시로 0.8초로 처리 나중에 이거 Meta로 빼야 된다. - new PeriodicTaskTimer( GetType().Name, BattleConstant.BATTLE_ROOM_CHECK_INTERVAL, m_cancel_token, onTaskTick); - - await battle_update_action.onInit(); - Log.getLogger().debug("battle_update_action.onInit() dome"); - } - catch(Exception e) - { - var err_msg = $"Exception !!!, new PeriodicTaskTimer() : exception:{e} - {toBasicString()}"; - result.setFail(ServerErrorCode.TryCatchException, err_msg); - return result; - } - - return result; - } - - private void loadAnchorPos() { foreach (var anchor_info_dict in m_instance_room.getMap().getAnchors()) @@ -218,15 +191,14 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor var table_id = anchor_info.AnchorProp.TableId; loadRespawnPos(type, anchor_guid); loadBattleObjectGroups(type, anchor_guid, table_id); - + } - } - + private void loadRespawnPos(string type, string anchorGuid) { if (!type.Equals(BattleConstant.RESPAWN_POS_ANCHOR_NAME)) return; - + if (false == m_respawn_pos_anchors_meta.Add(anchorGuid)) { Log.getLogger().warn($"respawnPos add fail type : {type}, anchorGuid : {anchorGuid}"); @@ -234,28 +206,10 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor Log.getLogger().info($"respawnPos add success type : {type}, anchorGuid : {anchorGuid}"); } - // private void loadBattleObject(string type, string anchorGuid) - // { - // if (!type.Equals(BattleConstant.BATTLE_OBJECT_ANCHOR_NAME)) return; - // - // if (false == m_battle_object_anchors_meta.Add(anchorGuid)) - // { - // Log.getLogger().warn($"m_battle_object_anchors add fail type : {type}, anchorGuid : {anchorGuid}"); - // } - // Log.getLogger().info($"m_battle_object_anchors add success type : {type}, anchorGuid : {anchorGuid}"); - // } - private bool loadBattleObjectGroups(string type, string anchorGuid, Int32 tableID) { if (!type.Equals(BattleConstant.BATTLE_OBJECT_GROUP_ANCHOR_NAME)) return true; - // if (false == m_battle_object_group_anchors_meta.Add(anchorGuid)) - // { - // Log.getLogger().warn($"m_battle_object_group_anchors add fail type : {type}, anchorGuid : {anchorGuid}"); - // } - // Log.getLogger().info($"m_battle_object_group_anchors add success type : {type}, anchorGuid : {anchorGuid}"); - - if (false == MetaData.Instance._BattleObjectSpawnGroupMetaTable.TryGetValue(tableID, out var battle_object_spawn_meta)) { Log.getLogger().warn($"battle_object_group add fail type : {type}, anchorGuid : {anchorGuid}, table_id : {tableID}"); @@ -283,7 +237,6 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor return true; } - private void loadBattleObjectPodStorageGroup(string anchorGuid, int groupId) { if (false == m_battle_pod_storage_guid_group.ContainsKey(groupId)) @@ -297,7 +250,7 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor return; } poses.Add(anchorGuid); - + Log.getLogger().info($"m_battle_pod_stand_group_pos_meta Add anchorGuid : {anchorGuid}, group_id : {groupId}"); } @@ -313,52 +266,41 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor return; } poses.Add(anchorGuid); - + Log.getLogger().info($"m_battle_pod_box_group_pos_meta Add anchorGuid : {anchorGuid}, group_id : {groupId}"); } - - public Result AddOrUpdatePlayer(Player player) + + public void setEventStartTime(DateTime t) { - var result = new Result(); - // if (false == m_battle_players.TryAdd(player.getUserGuid(), new BattlePlayer(player))) - // { - // string err_msg = $"Player tryAdd fail guid : {player.getUserGuid()}"; - // result.setFail(ServerErrorCode.BattleInstanceJoinPlayerError, err_msg); - // Log.getLogger().error(result.toBasicString()); - // return result; - // } - - return result; + m_battle_instance_event_start_time = t; } - - private async Task onTaskTick() + private void setDefaultMetaConstants() { - if (!m_is_load_complete) return; + m_ticker_interval_msecs = GameModeConstants.GAME_MODE_TPS_FFA_CHECK_INTERVAL_MSECS; //이것도 위로 올릴수 있을것 같은데?? + } + public override async Task taskUpdate() + { + //여기에 타이머 처리 해야된다. var battle_update_action = getEntityAction(); NullReferenceCheckHelper.throwIfNull(battle_update_action, () => $"battle_update_action is null !!!"); - - + var result = await battle_update_action.update(); if (result.isFail()) { var err_msg = $"playr mode hander update error : {result.toBasicString()}"; Log.getLogger().error(err_msg); } - + await Task.CompletedTask; } - - public ILogActor toLogActor() + + public override string toBasicString() { - var server_logic = GameServerApp.getServerLogic(); - var region_id = server_logic.getServerConfig().getRegionId(); - var server_name = server_logic.getServerName(); - - var log_info = new BattleInstanceActorLog(region_id, server_name, m_instance_room.getMap().m_room_id, m_instance_room.getInstanceId()); - return log_info; - } - + var basic_string = base.toBasicString() + $"GameModeTPSFreeForAll...."; + return basic_string; + } + public async Task removePodCombat(Player player) { var attribute = getEntityAttribute(); @@ -370,47 +312,23 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor { attribute.m_combat_pod_mode.m_pod_combat.changeDropState(player.getCurrentPositionInfo().Pos); } - BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(this); + + var ffa = this as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + + BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(ffa); //kihoon todo : 이거 코드 이상하다... 수정해야된다. } } - - public void removeBattlePlayerIfExist(string userGuid) - { - // if (true == m_battle_players.ContainsKey(userGuid)) - // { - // if (false == m_battle_players.TryRemove(userGuid, out var player)) - // { - // Log.getLogger().warn($"m_battle_players try remove faial userGuid : {userGuid}"); - // } - // } - } - - public async Task LeaveBattleRoom(Player player, string roomId, bool disconnected = false) - { - //BattleRoom에서 먼저 빼준다. - //m_battle_players.TryRemove(player.getUserGuid(), out _); - - Log.getLogger().info($"LeaveBattleRoom, player : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}"); - await m_instance_room.LeaveBattleInstanceRoom(player, disconnected); - - if (m_instance_room.isDestroy) - { - Log.getLogger().info($"m_instance_room.isDestroy, so destroyBattleRoom : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}"); - await destroyBattleRoom(); - InstanceRoomManager.Instance.DestroyRoom(roomId); - Log.getLogger().info($"destroy InstanceRoomManager room Player : {player.toBasicString()}, roomId : {roomId}, disconnected : {disconnected}"); - } - - return true; - } - + public async Task destroyBattleRoom() { await Task.CompletedTask; - + //여기서 timer 종료 처리 - m_cancel_token.Cancel(); + var entity_ticker = getEntityTicker(); + if(entity_ticker is not null) entity_ticker.getCancelToken().Cancel(); + Log.getLogger().debug($"battle instance room token canceled m_room_id :{m_instance_room.getMap().m_room_id}"); var fn_save_battle_instance = async delegate() @@ -419,7 +337,7 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor var fn_result = new Result(); using (var releaser = await getAsyncLock()) { - //여기서 battleRoomSnapshot 저장 + //여기서 battleRoomSnapshot 저장 var battle_instance_snapshot_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_snapshot_attribute, () => $"battle_instance_snapshot_attribute is null !!!"); if (!battle_instance_snapshot_attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid.Equals(string.Empty)) @@ -428,15 +346,18 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor } battle_instance_snapshot_attribute.modifiedEntityAttribute(true); - + var batch = new QueryBatchEx(this, LogActionType.BattleInstanceSnapshotSave, server_logic.getDynamoDbClient(), true); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } - - BattleSnapShotBusinessLog business_log = new(this, ""); + + var ffa = this as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + + BattleSnapShotBusinessLog business_log = new(ffa, ""); batch.appendBusinessLog(business_log); - + fn_result = await QueryHelper.sendQueryAndBusinessLog(batch); if (fn_result.isSuccess()) @@ -456,19 +377,8 @@ public class BattleInstanceRoom : EntityBase, IWithLogActor var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {toBasicString()}"; Log.getLogger().error(err_msg); } - - - + + + } - - public override string toBasicString() - { - return $"BattleInstanceRoom room_id : {m_instance_room.getMap().m_room_id}"; - } - - - public void setEventStartTime(DateTime t) - { - m_battle_instance_event_start_time = t; - } -} +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAllData.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAllData.cs new file mode 100644 index 0000000..cc32182 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/GameModeTPSFreeForAllData.cs @@ -0,0 +1,12 @@ +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class GameModeTPSFreeForAllData : ITPSMode +{ + public async Task initTPSMode() + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllDestroyHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllDestroyHandler.cs new file mode 100644 index 0000000..fc6a67f --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllDestroyHandler.cs @@ -0,0 +1,76 @@ +using GameServer.Contents.Battle.Log; +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using Newtonsoft.Json; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Battle.ModeFreeForAll.Manage; + +public class TPSFreeForAllDestroyHandler : GameModeDestroyHandlerBase +{ + public TPSFreeForAllDestroyHandler(string roomId) : base(roomId, GameModeType.TPS_FFA) + { + + } + + + public override async Task postDestroy(IGameMode gameMode) + { + await Task.CompletedTask; + + Log.getLogger().debug($"tps ffa post destroy start roomId :{m_room_id}"); + + var game_mode_base = GameModeHelper.toGameModeBase(gameMode); + + var fn_save_battle_instance = async delegate() + { + var server_logic = GameServerApp.getServerLogic(); + var fn_result = new Result(); + + //여기서 battleRoomSnapshot 저장 + var battle_instance_snapshot_attribute = game_mode_base.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(battle_instance_snapshot_attribute, () => $"battle_instance_snapshot_attribute is null !!!"); + if (!battle_instance_snapshot_attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid.Equals(string.Empty)) + { + battle_instance_snapshot_attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid = string.Empty; + } + + battle_instance_snapshot_attribute.modifiedEntityAttribute(true); + + var batch = new QueryBatchEx(game_mode_base, LogActionType.BattleInstanceSnapshotSave, server_logic.getDynamoDbClient(), true); + { + batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); + } + + var ffa = game_mode_base as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {game_mode_base.toBasicString()}"); + + + BattleSnapShotBusinessLog business_log = new(ffa, ""); + batch.appendBusinessLog(business_log); + + fn_result = await QueryHelper.sendQueryAndBusinessLog(batch); + + if (fn_result.isSuccess()) + { + Log.getLogger().info($"save battle instance snapshot done attribute : {JsonConvert.SerializeObject(battle_instance_snapshot_attribute)}"); + } + return fn_result; + }; + + + + var result = await game_mode_base.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "SaveBattleInstanceByDestroy", fn_save_battle_instance); + if (result.isFail()) + { + var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {game_mode_base.toBasicString()}"; + Log.getLogger().error(err_msg); + } + + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllInitHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllInitHandler.cs new file mode 100644 index 0000000..7b269f9 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllInitHandler.cs @@ -0,0 +1,46 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSFreeForAllInitHandler : GameModeInitHandlerBase +{ + public TPSFreeForAllInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.TPS_FFA) + { + } + + public override Result gamedModeInstanceInitValidate() + { + var result = new Result(); + return result; + } + + // public override async Task gamedModeInstanceInit() + // { + // Log.getLogger().debug("tps ffa gamedModeInstanceInit called"); + // + // //await base.gamedModeInstanceInit(); //kihoon todo 이거 바꿔줘야 한다. .. + // + // + // + // var room_id = m_instance_room.getMap().m_room_id; + // var result = BattleInstanceManager.It.battleInstanceInit(m_instance_room, room_id).Result; //kihoon todo :이거 리팩토링 대상 + // if (result.isFail()) + // { + // Log.getLogger().error(result.toBasicString()); + // } + // + // //kihoon todo : 임시 코드 나중에 gameMode로 이동해야됨 + // //var battle_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + // //NullReferenceCheckHelper.throwIfNull(battle_room, () => $"battle_room is null !!"); + // + // //GameModeManager.It.tryAdd(room_id, battle_room); + // + // Log.getLogger().debug("tps ffa gamedModeInstanceInit done"); + // + // return result; + // } +} + + diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinHandler.cs new file mode 100644 index 0000000..42b2047 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinHandler.cs @@ -0,0 +1,48 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSFreeForAllJoinHandler : GameModeJoinHandlerBase +{ + public TPSFreeForAllJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.TPS_FFA) + { + + } + + public override Result gamedModeInstanceJoinValidate() + { + var result = new Result(); + return result; + } + + public override Result gamedModeInstanceJoin(Player player) + { + Log.getLogger().debug("tps ffa gamedModeInstanceJoin called"); + + var result = new Result(); + string err_msg = string.Empty; + + //instanceroom 정보는 남아있는데 battleinstance만 없어지는 케이스가 있어서 예외 처리를 위해 넣어놓음 + var room_id = m_instance_room.getMap().m_room_id; + + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); //kihoon todo : 이거 리팩토링 대상.... IGameMode에서 가져오는게 맞나?? 다른 모드 넣으면서 고민좀 해보자... + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) + { + Log.getLogger().error($"Battle Room Instance is null.. so init start roomId : {room_id}"); + + //kihoon todo : 이거 코드 바꿔야 된다. + // result = Task.Run(() => BattleInstanceManager.It.battleInstanceInit(m_instance_room, room_id)).GetAwaiter().GetResult(); + // if (result.isFail()) + // { + // err_msg = $"BattleIntanceJoin init error, _roomId : {room_id}"; + // Log.getLogger().error(err_msg); + // return result; + // } + } + + Log.getLogger().debug("tps ffa gamedModeInstanceJoin done"); + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinSuccessHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinSuccessHandler.cs similarity index 52% rename from GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinSuccessHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinSuccessHandler.cs index 18ef8e3..9e360e5 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Manage/BattleInstanceJoinSuccessHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllJoinSuccessHandler.cs @@ -1,58 +1,68 @@ - - -using ServerCore; +using GameServer.Contents.GameMode.Manage; +using GameServer.Contents.GameMode.Manage.PlayManage; using ServerBase; using ServerCommon; +using ServerCore; +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; -namespace GameServer; - -public class BattleInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase +public class TPSFreeForAllJoinSuccessHandler : GameModeJoinSuccessHandlerBase { - private readonly BattleInstanceRoom m_battle_instance_room; - public BattleInstanceJoinSuccessHandler(Player player, InstanceRoom instanceRoom) - : base(player, EPlaceType.BattleRoom) + //private readonly BattleInstanceRoom m_battle_instance_room;//kihoon todo : 이거 GameMode 로 변경해야 한다... .. + private IGameMode m_game_mode; + public TPSFreeForAllJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, GameModeType.TPS_FFA, instanceRoom) { var room_id = instanceRoom.getMap().m_room_id; - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"m_battle_instance_room is null !!!"); + //m_battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id)!; + //NullReferenceCheckHelper.throwIfNull(m_battle_instance_room, () => $"m_battle_instance_room is null !!!"); - m_battle_instance_room = battle_instance_room; + GameModeManager.It.tryGetGameMode(room_id, out var gameMode); + NullReferenceCheckHelper.throwIfNull(gameMode, () => $"gameMode is null !!!"); + m_game_mode = gameMode; + + + //m_battle_instance_room = battle_instance_room; } public override Result joinSuccessValidate() { - var result = BattleRoomHelper.checkBattleActive(m_place_type); - if (result.isFail()) return result; + var result = new Result(); + + return result; + } public override async Task joinSuccessConfirmation() { var result = new Result(); string err_msg = string.Empty; - - var room_id = m_battle_instance_room.m_instance_room.getMap().m_room_id; - var battle_instance_attribute = m_battle_instance_room.getEntityAttribute(); + + var ffa = m_game_mode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + + + var room_id = ffa.getRoomId(); + var battle_instance_attribute = ffa.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_attribute, () => $"battle_instance_attribute is null !!!"); - (result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(battle_instance_attribute, m_battle_instance_room); + (result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(battle_instance_attribute, ffa); if (result.isFail()) { return result; } - if (false == m_battle_instance_room.m_respawn_pos_anchors_meta.Contains(pos_meta_guid)) + if (false == ffa.m_respawn_pos_anchors_meta.Contains(pos_meta_guid)) { err_msg = $"respawn pos meta not exist idx : {pos_meta_guid}"; result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg); return result; } - using (var releaser = await m_battle_instance_room.getAsyncLock()) + using (var releaser = await ffa.getAsyncLock()) { var now = DateTimeHelper.Current; - var next_respawn_time = now.AddSeconds(m_battle_instance_room.m_ffa_config_meta.PlayerRespawnTime); + var next_respawn_time = now.AddSeconds(ffa.m_ffa_config_meta.PlayerRespawnTime); battle_instance_attribute.m_combat_pod_mode.m_respawns.AddOrUpdate(pos_meta_guid, next_respawn_time, (key, old) => next_respawn_time); @@ -61,7 +71,7 @@ public class BattleInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase var currenct_pos = location_action.getCurrentPos(); - if (false == m_battle_instance_room.m_instance_room.getMap().getAnchors().TryGetValue(pos_meta_guid, out var anchorInfo)) + if (false == ffa.getInstanceRoom().getMap().getAnchors().TryGetValue(pos_meta_guid, out var anchorInfo)) { err_msg = $"anchorInfo not exist idx : {pos_meta_guid}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); @@ -80,7 +90,9 @@ public class BattleInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase { var result = new Result(); m_player.send_S2C_NTF_SET_LOCATION(); - result = await BattleInstanceManager.It.sendNtfAboutBattleInstance(m_battle_instance_room, m_player); + var ffa = m_game_mode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + result = await BattleInstanceManager.It.sendNtfAboutBattleInstance(ffa, m_player); if (result.isFail()) return result; return result; } @@ -88,16 +100,21 @@ public class BattleInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase public override void joinSuccessWriteLog() { - var room_id = m_battle_instance_room.m_instance_room.getMap().m_room_id; + var ffa = m_game_mode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + + var room_id = ffa.getRoomId(); var user_guid = m_player.getUserGuid(); var user_nickname = m_player.getUserNickname(); - var battle_instance_attribute = m_battle_instance_room.getEntityAttribute(); + + + var battle_instance_attribute = ffa.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_attribute, () => $"battle_instance_attribute is null !!!"); var currenct_round = battle_instance_attribute.m_combat_pod_mode.m_current_round; - var log_action = new LogActionEx(LogActionType.BattleInstanceJoin); + var log_action = new LogAction(LogActionType.BattleInstanceJoin.ToString()); var invoker = new BattleRoomJoinBusinessLog(user_guid, user_nickname, room_id, currenct_round); BusinessLogger.collectLogs(log_action, m_player, new List(){invoker}); } diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllLeaveHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllLeaveHandler.cs new file mode 100644 index 0000000..734068b --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Manage/TPSFreeForAllLeaveHandler.cs @@ -0,0 +1,47 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Battle.ModeFreeForAll.Manage; + +public class TPSFreeForAllLeaveHandler : GameModeLeaveHandlerBase +{ + public TPSFreeForAllLeaveHandler(Player player, string roomId) : base(player, roomId, GameModeType.TPS_FFA) + { + + } + + + public override async Task postLeave(IGameMode gameMode) + { + Log.getLogger().debug($"ffa postLeave start instanceRoomId : {m_room_id}"); + var ffa = gameMode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"location ffa is null !!! - {m_player.toBasicString()}"); + + await ffa.removePodCombat(m_player); + + return new Result(); + } + + public override async Task notifyAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } + + public override async Task logAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattleObjectInteractionPacketHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattleObjectInteractionPacketHandler.cs similarity index 82% rename from GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattleObjectInteractionPacketHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattleObjectInteractionPacketHandler.cs index e95aa0c..2a1fe44 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattleObjectInteractionPacketHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattleObjectInteractionPacketHandler.cs @@ -1,11 +1,10 @@ -using Google.Protobuf; - - -using ServerCore; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using Google.Protobuf; +using MetaAssets; using ServerBase; using ServerCommon; -using MetaAssets; - +using ServerCore; namespace GameServer.PacketHandler; @@ -25,17 +24,17 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler var player = session as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); - var server_config = server_logic.getServerConfig(); - bool is_battle_system_active = server_config.BattleSystemEnable; - - if (false == is_battle_system_active) - { - err_msg = $"is_battle_system_active is false!!!"; - result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg); - Log.getLogger().error(err_msg); - send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, ""); - return result; - } + //var server_config = server_logic.getServerConfig(); + // bool is_battle_system_active = server_config.BattleSystemEnable; + // + // if (false == is_battle_system_active) + // { + // err_msg = $"is_battle_system_active is false!!!"; + // result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg); + // Log.getLogger().error(err_msg); + // send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, ""); + // return result; + // } var req_msg = recvMessage as ClientToGame; ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}"); @@ -55,8 +54,7 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler var packet_create_time = request.PacketCreateTime; var room_id = player.getCurrentInstanceRoomId(); - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room == null) + if(false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) { err_msg = $"battle_instance_room is null : room_id - {room_id}"; Log.getLogger().error(err_msg); @@ -64,8 +62,21 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid); return result; } + - var attribute = battle_instance_room.getEntityAttribute(); + // var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + // if (battle_instance_room == null) + // { + // err_msg = $"battle_instance_room is null : room_id - {room_id}"; + // Log.getLogger().error(err_msg); + // result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg); + // send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid); + // return result; + // } + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); + + var attribute = game_mode_base.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); if (packet_create_time is not null) @@ -78,9 +89,9 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler CommonResult common_result = new(); var fn_interact_battle_object = async delegate() { - using (var releaser = await battle_instance_room.getAsyncLock()) + using (var releaser = await game_mode_base.getAsyncLock()) { - result = await interactObject(handler, battle_instance_room, anchor_guid, player); + result = await interactObject(handler, game_mode_base, anchor_guid, player); if (result.isFail()) return result; //batch 처리 @@ -114,20 +125,22 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler return result; } - - //순서 바꾸지 말것(클라 요청사항) send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid); - BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION(battle_instance_room, player.getUserGuid(), anchor_guid); - BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(battle_instance_room, handler); - sendOtherNotifies(handler, battle_instance_room, common_result); + var ffa = game_mode_base as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}"); + + BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION(ffa, player.getUserGuid(), anchor_guid); + BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(ffa, handler); + + sendOtherNotifies(handler, ffa, common_result); return result; } - private void sendOtherNotifies(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, CommonResult commonResult) + private void sendOtherNotifies(BattleObjectInteractionLogicHandler handler, GameModeTPSFreeForAll battleInstanceRoom, CommonResult commonResult) { //pod combat이 활성화 되서 stand는 전부 비활성화 if (handler.m_need_noti_objects.Count > 0) @@ -156,7 +169,7 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_REWARD(battleInstanceRoom, handler.m_user_guid, commonResult); } - public async Task interactObject(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, string anchorGuid, Player player) + public async Task interactObject(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player) { var attribute = battleInstanceRoom.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); @@ -181,7 +194,7 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler return result; } - public async Task interactBattleObject(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, string anchorGuid, Player player) + public async Task interactBattleObject(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player) { var result = new Result(); string err_msg = string.Empty; @@ -238,7 +251,7 @@ public class BattleObjectInteractionPacketHandler : PacketRecvHandler } - public async Task interactPodCombat(BattleObjectInteractionLogicHandler handler, BattleInstanceRoom battleInstanceRoom, string anchorGuid, Player player) + public async Task interactPodCombat(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player) { await Task.CompletedTask; diff --git a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattlePlayerDeadPacketHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattlePlayerDeadPacketHandler.cs similarity index 85% rename from GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattlePlayerDeadPacketHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattlePlayerDeadPacketHandler.cs index f0f6023..8807f59 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattlePlayerDeadPacketHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattlePlayerDeadPacketHandler.cs @@ -1,17 +1,7 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using GameServer.Contents.GameMode.Mode_Battle.Manage; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -using static ClientToGameReq.Types; -using static ClientToGameRes.Types; - +using ServerCore; namespace GameServer.PacketHandler; @@ -42,8 +32,9 @@ public class BattlePlayerDeadPacketHandler : PacketRecvHandler return result; } var room_id = player.getCurrentInstanceRoomId(); - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room == null) + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) { err_msg = $"battle_instance_room is null : room_id - {room_id}"; Log.getLogger().error(err_msg); @@ -72,22 +63,24 @@ public class BattlePlayerDeadPacketHandler : PacketRecvHandler { Log.getLogger().info($"Player Deat packet received room_id : {room_id}, anchor_guid : {killer_guid}, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}"); } - - result = await playerDeadProcess(player, killer_guid, battle_instance_room); + + var ffa = gameMode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + result = await playerDeadProcess(player, killer_guid, ffa); if (result.isFail()) return result; - await killUserQuestCheck(killer_guid, battle_instance_room); + await killUserQuestCheck(killer_guid, ffa); return result; } - public async Task killUserQuestCheck(string killerGuid, BattleInstanceRoom battleInstanceRoom) + public async Task killUserQuestCheck(string killerGuid, GameModeTPSFreeForAll battleInstanceRoom) { - battleInstanceRoom.m_instance_room.tryGetInstanceMember(killerGuid, out var killer); + battleInstanceRoom.getInstanceRoom().tryGetInstanceMember(killerGuid, out var killer); if (killer is null) { - Log.getLogger().warn($"killer User not exist instance killerGuid : {killerGuid}, roomId :{battleInstanceRoom.m_instance_room.getMap().m_room_id} "); + Log.getLogger().warn($"killer User not exist instance killerGuid : {killerGuid}, roomId :{battleInstanceRoom.getRoomId()} "); return; } @@ -95,7 +88,7 @@ public class BattlePlayerDeadPacketHandler : PacketRecvHandler NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); if (false == attribute.m_combat_pod_mode.m_tactical_board.TryGetValue(killerGuid, out var boradInfo)) { - Log.getLogger().warn($"killer User not exist m_tactical_board killerGuid : {killerGuid}, roomId :{battleInstanceRoom.m_instance_room.getMap().m_room_id} "); + Log.getLogger().warn($"killer User not exist m_tactical_board killerGuid : {killerGuid}, roomId :{battleInstanceRoom.getRoomId()} "); return; } @@ -103,7 +96,7 @@ public class BattlePlayerDeadPacketHandler : PacketRecvHandler await QuestManager.It.QuestCheck(killer, new QuestTpsPlayerKill(EQuestEventTargetType.TPS, EQuestEventNameType.PLAYERKILL, kill_count)); } - public async Task playerDeadProcess(Player player, string kilerUserGuid, BattleInstanceRoom battleInstanceRoom) + public async Task playerDeadProcess(Player player, string kilerUserGuid, GameModeTPSFreeForAll battleInstanceRoom) { var dead_user_guid = player.getUserGuid(); var dead_user_nickname = player.getUserNickname(); @@ -137,16 +130,16 @@ public class BattlePlayerDeadPacketHandler : PacketRecvHandler BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battleInstanceRoom); } - battleInstanceRoom.m_instance_room.tryGetInstanceMember(kilerUserGuid, out var killer_player); + battleInstanceRoom.getInstanceRoom().tryGetInstanceMember(kilerUserGuid, out var killer_player); string killer_nickname = string.Empty; if (killer_player is not null) { killer_nickname = killer_player.getUserNickname(); } - var log_action = new LogActionEx(LogActionType.BattleUserDead); + var log_action = new LogAction(LogActionType.BattleUserDead.ToString()); var invoker = new BattleRoomPlayerDeadBusinessLog(dead_user_guid, dead_user_nickname, kilerUserGuid, killer_nickname - , battleInstanceRoom.m_instance_room.getMap().m_room_id, attribute.m_combat_pod_mode.m_current_round, need_pod_combat_drop_noti); + , battleInstanceRoom.getRoomId(), attribute.m_combat_pod_mode.m_current_round, need_pod_combat_drop_noti); BusinessLogger.collectLogs(log_action, player, new List(){invoker}); return fn_result; diff --git a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattlePlayerRespawnPacketHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattlePlayerRespawnPacketHandler.cs similarity index 78% rename from GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattlePlayerRespawnPacketHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattlePlayerRespawnPacketHandler.cs index a49a826..6e34612 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/BattlePlayerRespawnPacketHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/BattlePlayerRespawnPacketHandler.cs @@ -1,17 +1,9 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using GameServer.Contents.Battle.Log; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Battle.Manage; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -using static ClientToGameReq.Types; -using static ClientToGameRes.Types; - +using ServerCore; namespace GameServer.PacketHandler; @@ -43,10 +35,11 @@ public class BattlePlayerRespawnPacketHandler : PacketRecvHandler } var room_id = player.getCurrentInstanceRoomId(); - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room == null) + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) { - err_msg = $"battle_instance_room is null : room_id - {room_id}"; + err_msg = $"gameMode is null : room_id - {room_id}"; Log.getLogger().error(err_msg); result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg); send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result); @@ -71,24 +64,28 @@ public class BattlePlayerRespawnPacketHandler : PacketRecvHandler { Log.getLogger().info($"Battle Player respawn packet received packetCreateTime : {packet_create_time}, player : {player.toBasicString()}"); } - - + + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); AnchorInfo? anchor_info = null; - var attribute = battle_instance_room.getEntityAttribute(); + var attribute = game_mode_base.getEntityAttribute(); var next_respawn_time = DateTimeHelper.Current; NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); - using (var releaser = await battle_instance_room.getAsyncLock()) + var ffa = gameMode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); + + using (var releaser = await game_mode_base.getAsyncLock()) { - (result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(attribute, battle_instance_room); + (result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(attribute, ffa); if (result.isFail()) { send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result); return result; } - if (false == battle_instance_room.m_respawn_pos_anchors_meta.Contains(pos_meta_guid)) + if (false == ffa.m_respawn_pos_anchors_meta.Contains(pos_meta_guid)) { err_msg = $"respawn pos meta not exist pos_meta_guid : {pos_meta_guid}"; result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg); @@ -97,12 +94,12 @@ public class BattlePlayerRespawnPacketHandler : PacketRecvHandler } var now = DateTimeHelper.Current; - next_respawn_time = now.AddSeconds(battle_instance_room.m_ffa_config_meta.PlayerRespawnTime); + next_respawn_time = now.AddSeconds(ffa.m_ffa_config_meta.PlayerRespawnTime); attribute.m_combat_pod_mode.m_respawns.AddOrUpdate(pos_meta_guid, next_respawn_time, (key, old) => next_respawn_time); attribute.modifiedEntityAttribute(true); - if (false == battle_instance_room.m_instance_room.getMap().m_anchors.TryGetValue(pos_meta_guid, out var anchorInfo)) + if (false == game_mode_base.getInstanceRoom().getMap().m_anchors.TryGetValue(pos_meta_guid, out var anchorInfo)) { err_msg = $"anchorInfo not exist pos_meta_guid : {pos_meta_guid}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); @@ -117,15 +114,15 @@ public class BattlePlayerRespawnPacketHandler : PacketRecvHandler cloned_anchor_pos.Z += 100; send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, cloned_anchor_pos, result); - BattleRoomNotifyHelper.send_GS2C_NTF_PLAYER_RESPAWN(battle_instance_room, cloned_anchor_pos, player); + BattleRoomNotifyHelper.send_GS2C_NTF_PLAYER_RESPAWN(ffa, cloned_anchor_pos, player); //로그 남긴다. var invokers = new List(); - var log_action = new LogActionEx(LogActionType.BattleUserRespawn); + var log_action = new LogAction(LogActionType.BattleUserRespawn.ToString()); var round = attribute.m_combat_pod_mode.m_current_round; var round_state = attribute.m_combat_pod_mode.m_round_state_type; - var users = battle_instance_room.m_instance_room.tryGetInstanceExistUserForLog(); + var users = ffa.getInstanceRoom().tryGetInstanceExistUserForLog(); BattleRespawnBusinessLog business_log = new(room_id, round, round_state, player.getUserGuid(), player.getUserNickname(), anchor_info.AnchorGuid, next_respawn_time); invokers.Add(business_log); BusinessLogger.collectLogs(log_action, player, invokers); diff --git a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/JoinBattleInstancePacketHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/JoinBattleInstancePacketHandler.cs similarity index 97% rename from GameServer/Contents/GameMode/Mode-Battle/PacketHandler/JoinBattleInstancePacketHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/JoinBattleInstancePacketHandler.cs index 47b157d..daba38e 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/JoinBattleInstancePacketHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/JoinBattleInstancePacketHandler.cs @@ -1,17 +1,8 @@ -using Google.Protobuf; + using Google.Protobuf.WellKnownTypes; - - -using ServerCore; using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -using static ClientToGameReq.Types; -using static ClientToGameRes.Types; - +using ServerCore; namespace GameServer.PacketHandler; @@ -120,7 +111,7 @@ public class JoinBattleInstancePacketHandler : PacketRecvHandler return result; } - var batch = new QueryBatchEx(player, LogActionType.JoinInstance, server_logic.getDynamoDbClient(), true); + var batch = new QueryBatch(player, LogActionType.JoinInstance.ToString(), server_logic.getDynamoDbClient(), true); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); batch.addQuery(new QueryFinal()); diff --git a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/LeaveBattleInstancePacketHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/LeaveBattleInstancePacketHandler.cs similarity index 95% rename from GameServer/Contents/GameMode/Mode-Battle/PacketHandler/LeaveBattleInstancePacketHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/LeaveBattleInstancePacketHandler.cs index 14a2b47..739c91a 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/LeaveBattleInstancePacketHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/LeaveBattleInstancePacketHandler.cs @@ -1,18 +1,10 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using MetaAssets; using Newtonsoft.Json; - - -using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -using static ClientToGameReq.Types; -using static ClientToGameRes.Types; - +using ServerCore; namespace GameServer.PacketHandler; @@ -167,8 +159,9 @@ public class LeaveBattleInstancePacketHandler : PacketRecvHandler return result; } - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(instance_room_Id); - if (battle_instance_room is null) + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(instance_room_Id); + + if (false == GameModeManager.It.tryGetGameMode(instance_room_Id, out var gameMode)) { err_msg = $"battle_instance_room not esist instance_room_Id : {instance_room_Id}, player : {player.toBasicString()}"; result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg); @@ -176,7 +169,10 @@ public class LeaveBattleInstancePacketHandler : PacketRecvHandler return result; } - var battle_instance_room_attribute = battle_instance_room.getEntityAttribute(); + var ffa = gameMode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}"); + + var battle_instance_room_attribute = ffa.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_room_attribute, () => $"battle_instance_room_attribute is null !!! - {player.toBasicString()}"); // 2. move to channel diff --git a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs similarity index 83% rename from GameServer/Contents/GameMode/Mode-Battle/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs index a95ba15..7107bb2 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/PacketHandler/PreparationForLeavingBattleInstancePacketHandler.cs @@ -1,15 +1,7 @@ -using Nettention.Proud; -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; +using GameServer.Contents.GameMode.Mode_Battle.Manage; +using Nettention.Proud; using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - +using ServerCore; namespace GameServer.PacketHandler; @@ -61,8 +53,8 @@ public class PreparationForLeavingBattleInstancePacketHandler : PacketRecvHandle var room_id = player.getCurrentInstanceRoomId(); - var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); - if (battle_instance_room == null) + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) { err_msg = $"battle_instance_room is null : room_id - {room_id}"; Log.getLogger().error(err_msg); @@ -72,14 +64,15 @@ public class PreparationForLeavingBattleInstancePacketHandler : PacketRecvHandle } var user_guid = player.getUserGuid(); - + var ffa = gameMode as GameModeTPSFreeForAll; + NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!"); var fn_preparation_for_leaving = async delegate() { bool need_pod_combat_drop_noti = false; - using (var releaser = await battle_instance_room.getAsyncLock()) + using (var releaser = await ffa.getAsyncLock()) { - var attribute = battle_instance_room.getEntityAttribute(); + var attribute = ffa.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); var current_owner_guid = attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid; need_pod_combat_drop_noti = user_guid.Equals(current_owner_guid); @@ -92,20 +85,20 @@ public class PreparationForLeavingBattleInstancePacketHandler : PacketRecvHandle } send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(player, result); - BattleRoomNotifyHelper.broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE(battle_instance_room, user_guid); + BattleRoomNotifyHelper.broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE(ffa, user_guid); if (need_pod_combat_drop_noti) { - BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battle_instance_room); + BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(ffa); } - var host_guid = battle_instance_room.m_host_migrator.getHostUserGuid(); + var host_guid = ffa.m_host_migrator.getHostUserGuid(); if (user_guid.Equals(host_guid)) { var hosts = new List(); hosts.Add(player.getHostId()); - var p2p_group_id = battle_instance_room.m_instance_room.getMap().getP2PGroupId(); - var define_result = battle_instance_room.m_host_migrator.defineHost(p2p_group_id, new SuperPeerSelectionPolicy(), hosts.ToArray()); + var p2p_group_id = ffa.getInstanceRoom().getMap().getP2PGroupId(); + var define_result = ffa.m_host_migrator.defineHost(p2p_group_id, new SuperPeerSelectionPolicy(), hosts.ToArray()); if (define_result.isFail()) { Log.getLogger().warn(define_result.toBasicString()); @@ -113,8 +106,8 @@ public class PreparationForLeavingBattleInstancePacketHandler : PacketRecvHandle return result; } - var new_host_user_guid = battle_instance_room.m_host_migrator.getHostUserGuid(); - BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(battle_instance_room.m_instance_room, new_host_user_guid); + var new_host_user_guid = ffa.m_host_migrator.getHostUserGuid(); + BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(ffa.getInstanceRoom(), new_host_user_guid); } return result; }; diff --git a/GameServer/Contents/GameMode/Mode-Battle/Redis/BattleInstanceRoomStorage.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Redis/BattleInstanceRoomStorage.cs similarity index 97% rename from GameServer/Contents/GameMode/Mode-Battle/Redis/BattleInstanceRoomStorage.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Redis/BattleInstanceRoomStorage.cs index 43c5c67..d605d21 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Redis/BattleInstanceRoomStorage.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Redis/BattleInstanceRoomStorage.cs @@ -2,25 +2,13 @@ using MetaAssets; using Newtonsoft.Json; using ServerControlCenter; -using ServerCore; using ServerBase; +using ServerCore; using StackExchange.Redis; using System.Numerics; +using ServerBase; namespace ServerCommon; - // public class InstanceRoomInfo - // { - // public string roomId { get; set; } = string.Empty; - // public string InstanceAddress { get; set; } = string.Empty; - // public int InstancePort { get; set; } = 0; - // public int InstanceId { get; set; } = 0; - // public int UgcNpcCount { get; set; } = 0; - // public string MyhomeGuid { get; set; } = string.Empty; - // public EPlaceType InstancePlaceType { get; set; } = EPlaceType.NONE; - // public Timestamp InstanceStartTime { get; set; } = DateTimeHelper.MinTime.ToTimestamp(); - // } - - public class BattleInstanceRoomStorage { @@ -35,6 +23,7 @@ public class BattleInstanceRoomStorage public void Init(IDatabase redisDB, string keyPrefix) { _database = redisDB; + _roomKeyPrefix = keyPrefix; if (_roomKeyPrefix != string.Empty && !_roomKeyPrefix.EndsWith(":")) { diff --git a/GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPickupPod.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPickupPod.cs similarity index 100% rename from GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPickupPod.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPickupPod.cs diff --git a/GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPodCombat.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPodCombat.cs similarity index 77% rename from GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPodCombat.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPodCombat.cs index f5e2c2c..23b7cd7 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPodCombat.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPodCombat.cs @@ -1,15 +1,4 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; +namespace GameServer.Contents.Battle.Reward; public class RewardPodCombat : RewardBase { diff --git a/GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPodStorage.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPodStorage.cs similarity index 100% rename from GameServer/Contents/GameMode/Mode-Battle/Reward/RewardPodStorage.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Reward/RewardPodStorage.cs diff --git a/GameServer/Contents/GameMode/Mode-Battle/Tickers/BattleEventCheckTicker.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Tickers/BattleEventCheckTicker.cs similarity index 99% rename from GameServer/Contents/GameMode/Mode-Battle/Tickers/BattleEventCheckTicker.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Tickers/BattleEventCheckTicker.cs index de01601..14940e3 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Tickers/BattleEventCheckTicker.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Tickers/BattleEventCheckTicker.cs @@ -3,8 +3,9 @@ using System.Net; using GameServer.Contents.Battle.Doc; using MetaAssets; using Newtonsoft.Json; +using ServerBase; using ServerCommon; -using ServerCore; using ServerBase; +using ServerCore; namespace GameServer; @@ -20,8 +21,6 @@ public class BattleEventCheckTicker : EntityTicker public override async Task onTaskTick() { - if (false == BattleRoomHelper.checkBattleActive()) return; - var result = await refreshEvent(); if (result.isFail()) { diff --git a/GameServer/Contents/GameMode/Mode-Battle/Tickers/BattleEventNotifyTicker.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Tickers/BattleEventNotifyTicker.cs similarity index 82% rename from GameServer/Contents/GameMode/Mode-Battle/Tickers/BattleEventNotifyTicker.cs rename to GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Tickers/BattleEventNotifyTicker.cs index 4c227f7..64bf04f 100644 --- a/GameServer/Contents/GameMode/Mode-Battle/Tickers/BattleEventNotifyTicker.cs +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Tickers/BattleEventNotifyTicker.cs @@ -1,15 +1,8 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerBase; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; +using ServerCore; - -namespace GameServer; +namespace GameServer.Contents.Battle.Tickers; public class BattleEventNotifyTicker : EntityTicker { @@ -21,11 +14,7 @@ public class BattleEventNotifyTicker : EntityTicker public override async Task onTaskTick() { - if (false == BattleRoomHelper.checkBattleActive()) return; - - //필요한 Noti가 있다면 broadCast await notifyBattleEvent(); - } private async Task notifyBattleEvent() diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatch.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatch.cs new file mode 100644 index 0000000..48a8d7c --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatch.cs @@ -0,0 +1,19 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class GameModeTPSTeamDeathMatch : GameModeTPS where T : ITPSMode +{ + T m_tps_mode_data; + + public GameModeTPSTeamDeathMatch(T tpsModeData, InstanceRoom instanceRoom) : base(EntityType.GameModeTpsteamDeathMatch, instanceRoom) + { + m_tps_mode_data = tpsModeData; + } + + public override string toBasicString() + { + var basic_string = base.toBasicString() + $"GameModeTPSTeamDeathMatch...."; + return basic_string; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatchData.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatchData.cs new file mode 100644 index 0000000..f7eae5d --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/GameModeTPSTeamDeathMatchData.cs @@ -0,0 +1,13 @@ +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class GameModeTPSTeamDeathMatchData : ITPSMode +{ + public async Task initTPSMode() + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchDestroyHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchDestroyHandler.cs new file mode 100644 index 0000000..c9eb7a5 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchDestroyHandler.cs @@ -0,0 +1,21 @@ +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSTeamDeathMatchDestroyHandler : GameModeDestroyHandlerBase +{ + public TPSTeamDeathMatchDestroyHandler(string roomId) : base(roomId, GameModeType.TPS_TDM) + { + + } + + public override async Task postDestroy(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchInitHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchInitHandler.cs new file mode 100644 index 0000000..216f22d --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchInitHandler.cs @@ -0,0 +1,17 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSTeamDeathMatchInitHandler : GameModeInitHandlerBase +{ + public TPSTeamDeathMatchInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.TPS_TDM) + { + } + + public override Result gamedModeInstanceInitValidate() + { + var result = new Result(); + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinHandler.cs new file mode 100644 index 0000000..175137e --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinHandler.cs @@ -0,0 +1,30 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSTeamDeathMatchJoinHandler : GameModeJoinHandlerBase +{ + public TPSTeamDeathMatchJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.TPS_TDM) + { + + } + + public override Result gamedModeInstanceJoinValidate() + { + var result = new Result(); + return result; + } + + public override Result gamedModeInstanceJoin(Player player) + { + Log.getLogger().debug("tps tdm gamedModeInstanceJoin called"); + + var result = new Result(); + string err_msg = string.Empty; + + Log.getLogger().debug("tps tdm gamedModeInstanceJoin done"); + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinSuccessHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinSuccessHandler.cs new file mode 100644 index 0000000..f982658 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchJoinSuccessHandler.cs @@ -0,0 +1,48 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSTeamDeathMatchJoinSuccessHandler : GameModeJoinSuccessHandlerBase +{ + //private readonly BattleInstanceRoom m_battle_instance_room; + + + public TPSTeamDeathMatchJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, GameModeType.TPS_TDM, instanceRoom) + { + var room_id = instanceRoom.getMap().m_room_id; + //var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); + //NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"m_battle_instance_room is null !!!"); + //m_battle_instance_room = battle_instance_room; + } + + public override Result joinSuccessValidate() + { + var result = new Result(); + return result; + } + + public override async Task joinSuccessConfirmation() + { + var result = new Result(); + string err_msg = string.Empty; + + await Task.CompletedTask; + + return result; + } + + public override async Task joinSuccessNotify() + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } + + public override void joinSuccessWriteLog() + { + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchLeaveHandler.cs b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchLeaveHandler.cs new file mode 100644 index 0000000..952c124 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Battle/ModeTeamDeathMatch/Manage/TPSTeamDeathMatchLeaveHandler.cs @@ -0,0 +1,39 @@ +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Battle.Manage; + +public class TPSTeamDeathMatchLeaveHandler : GameModeLeaveHandlerBase +{ + public TPSTeamDeathMatchLeaveHandler(Player player, string roomId) : base(player, roomId, GameModeType.TPS_TDM) + { + } + + + public override async Task postLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return new Result(); + } + + public override async Task notifyAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } + + public override async Task logAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceInitHandler.cs b/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceInitHandler.cs deleted file mode 100644 index 10eb8fa..0000000 --- a/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceInitHandler.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; - -public class ArcadeRunningInstanceInitHandler : GameModeInitHandlerBase -{ - public ArcadeRunningInstanceInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.ArcadeRunning) - { - } - - public override Result gamedModeInstanceInitValidate() - { - var result = new Result(); - - //kihoon todo : running 추가 - - return result; - } - - public override Result gamedModeInstanceInit() - { - var result = new Result(); - //kihoon todo : running 추가 - - return result; - } - -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinHandler.cs b/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinHandler.cs deleted file mode 100644 index 6746fe0..0000000 --- a/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; - - -public class ArcadeRunningInstanceJoinHandler : GameModeJoinHandlerBase -{ - public ArcadeRunningInstanceJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, EPlaceType.ArcadeRunning) - { - - } - - public override Result gamedModeInstanceJoinValidate(EPlaceType placeType) - { - var result = new Result(); - return result; - } - - public override Result gamedModeInstanceJoin(Player player) - { - var result = new Result(); - string err_msg = string.Empty; - - - return result; - } -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinSuccessHandler.cs b/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinSuccessHandler.cs deleted file mode 100644 index e3d8bb0..0000000 --- a/GameServer/Contents/GameMode/Mode-Running/Manage/ArcadeRunningInstanceJoinSuccessHandler.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; -using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; - - -namespace GameServer; - -public class ArcadeRunningInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase -{ - public ArcadeRunningInstanceJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, EPlaceType.ArcadeRunning) - { - } - - public override Result joinSuccessValidate() - { - var result = new Result(); - - return result; - } - - public override Task joinSuccessConfirmation() - { - var result = new Result(); - - return Task.FromResult(result); - } - - public override Task joinSuccessNotify() - { - var result = new Result(); - - return Task.FromResult(result); - } - - public override void joinSuccessWriteLog() - { - - } -} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/Manage/GameModeRun.cs b/GameServer/Contents/GameMode/Mode-Running/Manage/GameModeRun.cs new file mode 100644 index 0000000..b626ada --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/Manage/GameModeRun.cs @@ -0,0 +1,40 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class GameModeRun : GameModeBase, IGameModeGenre +{ + public GameModeRun(EntityType type, InstanceRoom instanceRoom) : base(type, instanceRoom) + { + + } + + public override Task onInit() + { + return base.onInit(); + } + + public override Task taskUpdate() + { + Log.getLogger().debug("run race taskUpdate called"); + + + Log.getLogger().debug("run race taskUpdate done"); + + return Task.CompletedTask; + } + + public override string toBasicString() + { + var basic_string = base.toBasicString() + $"GameModeRun...."; + return basic_string; + } + + public override Task initAfterTimerCreate() + { + m_current_game_mode_state = new RaceStateReady(this); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/Manage/IRunningMode.cs b/GameServer/Contents/GameMode/Mode-Running/Manage/IRunningMode.cs new file mode 100644 index 0000000..3fc53e2 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/Manage/IRunningMode.cs @@ -0,0 +1,6 @@ +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public interface IRunningMode +{ + Task initRunningMode(); +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventure.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventure.cs new file mode 100644 index 0000000..6cda07e --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventure.cs @@ -0,0 +1,18 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class GameModeRunAdventure : GameModeRun where T : IRunningMode +{ + T m_run_mode_data; + public GameModeRunAdventure(T runModeData, InstanceRoom instanceRoom) : base(EntityType.GameModeRunAdventure, instanceRoom) + { + m_run_mode_data = runModeData; + } + + public override string toBasicString() + { + var basic_string = base.toBasicString() + $"GameModeRunAdventure...."; + return basic_string; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventureData.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventureData.cs new file mode 100644 index 0000000..2c0c513 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/GameModeRunAdventureData.cs @@ -0,0 +1,12 @@ +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class GameModeRunAdventureData : IRunningMode +{ + public async Task initRunningMode() + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureDestroyHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureDestroyHandler.cs new file mode 100644 index 0000000..c722392 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureDestroyHandler.cs @@ -0,0 +1,20 @@ +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunAdventureDestroyHandler : GameModeDestroyHandlerBase +{ + public RunAdventureDestroyHandler(string roomId) : base(roomId, GameModeType.RUN_ADV) + { + } + + public override async Task postDestroy(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureInitHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureInitHandler.cs new file mode 100644 index 0000000..9a35547 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureInitHandler.cs @@ -0,0 +1,18 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunAdventureInitHandler : GameModeInitHandlerBase +{ + public RunAdventureInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.RUN_ADV) + { + } + + public override Result gamedModeInstanceInitValidate() + { + var result = new Result(); + return result; + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinHandler.cs new file mode 100644 index 0000000..c252fe3 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinHandler.cs @@ -0,0 +1,30 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunAdventureJoinHandler : GameModeJoinHandlerBase +{ + public RunAdventureJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.RUN_ADV) + { + + } + + public override Result gamedModeInstanceJoinValidate() + { + var result = new Result(); + return result; + } + + public override Result gamedModeInstanceJoin(Player player) + { + Log.getLogger().debug("run race gamedModeInstanceJoin called"); + + var result = new Result(); + string err_msg = string.Empty; + + Log.getLogger().debug("run race gamedModeInstanceJoin done"); + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Manage/GameRoomJoinSuccessHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinSuccessHandler.cs similarity index 59% rename from GameServer/Contents/GameMode/Manage/GameRoomJoinSuccessHandler.cs rename to GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinSuccessHandler.cs index c60145d..2b984e8 100644 --- a/GameServer/Contents/GameMode/Manage/GameRoomJoinSuccessHandler.cs +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureJoinSuccessHandler.cs @@ -1,13 +1,11 @@ -using ServerCommon; +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +namespace GameServer.Contents.GameMode.Mode_Running.Manage; - -namespace GameServer; - - -public class GameRoomJoinSuccessHandler: GameModeJoinSuccessHandlerBase +public class RunAdventureJoinSuccessHandler : GameModeJoinSuccessHandlerBase { - public GameRoomJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, EPlaceType.GameRoom) + public RunAdventureJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, GameModeType.RUN_ADV, instanceRoom) { } diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureLeaveHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureLeaveHandler.cs new file mode 100644 index 0000000..8a05dd6 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeAdventure/Manage/RunAdventureLeaveHandler.cs @@ -0,0 +1,38 @@ +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunAdventureLeaveHandler : GameModeLeaveHandlerBase +{ + public RunAdventureLeaveHandler(Player player, string roomId) : base(player, roomId, GameModeType.RUN_ADV) + { + } + + public override async Task postLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return new Result(); + } + + public override async Task notifyAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } + + public override async Task logAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceGameObjectSavePointInteractAction.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceGameObjectSavePointInteractAction.cs new file mode 100644 index 0000000..d8af1e6 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceGameObjectSavePointInteractAction.cs @@ -0,0 +1,43 @@ +using System.Collections.Concurrent; +using GameServer.Contents.GameMode.Action; +using GameServer.Contents.GameMode.InteractionObject; +using GameServer.Contents.GameMode.Manage.PlayManage; +using MetaAssets; +using ServerBase; +using ServerCommon; + +namespace GameServer; + +public class RaceGameObjectSavePointInteractAction : GameGameObjectAction +{ + protected ConcurrentDictionary m_game_objects = new(); //kihoon todo : 이거 위로 올릴지 말지, 하니면 GameModeBase에서 들고 있을지... 고민해볼것.. + public RaceGameObjectSavePointInteractAction (EntityBase owner) + : base(owner, EGameObjectType.Save_Point) + { + } + + public override async Task onInit() + { + await Task.CompletedTask; + var result = new Result(); + return result; + } + + public override void onClear() + { + return; + } + + public override async Task interact(string anchorGuid, DateTime interactionTime) + { + //여기에 interact 로직 추가해야 된다... + await Task.CompletedTask; + var result = new Result(); + return result; + } + + public override string toBasicString() + { + return $"class name : {nameof(RaceGameObjectSavePointInteractAction)}...." + base.toBasicString(); + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceStateCheckAction.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceStateCheckAction.cs new file mode 100644 index 0000000..c10ecbc --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Actions/RaceStateCheckAction.cs @@ -0,0 +1,63 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Running.Manage; +using GameServer.Contents.GameMode.Mode_Running.ModeRace.Helper; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.ModeRace.Actions; + +public class RaceStateCheckAction : EntityActionBase +{ + public RaceStateCheckAction(EntityBase owner) + : base(owner) + { + } + public override void onClear() + { + return; + } + + public override async Task onInit() + { + await Task.CompletedTask; + + var result = new Result(); + + return result; + } + + public async Task stateUpdate() + { + var run_race = getOwner() as GameModeBase; + NullReferenceCheckHelper.throwIfNull(run_race, () => $"GameModeRunRace is null !!"); + + var game_mode = getOwner() as IGameMode; + NullReferenceCheckHelper.throwIfNull(game_mode, () => $"game_mode is null !!"); + var current_state = run_race.getGameModeState(); + + //kihoon todo : 해당 sate에 따른 업데이트 내용 처리 할게 있으면 여기서 처리 Update를 어떻게 써야 되나.... + current_state.update(); + + var next_state_type = current_state.checkState(); + var current_state_type = current_state.getStateType(); + + //다르면 상태 변경 + if (!current_state_type.Equals(next_state_type)) + { + var next_state = RunRaceHelper.createRaceGameState(game_mode, next_state_type); + + current_state.exit(); + run_race.setGameModeState(next_state); + current_state = run_race.getGameModeState(); + + current_state.enter(); + } + + var result = new Result(); + + await Task.CompletedTask; + return result; + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Helper/RunRaceHelper.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Helper/RunRaceHelper.cs new file mode 100644 index 0000000..26dfcaa --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Helper/RunRaceHelper.cs @@ -0,0 +1,27 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Manage.StateManage; +using GameServer.Contents.GameMode.Mode_Running.Manage; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.ModeRace.Helper; + +public class RunRaceHelper +{ + public static IGameModeState createRaceGameState(IGameMode gameMode, GameModeState state) + { + switch (state) + { + case GameModeState.Start: + return new RaceStateStart(gameMode); + case GameModeState.Ready: + return new RaceStateReady(gameMode); + case GameModeState.End: + return new RaceStateReady(gameMode); + case GameModeState.Destroyed: + return new RaceStateReady(gameMode); + default: + Log.getLogger().error($"createRaceGameState not defined GameModeState : {state}"); + return new RaceStateEnd(gameMode); + } + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRace.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRace.cs new file mode 100644 index 0000000..758b358 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRace.cs @@ -0,0 +1,88 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Mode_Running.Manage; +using GameServer.Contents.GameMode.Mode_Running.ModeRace.Actions; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer; + +public class GameModeRunRace : GameModeRun where T : IRunningMode +{ + T m_run_mode_data; + + public GameModeRunRace(T runModeData, InstanceRoom instanceRoom) : base(EntityType.GameModeRunRace, instanceRoom) + { + Log.getLogger().debug("run race constructor called"); + + m_run_mode_data = runModeData; + + Log.getLogger().debug("run race constructor done"); + } + + + public override Task onInit() + { + Log.getLogger().debug("run race onInit called"); + + //제너릭 init + m_run_mode_data.initRunningMode(); + + //레이스 모드에 필요한 액션 추가 + addRaceEntityAction(); + + //게임 모드에 필요한 상수값 입력 + setDefaultMetaConstants(); + + + + //다 마무리 되면 부모 init 호출 + var result = base.onInit(); + + + Log.getLogger().debug("run race onInit done"); + return result; + } + + public override Task initAfterTimerCreate() + { + m_current_game_mode_state = new RaceStateReady(this); + + return Task.CompletedTask; + } + + + private void addRaceEntityAction() + { + Log.getLogger().debug("run race addEntityAction called"); + + addEntityAction(new RaceStateCheckAction(this)); + addEntityAction(new RaceGameObjectSavePointInteractAction(this)); + + Log.getLogger().debug("run race addEntityAction done"); + } + + private void setDefaultMetaConstants() + { + m_ticker_interval_msecs = GameModeConstants.GAME_MODE_RUN_RACE_CHECK_INTERVAL_MSECS; + } + + public override async Task taskUpdate() + { + + var state_check_action = getEntityAction(); + NullReferenceCheckHelper.throwIfNull(state_check_action, () => $"location attribute is null !!"); + + var result = await state_check_action.stateUpdate(); + if (result.isFail()) return; + + } + + public override string toBasicString() + { + var basic_string = base.toBasicString() + $"GameModeRunRace....roomId : {getRoomId()}"; + return basic_string; + } + + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRaceData.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRaceData.cs new file mode 100644 index 0000000..ea68369 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/GameModeRunRaceData.cs @@ -0,0 +1,21 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class GameModeRunRaceData : IRunningMode +{ + public async Task initRunningMode() + { + Log.getLogger().debug("run race data initRunningMode called"); + + + + var result = new Result(); + + await Task.CompletedTask; + + Log.getLogger().debug("run race data initRunningMode done"); + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceDestroyHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceDestroyHandler.cs new file mode 100644 index 0000000..5b5629b --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceDestroyHandler.cs @@ -0,0 +1,24 @@ +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Mode_Running.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.ModeRace.Manage; + +public class RunRaceDestroyHandler : GameModeDestroyHandlerBase +{ + public RunRaceDestroyHandler(string roomId) : base(roomId, GameModeType.RUN_RACE) + { + + } + + public override async Task postDestroy(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceInitHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceInitHandler.cs new file mode 100644 index 0000000..6c56d38 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceInitHandler.cs @@ -0,0 +1,21 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunRaceInitHandler : GameModeInitHandlerBase +{ + public RunRaceInitHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.RUN_RACE) + { + } + + public override Result gamedModeInstanceInitValidate() + { + var result = new Result(); + + //kihoon todo : running 추가 + + return result; + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinHandler.cs new file mode 100644 index 0000000..d2bb446 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinHandler.cs @@ -0,0 +1,31 @@ +using GameServer.Contents.GameMode.Manage; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunRaceJoinHandler : GameModeJoinHandlerBase +{ + public RunRaceJoinHandler(InstanceRoom instanceRoom) : base(instanceRoom, GameModeType.RUN_RACE) + { + + } + + public override Result gamedModeInstanceJoinValidate() + { + var result = new Result(); + return result; + } + + public override Result gamedModeInstanceJoin(Player player) + { + Log.getLogger().debug("run race gamedModeInstanceJoin called"); + + var result = new Result(); + string err_msg = string.Empty; + + + Log.getLogger().debug("run race gamedModeInstanceJoin done"); + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinSuccessHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinSuccessHandler.cs new file mode 100644 index 0000000..e3475c2 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceJoinSuccessHandler.cs @@ -0,0 +1,65 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Manage.StateManage; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RunRaceJoinSuccessHandler : GameModeJoinSuccessHandlerBase +{ + public RunRaceJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, GameModeType.RUN_RACE, instanceRoom) + { + } + + public override Result joinSuccessValidate() + { + var result = new Result(); + + return result; + } + + public override Task joinSuccessConfirmation() + { + var result = new Result(); + + return Task.FromResult(result); + } + + public override async Task joinSuccessNotify() + { + var result = new Result(); + + var room_id = m_instance_room.getMap().m_room_id; + + var err_msg = string.Empty; + if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) + { + err_msg = $"not exist GameMode after join success!!!! roomId : {room_id}"; + + result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); + Log.getLogger().error(err_msg); + return result; + } + + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!"); + + var state = game_mode_base.getGameModeState(); + + var state_base = state as GameModeStateBase; + NullReferenceCheckHelper.throwIfNull(state_base, () => $"state_base is null !!!"); + + GameNotifyHelper.send_GS2C_NTF_GAME_STATE_UPDATE(m_player, m_instance_room, state.getStateType(), state_base.getNextStateChangeTime()); + + await Task.CompletedTask; + return result; + } + + public override void joinSuccessWriteLog() + { + + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceLeaveHandler.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceLeaveHandler.cs new file mode 100644 index 0000000..7387ea4 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/Manage/RunRaceLeaveHandler.cs @@ -0,0 +1,37 @@ +using GameServer.Contents.GameMode.Manage.LeaveManage; +using GameServer.Contents.GameMode.Manage.PlayManage; +using ServerCommon; + +namespace GameServer.Contents.GameMode.Mode_Running.ModeRace.Manage; + +public class RunRaceLeaveHandler : GameModeLeaveHandlerBase +{ + public RunRaceLeaveHandler(Player player, string roomId) : base(player, roomId, GameModeType.RUN_RACE) + { + + } + + public override async Task postLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } + + public override async Task notifyAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } + + public override async Task logAfterLeave(IGameMode gameMode) + { + var result = new Result(); + + await Task.CompletedTask; + return result; + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateDestroyed.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateDestroyed.cs new file mode 100644 index 0000000..39f3ba5 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateDestroyed.cs @@ -0,0 +1,34 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Manage.StateManage; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RaceStateDestroyed: GameModeStateBase +{ + public RaceStateDestroyed(IGameMode gameMode) : base(gameMode, GameModeState.Destroyed) + { + + } + + public override void enter() + { + + } + + public override void update() + { + + } + + public override void exit() + { + + } + + public override GameModeState checkState() + { + + return getStateType(); + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateEnd.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateEnd.cs new file mode 100644 index 0000000..d27ca12 --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateEnd.cs @@ -0,0 +1,33 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Manage.StateManage; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RaceStateEnd : GameModeStateBase +{ + public RaceStateEnd(IGameMode gameMode) : base(gameMode, GameModeState.End) + { + + } + + public override void enter() + { + + } + + public override void update() + { + + } + + public override void exit() + { + + } + + public override GameModeState checkState() + { + return getStateType(); + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateReady.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateReady.cs new file mode 100644 index 0000000..01efabe --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateReady.cs @@ -0,0 +1,38 @@ +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Manage.StateManage; +using ServerCore; + +namespace GameServer; + +public class RaceStateReady : GameModeStateBase +{ + public RaceStateReady(IGameMode gameMode) : base(gameMode, GameModeState.Ready) + { + } + + public override void enter() + { + + } + + public override void update() + { + + } + + public override void exit() + { + //Ready 상태에서 나갈때는 딱히 할게 없다. + } + + public override GameModeState checkState() + { + var now = DateTimeHelper.Current; + if (m_next_state_change_time <= now) + { + return GameModeState.Start; + } + + return getStateType(); + } +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateStart.cs b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateStart.cs new file mode 100644 index 0000000..b86133b --- /dev/null +++ b/GameServer/Contents/GameMode/Mode-Running/ModeRace/State/RaceStateStart.cs @@ -0,0 +1,45 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.PlayManage; +using GameServer.Contents.GameMode.Manage.StateManage; +using ServerCore; + +namespace GameServer.Contents.GameMode.Mode_Running.Manage; + +public class RaceStateStart : GameModeStateBase +{ + public RaceStateStart(IGameMode gameMode) : base(gameMode, GameModeState.Start) + { + + } + + public override void enter() + { + getStateType(); + + + + var instance_room = m_game_mode_base.getInstanceRoom(); + + var next_update_time = DateTimeHelper.Current.AddMinutes(10); //kihoon todo : 이거 meta로 빼야된다. + + GameNotifyHelper.broadcast_GS2C_NTF_GAME_STATE_UPDATE(instance_room, getStateType(), next_update_time); + + } + + public override void update() + { + + } + + public override void exit() + { + + } + + public override GameModeState checkState() + { + + return getStateType(); + } + +} \ No newline at end of file diff --git a/GameServer/Contents/GameMode/PacketHandler/GameObjectInteractionPacketHandler.cs b/GameServer/Contents/GameMode/PacketHandler/GameObjectInteractionPacketHandler.cs new file mode 100644 index 0000000..1a6d217 --- /dev/null +++ b/GameServer/Contents/GameMode/PacketHandler/GameObjectInteractionPacketHandler.cs @@ -0,0 +1,121 @@ +using GameServer.Contents.GameMode.Helper; +using GameServer.Contents.GameMode.Manage.PlayManage; +using Google.Protobuf; +using ServerBase; +using ServerCommon; +using ServerCore; + +namespace GameServer.PacketHandler; + +[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_GAME_OBJECT_INTERACTION), typeof(GameObjectInteractionPacketHandler), typeof(GameLoginListener))] +public class GameObjectInteractionPacketHandler : PacketRecvHandler +{ + public override async Task onProcessPacket(ISession session, IMessage recvMessage) + { + await Task.CompletedTask; + var result = new Result(); + + var err_msg = string.Empty; + + var server_logic = GameServerApp.getServerLogic(); + + var player = session as Player; + NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); + + var req_msg = recvMessage as ClientToGame; + ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}"); + + var request = req_msg.Request.ReqGameObjectInteraction; + if (null == request) + { + err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.InvalidArgument, err_msg); + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, ""); + return result; + } + + var anchor_guid = request.AnchorGuid; + ArgumentNullReferenceCheckHelper.throwIfNull(anchor_guid, () => $"anchor_guid is null !!! - {player.toBasicString()}"); + var paacket_create_time = request.PacketCreateTime; + ArgumentNullReferenceCheckHelper.throwIfNull(paacket_create_time, () => $"paacket_create_time is null !!! - {player.toBasicString()}"); + + DateTime interaction_time = paacket_create_time.ToDateTime(); + + var room_id = player.getCurrentInstanceRoomId(); + if(false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode)) + { + err_msg = $"gameMode is null : room_id - {room_id}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + return result; + } + + + var game_mode_base = gameMode as GameModeBase; + NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_moce_base is null !!!"); + if (false == MapDataTable.Instance.getAnchor(anchor_guid, out var anchor)) + { + err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg); + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + return result; + } + + if(false == game_mode_base.getInstanceRoom().getMap().getAnchors().TryGetValue(anchor_guid, out var anchor2)) + { + err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg); + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + return result; + } + + var anchor_info = game_mode_base.getInstanceRoom().getMap().findAnchorInfo(anchor_guid); + if(anchor_info is null) + { + err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg); + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + return result; + } + + var interact_action = GameModeHelper.getObjectInteractAction(game_mode_base, anchor); //kihoon todo : 어떤 anchor를 가져다 쓸지 추후 확인 필요 + if (interact_action is null) + { + err_msg = $"anchor_guid invalid : room_id - {room_id}, anchor_guid : {anchor_guid}, player : {player.toBasicString()}"; + Log.getLogger().error(err_msg); + result.setFail(ServerErrorCode.GameModeInvalidAnchorGuid, err_msg); + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + return result; + } + + result = await interact_action.interact(anchor_guid, interaction_time); + if (result.isFail()) + { + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + return result; + } + + send_S2C_ACK_GAME_OBJECT_INTERACTION(player, result, anchor_guid); + + + return result; + } + + public bool send_S2C_ACK_GAME_OBJECT_INTERACTION(Player player, Result result, string anchorGuid) + { + var ack_packet = new ClientToGame(); + ack_packet.Response = new ClientToGameRes(); + + ack_packet.Response.ErrorCode = result.ErrorCode; + ack_packet.Response.AckGameObjectInteraction = new ClientToGameRes.Types.GS2C_ACK_GAME_OBJECT_INTERACTION(); + ack_packet.Response.AckGameObjectInteraction.AnchorGuid = anchorGuid; + + return GameServerApp.getServerLogic().onSendPacket(player, ack_packet); + + } +} \ No newline at end of file diff --git a/GameServer/Contents/ItemCloth/Action/ItemClothAction.cs b/GameServer/Contents/ItemCloth/Action/ItemClothAction.cs index 7198655..fd7bf51 100644 --- a/GameServer/Contents/ItemCloth/Action/ItemClothAction.cs +++ b/GameServer/Contents/ItemCloth/Action/ItemClothAction.cs @@ -389,7 +389,7 @@ namespace GameServer var item_attribute = found_item.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); - var equiped_inven_type = item_attribute.EquipedIvenType; + var equiped_inven_type = item_attribute.EquipedInvenType; var equiped_pos = item_attribute.EquipedPos; if ( InvenEquipType.None != equiped_inven_type ) { diff --git a/GameServer/Contents/Loginout/Action/GameLogoutAction.cs b/GameServer/Contents/Loginout/Action/GameLogoutAction.cs index 853ffdb..a318d99 100644 --- a/GameServer/Contents/Loginout/Action/GameLogoutAction.cs +++ b/GameServer/Contents/Loginout/Action/GameLogoutAction.cs @@ -137,24 +137,7 @@ public partial class GameLogoutAction : EntityActionBase var current_indun_location = location_action.getCurrentLocation() as IndunLocation; NullReferenceCheckHelper.throwIfNull(current_indun_location, () => $"current_indun_location is null !!! - {owner.toBasicString()}"); - var instance_room_Id = current_indun_location.InstanceRoomId; - - //LeaveInstanceRoom 전에 배틀 인스턴스 메모리 정리 - if (instance_room_Id != string.Empty) - { - await BattleInstanceManager.It.tryLeaveBattelInstance(owner, instance_room_Id); - } - else - { - Log.getLogger().warn("instance_room_Id is Empty!!!!!"); - } - await game_zone_action.tryLeaveInstanceRoom(); - - if (instance_room_Id != string.Empty) - { - await BattleInstanceManager.It.tryDestroyBattleRoom(instance_room_Id); - } } var player_action = owner.getEntityAction(); diff --git a/GameServer/Contents/MyHome/PacketHandler/SaveMyhomeUgcPacketHandler.cs b/GameServer/Contents/MyHome/PacketHandler/SaveMyhomeUgcPacketHandler.cs index 88112ef..0991e72 100644 --- a/GameServer/Contents/MyHome/PacketHandler/SaveMyhomeUgcPacketHandler.cs +++ b/GameServer/Contents/MyHome/PacketHandler/SaveMyhomeUgcPacketHandler.cs @@ -143,6 +143,21 @@ internal class SaveMyhomeUgcPacketHandler : PacketRecvHandler // myhome_info = myhome_action.toMyHomeInfo(); //} + //beaconShop Deactive item + foreach (var (ugc_npc_guid, ugc_npc_state_info) in res.ModigyUgcNpcStateInfos) + { + if (ugc_npc_state_info.StateType == EntityStateType.None) + { + var beaconShopAction = player.getEntityAction(); + result = await beaconShopAction.BeaconShopDeactiveItems(ugc_npc_guid, player.getUserGuid(), business_logs); + if (result.isFail()) + { + send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res); + return result; + } + } + } + result = await myhome_action.tryUploadMyhomeUgcInfoToS3(); if (result.isFail()) { diff --git a/GameServer/Contents/Quest/QuestCheat.cs b/GameServer/Contents/Quest/QuestCheat.cs index 490d204..5948bf3 100644 --- a/GameServer/Contents/Quest/QuestCheat.cs +++ b/GameServer/Contents/Quest/QuestCheat.cs @@ -1,12 +1,9 @@ -using Google.Protobuf; -using Google.Protobuf.WellKnownTypes; - - -using ServerCore; -using ServerBase; +using ServerCore; using ServerCommon; -using ServerCommon.BusinessLogDomain; -using MetaAssets; +using Nettention.Proud; + + + namespace GameServer; @@ -104,15 +101,25 @@ internal class ChatCommandMethodTest : ChatCommandBase if (id == 1) { - + + // foreach (var room in BattleInstanceManager.It.getBattleInstanceRooms().Values) + // { + // var p2p_group_id = room.m_instance_room.getMap().getP2PGroupId(); + // room.m_host_migrator.defineHost(p2p_group_id); + // var host_id = room.m_host_migrator.getHostUserGuid(); + // Log.getLogger().warn($"{host_id}"); + // } + + + // var packet = new ClientToGame(); // packet.Request = new ClientToGameReq(); // var req_msg = new ClientToGameReq.Types.C2GS_REQ_JOIN_BATTLE_INSTANCE(); // packet.Request.ReqJoinBattleInstance = req_msg; // // packet.Request.ReqJoinBattleInstance.EventId = 13; - - + + // var packet = new ClientToGame(); // packet.Request = new ClientToGameReq(); // var req_msg = new ClientToGameReq.Types.C2GS_REQ_BATTLE_PLAYER_DEATH(); @@ -130,9 +137,17 @@ internal class ChatCommandMethodTest : ChatCommandBase } else if (id == 2) { - // var server_logic = GameServerApp.getServerLogic(); - // var systemMailManager = server_logic.getSystemMailManager(); - // await systemMailManager.CheatFuncSaveSystemMetaMail(); + var host_a = int.Parse(args[1]); + var host_b = int.Parse(args[2]); + player.getSessionId().toHostID(); + var roomId = player.getCurrentInstanceRoomId(); + + if (false == GameModeManager.It.tryGetGameMode(roomId, out var gameMode)) return; + + + var ping = GameServerApp.getServerLogic().getProudNetListener().getNetServer().GetP2PRecentPingMs((HostID)host_a, (HostID)host_b); + int cc = 0; + Log.getLogger().info($"{cc}"); } else if (id == 3) { diff --git a/GameServer/Contents/Rental/Action/RentalAgentAction.cs b/GameServer/Contents/Rental/Action/RentalAgentAction.cs index ae9e256..0bc8cd9 100644 --- a/GameServer/Contents/Rental/Action/RentalAgentAction.cs +++ b/GameServer/Contents/Rental/Action/RentalAgentAction.cs @@ -91,6 +91,21 @@ namespace GameServer return false; } + public DateTime? getRentalMyhomeFinishTime(string myhomeGuid) + { + foreach (var rental in m_rentals.Values) + { + var rental_attribute = rental.getEntityAttribute(); + if (rental_attribute == null) + continue; + + if (rental_attribute.MyhomeGuid == myhomeGuid) + return rental_attribute.RentalFinishTime; + } + + return null; + } + public (int, int, int) getAddrressFromMyhome(string myhomeGuid) { var land_meta_id = 0; diff --git a/GameServer/Contents/Shop/Action/ShopAction.cs b/GameServer/Contents/Shop/Action/ShopAction.cs index 46ffdcb..87f147d 100644 --- a/GameServer/Contents/Shop/Action/ShopAction.cs +++ b/GameServer/Contents/Shop/Action/ShopAction.cs @@ -239,7 +239,7 @@ public class ShopAction : EntityActionBase } // 1. 착용 여부 확인 - if (InvenEquipType.None != attribute.EquipedIvenType) + if (InvenEquipType.None != attribute.EquipedInvenType) { err_msg = $"Failed to check equipped item : already equipped - {attribute.ItemGuid}"; result.setFail(ServerErrorCode.SlotsAlreadyEquiped, err_msg); diff --git a/GameServer/Entity/Inventory/Base/Action/InventoryActionBase.cs b/GameServer/Entity/Inventory/Base/Action/InventoryActionBase.cs index 35edb29..59cda80 100644 --- a/GameServer/Entity/Inventory/Base/Action/InventoryActionBase.cs +++ b/GameServer/Entity/Inventory/Base/Action/InventoryActionBase.cs @@ -286,7 +286,7 @@ namespace GameServer NullReferenceCheckHelper.throwIfNull(doc_item_attrib, () => $"doc_item_attrib is null !!! - {owner.toBasicString()}"); // InvenEquipType 비장작 상태인 경우만 허용 한다. !!! - kangms - if (InvenEquipType.None != doc_item_attrib.EquipedIvenType) + if (InvenEquipType.None != doc_item_attrib.EquipedInvenType) { err_msg = $"Not found InventoryRule !!! : ItemMetaId:{doc_item_attrib.ItemMetaId}, itemGuid:{doc_item_attrib.OwnerGuid} - {owner.toBasicString()}"; result.setFail(ServerErrorCode.InvenEquipTypeInvalid, err_msg); @@ -363,7 +363,7 @@ namespace GameServer NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); // InvenEquipType 장착 상태인 경우만 장착 시켜준다 !!! - kangms - if (InvenEquipType.None != item_attribute.EquipedIvenType) + if (InvenEquipType.None != item_attribute.EquipedInvenType) { var equiped_pos = item_attribute.EquipedPos; result = await tryTakableToEquip(took_in_item, (Int16)equiped_pos); @@ -372,10 +372,10 @@ namespace GameServer return (result, took_in_item); } - if(false == reservedSlotTypes.TryGetValue(item_attribute.EquipedIvenType, out var reserved_slots)) + if(false == reservedSlotTypes.TryGetValue(item_attribute.EquipedInvenType, out var reserved_slots)) { reserved_slots = new HashSet(); - reservedSlotTypes.Add(item_attribute.EquipedIvenType, reserved_slots); + reservedSlotTypes.Add(item_attribute.EquipedInvenType, reserved_slots); } reserved_slots.Add((Int16)equiped_pos); } @@ -616,7 +616,7 @@ namespace GameServer } break; } - item_attribute.EquipedIvenType = equipRuleBase.InvenEquipType; + item_attribute.EquipedInvenType = equipRuleBase.InvenEquipType; item_attribute.EquipedPos = (UInt16)to_equip_pos; item_attribute.modifiedEntityAttribute(); @@ -646,7 +646,7 @@ namespace GameServer NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); // 2. 장착 인벤으로 설정되어 있는 경우, 장착을 해제 한다. - if (InvenEquipType.None != item_attribute.EquipedIvenType) + if (InvenEquipType.None != item_attribute.EquipedInvenType) { (result, var unequiped_item) = await tryTakableOutFromEquip(reserved_item); if (result.isFail()) @@ -680,7 +680,7 @@ namespace GameServer NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}"); // 2. 장착 인벤으로 설정되어 있는 경우, 장착을 해제 한다. - if (InvenEquipType.None != item_attribute.EquipedIvenType) + if (InvenEquipType.None != item_attribute.EquipedInvenType) { (result, var unequiped_item) = await tryTakableOutFromEquip(reserved_item); if (result.isFail()) @@ -884,7 +884,7 @@ namespace GameServer } break; } - item_attribute.EquipedIvenType = InvenEquipType.None; + item_attribute.EquipedInvenType = InvenEquipType.None; item_attribute.EquipedPos = 0; item_attribute.modifiedEntityAttribute(); diff --git a/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcAction.cs b/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcAction.cs index 67d8cc3..8752896 100644 --- a/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcAction.cs +++ b/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcAction.cs @@ -832,7 +832,7 @@ public class UgcNpcAction : EntityActionBase { var beacon_shop_action = masterEntity.getEntityAction(); if (beacon_shop_action != null) - ugc_summary.HasReceivePayment = beacon_shop_action.hasBeaconShopSoldRecord(ugc_summary.UgcNpcMetaGuid) == true ? BoolType.True : BoolType.False; + ugc_summary.HasReceivePayment = beacon_shop_action.getBeaconShopNumOfReceiptNotReceived(ugc_summary.UgcNpcMetaGuid) == 0 ? BoolType.False : BoolType.True; } return ugc_summary; diff --git a/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcBeaconShopAction.cs b/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcBeaconShopAction.cs index 56407b9..5eb4f4d 100644 --- a/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcBeaconShopAction.cs +++ b/GameServer/Entity/Npc/UgcNpc/Action/UgcNpcBeaconShopAction.cs @@ -181,5 +181,16 @@ namespace GameServer { m_isUpdateBeaconShopItem = true; } + + public void setDeactiveAllItems() + { + foreach(var beaconShopItem in m_beaconShopItems.Values) + { + var beacon_shop_item_attribute = beaconShopItem.getEntityAttribute(); + NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attribute, () => $"beacon_shop_item_attribute is null !!! - {toBasicString()}"); + beacon_shop_item_attribute.IsActiveSelling = false; + beacon_shop_item_attribute.modifiedEntityAttribute(); + } + } } } diff --git a/GameServer/GameServer.csproj b/GameServer/GameServer.csproj index 9611fb5..cd560f7 100644 --- a/GameServer/GameServer.csproj +++ b/GameServer/GameServer.csproj @@ -43,10 +43,6 @@ - - - - ..\..\ThirdPartyPackages\ProudNet\1.9.58941\ProudNet\lib\DotNet\ProudDotNetClient.dll diff --git a/GameServer/MessageQueue/PacketHandler/NtfBeaconShopUpdateItemMQPacketHandler.cs b/GameServer/MessageQueue/PacketHandler/NtfBeaconShopUpdateItemMQPacketHandler.cs index 1ccaa3b..f306301 100644 --- a/GameServer/MessageQueue/PacketHandler/NtfBeaconShopUpdateItemMQPacketHandler.cs +++ b/GameServer/MessageQueue/PacketHandler/NtfBeaconShopUpdateItemMQPacketHandler.cs @@ -26,6 +26,7 @@ public class NtfBeaconShopUpdateItemMQPacketHandler : PacketRecvHandler BEACON_GUID beacon_guid = msg.NtfUpdateBeaconShopItem.TargetBeaconGuid; USER_GUID beacon_owner_guid = msg.NtfUpdateBeaconShopItem.TargetUserGuid; + BoolType hasBeaconShopItem = msg.NtfUpdateBeaconShopItem.HasBeaconShopItem; var server_logic = GameServerApp.getServerLogic(); ArgumentNullException.ThrowIfNull(server_logic); @@ -39,14 +40,14 @@ public class NtfBeaconShopUpdateItemMQPacketHandler : PacketRecvHandler var ugc_npc_beacon_shop_action = found_ugc_npc.getEntityAction(); ugc_npc_beacon_shop_action.setUpdateBeaconShopItem(); - var packet = BeaconShopNotifyHelper.makeAckBeaconShopRefreshPacket(beacon_guid); + var packet = BeaconShopNotifyHelper.makeAckBeaconShopRefreshPacket(beacon_guid, hasBeaconShopItem); if (server_logic.getServerType().toServerType() == ServerType.Channel) { var receivers = server_logic.getPlayerManager().getUsers(); foreach (var receiver in receivers) { - receiver.Value.send_S2C_NTF_BEACON_SHOP_REFRESH(beacon_guid); + receiver.Value.send_S2C_NTF_BEACON_SHOP_REFRESH(beacon_guid, hasBeaconShopItem); } } else if(server_logic.getServerType().toServerType() == ServerType.Indun) diff --git a/GameServer/Room/InstanceRoom.cs b/GameServer/Room/InstanceRoom.cs index 81fd8e3..6fd72ab 100644 --- a/GameServer/Room/InstanceRoom.cs +++ b/GameServer/Room/InstanceRoom.cs @@ -199,13 +199,13 @@ public partial class InstanceRoom } //GameMode - (var gamemode_init_result, var gamemode_init_handler) = GameModeHelper.getGameModeInitHandler(this, _placeType); + (var gamemode_init_result, var gamemode_init_handler) = GameModeHelper.getGameModeInitHandler(this, 1, _roomId); if (gamemode_init_result.isSuccess()) { var gamemode_validation_result = gamemode_init_handler.gamedModeInstanceInitValidate(); if (gamemode_validation_result.isFail()) return false; - var init_result = gamemode_init_handler.gamedModeInstanceInit(); + var init_result = await gamemode_init_handler.gamedModeInstanceInit(); if (init_result.isFail()) { Log.getLogger().error($"battleInstanceInit error roomId : {_roomId}"); @@ -266,12 +266,12 @@ public partial class InstanceRoom //GameMode - (var get_mode_result, var gamemode_join_handler) = GameModeHelper.getGameModeJoinHandler(this, _placeType); + (var get_mode_result, var gamemode_join_handler) = GameModeHelper.getGameModeJoinHandler(this, 1, _roomId); if (get_mode_result.isFail()) return true; //fail 이면 gamemode 인스턴스가 아니므로 그냥 정상 리턴 처리 if (get_mode_result.isSuccess()) { - get_mode_result = gamemode_join_handler.gamedModeInstanceJoinValidate(_placeType); + get_mode_result = gamemode_join_handler.gamedModeInstanceJoinValidate(); if (get_mode_result.isSuccess()) { //successs 면 gamemod join 설정 @@ -412,11 +412,9 @@ public partial class InstanceRoom //GameMode - (var handler_result, var gamemode_join_success_handler) = GameModeHelper.getGameModeJoinSuccessHandler(player, this, _placeType); + (var handler_result, var gamemode_join_success_handler) = GameModeHelper.getGameModeJoinSuccessHandler(player, this, 1, _roomId); if (handler_result.isFail() || gamemode_join_success_handler == null) return; await gamemode_join_success_handler.joinSuccess(); - - } async Task SendConcertStartPacket() diff --git a/GameServer/Ticker/BuildingUpdateTicker.cs b/GameServer/Ticker/BuildingUpdateTicker.cs index 429eda8..1207a17 100644 --- a/GameServer/Ticker/BuildingUpdateTicker.cs +++ b/GameServer/Ticker/BuildingUpdateTicker.cs @@ -50,6 +50,13 @@ namespace GameServer if (ugc_npc_guids.Count < 1) continue; + //beaconShop Deactive item + foreach(var ugc_npc_guid in ugc_npc_guids) + { + result= await BeaconShopHelper.DeactiveBeaconShopItems(ugc_npc_guid); + if(result.isFail()) continue; + } + var modify_floor_linked_info = MapHelper.makeModifyFloorLinkedInfo(ModifyType.Delete, land_meta_id, building_meta_id, floor, ugc_npc_guids); modify_floor_linked_infos.Add(modify_floor_linked_info); } diff --git a/Protocol/client-proto/.svn/pristine/b3/b319b4e84d37dc17d97d2ff284ad3fcd7b54aa74.svn-base b/Protocol/client-proto/.svn/pristine/b3/b319b4e84d37dc17d97d2ff284ad3fcd7b54aa74.svn-base new file mode 100644 index 0000000..8db7b59 --- /dev/null +++ b/Protocol/client-proto/.svn/pristine/b3/b319b4e84d37dc17d97d2ff284ad3fcd7b54aa74.svn-base @@ -0,0 +1,65 @@ +// See README.txt for information and build instructions. +// +// Note: START and END tags are used in comments to define sections used in +// tutorials. They are not part of the syntax for Protocol Buffers. +// +// To get an in-depth walkthrough of this file and the related examples, see: +// https://developers.google.com/protocol-buffers/docs/tutorials + +// [START declaration] +syntax = "proto3"; +package protocol; + +option csharp_namespace = "Google.Protobuf.CES.Packet"; +//import "google/protobuf/timestamp.proto"; + + enum Protocol{ + + MOVE_NEXT = 0; + MOVE_COMBINE = 1; + VOICE = 30; + VOICE_STATE = 31; + MUSIC = 40; + MUSICBox = 41; + DANCE = 50; + DANCE_ReqRoomTime = 51; + DANCE_ResRoomTime = 52; + DANCE_StateUpdate = 53; + JUMP = 70; + GUIDE = 80; + PRESENTATION_PAGE = 81; + AIM = 100; + PARTY_MOVE_MEMBER = 110; + + BATTLE_MOVE = 120; // 이동,멈춤,점프... + BATTLE_AIM = 121; // 조준. + BATTLE_STATUS = 122; // 현재상태. + BATTLE_MANTLE = 123; // 기어오르기. + BATTLE_SHOOT = 130; // 총알발사. + BATTLE_DAMAGE = 131; // 피격. + BATTLE_RELOAD = 132; // 재장전 + BATTLE_DODGE = 133; // 구르기 + BATTLE_WEAPON_CHANGE = 134; // 무기교환 + BATTLE_WEAPON_ADD = 135; // 무기추가 + BATTLE_RESPAWN = 136; // 사망후 리스폰. + BATTLE_OBJECT_INTERACTION = 137; // 오브젝트 인터렉션 + BATTLE_FINISHED_LODING = 138; // 인게임 로딩 끝 + BATTLE_READY_TO_EXIT = 139; // 인던 나가기 전에 결과창 보는 중 + BATTLE_LAUNCH_CHARACTER = 140; // 범위 타격에 의해서 날아감 + BATTLE_PLAY_ANIMATION = 141; // 특정 상황에서 에니메이션 실행 할 때 + BATTLE_HIT_EFFECT = 142; // 캐릭터나 사물에 이펙트 표시 + + MOB_AI_ATTACK = 200; + MOB_AI_MOVETO = 201; + MOB_AI_FOCUS = 202; + MOB_AI_SYNCVAR = 203; + MOB_AI_SPAWN = 204; + MOB_AI_SHOOT = 205; + MOB_AI_RELOAD = 206; + + RUNNING_TRIGGER = 300; + + }; + + +// [END messages] diff --git a/Protocol/client-proto/.svn/pristine/d5/d58580b99025188018cf545592fb1296325f3377.svn-base b/Protocol/client-proto/.svn/pristine/d5/d58580b99025188018cf545592fb1296325f3377.svn-base new file mode 100644 index 0000000..6416bab --- /dev/null +++ b/Protocol/client-proto/.svn/pristine/d5/d58580b99025188018cf545592fb1296325f3377.svn-base @@ -0,0 +1,459 @@ +// See README.txt for information and build instructions. +// +// Note: START and END tags are used in comments to define sections used in +// tutorials. They are not part of the syntax for Protocol Buffers. +// +// To get an in-depth walkthrough of this file and the related examples, see: +// https://developers.google.com/protocol-buffers/docs/tutorials + +// [START declaration] +syntax = "proto3"; +package Packet; + +//import "google/protobuf/timestamp.proto"; +// [END declaration] + +// [START csharp_declaration] +option csharp_namespace = "Google.Protobuf.CES.Packet"; +// [END csharp_declaration] + +// [START messages] + +message SM_REQ_MOVE_NEXT +{ + optional float px =1; // + optional float py =2; // + optional float pz =3; // + optional float ang =4; // + optional float movevalue =5; // + optional int32 start =6; // ù ̵̸ true ̵θ false +} + +message SM_REQ_MOVE_COMBINE +{ + optional float px =1; // + optional float py =2; // + optional float pz =3; // + optional float lx =4; // + optional float ly =5; // + optional float lz =6; // + optional float ang =7; // + optional int32 move_speed =8; // + optional int32 start =9; // ù ̵̸ true ̵θ false +} + +message SM_REQ_TRACKING_TYPE +{ + optional int32 type =1; +} + +message SM_REQ_VOICE +{ + optional int32 sampleRate = 1; // + optional int32 numchannels = 2; // + optional int32 PCMSize = 3; // + repeated int32 data = 4; + optional int32 dataSize = 5; // +} + +message SM_REQ_MUSICBOX +{ + optional string propguid = 1; + optional int32 sampleRate = 2; // + optional int32 numchannels = 3; // + optional int32 PCMSize = 4; // + repeated int32 data = 5; + optional int32 dataSize = 6; // +} + +message SM_REQ_JUMP +{ + optional float sx =1; // + optional float sy =2; // + optional float sz =3; // + optional float lx =4; // + optional float ly =5; // + optional float lz =6; // + optional float ang =7; // + optional int32 start =8; // ù ̵̸ true ̵θ false +} + +message SM_REQ_GUIDE +{ + optional string guoup =1; // + optional int32 operatorid =2; // + optional int32 guidetype =3; // +} + +message SM_REQ_PRESENTATION_PAGE +{ + string pageurl =1; // + int32 pageid =2; // +} + + +message SM_REQ_AIM +{ + optional float pitch =1; // +} + +message SM_REQ_PARTY_MOVE_MEMBER +{ + optional float px =1; // + optional float py =2; // + optional float pz =3; // +} + +message SM_REQ_VOICE_STATE +{ + optional string nickname =1; // + optional int32 state =2; // +} + +message SM_REQ_DANCE_INFO +{ + optional int32 danceid = 1; // ̵ + optional int32 motionid = 2; // + optional int32 dancetype = 3; // Ÿ޺ + optional int64 timestamp = 4; // ð +} + +message SM_REQ_DANCE_ROOMTIME +{ + int64 sendmytime = 1; +} + +message SM_SEND_DANCE_ROOMTIME +{ + int64 sendroomtime = 1; + string guid = 2; +} + +message SM_SEND_DANCE_STATE +{ + optional int32 state = 1; + optional int64 sendroomtime = 2; + optional int32 state01 = 3; + optional int32 state02 = 4; + optional int32 state03 = 5; + optional string str01 = 6; + optional string str02 = 7; + optional string str03 = 8; +} + + +////////////////////////////////////// + +// Ѿ +message SM_DATA_BATTLE_BULLET +{ + optional float px =1; // + optional float py =2; // + optional float pz =3; // + optional float yaw =4; // + optional float pitch =5; // + optional int32 damage =6; // +} + +message SM_DATA_WEAPON_DATA +{ + int32 weapontype = 1; + int32 currentbullet = 2; // Ѿ. + int32 maxbullet = 3; // źâ ִź +} + +message SM_REQ_BATTLE_MOVE +{ + float px =1; // + float py =2; // + float pz =3; // + float lx =4; // + float ly =5; // + float lz =6; // + float vx =7; // + float vy =8; // + float vz =9; // + float ang =10; // + int32 move_speed =11; // ̵Ÿ + int32 type =12; // ̵ȭŸ + float aim_yaw =13; // + float aim_pitch =14; // + int32 cur_hp=15; // + int32 shoot_type = 16; // ѱ߻ + int32 cur_weapontype=17;// Ȱȭ + int32 server_time=18; // Ŷ ð + repeated SM_DATA_WEAPON_DATA weapontypes=19; //ִ +} + +// ij . +message SM_REQ_BATTLE_STATUS +{ + float px =1; // + float py =2; // + float pz =3; // + float ang =4; // + float aim_yaw =5; // + float aim_pitch =6; // ī޶ + int32 cur_hp=7; // + int32 shoot_type = 8; // ѱ߻ + int32 cur_weapontype=9; //Ȱȭ + repeated SM_DATA_WEAPON_DATA weapontypes=10; //ִ + int32 podcarry = 11; // ִ. + int32 podcount = 12; // ȹ . + int32 killcount = 13; + int32 deathcount = 14; + int32 assistcount = 15; + int32 damagecount = 16; +} + +// /Ǯ +message SM_REQ_BATTLE_AIM +{ + float ang =1; // ij + float aim_yaw =2; // ī޶ + float aim_pitch =3; // ī޶ + int32 aim_type = 4; // Ÿ + int32 move_type =5; // ̵Ÿ -- ߰ +} + +// ߻ +message SM_REQ_BATTLE_SHOOT +{ + int32 weapontype =1; // ߻繫 + int32 remainbullet = 2; // ź. : currentbullet + float aim_yaw =3; // ī޶ + float aim_pitch =4; // ī޶ + int32 aim_type = 5; // Ÿ + int32 server_time=6; // Ŷ ð + repeated SM_DATA_BATTLE_BULLET bullets = 7; // ߻Ѿ. ϼִ. + +} + +message SM_CHARACTER_KEY +{ + int32 type = 1; + string guid = 2; +} + +// ǰ, ڽ hp . -> ȣƮ ¾Ҵٰ . +message SM_REQ_BATTLE_DAMAGE +{ + int32 damage =1; // + int32 cur_hp=2; // . 0̸ . + SM_CHARACTER_KEY attacker=3; // . + SM_CHARACTER_KEY victim=4; // ǰ. + int32 attack_weapon_type = 5; // ݹŸ. +} + +// +message SM_REQ_BATTLE_RELOAD +{ + int32 cur_hp=1; // + int32 cur_weapontype=2; //Ȱȭ + int32 currentbullet = 3; // źâ ź + int32 maxbullet=4; // ִź +} + +// +message SM_REQ_BATTLE_DODGE +{ + float px =1; // + float py =2; // + float pz =3; // + float ang =4; // + int32 dir_id = 5; // Ÿ +} + +// +message SM_REQ_BATTLE_WEAPON_CHANGE +{ + int32 cur_weapontype=1; //Ȱȭ + repeated SM_DATA_WEAPON_DATA weapontypes=2; //ִ +} + +// ߰ +message SM_REQ_BATTLE_WEAPON_ADD +{ + int32 cur_weapontype=1; //Ȱȭ + repeated SM_DATA_WEAPON_DATA weapontypes=2; //ִ +} + +// ij . +message SM_REQ_BATTLE_RESPAWN +{ + float px =1; // + float py =2; // + float pz =3; // + float ang =4; // + float aim_yaw =5; // + float aim_pitch =6; // ī޶ + int32 cur_hp=7; // + int32 cur_weapontype=8; //Ȱȭ + repeated SM_DATA_WEAPON_DATA weapontypes=9; //ִ +} + +// Ʈ ͷ +message SM_REQ_BATTLE_OBJECT_INTERACTION +{ + int32 objecttableid=1; // ͷ Ʋ Ʈ Table ID + string objectguid=2; // ͷ Ʋ Ʈ GUID +} + +// . +message SM_REQ_BATTLE_MANTLE +{ + float px =1; // + float py =2; // + float pz =3; // + float lx =4; // + float ly =5; // + float lz =6; // + float vx =7; // + float vy =8; // + float vz =9; // + float ang =10; // + float tx =11; // + float ty =12; // + float tz =13; // + int32 height = 14;// +} + +// ΰ ε +message SM_REQ_BATTLE_FINISHED_LODING +{ + float px =1; // + float py =2; // + float pz =3; // + float ang =4; // +} + +// غ : δ â +message SM_REQ_BATTLE_READY_TO_EXIT +{ +} + +// Ÿݿ ؼ ư +message SM_REQ_BATTLE_LAUNCH_CHARACTER +{ + SM_CHARACTER_KEY target=1; // ư + float vx =2; // LaunchVelocity + float vy =3; // + float vz =4; // + int32 xyoverride = 5;//bXYOverride + int32 zoverride = 6;//bZOverride +} + +// Ư Ȳ ϸ̼ +message SM_REQ_BATTLE_PLAY_ANIMATION +{ + SM_CHARACTER_KEY target =1; // + int32 type = 2; // + int32 value = 3; // +} + +// Ʈ +message SM_REQ_BATTLE_HIT_EFFECT +{ + SM_CHARACTER_KEY target =1; // + int32 weapontype = 2; // + int32 hiteffecttype = 3; // + float nx =4; // ImpactNormal + float ny =5; // + float nz =6; // + float px =7; // ImpactPoint + float py =8; // + float pz =9; // +} + +message SM_MOB_AI_VECTOR +{ + float px =1; // ImpactPoint + float py =2; // + float pz =3; // +} + +message SM_MOB_AI_AGGRO +{ + SM_CHARACTER_KEY target = 1; + int32 aggropoint = 2; +} + +message SM_MOB_AI_SYNCDATA +{ + string mobguid = 1; + int32 currentAiBehavior = 2; + + int32 taskflags = 3; + + SM_MOB_AI_VECTOR startLocation = 4; + SM_MOB_AI_VECTOR lastKnownLocation = 5; + SM_MOB_AI_VECTOR lastHearingLocation = 6; + + SM_CHARACTER_KEY targetCharacter = 7; + SM_CHARACTER_KEY lastHearingCharacter = 8; + + repeated SM_MOB_AI_AGGRO targetCharacterList = 9; // +} + +message SM_MOB_AI_ATTACK +{ + string mobguid = 1; + float attack_time = 2; + SM_CHARACTER_KEY targetCharacter = 3; + int32 attack_type = 4; + SM_MOB_AI_VECTOR location = 5; +} + +// Ѿ ߻. +message SM_MOB_AI_SHOOT +{ + string mobguid = 1; + float aim_yaw =2; // ī޶ + float aim_pitch =3; // ī޶ + int32 server_time=4; // Ŷ ð + repeated SM_DATA_BATTLE_BULLET bullets = 5; // ߻Ѿ. ϼִ. +} + +// . +message SM_MOB_AI_RELOAD +{ + string mobguid = 1; +} + +message SM_MOB_AI_FOCUS +{ + string mobguid = 1; + int32 focus = 2; + SM_CHARACTER_KEY targetCharacter = 3; +} + +message SM_MOB_MOVETO +{ + string mobguid = 1; + int32 targetType = 2; + SM_MOB_AI_VECTOR tagetLocation = 3; + float radius = 4; + int32 stop = 5; + float moveSpeed = 6; +} + +message SM_MOB_SPAWN +{ + string mobguid = 1; + int32 mob_type = 2; + SM_MOB_AI_VECTOR location = 3; + float angle = 4; + string anchorguid = 5; +} + +message SM_RUNNING_TRIGGER +{ + string Anchor_GUID = 1; + string User_GUID = 2; + int32 Event_Time = 3; + float force_x = 4; + float force_y = 5; + float force_z = 6; + int32 Event_type = 7; + BoolType Event_active = 8; +} \ No newline at end of file diff --git a/Protocol/client-proto/.svn/wc.db b/Protocol/client-proto/.svn/wc.db index 830b49031866f3832a26988b65921f685c07e637..0889264e35f18e19f6862c686258bdd5a74f5591 100644 GIT binary patch delta 1005 zcmb`E&1(}u7{+H3ySu5*Ow{&J6=@-oq(a!8*>QI8(1UsrqwPVk5U~46m!?TbQ>48# zIS3w=9D-j3Jp_tSDgnKf{sCeR>eXWpf~Yrdb!$)y4H&`0F!1os^FF_4>N{$EN4LcKRsaaBAq(cA3c? z*P>Q5D!Fe+U)KxDzP&cvdX$H`W^6qd@fz#z;E0ApK;DwaxJzP$;}Aa~^AYb1Zgw|^ z3xiT>G#dZvgzB)X7cq0&jHiRtq=xwui6%tuJjdJ_`q9S37&# zu?9k)K^zHy1a6XiggAkY!b&2mp~RgAL#0hq3qYh|}w%(Z6n@Z!~e zAqM@310fm$xAZ(L-2P8~f1uRW9@NUyhEB#>&#uF%@n1{4u$sw+r64SYwUq;DUT@ui z>139S3`Hft-^7)DbbMkcaV`>VcfqgaeoE-o9Q;7elTjss4$q&A)I$#{@EajS8A<>R L;@*YYbvX9}`Jfs- delta 474 zcmZoTz}|3xeS$Qj#zYxsMvaXLt@ey;o1fXs1qiV5o?+l$#P7oQjIV=Fi}%cCL4h5- z>@jR?nG8&vlP}MWW#rs!IPWr}02|+V2L5yWv-!^RGx3}9X8;xM=G%OJoheA_KLdXQ ze<=TI{%d^y`L%#julY9r-^bL*%Qu&SnOB#A_c^aFzb{Z+o|n1NoNM|tKgJlox2N** zi*gfl(lT>WH8dw*nX9M7_$H5m%{X`22B%*oiK)elIw-(gic8COpcZujO&$?ePE8KRfTH}8{N(%`y#f$}ONf $"owner is null !!!") + ArgumentNullReferenceCheckHelper.throwIfNull(input, () => $"input is null !!! - {owner.toBasicString()}") + + var result = new Result(); + + try + { + // 내부 로직 수행 + if (input.isNullOrWhiteSpace()) + { + result.setFail(ServerErrorCode.InvalidArgument, "Input is empty."); + return result; + } + + // 비즈니스 로직 처리 성공 + result.setSuccess("Operation completed."); + return result; + } + catch (Exception e) + { + // 예상치 못한 예외 발생시 실패 처리 + err_msg = $"Exception !!!, Failed to perform, in xxx() !!! : exception:{e} - {owner.toBasicString()}"; + result.setFail(ServerErrorCode.InternalError, err_msg); + return result; + } + } + + 2. Result 값에 따른 예외 처리 + + var result = server_logic.doFunction(); + + // 실패시, 예외가 발생 한다 !!!, (발생되기 원하는 예외타입을 작성) + result.throwIfFail( + () => $"Failed to doFunction() !!!, Details: {result.toBasicString()}", + msg => new DesiredException(msg) + ); + + author : kangms + +=============================================================================================*/ public static class ResultHelper { public static bool isSuccess(this Result result) { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); - if (true == result.ErrorCode.isSuccess()) - { - return true; - } - - return false; + return result.ErrorCode.isSuccess(); } public static bool isFail(this Result result) { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); - if (true == result.ErrorCode.isFail()) - { - return true; - } - - return false; + return result.ErrorCode.isFail(); } public static void setSuccess(this Result result, string resultString = "") - { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); result.set(ServerErrorCode.Success, resultString); } - public static void setFail(this Result result, ServerErrorCode errorCode, string resultString = "") - { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); + public static void setFail(this Result result, ServerErrorCode errorCode, string resultString = "") + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); result.set(errorCode, resultString); } - public static string getResultString(this Result result) - { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); + public static string getResultString(this Result result) + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); return result.ResultString; - } - - public static ServerErrorCode getErrorCode(this Result result) - { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); - - return result.ErrorCode; - } - - public static void set(this Result result, ServerErrorCode errorCode, string resultString) - { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); - - result.ErrorCode = errorCode; - result.ResultString = resultString; } - public static string toBasicString(this Result result) - { - ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!!"); + public static ServerErrorCode getErrorCode(this Result result) + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); + + return result.ErrorCode; + } + + public static void set(this Result result, ServerErrorCode errorCode, string resultString) + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); + + result.ErrorCode = errorCode; + result.ResultString = resultString; + } + + public static void throwIfFail( this Result result + , Func? fnLog = null + , Func? overrideException = null ) + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); + + if (result.ErrorCode.isSuccess()) + return; + + string message = fnLog?.Invoke() ?? $"Operation failed. ErrorCode: {result.ErrorCode}, ResultString: {result.ResultString}"; + + if (null != overrideException) + { + throw overrideException(message); + } + + throw new InvalidOperationException(message); + } + + public static string toBasicString(this Result result) + { + ArgumentNullReferenceCheckHelper.throwIfNull(result, () => "Result is null !!!"); return $"ErrorInfo: errCode:{result.getErrorCode()}, errDesc:{result.getResultString()}"; - } + } } \ No newline at end of file diff --git a/ServerBase/MessageQueue/RabbitMqConnector.cs b/ServerBase/MessageQueue/RabbitMqConnector.cs index dc908ef..8b18e28 100644 --- a/ServerBase/MessageQueue/RabbitMqConnector.cs +++ b/ServerBase/MessageQueue/RabbitMqConnector.cs @@ -28,7 +28,7 @@ namespace ServerBase; public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbitMqSession, IModule, IWithPacketNamespaceVerifier { public delegate Task FnServerMessageRecvFromConsumer(BasicDeliverEventArgs ea, IMessage message); - public FnServerMessageRecvFromConsumer? _fnServerMessageRecvFromConsumer; + public FnServerMessageRecvFromConsumer? m_fn_server_message_recv_from_consumer; private readonly PacketReceiver m_packet_receiver; @@ -66,7 +66,7 @@ public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbit { var packet_namespace = ".PacketHandler"; - if (null != toCheckNamespace + if ( null != toCheckNamespace && true == toCheckNamespace.Contains(packet_namespace)) { return true; @@ -132,14 +132,14 @@ public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbit Log.getLogger().error("rabbitMq registerRecvHandler error"); return result; } - - _fnServerMessageRecvFromConsumer = fnFromConsumer; + + m_fn_server_message_recv_from_consumer = fnFromConsumer; return base.startConsumer(); } public async Task onRecvProtocol(BasicDeliverEventArgs ea, T recvProtocol) - where T : Google.Protobuf.IMessage + where T : Google.Protobuf.IMessage { Log.getLogger().info($"receive:{recvProtocol.ToString()} - {toBasicString()}"); @@ -227,13 +227,13 @@ public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbit return; } - if(_fnServerMessageRecvFromConsumer == null) + if(m_fn_server_message_recv_from_consumer == null) { Log.getLogger().error("_fnServerMessageRecvFromConsumer is null"); return; } - await _fnServerMessageRecvFromConsumer.Invoke(ea, message); + await m_fn_server_message_recv_from_consumer.Invoke(ea, message); } protected override void onRecvProtoMessageFromConsumer(object? sender, BasicDeliverEventArgs ea) @@ -241,19 +241,19 @@ public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbit } protected virtual bool onCheckByExchangeType(BasicDeliverEventArgs ea, T recvProtocol) - where T : Google.Protobuf.IMessage + where T : Google.Protobuf.IMessage { return true; } public Task? SendKick( string destServer, string name, Int32 delayMS , Action>? callback ) - { - int reqId = nextReqId(); + { + int reqId = nextReqId(); Task? waitTask = null; if (callback != null) - { + { CancellationTokenSource cancelTokenSrc = new CancellationTokenSource(delayMS); waitTask = registerCompletionSource(reqId, cancelTokenSrc.Token, callback); @@ -271,18 +271,19 @@ public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbit SendMessage(destServer, message); return waitTask; - } + } - public void SendMessage(string to, ServerMessage message) + public void SendMessage(string to, ServerMessage message) + { + var con = getConnection(); + if(null == con) { - IConnection? con = getConnection(); - if(con == null) - { Log.getLogger().error("GetConnection return null"); - return; - } - using (var channel = con.CreateModel()) - { + return; + } + + using (var channel = con.CreateModel()) + { Stopwatch? stopwatch = null; var event_tid = string.Empty; @@ -301,16 +302,16 @@ public abstract partial class RabbitMqConnector : RabbitMQConnectorBase, IRabbit autoDelete: true, arguments: null ); - message.MessageTime = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow); - message.MessageSender = getServiceName(); + message.MessageTime = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow); + message.MessageSender = getServiceName(); - string messageJson = JsonFormatter.Default.Format(message); - var body = Encoding.UTF8.GetBytes(messageJson); + string messageJson = JsonFormatter.Default.Format(message); + var body = Encoding.UTF8.GetBytes(messageJson); - channel.BasicPublish( exchange: "", - routingKey: to, - basicProperties: null, - body: body ); + channel.BasicPublish( exchange: "", + routingKey: to, + basicProperties: null, + body: body ); Log.getLogger().info($"send to MQS !!!, msg:{messageJson} - receiver:{to}"); diff --git a/ServerCommon/1. Define/BusinessLog/Battle/BattleInstancesObjects.cs b/ServerCommon/1. Define/BusinessLog/Battle/BattleInstancesObjects.cs index 625eefe..5ecf4bc 100644 --- a/ServerCommon/1. Define/BusinessLog/Battle/BattleInstancesObjects.cs +++ b/ServerCommon/1. Define/BusinessLog/Battle/BattleInstancesObjects.cs @@ -31,7 +31,6 @@ public class BattleInstancesObject public class BattleObjectPodStorage : BattleInstancesObject { - //private ECombatPodType m_combat_pod_type { get; } = ECombatPodType.Storage; public Int32 m_reward_cnt { get; set; } = 0; public BattleObjectPodStorage(string anchorGuid) : base(EBattleObjectType.Pod_Combat, anchorGuid) diff --git a/ServerCommon/1. Define/BusinessLog/Domain/BeaconShopData.cs b/ServerCommon/1. Define/BusinessLog/Domain/BeaconShopData.cs index ab5968f..d20d3f5 100644 --- a/ServerCommon/1. Define/BusinessLog/Domain/BeaconShopData.cs +++ b/ServerCommon/1. Define/BusinessLog/Domain/BeaconShopData.cs @@ -45,6 +45,8 @@ public class BeaconShopLogData : ILogInvoker.IInfo public DateTime SellingFinishTime { get; set; } = new(); [JsonProperty] public string BuyerGuid { get; set; } = string.Empty; + [JsonProperty] + public bool IsActiveSelling { get; set; } = false; //===================================================================================== // 로그 생성용 객체 정의 @@ -64,6 +66,7 @@ public class BeaconShopLogData : ILogInvoker.IInfo BeaconMyHomeGuid = logData.BeaconMyHomeGuid; SellingFinishTime = logData.SellingFinishTime; BuyerGuid = logData.BuyerGuid; + IsActiveSelling = logData.IsActiveSelling; } //===================================================================================== diff --git a/ServerCommon/1. Define/BusinessLog/Domain/PlanetItemExchangeLogData.cs b/ServerCommon/1. Define/BusinessLog/Domain/PlanetItemExchangeLogData.cs index c62dc85..db7e5ba 100644 --- a/ServerCommon/1. Define/BusinessLog/Domain/PlanetItemExchangeLogData.cs +++ b/ServerCommon/1. Define/BusinessLog/Domain/PlanetItemExchangeLogData.cs @@ -5,7 +5,7 @@ using ServerBase; using ServerCommon; -namespace BrokerCore.BrokerBusinessLog; +namespace ServerCommon.BusinessLogDomain; public class PlanetItemExchangeLogData : ILogInvoker.IInfo diff --git a/ServerCommon/1. Define/BusinessLog/Domain/PlanetProviderAuthLogData.cs b/ServerCommon/1. Define/BusinessLog/Domain/PlanetProviderAuthLogData.cs index 8e58b5f..8f3baff 100644 --- a/ServerCommon/1. Define/BusinessLog/Domain/PlanetProviderAuthLogData.cs +++ b/ServerCommon/1. Define/BusinessLog/Domain/PlanetProviderAuthLogData.cs @@ -5,7 +5,7 @@ using ServerBase; using ServerCommon; -namespace BrokerCore.BrokerBusinessLog; +namespace ServerCommon.BusinessLogDomain; //========================================================================================= // Planet 컨텐츠 제공 업체 인증 로그 diff --git a/ServerCommon/1. Define/BusinessLog/Domain/PlanetUserAuthLogData.cs b/ServerCommon/1. Define/BusinessLog/Domain/PlanetUserAuthLogData.cs index a16e61d..5fa6b63 100644 --- a/ServerCommon/1. Define/BusinessLog/Domain/PlanetUserAuthLogData.cs +++ b/ServerCommon/1. Define/BusinessLog/Domain/PlanetUserAuthLogData.cs @@ -6,7 +6,7 @@ using ServerCommon; -namespace BrokerCore.BrokerBusinessLog; +namespace ServerCommon.BusinessLogDomain; //===================================================================================== // 플래닛 유저 인증 비즈니스 로그 diff --git a/ServerCommon/1. Define/BusinessLog/Enum/LogEnum.cs b/ServerCommon/1. Define/BusinessLog/Enum/LogEnum.cs index b25ccaf..f9da61e 100644 --- a/ServerCommon/1. Define/BusinessLog/Enum/LogEnum.cs +++ b/ServerCommon/1. Define/BusinessLog/Enum/LogEnum.cs @@ -933,6 +933,8 @@ namespace ServerCommon BeaconShopUpdateDailyCount, [BusinessLogEnum("비컨 상점 기록 영수증 제거", LogCategoryType.BeaconShop, LogSubCategoryType.None, "Game")] BeaconShopDeleteRecord, + [BusinessLogEnum("비컨 상점 아이템 비활성화", LogCategoryType.BeaconShop, LogSubCategoryType.None, "Game")] + BeaconShopDeactiveItems, BeaconShopEnd, #endregion diff --git a/ServerCommon/1. Define/TypeDefine.cs b/ServerCommon/1. Define/TypeDefine.cs index bc25deb..39894c8 100644 --- a/ServerCommon/1. Define/TypeDefine.cs +++ b/ServerCommon/1. Define/TypeDefine.cs @@ -421,6 +421,26 @@ public enum StageMoveType Leave = 2, } + +public enum GameGenreType +{ + None = 0, + + TPS = 1, + Running = 2, + //Dance = 3, +} +public enum GameModeType +{ + None = 0, + + TPS_FFA = 1, + TPS_TDM = 2, + RUN_ADV = 3, + RUN_RACE = 4, + //DANCE_ = 5, +} + //============================================================================================= // Broker Api 에서 사용하는 아이템 교환 Type //============================================================================================= diff --git a/ServerCommon/Doc/OwnerContents/BeaconShopItemDoc.cs b/ServerCommon/Doc/OwnerContents/BeaconShopItemDoc.cs index 8b06097..891320e 100644 --- a/ServerCommon/Doc/OwnerContents/BeaconShopItemDoc.cs +++ b/ServerCommon/Doc/OwnerContents/BeaconShopItemDoc.cs @@ -23,6 +23,9 @@ namespace ServerCommon [JsonProperty("price_for_unit")] public double PriceForUnit { get; set; } = 0; + [JsonProperty("is_active_selling")] + public bool IsActiveSelling { get; set; } = false; + public BeaconShopItemAttrib() : base(typeof(BeaconShopItemAttrib).Name, false) { } diff --git a/ServerCommon/Doc/OwnerContents/ItemDoc.cs b/ServerCommon/Doc/OwnerContents/ItemDoc.cs index a6e1dfd..4a0ab49 100644 --- a/ServerCommon/Doc/OwnerContents/ItemDoc.cs +++ b/ServerCommon/Doc/OwnerContents/ItemDoc.cs @@ -52,7 +52,7 @@ public class ItemAttrib : AttribBase public List Attributes { get; set; } = new(); [JsonProperty("equiped_inven_type")] - public InvenEquipType EquipedIvenType { get; set; } = InvenEquipType.None; + public InvenEquipType EquipedInvenType { get; set; } = InvenEquipType.None; [JsonProperty("equiped_pos")] public UInt16 EquipedPos { get; set; } = 0; @@ -150,10 +150,9 @@ public class ItemDoc : DynamoDbDocBase, ICopyDocFromEntityAttribute to_copy_doc_item_attrib.ItemStackCount = item_attribute.ItemStackCount; to_copy_doc_item_attrib.Level = item_attribute.Level; to_copy_doc_item_attrib.Attributes = item_attribute.Attributes.Select(x => x).ToList(); - to_copy_doc_item_attrib.EquipedIvenType = item_attribute.EquipedIvenType; + to_copy_doc_item_attrib.EquipedInvenType = item_attribute.EquipedInvenType; to_copy_doc_item_attrib.EquipedPos = item_attribute.EquipedPos; - return true; } } diff --git a/ServerCommon/Entity/Attribute/BeaconShopItemAttribute.cs b/ServerCommon/Entity/Attribute/BeaconShopItemAttribute.cs index 8f5d8a7..9305bf0 100644 --- a/ServerCommon/Entity/Attribute/BeaconShopItemAttribute.cs +++ b/ServerCommon/Entity/Attribute/BeaconShopItemAttribute.cs @@ -12,7 +12,7 @@ using Amazon.S3.Model; namespace ServerCommon { - public class BeaconShopItemAttribute : ItemAttributeBase + public class BeaconShopItemAttribute : ItemAttributeBase, IWithCommonResultFiller { [JsonProperty] public USER_GUID UserGuid { get; set; } = string.Empty; @@ -26,6 +26,8 @@ namespace ServerCommon [JsonProperty] public double PriceForUnit { get; set; } = 0.0; + [JsonProperty] + public bool IsActiveSelling { get; set; } = false; public BeaconShopItemAttribute(ItemBase owner, EntityBase entityOfOwnerEntityType) : base(owner, entityOfOwnerEntityType) @@ -41,6 +43,7 @@ namespace ServerCommon ItemGuid = string.Empty; SellingFinishTime = new(); PriceForUnit = 0; + IsActiveSelling = false; } public override EntityAttributeBase onCloned() @@ -59,13 +62,14 @@ namespace ServerCommon cloned.BeaconGuid = BeaconGuid; cloned.SellingFinishTime = SellingFinishTime; cloned.PriceForUnit = PriceForUnit; + cloned.IsActiveSelling = IsActiveSelling; cloned.ItemGuid = ItemGuid; cloned.ItemMetaId = ItemMetaId; cloned.ItemStackCount = ItemStackCount; cloned.Level = Level; cloned.Attributes = Attributes.Select(x => x).ToList(); - cloned.EquipedIvenType = EquipedIvenType; + cloned.EquipedInvenType = EquipedInvenType; cloned.EquipedPos = EquipedPos; return cloned; @@ -109,13 +113,14 @@ namespace ServerCommon to_copy_doc_attrib.BeaconGuid = BeaconGuid; to_copy_doc_attrib.SellingFinishTime = SellingFinishTime; to_copy_doc_attrib.PriceForUnit = PriceForUnit; + to_copy_doc_attrib.IsActiveSelling = IsActiveSelling; to_copy_doc_attrib.ItemGuid = ItemGuid; to_copy_doc_attrib.ItemMetaId = ItemMetaId; to_copy_doc_attrib.ItemStackCount = ItemStackCount; to_copy_doc_attrib.Level = Level; to_copy_doc_attrib.Attributes = Attributes.Select(x => x).ToList(); - to_copy_doc_attrib.EquipedIvenType = EquipedIvenType; + to_copy_doc_attrib.EquipedInvenType = EquipedInvenType; to_copy_doc_attrib.EquipedPos = EquipedPos; if (false == isForQuery) @@ -171,18 +176,26 @@ namespace ServerCommon BeaconGuid = doc_attrib.BeaconGuid; SellingFinishTime = doc_attrib.SellingFinishTime; PriceForUnit = doc_attrib.PriceForUnit; + IsActiveSelling = doc_attrib.IsActiveSelling; ItemGuid = doc_attrib.ItemGuid; ItemMetaId = doc_attrib.ItemMetaId; ItemStackCount = doc_attrib.ItemStackCount; Level = doc_attrib.Level; Attributes = doc_attrib.Attributes.Select(x => x).ToList(); - EquipedIvenType = doc_attrib.EquipedIvenType; + EquipedInvenType = doc_attrib.EquipedInvenType; EquipedPos = doc_attrib.EquipedPos; return true; } + public new void onFillCommonResult( EntityCommonResult commonResult + , EntityAttributeBase origin, QueryBatchBase? queryBatch = null ) + { + // commonResult 정보를 채우지 못하게 재정의 하여 그냥 반환 한다. + return; + } + public override Result onMerge(EntityAttributeBase otherEntityAttribute) { var owner = getOwner(); @@ -217,13 +230,14 @@ namespace ServerCommon BeaconGuid = beacon_shop_attribute.BeaconGuid; SellingFinishTime = beacon_shop_attribute.SellingFinishTime; PriceForUnit = beacon_shop_attribute.PriceForUnit; + IsActiveSelling = beacon_shop_attribute.IsActiveSelling; ItemGuid = beacon_shop_attribute.ItemGuid; ItemMetaId = beacon_shop_attribute.ItemMetaId; ItemStackCount = beacon_shop_attribute.ItemStackCount; Level = beacon_shop_attribute.Level; Attributes = beacon_shop_attribute.Attributes.Select(x => x).ToList(); - EquipedIvenType = beacon_shop_attribute.EquipedIvenType; + EquipedInvenType = beacon_shop_attribute.EquipedInvenType; EquipedPos = beacon_shop_attribute.EquipedPos; //===================================================================================== @@ -251,13 +265,14 @@ namespace ServerCommon beacon_shop_attrib.BeaconGuid = BeaconGuid; beacon_shop_attrib.SellingFinishTime = SellingFinishTime; beacon_shop_attrib.PriceForUnit = PriceForUnit; + beacon_shop_attrib.IsActiveSelling = IsActiveSelling; beacon_shop_attrib.ItemGuid = ItemGuid; beacon_shop_attrib.ItemMetaId = ItemMetaId; beacon_shop_attrib.ItemStackCount = ItemStackCount; beacon_shop_attrib.Level = Level; beacon_shop_attrib.Attributes = Attributes.Select(x => x).ToList(); ; - beacon_shop_attrib.EquipedIvenType = EquipedIvenType; + beacon_shop_attrib.EquipedInvenType = EquipedInvenType; beacon_shop_attrib.EquipedPos = EquipedPos; return result; diff --git a/ServerCommon/Entity/Attribute/ItemAttributeBase.cs b/ServerCommon/Entity/Attribute/ItemAttributeBase.cs index 2a6b251..1e7f2f0 100644 --- a/ServerCommon/Entity/Attribute/ItemAttributeBase.cs +++ b/ServerCommon/Entity/Attribute/ItemAttributeBase.cs @@ -71,9 +71,9 @@ public abstract class ItemAttributeBase : EntityAttributeBase, ICopyEntityAttrib public List Attributes { get; set; } = new(); - // EquipedIvenType.None 일경우 EquipedPos = 0 이다 !!! - kangms + // EquipedInvenType.None 일경우 EquipedPos = 0 이다 !!! - kangms [JsonProperty] - public InvenEquipType EquipedIvenType { get; set; } = InvenEquipType.None; + public InvenEquipType EquipedInvenType { get; set; } = InvenEquipType.None; [JsonProperty] public UInt16 EquipedPos { get; set; } = 0; @@ -106,7 +106,7 @@ public abstract class ItemAttributeBase : EntityAttributeBase, ICopyEntityAttrib ItemStackCount = 0; Level = 0; Attributes.Clear(); - EquipedIvenType = InvenEquipType.None; + EquipedInvenType = InvenEquipType.None; EquipedPos = 0; getAttributeState().reset(); @@ -151,7 +151,7 @@ public abstract class ItemAttributeBase : EntityAttributeBase, ICopyEntityAttrib to_copy_doc_item_attrib.ItemStackCount = ItemStackCount; to_copy_doc_item_attrib.Level = Level; to_copy_doc_item_attrib.Attributes = Attributes.Select(x => x).ToList(); - to_copy_doc_item_attrib.EquipedIvenType = EquipedIvenType; + to_copy_doc_item_attrib.EquipedInvenType = EquipedInvenType; to_copy_doc_item_attrib.EquipedPos = EquipedPos; if (false == isForQuery) @@ -398,7 +398,7 @@ public abstract class ItemAttributeBase : EntityAttributeBase, ICopyEntityAttrib ItemStackCount = other_item_attribute.ItemStackCount; Level = other_item_attribute.Level; Attributes = other_item_attribute.Attributes.Select(x => x).ToList(); - EquipedIvenType = other_item_attribute.EquipedIvenType; + EquipedInvenType = other_item_attribute.EquipedInvenType; EquipedPos = other_item_attribute.EquipedPos; //===================================================================================== @@ -428,7 +428,7 @@ public abstract class ItemAttributeBase : EntityAttributeBase, ICopyEntityAttrib item_attrib.ItemStackCount = ItemStackCount; item_attrib.Level = Level; item_attrib.Attributes = Attributes.Select(x => x).ToList(); ; - item_attrib.EquipedIvenType = EquipedIvenType; + item_attrib.EquipedInvenType = EquipedInvenType; item_attrib.EquipedPos = EquipedPos; return result; @@ -469,7 +469,7 @@ public abstract class ItemAttributeBase : EntityAttributeBase, ICopyEntityAttrib ItemStackCount = item_attrib.ItemStackCount; Level = item_attrib.Level; Attributes = item_attrib.Attributes.Select(x => x).ToList(); - EquipedIvenType = item_attrib.EquipedIvenType; + EquipedInvenType = item_attrib.EquipedInvenType; EquipedPos = item_attrib.EquipedPos; return true; diff --git a/ServerCommon/Entity/Attribute/MyhomeItemAttribute.cs b/ServerCommon/Entity/Attribute/MyhomeItemAttribute.cs index 29d275d..c31ed50 100644 --- a/ServerCommon/Entity/Attribute/MyhomeItemAttribute.cs +++ b/ServerCommon/Entity/Attribute/MyhomeItemAttribute.cs @@ -61,7 +61,7 @@ namespace ServerCommon cloned.ItemStackCount = ItemStackCount; cloned.Level = Level; cloned.Attributes = Attributes.Select(x => x).ToList(); - cloned.EquipedIvenType = EquipedIvenType; + cloned.EquipedInvenType = EquipedInvenType; cloned.EquipedPos = EquipedPos; return cloned; diff --git a/ServerCommon/Entity/Attribute/UgcNpcItemAttribute.cs b/ServerCommon/Entity/Attribute/UgcNpcItemAttribute.cs index afa1d21..4184abe 100644 --- a/ServerCommon/Entity/Attribute/UgcNpcItemAttribute.cs +++ b/ServerCommon/Entity/Attribute/UgcNpcItemAttribute.cs @@ -72,7 +72,7 @@ namespace ServerCommon cloned.ItemStackCount = ItemStackCount; cloned.Level = Level; cloned.Attributes = Attributes.Select(x => x).ToList(); - cloned.EquipedIvenType = EquipedIvenType; + cloned.EquipedInvenType = EquipedInvenType; cloned.EquipedPos = EquipedPos; return cloned; diff --git a/ServerCommon/Entity/Attribute/UserItemAttribute.cs b/ServerCommon/Entity/Attribute/UserItemAttribute.cs index 2dbfcf2..0baae62 100644 --- a/ServerCommon/Entity/Attribute/UserItemAttribute.cs +++ b/ServerCommon/Entity/Attribute/UserItemAttribute.cs @@ -79,7 +79,7 @@ namespace ServerCommon cloned.ItemStackCount = ItemStackCount; cloned.Level = Level; cloned.Attributes = Attributes.Select(x => x).ToList(); - cloned.EquipedIvenType = EquipedIvenType; + cloned.EquipedInvenType = EquipedInvenType; cloned.EquipedPos = EquipedPos; return cloned; @@ -105,7 +105,7 @@ namespace ServerCommon to_copy_doc_item_attrib.ItemStackCount = ItemStackCount; to_copy_doc_item_attrib.Level = Level; to_copy_doc_item_attrib.Attributes = Attributes.Select(x => x).ToList(); - to_copy_doc_item_attrib.EquipedIvenType = EquipedIvenType; + to_copy_doc_item_attrib.EquipedInvenType = EquipedInvenType; to_copy_doc_item_attrib.EquipedPos = EquipedPos; return to_copy_doc; diff --git a/ServerCommon/MetaData/MetaEnums.cs b/ServerCommon/MetaData/MetaEnums.cs index 7baed88..cc788b2 100644 --- a/ServerCommon/MetaData/MetaEnums.cs +++ b/ServerCommon/MetaData/MetaEnums.cs @@ -577,4 +577,17 @@ public enum EPropSmallType EXIT = 5, SHORTCUT = 6, PLAY = 7, +} + + +[JsonConverter(typeof(StringEnumConverter))] +public enum EGameObjectType +{ + None = 0, + Weapon = 1, + Pod_Combat = 2, + Pod_Box = 3, + Buff = 4, + + Save_Point = 5, } \ No newline at end of file diff --git a/ServerCommon/ProudNet/ProudNetListener.cs b/ServerCommon/ProudNet/ProudNetListener.cs index c70bdc6..24fd11b 100644 --- a/ServerCommon/ProudNet/ProudNetListener.cs +++ b/ServerCommon/ProudNet/ProudNetListener.cs @@ -1,4 +1,6 @@ - +using System.Diagnostics; + + using Nettention.Proud; @@ -7,9 +9,6 @@ using ServerBase; using MODULE_ID = System.UInt32; -using ServerControlCenter; -using System.Diagnostics; -using System.Collections.Concurrent; namespace ServerCommon; diff --git a/ServerCore/Config/ConfigManager.cs b/ServerCore/Config/ConfigManager.cs index f6abe04..497d00d 100644 --- a/ServerCore/Config/ConfigManager.cs +++ b/ServerCore/Config/ConfigManager.cs @@ -2,25 +2,22 @@ using System.Collections.Generic; using System.IO; - using Newtonsoft.Json; using Newtonsoft.Json.Linq; - using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; - namespace ServerCore; -public sealed class ConfigManager : Singleton +public sealed class ConfigManager { - private readonly List<(string path, string type)> m_file_sources = new(); - private readonly List m_jobject_sources = new(); - + private readonly Dictionary m_key_to_source = new(); + private readonly Dictionary m_path_to_jobject = new(); private readonly Dictionary m_watchers = new(); + private bool m_is_detect_duplicates = true; public ConfigManager() { } @@ -30,39 +27,38 @@ public sealed class ConfigManager : Singleton m_is_detect_duplicates = enable; } - public ConfigManager addJson(string path) + public ConfigManager addJson(uint key, string path) { loadJson(path); watchFile(path, "json"); + + m_key_to_source[key] = (path, "json"); return this; } - public ConfigManager addYaml(string path) + public ConfigManager addYaml(uint key, string path) { loadYaml(path); watchFile(path, "yaml"); + + m_key_to_source[key] = (path, "yaml"); return this; } private void loadJson(string path) { - if (false == File.Exists(path)) - { + if (!File.Exists(path)) throw new FileNotFoundException($"Not found Json File !!! : path:{path}"); - } var json_text = File.ReadAllText(path); var jObject = JObject.Parse(json_text); - m_file_sources.Add((path, "json")); - m_jobject_sources.Add(jObject); + m_path_to_jobject[path] = jObject; } private void loadYaml(string path) { - if (false == File.Exists(path)) - { + if (!File.Exists(path)) throw new FileNotFoundException($"Not found Yaml File !!! : path:{path}"); - } var yamlText = File.ReadAllText(path); var deserializer = new DeserializerBuilder() @@ -76,20 +72,18 @@ public sealed class ConfigManager : Singleton var json = serializer.Serialize(yamlObject); var jObject = JObject.Parse(json); - m_file_sources.Add((path, "yaml")); - m_jobject_sources.Add(jObject); + m_path_to_jobject[path] = jObject; } private void watchFile(string path, string type) { if (m_watchers.ContainsKey(path)) - { return; - } var directory_name = Path.GetDirectoryName(path); NullReferenceCheckHelper.throwIfNull(directory_name, () => $"directory_name is null !!! : path:{path}, format:{type}"); - var watcher = new FileSystemWatcher(directory_name) + + var watcher = new FileSystemWatcher(directory_name!) { Filter = Path.GetFileName(path), NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.Size @@ -102,40 +96,54 @@ public sealed class ConfigManager : Singleton m_watchers[path] = watcher; } - private void reloadAll() { Log.getLogger().error("Detected changes in config file !!!, Reloading..."); - m_jobject_sources.Clear(); - foreach (var (path, type) in m_file_sources) + m_path_to_jobject.Clear(); + + foreach (var key in m_key_to_source.Keys) { - if (type == "json") + if (false == reloadConfig(key)) { - loadJson(path); - } - else if (type == "yaml") - { - loadYaml(path); + Log.getLogger().error($"Failed to reload config for key={key} during full reload"); } } } + public bool reloadConfig(uint key) + { + if (!m_key_to_source.TryGetValue(key, out var entry)) + return false; + + try + { + if (entry.type == "json") + loadJson(entry.path); + else if (entry.type == "yaml") + loadYaml(entry.path); + + Log.getLogger().info($"Reloaded config for key={key}, path={entry.path}"); + return true; + } + catch (Exception ex) + { + Log.getLogger().error($"Failed to reload config: key={key}, path={entry.path}, error={ex.Message}"); + return false; + } + } + public T bind(string sectionName) { - if (m_jobject_sources.Count == 0) - { + if (m_path_to_jobject.Count == 0) throw new InvalidOperationException("No config sources have been loaded !!!"); - } var merged = new JObject(); - foreach (var source in m_jobject_sources) + foreach (var source in m_path_to_jobject.Values) { - if (true == m_is_detect_duplicates) - { + if (m_is_detect_duplicates) detectDuplicateKeys(merged, source); - } merged.Merge(source, new JsonMergeSettings { @@ -144,22 +152,114 @@ public sealed class ConfigManager : Singleton }); } - JToken? target_token = null; - if (false == merged.TryGetValue(sectionName, out var found_target_token)) + return extractSection(merged, sectionName, "merged"); + } + + public T bindFromPath(string path, string sectionName) + { + if (!m_path_to_jobject.TryGetValue(path, out var jObject)) + throw new ArgumentException($"Config file not loaded or not found: path={path}"); + + return extractSection(jObject, sectionName, $"path={path}"); + } + + public T bindFromKey(uint key, string sectionName) + { + if (!m_key_to_source.TryGetValue(key, out var entry)) + throw new ArgumentException($"Key not found: key={key}"); + + if (!m_path_to_jobject.TryGetValue(entry.path, out var jObject)) + throw new Exception($"JObject not found for path associated with key={key}"); + + return extractSection(jObject, sectionName, $"key={key}, path={entry.path}"); + } + + public bool tryBindFromKey(uint key, string sectionName, out T? result) + { + result = default; + + try { - target_token = merged; + result = bindFromKey(key, sectionName); + return true; } - else + catch { - target_token = found_target_token; + return false; + } + } + + public bool tryBindFromPath(string path, string sectionName, out T? result) + { + result = default; + + try + { + result = bindFromPath(path, sectionName); + return true; + } + catch + { + return false; + } + } + + public JObject? getRawJsonByKey(uint key) + { + if (!m_key_to_source.TryGetValue(key, out var entry)) + return null; + + return m_path_to_jobject.TryGetValue(entry.path, out var jObject) + ? jObject + : null; + } + + public JObject? getRawJsonByPath(string path) + { + return m_path_to_jobject.TryGetValue(path, out var jObject) + ? jObject + : null; + } + + public bool removeConfig(uint key) + { + if (!m_key_to_source.TryGetValue(key, out var entry)) + return false; + + m_key_to_source.Remove(key); + m_path_to_jobject.Remove(entry.path); + + if (m_watchers.TryGetValue(entry.path, out var watcher)) + { + watcher.EnableRaisingEvents = false; + watcher.Dispose(); + m_watchers.Remove(entry.path); } - if (target_token == null) + return true; + } + + public IEnumerable getAllKeys() + { + return m_key_to_source.Keys; + } + + public IEnumerable getAllPaths() + { + return m_path_to_jobject.Keys; + } + + private T extractSection(JObject jObject, string sectionName, string context) + { + if (!jObject.TryGetValue(sectionName, out var token)) { - throw new Exception($"Section could not be found !!! : sectionName:{sectionName}"); + token = jObject; // fallback } - return target_token.ToObject()!; + if (token == null) + throw new Exception($"Section not found: sectionName={sectionName}, context={context}"); + + return token.ToObject()!; } private void detectDuplicateKeys(JObject existing, JObject incoming) @@ -172,4 +272,4 @@ public sealed class ConfigManager : Singleton } } } -} \ No newline at end of file +} diff --git a/ServerCore/Config/ConfigManagerConfigurationProvider.cs b/ServerCore/Config/ConfigManagerConfigurationProvider.cs new file mode 100644 index 0000000..5e7428c --- /dev/null +++ b/ServerCore/Config/ConfigManagerConfigurationProvider.cs @@ -0,0 +1,66 @@ +using Microsoft.Extensions.Configuration; +using Newtonsoft.Json.Linq; + + +using ServerCore; + + +public class ConfigManagerConfigurationProvider : ConfigurationProvider +{ + private readonly ConfigManager m_config_manager; + + public ConfigManagerConfigurationProvider(ConfigManager configManager) + { + m_config_manager = configManager; + + Load(); + } + + public override void Load() + { + var data = new Dictionary(); + + foreach (var jObj in m_config_manager.getAllPaths()) + { + var jtoken = m_config_manager.getRawJsonByPath(jObj); + if (jtoken == null) continue; + + flattenJson(jtoken, data, parentPath: null); + } + + Data = data!; + } + + private void flattenJson(JToken token, IDictionary data, string? parentPath) + { + NullReferenceCheckHelper.throwIfNull(token, () => $"token is null !!!"); + + switch (token.Type) + { + case JTokenType.Object: + foreach (var prop in (JObject)token) + { + var path = parentPath == null ? prop.Key : $"{parentPath}:{prop.Key}"; + NullReferenceCheckHelper.throwIfNull(prop.Value, () => $"prop.Value is null !!!"); + flattenJson(prop.Value, data, path); + } + break; + + case JTokenType.Array: + var index = 0; + foreach (var item in (JArray)token) + { + var path = $"{parentPath}:{index++}"; + flattenJson(item, data, path); + } + break; + + default: + if (token is JValue value && parentPath != null) + { + data[parentPath] = value.ToString(); + } + break; + } + } +} diff --git a/ServerCore/Config/ConfigManagerConfigurationSource.cs b/ServerCore/Config/ConfigManagerConfigurationSource.cs new file mode 100644 index 0000000..e11656e --- /dev/null +++ b/ServerCore/Config/ConfigManagerConfigurationSource.cs @@ -0,0 +1,19 @@ +using Microsoft.Extensions.Configuration; + + +namespace ServerCore; + +public class ConfigManagerConfigurationSource : IConfigurationSource +{ + private readonly ConfigManager m_config_manager; + + public ConfigManagerConfigurationSource(ConfigManager configManager) + { + m_config_manager = configManager; + } + + public IConfigurationProvider Build(IConfigurationBuilder builder) + { + return new ConfigManagerConfigurationProvider(m_config_manager); + } +} diff --git a/ServerCore/Config/ConfigManagerHelper.cs b/ServerCore/Config/ConfigManagerHelper.cs new file mode 100644 index 0000000..7406b1a --- /dev/null +++ b/ServerCore/Config/ConfigManagerHelper.cs @@ -0,0 +1,31 @@ +using Microsoft.Extensions.Configuration; + + +using ServerCore; + +/*============================================================================================= + + ConfigurationBuilder 연동 지원 Helper 클래스 + + var configManager = new ConfigManager() + .addJson(1, "appsettings.json") + .addYaml(2, "settings.yaml"); + + var configuration = new ConfigurationBuilder() + .addConfigManager(configManager) + .Build(); + + var mySetting = configuration["MyApp:Setting"]; + + + author : kangms + +=============================================================================================*/ + +public static class ConfigManagerHelper +{ + public static IConfigurationBuilder addConfigManager(this IConfigurationBuilder builder, ConfigManager manager) + { + return builder.Add(new ConfigManagerConfigurationSource(manager)); + } +} \ No newline at end of file diff --git a/ServerCore/Exception/ConditionCheckHelper.cs b/ServerCore/Exception/ConditionCheckHelper.cs index a60c248..be1fa03 100644 --- a/ServerCore/Exception/ConditionCheckHelper.cs +++ b/ServerCore/Exception/ConditionCheckHelper.cs @@ -10,7 +10,7 @@ namespace ServerCore; //============================================================================================= -// 조건 체크 관련 예외 지원 함수 +// 조건별 체크 관련 예외 지원 함수 // // author : kangms // @@ -19,25 +19,57 @@ namespace ServerCore; public static class ConditionValidCheckHelper { public static void throwIfFalse( bool isCondition - , string errMsg ) + , string errMsg + , Func? overrideException = null ) { - if (false == isCondition) + if (isCondition) + return; + + if (overrideException != null) { - throw new InvalidOperationException(errMsg); + throw overrideException(errMsg); } + + throw new InvalidOperationException(errMsg); } public static void throwIfFalseWithCondition( Expression> conditionExpression - , Func? fnLog = null ) + , Func? fnLog = null + , Func? overrideException = null ) { var compiled_expression = conditionExpression.Compile(); - if (false == compiled_expression()) + if (compiled_expression()) + return; + + string condition_text = conditionExpression.Body.ToString(); + string errMsg = fnLog?.Invoke() ?? $"Failed to check condition: '{condition_text}'"; + + if (overrideException != null) { - string condition_text = conditionExpression.Body.ToString(); - - var err_msg = fnLog?.Invoke() ?? $"Failed to check Condition: '{condition_text}'"; - - throw new InvalidOperationException(err_msg); + throw overrideException(errMsg); } + + throw new InvalidOperationException(errMsg); } } + + +public static class RangeCheckHelper +{ + public static void throwIfOutOfRange( int value, int min, int max + , Func? fnLog = null + , Func? overrideException = null ) + { + if (value >= min && value <= max) + return; + + string message = fnLog?.Invoke() ?? $"Value {value} is out of range [{min}, {max}]"; + + if (overrideException != null) + { + throw overrideException(message); + } + + throw new ArgumentOutOfRangeException(nameof(value), message); + } +} \ No newline at end of file diff --git a/ServerCore/Exception/NullReferenceCheckHelper.cs b/ServerCore/Exception/NullReferenceCheckHelper.cs index 7375429..f081631 100644 --- a/ServerCore/Exception/NullReferenceCheckHelper.cs +++ b/ServerCore/Exception/NullReferenceCheckHelper.cs @@ -23,22 +23,20 @@ public static class ArgumentNullReferenceCheckHelper { public static void throwIfNull( [NotNull] object? argument , Func? fnLog = null - , [CallerArgumentExpression(nameof(argument))] string? paramName = null ) + , [CallerArgumentExpression(nameof(argument))] string? paramName = null + , Func? overrideException = null ) { if (argument != null) return; - if (fnLog != null) + string message = fnLog?.Invoke() ?? $"Argument '{paramName}' cannot be null !!!"; + + if (overrideException != null) { - throw new ArgumentNullException(paramName, fnLog()); + throw overrideException(message); } - if (paramName != null) - { - throw new ArgumentNullException(paramName, $"Argument '{paramName}' cannot be null !!!"); - } - - throw new ArgumentNullException("Cannot generate null-check error message: both 'fnLog' and 'paramName' are null !!!"); + throw new ArgumentNullException(paramName, message); } } @@ -46,21 +44,19 @@ public static class NullReferenceCheckHelper { public static void throwIfNull( [NotNull] object? argument , Func? fnLog = null - , [CallerArgumentExpression(nameof(argument))] string? paramName = null ) + , [CallerArgumentExpression(nameof(argument))] string? paramName = null + , Func? overrideException = null ) { if (argument != null) return; - if (fnLog != null) + string message = fnLog?.Invoke() ?? $"'{paramName}' object cannot be null !!!"; + + if (overrideException != null) { - throw new NullReferenceException(fnLog()); + throw overrideException(message); } - if (paramName != null) - { - throw new NullReferenceException($"'{paramName}' object cannot be null !!!"); - } - - throw new NullReferenceException("Cannot generate null-check error message: both 'fnLog' and 'paramName' are null !!!"); + throw new NullReferenceException(message); } } diff --git a/ServerCore/Log/Logger.cs b/ServerCore/Log/Logger.cs deleted file mode 100644 index 77edc8f..0000000 --- a/ServerCore/Log/Logger.cs +++ /dev/null @@ -1,224 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; - - -using NLog; -using NLog.Config; -using NLog.Fluent; - - -namespace ServerCore; - -//=========================================================================================== -// 로그 처리자 -// -// author : kangms -// -//=========================================================================================== - -public static class Log -{ - public static string NLogFileName { get; set; } = "./Config/nlog.config"; - - private static string m_process_type = string.Empty; - private static string m_ip_port = string.Empty; - private static string m_default_logger_name_pattern = string.Empty; - - private static bool m_is_initialized = false; - - private static bool m_is_reconfigure = true; - - public static void initLog( string processType, string defaultLoggerNamePattern = "" - , EventHandler? handler = null ) - { - m_process_type = processType; - m_default_logger_name_pattern = defaultLoggerNamePattern; - - if(null != handler) - { - registerConfigurationChangedHandler(handler); - } - - m_is_initialized = true; - } - - public static void setIPnPort(string ip, UInt16 port) - { - m_ip_port = $"{ip}:{port}"; - } - - public static NLog.Logger getLogger(string loggerName = "") - { - if (true == m_is_reconfigure) - { - reconfigureXML(NLogFileName); - } - - if (0 == loggerName.Length) - { - loggerName = m_default_logger_name_pattern; - } - - return LogManager.GetLogger(loggerName); - } - - private static void registerConfigurationChangedHandler(EventHandler handler) - { - LogManager.ConfigurationChanged += handler; - } - - private static bool reconfigureXML(string xmlCofigFilePath) - { - if (true == m_is_reconfigure) - { - var to_reload_configure = new NLog.Config.XmlLoggingConfiguration(xmlCofigFilePath); - if (null == to_reload_configure) - { - return false; - } - - LogManager.Configuration = to_reload_configure; - LogManager.ReconfigExistingLoggers(); - - m_is_reconfigure = false; - } - - return true; - } - public static void shutdown() - { - CloudWatchLog.setClosed(); - LogManager.Shutdown(); - } - - public static void sequence(string sender, string message) - { - NLog.Logger sequence_logger = LogManager.GetLogger("SequenceLogger"); - - LogEventInfo logEventInfo = new LogEventInfo(LogLevel.Debug, "SequenceLogger", message); - logEventInfo.Properties["sender"] = sender; - sequence_logger.Debug(logEventInfo); - } - - public static void sequence(string sender, string receiver, string message, string errDesc = "") - { - NLog.Logger sequence_logger = LogManager.GetLogger("SequenceLogger"); - - LogEventInfo logEventInfo = new LogEventInfo(LogLevel.Debug, "SequenceLogger", message); - logEventInfo.Properties["sender"] = sender; - logEventInfo.Properties["receiver"] = receiver; - logEventInfo.Properties["errordesc"] = (errDesc == string.Empty || errDesc.Contains("Success") == true ? $"{errDesc}" : $"ERR-{errDesc}"); - sequence_logger.Debug(logEventInfo); - } - - - public static string getProcessType() => m_process_type; - - public static string getIpPort() => m_ip_port; - - public static bool isInitialized() => m_is_initialized; - } - -//=========================================================================================== -// 로그 관련 확장 함수 -// -// author : kangms -// -//=========================================================================================== - -public static class NLogExtend -{ - - public static void trace( this NLog.Logger _this - , string message - , [CallerMemberName] string memberName = "" - , [CallerFilePath] string sourceFilePath = "" - , [CallerLineNumber] Int32 sourceLineNumber = 0 ) - { - var logEventInfo = new LogEventInfo(LogLevel.Trace, null, message); - logEventInfo.setLogEventProperties( sourceFilePath, sourceLineNumber, memberName - , Log.getProcessType(), Log.getIpPort() ); - - _this.Trace(logEventInfo); - } - - public static void debug( this NLog.Logger _this - , string message - , [CallerMemberName] string memberName = "" - , [CallerFilePath] string sourceFilePath = "" - , [CallerLineNumber] Int32 sourceLineNumber = 0 ) - { - var logEventInfo = new LogEventInfo(LogLevel.Debug, null, message); - logEventInfo.setLogEventProperties( sourceFilePath, sourceLineNumber, memberName - , Log.getProcessType(), Log.getIpPort() ); - - _this.Debug(logEventInfo); - } - - public static void info( this NLog.Logger _this - , string message - , [CallerMemberName] string memberName = "" - , [CallerFilePath] string sourceFilePath = "" - , [CallerLineNumber] Int32 sourceLineNumber = 0 ) - { - var logEventInfo = new LogEventInfo(LogLevel.Info, null, message); - logEventInfo.setLogEventProperties( sourceFilePath, sourceLineNumber, memberName - , Log.getProcessType(), Log.getIpPort() ); - - _this.Info(logEventInfo); - } - - public static void warn( this NLog.Logger _this - , string message - , [CallerMemberName] string memberName = "" - , [CallerFilePath] string sourceFilePath = "" - , [CallerLineNumber] Int32 sourceLineNumber = 0 ) - { - var logEventInfo = new LogEventInfo(LogLevel.Warn, null, message); - logEventInfo.setLogEventProperties( sourceFilePath, sourceLineNumber, memberName - , Log.getProcessType(), Log.getIpPort() ); - - _this.Warn(logEventInfo); - } - - public static void error( this NLog.Logger _this - , string message - , [CallerMemberName] string memberName = "" - , [CallerFilePath] string sourceFilePath = "" - , [CallerLineNumber] Int32 sourceLineNumber = 0 ) - { - var logEventInfo = new LogEventInfo(LogLevel.Error, null, message); - logEventInfo.setLogEventProperties( sourceFilePath, sourceLineNumber, memberName - , Log.getProcessType(), Log.getIpPort() ); - - _this.Error(logEventInfo); - } - - public static void fatal( this NLog.Logger _this - , string message - , [CallerMemberName] string memberName = "" - , [CallerFilePath] string sourceFilePath = "" - , [CallerLineNumber] Int32 sourceLineNumber = 0 ) - { - var logEventInfo = new LogEventInfo(LogLevel.Fatal, null, message); - logEventInfo.setLogEventProperties( sourceFilePath, sourceLineNumber, memberName - , Log.getProcessType(), Log.getIpPort() ); - - _this.Fatal(logEventInfo); - } - - private static void setLogEventProperties( this LogEventInfo _this - , string sourceFilePath, Int32 sourceLineNumber, string memberName - , string processType, string ipPort ) - { - _this.Properties["server"] = processType; - _this.Properties["ip/port"] = ipPort; - _this.Properties["memberName"] = memberName; - _this.Properties["filePath"] = sourceFilePath; - _this.Properties["lineNumber"] = sourceLineNumber; - } -} diff --git a/ServerCore/Log/NLog.cs b/ServerCore/Log/NLog.cs new file mode 100644 index 0000000..2752207 --- /dev/null +++ b/ServerCore/Log/NLog.cs @@ -0,0 +1,116 @@ +using NLog; +using NLog.Config; +using NLog.Fluent; + + +namespace ServerCore; + +//=========================================================================================== +// 로그 처리자 +// +// author : kangms +// +//=========================================================================================== + +public static class Log +{ + public static string NLogFileName { get; set; } = "./Config/nlog.config"; + + private static string m_process_type = string.Empty; + private static string m_ip_port = string.Empty; + private static string m_default_logger_name_pattern = string.Empty; + + private static bool m_is_initialized = false; + + private static bool m_is_reconfigure = true; + + public static void initLog( string processType, string defaultLoggerNamePattern = "" + , EventHandler? handler = null ) + { + m_process_type = processType; + m_default_logger_name_pattern = defaultLoggerNamePattern; + + if(null != handler) + { + registerConfigurationChangedHandler(handler); + } + + m_is_initialized = true; + } + + public static void setIPnPort(string ip, UInt16 port) + { + m_ip_port = $"{ip}:{port}"; + } + + public static NLog.Logger getLogger(string loggerName = "") + { + if (true == m_is_reconfigure) + { + reconfigureXML(NLogFileName); + } + + if (0 == loggerName.Length) + { + loggerName = m_default_logger_name_pattern; + } + + return LogManager.GetLogger(loggerName); + } + + private static void registerConfigurationChangedHandler(EventHandler handler) + { + LogManager.ConfigurationChanged += handler; + } + + private static bool reconfigureXML(string xmlCofigFilePath) + { + if (true == m_is_reconfigure) + { + var to_reload_configure = new NLog.Config.XmlLoggingConfiguration(xmlCofigFilePath); + if (null == to_reload_configure) + { + return false; + } + + LogManager.Configuration = to_reload_configure; + LogManager.ReconfigExistingLoggers(); + + m_is_reconfigure = false; + } + + return true; + } + public static void shutdown() + { + CloudWatchLog.setClosed(); + LogManager.Shutdown(); + } + + public static void sequence(string sender, string message) + { + NLog.Logger sequence_logger = LogManager.GetLogger("SequenceLogger"); + + LogEventInfo logEventInfo = new LogEventInfo(LogLevel.Debug, "SequenceLogger", message); + logEventInfo.Properties["sender"] = sender; + sequence_logger.Debug(logEventInfo); + } + + public static void sequence(string sender, string receiver, string message, string errDesc = "") + { + NLog.Logger sequence_logger = LogManager.GetLogger("SequenceLogger"); + + LogEventInfo logEventInfo = new LogEventInfo(LogLevel.Debug, "SequenceLogger", message); + logEventInfo.Properties["sender"] = sender; + logEventInfo.Properties["receiver"] = receiver; + logEventInfo.Properties["errordesc"] = (errDesc == string.Empty || errDesc.Contains("Success") == true ? $"{errDesc}" : $"ERR-{errDesc}"); + sequence_logger.Debug(logEventInfo); + } + + + public static string getProcessType() => m_process_type; + + public static string getIpPort() => m_ip_port; + + public static bool isInitialized() => m_is_initialized; +} diff --git a/ServerCore/Log/NLogHelper.cs b/ServerCore/Log/NLogHelper.cs new file mode 100644 index 0000000..b1b6985 --- /dev/null +++ b/ServerCore/Log/NLogHelper.cs @@ -0,0 +1,112 @@ +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + + + +namespace ServerCore; + + +//=========================================================================================== +// NLog 관련 확장 함수 +// +// author : kangms +// +//=========================================================================================== + +public static class NLogHelper +{ + public static void trace( this NLog.Logger _this + , string message + , [CallerMemberName] string memberName = "" + , [CallerFilePath] string sourceFilePath = "" + , [CallerLineNumber] Int32 sourceLineNumber = 0) + { + var logEventInfo = new LogEventInfo(LogLevel.Trace, null, message); + logEventInfo.setLogEventProperties(sourceFilePath, sourceLineNumber, memberName + , Log.getProcessType(), Log.getIpPort()); + + _this.Trace(logEventInfo); + } + + public static void debug( this NLog.Logger _this + , string message + , [CallerMemberName] string memberName = "" + , [CallerFilePath] string sourceFilePath = "" + , [CallerLineNumber] Int32 sourceLineNumber = 0) + { + var logEventInfo = new LogEventInfo(LogLevel.Debug, null, message); + logEventInfo.setLogEventProperties(sourceFilePath, sourceLineNumber, memberName + , Log.getProcessType(), Log.getIpPort()); + + _this.Debug(logEventInfo); + } + + public static void info( this NLog.Logger _this + , string message + , [CallerMemberName] string memberName = "" + , [CallerFilePath] string sourceFilePath = "" + , [CallerLineNumber] Int32 sourceLineNumber = 0) + { + var logEventInfo = new LogEventInfo(LogLevel.Info, null, message); + logEventInfo.setLogEventProperties(sourceFilePath, sourceLineNumber, memberName + , Log.getProcessType(), Log.getIpPort()); + + _this.Info(logEventInfo); + } + + public static void warn( this NLog.Logger _this + , string message + , [CallerMemberName] string memberName = "" + , [CallerFilePath] string sourceFilePath = "" + , [CallerLineNumber] Int32 sourceLineNumber = 0) + { + var logEventInfo = new LogEventInfo(LogLevel.Warn, null, message); + logEventInfo.setLogEventProperties(sourceFilePath, sourceLineNumber, memberName + , Log.getProcessType(), Log.getIpPort()); + + _this.Warn(logEventInfo); + } + + public static void error( this NLog.Logger _this + , string message + , [CallerMemberName] string memberName = "" + , [CallerFilePath] string sourceFilePath = "" + , [CallerLineNumber] Int32 sourceLineNumber = 0) + { + var logEventInfo = new LogEventInfo(LogLevel.Error, null, message); + logEventInfo.setLogEventProperties(sourceFilePath, sourceLineNumber, memberName + , Log.getProcessType(), Log.getIpPort()); + + _this.Error(logEventInfo); + } + + public static void fatal( this NLog.Logger _this + , string message + , [CallerMemberName] string memberName = "" + , [CallerFilePath] string sourceFilePath = "" + , [CallerLineNumber] Int32 sourceLineNumber = 0) + { + var logEventInfo = new LogEventInfo(LogLevel.Fatal, null, message); + logEventInfo.setLogEventProperties(sourceFilePath, sourceLineNumber, memberName + , Log.getProcessType(), Log.getIpPort()); + + _this.Fatal(logEventInfo); + } + + private static void setLogEventProperties( this LogEventInfo _this + , string sourceFilePath, Int32 sourceLineNumber, string memberName + , string processType, string ipPort) + { + _this.Properties["server"] = processType; + _this.Properties["ip/port"] = ipPort; + _this.Properties["memberName"] = memberName; + _this.Properties["filePath"] = sourceFilePath; + _this.Properties["lineNumber"] = sourceLineNumber; + } + +} diff --git a/ServerCore/ServerCore.csproj b/ServerCore/ServerCore.csproj index 3a6ce6e..eccde22 100644 --- a/ServerCore/ServerCore.csproj +++ b/ServerCore/ServerCore.csproj @@ -33,16 +33,30 @@ + + + + + + + + + + + + + + diff --git a/UGQDataAccess/UGQDataAccess.csproj b/UGQDataAccess/UGQDataAccess.csproj index 34aea78..bced02f 100644 --- a/UGQDataAccess/UGQDataAccess.csproj +++ b/UGQDataAccess/UGQDataAccess.csproj @@ -9,18 +9,6 @@ true - - - - - - - - - - - -