diff --git a/telegram/utils.go b/telegram/utils.go index 4f59d0d..abfd394 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -932,7 +932,7 @@ func (c *Client) GetMUCMemberIdByNickname(chatID int64, nickname string) int64 { // NewPinnedMessage sends a text message and pins it right away func (c *Client) NewPinnedMessage(chatID int64, text, returnJid string) bool { c.locks.pinOutboxLock.Lock() - msg := c.ProcessOutgoingMessage(chatID, text, returnJid, 0, 0, true, true) + msg, _ := c.ProcessOutgoingMessage(chatID, text, returnJid, 0, 0, true, true) if msg == nil { c.locks.pinOutboxLock.Unlock() return false @@ -1755,13 +1755,12 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) { safeToSend = false } } + log.Debugf("groupChatFrom: %v groupChatTos: %#v, safeToSend: %v", groupChatFrom, groupChatTos, safeToSend) if safeToSend { c.SendMessageToGateway(chatId, message, "", false, groupChatFrom, groupChatTos) } else { mucJID := gateway.MUCJID(chatId) - for _, to := range groupChatTos { - gateway.SendErrorMessage(to, mucJID, "Cannot show a message", 500, true, c.xmpp) - } + gateway.SendErrorMessage(c.jid, mucJID, "Cannot show a message", 500, true, c.xmpp) } } @@ -1935,11 +1934,11 @@ func (c *Client) PrepareOutgoingMessageContent(text string) client.InputMessageC return c.prepareOutgoingMessageContent(text, nil) } -// ProcessOutgoingMessage executes commands or sends messages to mapped chats, returns message id -func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid string, replyId int64, replaceId int64, isGroupchat, raw bool) *client.Message { +// ProcessOutgoingMessage executes commands or sends messages to mapped chats, returns message id and isCommand +func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid string, replyId int64, replaceId int64, isGroupchat, raw bool) (*client.Message, bool) { if !c.Online() { // we're offline - return nil + return nil, false } if replaceId == 0 && !raw && (strings.HasPrefix(text, "/") || strings.HasPrefix(text, "!")) { @@ -1950,7 +1949,7 @@ func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid str } // do not send on success if isCommand { - return nil + return nil, true } } @@ -1979,24 +1978,24 @@ func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid str if response.StatusCode != 200 { c.returnMessage(returnJid, chatID, fmt.Sprintf("Received status code %v", response.StatusCode), response.StatusCode, isGroupchat) - return nil + return nil, false } tempDir, err := ioutil.TempDir("", "telegabber-*") if err != nil { c.returnError(returnJid, chatID, "Failed to create a temporary directory", err, 500, isGroupchat) - return nil + return nil, false } tempFile, err := os.Create(filepath.Join(tempDir, filepath.Base(text))) if err != nil { c.returnError(returnJid, chatID, "Failed to create a temporary file", err, 500, isGroupchat) - return nil + return nil, false } _, err = io.Copy(tempFile, response.Body) if err != nil { c.returnError(returnJid, chatID, "Failed to write a temporary file", err, 500, isGroupchat) - return nil + return nil, false } file = &client.InputFileLocal{ @@ -2025,9 +2024,9 @@ func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid str }) if err != nil { c.returnError(returnJid, chatID, "Not edited", err, 400, isGroupchat) - return nil + return nil, false } - return tgMessage + return tgMessage, false } tgMessage, err := c.client.SendMessage(&client.SendMessageRequest{ @@ -2037,9 +2036,9 @@ func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid str }) if err != nil { c.returnError(returnJid, chatID, "Not sent", err, 400, isGroupchat) - return nil + return nil, false } - return tgMessage + return tgMessage, false } func (c *Client) returnMessage(returnJid string, chatID int64, text string, code int, isGroupchat bool) { diff --git a/xmpp/handlers.go b/xmpp/handlers.go index b218323..dceee3a 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -264,7 +264,7 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) { session.SendMessageLock.Lock() defer session.SendMessageLock.Unlock() - tgMessage := session.ProcessOutgoingMessage(toID, text, msg.From, replyId, replaceId, isGroupchat, false) + tgMessage, isCommand := session.ProcessOutgoingMessage(toID, text, msg.From, replyId, replaceId, isGroupchat, false) if tgMessage != nil { if replaceId != 0 { // not needed (is it persistent among clients though?) @@ -294,6 +294,9 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) { []string{msg.From}, ) } + } else if isCommand && isGroupchat && session.Session.MUC { + // pong outgoing commands back to groupchats + gateway.SendMessage(msg.From, msg.To + "/" + session.GetMUCNickname(0), text, "", component, nil, 0, "", false, isGroupchat, false, "", "") } else { /* // if a message failed to edit on Telegram side, match new XMPP ID with old Telegram ID anyway @@ -1540,7 +1543,7 @@ func handleSetQueryCommand(s xmpp.Sender, iq *stanza.IQ, command *stanza.Command if ok { msgText := "/" + form.Fields[0].ValuesList[0] session.LastBotCmdString = msgText - tgMessage := session.ProcessOutgoingMessage(toId, msgText, iq.From, 0, 0, false, true) + tgMessage, _ := session.ProcessOutgoingMessage(toId, msgText, iq.From, 0, 0, false, true) if tgMessage != nil { payload.Status = stanza.CommandStatusCompleted } else {