public IActionResult PostCreateGame([FromBody] Validators.GameCreate gameCreate)
        {
            Result result = this.CreateGame(gameCreate);

            if (result.ResultFunc == this.Ok)
            {
                PusherServer.Pusher pusher = Pusher.Pusher.Create();

                GameData game = (GameData)result.Data;
                //check if there is a player 2
                if (game.user2.id != null)
                {
                    pusher.TriggerAsync(channelName: this.PRIVATE_USER_CHANNELNAME + ((GameData)result.Data).user2.id, eventName: "game_invite", data: result.Data);
                }
                else
                {
                    pusher.TriggerAsync(channelName: this.PUBLIC_GAME_CHANNEL, eventName: "game_created", data: result.Data, options: new TriggerOptions()
                    {
                        SocketId = gameCreate.socket_id
                    });
                }
            }

            return(result.ResultFunc(result.Data));
        }
        public Result CreateGame(Validators.GameCreate gameCreate)
        {
            if (ModelState.IsValid == false)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "Incorrect post data"
                });
            }

            User user   = (User)HttpContext.Items["user"];
            User user_2 = this.db.Users.SingleOrDefault(x => x.email == gameCreate.opponent_email);

            if (gameCreate.opponent_email != null && user_2 == null)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "The user you're trying to invite does not exist."
                });
            }

            int status = (user_2 == null) ? GameStatus.waiting_join : GameStatus.waiting_invite;

            //Check if the user already has an active lobby.
            if (status == GameStatus.waiting_join)
            {
                List <Game> lobbies = this.db.Games.Where(x => x.User1 == user && x.status == GameStatus.waiting_join).ToList();
                if (lobbies.Count > 0)
                {
                    return(new Result {
                        ResultFunc = this.BadRequest, Data = "You already have an active lobby."
                    });
                }
            }

            //Check if the user is trying to invite himself.
            if (user == user_2)
            {
                return(new Result {
                    ResultFunc = this.BadRequest, Data = "You can't play against yourself."
                });
            }

            Game game = new Game
            {
                User1  = user,
                User2  = user_2,
                status = status
            };

            this.db.Add(game);
            this.db.SaveChanges();

            return(new Result {
                ResultFunc = this.Ok, Data = this.FilterGameResults(game)
            });
        }