summaryrefslogtreecommitdiffstats
path: root/bridge/nctalk/nctalk.go
diff options
context:
space:
mode:
authorGary Kim <gary@garykim.dev>2020-07-18 22:08:25 +0800
committerGitHub <noreply@github.com>2020-07-18 16:08:25 +0200
commit71a5b72aff5159f3066ff100e1510d935ebdff85 (patch)
treef940bc6e7aa86e1ca818929fb4c2917983a32177 /bridge/nctalk/nctalk.go
parent213bf349c319811c8cb5458ac24ad9e61c5bbe4d (diff)
downloadmatterbridge-msglm-71a5b72aff5159f3066ff100e1510d935ebdff85.tar.gz
matterbridge-msglm-71a5b72aff5159f3066ff100e1510d935ebdff85.tar.bz2
matterbridge-msglm-71a5b72aff5159f3066ff100e1510d935ebdff85.zip
Add Nextcloud Talk support (#1167)
Signed-off-by: Gary Kim <gary@garykim.dev>
Diffstat (limited to 'bridge/nctalk/nctalk.go')
-rw-r--r--bridge/nctalk/nctalk.go114
1 files changed, 114 insertions, 0 deletions
diff --git a/bridge/nctalk/nctalk.go b/bridge/nctalk/nctalk.go
new file mode 100644
index 00000000..7f7d8ab9
--- /dev/null
+++ b/bridge/nctalk/nctalk.go
@@ -0,0 +1,114 @@
+package nctalk
+
+import (
+ "context"
+ "strconv"
+
+ "github.com/42wim/matterbridge/bridge"
+ "github.com/42wim/matterbridge/bridge/config"
+
+ talk "gomod.garykim.dev/nc-talk"
+ "gomod.garykim.dev/nc-talk/ocs"
+ "gomod.garykim.dev/nc-talk/room"
+ "gomod.garykim.dev/nc-talk/user"
+)
+
+type Btalk struct {
+ user *user.TalkUser
+ rooms []Broom
+ *bridge.Config
+}
+
+func New(cfg *bridge.Config) bridge.Bridger {
+ return &Btalk{Config: cfg}
+}
+
+type Broom struct {
+ room *room.TalkRoom
+ ctx context.Context
+ ctxCancel context.CancelFunc
+}
+
+func (b *Btalk) Connect() error {
+ b.Log.Info("Connecting")
+ b.user = talk.NewUser(b.GetString("Server"), b.GetString("Login"), b.GetString("Password"))
+ _, err := b.user.Capabilities()
+ if err != nil {
+ b.Log.Error("Cannot Connect")
+ return err
+ }
+ b.Log.Info("Connected")
+ return nil
+}
+
+func (b *Btalk) Disconnect() error {
+ for _, r := range b.rooms {
+ r.ctxCancel()
+ }
+ return nil
+}
+
+func (b *Btalk) JoinChannel(channel config.ChannelInfo) error {
+ newRoom := Broom{
+ room: talk.NewRoom(b.user, channel.Name),
+ }
+ newRoom.ctx, newRoom.ctxCancel = context.WithCancel(context.Background())
+ c, err := newRoom.room.ReceiveMessages(newRoom.ctx)
+ if err != nil {
+ return err
+ }
+ b.rooms = append(b.rooms, newRoom)
+ go func() {
+ for msg := range c {
+ // ignore messages that are one of the following
+ // * not a message from a user
+ // * from ourselves
+ if msg.MessageType != ocs.MessageComment || msg.ActorID == b.user.User {
+ continue
+ }
+ remoteMessage := config.Message{
+ Text: msg.Message,
+ Channel: newRoom.room.Token,
+ Username: msg.ActorDisplayName,
+ UserID: msg.ActorID,
+ Account: b.Account,
+ }
+ // It is possible for the ID to not be set on older versions of Talk so we only set it if
+ // the ID is not blank
+ if msg.ID != 0 {
+ remoteMessage.ID = strconv.Itoa(msg.ID)
+ }
+ b.Log.Debugf("<= Message is %#v", remoteMessage)
+ b.Remote <- remoteMessage
+ }
+ }()
+ return nil
+}
+
+func (b *Btalk) Send(msg config.Message) (string, error) {
+ r := b.getRoom(msg.Channel)
+ if r == nil {
+ b.Log.Errorf("Could not find room for %v", msg.Channel)
+ return "", nil
+ }
+
+ // Talk currently only supports sending normal messages
+ if msg.Event != "" {
+ return "", nil
+ }
+ sentMessage, err := r.room.SendMessage(msg.Username + msg.Text)
+ if err != nil {
+ b.Log.Errorf("Could not send message to room %v from %v: %v", msg.Channel, msg.Username, err)
+ return "", nil
+ }
+ return strconv.Itoa(sentMessage.ID), nil
+}
+
+func (b *Btalk) getRoom(token string) *Broom {
+ for _, r := range b.rooms {
+ if r.room.Token == token {
+ return &r
+ }
+ }
+ return nil
+}