/// <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); }
/// <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); }
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); }; }