Exemple #1
0
 /// <inheritdoc />
 public PreBurstSessionClaimOnClientConnectionEventListener(INetworkConnectionEstablishedEventSubscribable subscriptionService, [NotNull] IPeerPayloadSendService <GameClientPacketPayload> sendService, [NotNull] IReadonlyAuthTokenRepository authTokenRepository, [NotNull] ICharacterDataRepository characterDataRepository)
     : base(subscriptionService)
 {
     SendService             = sendService ?? throw new ArgumentNullException(nameof(sendService));
     AuthTokenRepository     = authTokenRepository ?? throw new ArgumentNullException(nameof(authTokenRepository));
     CharacterDataRepository = characterDataRepository ?? throw new ArgumentNullException(nameof(characterDataRepository));
 }
Exemple #2
0
 /// <inheritdoc />
 public WorldDownloadingGameInitializable(ICharacterService characterService, ICharacterDataRepository localCharacterData, IReadonlyAuthTokenRepository authTokenRepo, IZoneServerService zoneDataService, IContentServerServiceClient contentService, ILog logger)
 {
     CharacterService   = characterService;
     LocalCharacterData = localCharacterData;
     AuthTokenRepo      = authTokenRepo;
     ZoneDataService    = zoneDataService;
     ContentService     = contentService;
     Logger             = logger;
 }
Exemple #3
0
        //TODO: Secure this so only authenticated zoneservers who own a claimed session of for this character can update their data.
        //[ProducesJson]
        //[HttpPatch("{id}/UpdateData")]
        //[NoResponseCache]
        private async Task <IActionResult> UpdatePlayerData([FromRoute(Name = "id")] int characterId,
                                                            [FromBody][NotNull] CharacterDataInstance requestModel,
                                                            [FromServices][NotNull] ICharacterDataRepository characterDataRepository)
        {
            CharacterDataModel dataModel = await characterDataRepository.RetrieveAsync(characterId);

            //TODO: Make this updatable
            dataModel.ExperiencePoints = requestModel.Experience;

            await characterDataRepository.UpdateAsync(characterId, dataModel);

            return(Ok());
        }
Exemple #4
0
 /// <inheritdoc />
 public CharacterSelectionSelectCharacterImmediatelyOnButtonClickedEventListener(
     [NotNull] ICharacterSelectionButtonClickedEventSubscribable subscriptionService,
     [NotNull] ICharacterService characterService,
     [NotNull] ICharacterDataRepository characterData,
     [NotNull] IReadonlyAuthTokenRepository authTokenRepo,
     [NotNull] ILog logger)
     : base(subscriptionService)
 {
     CharacterService = characterService ?? throw new ArgumentNullException(nameof(characterService));
     CharacterData    = characterData ?? throw new ArgumentNullException(nameof(characterData));
     AuthTokenRepo    = authTokenRepo ?? throw new ArgumentNullException(nameof(authTokenRepo));
     Logger           = logger ?? throw new ArgumentNullException(nameof(logger));
 }
Exemple #5
0
 public CharacterCreationViewController(
     ICharacterCreationView view,
     ICharacterDataRepository characterDataRepository,
     IBackgroundRepository backgroundRepository,
     ICharacterRepository characterRepository,
     CharacterMapper characterMapper,
     CharacterManager characterManager) : base(view)
 {
     this.characterDataRepository = characterDataRepository;
     this.backgroundRepository    = backgroundRepository;
     this.characterRepository     = characterRepository;
     this.characterMapper         = characterMapper;
     this.characterManager        = characterManager;
 }
Exemple #6
0
        public async Task <IActionResult> GetCharacterData([FromRoute(Name = "id")] int characterId,
                                                           [FromServices][NotNull] ICharacterDataRepository characterDataRepository)
        {
            //TODO: We should only let the user themselves get their own character's data OR zoneservers who have a claimed session.
            ProjectVersionStage.AssertBeta();

            if (!await characterDataRepository.ContainsAsync(characterId))
            {
                return(BuildFailedResponseModel(CharacterDataQueryReponseCode.CharacterNotFound));
            }

            CharacterDataModel characterData = await characterDataRepository.RetrieveAsync(characterId);

            return(BuildSuccessfulResponseModel(new CharacterDataInstance(characterData.ExperiencePoints)));
        }
Exemple #7
0
        public async Task <IActionResult> SaveFullCharacterDataAsync([FromRoute(Name = "id")] int characterId,
                                                                     [FromBody][NotNull] FullCharacterDataSaveRequest request,
                                                                     [NotNull][FromServices] ICharacterLocationRepository locationRepository,
                                                                     [NotNull][FromServices] IZoneServerRepository zoneRepository,
                                                                     [FromServices][NotNull] ICharacterDataRepository characterDataRepository)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (characterId <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(characterId));
            }

            //TODO: Is it safe to not do this as a transaction??
            //TODO: For HTTP callers we should maybe include better information. Though with message queue we can't respond.
            if (!await CheckZoneAuthorizedToModifyCharacterData(characterId))
            {
                return(Forbid());
            }

            //Don't always want to save the position of the user.
            if (request.isPositionSaved)
            {
                await UpdateCharacterLocation(characterId, request.CharacterLocationData, locationRepository, zoneRepository);
            }

            //TODO: Probably need to handle this abit better and more data than just experience.
            //Entity data can now be saved.
            await UpdatePlayerData(characterId, new CharacterDataInstance(request.PlayerDataSnapshot.GetFieldValue <int>(PlayerObjectField.PLAYER_TOTAL_EXPERIENCE)), characterDataRepository);

            if (request.ShouldReleaseCharacterSession)
            {
                await CharacterSessionRepository.TryDeleteClaimedSession(characterId);
            }

            return(Ok());
        }
