Thumbnail

rani/matterbridge.git

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

Viewing file on branch master

1package brocketchat
2
3import (
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
12func (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
29func (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
46func (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
63func (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
97func (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
119func (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
129func (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