Esempio n. 1
0
    /// <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
               ));
    }