1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-15 22:22:54 +08:00

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

This commit is contained in:
FreezyLemon 2017-12-11 13:43:47 +01:00
parent 8a02507d44
commit bfa9beb7b2

View File

@ -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, @"^(?<protocol>osu(?:mp)?|https?):\/\/(?<content>.*)")[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
{