diff --git a/gateway/gateway.go b/gateway/gateway.go index 13b6be1b..07fcdafc 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -17,49 +17,60 @@ type Gateway struct { ChannelsIn map[string][]string ignoreNicks map[string][]string Name string + Message chan config.Message } -func New(cfg *config.Config, gateway *config.Gateway) error { - c := make(chan config.Message) +func New(cfg *config.Config, gateway *config.Gateway) *Gateway { gw := &Gateway{} gw.Name = gateway.Name gw.Config = cfg gw.MyConfig = gateway - exists := make(map[string]bool) - for _, br := range append(gateway.In, gateway.Out...) { - if exists[br.Account] { - continue - } - log.Infof("Starting bridge: %s channel: %s", br.Account, br.Channel) - gw.Bridges = append(gw.Bridges, bridge.New(cfg, &br, c)) - exists[br.Account] = true - } - gw.mapChannels() - //TODO fix mapIgnores - //gw.mapIgnores() - exists = make(map[string]bool) + gw.Message = make(chan config.Message) + return gw +} + +func (gw *Gateway) AddBridge(cfg *config.Bridge) error { for _, br := range gw.Bridges { - err := br.Connect() - if err != nil { - log.Fatalf("Bridge %s failed to start: %v", br.FullOrigin(), err) + if br.FullOrigin() == cfg.Account { + return nil } - for _, channel := range append(gw.ChannelsOut[br.FullOrigin()], gw.ChannelsIn[br.FullOrigin()]...) { - if exists[br.FullOrigin()+channel] { - continue - } + } + log.Infof("Starting bridge: %s ", cfg.Account) + br := bridge.New(gw.Config, cfg, gw.Message) + gw.Bridges = append(gw.Bridges, br) + err := br.Connect() + if err != nil { + return fmt.Errorf("Bridge %s failed to start: %v", br.FullOrigin(), err) + } + exists := make(map[string]bool) + for _, channel := range append(gw.ChannelsOut[br.FullOrigin()], gw.ChannelsIn[br.FullOrigin()]...) { + if !exists[br.FullOrigin()+channel] { log.Infof("%s: joining %s", br.FullOrigin(), channel) br.JoinChannel(channel) exists[br.FullOrigin()+channel] = true } } - gw.handleReceive(c) return nil } -func (gw *Gateway) handleReceive(c chan config.Message) { +func (gw *Gateway) Start() error { + gw.mapChannels() + for _, br := range append(gw.MyConfig.In, gw.MyConfig.Out...) { + err := gw.AddBridge(&br) + if err != nil { + return err + } + } + //TODO fix mapIgnores + //gw.mapIgnores() + go gw.handleReceive() + return nil +} + +func (gw *Gateway) handleReceive() { for { select { - case msg := <-c: + case msg := <-gw.Message: for _, br := range gw.Bridges { gw.handleMessage(msg, br) } diff --git a/matterbridge.go b/matterbridge.go index 28a76fa1..0096b0a0 100644 --- a/matterbridge.go +++ b/matterbridge.go @@ -49,12 +49,11 @@ func main() { continue } fmt.Printf("starting gateway %#v\n", gw.Name) - go func(gw config.Gateway) { - err := gateway.New(cfg, &gw) - if err != nil { - log.Debugf("starting gateway failed %#v", err) - } - }(gw) + g := gateway.New(cfg, &gw) + err := g.Start() + if err != nil { + log.Debugf("starting gateway failed %#v", err) + } } select {} }