From f63223286295a1261c950c482701b99963fb260c Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Wed, 25 Oct 2017 22:11:20 +0800 Subject: [PLT-7701] Fix emoji names that trigger mention (#7663) * fix emoji names that trigger mention * remove regex and rearrange based on comment * make ":@here:" to not trigger a mention --- app/notification.go | 13 +++++++++---- app/notification_test.go | 26 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/notification.go b/app/notification.go index bbd305b05..3adf14419 100644 --- a/app/notification.go +++ b/app/notification.go @@ -804,11 +804,16 @@ func GetExplicitMentions(message string, keywords map[string][]string) (map[stri message = removeCodeFromMessage(message) for _, word := range strings.FieldsFunc(message, func(c rune) bool { - // Split on any whitespace or punctuation that can't be part of an at mention - return !(c == '.' || c == '-' || c == '_' || c == '@' || unicode.IsLetter(c) || unicode.IsNumber(c)) + // Split on any whitespace or punctuation that can't be part of an at mention or emoji pattern + return !(c == ':' || c == '.' || c == '-' || c == '_' || c == '@' || unicode.IsLetter(c) || unicode.IsNumber(c)) }) { isMention := false + // skip word with format ':word:' with an assumption that it is an emoji format only + if word[0] == ':' && word[len(word)-1] == ':' { + continue + } + if word == "@here" { hereMentioned = true } @@ -837,10 +842,10 @@ func GetExplicitMentions(message string, keywords map[string][]string) (map[stri continue } - if strings.ContainsAny(word, ".-") { + if strings.ContainsAny(word, ".-:") { // This word contains a character that may be the end of a sentence, so split further splitWords := strings.FieldsFunc(word, func(c rune) bool { - return c == '.' || c == '-' + return c == '.' || c == '-' || c == ':' }) for _, splitWord := range splitWords { diff --git a/app/notification_test.go b/app/notification_test.go index f5224e84e..51dba7c0e 100644 --- a/app/notification_test.go +++ b/app/notification_test.go @@ -200,6 +200,30 @@ func TestGetExplicitMentions(t *testing.T) { if mentions, _, _, _, _ := GetExplicitMentions(message, keywords); len(mentions) != 1 || !mentions[id1] || mentions[id2] || mentions[id3] { t.Fatal("should've only mentioned aaa") } + + message = ":smile:" + keywords = map[string][]string{"smile": {id1}, "smiley": {id2}, "smiley_cat": {id3}} + if mentions, _, _, _, _ := GetExplicitMentions(message, keywords); len(mentions) == 1 || mentions[id1] { + t.Fatal("should not mentioned smile") + } + + message = "smile" + keywords = map[string][]string{"smile": {id1}, "smiley": {id2}, "smiley_cat": {id3}} + if mentions, _, _, _, _ := GetExplicitMentions(message, keywords); len(mentions) != 1 || !mentions[id1] || mentions[id2] || mentions[id3] { + t.Fatal("should've only mentioned smile") + } + + message = ":smile" + keywords = map[string][]string{"smile": {id1}, "smiley": {id2}, "smiley_cat": {id3}} + if mentions, _, _, _, _ := GetExplicitMentions(message, keywords); len(mentions) != 1 || !mentions[id1] || mentions[id2] || mentions[id3] { + t.Fatal("should've only mentioned smile") + } + + message = "smile:" + keywords = map[string][]string{"smile": {id1}, "smiley": {id2}, "smiley_cat": {id3}} + if mentions, _, _, _, _ := GetExplicitMentions(message, keywords); len(mentions) != 1 || !mentions[id1] || mentions[id2] || mentions[id3] { + t.Fatal("should've only mentioned smile") + } } func TestGetExplicitMentionsAtHere(t *testing.T) { @@ -230,7 +254,7 @@ func TestGetExplicitMentionsAtHere(t *testing.T) { "\\@here\\": true, "|@here|": true, ";@here;": true, - ":@here:": true, + ":@here:": false, // This case shouldn't trigger a mention since it follows the format of reactions e.g. :word: "'@here'": true, "\"@here\"": true, ",@here,": true, -- cgit v1.2.3-1-g7c22