Thumbnail

rani/matterbridge.git

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

commit 871f1730ec66d37b51dd71f884b6d3400692eb9b Author: Wim <wim@42.be> Date: Mon Aug 24 00:12:30 2020 +0000 Sleep when ratelimited on joins (matrix). Fixes #1201 (#1206) 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 +}