From 7a3d73ce66f270d811cb1dd284d1cf1e7c0c8151 Mon Sep 17 00:00:00 2001 From: Christian Kauer Date: Sat, 30 Dec 2023 11:38:11 +0100 Subject: [PATCH] dev --- GameData/ApiClient.cs | 11 +++++---- GameData/Dummy/DummyExpenseRepository.cs | 5 ++++ GameData/Dummy/DummyGameRepository.cs | 10 ++++++++ GameData/Repository/ExpenseRepository.cs | 4 ++-- GameData/Repository/GameRepository.cs | 29 +++++++++++++++++++++-- GameHandler/ExpenseHandler.cs | 12 ++++++---- GameHandler/GameService.cs | 14 ++++++++--- GameHandler/GameStateHandler.cs | 10 ++++---- GameModel/Contracts/IExpenseRepository.cs | 2 +- GameModel/Contracts/IGameRepository.cs | 3 ++- KoogleCli/Program.cs | 9 ++++++- 11 files changed, 85 insertions(+), 24 deletions(-) diff --git a/GameData/ApiClient.cs b/GameData/ApiClient.cs index 3460ba5..6a4831d 100644 --- a/GameData/ApiClient.cs +++ b/GameData/ApiClient.cs @@ -232,14 +232,14 @@ namespace GameData return res; } - public T[] Get(string serviceUrl, bool suppressExceptions = false) + public async Task Get(string serviceUrl, bool suppressExceptions = false) { WrapperArray res = default; try { _logger.LogDebug($"calling service url {serviceUrl}"); - var response = client.Send(GetHttpRequestMessage(HttpMethod.Get, serviceUrl)); + var response = await client.SendAsync(GetHttpRequestMessage(HttpMethod.Get, serviceUrl)); if (response.IsSuccessStatusCode) { @@ -266,7 +266,7 @@ namespace GameData } else { - var errorResult = response.Content.ReadAsStringAsync().Result; + var errorResult = await response.Content.ReadAsStringAsync(); _logger.LogError("error getting from service '{service}' with code '{statuscode}' - Result: '{result}'", serviceUrl, response.StatusCode, errorResult); } } @@ -282,10 +282,10 @@ namespace GameData return res.Data; } - public async Task GetSingle(string serviceUrl, bool suppressExceptions = false) + public async Task GetSingle(string serviceUrl, bool suppressExceptions = false) { WrapperSingle res = default; - + try { _logger.LogDebug($"calling service url {serviceUrl}"); @@ -318,6 +318,7 @@ namespace GameData { var errorResult = await response.Content.ReadAsStringAsync(); _logger.LogError("error getting from service '{service}' with code '{statuscode}' - Result: '{result}'", serviceUrl, response.StatusCode, errorResult); + return await Task.FromResult(default(T)); } } catch (Exception ex) diff --git a/GameData/Dummy/DummyExpenseRepository.cs b/GameData/Dummy/DummyExpenseRepository.cs index c8521e8..8611b71 100644 --- a/GameData/Dummy/DummyExpenseRepository.cs +++ b/GameData/Dummy/DummyExpenseRepository.cs @@ -20,6 +20,11 @@ namespace GameData.Dummy throw new NotImplementedException(); } + Task> IExpenseRepository.GetAll() + { + throw new NotImplementedException(); + } + Task IExpenseRepository.Save(PlayerExpense data) { throw new NotImplementedException(); diff --git a/GameData/Dummy/DummyGameRepository.cs b/GameData/Dummy/DummyGameRepository.cs index 237a31e..6114cd3 100644 --- a/GameData/Dummy/DummyGameRepository.cs +++ b/GameData/Dummy/DummyGameRepository.cs @@ -37,5 +37,15 @@ namespace GameData.Dummy { throw new NotImplementedException(); } + + public Task Create(string gameName) + { + throw new NotImplementedException(); + } + + public Task> LoadStates(Guid gameId) + { + throw new NotImplementedException(); + } } } diff --git a/GameData/Repository/ExpenseRepository.cs b/GameData/Repository/ExpenseRepository.cs index 1108af6..c9a599e 100644 --- a/GameData/Repository/ExpenseRepository.cs +++ b/GameData/Repository/ExpenseRepository.cs @@ -27,9 +27,9 @@ namespace GameData.Repository _log?.LogDebug("creating ExpenseRepository"); } - public IEnumerable GetAll() + public async Task> GetAll() { - return _client.Get(UrlExpense).ToList(); + return await _client.Get(UrlExpense); } public async Task Save(PlayerExpense memberExpense) diff --git a/GameData/Repository/GameRepository.cs b/GameData/Repository/GameRepository.cs index 88d1b65..c56fe8a 100644 --- a/GameData/Repository/GameRepository.cs +++ b/GameData/Repository/GameRepository.cs @@ -3,6 +3,7 @@ using GameModel; using GameModel.Contracts; using Microsoft.Extensions.Logging; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -26,9 +27,25 @@ namespace GameData.Repository _client = apiClient; } - public GameState Load(Guid gameId) + public async Task?> LoadStates(Guid gameId) { - throw new NotImplementedException(); + string str = JsonConvert.SerializeObject( + new + { + gameid = new + { + _eq = gameId + } + } + ); + var states = await _client.Get( UrlGameState + "?filter" + str); + + var res = states.OrderBy(_ => _.Counter).Select(_ => JsonConvert.DeserializeObject(_.GameState, new JsonSerializerSettings() + { + TypeNameHandling = TypeNameHandling.Auto + })); + + return res; } public async Task Save(GameState gameState) @@ -63,5 +80,13 @@ namespace GameData.Repository { return await _client.GetSingle(UrlGame + "/" + gameId); } + + public async Task Create(string gameName) + { + dynamic payload = new JObject(); + payload.gamename = gameName; + + return await _client.Post(payload, UrlGame); + } } } diff --git a/GameHandler/ExpenseHandler.cs b/GameHandler/ExpenseHandler.cs index 55f80ba..4b7d7b8 100644 --- a/GameHandler/ExpenseHandler.cs +++ b/GameHandler/ExpenseHandler.cs @@ -23,7 +23,7 @@ namespace GameHandler _expenseRepository = expenseRepository; } - public ExpenseModel HandleGameExenseEventArgs(GameExenseEventArgs gameExenseEventArgs, ExpenseModel expenseModelToAppend) + public async Task HandleGameExenseEventArgs(GameExenseEventArgs gameExenseEventArgs, ExpenseModel expenseModelToAppend) { if (!gameExenseEventArgs.PlayerIds.Any(_ => _ == gameExenseEventArgs.PlayerId)) { @@ -33,14 +33,16 @@ namespace GameHandler List memberExpenses = PrepareResult(ref expenseModelToAppend); var triggers = gameExenseEventArgs.Triggers; - AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers); + await AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers); return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; } - private void AssignExpenses(int playerId, int[] playerIds, List memberExpenses, ExpenseTrigger[] triggers) - { - var destExpenses = _expenseRepository.GetAll().Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); + private async Task AssignExpenses(int playerId, int[] playerIds, List memberExpenses, ExpenseTrigger[] triggers) + { + var list = await _expenseRepository.GetAll(); + var destExpenses = list + .Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); var inversePlayers = playerIds.Where(_ => _ != playerId); foreach (var expense in destExpenses) diff --git a/GameHandler/GameService.cs b/GameHandler/GameService.cs index 273535c..42076a9 100644 --- a/GameHandler/GameService.cs +++ b/GameHandler/GameService.cs @@ -76,7 +76,7 @@ namespace GameHandler { var gm = _gh.InitGameModel(playerIds, gameSettings); var throwState = ThrowState.Create(_gh.ThrowMode(), _gh.ThrowsPerRount()); - _game = await _gameStateHandler.CreateNewGame(); + _game = await _gameStateHandler.CreateNewGame(gameName); return GameState.Create(_game.Id, gameName, throwState, _gh.GetCurrentPlayerId(gm), gm); } @@ -92,7 +92,7 @@ namespace GameHandler private void _gh_GameExpenseOccured(object? sender, EventArgs e) { - var expenseModel = _eh.HandleGameExenseEventArgs(e as GameExenseEventArgs, _gameStateHandler.ExpenseModel); + var expenseModel = _eh.HandleGameExenseEventArgs(e as GameExenseEventArgs, _gameStateHandler.ExpenseModel).Result; _gameStateHandler.Add(expenseModel); //_lastState = _lastState with { ExpenseModel = expenseModel }; } @@ -158,13 +158,21 @@ namespace GameHandler Game game = null; using (var scope = _rootContainer?.BeginLifetimeScope()) { - var gs = new GameStateHandler(_scope.Resolve(), _scope.Resolve()); + var gs = new GameStateHandler(scope.Resolve(), scope.Resolve()); game = await gs.LoadGame(gameId); } + if (game == null) + { + return null; + } + _game = game; InitGameServiceBehaviour(game.GameName); var res = await _gameStateHandler.LoadState(game.Id); + + _isStarted = res != null; + return res; } diff --git a/GameHandler/GameStateHandler.cs b/GameHandler/GameStateHandler.cs index 5ed237e..e11d28e 100644 --- a/GameHandler/GameStateHandler.cs +++ b/GameHandler/GameStateHandler.cs @@ -114,14 +114,16 @@ namespace GameHandler } - internal async Task CreateNewGame() + internal async Task CreateNewGame(string gameName) { - return await _gameRepository.Create(null); + return await _gameRepository.Create(gameName); } - internal Task LoadState(Guid gameId) + internal async Task LoadState(Guid gameId) { - throw new NotImplementedException(); + var existingGameStates = await _gameRepository.LoadStates(gameId); + gameStates.AddRange(existingGameStates.Select(_ => new GameStateHandlerItem(_.Id,_))); + return existingGameStates.Last(); } internal async Task LoadGame(Guid gameId) diff --git a/GameModel/Contracts/IExpenseRepository.cs b/GameModel/Contracts/IExpenseRepository.cs index 606aeb1..785d89c 100644 --- a/GameModel/Contracts/IExpenseRepository.cs +++ b/GameModel/Contracts/IExpenseRepository.cs @@ -17,7 +17,7 @@ namespace GameModel.Contract Expense.Create(ExpenseType.Monetary,new[] { ExpenseTrigger.ExpensePoint }, "Strafpunkt, z.B. im \"Scheißspiel\"", 0.5m, false), }; - IEnumerable GetAll(); + Task> GetAll(); Task Save(PlayerExpense data); } } \ No newline at end of file diff --git a/GameModel/Contracts/IGameRepository.cs b/GameModel/Contracts/IGameRepository.cs index 666b84d..83d7055 100644 --- a/GameModel/Contracts/IGameRepository.cs +++ b/GameModel/Contracts/IGameRepository.cs @@ -9,7 +9,8 @@ namespace GameModel.Contracts public interface IGameRepository { Task Create(Game game); - GameState Load(Guid gameId); + Task Create(string gameName); + Task> LoadStates(Guid gameId); Task LoadGame(Guid gameId); Task Save(GameState gameState); Task Update(Game game); diff --git a/KoogleCli/Program.cs b/KoogleCli/Program.cs index dbd126e..f3f7d68 100644 --- a/KoogleCli/Program.cs +++ b/KoogleCli/Program.cs @@ -88,7 +88,7 @@ async Task ShowMainMenu() void ContinueGame() { - StartGameAction("", new Guid("597956fe-6d83-424f-865f-5856b63f82c9")); + StartGameAction("", new Guid("c042f8f0-3f52-48e7-b61e-82a6387af4bb")); } void MasterDataAction() @@ -144,6 +144,13 @@ void StartGameAction(string gameName, Guid gameId) gameState = starttask.Result; } + if (gameState == null) + { + Console.WriteLine($"game with id {gameId} not found"); + ShowMainMenu(); + return; + } + Show(gameState); do