mirror of
https://github.com/osukey/osukey.git
synced 2025-08-08 00:53:56 +09:00
Merge branch 'master' into add_linux_hardlink
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" package="sh.ppy.osulazer" android:installLocation="auto" android:versionName="0.1.0">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sh.ppy.osulazer" android:installLocation="auto">
|
||||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31" />
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31" />
|
||||||
<application android:allowBackup="true" android:supportsRtl="true" android:label="osu!" android:icon="@drawable/lazer" />
|
<application android:allowBackup="true" android:supportsRtl="true" android:label="osu!" android:icon="@drawable/lazer" />
|
||||||
</manifest>
|
</manifest>
|
@ -8,6 +8,9 @@
|
|||||||
<UseMauiEssentials>true</UseMauiEssentials>
|
<UseMauiEssentials>true</UseMauiEssentials>
|
||||||
<!-- This currently causes random lockups during gameplay. https://github.com/mono/mono/issues/18973 -->
|
<!-- This currently causes random lockups during gameplay. https://github.com/mono/mono/issues/18973 -->
|
||||||
<EnableLLVM>false</EnableLLVM>
|
<EnableLLVM>false</EnableLLVM>
|
||||||
|
<Version>0.0.0</Version>
|
||||||
|
<ApplicationVersion Condition=" '$(ApplicationVersion)' == '' ">1</ApplicationVersion>
|
||||||
|
<ApplicationDisplayVersion Condition=" '$(ApplicationDisplayVersion)' == '' ">$(Version)</ApplicationDisplayVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\osu.Game.Rulesets.Catch\osu.Game.Rulesets.Catch.csproj" />
|
<ProjectReference Include="..\osu.Game.Rulesets.Catch\osu.Game.Rulesets.Catch.csproj" />
|
||||||
|
@ -201,6 +201,22 @@ namespace osu.Game.Tests.Visual.Menus
|
|||||||
AddAssert("volume not changed", () => Audio.Volume.Value == 0.5);
|
AddAssert("volume not changed", () => Audio.Volume.Value == 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestRulesetSelectorOverflow()
|
||||||
|
{
|
||||||
|
AddStep("set toolbar width", () =>
|
||||||
|
{
|
||||||
|
toolbar.RelativeSizeAxes = Axes.None;
|
||||||
|
toolbar.Width = 0;
|
||||||
|
});
|
||||||
|
AddStep("move mouse over news toggle button", () =>
|
||||||
|
{
|
||||||
|
var button = toolbar.ChildrenOfType<ToolbarNewsButton>().Single();
|
||||||
|
InputManager.MoveMouseTo(button);
|
||||||
|
});
|
||||||
|
AddAssert("no ruleset toggle buttons hovered", () => !toolbar.ChildrenOfType<ToolbarRulesetTabButton>().Any(button => button.IsHovered));
|
||||||
|
}
|
||||||
|
|
||||||
public partial class TestToolbar : Toolbar
|
public partial class TestToolbar : Toolbar
|
||||||
{
|
{
|
||||||
public new Bindable<OverlayActivation> OverlayActivationMode => base.OverlayActivationMode as Bindable<OverlayActivation>;
|
public new Bindable<OverlayActivation> OverlayActivationMode => base.OverlayActivationMode as Bindable<OverlayActivation>;
|
||||||
|
@ -35,6 +35,8 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
private Action<GetUsersRequest>? handleGetUsersRequest;
|
private Action<GetUsersRequest>? handleGetUsersRequest;
|
||||||
private Action<GetUserRequest>? handleGetUserRequest;
|
private Action<GetUserRequest>? handleGetUserRequest;
|
||||||
|
|
||||||
|
private IDisposable? subscription;
|
||||||
|
|
||||||
private readonly Dictionary<(int userId, string rulesetName), UserStatistics> serverSideStatistics = new Dictionary<(int userId, string rulesetName), UserStatistics>();
|
private readonly Dictionary<(int userId, string rulesetName), UserStatistics> serverSideStatistics = new Dictionary<(int userId, string rulesetName), UserStatistics>();
|
||||||
|
|
||||||
[SetUpSteps]
|
[SetUpSteps]
|
||||||
@ -246,6 +248,26 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
AddAssert("values after are correct", () => update!.After.TotalScore, () => Is.EqualTo(6_000_000));
|
AddAssert("values after are correct", () => update!.After.TotalScore, () => Is.EqualTo(6_000_000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStatisticsUpdateNotFiredAfterSubscriptionDisposal()
|
||||||
|
{
|
||||||
|
int userId = getUserId();
|
||||||
|
setUpUser(userId);
|
||||||
|
|
||||||
|
long scoreId = getScoreId();
|
||||||
|
var ruleset = new OsuRuleset().RulesetInfo;
|
||||||
|
|
||||||
|
SoloStatisticsUpdate? update = null;
|
||||||
|
registerForUpdates(scoreId, ruleset, receivedUpdate => update = receivedUpdate);
|
||||||
|
AddStep("unsubscribe", () => subscription!.Dispose());
|
||||||
|
|
||||||
|
feignScoreProcessing(userId, ruleset, 5_000_000);
|
||||||
|
|
||||||
|
AddStep("signal score processed", () => ((ISpectatorClient)spectatorClient).UserScoreProcessed(userId, scoreId));
|
||||||
|
AddWaitStep("wait a bit", 5);
|
||||||
|
AddAssert("update not received", () => update == null);
|
||||||
|
}
|
||||||
|
|
||||||
private int nextUserId = 2000;
|
private int nextUserId = 2000;
|
||||||
private long nextScoreId = 50000;
|
private long nextScoreId = 50000;
|
||||||
|
|
||||||
@ -266,7 +288,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void registerForUpdates(long scoreId, RulesetInfo rulesetInfo, Action<SoloStatisticsUpdate> onUpdateReady) =>
|
private void registerForUpdates(long scoreId, RulesetInfo rulesetInfo, Action<SoloStatisticsUpdate> onUpdateReady) =>
|
||||||
AddStep("register for updates", () => watcher.RegisterForStatisticsUpdateAfter(
|
AddStep("register for updates", () => subscription = watcher.RegisterForStatisticsUpdateAfter(
|
||||||
new ScoreInfo(Beatmap.Value.BeatmapInfo, new OsuRuleset().RulesetInfo, new RealmUser())
|
new ScoreInfo(Beatmap.Value.BeatmapInfo, new OsuRuleset().RulesetInfo, new RealmUser())
|
||||||
{
|
{
|
||||||
Ruleset = rulesetInfo,
|
Ruleset = rulesetInfo,
|
||||||
|
@ -9,7 +9,8 @@ namespace osu.Game.Online
|
|||||||
{
|
{
|
||||||
public ProductionEndpointConfiguration()
|
public ProductionEndpointConfiguration()
|
||||||
{
|
{
|
||||||
WebsiteRootUrl = APIEndpointUrl = @"https://lazer.ppy.sh";
|
WebsiteRootUrl = @"https://osu.ppy.sh";
|
||||||
|
APIEndpointUrl = @"https://lazer.ppy.sh";
|
||||||
APIClientSecret = @"FGc9GAtyHzeQDshWP5Ah7dega8hJACAJpQtw6OXk";
|
APIClientSecret = @"FGc9GAtyHzeQDshWP5Ah7dega8hJACAJpQtw6OXk";
|
||||||
APIClientID = "5";
|
APIClientID = "5";
|
||||||
SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator";
|
SpectatorEndpointUrl = "https://spectator.ppy.sh/spectator";
|
||||||
|
@ -46,24 +46,30 @@ namespace osu.Game.Online.Solo
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="score">The score to listen for the statistics update for.</param>
|
/// <param name="score">The score to listen for the statistics update for.</param>
|
||||||
/// <param name="onUpdateReady">The callback to be invoked once the statistics update has been prepared.</param>
|
/// <param name="onUpdateReady">The callback to be invoked once the statistics update has been prepared.</param>
|
||||||
public void RegisterForStatisticsUpdateAfter(ScoreInfo score, Action<SoloStatisticsUpdate> onUpdateReady) => Schedule(() =>
|
/// <returns>An <see cref="IDisposable"/> representing the subscription. Disposing it is equivalent to unsubscribing from future notifications.</returns>
|
||||||
|
public IDisposable RegisterForStatisticsUpdateAfter(ScoreInfo score, Action<SoloStatisticsUpdate> onUpdateReady)
|
||||||
{
|
{
|
||||||
if (!api.IsLoggedIn)
|
Schedule(() =>
|
||||||
return;
|
|
||||||
|
|
||||||
if (!score.Ruleset.IsLegacyRuleset())
|
|
||||||
return;
|
|
||||||
|
|
||||||
var callback = new StatisticsUpdateCallback(score, onUpdateReady);
|
|
||||||
|
|
||||||
if (lastProcessedScoreId == score.OnlineID)
|
|
||||||
{
|
{
|
||||||
requestStatisticsUpdate(api.LocalUser.Value.Id, callback);
|
if (!api.IsLoggedIn)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
callbacks.Add(score.OnlineID, callback);
|
if (!score.Ruleset.IsLegacyRuleset() || score.OnlineID <= 0)
|
||||||
});
|
return;
|
||||||
|
|
||||||
|
var callback = new StatisticsUpdateCallback(score, onUpdateReady);
|
||||||
|
|
||||||
|
if (lastProcessedScoreId == score.OnlineID)
|
||||||
|
{
|
||||||
|
requestStatisticsUpdate(api.LocalUser.Value.Id, callback);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callbacks.Add(score.OnlineID, callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
return new InvokeOnDisposal(() => Schedule(() => callbacks.Remove(score.OnlineID)));
|
||||||
|
}
|
||||||
|
|
||||||
private void onUserChanged(APIUser? localUser) => Schedule(() =>
|
private void onUserChanged(APIUser? localUser) => Schedule(() =>
|
||||||
{
|
{
|
||||||
@ -75,15 +81,27 @@ namespace osu.Game.Online.Solo
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var userRequest = new GetUsersRequest(new[] { localUser.OnlineID });
|
var userRequest = new GetUsersRequest(new[] { localUser.OnlineID });
|
||||||
userRequest.Success += response => Schedule(() =>
|
userRequest.Success += initialiseUserStatistics;
|
||||||
{
|
|
||||||
latestStatistics = new Dictionary<string, UserStatistics>();
|
|
||||||
foreach (var rulesetStats in response.Users.Single().RulesetsStatistics)
|
|
||||||
latestStatistics.Add(rulesetStats.Key, rulesetStats.Value);
|
|
||||||
});
|
|
||||||
api.Queue(userRequest);
|
api.Queue(userRequest);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
private void initialiseUserStatistics(GetUsersResponse response) => Schedule(() =>
|
||||||
|
{
|
||||||
|
var user = response.Users.SingleOrDefault();
|
||||||
|
|
||||||
|
// possible if the user is restricted or similar.
|
||||||
|
if (user == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
latestStatistics = new Dictionary<string, UserStatistics>();
|
||||||
|
|
||||||
|
if (user.RulesetsStatistics != null)
|
||||||
|
{
|
||||||
|
foreach (var rulesetStats in user.RulesetsStatistics)
|
||||||
|
latestStatistics.Add(rulesetStats.Key, rulesetStats.Value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
private void userScoreProcessed(int userId, long scoreId)
|
private void userScoreProcessed(int userId, long scoreId)
|
||||||
{
|
{
|
||||||
if (userId != api.LocalUser.Value?.OnlineID)
|
if (userId != api.LocalUser.Value?.OnlineID)
|
||||||
|
@ -27,6 +27,7 @@ namespace osu.Game.Overlays.Settings.Sections.Gameplay
|
|||||||
{
|
{
|
||||||
LabelText = GameplaySettingsStrings.IncreaseFirstObjectVisibility,
|
LabelText = GameplaySettingsStrings.IncreaseFirstObjectVisibility,
|
||||||
Current = config.GetBindable<bool>(OsuSetting.IncreaseFirstObjectVisibility),
|
Current = config.GetBindable<bool>(OsuSetting.IncreaseFirstObjectVisibility),
|
||||||
|
Keywords = new[] { @"approach", @"circle", @"hidden" },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,7 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
HoverBackground.FadeIn(200);
|
HoverBackground.FadeIn(200);
|
||||||
tooltipContainer.FadeIn(100);
|
tooltipContainer.FadeIn(100);
|
||||||
|
|
||||||
return base.OnHover(e);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnHoverLost(HoverLostEvent e)
|
protected override void OnHoverLost(HoverLostEvent e)
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -26,15 +24,16 @@ namespace osu.Game.Screens.Ranking
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool ShowUserStatistics { get; init; }
|
public bool ShowUserStatistics { get; init; }
|
||||||
|
|
||||||
private GetScoresRequest getScoreRequest;
|
private GetScoresRequest? getScoreRequest;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private RulesetStore rulesets { get; set; }
|
private RulesetStore rulesets { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private SoloStatisticsWatcher soloStatisticsWatcher { get; set; }
|
private SoloStatisticsWatcher soloStatisticsWatcher { get; set; } = null!;
|
||||||
|
|
||||||
private readonly Bindable<SoloStatisticsUpdate> statisticsUpdate = new Bindable<SoloStatisticsUpdate>();
|
private IDisposable? statisticsSubscription;
|
||||||
|
private readonly Bindable<SoloStatisticsUpdate?> statisticsUpdate = new Bindable<SoloStatisticsUpdate?>();
|
||||||
|
|
||||||
public SoloResultsScreen(ScoreInfo score, bool allowRetry)
|
public SoloResultsScreen(ScoreInfo score, bool allowRetry)
|
||||||
: base(score, allowRetry)
|
: base(score, allowRetry)
|
||||||
@ -46,7 +45,7 @@ namespace osu.Game.Screens.Ranking
|
|||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
if (ShowUserStatistics)
|
if (ShowUserStatistics)
|
||||||
soloStatisticsWatcher.RegisterForStatisticsUpdateAfter(Score, update => statisticsUpdate.Value = update);
|
statisticsSubscription = soloStatisticsWatcher.RegisterForStatisticsUpdateAfter(Score, update => statisticsUpdate.Value = update);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override StatisticsPanel CreateStatisticsPanel()
|
protected override StatisticsPanel CreateStatisticsPanel()
|
||||||
@ -62,7 +61,7 @@ namespace osu.Game.Screens.Ranking
|
|||||||
return base.CreateStatisticsPanel();
|
return base.CreateStatisticsPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override APIRequest FetchScores(Action<IEnumerable<ScoreInfo>> scoresCallback)
|
protected override APIRequest? FetchScores(Action<IEnumerable<ScoreInfo>>? scoresCallback)
|
||||||
{
|
{
|
||||||
if (Score.BeatmapInfo.OnlineID <= 0 || Score.BeatmapInfo.Status <= BeatmapOnlineStatus.Pending)
|
if (Score.BeatmapInfo.OnlineID <= 0 || Score.BeatmapInfo.Status <= BeatmapOnlineStatus.Pending)
|
||||||
return null;
|
return null;
|
||||||
@ -77,6 +76,7 @@ namespace osu.Game.Screens.Ranking
|
|||||||
base.Dispose(isDisposing);
|
base.Dispose(isDisposing);
|
||||||
|
|
||||||
getScoreRequest?.Cancel();
|
getScoreRequest?.Cancel();
|
||||||
|
statisticsSubscription?.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user