forked from jshiffer/matterbridge
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"
This commit is contained in:
parent
99d9ea283a
commit
7a24de15e4
@ -166,6 +166,11 @@ type Gateway struct {
|
|||||||
InOut []Bridge
|
InOut []Bridge
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Tengo struct {
|
||||||
|
Message string
|
||||||
|
RemoteNickFormat string
|
||||||
|
}
|
||||||
|
|
||||||
type SameChannelGateway struct {
|
type SameChannelGateway struct {
|
||||||
Name string
|
Name string
|
||||||
Enable bool
|
Enable bool
|
||||||
@ -190,6 +195,7 @@ type BridgeValues struct {
|
|||||||
WhatsApp map[string]Protocol // TODO is this struct used? Search for "SlackLegacy" for example didn't return any results
|
WhatsApp map[string]Protocol // TODO is this struct used? Search for "SlackLegacy" for example didn't return any results
|
||||||
Zulip map[string]Protocol
|
Zulip map[string]Protocol
|
||||||
General Protocol
|
General Protocol
|
||||||
|
Tengo Tengo
|
||||||
Gateway []Gateway
|
Gateway []Gateway
|
||||||
SameChannelGateway []SameChannelGateway
|
SameChannelGateway []SameChannelGateway
|
||||||
}
|
}
|
||||||
|
9
contrib/remotenickformat.tengo
Normal file
9
contrib/remotenickformat.tengo
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
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)
|
||||||
|
}
|
@ -331,6 +331,11 @@ func (gw *Gateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) stri
|
|||||||
nick = strings.Replace(nick, "{LABEL}", br.GetString("Label"), -1)
|
nick = strings.Replace(nick, "{LABEL}", br.GetString("Label"), -1)
|
||||||
nick = strings.Replace(nick, "{NICK}", msg.Username, -1)
|
nick = strings.Replace(nick, "{NICK}", msg.Username, -1)
|
||||||
nick = strings.Replace(nick, "{CHANNEL}", msg.Channel, -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
|
return nick
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,6 +352,9 @@ func (gw *Gateway) modifyMessage(msg *config.Message) {
|
|||||||
if err := modifyMessageTengo(gw.BridgeValues().General.TengoModifyMessage, msg); err != nil {
|
if err := modifyMessageTengo(gw.BridgeValues().General.TengoModifyMessage, msg); err != nil {
|
||||||
gw.logger.Errorf("TengoModifyMessage failed: %s", err)
|
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
|
// replace :emoji: to unicode
|
||||||
msg.Text = emojilib.Replace(msg.Text)
|
msg.Text = emojilib.Replace(msg.Text)
|
||||||
@ -503,3 +511,36 @@ func modifyMessageTengo(filename string, msg *config.Message) error {
|
|||||||
msg.Username = c.Get("msgUsername").String()
|
msg.Username = c.Get("msgUsername").String()
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
@ -1480,6 +1480,7 @@ RemoteNickFormat="{NICK}"
|
|||||||
#The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge
|
#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 "{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 "{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)
|
#OPTIONAL (default empty)
|
||||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||||
|
|
||||||
@ -1552,6 +1553,47 @@ IgnoreFailureOnStart=false
|
|||||||
#OPTIONAL (default empty)
|
#OPTIONAL (default empty)
|
||||||
TengoModifyMessage="example.tengo"
|
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
|
#Gateway configuration
|
||||||
###################################################################
|
###################################################################
|
||||||
|
Loading…
Reference in New Issue
Block a user