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
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) {

View file

@ -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 {