From 90f0490e1626f3e0cd753caa5a4aac7787cb6dfc Mon Sep 17 00:00:00 2001
From: bodqhrohro <bodqhrohro@gmail.com>
Date: Tue, 3 Dec 2019 02:32:53 +0200
Subject: Support commands in mapped chats

---
 telegram/commands.go | 23 +++++++++++++++++++++--
 telegram/utils.go    | 13 +++++++++++--
 xmpp/handlers.go     | 13 +++++++------
 3 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/telegram/commands.go b/telegram/commands.go
index 61e4882..102a2c4 100644
--- a/telegram/commands.go
+++ b/telegram/commands.go
@@ -97,8 +97,15 @@ func helpString(ht helpType) string {
 	return str.String()
 }
 
-// ProcessTransportCommand executes commands sent directly to the component
-func (c *Client) ProcessTransportCommand(cmd string, args []string) string {
+func parseCommand(cmdline string) (string, []string) {
+	bodyFields := strings.Fields(cmdline)
+	return bodyFields[0][1:], bodyFields[1:]
+}
+
+// ProcessTransportCommand executes a command sent directly to the component
+// and returns a response
+func (c *Client) ProcessTransportCommand(cmdline string) string {
+	cmd, args := parseCommand(cmdline)
 	switch cmd {
 	case "login", "code", "password":
 		if cmd == "login" && c.Session.Login != "" {
@@ -127,3 +134,15 @@ func (c *Client) ProcessTransportCommand(cmd string, args []string) string {
 
 	return ""
 }
+
+// ProcessChatCommand executes a command sent in a mapped chat
+// and returns a response and the status of command support
+func (c *Client) ProcessChatCommand(cmdline string) (string, bool) {
+	cmd, _ := parseCommand(cmdline)
+	switch cmd {
+	case "help":
+		return helpString(helpTypeChat), false
+	}
+
+	return "", true
+}
diff --git a/telegram/utils.go b/telegram/utils.go
index 7e9882d..d98cfb0 100644
--- a/telegram/utils.go
+++ b/telegram/utils.go
@@ -405,6 +405,15 @@ func (c *Client) messageToPrefix(message *client.Message, fileString string) str
 	return strings.Join(prefix, " | ")
 }
 
-func (c *Client) ProcessOutgoingMessage(chatID int, text string, messageID int) {
-	// TODO
+// ProcessOutgoingMessage executes commands or sends messages to mapped chats
+func (c *Client) ProcessOutgoingMessage(chatID int, text string, messageID int, returnJid string) {
+	if strings.HasPrefix(text, "/") {
+		response, isCommand := c.ProcessChatCommand(text)
+		if response != "" {
+			gateway.SendMessage(returnJid, strconv.Itoa(int(chatID)), response, c.xmpp)
+		}
+		if isCommand {
+			return
+		}
+	}
 }
diff --git a/xmpp/handlers.go b/xmpp/handlers.go
index d3abeab..861ecea 100644
--- a/xmpp/handlers.go
+++ b/xmpp/handlers.go
@@ -65,15 +65,16 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) {
 		toID := toParts[0]
 		if len(toParts) > 1 {
 			toIDInt, err := strconv.Atoi(toID)
-			if err != nil {
-				session.ProcessOutgoingMessage(toIDInt, msg.Body, 0)
+			if err == nil {
+				session.ProcessOutgoingMessage(toIDInt, msg.Body, 0, msg.From)
 				return
 			}
+			log.WithFields(log.Fields{
+				"toID": toID,
+			}).Error(errors.Wrap(err, "Invalid to JID!"))
 		} else if toID == gateway.Jid.Bare() {
-			bodyFields := strings.Fields(msg.Body)
-			cmd := bodyFields[0]
-			if strings.HasPrefix(cmd, "/") {
-				response := session.ProcessTransportCommand(cmd[1:], bodyFields[1:])
+			if strings.HasPrefix(msg.Body, "/") {
+				response := session.ProcessTransportCommand(msg.Body)
 				if response != "" {
 					gateway.SendMessage(msg.From, "", response, component)
 				}
-- 
cgit v1.2.3