commit 95ed665079d5af48a05ee8a20b9c6cc82a14a9a6
Author: Wim <wim@42.be>
Date: Mon Apr 08 20:58:21 2019 +0000
diff --git a/bridge/config/config.go b/bridge/config/config.go
index 230ddb9..29261d5 100644
--- a/bridge/config/config.go
+++ b/bridge/config/config.go
@@ -1666 +16611 @@ type Gateway struct {
InOut []Bridge
}
+type Tengo struct {
+ Message string
+ RemoteNickFormat string
+}
+
type SameChannelGateway struct {
Name string
Enable bool
@@ -1906 +1957 @@ type BridgeValues struct {
WhatsApp map[string]Protocol // TODO is this struct used? Search for "SlackLegacy" for example didn't return any results
Zulip map[string]Protocol
General Protocol
+ Tengo Tengo
Gateway []Gateway
SameChannelGateway []SameChannelGateway
}
diff --git a/contrib/remotenickformat.tengo b/contrib/remotenickformat.tengo
new file mode 100644
index 0000000..2ca856e
--- /dev/null
+++ b/contrib/remotenickformat.tengo
@@ -00 +19 @@
+/*
+This script will return the current time in kitchen format if the protocol (of the remote bridge) isn't irc
+See https://github.com/d5/tengo/blob/master/docs/stdlib-times.md
+This result can be used in {TENGO} in RemoteNickFormat
+*/
+times := import("times")
+if protocol != "irc" {
+ result=times.time_format(times.now(),times.format_kitchen)
+}
diff --git a/gateway/gateway.go b/gateway/gateway.go
index e76e1d5..d46f75d 100644
--- a/gateway/gateway.go
+++ b/gateway/gateway.go
@@ -3316 +33111 @@ func (gw *Gateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) stri
nick = strings.Replace(nick, "{LABEL}", br.GetString("Label"), -1)
nick = strings.Replace(nick, "{NICK}", msg.Username, -1)
nick = strings.Replace(nick, "{CHANNEL}", msg.Channel, -1)
+ tengoNick, err := gw.modifyUsernameTengo(msg, br)
+ if err != nil {
+ gw.logger.Errorf("modifyUsernameTengo error: %s", err)
+ }
+ nick = strings.Replace(nick, "{TENGO}", tengoNick, -1) //nolint:gocritic
return nick
}
@@ -3476 +3529 @@ func (gw *Gateway) modifyMessage(msg *config.Message) {
if err := modifyMessageTengo(gw.BridgeValues().General.TengoModifyMessage, msg); err != nil {
gw.logger.Errorf("TengoModifyMessage failed: %s", err)
}
+ if err := modifyMessageTengo(gw.BridgeValues().Tengo.Message, msg); err != nil {
+ gw.logger.Errorf("Tengo.Message failed: %s", err)
+ }
// replace :emoji: to unicode
msg.Text = emojilib.Replace(msg.Text)
@@ -5033 +51136 @@ func modifyMessageTengo(filename string, msg *config.Message) error {
msg.Username = c.Get("msgUsername").String()
return nil
}
+
+func (gw *Gateway) modifyUsernameTengo(msg *config.Message, br *bridge.Bridge) (string, error) {
+ filename := gw.BridgeValues().Tengo.RemoteNickFormat
+ if filename == "" {
+ return "", nil
+ }
+ res, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return "", err
+ }
+ s := script.New(res)
+ s.SetImports(stdlib.GetModuleMap(stdlib.AllModuleNames()...))
+ _ = s.Add("result", "")
+ _ = s.Add("msgText", msg.Text)
+ _ = s.Add("msgUsername", msg.Username)
+ _ = s.Add("nick", msg.Username)
+ _ = s.Add("msgAccount", msg.Account)
+ _ = s.Add("msgChannel", msg.Channel)
+ _ = s.Add("channel", msg.Channel)
+ _ = s.Add("msgProtocol", msg.Protocol)
+ _ = s.Add("remoteAccount", br.Account)
+ _ = s.Add("protocol", br.Protocol)
+ _ = s.Add("bridge", br.Name)
+ _ = s.Add("gateway", gw.Name)
+ c, err := s.Compile()
+ if err != nil {
+ return "", err
+ }
+ if err := c.Run(); err != nil {
+ return "", err
+ }
+ return c.Get("result").String(), nil
+}
diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample
index 3b4dc40..6856a83 100644
--- a/matterbridge.toml.sample
+++ b/matterbridge.toml.sample
@@ -14806 +14807 @@ RemoteNickFormat="{NICK}"
#The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge
#The string "{GATEWAY}" (case sensitive) will be replaced by the origin gateway name that is replicating the message.
#The string "{CHANNEL}" (case sensitive) will be replaced by the origin channel name used by the bridge
+#The string "{TENGO}" (case sensitive) will be replaced by the output of the RemoteNickFormat script under [tengo]
#OPTIONAL (default empty)
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
@@ -15526 +155347 @@ IgnoreFailureOnStart=false
#OPTIONAL (default empty)
TengoModifyMessage="example.tengo"
+###################################################################
+#Tengo configuration
+###################################################################
+#More information about tengo on: https://github.com/d5/tengo/blob/master/docs/tutorial.md and
+#https://github.com/d5/tengo/blob/master/docs/stdlib.md
+
+[tengo]
+#Message allows you to specify the location of a tengo (https://github.com/d5/tengo/) script.
+#This script will receive every incoming message and can be used to modify the Username and the Text of that message.
+#The script will have the following global variables:
+#to modify: msgUsername and msgText
+#to read: msgChannel and msgAccount
+#
+#The script is reloaded on every message, so you can modify the script on the fly.
+#
+#Example script can be found in https://github.com/42wim/matterbridge/tree/master/gateway/bench.tengo
+#and https://github.com/42wim/matterbridge/tree/master/contrib/example.tengo
+#
+#The example below will check if the text contains blah and if so, it'll replace the text and the username of that message.
+#text := import("text")
+#if text.re_match("blah",msgText) {
+# msgText="replaced by this"
+# msgUsername="fakeuser"
+#}
+#OPTIONAL (default empty)
+Message="example.tengo"
+
+#RemoteNickFormat allows you to specify the location of a tengo (https://github.com/d5/tengo/) script.
+#The script will have the following global variables:
+#to modify: result
+#to read: channel, bridge, gateway, protocol, nick
+#
+#The result will be set in {TENGO} in the RemoteNickFormat key of every bridge where {TENGO} is specified
+#
+#The script is reloaded on every message, so you can modify the script on the fly.
+#
+#Example script can be found in https://github.com/42wim/matterbridge/tree/master/contrib/remotenickformat.tengo
+#
+#OPTIONAL (default empty)
+RemoteNickFormat="remotenickformat.tengo"
+
###################################################################
#Gateway configuration
###################################################################