/// <inheritdoc /> public override async ValueTask <Result <Roleplay> > TryParseAsync(string value, CancellationToken ct = default) { value = value.Trim(); if (!_context.GuildID.HasValue) { throw new InvalidOperationException(); } if (string.Equals(value, "current", StringComparison.OrdinalIgnoreCase)) { return(await _roleplays.GetActiveRoleplayAsync(_context.ChannelID)); } if (!value.Contains(':')) { return(await _roleplays.GetBestMatchingRoleplayAsync ( _context.ChannelID, _context.GuildID.Value, _context.User.ID, value )); } var parts = value.Split(':'); if (parts.Length != 2) { return(new UserError ( "When searching a specific user, the name must be in the form \"@someone:name\"." )); } var rawUser = parts[0]; if (!Snowflake.TryParse(rawUser.Unmention(), out var parsedUser)) { return(new UserError ( "I couldn't parse whatever you gave me as a user-scoped roleplay search. Try again?" )); } var rawName = parts[1]; return(await _roleplays.GetBestMatchingRoleplayAsync ( _context.ChannelID, _context.GuildID.Value, parsedUser, rawName )); }