package bridge import ( "github.com/42wim/matterbridge/bridge/config" "github.com/42wim/matterbridge/bridge/discord" "github.com/42wim/matterbridge/bridge/gitter" "github.com/42wim/matterbridge/bridge/irc" "github.com/42wim/matterbridge/bridge/mattermost" "github.com/42wim/matterbridge/bridge/rocketchat" "github.com/42wim/matterbridge/bridge/slack" "github.com/42wim/matterbridge/bridge/telegram" "github.com/42wim/matterbridge/bridge/xmpp" log "github.com/Sirupsen/logrus" "strings" ) type Bridger interface { Send(msg config.Message) error Connect() error JoinChannel(channel string) error Disconnect() error } type Bridge struct { Config config.Protocol Bridger Name string Account string Protocol string ChannelsOut []string ChannelsIn []string ChannelOptions config.ChannelOptions } func New(cfg *config.Config, bridge *config.Bridge, c chan config.Message) *Bridge { b := new(Bridge) accInfo := strings.Split(bridge.Account, ".") protocol := accInfo[0] name := accInfo[1] b.Name = name b.Protocol = protocol b.Account = bridge.Account // override config from environment config.OverrideCfgFromEnv(cfg, protocol, name) switch protocol { case "mattermost": b.Config = cfg.Mattermost[name] b.Bridger = bmattermost.New(cfg.Mattermost[name], bridge.Account, c) case "irc": b.Config = cfg.IRC[name] b.Bridger = birc.New(cfg.IRC[name], bridge.Account, c) case "gitter": b.Config = cfg.Gitter[name] b.Bridger = bgitter.New(cfg.Gitter[name], bridge.Account, c) case "slack": b.Config = cfg.Slack[name] b.Bridger = bslack.New(cfg.Slack[name], bridge.Account, c) case "xmpp": b.Config = cfg.Xmpp[name] b.Bridger = bxmpp.New(cfg.Xmpp[name], bridge.Account, c) case "discord": b.Config = cfg.Discord[name] b.Bridger = bdiscord.New(cfg.Discord[name], bridge.Account, c) case "telegram": b.Config = cfg.Telegram[name] b.Bridger = btelegram.New(cfg.Telegram[name], bridge.Account, c) case "rocketchat": b.Config = cfg.Rocketchat[name] b.Bridger = brocketchat.New(cfg.Rocketchat[name], bridge.Account, c) } return b } func (b *Bridge) JoinChannels() error { exists := make(map[string]bool) for _, channel := range append(b.ChannelsIn, b.ChannelsOut...) { if !exists[channel] { log.Infof("%s: joining %s", b.Account, channel) b.JoinChannel(channel) exists[channel] = true } } return nil }