summaryrefslogtreecommitdiff
path: root/teleirc/matterbridge/bridge/bridge.go
diff options
context:
space:
mode:
Diffstat (limited to 'teleirc/matterbridge/bridge/bridge.go')
-rw-r--r--teleirc/matterbridge/bridge/bridge.go135
1 files changed, 135 insertions, 0 deletions
diff --git a/teleirc/matterbridge/bridge/bridge.go b/teleirc/matterbridge/bridge/bridge.go
new file mode 100644
index 0000000..ef71f97
--- /dev/null
+++ b/teleirc/matterbridge/bridge/bridge.go
@@ -0,0 +1,135 @@
+package bridge
+
+import (
+ "log"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/42wim/matterbridge/bridge/config"
+ "github.com/sirupsen/logrus"
+)
+
+type Bridger interface {
+ Send(msg config.Message) (string, error)
+ Connect() error
+ JoinChannel(channel config.ChannelInfo) error
+ Disconnect() error
+}
+
+type Bridge struct {
+ Bridger
+ *sync.RWMutex
+
+ Name string
+ Account string
+ Protocol string
+ Channels map[string]config.ChannelInfo
+ Joined map[string]bool
+ ChannelMembers *config.ChannelMembers
+ Log *logrus.Entry
+ Config config.Config
+ General *config.Protocol
+}
+
+type Config struct {
+ *Bridge
+
+ Remote chan config.Message
+}
+
+// Factory is the factory function to create a bridge
+type Factory func(*Config) Bridger
+
+func New(bridge *config.Bridge) *Bridge {
+ accInfo := strings.Split(bridge.Account, ".")
+ if len(accInfo) != 2 {
+ log.Fatalf("config failure, account incorrect: %s", bridge.Account)
+ }
+
+ protocol := accInfo[0]
+ name := accInfo[1]
+
+ return &Bridge{
+ RWMutex: new(sync.RWMutex),
+ Channels: make(map[string]config.ChannelInfo),
+ Name: name,
+ Protocol: protocol,
+ Account: bridge.Account,
+ Joined: make(map[string]bool),
+ }
+}
+
+func (b *Bridge) JoinChannels() error {
+ return b.joinChannels(b.Channels, b.Joined)
+}
+
+// SetChannelMembers sets the newMembers to the bridge ChannelMembers
+func (b *Bridge) SetChannelMembers(newMembers *config.ChannelMembers) {
+ b.Lock()
+ b.ChannelMembers = newMembers
+ b.Unlock()
+}
+
+func (b *Bridge) joinChannels(channels map[string]config.ChannelInfo, exists map[string]bool) error {
+ for ID, channel := range channels {
+ if !exists[ID] {
+ b.Log.Infof("%s: joining %s (ID: %s)", b.Account, channel.Name, ID)
+ time.Sleep(time.Duration(b.GetInt("JoinDelay")) * time.Millisecond)
+ err := b.JoinChannel(channel)
+ if err != nil {
+ return err
+ }
+ exists[ID] = true
+ }
+ }
+ return nil
+}
+
+func (b *Bridge) GetConfigKey(key string) string {
+ return b.Account + "." + key
+}
+
+func (b *Bridge) IsKeySet(key string) bool {
+ return b.Config.IsKeySet(b.GetConfigKey(key)) || b.Config.IsKeySet("general."+key)
+}
+
+func (b *Bridge) GetBool(key string) bool {
+ val, ok := b.Config.GetBool(b.GetConfigKey(key))
+ if !ok {
+ val, _ = b.Config.GetBool("general." + key)
+ }
+ return val
+}
+
+func (b *Bridge) GetInt(key string) int {
+ val, ok := b.Config.GetInt(b.GetConfigKey(key))
+ if !ok {
+ val, _ = b.Config.GetInt("general." + key)
+ }
+ return val
+}
+
+func (b *Bridge) GetString(key string) string {
+ val, ok := b.Config.GetString(b.GetConfigKey(key))
+ if !ok {
+ val, _ = b.Config.GetString("general." + key)
+ }
+ return val
+}
+
+func (b *Bridge) GetStringSlice(key string) []string {
+ val, ok := b.Config.GetStringSlice(b.GetConfigKey(key))
+ if !ok {
+ val, _ = b.Config.GetStringSlice("general." + key)
+ }
+ return val
+}
+
+func (b *Bridge) GetStringSlice2D(key string) [][]string {
+ val, ok := b.Config.GetStringSlice2D(b.GetConfigKey(key))
+ if !ok {
+ val, _ = b.Config.GetStringSlice2D("general." + key)
+ }
+ return val
+}