Ping back outgoing commands in MUCs

This commit is contained in:
Bohdan Horbeshko 2025-07-04 16:08:11 -04:00
parent d6582a888f
commit 5c4c722cdc
2 changed files with 20 additions and 18 deletions

View file

@ -932,7 +932,7 @@ func (c *Client) GetMUCMemberIdByNickname(chatID int64, nickname string) int64 {
// NewPinnedMessage sends a text message and pins it right away // NewPinnedMessage sends a text message and pins it right away
func (c *Client) NewPinnedMessage(chatID int64, text, returnJid string) bool { func (c *Client) NewPinnedMessage(chatID int64, text, returnJid string) bool {
c.locks.pinOutboxLock.Lock() 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 { if msg == nil {
c.locks.pinOutboxLock.Unlock() c.locks.pinOutboxLock.Unlock()
return false return false
@ -1755,13 +1755,12 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) {
safeToSend = false safeToSend = false
} }
} }
log.Debugf("groupChatFrom: %v groupChatTos: %#v, safeToSend: %v", groupChatFrom, groupChatTos, safeToSend)
if safeToSend { if safeToSend {
c.SendMessageToGateway(chatId, message, "", false, groupChatFrom, groupChatTos) c.SendMessageToGateway(chatId, message, "", false, groupChatFrom, groupChatTos)
} else { } else {
mucJID := gateway.MUCJID(chatId) mucJID := gateway.MUCJID(chatId)
for _, to := range groupChatTos { gateway.SendErrorMessage(c.jid, mucJID, "Cannot show a message", 500, true, c.xmpp)
gateway.SendErrorMessage(to, 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) return c.prepareOutgoingMessageContent(text, nil)
} }
// ProcessOutgoingMessage executes commands or sends messages to mapped chats, returns message id // 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 { func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid string, replyId int64, replaceId int64, isGroupchat, raw bool) (*client.Message, bool) {
if !c.Online() { if !c.Online() {
// we're offline // we're offline
return nil return nil, false
} }
if replaceId == 0 && !raw && (strings.HasPrefix(text, "/") || strings.HasPrefix(text, "!")) { 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 // do not send on success
if isCommand { 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 { if response.StatusCode != 200 {
c.returnMessage(returnJid, chatID, fmt.Sprintf("Received status code %v", response.StatusCode), response.StatusCode, isGroupchat) 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-*") tempDir, err := ioutil.TempDir("", "telegabber-*")
if err != nil { if err != nil {
c.returnError(returnJid, chatID, "Failed to create a temporary directory", err, 500, isGroupchat) 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))) tempFile, err := os.Create(filepath.Join(tempDir, filepath.Base(text)))
if err != nil { if err != nil {
c.returnError(returnJid, chatID, "Failed to create a temporary file", err, 500, isGroupchat) c.returnError(returnJid, chatID, "Failed to create a temporary file", err, 500, isGroupchat)
return nil return nil, false
} }
_, err = io.Copy(tempFile, response.Body) _, err = io.Copy(tempFile, response.Body)
if err != nil { if err != nil {
c.returnError(returnJid, chatID, "Failed to write a temporary file", err, 500, isGroupchat) c.returnError(returnJid, chatID, "Failed to write a temporary file", err, 500, isGroupchat)
return nil return nil, false
} }
file = &client.InputFileLocal{ file = &client.InputFileLocal{
@ -2025,9 +2024,9 @@ func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid str
}) })
if err != nil { if err != nil {
c.returnError(returnJid, chatID, "Not edited", err, 400, isGroupchat) 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{ tgMessage, err := c.client.SendMessage(&client.SendMessageRequest{
@ -2037,9 +2036,9 @@ func (c *Client) ProcessOutgoingMessage(chatID int64, text string, returnJid str
}) })
if err != nil { if err != nil {
c.returnError(returnJid, chatID, "Not sent", err, 400, isGroupchat) 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) { func (c *Client) returnMessage(returnJid string, chatID int64, text string, code int, isGroupchat bool) {

View file

@ -264,7 +264,7 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) {
session.SendMessageLock.Lock() session.SendMessageLock.Lock()
defer session.SendMessageLock.Unlock() 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 tgMessage != nil {
if replaceId != 0 { if replaceId != 0 {
// not needed (is it persistent among clients though?) // not needed (is it persistent among clients though?)
@ -294,6 +294,9 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) {
[]string{msg.From}, []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 { } else {
/* /*
// if a message failed to edit on Telegram side, match new XMPP ID with old Telegram ID anyway // 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 { if ok {
msgText := "/" + form.Fields[0].ValuesList[0] msgText := "/" + form.Fields[0].ValuesList[0]
session.LastBotCmdString = msgText 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 { if tgMessage != nil {
payload.Status = stanza.CommandStatusCompleted payload.Status = stanza.CommandStatusCompleted
} else { } else {