From 4525fa31aa6ea595c93994b05a3a042965249100 Mon Sep 17 00:00:00 2001 From: Wim Date: Sun, 17 Feb 2019 21:49:28 +0100 Subject: [PATCH] Allow regexs in ignoreNicks. Closes #690 (#720) --- gateway/gateway.go | 54 ++++++++++++++++------------------------ gateway/gateway_test.go | 24 +++++++++--------- matterbridge.toml.sample | 12 +++++++++ 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/gateway/gateway.go b/gateway/gateway.go index 72d0831b..6ac0abe5 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -237,38 +237,6 @@ func (gw *Gateway) ignoreTextEmpty(msg *config.Message) bool { return true } -// ignoreTexts returns true if msg.Text matches any of the input regexes. -func (gw *Gateway) ignoreTexts(msg *config.Message, input []string) bool { - for _, entry := range input { - if entry == "" { - continue - } - // TODO do not compile regexps everytime - re, err := regexp.Compile(entry) - if err != nil { - flog.Errorf("incorrect regexp %s for %s", entry, msg.Account) - continue - } - if re.MatchString(msg.Text) { - flog.Debugf("matching %s. ignoring %s from %s", entry, msg.Text, msg.Account) - return true - } - } - return false -} - -// ignoreNicks returns true if msg.Username matches any of the input regexes. -func (gw *Gateway) ignoreNicks(msg *config.Message, input []string) bool { - // is the username in IgnoreNicks field - for _, entry := range input { - if msg.Username == entry { - flog.Debugf("ignoring %s from %s", msg.Username, msg.Account) - return true - } - } - return false -} - func (gw *Gateway) ignoreMessage(msg *config.Message) bool { // if we don't have the bridge, ignore it if _, ok := gw.Bridges[msg.Account]; !ok { @@ -277,7 +245,7 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool { igNicks := strings.Fields(gw.Bridges[msg.Account].GetString("IgnoreNicks")) igMessages := strings.Fields(gw.Bridges[msg.Account].GetString("IgnoreMessages")) - if gw.ignoreTextEmpty(msg) || gw.ignoreNicks(msg, igNicks) || gw.ignoreTexts(msg, igMessages) { + if gw.ignoreTextEmpty(msg) || gw.ignoreText(msg.Username, igNicks) || gw.ignoreText(msg.Text, igMessages) { return true } @@ -435,3 +403,23 @@ func getChannelID(msg config.Message) string { func isAPI(account string) bool { return strings.HasPrefix(account, "api.") } + +// ignoreText returns true if text matches any of the input regexes. +func (gw *Gateway) ignoreText(text string, input []string) bool { + for _, entry := range input { + if entry == "" { + continue + } + // TODO do not compile regexps everytime + re, err := regexp.Compile(entry) + if err != nil { + flog.Errorf("incorrect regexp %s", entry) + continue + } + if re.MatchString(text) { + flog.Debugf("matching %s. ignoring %s", entry, text) + return true + } + } + return false +} diff --git a/gateway/gateway_test.go b/gateway/gateway_test.go index cd78fe99..9621ab7d 100644 --- a/gateway/gateway_test.go +++ b/gateway/gateway_test.go @@ -434,68 +434,68 @@ func TestIgnoreTextEmpty(t *testing.T) { func TestIgnoreTexts(t *testing.T) { msgTests := map[string]struct { - input *config.Message + input string re []string output bool }{ "no regex": { - input: &config.Message{Text: "a text message"}, + input: "a text message", re: []string{}, output: false, }, "simple regex": { - input: &config.Message{Text: "a text message"}, + input: "a text message", re: []string{"text"}, output: true, }, "multiple regex fail": { - input: &config.Message{Text: "a text message"}, + input: "a text message", re: []string{"abc", "123$"}, output: false, }, "multiple regex pass": { - input: &config.Message{Text: "a text message"}, + input: "a text message", re: []string{"lala", "sage$"}, output: true, }, } gw := &Gateway{} for testname, testcase := range msgTests { - output := gw.ignoreTexts(testcase.input, testcase.re) + output := gw.ignoreText(testcase.input, testcase.re) assert.Equalf(t, testcase.output, output, "case '%s' failed", testname) } } func TestIgnoreNicks(t *testing.T) { msgTests := map[string]struct { - input *config.Message + input string re []string output bool }{ "no entry": { - input: &config.Message{Username: "user", Text: "a text message"}, + input: "user", re: []string{}, output: false, }, "one entry": { - input: &config.Message{Username: "user", Text: "a text message"}, + input: "user", re: []string{"user"}, output: true, }, "multiple entries": { - input: &config.Message{Username: "user", Text: "a text message"}, + input: "user", re: []string{"abc", "user"}, output: true, }, "multiple entries fail": { - input: &config.Message{Username: "user", Text: "a text message"}, + input: "user", re: []string{"abc", "def"}, output: false, }, } gw := &Gateway{} for testname, testcase := range msgTests { - output := gw.ignoreNicks(testcase.input, testcase.re) + output := gw.ignoreText(testcase.input, testcase.re) assert.Equalf(t, testcase.output, output, "case '%s' failed", testname) } } diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index 77f5b51e..b3851a0e 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -102,6 +102,7 @@ ColorNicks=false RunCommands=["PRIVMSG user hello","PRIVMSG chanserv something"] #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -196,6 +197,7 @@ SkipTLSVerify=true ## Settings below can be reloaded by editing the file #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -276,6 +278,7 @@ Nick="yourlogin" ## Settings below can be reloaded by editing the file #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="spammer1 spammer2" @@ -416,6 +419,7 @@ EditDisable=false EditSuffix=" (edited)" #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -491,6 +495,7 @@ Token="Yourtokenhere" ## Settings below can be reloaded by editing the file #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -609,6 +614,7 @@ EditSuffix=" (edited)" PrefixMessagesWithNick=false #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -722,6 +728,7 @@ EditDisable=false EditSuffix=" (edited)" #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -830,6 +837,7 @@ EditDisable=false EditSuffix=" (edited)" #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="spammer1 spammer2" @@ -945,6 +953,7 @@ SkipTLSVerify=true PrefixMessagesWithNick=false #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="ircspammer1 ircspammer2" @@ -1031,6 +1040,7 @@ NoHomeServerSuffix=false PrefixMessagesWithNick=false #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="spammer1 spammer2" @@ -1111,6 +1121,7 @@ Authcode="ABCE12" PrefixMessagesWithNick=false #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="spammer1 spammer2" @@ -1191,6 +1202,7 @@ Topic="matterbridge" ## Settings below can be reloaded by editing the file #Nicks you want to ignore. +#Regular expressions supported #Messages from those users will not be sent to other bridges. #OPTIONAL IgnoreNicks="spammer1 spammer2"