| 1 | package brocketchat |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | |
| 6 | "github.com/matterbridge-org/matterbridge/bridge/config" |
| 7 | "github.com/matterbridge-org/matterbridge/bridge/helper" |
| 8 | // Library even upstream no longer actively maintained, should be replaced: |
| 9 | "github.com/matterbridge/Rocket.Chat.Go.SDK/models" |
| 10 | ) |
| 11 | |
| 12 | func (b *Brocketchat) handleRocket() { |
| 13 | messages := make(chan *config.Message) |
| 14 | if b.GetString("WebhookBindAddress") != "" { |
| 15 | b.Log.Debugf("Choosing webhooks based receiving") |
| 16 | go b.handleRocketHook(messages) |
| 17 | } else { |
| 18 | b.Log.Debugf("Choosing login/password based receiving") |
| 19 | go b.handleRocketClient(messages) |
| 20 | } |
| 21 | for message := range messages { |
| 22 | message.Account = b.Account |
| 23 | b.Log.Debugf("<= Sending message from %s on %s to gateway", message.Username, b.Account) |
| 24 | b.Log.Debugf("<= Message is %#v", message) |
| 25 | b.Remote <- *message |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | func (b *Brocketchat) handleRocketHook(messages chan *config.Message) { |
| 30 | for { |
| 31 | message := b.rh.Receive() |
| 32 | b.Log.Debugf("Receiving from rockethook %#v", message) |
| 33 | // do not loop |
| 34 | if message.UserName == b.GetString("Nick") { |
| 35 | continue |
| 36 | } |
| 37 | messages <- &config.Message{ |
| 38 | UserID: message.UserID, |
| 39 | Username: message.UserName, |
| 40 | Text: message.Text, |
| 41 | Channel: message.ChannelName, |
| 42 | } |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | func (b *Brocketchat) handleStatusEvent(ev models.Message, rmsg *config.Message) bool { |
| 47 | switch ev.Type { |
| 48 | case "": |
| 49 | // this is a normal message, no processing needed |
| 50 | // return true so the message is not dropped |
| 51 | return true |
| 52 | case sUserJoined, sUserLeft: |
| 53 | rmsg.Event = config.EventJoinLeave |
| 54 | return true |
| 55 | case sRoomChangedTopic: |
| 56 | rmsg.Event = config.EventTopicChange |
| 57 | return true |
| 58 | } |
| 59 | b.Log.Debugf("Dropping message with unknown type: %s", ev.Type) |
| 60 | return false |
| 61 | } |
| 62 | |
| 63 | func (b *Brocketchat) handleRocketClient(messages chan *config.Message) { |
| 64 | for message := range b.messageChan { |
| 65 | message := message |
| 66 | // skip messages with same ID, apparently messages get duplicated for an unknown reason |
| 67 | if _, ok := b.cache.Get(message.ID); ok { |
| 68 | continue |
| 69 | } |
| 70 | b.cache.Add(message.ID, true) |
| 71 | b.Log.Debugf("message %#v", message) |
| 72 | m := message |
| 73 | if b.skipMessage(&m) { |
| 74 | b.Log.Debugf("Skipped message: %#v", message) |
| 75 | continue |
| 76 | } |
| 77 | |
| 78 | rmsg := &config.Message{Text: message.Msg, |
| 79 | Username: message.User.UserName, |
| 80 | Channel: b.getChannelName(message.RoomID), |
| 81 | Account: b.Account, |
| 82 | UserID: message.User.ID, |
| 83 | ID: message.ID, |
| 84 | Extra: make(map[string][]interface{}), |
| 85 | } |
| 86 | |
| 87 | b.handleAttachments(&message, rmsg) |
| 88 | |
| 89 | // handleStatusEvent returns false if the message should be dropped |
| 90 | // in that case it is probably some modification to the channel we do not want to relay |
| 91 | if b.handleStatusEvent(m, rmsg) { |
| 92 | messages <- rmsg |
| 93 | } |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | func (b *Brocketchat) handleAttachments(message *models.Message, rmsg *config.Message) { |
| 98 | if rmsg.Text == "" { |
| 99 | for _, attachment := range message.Attachments { |
| 100 | if attachment.Title != "" { |
| 101 | rmsg.Text = attachment.Title + "\n" |
| 102 | } |
| 103 | if attachment.Title != "" && attachment.Text != "" { |
| 104 | rmsg.Text += "\n" |
| 105 | } |
| 106 | if attachment.Text != "" { |
| 107 | rmsg.Text += attachment.Text |
| 108 | } |
| 109 | } |
| 110 | } |
| 111 | |
| 112 | for i := range message.Attachments { |
| 113 | if err := b.handleDownloadFile(rmsg, &message.Attachments[i]); err != nil { |
| 114 | b.Log.Errorf("Could not download incoming file: %#v", err) |
| 115 | } |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | func (b *Brocketchat) handleDownloadFile(rmsg *config.Message, file *models.Attachment) error { |
| 120 | downloadURL := b.GetString("server") + file.TitleLink |
| 121 | data, err := helper.DownloadFileAuthRocket(downloadURL, b.user.Token, b.user.ID) |
| 122 | if err != nil { |
| 123 | return fmt.Errorf("download %s failed %#v", downloadURL, err) |
| 124 | } |
| 125 | helper.HandleDownloadData(b.Log, rmsg, file.Title, rmsg.Text, downloadURL, data, b.General) |
| 126 | return nil |
| 127 | } |
| 128 | |
| 129 | func (b *Brocketchat) handleUploadFile(msg *config.Message) error { |
| 130 | for _, f := range msg.Extra["file"] { |
| 131 | fi := f.(config.FileInfo) |
| 132 | if err := b.uploadFile(&fi, b.getChannelID(msg.Channel)); err != nil { |
| 133 | return err |
| 134 | } |
| 135 | } |
| 136 | return nil |
| 137 | } |
| 138 | |