Exemple #8
0
 public MainMenuViewController(IMainMenuView view, ICharacterDataRepository characterDataRepository) : base(view)
 {
     this.characterDataRepository = characterDataRepository;
 }
Exemple #9
0
 /// <inheritdoc />
 public PreBurstStartInstanceClientConnection([NotNull] IManagedNetworkClient <GameClientPacketPayload, GameServerPacketPayload> client, [NotNull] ICharacterService characterDataService, [NotNull] IReadonlyAuthTokenRepository authTokenRepo, [NotNull] ICharacterDataRepository characterDataRepo, [NotNull] IZoneServerService zoneService, [NotNull] ILog logger, [NotNull] INetworkClientManager networkClientManager)
 {
     Client = client ?? throw new ArgumentNullException(nameof(client));
     CharacterDataService = characterDataService ?? throw new ArgumentNullException(nameof(characterDataService));
     AuthTokenRepo        = authTokenRepo ?? throw new ArgumentNullException(nameof(authTokenRepo));
     CharacterDataRepo    = characterDataRepo ?? throw new ArgumentNullException(nameof(characterDataRepo));
     ZoneService          = zoneService ?? throw new ArgumentNullException(nameof(zoneService));
     Logger = logger ?? throw new ArgumentNullException(nameof(logger));
     NetworkClientManager = networkClientManager ?? throw new ArgumentNullException(nameof(networkClientManager));
 }
Exemple #10
0
        public async Task <IActionResult> CreateCharacter([FromRoute] string name,
                                                          [FromServices][NotNull] IPlayfabCharacterClient playfabCharacterClient,
                                                          [FromServices][NotNull] ICharacterAppearanceRepository characterAppearanceRepository,
                                                          [FromServices][NotNull] ICharacterDataRepository characterDataRepository)
        {
            if (playfabCharacterClient == null)
            {
                throw new ArgumentNullException(nameof(playfabCharacterClient));
            }
            if (characterAppearanceRepository == null)
            {
                throw new ArgumentNullException(nameof(characterAppearanceRepository));
            }
            if (characterDataRepository == null)
            {
                throw new ArgumentNullException(nameof(characterDataRepository));
            }
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(name));
            }

            int accountId = ClaimsReader.GetAccountIdInt(User);

            bool nameIsAvailable = await ValidateNameAvailability(name);

            if (!nameIsAvailable)
            {
                return(BadRequest(new CharacterCreationResponse(CharacterCreationResponseCode.NameUnavailableError)));
            }

            string playfabId = ClaimsReader.GetPlayfabId(User);

            //Now, we actually need to create the character on PlayFab first. It's better to have an orphaned character on PlayFab
            //than to have a character without a PlayFab equivalent.
            PlayFabResultModel <GladMMOPlayFabGrantCharacterToUserResult> playFabResultModel = await playfabCharacterClient.GrantCharacterToUser(new GladMMOPlayFabGrantCharacterToUserRequest(name, "test", playfabId));

            //TODO: Better error handling
            if (playFabResultModel.ResultCode != HttpStatusCode.OK)
            {
                if (Logger.IsEnabled(LogLevel.Error))
                {
                    Logger.LogError($"PlayFab CharacterCreation Erorr: {playFabResultModel.ResultCode}:{playFabResultModel.ResultStatus}");
                }

                return(BadRequest(new CharacterCreationResponse(CharacterCreationResponseCode.GeneralServerError)));
            }

            CharacterEntryModel characterEntryModel = new CharacterEntryModel(accountId, name, playfabId, playFabResultModel.Data.CharacterId);

            //TODO: We need a transition around the creation of the below entries.
            ProjectVersionStage.AssertBeta();
            //TODO: Don't expose the database table model
            //Otherwise we should try to create. There is a race condition here that can cause it to still fail
            //since others could create a character with this name before we finish after checking
            bool result = await CharacterRepository.TryCreateAsync(characterEntryModel);

            //TODO: Also needs to be apart of the transaction
            if (result)
            {
                await characterDataRepository.TryCreateAsync(new CharacterDataModel(characterEntryModel.CharacterId, 0));

                await characterAppearanceRepository.TryCreateAsync(new CharacterAppearanceModel(characterEntryModel.CharacterId, 9));                 //Default is 9 right now.
            }

            return(Json(new CharacterCreationResponse(CharacterCreationResponseCode.Success)));
        }
Exemple #11
0
 /// <inheritdoc />
 public ZoneClientCharacterSessionInitializable(IPeerPayloadSendService <GameClientPacketPayload> payloadSender, ICharacterDataRepository characterRepository)
 {
     PayloadSender       = payloadSender;
     CharacterRepository = characterRepository;
 }