commit 99c1f057e30ba49db98d3c5e1d8ae0627548e37e
Author: Wim <wim@42.be>
Date: Sat Feb 23 16:35:54 2019 +0000
diff --git a/gateway/gateway.go b/gateway/gateway.go
index 0c04a16..2f79773 100644
--- a/gateway/gateway.go
+++ b/gateway/gateway.go
@@ -3516 +3518 @@ func (gw *Gateway) modifyMessage(msg *config.Message) {
msg.Text = re.ReplaceAllString(msg.Text, replace)
}
+ gw.handleExtractNicks(msg)
+
// messages from api have Gateway specified, don't overwrite
if msg.Protocol != apiProtocol {
msg.Gateway = gw.Name
diff --git a/gateway/handlers.go b/gateway/handlers.go
index 5af13c1..dfec2ab 100644
--- a/gateway/handlers.go
+++ b/gateway/handlers.go
@@ -96 +97 @@ import (
"os"
"path/filepath"
"regexp"
+ "strings"
"time"
"github.com/42wim/matterbridge/bridge"
@@ -2253 +22641 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrM
}
return brMsgIDs
}
+
+func (gw *Gateway) handleExtractNicks(msg *config.Message) {
+ var err error
+ br := gw.Bridges[msg.Account]
+ for _, outer := range br.GetStringSlice2D("ExtractNicks") {
+ search := outer[0]
+ replace := outer[1]
+ msg.Username, msg.Text, err = extractNick(search, replace, msg.Username, msg.Text)
+ if err != nil {
+ flog.Errorf("regexp in %s failed: %s", msg.Account, err)
+ break
+ }
+ }
+}
+
+// extractNick searches for a username (based on "search" a regular expression).
+// if this matches it extracts a nick (based on "extract" another regular expression) from text
+// and replaces username with this result.
+// returns error if the regexp doesn't compile.
+func extractNick(search, extract, username, text string) (string, string, error) {
+ re, err := regexp.Compile(search)
+ if err != nil {
+ return username, text, err
+ }
+ if re.MatchString(username) {
+ re, err = regexp.Compile(extract)
+ if err != nil {
+ return username, text, err
+ }
+ res := re.FindAllStringSubmatch(text, 1)
+ // only replace if we have exactly 1 match
+ if len(res) > 0 && len(res[0]) == 2 {
+ username = res[0][1]
+ text = strings.Replace(text, res[0][0], "", 1)
+ }
+ }
+ return username, text, nil
+}
diff --git a/gateway/handlers_test.go b/gateway/handlers_test.go
new file mode 100644
index 0000000..db7988a
--- /dev/null
+++ b/gateway/handlers_test.go
@@ -00 +175 @@
+package gateway
+
+import (
+ "github.com/42wim/matterbridge/bridge"
+ "github.com/42wim/matterbridge/bridge/config"
+ "github.com/stretchr/testify/assert"
+
+ "testing"
+)
+
+func TestIgnoreEvent(t *testing.T) {
+ eventTests := map[string]struct {
+ input string
+ dest *bridge.Bridge
+ output bool
+ }{
+ "avatar mattermost": {
+ input: config.EventAvatarDownload,
+ dest: &bridge.Bridge{Protocol: "mattermost"},
+ output: false,
+ },
+ "avatar slack": {
+ input: config.EventAvatarDownload,
+ dest: &bridge.Bridge{Protocol: "slack"},
+ output: true,
+ },
+ "avatar telegram": {
+ input: config.EventAvatarDownload,
+ dest: &bridge.Bridge{Protocol: "telegram"},
+ output: false,
+ },
+ }
+ gw := &Gateway{}
+ for testname, testcase := range eventTests {
+ output := gw.ignoreEvent(testcase.input, testcase.dest)
+ assert.Equalf(t, testcase.output, output, "case '%s' failed", testname)
+ }
+
+}
+
+func TestExtractNick(t *testing.T) {
+ eventTests := map[string]struct {
+ search string
+ extract string
+ username string
+ text string
+ resultUsername string
+ resultText string
+ }{
+ "test1": {
+ search: "fromgitter",
+ extract: "<(.*?)>\\s+",
+ username: "fromgitter",
+ text: "<userx> blahblah",
+ resultUsername: "userx",
+ resultText: "blahblah",
+ },
+ "test2": {
+ search: "<.*?bot>",
+ //extract: `\((.*?)\)\s+`,
+ extract: "\\((.*?)\\)\\s+",
+ username: "<matterbot>",
+ text: "(userx) blahblah (abc) test",
+ resultUsername: "userx",
+ resultText: "blahblah (abc) test",
+ },
+ }
+ // gw := &Gateway{}
+ for testname, testcase := range eventTests {
+ resultUsername, resultText, _ := extractNick(testcase.search, testcase.extract, testcase.username, testcase.text)
+ assert.Equalf(t, testcase.resultUsername, resultUsername, "case '%s' failed", testname)
+ assert.Equalf(t, testcase.resultText, resultText, "case '%s' failed", testname)
+ }
+
+}
diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample
index 453bc1b..51faa19 100644
--- a/matterbridge.toml.sample
+++ b/matterbridge.toml.sample
@@ -1306 +13017 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -2256 +23617 @@ ReplaceMessages=[ ["cat","dog"] ]
#OPTIONAL (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -3066 +32817 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -4476 +48017 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -5236 +56717 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -6466 +70117 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -7646 +83017 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -8736 +95017 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -9896 +107717 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -10766 +117517 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -11576 +126717 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""
@@ -12756 +139617 @@ ReplaceMessages=[ ["cat","dog"] ]
#optional (default empty)
ReplaceNicks=[ ["user--","user"] ]
+#Extractnicks is used to for example rewrite messages from other relaybots
+#See https://github.com/42wim/matterbridge/issues/713 and https://github.com/42wim/matterbridge/issues/466
+#some examples:
+#this replaces a message like "Relaybot: <relayeduser> something interesting" to "relayeduser: something interesting"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ] ]
+#you can use multiple entries for multiplebots
+#this also replaces a message like "otherbot: (relayeduser) something else" to "relayeduser: something else"
+#ExtractNicks=[ [ "Relaybot", "<(.*?)>\\s+" ],[ "otherbot","\\((.*?)\\)\\s+" ]
+#OPTIONAL (default empty)
+ExtractNicks=[ ["otherbot","<(.*?)>\\s+" ] ]
+
#extra label that can be used in the RemoteNickFormat
#optional (default empty)
Label=""