Exemplo n.º 1
0
        /// <summary>
        /// Handles an API request, while also updating the local state to match
        /// how the server would eventually respond and update an <see cref="RoomManager"/>.
        /// </summary>
        /// <param name="request">The API request to handle.</param>
        /// <param name="localUser">The local user to store in responses where required.</param>
        /// <param name="beatmapManager">The beatmap manager to attempt to retrieve beatmaps from, prior to returning dummy beatmaps.</param>
        /// <returns>Whether the request was successfully handled.</returns>
        public bool HandleRequest(APIRequest request, APIUser localUser, BeatmapManager beatmapManager)
        {
            switch (request)
            {
            case CreateRoomRequest createRoomRequest:
                var apiRoom = new Room();

                apiRoom.CopyFrom(createRoomRequest.Room);

                // Passwords are explicitly not copied between rooms.
                apiRoom.HasPassword.Value = !string.IsNullOrEmpty(createRoomRequest.Room.Password.Value);
                apiRoom.Password.Value    = createRoomRequest.Room.Password.Value;

                AddServerSideRoom(apiRoom, localUser);

                var responseRoom = new APICreatedRoom();
                responseRoom.CopyFrom(createResponseRoom(apiRoom, false));

                createRoomRequest.TriggerSuccess(responseRoom);
                return(true);

            case JoinRoomRequest joinRoomRequest:
            {
                var room = ServerSideRooms.Single(r => r.RoomID.Value == joinRoomRequest.Room.RoomID.Value);

                if (joinRoomRequest.Password != room.Password.Value)
                {
                    joinRoomRequest.TriggerFailure(new InvalidOperationException("Invalid password."));
                    return(true);
                }

                joinRoomRequest.TriggerSuccess();
                return(true);
            }

            case GetRoomLeaderboardRequest roomLeaderboardRequest:
                roomLeaderboardRequest.TriggerSuccess(new APILeaderboard
                {
                    Leaderboard = new List <APIUserScoreAggregate>
                    {
                        new APIUserScoreAggregate
                        {
                            TotalScore        = 1000000,
                            TotalAttempts     = 5,
                            CompletedBeatmaps = 2,
                            User = new APIUser {
                                Username = "******"
                            }
                        },
                        new APIUserScoreAggregate
                        {
                            TotalScore        = 50,
                            TotalAttempts     = 1,
                            CompletedBeatmaps = 1,
                            User = new APIUser {
                                Username = "******"
                            }
                        }
                    }
                });
                return(true);

            case PartRoomRequest partRoomRequest:
                partRoomRequest.TriggerSuccess();
                return(true);

            case GetRoomsRequest getRoomsRequest:
                var roomsWithoutParticipants = new List <Room>();

                foreach (var r in ServerSideRooms)
                {
                    roomsWithoutParticipants.Add(createResponseRoom(r, false));
                }

                getRoomsRequest.TriggerSuccess(roomsWithoutParticipants);
                return(true);

            case GetRoomRequest getRoomRequest:
                getRoomRequest.TriggerSuccess(createResponseRoom(ServerSideRooms.Single(r => r.RoomID.Value == getRoomRequest.RoomId), true));
                return(true);

            case CreateRoomScoreRequest createRoomScoreRequest:
                createRoomScoreRequest.TriggerSuccess(new APIScoreToken {
                    ID = 1
                });
                return(true);

            case SubmitRoomScoreRequest submitRoomScoreRequest:
                submitRoomScoreRequest.TriggerSuccess(new MultiplayerScore
                {
                    ID         = currentScoreId++,
                    Accuracy   = 1,
                    EndedAt    = DateTimeOffset.Now,
                    Passed     = true,
                    Rank       = ScoreRank.S,
                    MaxCombo   = 1000,
                    TotalScore = 1000000,
                    User       = localUser,
                    Statistics = new Dictionary <HitResult, int>()
                });
                return(true);

            case GetBeatmapsRequest getBeatmapsRequest:
                var result = new List <APIBeatmap>();

                foreach (int id in getBeatmapsRequest.BeatmapIds)
                {
                    var baseBeatmap = beatmapManager.QueryBeatmap(b => b.OnlineID == id);

                    if (baseBeatmap == null)
                    {
                        baseBeatmap = new TestBeatmap(new RulesetInfo {
                            OnlineID = 0
                        }).BeatmapInfo;
                        baseBeatmap.OnlineID = id;
                        baseBeatmap.BeatmapSet !.OnlineID = id;
                    }

                    result.Add(OsuTestScene.CreateAPIBeatmap(baseBeatmap));
                }

                getBeatmapsRequest.TriggerSuccess(new GetBeatmapsResponse {
                    Beatmaps = result
                });
                return(true);
            }

            return(false);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Handles an API request, while also updating the local state to match
        /// how the server would eventually respond and update an <see cref="RoomManager"/>.
        /// </summary>
        /// <param name="request">The API request to handle.</param>
        /// <param name="localUser">The local user to store in responses where required.</param>
        /// <param name="game">The game base for cases where actual online requests need to be sent.</param>
        /// <returns>Whether the request was successfully handled.</returns>
        public bool HandleRequest(APIRequest request, User localUser, OsuGameBase game)
        {
            switch (request)
            {
            case CreateRoomRequest createRoomRequest:
                var apiRoom = new Room();

                apiRoom.CopyFrom(createRoomRequest.Room);

                // Passwords are explicitly not copied between rooms.
                apiRoom.HasPassword.Value = !string.IsNullOrEmpty(createRoomRequest.Room.Password.Value);
                apiRoom.Password.Value    = createRoomRequest.Room.Password.Value;

                AddServerSideRoom(apiRoom);

                var responseRoom = new APICreatedRoom();
                responseRoom.CopyFrom(createResponseRoom(apiRoom, false));

                createRoomRequest.TriggerSuccess(responseRoom);
                return(true);

            case JoinRoomRequest joinRoomRequest:
            {
                var room = ServerSideRooms.Single(r => r.RoomID.Value == joinRoomRequest.Room.RoomID.Value);

                if (joinRoomRequest.Password != room.Password.Value)
                {
                    joinRoomRequest.TriggerFailure(new InvalidOperationException("Invalid password."));
                    return(true);
                }

                joinRoomRequest.TriggerSuccess();
                return(true);
            }

            case PartRoomRequest partRoomRequest:
                partRoomRequest.TriggerSuccess();
                return(true);

            case GetRoomsRequest getRoomsRequest:
                var roomsWithoutParticipants = new List <Room>();

                foreach (var r in ServerSideRooms)
                {
                    roomsWithoutParticipants.Add(createResponseRoom(r, false));
                }

                getRoomsRequest.TriggerSuccess(roomsWithoutParticipants);
                return(true);

            case GetRoomRequest getRoomRequest:
                getRoomRequest.TriggerSuccess(createResponseRoom(ServerSideRooms.Single(r => r.RoomID.Value == getRoomRequest.RoomId), true));
                return(true);

            case GetBeatmapSetRequest getBeatmapSetRequest:
                var onlineReq = new GetBeatmapSetRequest(getBeatmapSetRequest.ID, getBeatmapSetRequest.Type);
                onlineReq.Success += res => getBeatmapSetRequest.TriggerSuccess(res);
                onlineReq.Failure += e => getBeatmapSetRequest.TriggerFailure(e);

                // Get the online API from the game's dependencies.
                game.Dependencies.Get <IAPIProvider>().Queue(onlineReq);
                return(true);

            case CreateRoomScoreRequest createRoomScoreRequest:
                createRoomScoreRequest.TriggerSuccess(new APIScoreToken {
                    ID = 1
                });
                return(true);

            case SubmitRoomScoreRequest submitRoomScoreRequest:
                submitRoomScoreRequest.TriggerSuccess(new MultiplayerScore
                {
                    ID         = currentScoreId++,
                    Accuracy   = 1,
                    EndedAt    = DateTimeOffset.Now,
                    Passed     = true,
                    Rank       = ScoreRank.S,
                    MaxCombo   = 1000,
                    TotalScore = 1000000,
                    User       = localUser,
                    Statistics = new Dictionary <HitResult, int>()
                });
                return(true);
            }

            return(false);
        }
Exemplo n.º 3
0
        private void load()
        {
            int currentScoreId        = 0;
            int currentRoomId         = 0;
            int currentPlaylistItemId = 0;

            ((DummyAPIAccess)api).HandleRequest = req =>
            {
                switch (req)
                {
                case CreateRoomRequest createRoomRequest:
                    var createdRoom = new APICreatedRoom();

                    createdRoom.CopyFrom(createRoomRequest.Room);
                    createdRoom.RoomID.Value ??= currentRoomId++;

                    for (int i = 0; i < createdRoom.Playlist.Count; i++)
                    {
                        createdRoom.Playlist[i].ID = currentPlaylistItemId++;
                    }

                    Rooms.Add(createdRoom);
                    createRoomRequest.TriggerSuccess(createdRoom);
                    return(true);

                case JoinRoomRequest joinRoomRequest:
                    joinRoomRequest.TriggerSuccess();
                    return(true);

                case PartRoomRequest partRoomRequest:
                    partRoomRequest.TriggerSuccess();
                    return(true);

                case GetRoomsRequest getRoomsRequest:
                    var roomsWithoutParticipants = new List <Room>();

                    foreach (var r in Rooms)
                    {
                        var newRoom = new Room();

                        newRoom.CopyFrom(r);
                        newRoom.RecentParticipants.Clear();

                        roomsWithoutParticipants.Add(newRoom);
                    }

                    getRoomsRequest.TriggerSuccess(roomsWithoutParticipants);
                    return(true);

                case GetRoomRequest getRoomRequest:
                    getRoomRequest.TriggerSuccess(Rooms.Single(r => r.RoomID.Value == getRoomRequest.RoomId));
                    return(true);

                case GetBeatmapSetRequest getBeatmapSetRequest:
                    var onlineReq = new GetBeatmapSetRequest(getBeatmapSetRequest.ID, getBeatmapSetRequest.Type);
                    onlineReq.Success += res => getBeatmapSetRequest.TriggerSuccess(res);
                    onlineReq.Failure += e => getBeatmapSetRequest.TriggerFailure(e);

                    // Get the online API from the game's dependencies.
                    game.Dependencies.Get <IAPIProvider>().Queue(onlineReq);
                    return(true);

                case CreateRoomScoreRequest createRoomScoreRequest:
                    createRoomScoreRequest.TriggerSuccess(new APIScoreToken {
                        ID = 1
                    });
                    return(true);

                case SubmitRoomScoreRequest submitRoomScoreRequest:
                    submitRoomScoreRequest.TriggerSuccess(new MultiplayerScore
                    {
                        ID         = currentScoreId++,
                        Accuracy   = 1,
                        EndedAt    = DateTimeOffset.Now,
                        Passed     = true,
                        Rank       = ScoreRank.S,
                        MaxCombo   = 1000,
                        TotalScore = 1000000,
                        User       = api.LocalUser.Value,
                        Statistics = new Dictionary <HitResult, int>()
                    });
                    return(true);
                }

                return(false);
            };
        }
        private void load()
        {
            int currentScoreId = 0;

            // Handling here is pretending to be a server, while also updating the local state to match
            // how the server would eventually respond and update the RoomManager.
            ((DummyAPIAccess)api).HandleRequest = req =>
            {
                switch (req)
                {
                case CreateRoomRequest createRoomRequest:
                    var apiRoom = new Room();

                    apiRoom.CopyFrom(createRoomRequest.Room);

                    // Passwords are explicitly not copied between rooms.
                    apiRoom.HasPassword.Value = !string.IsNullOrEmpty(createRoomRequest.Room.Password.Value);
                    apiRoom.Password.Value    = createRoomRequest.Room.Password.Value;

                    AddRoom(apiRoom);

                    var responseRoom = new APICreatedRoom();
                    responseRoom.CopyFrom(createResponseRoom(apiRoom, false));

                    createRoomRequest.TriggerSuccess(responseRoom);
                    return(true);

                case JoinRoomRequest joinRoomRequest:
                {
                    var room = Rooms.Single(r => r.RoomID.Value == joinRoomRequest.Room.RoomID.Value);

                    if (joinRoomRequest.Password != room.Password.Value)
                    {
                        joinRoomRequest.TriggerFailure(new InvalidOperationException("Invalid password."));
                        return(true);
                    }

                    joinRoomRequest.TriggerSuccess();
                    return(true);
                }

                case PartRoomRequest partRoomRequest:
                    partRoomRequest.TriggerSuccess();
                    return(true);

                case GetRoomsRequest getRoomsRequest:
                    var roomsWithoutParticipants = new List <Room>();

                    foreach (var r in Rooms)
                    {
                        roomsWithoutParticipants.Add(createResponseRoom(r, false));
                    }

                    getRoomsRequest.TriggerSuccess(roomsWithoutParticipants);
                    return(true);

                case GetRoomRequest getRoomRequest:
                    getRoomRequest.TriggerSuccess(createResponseRoom(Rooms.Single(r => r.RoomID.Value == getRoomRequest.RoomId), true));
                    return(true);

                case GetBeatmapSetRequest getBeatmapSetRequest:
                    var onlineReq = new GetBeatmapSetRequest(getBeatmapSetRequest.ID, getBeatmapSetRequest.Type);
                    onlineReq.Success += res => getBeatmapSetRequest.TriggerSuccess(res);
                    onlineReq.Failure += e => getBeatmapSetRequest.TriggerFailure(e);

                    // Get the online API from the game's dependencies.
                    game.Dependencies.Get <IAPIProvider>().Queue(onlineReq);
                    return(true);

                case CreateRoomScoreRequest createRoomScoreRequest:
                    createRoomScoreRequest.TriggerSuccess(new APIScoreToken {
                        ID = 1
                    });
                    return(true);

                case SubmitRoomScoreRequest submitRoomScoreRequest:
                    submitRoomScoreRequest.TriggerSuccess(new MultiplayerScore
                    {
                        ID         = currentScoreId++,
                        Accuracy   = 1,
                        EndedAt    = DateTimeOffset.Now,
                        Passed     = true,
                        Rank       = ScoreRank.S,
                        MaxCombo   = 1000,
                        TotalScore = 1000000,
                        User       = api.LocalUser.Value,
                        Statistics = new Dictionary <HitResult, int>()
                    });
                    return(true);
                }

                return(false);
            };
        }