package telegram import ( "github.com/pkg/errors" "dev.narayana.im/narayana/telegabber/xmpp/gateway" log "github.com/sirupsen/logrus" "github.com/zelenin/go-tdlib/client" ) // Connect starts TDlib connection func (c *Client) Connect() error { if c.online { return nil } log.Warn("Connecting to Telegram network...") c.authorizer = client.ClientAuthorizer() go c.interactor() c.authorizer.TdlibParameters <- c.parameters tdlibClient, err := client.NewClient(c.authorizer, c.logVerbosity) if err != nil { return errors.Wrap(err, "Couldn't initialize a Telegram client instance") } c.client = tdlibClient c.online = true go updateHandler(c.client) return nil } // Disconnect drops TDlib connection func (c *Client) Disconnect() { if !c.online { return } log.Warn("Disconnecting from Telegram network...") // TODO: send unavailable presence to cached chats c.client.Stop() c.online = false } func (c *Client) interactor() { for { state, ok := <-c.authorizer.State if !ok { return } stateType := state.AuthorizationStateType() log.Infof("Telegram authorization state: %#v", stateType) switch stateType { case client.TypeAuthorizationStateWaitPhoneNumber: log.Warn("Logging in...") if c.Session.Login != "" { c.authorizer.PhoneNumber <- c.Session.Login } else { gateway.SendMessage(c.jid, "", "Please, enter your Telegram login via /login 12345", c.xmpp) } case client.TypeAuthorizationStateWaitCode: log.Warn("Waiting for authorization code...") gateway.SendMessage(c.jid, "", "Please, enter authorization code via /code 12345", c.xmpp) case client.TypeAuthorizationStateWaitPassword: log.Warn("Waiting for 2FA password...") gateway.SendMessage(c.jid, "", "Please, enter 2FA passphrase via /password 12345", c.xmpp) case client.TypeAuthorizationStateReady: log.Warn("Authorization successful!") // TODO return } } }