using API.Controllers; using API.Models.DataClasses; using API.Models.Game; using API.Repository.GameRepo; using Microsoft.AspNetCore.SignalR; namespace API.Services.GameManager; public class GameManager(IGameRepository gameRepository, IHubContext hubContext) : IGameManager { public (string, int) CreateGame(Coordinates gFs, Player player) { var game = gameRepository.Create(gFs); game.AddPlayer(player); return (game.Id, game.GameCode); } public async Task JoinGame(Player player, int gameCode) { var game = gameRepository.GetOne(new SixDigitInt(gameCode)); var success = game != null && game.State == GameState.Lobby && game.AddPlayer(player); if (!success) return null; if (game.Players.Count == 2) { game.StartGame(); await hubContext.Clients.Group(game.Id).SendAsync("GameStarted", game.Players); } return game.Id; } public async Task RequestGameInformation(string gameId, string playerConnectionId) { var game = gameRepository.GetOne(gameId); if (game == null) return; var gameInfoDto = new GameInformationDto { Players = game?.Players, CurrentField = game?.Field.CurrentField, State = game?.State }; await hubContext.Clients.Client(playerConnectionId).SendAsync("GameInformation", gameInfoDto); } public async Task Drop(string gameCode, int column, string playerConnectionId) { var game = gameRepository.GetOne(gameCode); var player = game?.GetPlayerByConnectionId(playerConnectionId); if (player == null) return; var result = game.Field.Drop(column, player.PlayerTag); if (result != DropResult.Placed) { await hubContext.Clients.Client(playerConnectionId).SendAsync("Error", "Ungültiger Zug."); return; } await hubContext.Clients.Group(game.Id).SendAsync("FieldUpdated", game.Field.CurrentField); var winResult = game.Field.CheckForWin(); if (winResult != 0) { var winPlayer = game.GetPlayerByTag(winResult); game.EndGame(); await hubContext.Clients.Group(game.Id).SendAsync("GameEnded", new { Method = "Win", Player = winPlayer }); } if (game.Field.IsFull()) { game.EndGame(); await hubContext.Clients.Group(game.Id).SendAsync("GameEnded", new { Method = "Draw" }); } } public Task DisconnectedPlayer(string playerConnectionId) { var game = gameRepository.GetOneByConnectionId(playerConnectionId); if (game == null) return Task.CompletedTask; var player = game.GetPlayerByConnectionId(playerConnectionId); if (player == null) return Task.CompletedTask; game.RemovePlayer(playerConnectionId); game.EndGame(); return hubContext.Clients.Group(game.Id).SendAsync("GameEnded", new { Method = "PlayerDisconnected", Player = player }); } }