mirror of
https://github.com/ppy/osu
synced 2025-03-25 04:18:03 +00:00
Merge pull request #21420 from cdwcgt/NowPlaying
Show mods, ruleset and unicode metadata in "now playing" chat command
This commit is contained in:
commit
78f70dae75
@ -11,6 +11,7 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.Chat;
|
using osu.Game.Online.Chat;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Online
|
namespace osu.Game.Tests.Visual.Online
|
||||||
@ -33,7 +34,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
AddStep("Set activity", () => api.Activity.Value = new UserActivity.InLobby(null));
|
AddStep("Set activity", () => api.Activity.Value = new UserActivity.InLobby(null));
|
||||||
|
|
||||||
AddStep("Run command", () => Add(new NowPlayingCommand()));
|
AddStep("Run command", () => Add(new NowPlayingCommand(new Channel())));
|
||||||
|
|
||||||
AddAssert("Check correct response", () => postTarget.LastMessage.Contains("is listening"));
|
AddAssert("Check correct response", () => postTarget.LastMessage.Contains("is listening"));
|
||||||
}
|
}
|
||||||
@ -43,7 +44,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
AddStep("Set activity", () => api.Activity.Value = new UserActivity.Editing(new BeatmapInfo()));
|
AddStep("Set activity", () => api.Activity.Value = new UserActivity.Editing(new BeatmapInfo()));
|
||||||
|
|
||||||
AddStep("Run command", () => Add(new NowPlayingCommand()));
|
AddStep("Run command", () => Add(new NowPlayingCommand(new Channel())));
|
||||||
|
|
||||||
AddAssert("Check correct response", () => postTarget.LastMessage.Contains("is editing"));
|
AddAssert("Check correct response", () => postTarget.LastMessage.Contains("is editing"));
|
||||||
}
|
}
|
||||||
@ -53,7 +54,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
AddStep("Set activity", () => api.Activity.Value = new UserActivity.InSoloGame(new BeatmapInfo(), new RulesetInfo()));
|
AddStep("Set activity", () => api.Activity.Value = new UserActivity.InSoloGame(new BeatmapInfo(), new RulesetInfo()));
|
||||||
|
|
||||||
AddStep("Run command", () => Add(new NowPlayingCommand()));
|
AddStep("Run command", () => Add(new NowPlayingCommand(new Channel())));
|
||||||
|
|
||||||
AddAssert("Check correct response", () => postTarget.LastMessage.Contains("is playing"));
|
AddAssert("Check correct response", () => postTarget.LastMessage.Contains("is playing"));
|
||||||
}
|
}
|
||||||
@ -69,7 +70,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
BeatmapInfo = { OnlineID = hasOnlineId ? 1234 : -1 }
|
BeatmapInfo = { OnlineID = hasOnlineId ? 1234 : -1 }
|
||||||
});
|
});
|
||||||
|
|
||||||
AddStep("Run command", () => Add(new NowPlayingCommand()));
|
AddStep("Run command", () => Add(new NowPlayingCommand(new Channel())));
|
||||||
|
|
||||||
if (hasOnlineId)
|
if (hasOnlineId)
|
||||||
AddAssert("Check link presence", () => postTarget.LastMessage.Contains("/b/1234"));
|
AddAssert("Check link presence", () => postTarget.LastMessage.Contains("/b/1234"));
|
||||||
@ -77,6 +78,18 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
AddAssert("Check link not present", () => !postTarget.LastMessage.Contains("https://"));
|
AddAssert("Check link not present", () => !postTarget.LastMessage.Contains("https://"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestModPresence()
|
||||||
|
{
|
||||||
|
AddStep("Set activity", () => api.Activity.Value = new UserActivity.InSoloGame(new BeatmapInfo(), new RulesetInfo()));
|
||||||
|
|
||||||
|
AddStep("Add Hidden mod", () => SelectedMods.Value = new[] { Ruleset.Value.CreateInstance().CreateMod<ModHidden>() });
|
||||||
|
|
||||||
|
AddStep("Run command", () => Add(new NowPlayingCommand(new Channel())));
|
||||||
|
|
||||||
|
AddAssert("Check mod is present", () => postTarget.LastMessage.Contains("+HD"));
|
||||||
|
}
|
||||||
|
|
||||||
public partial class PostTarget : Component, IChannelPostTarget
|
public partial class PostTarget : Component, IChannelPostTarget
|
||||||
{
|
{
|
||||||
public void PostMessage(string text, bool isAction = false, Channel target = null)
|
public void PostMessage(string text, bool isAction = false, Channel target = null)
|
||||||
|
@ -1,13 +1,17 @@
|
|||||||
// 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.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
|
|
||||||
namespace osu.Game.Online.Chat
|
namespace osu.Game.Online.Chat
|
||||||
@ -15,21 +19,30 @@ namespace osu.Game.Online.Chat
|
|||||||
public partial class NowPlayingCommand : Component
|
public partial class NowPlayingCommand : Component
|
||||||
{
|
{
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private IChannelPostTarget channelManager { get; set; }
|
private IChannelPostTarget channelManager { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private IAPIProvider api { get; set; }
|
private IAPIProvider api { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private Bindable<WorkingBeatmap> currentBeatmap { get; set; }
|
private Bindable<WorkingBeatmap> currentBeatmap { get; set; } = null!;
|
||||||
|
|
||||||
private readonly Channel target;
|
[Resolved]
|
||||||
|
private Bindable<IReadOnlyList<Mod>> selectedMods { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private IBindable<RulesetInfo> currentRuleset { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private LocalisationManager localisation { get; set; } = null!;
|
||||||
|
|
||||||
|
private readonly Channel? target;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new <see cref="NowPlayingCommand"/> to post the currently-playing beatmap to a parenting <see cref="IChannelPostTarget"/>.
|
/// Creates a new <see cref="NowPlayingCommand"/> to post the currently-playing beatmap to a parenting <see cref="IChannelPostTarget"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="target">The target channel to post to. If <c>null</c>, the currently-selected channel will be posted to.</param>
|
/// <param name="target">The target channel to post to. If <c>null</c>, the currently-selected channel will be posted to.</param>
|
||||||
public NowPlayingCommand(Channel target = null)
|
public NowPlayingCommand(Channel target)
|
||||||
{
|
{
|
||||||
this.target = target;
|
this.target = target;
|
||||||
}
|
}
|
||||||
@ -59,10 +72,55 @@ namespace osu.Game.Online.Chat
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
string beatmapString = beatmapInfo.OnlineID > 0 ? $"[{api.WebsiteRootUrl}/b/{beatmapInfo.OnlineID} {beatmapInfo}]" : beatmapInfo.ToString();
|
string[] pieces =
|
||||||
|
{
|
||||||
|
"is",
|
||||||
|
verb,
|
||||||
|
getBeatmapPart(),
|
||||||
|
getRulesetPart(),
|
||||||
|
getModPart(),
|
||||||
|
};
|
||||||
|
|
||||||
channelManager.PostMessage($"is {verb} {beatmapString}", true, target);
|
channelManager.PostMessage(string.Join(' ', pieces.Where(p => !string.IsNullOrEmpty(p))), true, target);
|
||||||
Expire();
|
Expire();
|
||||||
|
|
||||||
|
string getBeatmapPart()
|
||||||
|
{
|
||||||
|
string beatmapInfoString = localisation.GetLocalisedBindableString(beatmapInfo.GetDisplayTitleRomanisable()).Value;
|
||||||
|
|
||||||
|
return beatmapInfo.OnlineID > 0 ? $"[{api.WebsiteRootUrl}/b/{beatmapInfo.OnlineID} {beatmapInfoString}]" : beatmapInfoString;
|
||||||
|
}
|
||||||
|
|
||||||
|
string getRulesetPart()
|
||||||
|
{
|
||||||
|
if (api.Activity.Value is not UserActivity.InGame) return string.Empty;
|
||||||
|
|
||||||
|
return $"<{currentRuleset.Value.Name}>";
|
||||||
|
}
|
||||||
|
|
||||||
|
string getModPart()
|
||||||
|
{
|
||||||
|
if (api.Activity.Value is not UserActivity.InGame) return string.Empty;
|
||||||
|
|
||||||
|
if (selectedMods.Value.Count == 0)
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder modsString = new StringBuilder();
|
||||||
|
|
||||||
|
foreach (var mod in selectedMods.Value.Where(mod => mod.Type == ModType.DifficultyIncrease))
|
||||||
|
{
|
||||||
|
modsString.Append($"+{mod.Acronym} ");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var mod in selectedMods.Value.Where(mod => mod.Type != ModType.DifficultyIncrease))
|
||||||
|
{
|
||||||
|
modsString.Append($"-{mod.Acronym} ");
|
||||||
|
}
|
||||||
|
|
||||||
|
return modsString.ToString().Trim();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user