gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 7e4c3fa5c7374363a28e9b0d028b6d71700607c7
parent 15621f5324b4613d83efb94711c97eeaa83da2b3
Author: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>
Date:   Sun, 17 Oct 2021 13:19:49 +0100

fix mention extracting when no domain exists (usually intra-instance mentions) (#272)

* fix mention extracting when no domain exists (usually when intra-instance mentions)

Signed-off-by: kim <grufwub@gmail.com>

* fix search logic to match new mention matching logic

Signed-off-by: kim <grufwub@gmail.com>

* appease the linter :p

Signed-off-by: kim <grufwub@gmail.com>
Diffstat:
Minternal/ap/extract.go | 5+----
Minternal/processing/search.go | 31+++++++++++++------------------
Minternal/regexes/regexes.go | 2+-
Minternal/util/statustools.go | 18+++++++-----------
4 files changed, 22 insertions(+), 34 deletions(-)

diff --git a/internal/ap/extract.go b/internal/ap/extract.go @@ -565,13 +565,10 @@ func ExtractMention(i Mentionable) (*gtsmodel.Mention, error) { } // just make sure the mention string is valid so we can handle it properly later on... - username, domain, err := util.ExtractMentionParts(mentionString) + _, _, err = util.ExtractMentionParts(mentionString) if err != nil { return nil, err } - if username == "" || domain == "" { - return nil, errors.New("username or domain was empty") - } mention.NameString = mentionString // the href prop should be the AP URI of a user we know, eg https://example.org/users/whatever_user diff --git a/internal/processing/search.go b/internal/processing/search.go @@ -53,7 +53,7 @@ func (p *processor) SearchGet(ctx context.Context, authed *oauth.Auth, searchQue var foundOne bool // check if the query is something like @whatever_username@example.org -- this means it's a remote account - if !foundOne && util.IsMention(searchQuery.Query) { + if _, domain, err := util.ExtractMentionParts(searchQuery.Query); err == nil && domain != "" { l.Debug("search term is a mention, looking it up...") foundAccount, err := p.searchAccountByMention(ctx, authed, searchQuery.Query, searchQuery.Resolve) if err == nil && foundAccount != nil { @@ -64,27 +64,22 @@ func (p *processor) SearchGet(ctx context.Context, authed *oauth.Auth, searchQue } // check if the query is a URI and just do a lookup for that, straight up - if uri, err := url.Parse(query); err == nil && !foundOne { - // 1. check if it's a status - if foundStatus, err := p.searchStatusByURI(ctx, authed, uri, searchQuery.Resolve); err == nil && foundStatus != nil { - foundStatuses = append(foundStatuses, foundStatus) - foundOne = true - l.Debug("got a status by searching by URI") - } + if !foundOne { + if uri, err := url.Parse(query); err == nil { + // 1. check if it's a status + if foundStatus, err := p.searchStatusByURI(ctx, authed, uri, searchQuery.Resolve); err == nil && foundStatus != nil { + foundStatuses = append(foundStatuses, foundStatus) + l.Debug("got a status by searching by URI") + } - // 2. check if it's an account - if foundAccount, err := p.searchAccountByURI(ctx, authed, uri, searchQuery.Resolve); err == nil && foundAccount != nil { - foundAccounts = append(foundAccounts, foundAccount) - foundOne = true - l.Debug("got an account by searching by URI") + // 2. check if it's an account + if foundAccount, err := p.searchAccountByURI(ctx, authed, uri, searchQuery.Resolve); err == nil && foundAccount != nil { + foundAccounts = append(foundAccounts, foundAccount) + l.Debug("got an account by searching by URI") + } } } - if !foundOne { - // we haven't found anything yet so search for text now - l.Debug("nothing found by mention or by URI, will fall back to searching by text now") - } - /* FROM HERE ON we have our search results, it's just a matter of filtering them according to what this user is allowed to see, and then converting them into our frontend format. diff --git a/internal/regexes/regexes.go b/internal/regexes/regexes.go @@ -47,7 +47,7 @@ const ( ) var ( - mentionName = `^@(\w+)(?:@([a-zA-Z0-9_\-\.:]+)?)$` + mentionName = `^@(\w+)(?:@([a-zA-Z0-9_\-\.:]+))?$` // MentionName captures the username and domain part from a mention string // such as @whatever_user@example.org, returning whatever_user and example.org (without the @ symbols) MentionName = regexp.MustCompile(mentionName) diff --git a/internal/util/statustools.go b/internal/util/statustools.go @@ -68,16 +68,12 @@ func DeriveEmojisFromText(text string) []string { // If nothing is matched, it will return an error. func ExtractMentionParts(mention string) (username, domain string, err error) { matches := regexes.MentionName.FindStringSubmatch(mention) - if matches == nil || len(matches) != 3 { - err = fmt.Errorf("could't match mention %s", mention) - return + switch len(matches) { + case 2: + return matches[1], "", nil + case 3: + return matches[1], matches[2], nil + default: + return "", "", fmt.Errorf("couldn't match mention %s", mention) } - username = matches[1] - domain = matches[2] - return -} - -// IsMention returns true if the passed string looks like @whatever@example.org -func IsMention(mention string) bool { - return regexes.MentionName.MatchString(strings.ToLower(mention)) }