Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 95ed665079d5af48a05ee8a20b9c6cc82a14a9a6 Author: Wim <wim@42.be> Date: Mon Apr 08 20:58:21 2019 +0000 Add tengo support to RemoteNickFormat (#793) This commit add support for using the result of a tengo script in RemoteNickFormat using {TENGO} Also adds a new toml table [tengo] with key RemoteNickFormat and value location of the script. This also moves the TengoModifyMessage from [general] to Message in [tengo] Documentation: 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 [tengo] RemoteNickFormat="remotenickformat.tengo" 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  ###################################################################