diff --git a/bridge/config/config.go b/bridge/config/config.go index 290108af..7d4b0cd1 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -56,14 +56,22 @@ type Gateway struct { Out []Bridge } +type SameChannelGateway struct { + Name string + Enable bool + Channels []string + Accounts []string +} + type Config struct { - IRC map[string]Protocol - Mattermost map[string]Protocol - Slack map[string]Protocol - Gitter map[string]Protocol - Xmpp map[string]Protocol - Discord map[string]Protocol - Gateway []Gateway + IRC map[string]Protocol + Mattermost map[string]Protocol + Slack map[string]Protocol + Gitter map[string]Protocol + Xmpp map[string]Protocol + Discord map[string]Protocol + Gateway []Gateway + SameChannelGateway []SameChannelGateway } func NewConfig(cfgfile string) *Config { diff --git a/gateway/samechannel/samechannel.go b/gateway/samechannel/samechannel.go new file mode 100644 index 00000000..1ed43750 --- /dev/null +++ b/gateway/samechannel/samechannel.go @@ -0,0 +1,84 @@ +package samechannelgateway + +import ( + "github.com/42wim/matterbridge/bridge" + "github.com/42wim/matterbridge/bridge/config" + log "github.com/Sirupsen/logrus" + "strings" +) + +type SameChannelGateway struct { + *config.Config + MyConfig *config.SameChannelGateway + Bridges []bridge.Bridge + Channels []string + ignoreNicks map[string][]string + Name string +} + +func New(cfg *config.Config, gateway *config.SameChannelGateway) error { + c := make(chan config.Message) + gw := &SameChannelGateway{} + gw.Name = gateway.Name + gw.Config = cfg + gw.MyConfig = gateway + gw.Channels = gateway.Channels + for _, account := range gateway.Accounts { + br := config.Bridge{Account: account} + log.Infof("Starting bridge: %s", account) + gw.Bridges = append(gw.Bridges, bridge.New(cfg, &br, c)) + } + for _, br := range gw.Bridges { + br.Connect() + for _, channel := range gw.Channels { + log.Infof("%s: joining %s", br.FullOrigin(), channel) + br.JoinChannel(channel) + } + } + gw.handleReceive(c) + return nil +} + +func (gw *SameChannelGateway) handleReceive(c chan config.Message) { + for { + select { + case msg := <-c: + for _, br := range gw.Bridges { + gw.handleMessage(msg, br) + } + } + } +} + +func (gw *SameChannelGateway) handleMessage(msg config.Message, dest bridge.Bridge) { + // do not send the message to the bridge we come from if also the channel is the same + if msg.FullOrigin == dest.FullOrigin() { + return + } + gw.modifyMessage(&msg, dest) + log.Debugf("Sending %#v from %s to %s", msg, msg.FullOrigin, dest.FullOrigin()) + dest.Send(msg) +} + +func setNickFormat(msg *config.Message, format string) { + if format == "" { + msg.Username = msg.Protocol + "." + msg.Origin + "-" + msg.Username + ": " + return + } + msg.Username = strings.Replace(format, "{NICK}", msg.Username, -1) + msg.Username = strings.Replace(msg.Username, "{BRIDGE}", msg.Origin, -1) + msg.Username = strings.Replace(msg.Username, "{PROTOCOL}", msg.Protocol, -1) +} + +func (gw *SameChannelGateway) modifyMessage(msg *config.Message, dest bridge.Bridge) { + switch dest.Protocol() { + case "irc": + setNickFormat(msg, gw.Config.IRC[dest.Origin()].RemoteNickFormat) + case "mattermost": + setNickFormat(msg, gw.Config.Mattermost[dest.Origin()].RemoteNickFormat) + case "slack": + setNickFormat(msg, gw.Config.Slack[dest.Origin()].RemoteNickFormat) + case "discord": + setNickFormat(msg, gw.Config.Discord[dest.Origin()].RemoteNickFormat) + } +} diff --git a/matterbridge.go b/matterbridge.go index 470c6056..28a76fa1 100644 --- a/matterbridge.go +++ b/matterbridge.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/42wim/matterbridge/bridge/config" "github.com/42wim/matterbridge/gateway" + "github.com/42wim/matterbridge/gateway/samechannel" log "github.com/Sirupsen/logrus" ) @@ -30,6 +31,19 @@ func main() { } fmt.Println("running version", version) cfg := config.NewConfig(*flagConfig) + for _, gw := range cfg.SameChannelGateway { + if !gw.Enable { + continue + } + fmt.Printf("starting samechannel gateway %#v\n", gw.Name) + go func(gw config.SameChannelGateway) { + err := samechannelgateway.New(cfg, &gw) + if err != nil { + log.Debugf("starting gateway failed %#v", err) + } + }(gw) + } + for _, gw := range cfg.Gateway { if !gw.Enable { continue