diff --git a/osu.Game/Graphics/Containers/LinkFlowContainer.cs b/osu.Game/Graphics/Containers/LinkFlowContainer.cs
index 41b7df228e..1d286d3487 100644
--- a/osu.Game/Graphics/Containers/LinkFlowContainer.cs
+++ b/osu.Game/Graphics/Containers/LinkFlowContainer.cs
@@ -46,7 +46,7 @@ public void AddLinks(string text, List links)
AddText(text[previousLinkEnd..link.Index]);
string displayText = text.Substring(link.Index, link.Length);
- string linkArgument = link.Argument;
+ object linkArgument = link.Argument;
string tooltip = displayText == link.Url ? null : link.Url;
AddLink(displayText, link.Action, linkArgument, tooltip);
@@ -62,16 +62,16 @@ public void AddLink(LocalisableString text, string url, Action creat
public void AddLink(LocalisableString text, Action action, string tooltipText = null, Action creationParameters = null)
=> createLink(CreateChunkFor(text, true, CreateSpriteText, creationParameters), new LinkDetails(LinkAction.Custom, string.Empty), tooltipText, action);
- public void AddLink(LocalisableString text, LinkAction action, string argument, string tooltipText = null, Action creationParameters = null)
+ public void AddLink(LocalisableString text, LinkAction action, object argument, string tooltipText = null, Action creationParameters = null)
=> createLink(CreateChunkFor(text, true, CreateSpriteText, creationParameters), new LinkDetails(action, argument), tooltipText);
- public void AddLink(IEnumerable text, LinkAction action, string linkArgument, string tooltipText = null)
+ public void AddLink(IEnumerable text, LinkAction action, object linkArgument, string tooltipText = null)
{
createLink(new TextPartManual(text), new LinkDetails(action, linkArgument), tooltipText);
}
public void AddUserLink(IUser user, Action creationParameters = null)
- => createLink(CreateChunkFor(user.Username, true, CreateSpriteText, creationParameters), new LinkDetails(LinkAction.OpenUserProfile, user.OnlineID.ToString()), "view profile");
+ => createLink(CreateChunkFor(user.Username, true, CreateSpriteText, creationParameters), new LinkDetails(LinkAction.OpenUserProfile, user), "view profile");
private void createLink(ITextPart textPart, LinkDetails link, LocalisableString tooltipText, Action action = null)
{
@@ -83,7 +83,7 @@ private void createLink(ITextPart textPart, LinkDetails link, LocalisableString
game.HandleLink(link);
// fallback to handle cases where OsuGame is not available, ie. tournament client.
else if (link.Action == LinkAction.External)
- host.OpenUrlExternally(link.Argument);
+ host.OpenUrlExternally(link.Argument.ToString());
};
AddPart(new TextLink(textPart, tooltipText, onClickAction));
diff --git a/osu.Game/Online/Chat/MessageFormatter.cs b/osu.Game/Online/Chat/MessageFormatter.cs
index 5e0f66443b..92911f0f51 100644
--- a/osu.Game/Online/Chat/MessageFormatter.cs
+++ b/osu.Game/Online/Chat/MessageFormatter.cs
@@ -320,9 +320,9 @@ public class LinkDetails
{
public readonly LinkAction Action;
- public readonly string Argument;
+ public readonly object Argument;
- public LinkDetails(LinkAction action, string argument)
+ public LinkDetails(LinkAction action, object argument)
{
Action = action;
Argument = argument;
@@ -351,9 +351,9 @@ public class Link : IComparable
public int Index;
public int Length;
public LinkAction Action;
- public string Argument;
+ public object Argument;
- public Link(string url, int startIndex, int length, LinkAction action, string argument)
+ public Link(string url, int startIndex, int length, LinkAction action, object argument)
{
Url = url;
Index = startIndex;
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index ea8682e696..bf757a153f 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -289,25 +289,27 @@ private void load()
/// The link to load.
public void HandleLink(LinkDetails link) => Schedule(() =>
{
+ string argString = link.Argument.ToString();
+
switch (link.Action)
{
case LinkAction.OpenBeatmap:
// TODO: proper query params handling
- if (int.TryParse(link.Argument.Contains('?') ? link.Argument.Split('?')[0] : link.Argument, out int beatmapId))
+ if (int.TryParse(argString.Contains('?') ? argString.Split('?')[0] : argString, out int beatmapId))
ShowBeatmap(beatmapId);
break;
case LinkAction.OpenBeatmapSet:
- if (int.TryParse(link.Argument, out int setId))
+ if (int.TryParse(argString, out int setId))
ShowBeatmapSet(setId);
break;
case LinkAction.OpenChannel:
- ShowChannel(link.Argument);
+ ShowChannel(argString);
break;
case LinkAction.SearchBeatmapSet:
- SearchBeatmapSet(link.Argument);
+ SearchBeatmapSet(argString);
break;
case LinkAction.OpenEditorTimestamp:
@@ -321,26 +323,31 @@ public void HandleLink(LinkDetails link) => Schedule(() =>
break;
case LinkAction.External:
- OpenUrlExternally(link.Argument);
+ OpenUrlExternally(argString);
break;
case LinkAction.OpenUserProfile:
- ShowUser(int.TryParse(link.Argument, out int userId)
- ? new APIUser { Id = userId }
- : new APIUser { Username = link.Argument });
+ if (!(link.Argument is IUser user))
+ {
+ user = int.TryParse(argString, out int userId)
+ ? new APIUser { Id = userId }
+ : new APIUser { Username = argString };
+ }
+
+ ShowUser(user);
break;
case LinkAction.OpenWiki:
- ShowWiki(link.Argument);
+ ShowWiki(argString);
break;
case LinkAction.OpenChangelog:
- if (string.IsNullOrEmpty(link.Argument))
+ if (string.IsNullOrEmpty(argString))
ShowChangelogListing();
else
{
- string[] changelogArgs = link.Argument.Split("/");
+ string[] changelogArgs = argString.Split("/");
ShowChangelogBuild(changelogArgs[0], changelogArgs[1]);
}
diff --git a/osu.Game/Overlays/Chat/ChatLine.cs b/osu.Game/Overlays/Chat/ChatLine.cs
index 97cd913b56..87d1b1a3ad 100644
--- a/osu.Game/Overlays/Chat/ChatLine.cs
+++ b/osu.Game/Overlays/Chat/ChatLine.cs
@@ -209,7 +209,7 @@ private void updateMessageContent()
username.Text = $@"{message.Sender.Username}" + (senderHasBackground || message.IsAction ? "" : ":");
// remove non-existent channels from the link list
- message.Links.RemoveAll(link => link.Action == LinkAction.OpenChannel && chatManager?.AvailableChannels.Any(c => c.Name == link.Argument) != true);
+ message.Links.RemoveAll(link => link.Action == LinkAction.OpenChannel && chatManager?.AvailableChannels.Any(c => c.Name == link.Argument.ToString()) != true);
ContentFlow.Clear();
ContentFlow.AddLinks(message.DisplayContent, message.Links);
diff --git a/osu.Game/Overlays/Profile/Sections/Recent/DrawableRecentActivity.cs b/osu.Game/Overlays/Profile/Sections/Recent/DrawableRecentActivity.cs
index 49b46f7e7a..cb8dae0bbc 100644
--- a/osu.Game/Overlays/Profile/Sections/Recent/DrawableRecentActivity.cs
+++ b/osu.Game/Overlays/Profile/Sections/Recent/DrawableRecentActivity.cs
@@ -216,7 +216,7 @@ private void addBeatmapLink()
private void addBeatmapsetLink()
=> content.AddLink(activity.Beatmapset?.Title, LinkAction.OpenBeatmapSet, getLinkArgument(activity.Beatmapset?.Url), creationParameters: t => t.Font = getLinkFont());
- private string getLinkArgument(string url) => MessageFormatter.GetLinkDetails($"{api.APIEndpointUrl}{url}").Argument;
+ private string getLinkArgument(string url) => MessageFormatter.GetLinkDetails($"{api.APIEndpointUrl}{url}").Argument.ToString();
private FontUsage getLinkFont(FontWeight fontWeight = FontWeight.Regular)
=> OsuFont.GetFont(size: font_size, weight: fontWeight, italics: true);