From 14c784f2a22478c0cbd77509c36ee74ac6f95dbf Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Fri, 23 May 2025 09:17:30 +0300 Subject: [PATCH] client: unblock connect without network It'll still probably not race too much if disconnect gets called while connecting is still stuck doing something. --- pkg/connector/client.go | 80 +++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index bf64c0ee..0e924ab8 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -498,48 +498,52 @@ func (t *TelegramClient) Connect(ctx context.Context) { var err error t.clientCtx, t.clientCancel = context.WithCancel(ctx) - if t.clientCloseC, err = connectTelegramClient(t.clientCtx, t.clientCancel, t.client); err != nil { - t.sendBadCredentialsOrUnknownError(err) - return - } t.updatesCloseC = make(chan struct{}) go func() { - defer close(t.updatesCloseC) - for { - err = t.updatesManager.Run(t.clientCtx, t.client.API(), t.telegramUserID, updates.AuthOptions{}) - if err == nil || errors.Is(err, context.Canceled) { - return - } - - zerolog.Ctx(t.clientCtx).Err(err).Msg("failed to run updates manager, retrying") - - select { - case <-t.clientCtx.Done(): - return - case <-time.After(5 * time.Second): - } + if t.clientCloseC, err = connectTelegramClient(t.clientCtx, t.clientCancel, t.client); err != nil { + t.sendBadCredentialsOrUnknownError(err) + close(t.updatesCloseC) + return } + + go func() { + defer close(t.updatesCloseC) + for { + err = t.updatesManager.Run(t.clientCtx, t.client.API(), t.telegramUserID, updates.AuthOptions{}) + if err == nil || errors.Is(err, context.Canceled) { + return + } + + zerolog.Ctx(t.clientCtx).Err(err).Msg("failed to run updates manager, retrying") + + select { + case <-t.clientCtx.Done(): + return + case <-time.After(5 * time.Second): + } + } + }() + + // Update the logged-in user's ghost info (this also updates the user + // login's remote name and profile). + if me, err := t.client.Self(t.clientCtx); err != nil { + t.sendBadCredentialsOrUnknownError(err) + } else if _, err := t.updateGhost(t.clientCtx, t.telegramUserID, me); err != nil { + t.sendBadCredentialsOrUnknownError(err) + } else { + t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) + } + + // Fix the "Telegram Saved Messages" chat + t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{ + ChatInfo: t.getDMChatInfo(t.telegramUserID), + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatResync, + PortalKey: t.makePortalKeyFromID(ids.PeerTypeUser, t.telegramUserID), + CreatePortal: false, // Do not create the portal if it doesn't already exist + }, + }) }() - - // Update the logged-in user's ghost info (this also updates the user - // login's remote name and profile). - if me, err := t.client.Self(t.clientCtx); err != nil { - t.sendBadCredentialsOrUnknownError(err) - } else if _, err := t.updateGhost(t.clientCtx, t.telegramUserID, me); err != nil { - t.sendBadCredentialsOrUnknownError(err) - } else { - t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) - } - - // Fix the "Telegram Saved Messages" chat - t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.ChatResync{ - ChatInfo: t.getDMChatInfo(t.telegramUserID), - EventMeta: simplevent.EventMeta{ - Type: bridgev2.RemoteEventChatResync, - PortalKey: t.makePortalKeyFromID(ids.PeerTypeUser, t.telegramUserID), - CreatePortal: false, // Do not create the portal if it doesn't already exist - }, - }) } func (t *TelegramClient) Disconnect() {