From 0b79d6feb1e3d2f87753a1808acbb148a346eeec Mon Sep 17 00:00:00 2001
From: Bohdan Horbeshko <bodqhrohro@gmail.com>
Date: Mon, 17 Jan 2022 14:58:16 -0500
Subject: Refactor some chat commands

---
 telegram/commands.go | 155 +++++++++++++++++++++------------------------------
 telegram/utils.go    |  15 +++++
 2 files changed, 80 insertions(+), 90 deletions(-)

diff --git a/telegram/commands.go b/telegram/commands.go
index 8baf068..9a7cf19 100644
--- a/telegram/commands.go
+++ b/telegram/commands.go
@@ -480,12 +480,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 		}
 	// create new secret chat with current user
 	case "secret":
-		_, user, err := c.GetContactByID(chatID, nil)
-		if err != nil || user == nil {
-			return "User not found", true
-		}
-
-		_, err = c.client.CreateNewSecretChat(&client.CreateNewSecretChatRequest{
+		_, err := c.client.CreateNewSecretChat(&client.CreateNewSecretChatRequest{
 			UserID: chatID,
 		})
 		if err != nil {
@@ -497,36 +492,30 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 			return notEnoughArguments, true
 		}
 
-		if chatID > 0 {
-			_, err := c.client.CreateNewBasicGroupChat(&client.CreateNewBasicGroupChatRequest{
-				UserIDs: []int64{chatID},
-				Title:   args[0],
-			})
-			if err != nil {
-				return err.Error(), true
-			}
+		_, err := c.client.CreateNewBasicGroupChat(&client.CreateNewBasicGroupChatRequest{
+			UserIDs: []int64{chatID},
+			Title:   args[0],
+		})
+		if err != nil {
+			return err.Error(), true
 		}
 	// blacklists current user
 	case "block":
-		if chatID > 0 {
-			_, err := c.client.ToggleMessageSenderIsBlocked(&client.ToggleMessageSenderIsBlockedRequest{
-				Sender:    &client.MessageSenderUser{UserID: chatID},
-				IsBlocked: true,
-			})
-			if err != nil {
-				return err.Error(), true
-			}
+		_, err := c.client.ToggleMessageSenderIsBlocked(&client.ToggleMessageSenderIsBlockedRequest{
+			Sender:    &client.MessageSenderUser{UserID: chatID},
+			IsBlocked: true,
+		})
+		if err != nil {
+			return err.Error(), true
 		}
 	// unblacklists current user
 	case "unblock":
-		if chatID > 0 {
-			_, err := c.client.ToggleMessageSenderIsBlocked(&client.ToggleMessageSenderIsBlockedRequest{
-				Sender:    &client.MessageSenderUser{UserID: chatID},
-				IsBlocked: false,
-			})
-			if err != nil {
-				return err.Error(), true
-			}
+		_, err := c.client.ToggleMessageSenderIsBlocked(&client.ToggleMessageSenderIsBlockedRequest{
+			Sender:    &client.MessageSenderUser{UserID: chatID},
+			IsBlocked: false,
+		})
+		if err != nil {
+			return err.Error(), true
 		}
 	// invite @username to current groupchat
 	case "invite":
@@ -534,19 +523,18 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 			return notEnoughArguments, true
 		}
 
-		if chatID < 0 {
-			userID, err := c.usernameOrIDToID(args[0])
-			if err != nil {
-				return err.Error(), true
-			}
+		contact, _, err := c.GetContactByUsername(args[0])
+		if err != nil {
+			return err.Error(), true
+		}
 
-			_, err = c.client.AddChatMember(&client.AddChatMemberRequest{
-				ChatID: chatID,
-				UserID: userID,
-			})
-			if err != nil {
-				return err.Error(), true
-			}
+		_, err = c.client.AddChatMember(&client.AddChatMemberRequest{
+			ChatID:       chatID,
+			UserID:       contact.ID,
+			ForwardLimit: 100,
+		})
+		if err != nil {
+			return err.Error(), true
 		}
 	// kick @username from current group chat
 	case "kick":
@@ -554,20 +542,18 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 			return notEnoughArguments, true
 		}
 
-		if chatID < 0 {
-			userID, err := c.usernameOrIDToID(args[0])
-			if err != nil {
-				return err.Error(), true
-			}
+		contact, _, err := c.GetContactByUsername(args[0])
+		if err != nil {
+			return err.Error(), true
+		}
 
-			_, err = c.client.SetChatMemberStatus(&client.SetChatMemberStatusRequest{
-				ChatID: chatID,
-				UserID: userID,
-				Status: &client.ChatMemberStatusLeft{},
-			})
-			if err != nil {
-				return err.Error(), true
-			}
+		_, err = c.client.SetChatMemberStatus(&client.SetChatMemberStatusRequest{
+			ChatID: chatID,
+			UserID: contact.ID,
+			Status: c.formatRestrict(false, 0),
+		})
+		if err != nil {
+			return err.Error(), true
 		}
 	// ban @username from current chat [for N hours]
 	case "ban":
@@ -575,49 +561,37 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 			return notEnoughArguments, true
 		}
 
-		if chatID < 0 {
-			userID, err := c.usernameOrIDToID(args[0])
-			if err != nil {
-				return err.Error(), true
-			}
-
-			var until int32
-			if len(args) > 1 {
-				hours, err := strconv.ParseInt(args[1], 10, 32)
-				if err != nil {
-					until = int32(time.Now().Unix() + hours*3600)
-				}
-			}
+		contact, _, err := c.GetContactByUsername(args[0])
+		if err != nil {
+			return err.Error(), true
+		}
 
-			_, err = c.client.SetChatMemberStatus(&client.SetChatMemberStatusRequest{
-				ChatID: chatID,
-				UserID: userID,
-				Status: &client.ChatMemberStatusBanned{
-					BannedUntilDate: until,
-				},
-			})
+		var hours int64
+		if len(args) > 1 {
+			hours, err = strconv.ParseInt(args[1], 10, 32)
 			if err != nil {
-				return err.Error(), true
+				return "Invalid number of hours", true
 			}
 		}
+
+		_, err = c.client.SetChatMemberStatus(&client.SetChatMemberStatusRequest{
+			ChatID: chatID,
+			UserID: contact.ID,
+			Status: c.formatRestrict(true, hours),
+		})
+		if err != nil {
+			return err.Error(), true
+		}
 	// leave current chat
 	case "leave":
-		chat, _, err := c.GetContactByID(chatID, nil)
+		_, err := c.client.LeaveChat(&client.LeaveChatRequest{
+			ChatID: chatID,
+		})
 		if err != nil {
 			return err.Error(), true
 		}
 
-		chatType := chat.Type.ChatTypeType()
-		if chatType == client.TypeChatTypeBasicGroup || chatType == client.TypeChatTypeSupergroup {
-			_, err = c.client.LeaveChat(&client.LeaveChatRequest{
-				ChatID: chatID,
-			})
-			if err != nil {
-				return err.Error(), true
-			}
-
-			c.unsubscribe(chatID)
-		}
+		c.unsubscribe(chatID)
 	// close secret chat
 	case "close":
 		chat, _, err := c.GetContactByID(chatID, nil)
@@ -642,6 +616,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 		_, err := c.client.DeleteChatHistory(&client.DeleteChatHistoryRequest{
 			ChatID:             chatID,
 			RemoveFromChatList: true,
+			Revoke:             true,
 		})
 		if err != nil {
 			return err.Error(), true
@@ -650,7 +625,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 		c.unsubscribe(chatID)
 	// message search
 	case "search":
-		var limit int32 = 10
+		var limit int32 = 100
 		if len(args) > 1 {
 			newLimit, err := strconv.ParseInt(args[1], 10, 32)
 			if err == nil {
@@ -697,7 +672,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool)
 		}
 
 		c.sendMessagesReverse(chatID, messages.Messages)
-	// members list (for admins)
+	// chat members
 	case "members":
 		var query string
 		if len(args) > 0 {
diff --git a/telegram/utils.go b/telegram/utils.go
index 0a70af8..556b1a7 100644
--- a/telegram/utils.go
+++ b/telegram/utils.go
@@ -312,6 +312,21 @@ func (c *Client) formatContent(file *client.File, filename string) string {
 	)
 }
 
+func (c *Client) formatRestrict(ban bool, hours int64) client.ChatMemberStatus {
+	var until int32
+	if hours != 0 {
+		until = int32(time.Now().Unix() + hours*3600)
+	}
+
+	if ban {
+		return &client.ChatMemberStatusBanned{
+			BannedUntilDate: until,
+		}
+	} else {
+		return &client.ChatMemberStatusLeft{}
+	}
+}
+
 func (c *Client) messageToText(message *client.Message) string {
 	if message.Content == nil {
 		log.Warnf("Unknown message (big emoji?): %#v", message)
-- 
cgit v1.2.3