public void Execute(Int32 gameID, Entities.User user, Entities.Enums.GamePlayerType playerType, Boolean forcedToLeave = false)
{
Entities.Filters.Game.Select filter = new Entities.Filters.Game.Select();
filter.GameID = gameID;
filter.DataToSelect = Entities.Enums.Game.Select.Rounds | Entities.Enums.Game.Select.GamePlayerCards;
Entities.Game game = _selectGame.Execute(filter);
Boolean wasWaiting = game.IsWaiting();
Boolean wasCurrentCommander = game.IsCurrentCommander(user.UserId) && playerType == Entities.Enums.GamePlayerType.Player;
Entities.GamePlayer player = null;
if (playerType == Entities.Enums.GamePlayerType.Player)
{
player = game.Players.Find(x => x.User.UserId == user.UserId);
game.Players.Remove(player);
game.PlayerCount--;
}
else
{
player = game.Spectators.Find(x => x.User.UserId == user.UserId);
game.Spectators.Remove(player);
game.SpectatorCount--;
}
if (wasCurrentCommander)
{
if (game.HasRounds())
{
Entities.GameRound current = game.CurrentRound();
if (!current.HasWinner())
{
game.Rounds.Remove(current);
game.RoundCount--;
Entities.Filters.GameRound.Delete deleteRoundFilter = new Entities.Filters.GameRound.Delete();
deleteRoundFilter.GameRoundID = current.GameRoundID;
_deleteRound.Execute(deleteRoundFilter);
}
}
Boolean started = false;
if (game.PlayerCount > 0)
{
started = _startRound.Execute(game, game.NextCommander(null));
}
if (game.HasRounds() && started)
{
_sendMessage.CommanderLeft(game, user.DisplayName);
}
else
{
_sendMessage.UpdateGame(game, true);
}
}
else if (game.IsWaiting() && wasWaiting)
{
_sendMessage.UpdateWaiting(game, true);
}
else
{
if (game.HasRounds())
{
Entities.GameRound current = game.CurrentRound();
current.CurrentPlayerCount--;
if(!game.Players.Any(x => x.Hand.Count > 0 && !current.IsCommander(x.User.UserId)))
{
if (!current.HasWinner() && current.Answers.Count == 0)
{
_dealCards.Execute(game, false);
}
}
}
_sendMessage.UpdateGame(game, true, (forcedToLeave ? (int?)user.UserId : null));
}
_leaveGame.Execute(gameID, user, playerType);
}