Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit f7f5b386568f19de91ba54a8a5e88e9d22362295 Author: Gary Kim <gary@garykim.dev> Date: Tue Jun 01 17:17:07 2021 +0000 Add support for message deletion (nctalk) (#1492) * nctalk: add message deletion support Signed-off-by: Gary Kim <gary@garykim.dev> * nctalk: seperate out deletion and sending logic Signed-off-by: Gary Kim <gary@garykim.dev> * nctalk: update library to v0.2.0 Signed-off-by: Gary Kim <gary@garykim.dev> * Rename functions to be clearer Signed-off-by: Gary Kim <gary@garykim.dev> * Update to go-nc-talk v0.2.1 Signed-off-by: Gary Kim <gary@garykim.dev> * Update to go-nc-talk v0.2.2 Signed-off-by: Gary Kim <gary@garykim.dev> * Make deletions easier to debug Signed-off-by: Gary Kim <gary@garykim.dev> diff --git a/bridge/nctalk/nctalk.go b/bridge/nctalk/nctalk.go index 4537989..9d0d451 100644 --- a/bridge/nctalk/nctalk.go +++ b/bridge/nctalk/nctalk.go @@ -7412 +746 @@ func (b *Btalk) JoinChannel(channel config.ChannelInfo) error {   }   b.rooms = append(b.rooms, newRoom)   - // Config - guestSuffix := " (Guest)" - if b.IsKeySet("GuestSuffix") { - guestSuffix = b.GetString("GuestSuffix") - } -   go func() {   for msg := range c {   msg := msg @@ -9035 +8423 @@ func (b *Btalk) JoinChannel(channel config.ChannelInfo) error {   return   }   - // 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 { + // Ignore messages that are from the bot user + if msg.ActorID == b.user.User {   continue   } - remoteMessage := config.Message{ - Text: formatRichObjectString(msg.Message, msg.MessageParameters), - Channel: newRoom.room.Token, - Username: DisplayName(msg, guestSuffix), - 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) - }   - // Handle Files - err = b.handleFiles(&remoteMessage, &msg) - if err != nil { - b.Log.Errorf("Error handling file: %#v", msg) + // Handle deleting messages + if msg.MessageType == ocs.MessageSystem && msg.Parent != nil && msg.Parent.MessageType == ocs.MessageDelete { + b.handleDeletingMessage(&msg, &newRoom) + continue + }   + // Handle sending messages + if msg.MessageType == ocs.MessageComment { + b.handleSendingMessage(&msg, &newRoom)   continue   }   - b.Log.Debugf("<= Message is %#v", remoteMessage) - b.Remote <- remoteMessage   }   }()   return nil @@ -13126 +11340 @@ func (b *Btalk) Send(msg config.Message) (string, error) {   return "", nil   }   - // Talk currently only supports sending normal messages - if msg.Event != "" { - return "", nil - } + // Standard Message Send + if msg.Event == "" { + // Handle sending files if they are included + err := b.handleSendingFile(&msg, r) + if err != nil { + b.Log.Errorf("Could not send files in message to room %v from %v: %v", msg.Channel, msg.Username, err)   - // Handle sending files if they are included - err := b.handleSendingFile(&msg, r) - if err != nil { - b.Log.Errorf("Could not send files in message to room %v from %v: %v", msg.Channel, msg.Username, err) + return "", nil + }   - 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)   - 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 + }   - return "", nil + // Message Deletion + if msg.Event == config.EventMsgDelete { + messageID, err := strconv.Atoi(msg.ID) + if err != nil { + return "", err + } + data, err := r.room.DeleteMessage(messageID) + if err != nil { + return "", err + } + return strconv.Itoa(data.ID), nil   } - return strconv.Itoa(sentMessage.ID), nil + + // Message is not a type that is currently supported + return "", nil  }    func (b *Btalk) getRoom(token string) *Broom { @@ -2086 +20453 @@ func (b *Btalk) handleSendingFile(msg *config.Message, r *Broom) error {   return nil  }   +func (b *Btalk) handleSendingMessage(msg *ocs.TalkRoomMessageData, r *Broom) { + remoteMessage := config.Message{ + Text: formatRichObjectString(msg.Message, msg.MessageParameters), + Channel: r.room.Token, + Username: DisplayName(msg, b.guestSuffix()), + 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) + } + + // Handle Files + err := b.handleFiles(&remoteMessage, msg) + if err != nil { + b.Log.Errorf("Error handling file: %#v", msg) + + return + } + + b.Log.Debugf("<= Message is %#v", remoteMessage) + b.Remote <- remoteMessage +} + +func (b *Btalk) handleDeletingMessage(msg *ocs.TalkRoomMessageData, r *Broom) { + remoteMessage := config.Message{ + Event: config.EventMsgDelete, + Text: config.EventMsgDelete, + Channel: r.room.Token, + ID: strconv.Itoa(msg.Parent.ID), + Account: b.Account, + } + b.Log.Debugf("<= Message being deleted is %#v", remoteMessage) + b.Remote <- remoteMessage +} + +func (b *Btalk) guestSuffix() string { + guestSuffix := " (Guest)" + if b.IsKeySet("GuestSuffix") { + guestSuffix = b.GetString("GuestSuffix") + } + + return guestSuffix +} +  // Spec: https://github.com/nextcloud/server/issues/1706#issue-182308785  func formatRichObjectString(message string, parameters map[string]ocs.RichObjectString) string {   for id, parameter := range parameters { @@ -2287 +2717 @@ func formatRichObjectString(message string, parameters map[string]ocs.RichObject   return message  }   -func DisplayName(msg ocs.TalkRoomMessageData, suffix string) string { +func DisplayName(msg *ocs.TalkRoomMessageData, suffix string) string {   if msg.ActorType == ocs.ActorGuest {   if msg.ActorDisplayName == "" {   return "Guest" diff --git a/go.mod b/go.mod index bf892fb..00f3bf7 100644 --- a/go.mod +++ b/go.mod @@ -577 +577 @@ require (   github.com/zfjagann/golang-ring v0.0.0-20210116075443-7c86fdb43134   golang.org/x/image v0.0.0-20210504121937-7319ad40d33e   golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c - gomod.garykim.dev/nc-talk v0.1.7 + gomod.garykim.dev/nc-talk v0.2.2   gopkg.in/olahol/melody.v1 v1.0.0-20170518105555-d52139073376   layeh.com/gumble v0.0.0-20200818122324-146f9205029b  ) diff --git a/go.sum b/go.sum index 61d6a01..7ce55f2 100644 --- a/go.sum +++ b/go.sum @@ -12788 +12788 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T  golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=  golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=  golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomod.garykim.dev/nc-talk v0.1.7 h1:G2qsiRcyaj5FEADQlulsBAFJHs27tPmH9VtKK+at9SM= -gomod.garykim.dev/nc-talk v0.1.7/go.mod h1:DNucAJ6zeaumBEwV5NiYk+Eea8Ca+Q5f+plhz9F7d58= +gomod.garykim.dev/nc-talk v0.2.2 h1:+U+daJFPPuwM7yRXYazeMHZgIBSGP6SeQURO0O5a32I= +gomod.garykim.dev/nc-talk v0.2.2/go.mod h1:q/Adot/H7iqi+H4lANopV7/xcMf+sX3AZXUXqiITwok=  google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=  google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=  google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=