private async Task StartMatch(PlayerClient playerOne, PlayerClient playerTwo)
        {
            try
            {
                var playfabManager = new PlayfabManager();
                await playfabManager.LoginAsync(playerOne.GetId());

                await playfabManager.LoginAsync(playerTwo.GetId());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            var newGame = new GameInstance(playerOne, playerTwo);

            WaitingPlayers.Remove(playerOne);

            ActiveGames.Add(newGame);

            await newGame.UpdatePlayersWithGameState();
        }
        public async Task Invoke(HttpContext context)
        {
            if (!context.Request.Query.ContainsKey("game"))
            {
                await Next.Invoke(context);

                return;
            }

            if (context.Request.Query.ContainsKey("reset"))
            {
                foreach (var game in ActiveGames)
                {
                    await game.EndGameAsync();
                }
                ActiveGames.Clear();

                foreach (var player in WaitingPlayers)
                {
                    await player.CloseConnectionAsync();
                }

                return;
            }

            if (!context.WebSockets.IsWebSocketRequest)
            {
                await Next.Invoke(context);

                return;
            }

            string userId = null;

            if (context.Request.Query.ContainsKey("userid"))
            {
                StringValues stringValues;
                var          success = context.Request.Query.TryGetValue("userid", out stringValues);
                userId = success ? stringValues.First() : Guid.NewGuid().ToString();
            }

            if (userId == null)
            {
                userId = Guid.NewGuid().ToString();
            }

            var socket = await context.WebSockets.AcceptWebSocketAsync();

            var playerClient = new PlayerClient(userId, socket);

            await Receive(socket, async (result, buffer) =>
            {
                var game = ActiveGames.FirstOrDefault(g => g.GetPlayerIds().Contains(userId));

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    if (game != null)
                    {
                        await game.EndGameAsync();
                        ActiveGames.Remove(game);
                    }

                    return;
                }

                var bytesAsString = Encoding.UTF8.GetString(buffer, 0, result.Count);
                var playerMessage = JsonConvert.DeserializeObject <PlayerMessage>(bytesAsString);

                if (playerMessage.messageType == PlayerMessageTypeEnum.PaperScissorsRockChoice)
                {
                    //Player sent choice message but not in game
                    if (game == null)
                    {
                        return;
                    }

                    var playerChoice = JsonConvert.DeserializeObject <PaperScissorsRockPlayerMessage>(playerMessage.messageBody);
                    game.RecievePlayerUpdate(userId, playerMessage.messageBody);

                    await game.UpdatePlayersWithGameState();

                    if (game.IsGameComplete())
                    {
                        ActiveGames.Remove(game);
                    }
                }

                if (playerMessage.messageType == PlayerMessageTypeEnum.PaperScissorsRockQueueUp)
                {
                    await FindGame(playerClient);
                }
            });
        }