protected override async Task HandleCommandAsync(JoinGameCommand command, IMediationContext mediationContext, CancellationToken cancellationToken)
        {
            var gameContext = mediationContext as GameContext;
            var game        = _gameManager.GetGame(command.GameCode);

            var player = new Player()
            {
                Initials = command.PlayerInitials
            };

            game.Players.TryAdd(player.Initials, player);

            _gameConnectionIdStore.StorePlayerConnectionIdForGame(command.GameCode, command.PlayerInitials, gameContext.ConnectionId);

            gameContext.GameCode      = command.GameCode;
            gameContext.PlayerIntials = command.PlayerInitials;

            // TODO: refactor into own handler
            var playerDetails = game.Players.Values
                                .Select(p => new PlayerDetails {
                Intials = p.Initials, Ready = p.Ready
            })
                                .ToList();

            await _clientMessageDispatcherFactory
            .CreateClientMessageDispatcher(x => x.UpdatePlayersList(playerDetails))
            .SendToAllGameClients(command.GameCode);
        }
        protected override async Task HandleCommandAsync(PlayerReadyCommand command, IMediationContext mediationContext, CancellationToken cancellationToken)
        {
            var gameContext = mediationContext as GameContext;
            var player      = gameContext.Game.Players
                              .Where(o => o.Key == gameContext.PlayerIntials)
                              .SingleOrDefault()
                              .Value;

            player.Ready = command.Ready;

            //var playerDetails = _mapper.ProjectTo<Dispatchers.Models.PlayerDetails>(request.GameState.Players.Values.AsQueryable()).ToList();
            var playerDetails = gameContext.Game.Players.Values.Select(p => new PlayerDetails {
                Intials = p.Initials, Ready = p.Ready
            }).ToList();
            await _clientMessageDispatcherFactory
            .CreateClientMessageDispatcher(x => x.UpdatePlayersList(playerDetails))
            .SendToAllGameClients(gameContext.GameCode);

            var allPlayersReady = gameContext.Game.Players.All(o => o.Value.Ready);

            if (allPlayersReady && gameContext.Game.Players.Count > 4 || gameContext.Game.Players.Count == 1)
            {
                if (gameContext.Game.CurrentState == GameState.GamePending)
                {
                    await _clientMessageDispatcherFactory
                    .CreateClientMessageDispatcher(x => x.Countdown(true))
                    .SendToAllGameClients(gameContext.GameCode);
                }
                else
                {
                    await _clientMessageDispatcherFactory
                    .CreateClientMessageDispatcher(x => x.ShowLeaderScript(true))
                    .SendToAllGameClients(gameContext.GameCode);
                }
            }
        }
        protected override async Task HandleCommandAsync(StartGameCommand command, IMediationContext mediationContext, CancellationToken cancellationToken)
        {
            var gameContext = mediationContext as GameContext;
            var gameReady   = gameContext.Game.Players.All(o => o.Value.Ready);

            // TODO: Add validation

            gameContext.Game.CurrentState = GameState.Started;
            foreach (var playerReset in gameContext.Game.Players)
            {
                playerReset.Value.Ready = false;
            }

            var players = gameContext.Game.Players.Values.ToList();

            _characterAssignment.AssignRoles(players);

            foreach (var player in players)
            {
                var playerCharacterNotification = new ShowCharacterNotification()
                {
                    Role = player.Character.Role,
                    Team = player.Character.Team
                };

                await _clientMessageDispatcherFactory
                .CreateClientMessageDispatcher(x => x.ShowCharacter(playerCharacterNotification))
                .SendToPlayerInGame(gameContext.GameCode, player.Initials);
            }

            gameContext.Game.SortedPlayers = _playerOrderInitialisation.GetSortedPlayers(players);
            gameContext.Game.Missions      = _missionInitialisation.InitiliseMissions(players.Count);

            var firstMission = gameContext.Game.Missions.Where(o => o.Number == 1).SingleOrDefault();

            firstMission.Team.Leader = gameContext.Game.SortedPlayers.First();

            //TODO broadcast mission update
        }