aboutsummaryrefslogblamecommitdiff
path: root/telegram/connect.go
blob: 7e92bc838c86aa664f474ecb2defdc39ba93ae30 (plain) (tree)
1
2
3
4
5
6
7
8




                               

                                                          
                                        








                                            

                                                     
                                                
 
                         
 
                                                    
 
                                                                          
                       
                                                                                         














                                    
 



                                                          



                        








                                                                         
 



















                                                                                                                            
 
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
		}
	}
}