2020-12-18 23:15:41 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic ;
2021-01-12 17:05:29 +08:00
using System.Linq ;
2020-12-18 23:15:41 +08:00
using System.Threading.Tasks ;
using osu.Framework.Allocation ;
using osu.Framework.Bindables ;
2020-12-25 12:38:11 +08:00
using osu.Game.Online.Rooms ;
2020-12-18 23:15:41 +08:00
2020-12-25 23:50:00 +08:00
namespace osu.Game.Screens.OnlinePlay.Components
2020-12-18 23:15:41 +08:00
{
/// <summary>
/// A <see cref="RoomPollingComponent"/> that polls for the currently-selected room.
/// </summary>
public class SelectionPollingComponent : RoomPollingComponent
{
[Resolved]
private Bindable < Room > selectedRoom { get ; set ; }
[Resolved]
private IRoomManager roomManager { get ; set ; }
[BackgroundDependencyLoader]
private void load ( )
{
selectedRoom . BindValueChanged ( _ = >
{
if ( IsLoaded )
PollImmediately ( ) ;
} ) ;
}
private GetRoomRequest pollReq ;
protected override Task Poll ( )
{
if ( ! API . IsLoggedIn )
return base . Poll ( ) ;
if ( selectedRoom . Value ? . RoomID . Value = = null )
return base . Poll ( ) ;
var tcs = new TaskCompletionSource < bool > ( ) ;
pollReq ? . Cancel ( ) ;
pollReq = new GetRoomRequest ( selectedRoom . Value . RoomID . Value . Value ) ;
pollReq . Success + = result = >
{
2021-01-12 17:05:29 +08:00
// existing rooms need to be ordered by their position because the received of NotifyRoomsReceives expects to be able to sort them based on this order.
var rooms = new List < Room > ( roomManager . Rooms . OrderBy ( r = > r . Position . Value ) ) ;
2020-12-18 23:15:41 +08:00
2020-12-18 23:52:32 +08:00
int index = rooms . FindIndex ( r = > r . RoomID . Value = = result . RoomID . Value ) ;
2021-01-12 17:05:29 +08:00
2020-12-18 23:15:41 +08:00
if ( index < 0 )
return ;
rooms [ index ] = result ;
NotifyRoomsReceived ( rooms ) ;
tcs . SetResult ( true ) ;
} ;
pollReq . Failure + = _ = > tcs . SetResult ( false ) ;
API . Queue ( pollReq ) ;
return tcs . Task ;
}
}
}