summaryrefslogtreecommitdiffstats
path: root/bridge/matrix
diff options
context:
space:
mode:
Diffstat (limited to 'bridge/matrix')
-rw-r--r--bridge/matrix/matrix.go92
1 files changed, 92 insertions, 0 deletions
diff --git a/bridge/matrix/matrix.go b/bridge/matrix/matrix.go
new file mode 100644
index 00000000..222a8fd0
--- /dev/null
+++ b/bridge/matrix/matrix.go
@@ -0,0 +1,92 @@
+package bmatrix
+
+import (
+ "github.com/42wim/matterbridge/bridge/config"
+ log "github.com/Sirupsen/logrus"
+ matrix "github.com/matrix-org/gomatrix"
+)
+
+type Bmatrix struct {
+ mc *matrix.Client
+ Config *config.Protocol
+ Remote chan config.Message
+ Account string
+ UserID string
+}
+
+var flog *log.Entry
+var protocol = "matrix"
+
+func init() {
+ flog = log.WithFields(log.Fields{"module": protocol})
+}
+
+func New(cfg config.Protocol, account string, c chan config.Message) *Bmatrix {
+ b := &Bmatrix{}
+ b.Config = &cfg
+ b.Account = account
+ b.Remote = c
+ return b
+}
+
+func (b *Bmatrix) Connect() error {
+ var err error
+ flog.Infof("Connecting %s", b.Config.Server)
+ b.mc, err = matrix.NewClient(b.Config.Server, "", "")
+ if err != nil {
+ flog.Debugf("%#v", err)
+ return err
+ }
+ resp, err := b.mc.Login(&matrix.ReqLogin{
+ Type: "m.login.password",
+ User: b.Config.Login,
+ Password: b.Config.Password,
+ })
+ if err != nil {
+ flog.Debugf("%#v", err)
+ return err
+ }
+ b.mc.SetCredentials(resp.UserID, resp.AccessToken)
+ b.UserID = resp.UserID
+ flog.Info("Connection succeeded")
+ go b.handlematrix()
+ return nil
+}
+
+func (b *Bmatrix) Disconnect() error {
+ return nil
+}
+
+func (b *Bmatrix) JoinChannel(channel string) error {
+ _, err := b.mc.JoinRoom(channel, "", nil)
+ return err
+}
+
+func (b *Bmatrix) Send(msg config.Message) error {
+ flog.Debugf("Receiving %#v", msg)
+ b.mc.SendText(msg.Channel, msg.Username+msg.Text)
+ return nil
+}
+
+func (b *Bmatrix) handlematrix() error {
+ warning := "Not relaying this message, please setup a dedicated bot user"
+ syncer := b.mc.Syncer.(*matrix.DefaultSyncer)
+ syncer.OnEventType("m.room.message", func(ev *matrix.Event) {
+ if ev.Content["msgtype"].(string) == "m.text" && ev.Sender != b.UserID {
+ flog.Debugf("Sending message from %s on %s to gateway", ev.Sender, b.Account)
+ b.Remote <- config.Message{Username: ev.Sender, Text: ev.Content["body"].(string), Channel: ev.RoomID, Account: b.Account}
+ }
+ if ev.Sender == b.UserID && ev.Content["body"].(string) != warning {
+ b.mc.SendText(ev.RoomID, warning)
+ }
+ flog.Debugf("Received: %#v", ev)
+ })
+ go func() {
+ for {
+ if err := b.mc.Sync(); err != nil {
+ flog.Println("Sync() returned ", err)
+ }
+ }
+ }()
+ return nil
+}