From a89629ab20c7a3176a70cda49b1dac44a561f935 Mon Sep 17 00:00:00 2001 From: bodqhrohro Date: Mon, 25 Nov 2019 21:42:11 +0200 Subject: [PATCH] Implement an own authorizer --- go.mod | 2 -- telegram/client.go | 4 +-- telegram/connect.go | 80 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index fe60906..7f0bbc9 100644 --- a/go.mod +++ b/go.mod @@ -14,5 +14,3 @@ require ( ) replace gosrc.io/xmpp => github.com/bodqhrohro/go-xmpp v0.1.4-0.20191106203535-f3b463f3b26c - -replace github.com/zelenin/go-tdlib => github.com/bodqhrohro/go-tdlib v0.1.2-0.20191121233100-48d2382034fb diff --git a/telegram/client.go b/telegram/client.go index c8187fc..072f4b9 100644 --- a/telegram/client.go +++ b/telegram/client.go @@ -35,7 +35,7 @@ func stringToLogConstant(c string) int32 { // Client stores the metadata for lazily invoked TDlib instance type Client struct { client *client.Client - authorizer *client.ClientAuthorizerType + authorizer *clientAuthorizer xmpp *xmpp.Component jid string parameters *client.TdlibParameters @@ -93,7 +93,7 @@ func updateHandler(tdlibClient *client.Client) { for update := range listener.Updates { if update.GetClass() == client.ClassUpdate { - fmt.Printf("%#v", update) + fmt.Printf("%#v\n", update) } } } diff --git a/telegram/connect.go b/telegram/connect.go index 7e92bc8..4f509d2 100644 --- a/telegram/connect.go +++ b/telegram/connect.go @@ -9,6 +9,78 @@ import ( "github.com/zelenin/go-tdlib/client" ) +type clientAuthorizer struct { + TdlibParameters chan *client.TdlibParameters + PhoneNumber chan string + Code chan string + State chan client.AuthorizationState + Password chan string +} + +func (stateHandler *clientAuthorizer) Handle(c *client.Client, state client.AuthorizationState) error { + stateHandler.State <- state + + switch state.AuthorizationStateType() { + case client.TypeAuthorizationStateWaitTdlibParameters: + _, err := c.SetTdlibParameters(&client.SetTdlibParametersRequest{ + Parameters: <-stateHandler.TdlibParameters, + }) + return err + + case client.TypeAuthorizationStateWaitEncryptionKey: + _, err := c.CheckDatabaseEncryptionKey(&client.CheckDatabaseEncryptionKeyRequest{}) + return err + + case client.TypeAuthorizationStateWaitPhoneNumber: + _, err := c.SetAuthenticationPhoneNumber(&client.SetAuthenticationPhoneNumberRequest{ + PhoneNumber: <-stateHandler.PhoneNumber, + Settings: &client.PhoneNumberAuthenticationSettings{ + AllowFlashCall: false, + IsCurrentPhoneNumber: false, + AllowSmsRetrieverApi: false, + }, + }) + return err + + case client.TypeAuthorizationStateWaitCode: + _, err := c.CheckAuthenticationCode(&client.CheckAuthenticationCodeRequest{ + Code: <-stateHandler.Code, + }) + return err + + case client.TypeAuthorizationStateWaitRegistration: + return client.ErrNotSupportedAuthorizationState + + case client.TypeAuthorizationStateWaitPassword: + _, err := c.CheckAuthenticationPassword(&client.CheckAuthenticationPasswordRequest{ + Password: <-stateHandler.Password, + }) + return err + + case client.TypeAuthorizationStateReady: + return nil + + case client.TypeAuthorizationStateLoggingOut: + return client.ErrNotSupportedAuthorizationState + + case client.TypeAuthorizationStateClosing: + return client.ErrNotSupportedAuthorizationState + + case client.TypeAuthorizationStateClosed: + return client.ErrNotSupportedAuthorizationState + } + + return client.ErrNotSupportedAuthorizationState +} + +func (stateHandler *clientAuthorizer) Close() { + close(stateHandler.TdlibParameters) + close(stateHandler.PhoneNumber) + close(stateHandler.Code) + close(stateHandler.State) + close(stateHandler.Password) +} + // Connect starts TDlib connection func (c *Client) Connect() error { if c.online { @@ -17,7 +89,13 @@ func (c *Client) Connect() error { log.Warn("Connecting to Telegram network...") - c.authorizer = client.ClientAuthorizer() + c.authorizer = &clientAuthorizer{ + TdlibParameters: make(chan *client.TdlibParameters, 1), + PhoneNumber: make(chan string, 1), + Code: make(chan string, 1), + State: make(chan client.AuthorizationState, 10), + Password: make(chan string, 1), + } go c.interactor()