chenhg5/cc-connect · warning

telegram: : bot not connected

Error message

telegram: %s: bot not connected

What it means

connectedBot(action) returns this error when a send-side operation (reactToMessage, handleCallbackQuery, Reply, Send, SendImage, SendFile) is attempted while p.bot is nil — i.e., the platform has not finished connecting or the connection was lost. The action name is interpolated to identify the failing call.

Solutions

  1. Wait for the platform to (re)connect before sending; check the availability/unavailable notification state
  2. Add caller-side retry with backoff for transient bot-not-connected windows
  3. Verify Start() was called and succeeded (no token/network errors earlier)
  4. Check network issues that caused the connection loss

Example fix

// before
if err := plat.Send(ctx, chatID, text); err != nil { return err }
// after
if err := plat.Send(ctx, chatID, text); err != nil {
    if strings.Contains(err.Error(), "bot not connected") {
        time.Sleep(backoff)
        return plat.Send(ctx, chatID, text)
    }
    return err
}
Defensive patterns

Strategy: retry

Try / catch

if err := plat.Send(ctx, chatID, text); err != nil {
    if strings.Contains(err.Error(), "bot not connected") {
        time.Sleep(2 * time.Second)
        return plat.Send(ctx, chatID, text)
    }
    return err
}

Prevention

When it happens

Trigger: Calling Reply/Send/SendImage/SendFile (or reaction/callback handlers) before Start() completed the first connection, or after a connection loss cleared the bot but before reconnect succeeded.

Common situations: Messages queued by the engine during a network outage get rejected; a reply arrives for a session while the bot is reconnecting; platform started but still in backoff.

Related errors


AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06). Data as JSON: /api/errors/fd394f4be81c9f9c. Report an issue: GitHub.

Appendix: source

Thrown at platform/telegram/telegram.go:728

	notify := false
	p.mu.Lock()
	if p.bot == b && p.generation == gen {
		p.bot = nil
		p.selfUser = nil
		notify = !p.stopping
	}
	p.mu.Unlock()

	if notify {
		p.notifyUnavailable(fmt.Errorf("telegram: connection lost"))
	}
}

func (p *Platform) connectedBot(action string) (telegramBot, error) {
	p.mu.RLock()
	defer p.mu.RUnlock()
	if p.bot == nil {
		return nil, fmt.Errorf("telegram: %s: bot not connected", action)
	}
	return p.bot, nil
}

func (p *Platform) botUsername() string {
	p.mu.RLock()
	defer p.mu.RUnlock()
	if p.selfUser == nil {
		return ""
	}
	return p.selfUser.Username
}

func (p *Platform) hasEverConnected() bool {
	p.mu.RLock()
	defer p.mu.RUnlock()
	return p.everConnected
}

View on GitHub (pinned to 4000b2338a)