fix: Mention is not resolved if username or nickname of one is a substring of another (#3571)

* fix mobile issue #16099

* bump version
This commit is contained in:
frank 2023-06-08 14:47:38 +08:00 committed by GitHub
parent 46768e624a
commit 9e0a12cb32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 3 deletions

View File

@ -1 +1 @@
0.156.0 0.156.1

View File

@ -735,13 +735,32 @@ func matchMention(text string, users map[string]*MentionableUser, mentionKeyIdx
textLen := len(tr) textLen := len(tr)
nextWordStart := nextWordIdx + wordLen nextWordStart := nextWordIdx + wordLen
if textLen > nextWordStart { if textLen > nextWordStart {
return matchMention(text, users, mentionKeyIdx, nextWordStart, newWords) user := matchMention(text, users, mentionKeyIdx, nextWordStart, newWords)
if user != nil {
return user
} }
} }
return filterWithFullMatch(userSuggestions, searchedText)
}
} }
return nil return nil
} }
func filterWithFullMatch(userSuggestions map[string]*MentionableUser, text string) *MentionableUser {
if text == "" {
return nil
}
result := make(map[string]*MentionableUser)
for pk, user := range userSuggestions {
for _, name := range user.names() {
if strings.ToLower(name) == text {
result[pk] = user
}
}
}
return getFirstUser(result)
}
func getFirstUser(userSuggestions map[string]*MentionableUser) *MentionableUser { func getFirstUser(userSuggestions map[string]*MentionableUser) *MentionableUser {
for _, user := range userSuggestions { for _, user := range userSuggestions {
return user return user

View File

@ -114,6 +114,12 @@ func TestReplaceMentions(t *testing.T) {
LocalNickname: "primary-name-user-4", LocalNickname: "primary-name-user-4",
}, },
}, },
"0xpk5": {
Contact: &Contact{
ID: "0xpk5",
LocalNickname: "User Number",
},
},
} }
tests := []struct { tests := []struct {
@ -128,7 +134,7 @@ func TestReplaceMentions(t *testing.T) {
{"no mentions", "foo bar @buzz kek @foo", "foo bar @buzz kek @foo"}, {"no mentions", "foo bar @buzz kek @foo", "foo bar @buzz kek @foo"},
{"starts with mention", "@User Number One", "@0xpk1"}, {"starts with mention", "@User Number One", "@0xpk1"},
{"starts with mention, comma after mention", "@User Number One,", "@0xpk1,"}, {"starts with mention, comma after mention", "@User Number One,", "@0xpk1,"},
{"starts with mention but no space after", "@User Number Onefoo", "@User Number Onefoo"}, {"starts with mention but no space after", "@User NumberOnefoo", "@User NumberOnefoo"},
{"starts with mention, some text after mention", "@User Number One foo", "@0xpk1 foo"}, {"starts with mention, some text after mention", "@User Number One foo", "@0xpk1 foo"},
{"starts with some text, then mention", "text @User Number One", "text @0xpk1"}, {"starts with some text, then mention", "text @User Number One", "text @0xpk1"},
{"starts with some text, then mention, then more text", "text @User Number One foo", "text @0xpk1 foo"}, {"starts with some text, then mention, then more text", "text @User Number One foo", "text @0xpk1 foo"},
@ -176,6 +182,9 @@ func TestReplaceMentions(t *testing.T) {
{"double @", "@ @user2", "@ @0xpk2"}, {"double @", "@ @user2", "@ @0xpk2"},
{"user name contains dash", "@display-name-user-4 ", "@0xpk4 "}, {"user name contains dash", "@display-name-user-4 ", "@0xpk4 "},
{"username or nickname of one is a substring of another case 1", "@User Number One @User Number", "@0xpk1 @0xpk5"},
{"username or nickname of one is a substring of another case 2", "@User Number @User Number One ", "@0xpk5 @0xpk1 "},
} }
for _, tt := range tests { for _, tt := range tests {