From 85521f3b233ac98b2096956e6e3f5e6ee081f565 Mon Sep 17 00:00:00 2001 From: Jonas <77726472+kobolol@users.noreply.github.com> Date: Sun, 1 Mar 2026 20:43:18 +0100 Subject: [PATCH] Return game ID+code; update hub and Player model Change GameManager/CreateGame to return (gameId, gameCode) and Make JoinGame return the game Id (or null) instead of a bool. Update IGameManager signature accordingly. Refactor Hub methods to construct Player objects, accept Coordinates for game creation, use the manager results to add connections to groups and send GameCreated with GameId and GameCode, and handle join failures with an error message. Simplify Player class to use a primary-constructor style with property initialization; add necessary using directives. --- API/Controllers/GameHubSocket.cs | 37 +++++++++++++++++++----- API/Models/Game/Player.cs | 6 ++-- API/Services/GameManager/GameManager.cs | 10 ++++--- API/Services/GameManager/IGameManager.cs | 4 +-- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/API/Controllers/GameHubSocket.cs b/API/Controllers/GameHubSocket.cs index af8e0da..be4df3e 100644 --- a/API/Controllers/GameHubSocket.cs +++ b/API/Controllers/GameHubSocket.cs @@ -1,3 +1,5 @@ +using API.Models.DataClasses; +using API.Models.Game; using API.Services.GameManager; using Microsoft.AspNetCore.SignalR; @@ -7,18 +9,39 @@ public class GameHubSocket(IGameManager gameManager) : Hub { private readonly IGameManager _gameManager = gameManager; - public async Task CreateGame(string playerName) + public async Task CreateGame(string playerName, Coordinates gFs) { - // TODO: create - await Groups.AddToGroupAsync(Context.ConnectionId, "gameId"); - await Clients.Group("gameId").SendAsync("PlayerJoined", new + var player = new Player(playerName, Context.ConnectionId); + + var result = _gameManager.CreateGame(gFs, player); + + await Groups.AddToGroupAsync(Context.ConnectionId, result.Item1); + + await Clients.Caller.SendAsync("GameCreated", new { - Context.ConnectionId, - PlayerName = playerName + GameId = result.Item1, + GameCode = result.Item2, }); } - public async Task JoinGame(string gameId, string playerName) + public async Task JoinGame(int gameCode, string playerName) { + var player = new Player(playerName, Context.ConnectionId); + + var result = _gameManager.JoinGame(player, gameCode); + + if (result == null) + { + await Clients.Caller.SendAsync("Error", "Spiel nicht gefunden oder voll."); + return; + } + + await Groups.AddToGroupAsync(Context.ConnectionId, gameCode.ToString()); + + await Clients.Caller.SendAsync("GameCreated", new + { + GameId = result, + GameCode = gameCode, + }); } } \ No newline at end of file diff --git a/API/Models/Game/Player.cs b/API/Models/Game/Player.cs index b55c6e3..bc56f6e 100644 --- a/API/Models/Game/Player.cs +++ b/API/Models/Game/Player.cs @@ -1,7 +1,7 @@ namespace API.Models.Game; -public class Player +public class Player(string name, string connectionId) { - public string Name { get; set; } - public string ConnectionId { get; set; } + public string Name { get; set; } = name; + public string ConnectionId { get; set; } = connectionId; } \ No newline at end of file diff --git a/API/Services/GameManager/GameManager.cs b/API/Services/GameManager/GameManager.cs index c3561a1..47de874 100644 --- a/API/Services/GameManager/GameManager.cs +++ b/API/Services/GameManager/GameManager.cs @@ -6,17 +6,19 @@ namespace API.Services.GameManager; public class GameManager(IGameRepository gameRepository) : IGameManager { - public int CreateGame(Coordinates gFs, Player player) + public (string, int) CreateGame(Coordinates gFs, Player player) { var game = gameRepository.Create(gFs, player); - return game.GameCode; + return (game.Id, game.GameCode); } - public bool JoinGame(Player player, int gameCode) + public string? JoinGame(Player player, int gameCode) { var game = gameRepository.GetOne(new SixDigitInt(gameCode)); - return game != null && game.AddPlayer(player); + var success = game != null && game.AddPlayer(player); + + return success ? game?.Id : null; } } \ No newline at end of file diff --git a/API/Services/GameManager/IGameManager.cs b/API/Services/GameManager/IGameManager.cs index d17c3ef..a610346 100644 --- a/API/Services/GameManager/IGameManager.cs +++ b/API/Services/GameManager/IGameManager.cs @@ -4,6 +4,6 @@ namespace API.Services.GameManager; public interface IGameManager { - public int CreateGame(Coordinates gFs, Player player); - public bool JoinGame(Player playerName, int gameCode); + public (string, int) CreateGame(Coordinates gFs, Player player); + public string? JoinGame(Player playerName, int gameCode); } \ No newline at end of file