Join/leave a temporary occupant for edit messages with an unrecognized nickname too

This commit is contained in:
Bohdan Horbeshko 2025-07-25 16:30:46 -04:00
parent cb6eaef16f
commit b1a67f6f4e
3 changed files with 55 additions and 35 deletions

View file

@ -284,6 +284,8 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) {
} }
if update.NewContent.MessageContentType() == client.TypeMessageText { if update.NewContent.MessageContentType() == client.TypeMessageText {
safeToSend := true
textContent := update.NewContent.(*client.MessageText) textContent := update.NewContent.(*client.MessageText)
log.Debugf("textContent: %#v", textContent.Text) log.Debugf("textContent: %#v", textContent.Text)
@ -321,9 +323,31 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) {
} }
} }
var forceFallback bool
var from string
var originalFrom string
var nickname string
if isMUC {
if messageErr == nil {
senderId := c.getMessageSenderId(message)
nickname = c.GetMUCNickname(senderId)
originalFrom = gateway.CHATJID(senderId, true)
safeToSend = c.assureMUCOccupant(update.ChatId, senderId, message.SenderId, chat)
from = gateway.MUCJID(update.ChatId) + "/" + nickname
} else {
nickname = "#ERROR#"
forceFallback = true
from = gateway.MUCJID(update.ChatId)
}
} else {
from = gateway.CHATNODE(update.ChatId)
}
var text strings.Builder var text strings.Builder
if replaceId == "" { if replaceId == "" || forceFallback {
var editChar string var editChar string
if c.Session.AsciiArrows { if c.Session.AsciiArrows {
editChar = "e" editChar = "e"
@ -343,28 +367,17 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) {
c, c,
)) ))
var from string
var originalFrom string
if isMUC {
var nickname string
if messageErr == nil {
senderId := c.getMessageSenderId(message)
nickname = c.GetMUCNickname(senderId)
originalFrom = gateway.CHATJID(senderId, true)
} else {
nickname = "#ERROR#"
}
from = gateway.MUCJID(update.ChatId) + "/" + nickname
} else {
from = gateway.CHATNODE(update.ChatId)
}
id := "e"+sId id := "e"+sId
uuid, err := uuid.NewRandom() uuid, err := uuid.NewRandom()
if err == nil { if err == nil {
id = id+":"+uuid.String() id = id+":"+uuid.String()
} }
for _, jid := range jids { for _, jid := range jids {
if safeToSend {
gateway.SendMessage(jid, from, text.String(), id, c.xmpp, nil, 0, replaceId, isCarbon, isMUC, false, originalFrom, "") gateway.SendMessage(jid, from, text.String(), id, c.xmpp, nil, 0, replaceId, isCarbon, isMUC, false, originalFrom, "")
} else {
gateway.SendMUCAnnouncement(jid, from, text.String(), nickname, id, c.xmpp)
}
} }
} }
} }
@ -415,7 +428,7 @@ func (c *Client) updateDeleteMessages(update *client.UpdateDeleteMessages) {
nickname = chat.Title nickname = chat.Title
} }
for _, jid := range jids { for _, jid := range jids {
gateway.SendMUCAnnouncement(jid, fromJid, text, nickname, c.xmpp) gateway.SendMUCAnnouncement(jid, fromJid, text, nickname, "", c.xmpp)
} }
} else { } else {
fromJid = gateway.CHATNODE(update.ChatId) fromJid = gateway.CHATNODE(update.ChatId)

View file

@ -750,6 +750,23 @@ func (c *Client) updateMUCOccupants(mucState *MUCState, chatID int64, members []
) )
} }
func (c *Client) assureMUCOccupant(chatId, senderId int64, messageSender client.MessageSender, chat *client.Chat) bool {
safeToSend := true
if !c.mucCacheHasOccupant(chatId, senderId) {
chatMember, err := c.client.GetChatMember(&client.GetChatMemberRequest{
ChatId: chatId,
MemberId: messageSender,
})
var status client.ChatMemberStatus
if err == nil {
status = chatMember.Status
}
affiliation, role := c.memberStatusToAffiliationAndRole(status, chat)
safeToSend = c.addMUCOccupant(chatId, senderId, affiliation, role, status)
}
return safeToSend
}
func (c *Client) mucCacheHasOccupant(mucID int64, memberID int64) bool { func (c *Client) mucCacheHasOccupant(mucID int64, memberID int64) bool {
c.locks.mucCacheLock.Lock() c.locks.mucCacheLock.Lock()
defer c.locks.mucCacheLock.Unlock() defer c.locks.mucCacheLock.Unlock()
@ -1780,18 +1797,7 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) {
} }
} }
if !c.mucCacheHasOccupant(chatId, senderId) { safeToSend = c.assureMUCOccupant(chatId, senderId, message.SenderId, chat)
chatMember, err := c.client.GetChatMember(&client.GetChatMemberRequest{
ChatId: chatId,
MemberId: message.SenderId,
})
var status client.ChatMemberStatus
if err == nil {
status = chatMember.Status
}
affiliation, role := c.memberStatusToAffiliationAndRole(status, chat)
safeToSend = c.addMUCOccupant(chatId, senderId, affiliation, role, status)
}
groupChatFrom = gateway.MUCJID(chatId) + "/" + c.GetMUCNickname(senderId) groupChatFrom = gateway.MUCJID(chatId) + "/" + c.GetMUCNickname(senderId)
var ok bool var ok bool
@ -2096,7 +2102,7 @@ func (c *Client) returnMessage(returnJid string, chatID int64, text string, code
if err == nil { if err == nil {
nickname = chat.Title nickname = chat.Title
} }
gateway.SendMUCAnnouncement(returnJid, gateway.MUCJID(chatID), text, nickname, c.xmpp) gateway.SendMUCAnnouncement(returnJid, gateway.MUCJID(chatID), text, nickname, "", c.xmpp)
} }
} else { } else {
gateway.SendTextMessage(returnJid, gateway.CHATNODE(chatID), text, c.xmpp, isGroupchat) gateway.SendTextMessage(returnJid, gateway.CHATNODE(chatID), text, c.xmpp, isGroupchat)

View file

@ -111,7 +111,7 @@ func SendTextMessage(to, from, body string, component *xmpp.Component, isGroupch
} }
// SendMUCAnnouncement creates and sends a message by a temporary occupant // SendMUCAnnouncement creates and sends a message by a temporary occupant
func SendMUCAnnouncement(to, from, body, nickname string, component *xmpp.Component) { func SendMUCAnnouncement(to, from, body, nickname, id string, component *xmpp.Component) {
if nickname == "" { if nickname == "" {
nickname = "announcement" nickname = "announcement"
} }
@ -127,10 +127,11 @@ func SendMUCAnnouncement(to, from, body, nickname string, component *xmpp.Compon
SPMUCJid(from), SPMUCJid(from),
) )
var id string if id == "" {
if uuid, err := uuid.NewRandom(); err == nil { if uuid, err := uuid.NewRandom(); err == nil {
id = uuid.String() id = uuid.String()
} }
}
sendMessageWrapper(to, fullFrom, body, "", "", id, component, nil, nil, 0, "", "", false, true, false, false, "", 0, "", "", 0) sendMessageWrapper(to, fullFrom, body, "", "", id, component, nil, nil, 0, "", "", false, true, false, false, "", 0, "", "", 0)
SendPresence( SendPresence(