mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 20:03:22 +08:00
Merge pull request #19098 from peppy/last-played
Add "last played" sort mode to song select
This commit is contained in:
commit
7ed05277f8
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
@ -59,6 +60,20 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
|
|
||||||
protected override bool AllowFail => false;
|
protected override bool AllowFail => false;
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestLastPlayedUpdated()
|
||||||
|
{
|
||||||
|
DateTimeOffset? getLastPlayed() => Realm.Run(r => r.Find<BeatmapInfo>(Beatmap.Value.BeatmapInfo.ID)?.LastPlayed);
|
||||||
|
|
||||||
|
AddStep("set no custom ruleset", () => customRuleset = null);
|
||||||
|
AddAssert("last played is null", () => getLastPlayed() == null);
|
||||||
|
|
||||||
|
CreateTest();
|
||||||
|
|
||||||
|
AddUntilStep("wait for track to start running", () => Beatmap.Value.Track.IsRunning);
|
||||||
|
AddUntilStep("wait for last played to update", () => getLastPlayed() != null);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestScoreStoredLocally()
|
public void TestScoreStoredLocally()
|
||||||
{
|
{
|
||||||
|
@ -111,6 +111,11 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
public bool SamplesMatchPlaybackRate { get; set; } = true;
|
public bool SamplesMatchPlaybackRate { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The time at which this beatmap was last played by the local user.
|
||||||
|
/// </summary>
|
||||||
|
public DateTimeOffset? LastPlayed { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The ratio of distance travelled per time unit.
|
/// The ratio of distance travelled per time unit.
|
||||||
/// Generally used to decouple the spacing between hit objects from the enforced "velocity" of the beatmap (see <see cref="DifficultyControlPoint.SliderVelocity"/>).
|
/// Generally used to decouple the spacing between hit objects from the enforced "velocity" of the beatmap (see <see cref="DifficultyControlPoint.SliderVelocity"/>).
|
||||||
|
@ -58,8 +58,9 @@ namespace osu.Game.Database
|
|||||||
/// 12 2021-11-24 Add Status to RealmBeatmapSet.
|
/// 12 2021-11-24 Add Status to RealmBeatmapSet.
|
||||||
/// 13 2022-01-13 Final migration of beatmaps and scores to realm (multiple new storage fields).
|
/// 13 2022-01-13 Final migration of beatmaps and scores to realm (multiple new storage fields).
|
||||||
/// 14 2022-03-01 Added BeatmapUserSettings to BeatmapInfo.
|
/// 14 2022-03-01 Added BeatmapUserSettings to BeatmapInfo.
|
||||||
|
/// 15 2022-07-13 Added LastPlayed to BeatmapInfo.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const int schema_version = 14;
|
private const int schema_version = 15;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Lock object which is held during <see cref="BlockAllOperations"/> sections, blocking realm retrieval during blocking periods.
|
/// Lock object which is held during <see cref="BlockAllOperations"/> sections, blocking realm retrieval during blocking periods.
|
||||||
|
@ -11,6 +11,8 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Database;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
@ -117,6 +119,23 @@ namespace osu.Game.Screens.Play
|
|||||||
await submitScore(score).ConfigureAwait(false);
|
await submitScore(score).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private RealmAccess realm { get; set; }
|
||||||
|
|
||||||
|
protected override void StartGameplay()
|
||||||
|
{
|
||||||
|
base.StartGameplay();
|
||||||
|
|
||||||
|
// User expectation is that last played should be updated when entering the gameplay loop
|
||||||
|
// from multiplayer / playlists / solo.
|
||||||
|
realm.WriteAsync(r =>
|
||||||
|
{
|
||||||
|
var realmBeatmap = r.Find<BeatmapInfo>(Beatmap.Value.BeatmapInfo.ID);
|
||||||
|
if (realmBeatmap != null)
|
||||||
|
realmBeatmap.LastPlayed = DateTimeOffset.Now;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public override bool OnExiting(ScreenExitEvent e)
|
public override bool OnExiting(ScreenExitEvent e)
|
||||||
{
|
{
|
||||||
bool exiting = base.OnExiting(e);
|
bool exiting = base.OnExiting(e);
|
||||||
|
@ -81,6 +81,9 @@ namespace osu.Game.Screens.Select.Carousel
|
|||||||
case SortMode.DateAdded:
|
case SortMode.DateAdded:
|
||||||
return otherSet.BeatmapSet.DateAdded.CompareTo(BeatmapSet.DateAdded);
|
return otherSet.BeatmapSet.DateAdded.CompareTo(BeatmapSet.DateAdded);
|
||||||
|
|
||||||
|
case SortMode.LastPlayed:
|
||||||
|
return -compareUsingAggregateMax(otherSet, b => (b.LastPlayed ?? DateTimeOffset.MinValue).ToUnixTimeSeconds());
|
||||||
|
|
||||||
case SortMode.BPM:
|
case SortMode.BPM:
|
||||||
return compareUsingAggregateMax(otherSet, b => b.BPM);
|
return compareUsingAggregateMax(otherSet, b => b.BPM);
|
||||||
|
|
||||||
|
@ -23,6 +23,9 @@ namespace osu.Game.Screens.Select.Filter
|
|||||||
[Description("Date Added")]
|
[Description("Date Added")]
|
||||||
DateAdded,
|
DateAdded,
|
||||||
|
|
||||||
|
[Description("Last Played")]
|
||||||
|
LastPlayed,
|
||||||
|
|
||||||
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchSortingDifficulty))]
|
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchSortingDifficulty))]
|
||||||
Difficulty,
|
Difficulty,
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user