Thumbnail

rani/matterbridge.git

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

commit d8f5419277fdd6886912da89597a2b0b2d5503be Author: Wim <wim@42.be> Date: Fri Feb 17 22:08:30 2017 +0000 Refactor samechannelgateway diff --git a/gateway/gateway.go b/gateway/gateway.go index 95bf902..f965f8a 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -1214 +1214 @@ import (    type Gateway struct {   *config.Config - MyConfig *config.Gateway - //Bridges []*bridge.Bridge - Bridges map[string]*bridge.Bridge - ChannelsOut map[string][]string - ChannelsIn map[string][]string - ChannelOptions map[string]config.ChannelOptions - Name string - Message chan config.Message + MyConfig *config.Gateway + Bridges map[string]*bridge.Bridge + ChannelsOut map[string][]string + ChannelsIn map[string][]string + ChannelOptions map[string]config.ChannelOptions + Name string + Message chan config.Message + DestChannelFunc func(msg *config.Message, dest string) []string  }    func New(cfg *config.Config, gateway *config.Gateway) *Gateway { @@ -296 +297 @@ func New(cfg *config.Config, gateway *config.Gateway) *Gateway {   gw.MyConfig = gateway   gw.Message = make(chan config.Message)   gw.Bridges = make(map[string]*bridge.Bridge) + gw.DestChannelFunc = gw.getDestChannel   return gw  }   @@ -1517 +1527 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) {   return   }   originchannel := msg.Channel - channels := gw.getDestChannel(&msg, dest.Account) + channels := gw.DestChannelFunc(&msg, dest.Account)   for _, channel := range channels {   // do not send the message to the bridge we come from if also the channel is the same   if msg.Account == dest.Account && channel == originchannel { diff --git a/gateway/samechannel/samechannel.go b/gateway/samechannel/samechannel.go index bd8e360..47bdfca 100644 --- a/gateway/samechannel/samechannel.go +++ b/gateway/samechannel/samechannel.go @@ -1105 +149 @@  package samechannelgateway    import ( - "github.com/42wim/matterbridge/bridge"   "github.com/42wim/matterbridge/bridge/config" - log "github.com/Sirupsen/logrus" - "strings" + "github.com/42wim/matterbridge/gateway"  )    type SameChannelGateway struct {   *config.Config - MyConfig *config.SameChannelGateway - Bridges map[string]*bridge.Bridge - Channels []string - ignoreNicks map[string][]string - Name string + MyConfig *config.SameChannelGateway + Channels []string + Name string  }   -func New(cfg *config.Config, gateway *config.SameChannelGateway) error { - c := make(chan config.Message) - gw := &SameChannelGateway{} - gw.Bridges = make(map[string]*bridge.Bridge) - 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[account] = bridge.New(cfg, &br, c) - } - for _, br := range gw.Bridges { - err := br.Connect() - if err != nil { - log.Fatalf("Bridge %s failed to start: %v", br.Account, err) - } - for _, channel := range gw.Channels { - log.Infof("%s: joining %s", br.Account, channel) - br.JoinChannel(channel) - } - } - gw.handleReceive(c) - return nil +func New(cfg *config.Config, gatewayCfg *config.SameChannelGateway) *SameChannelGateway { + return &SameChannelGateway{ + MyConfig: gatewayCfg, + Channels: gatewayCfg.Channels, + Name: gatewayCfg.Name, + Config: cfg}  }   -func (gw *SameChannelGateway) handleReceive(c chan config.Message) { - for { - select { - case msg := <-c: - if !gw.ignoreMessage(&msg) { - for _, br := range gw.Bridges { - gw.handleMessage(msg, br) - } - } +func (sgw *SameChannelGateway) Start() error { + gw := gateway.New(sgw.Config, &config.Gateway{Name: sgw.Name}) + gw.DestChannelFunc = sgw.getDestChannel + for _, account := range sgw.MyConfig.Accounts { + for _, channel := range sgw.Channels { + br := config.Bridge{Account: account, Channel: channel} + gw.MyConfig.InOut = append(gw.MyConfig.InOut, br)   }   } + return gw.Start()  }   -func (gw *SameChannelGateway) handleMessage(msg config.Message, dest *bridge.Bridge) { - // is this a configured channel - if !gw.validChannel(msg.Channel) { - return - } - // do not send the message to the bridge we come from if also the channel is the same - if msg.Account == dest.Account { - return - } - gw.modifyUsername(&msg, dest) - log.Debugf("Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, msg.Channel, dest.Account, msg.Channel) - err := dest.Send(msg) - if err != nil { - log.Error(err) - } -} - -func (gw *SameChannelGateway) ignoreMessage(msg *config.Message) bool { - for _, entry := range strings.Fields(gw.Bridges[msg.Account].Config.IgnoreNicks) { - if msg.Username == entry { - log.Debugf("ignoring %s from %s", msg.Username, msg.Account) +func (sgw *SameChannelGateway) validChannel(channel string) bool { + for _, c := range sgw.Channels { + if c == channel {   return true   }   }   return false  }   -func (gw *SameChannelGateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) { - br := gw.Bridges[msg.Account] - nick := gw.Config.General.RemoteNickFormat - if nick == "" { - nick = dest.Config.RemoteNickFormat - } - nick = strings.Replace(nick, "{NICK}", msg.Username, -1) - nick = strings.Replace(nick, "{BRIDGE}", br.Name, -1) - nick = strings.Replace(nick, "{PROTOCOL}", br.Protocol, -1) - msg.Username = nick -} - -func (gw *SameChannelGateway) validChannel(channel string) bool { - for _, c := range gw.Channels { - if c == channel { - return true - } +func (sgw *SameChannelGateway) getDestChannel(msg *config.Message, dest string) []string { + if sgw.validChannel(msg.Channel) { + return []string{msg.Channel}   } - return false + return []string{}  } diff --git a/matterbridge.go b/matterbridge.go index bb125c8..32bc428 100644 --- a/matterbridge.go +++ b/matterbridge.go @@ -3612 +3611 @@ func main() {   continue   }   fmt.Printf("starting samechannel gateway %#v\n", gw.Name) - go func(gw config.SameChannelGateway) { - err := samechannelgateway.New(cfg, &gw) - if err != nil { - log.Fatalf("starting gateway failed %#v", err) - } - }(gw) + g := samechannelgateway.New(cfg, &gw) + err := g.Start() + if err != nil { + log.Fatalf("starting gateway failed %#v", err) + }   }     for _, gw := range cfg.Gateway {