From fdd867cf7a435346a552a8da7f446b59b5e1213e Mon Sep 17 00:00:00 2001
From: Bohdan Horbeshko <bodqhrohro@gmail.com>
Date: Fri, 16 Jun 2023 00:34:49 -0400
Subject: Add /cancelauth command

---
 telegram/commands.go | 10 +++++++++-
 telegram/connect.go  | 30 +++++++++++++++++++++++++-----
 2 files changed, 34 insertions(+), 6 deletions(-)

(limited to 'telegram')

diff --git a/telegram/commands.go b/telegram/commands.go
index 5e16a6a..cafeb0a 100644
--- a/telegram/commands.go
+++ b/telegram/commands.go
@@ -44,6 +44,7 @@ var permissionsReadonly = client.ChatPermissions{}
 var transportCommands = map[string]command{
 	"login":       command{"phone", "sign in"},
 	"logout":      command{"", "sign out"},
+	"cancelauth":  command{"", "quit the signin wizard"},
 	"code":        command{"", "check one-time code"},
 	"password":    command{"", "check 2fa password"},
 	"setusername": command{"", "update @username"},
@@ -230,7 +231,7 @@ func (c *Client) ProcessTransportCommand(cmdline string, resource string) string
 	switch cmd {
 	case "login", "code", "password":
 		if cmd == "login" && c.Session.Login != "" {
-			return ""
+			return "Phone number already provided, use /cancelauth to start over"
 		}
 
 		if len(args) < 1 {
@@ -286,6 +287,13 @@ func (c *Client) ProcessTransportCommand(cmdline string, resource string) string
 		}
 
 		c.Session.Login = ""
+	// cancel auth
+	case "cancelauth":
+		if c.Online() {
+			return "Not allowed when online"
+		}
+		c.cancelAuth()
+		return "Cancelled"
 	// set @username
 	case "setusername":
 		if !c.Online() {
diff --git a/telegram/connect.go b/telegram/connect.go
index 2633980..8324319 100644
--- a/telegram/connect.go
+++ b/telegram/connect.go
@@ -24,6 +24,9 @@ type clientAuthorizer struct {
 }
 
 func (stateHandler *clientAuthorizer) Handle(c *client.Client, state client.AuthorizationState) error {
+	if stateHandler.isClosed {
+		return errors.New("Channel is closed")
+	}
 	stateHandler.State <- state
 
 	switch state.AuthorizationStateType() {
@@ -84,6 +87,9 @@ func (stateHandler *clientAuthorizer) Handle(c *client.Client, state client.Auth
 }
 
 func (stateHandler *clientAuthorizer) Close() {
+	if stateHandler.isClosed {
+		return
+	}
 	stateHandler.isClosed = true
 	close(stateHandler.TdlibParameters)
 	close(stateHandler.PhoneNumber)
@@ -191,11 +197,7 @@ func (c *Client) Disconnect(resource string, quit bool) bool {
 		)
 	}
 
-	_, err := c.client.Close()
-	if err != nil {
-		log.Errorf("Couldn't close the Telegram instance: %v; %#v", err, c)
-	}
-	c.forceClose()
+	c.close()
 
 	return true
 }
@@ -242,6 +244,24 @@ func (c *Client) forceClose() {
 	c.authorizer = nil
 }
 
+func (c *Client) close() {
+	if c.authorizer != nil && !c.authorizer.isClosed {
+		c.authorizer.Close()
+	}
+	if c.client != nil {
+		_, err := c.client.Close()
+		if err != nil {
+			log.Errorf("Couldn't close the Telegram instance: %v; %#v", err, c)
+		}
+	}
+	c.forceClose()
+}
+
+func (c *Client) cancelAuth() {
+	c.close()
+	c.Session.Login = ""
+}
+
 // Online checks if the updates listener is alive
 func (c *Client) Online() bool {
 	return c.online
-- 
cgit v1.2.3