From bfa9beb7b2d5bea4e2439ca4cb015d6a2cdab5c0 Mon Sep 17 00:00:00 2001 From: FreezyLemon Date: Mon, 11 Dec 2017 13:43:47 +0100 Subject: [PATCH] Switched to regex to handle most of the decision on what to do on click. Also updated the getIdFromUrl method to adapt to the changes --- osu.Game/Online/Chat/ChatLink.cs | 155 +++++++++++++++++-------------- 1 file changed, 87 insertions(+), 68 deletions(-) diff --git a/osu.Game/Online/Chat/ChatLink.cs b/osu.Game/Online/Chat/ChatLink.cs index acea78586b..d251580812 100644 --- a/osu.Game/Online/Chat/ChatLink.cs +++ b/osu.Game/Online/Chat/ChatLink.cs @@ -54,87 +54,106 @@ namespace osu.Game.Online.Chat protected override void OnLinkClicked() { - var url = Url; - - if (url.StartsWith("osu://")) + var urlMatch = Regex.Matches(Url, @"^(?osu(?:mp)?|https?):\/\/(?.*)")[0]; + if (urlMatch.Success) { - url = url.Substring(6); - var args = url.Split('/'); + var args = urlMatch.Groups["content"].Value.Split('/'); - switch (args[0]) + switch (urlMatch.Groups["protocol"].Value) { - case "chan": - var foundChannel = chat.AvailableChannels.Find(channel => channel.Name == args[1]); - - if (foundChannel == null) - throw new ArgumentException($"Unknown channel name ({args[1]})."); - else - chat.OpenChannel(foundChannel); - - break; - case "edit": - chat.Game?.LoadEditorTimestamp(); - break; - case "b": - if (args.Length > 1 && int.TryParse(args[1], out int mapId)) - beatmapSetOverlay.ShowBeatmap(mapId); - - break; - case "s": - case "dl": - if (args.Length > 1 && int.TryParse(args[1], out int mapSetId)) - beatmapSetOverlay.ShowBeatmapSet(mapSetId); - - break; - case "spectate": - GetUserRequest req; - if (int.TryParse(args[1], out int userId)) - req = new GetUserRequest(userId); - else - return; - - req.Success += user => + case "osu": + if (args.Length == 1) { - chat.Game?.LoadSpectatorScreen(); - }; - api.Queue(req); + base.OnLinkClicked(); + break; + } + switch (args[0]) + { + case "chan": + var foundChannel = chat.AvailableChannels.Find(channel => channel.Name == args[1]); + + if (foundChannel == null) + throw new ArgumentException($"Unknown channel name ({args[1]})."); + else + chat.OpenChannel(foundChannel); + + break; + case "edit": + chat.Game?.LoadEditorTimestamp(); + break; + case "b": + if (args.Length > 1 && int.TryParse(args[1], out int mapId)) + beatmapSetOverlay.ShowBeatmap(mapId); + + break; + case "s": + case "dl": + if (args.Length > 1 && int.TryParse(args[1], out int mapSetId)) + beatmapSetOverlay.ShowBeatmapSet(mapSetId); + + break; + case "spectate": + GetUserRequest req; + if (int.TryParse(args[1], out int userId)) + req = new GetUserRequest(userId); + else + return; + + req.Success += user => + { + chat.Game?.LoadSpectatorScreen(); + }; + api.Queue(req); + + break; + default: + throw new ArgumentException($"Unknown osu:// link at {nameof(ChatLink)} ({urlMatch.Groups["content"].Value})."); + } + + break; + case "osump": + if (args.Length > 1 && int.TryParse(args[1], out int multiId)) + chat.Game?.LoadMultiplayerLobby(multiId); + + break; + case "http": + case "https": + if (args[0] == "osu.ppy.sh" && args.Length > 2) + { + switch (args[1]) + { + case "b": + case "beatmaps": + beatmapSetOverlay.ShowBeatmap(getId(args[2])); + break; + case "s": + case "beatmapsets": + case "d": + beatmapSetOverlay.ShowBeatmapSet(getId(args[2])); + break; + default: + base.OnLinkClicked(); + break; + } + } + else + base.OnLinkClicked(); break; default: - throw new ArgumentException($"Unknown osu:// link at {nameof(OsuLinkSpriteText)} (https://osu.ppy.sh/{args[0]})."); + base.OnLinkClicked(); + break; } } - else if (url.StartsWith("osump://")) - { - url = url.Substring(8); - if (!int.TryParse(url.Split('/').ElementAtOrDefault(1), out int multiId)) - return; - - chat.Game?.LoadMultiplayerLobby(multiId); - } - else if (url.StartsWith("http://") || url.StartsWith("https://") && url.IndexOf("osu.ppy.sh/", StringComparison.InvariantCultureIgnoreCase) != -1) - { - var osuUrlIndex = url.IndexOf("osu.ppy.sh/", StringComparison.InvariantCultureIgnoreCase); - - url = url.Substring(osuUrlIndex + 11); - if (url.StartsWith("s/") || url.StartsWith("beatmapsets/") || url.StartsWith("d/")) - { - var id = getIdFromUrl(url); - beatmapSetOverlay.ShowBeatmapSet(id); - } - else if (url.StartsWith("b/") || url.StartsWith("beatmaps/")) - { - var id = getIdFromUrl(url); - beatmapSetOverlay.ShowBeatmap(id); - } - else - base.OnLinkClicked(); - } else base.OnLinkClicked(); } - private int getIdFromUrl(string url) => int.Parse(Regex.Match(url, @"\/(\d+)\/?").Groups[1].Value); + private int getId(string input) + { + var index = input.IndexOf('#'); + return int.Parse(index > 0 ? input.Remove(index) : input); + } public string TooltipText {