Thumbnail

rani/matterbridge.git

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

Viewing file on branch master

1package brocketchat
2
3import (
4 "context"
5 "io"
6 "mime"
7 "net/http"
8 "net/url"
9 "strings"
10 "time"
11
12 "github.com/matterbridge-org/matterbridge/bridge/config"
13 "github.com/matterbridge-org/matterbridge/bridge/helper"
14 "github.com/matterbridge-org/matterbridge/hook/rockethook"
15 "github.com/matterbridge-org/matterbridge/matterhook"
16 "github.com/nelsonken/gomf"
17
18 // Library even upstream no longer actively maintained, should be replaced:
19 "github.com/matterbridge/Rocket.Chat.Go.SDK/models"
20 "github.com/matterbridge/Rocket.Chat.Go.SDK/realtime"
21 "github.com/matterbridge/Rocket.Chat.Go.SDK/rest"
22)
23
24func (b *Brocketchat) doConnectWebhookBind() error {
25 switch {
26 case b.GetString("WebhookURL") != "":
27 b.Log.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)")
28 b.mh = matterhook.New(b.GetString("WebhookURL"),
29 matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
30 DisableServer: true})
31 b.rh = rockethook.New(b.GetString("WebhookURL"), rockethook.Config{BindAddress: b.GetString("WebhookBindAddress")})
32 case b.GetString("Login") != "":
33 b.Log.Info("Connecting using login/password (sending)")
34 err := b.apiLogin()
35 if err != nil {
36 return err
37 }
38 default:
39 b.Log.Info("Connecting using webhookbindaddress (receiving)")
40 b.rh = rockethook.New(b.GetString("WebhookURL"), rockethook.Config{BindAddress: b.GetString("WebhookBindAddress")})
41 }
42 return nil
43}
44
45func (b *Brocketchat) doConnectWebhookURL() error {
46 b.Log.Info("Connecting using webhookurl (sending)")
47 b.mh = matterhook.New(b.GetString("WebhookURL"),
48 matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
49 DisableServer: true})
50 if b.GetString("Login") != "" {
51 b.Log.Info("Connecting using login/password (receiving)")
52 err := b.apiLogin()
53 if err != nil {
54 return err
55 }
56 }
57 return nil
58}
59
60func (b *Brocketchat) apiLogin() error {
61 b.Log.Debugf("handling apiLogin()")
62 credentials := &models.UserCredentials{Email: b.GetString("login"), Password: b.GetString("password")}
63 if b.GetString("Token") != "" {
64 credentials = &models.UserCredentials{ID: b.GetString("Login"), Token: b.GetString("Token")}
65 }
66 myURL, err := url.Parse(b.GetString("server"))
67 if err != nil {
68 return err
69 }
70 client, err := realtime.NewClient(myURL, b.GetBool("debug"))
71 b.c = client
72 if err != nil {
73 return err
74 }
75 restclient := rest.NewClient(myURL, b.GetBool("debug"))
76 user, err := b.c.Login(credentials)
77 if err != nil {
78 return err
79 }
80 b.user = user
81 b.r = restclient
82 err = b.r.Login(credentials)
83 if err != nil {
84 return err
85 }
86 b.Log.Info("Connection succeeded")
87 return nil
88}
89
90func (b *Brocketchat) getChannelName(id string) string {
91 b.RLock()
92 defer b.RUnlock()
93 if name, ok := b.channelMap[id]; ok {
94 return name
95 }
96 return ""
97}
98
99func (b *Brocketchat) getChannelID(name string) string {
100 b.RLock()
101 defer b.RUnlock()
102 for k, v := range b.channelMap {
103 if v == name || v == "#"+name {
104 return k
105 }
106 }
107 return ""
108}
109
110func (b *Brocketchat) skipMessage(message *models.Message) bool {
111 return message.User.ID == b.user.ID
112}
113
114func (b *Brocketchat) uploadFile(fi *config.FileInfo, channel string) error {
115 fb := gomf.New()
116 if err := fb.WriteField("description", fi.Comment); err != nil {
117 return err
118 }
119 sp := strings.Split(fi.Name, ".")
120 mtype := mime.TypeByExtension("." + sp[len(sp)-1])
121 if !strings.Contains(mtype, "image") && !strings.Contains(mtype, "video") {
122 return nil
123 }
124 if err := fb.WriteFile("file", fi.Name, mtype, *fi.Data); err != nil {
125 return err
126 }
127 req, err := fb.GetHTTPRequest(context.TODO(), b.GetString("server")+"/api/v1/rooms.upload/"+channel)
128 if err != nil {
129 return err
130 }
131 req.Header.Add("X-Auth-Token", b.user.Token)
132 req.Header.Add("X-User-Id", b.user.ID)
133 client := &http.Client{
134 Timeout: time.Second * 5,
135 }
136 resp, err := client.Do(req)
137 if err != nil {
138 return err
139 }
140 defer resp.Body.Close()
141
142 body, err := io.ReadAll(resp.Body)
143 if err != nil {
144 return err
145 }
146 if resp.StatusCode != 200 {
147 b.Log.Errorf("failed: %#v", string(body))
148 }
149 return nil
150}
151
152// sendWebhook uses the configured WebhookURL to send the message
153func (b *Brocketchat) sendWebhook(msg *config.Message) error {
154 // skip events
155 if msg.Event != "" {
156 return nil
157 }
158
159 if b.GetBool("PrefixMessagesWithNick") {
160 msg.Text = msg.Username + msg.Text
161 }
162 if msg.Extra != nil {
163 // this sends a message only if we received a config.EVENT_FILE_FAILURE_SIZE
164 for _, rmsg := range helper.HandleExtra(msg, b.General) {
165 rmsg := rmsg // scopelint
166 iconURL := config.GetIconURL(&rmsg, b.GetString("iconurl"))
167 matterMessage := matterhook.OMessage{
168 IconURL: iconURL,
169 Channel: rmsg.Channel,
170 UserName: rmsg.Username,
171 Text: rmsg.Text,
172 Props: make(map[string]interface{}),
173 }
174 if err := b.mh.Send(matterMessage); err != nil {
175 b.Log.Errorf("sendWebhook failed: %s ", err)
176 }
177 }
178
179 // webhook doesn't support file uploads, so we add the url manually
180 if len(msg.Extra["file"]) > 0 {
181 for _, f := range msg.Extra["file"] {
182 fi := f.(config.FileInfo)
183 if fi.URL != "" {
184 msg.Text += fi.URL
185 }
186 }
187 }
188 }
189 iconURL := config.GetIconURL(msg, b.GetString("iconurl"))
190 matterMessage := matterhook.OMessage{
191 IconURL: iconURL,
192 Channel: msg.Channel,
193 UserName: msg.Username,
194 Text: msg.Text,
195 }
196 if msg.Avatar != "" {
197 matterMessage.IconURL = msg.Avatar
198 }
199 err := b.mh.Send(matterMessage)
200 if err != nil {
201 b.Log.Info(err)
202 return err
203 }
204 return nil
205}
206