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:
parent
8a02507d44
commit
bfa9beb7b2
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user