public override async Task <ViewFriendRequestsResponse> ViewFriendRequests(ViewFriendRequestsRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new ViewFriendRequestsResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            ViewFriendRequestsResponse response = new ViewFriendRequestsResponse();
            List <User> users = (await user.GetFriendRequests()).ConvertAll(input => input.asUser());

            response.IncomingFriends.AddRange(users);
            response.Status = ResponseFactory.createResponse(ResponseType.SUCCESS);
            return(response);
        }
        public override async Task <PlayerCurrentGamesResponse> GetPlayerCurrentGames(PlayerCurrentGamesRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new PlayerCurrentGamesResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            PlayerCurrentGamesResponse currentGameResponse = new PlayerCurrentGamesResponse();
            List <Room> rooms = (await user.GetActiveRooms()).ConvertAll(it => it.asRoom().Result);

            currentGameResponse.Games.AddRange(rooms);
            currentGameResponse.Status = ResponseFactory.createResponse(ResponseType.SUCCESS);
            return(currentGameResponse);
        }
        public override async Task <OpenLobbiesResponse> GetOpenLobbies(OpenLobbiesRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new OpenLobbiesResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            OpenLobbiesResponse roomResponse = new OpenLobbiesResponse();
            List <Room>         rooms        = (await RedisRoomModel.GetOpenLobbies()).ConvertAll(it => it.asRoom().Result);

            roomResponse.Rooms.AddRange(rooms);
            roomResponse.Status = ResponseFactory.createResponse(ResponseType.SUCCESS);

            return(roomResponse);
        }
        public override async Task <TResponse> UnaryServerHandler <TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod <TRequest, TResponse> continuation)
        {
            string calledMethod = context.Method.Split('/').Last();

            context.UserState["user"] = null;

            // Do not authorize these methods:
            string[] whitelist =
            {
                "Login",
                "LoginWithToken",
                "RegisterAccount",
                "HealthCheck",
            };

            if (!whitelist.Contains(calledMethod))
            {
                // The endpoint requires authorization before performing.
                // Get JWT header
                Metadata.Entry entry = context.RequestHeaders.Get("authorization");
                if (entry?.Value != null)
                {
                    if (JwtManager.ValidateToken(entry.Value, out var uuid))
                    {
                        // Validate user exists.
                        RedisUserModel user = await RedisUserModel.GetUserFromGuid(uuid);

                        if (user != null)
                        {
                            context.UserState["user"] = user;
                        }
                    }
                }
            }

            // Do regular request and return
            var response = await base.UnaryServerHandler(request, context, continuation);

            return(response);
        }
        public override async Task <BlockPlayerResponse> BlockPlayer(BlockPlayerRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new BlockPlayerResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            RedisUserModel friend = await RedisUserModel.GetUserFromGuid(request.UserIdToBlock);

            if (friend == null)
            {
                return new BlockPlayerResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.PLAYER_DOES_NOT_EXIST)
                       }
            }
            ;

            if (await user.IsBlocked(friend))
            {
                return new BlockPlayerResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.DUPLICATE)
                       }
            }
            ;

            await user.BlockUser(friend);

            return(new BlockPlayerResponse()
            {
                Status = ResponseFactory.createResponse(ResponseType.SUCCESS)
            });
        }
        public override async Task <DenyFriendRequestResponse> DenyFriendRequest(DenyFriendRequestRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new DenyFriendRequestResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            RedisUserModel friend = await RedisUserModel.GetUserFromGuid(request.FriendId);

            if (friend == null)
            {
                return new DenyFriendRequestResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.PLAYER_DOES_NOT_EXIST)
                       }
            }
            ;

            if (!await user.HasFriendRequestFrom(friend))
            {
                return new DenyFriendRequestResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.FRIEND_REQUEST_DOES_NOT_EXIST)
                       }
            }
            ;

            return(new DenyFriendRequestResponse()
            {
                Status = await user.RemoveFriendRequestFrom(friend),
            });
        }
        public override async Task <AuthorizationResponse> Login(AuthorizationRequest request, ServerCallContext context)
        {
            // Try to get a user
            RedisUserModel user = await RedisUserModel.GetUserFromUsername(request.Username);

            if (user == null || !JwtManager.VerifyPasswordHash(request.Password, user.UserModel.PasswordHash))
            {
                return new AuthorizationResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.INVALID_CREDENTIALS)
                       }
            }
            ;

            string token = JwtManager.GenerateToken(user.UserModel.Id);

            context.ResponseTrailers.Add("Authorization", token);
            return(new AuthorizationResponse
            {
                Token = token,
                User = user.asUser(),
                Status = ResponseFactory.createResponse(ResponseType.SUCCESS),
            });
        }
        public override async Task <GetMessageGroupsResponse> GetMessageGroups(GetMessageGroupsRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new GetMessageGroupsResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            RedisRoomModel room = await RedisRoomModel.GetRoomFromGuid(request.RoomId);

            if (room == null)
            {
                return new GetMessageGroupsResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.ROOM_DOES_NOT_EXIST)
                       }
            }
            ;

            List <GroupChatModel> groupChats = await room.GetPlayerGroupChats(user);

            GetMessageGroupsResponse response = new GetMessageGroupsResponse();

            foreach (var groupModel in groupChats)
            {
                response.MessageGroups.Add(await groupModel.asMessageGroup());
            }

            response.Status = ResponseFactory.createResponse(ResponseType.SUCCESS);
            return(response);
        }
        public override async Task <StartGameEarlyResponse> StartGameEarly(StartGameEarlyRequest request, ServerCallContext context)
        {
            RedisUserModel user = context.UserState["user"] as RedisUserModel;

            if (user == null)
            {
                return new StartGameEarlyResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            RedisRoomModel room = await RedisRoomModel.GetRoomFromGuid(request.RoomId);

            if (room == null)
            {
                return new StartGameEarlyResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.ROOM_DOES_NOT_EXIST)
                       }
            }
            ;

            if (room.RoomModel.CreatorId == user.UserModel.Id)
            {
                return(new StartGameEarlyResponse()
                {
                    Status = await room.StartGame(),
                });
            }
            return(new StartGameEarlyResponse()
            {
                Status = ResponseFactory.createResponse(ResponseType.PERMISSION_DENIED),
            });
        }
 public SuperUser CreateSuperUser()
 {
     return(RedisUserModel.CreateSuperUser().Result);
 }