From fff6f08cb63cde691a3d5fb8f1c109cbdb470c58 Mon Sep 17 00:00:00 2001 From: Wim Date: Fri, 30 Sep 2016 23:19:47 +0200 Subject: Add samechannel gateway. See #35 --- gateway/samechannel/samechannel.go | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 gateway/samechannel/samechannel.go (limited to 'gateway') 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) + } +} -- cgit v1.2.3