commit 871f1730ec66d37b51dd71f884b6d3400692eb9b
Author: Wim <wim@42.be>
Date: Mon Aug 24 00:12:30 2020 +0000
diff --git a/bridge/matrix/matrix.go b/bridge/matrix/matrix.go
index 615dcfb..c2305bd 100644
--- a/bridge/matrix/matrix.go
+++ b/bridge/matrix/matrix.go
@@ -212 +214 @@ package bmatrix
import (
"bytes"
+ "encoding/json"
"fmt"
"html"
"mime"
"regexp"
"strings"
"sync"
+ "time"
"github.com/42wim/matterbridge/bridge"
"github.com/42wim/matterbridge/bridge/config"
@@ -256 +2712 @@ type Bmatrix struct {
*bridge.Config
}
+type httpError struct {
+ Errcode string `json:"errcode"`
+ Err string `json:"error"`
+ RetryAfterMs int `json:"retry_after_ms"`
+}
+
func New(cfg *bridge.Config) bridge.Bridger {
b := &Bmatrix{Config: cfg}
b.htmlTag = regexp.MustCompile("</.*?>")
@@ -6014 +6825 @@ func (b *Bmatrix) Disconnect() error {
}
func (b *Bmatrix) JoinChannel(channel config.ChannelInfo) error {
+retry:
resp, err := b.mc.JoinRoom(channel.Name, "", nil)
if err != nil {
+ httpErr := handleError(err)
+ if httpErr.Errcode == "M_LIMIT_EXCEEDED" {
+ b.Log.Infof("getting ratelimited by matrix, sleeping approx %d seconds before joining %s", httpErr.RetryAfterMs/1000, channel.Name)
+ time.Sleep((time.Duration(httpErr.RetryAfterMs) * time.Millisecond))
+
+ goto retry
+ }
+
return err
}
+
b.Lock()
b.RoomMap[resp.RoomID] = channel.Name
b.Unlock()
- return err
+
+ return nil
}
func (b *Bmatrix) Send(msg config.Message) (string, error) {
@@ -3943 +41322 @@ func (b *Bmatrix) getAvatarURL(sender string) string {
}
return url
}
+
+func handleError(err error) *httpError {
+ mErr, ok := err.(matrix.HTTPError)
+ if !ok {
+ return &httpError{
+ Err: "not a HTTPError",
+ }
+ }
+
+ var httpErr httpError
+
+ if err := json.Unmarshal(mErr.Contents, &httpErr); err != nil {
+ return &httpError{
+ Err: "unmarshal failed",
+ }
+ }
+
+ return &httpErr
+}