diff --git a/user.go b/user.go index e8d0fca..f52f5d4 100644 --- a/user.go +++ b/user.go @@ -54,6 +54,8 @@ import ( "go.mau.fi/mautrix-meta/messagix/types" ) +const maxConnectAttempts = 5 + var ( ErrNotConnected = errors.New("not connected") ErrNotLoggedIn = errors.New("not logged in") @@ -469,6 +471,19 @@ func (user *User) GetMXID() id.UserID { var MessagixPlatform types.Platform +func isNotNetworkError(err error) bool { + if errors.Is(err, messagix.ErrTokenInvalidated) || + errors.Is(err, messagix.ErrChallengeRequired) || + errors.Is(err, messagix.ErrConsentRequired) { + return true + } + lsErr := &messagix.LSErrorResponse{} + if errors.As(err, &lsErr) { + return true + } + return false +} + func (user *User) Connect() { user.Lock() defer user.Unlock() @@ -572,10 +587,20 @@ func (user *User) unlockedConnectWithCookies(cookies cookies.Cookies) (*messagix } user.log.Debug().Msg("Connecting to Meta") // TODO set proxy for media client? - cli, err := messagix.NewClient(MessagixPlatform, cookies, log, proxyAddr) - if err != nil { - return nil, fmt.Errorf("failed to prepare client: %w", err) + attempts := 1 + var cli *messagix.Client + for { + cli, err = messagix.NewClient(MessagixPlatform, cookies, log, proxyAddr) + if err != nil { + if attempts > maxConnectAttempts || isNotNetworkError(err) { + return nil, fmt.Errorf("failed to prepare client: %w", err) + } + attempts += 1 + continue + } + break } + if user.bridge.Config.Meta.GetProxyFrom != "" { cli.GetNewProxy = user.getProxy }