From b1a67f6f4eda5df61d2e2a35f41bf0bae4da4b40 Mon Sep 17 00:00:00 2001 From: Bohdan Horbeshko Date: Fri, 25 Jul 2025 16:30:46 -0400 Subject: [PATCH] Join/leave a temporary occupant for edit messages with an unrecognized nickname too --- telegram/handlers.go | 49 ++++++++++++++++++++++++++--------------- telegram/utils.go | 32 ++++++++++++++++----------- xmpp/gateway/gateway.go | 9 ++++---- 3 files changed, 55 insertions(+), 35 deletions(-) diff --git a/telegram/handlers.go b/telegram/handlers.go index 0880332..b495423 100644 --- a/telegram/handlers.go +++ b/telegram/handlers.go @@ -284,6 +284,8 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) { } if update.NewContent.MessageContentType() == client.TypeMessageText { + safeToSend := true + textContent := update.NewContent.(*client.MessageText) 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 - if replaceId == "" { + if replaceId == "" || forceFallback { var editChar string if c.Session.AsciiArrows { editChar = "e" @@ -343,28 +367,17 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) { 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 uuid, err := uuid.NewRandom() if err == nil { id = id+":"+uuid.String() } for _, jid := range jids { - gateway.SendMessage(jid, from, text.String(), id, c.xmpp, nil, 0, replaceId, isCarbon, isMUC, false, originalFrom, "") + if safeToSend { + 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 } for _, jid := range jids { - gateway.SendMUCAnnouncement(jid, fromJid, text, nickname, c.xmpp) + gateway.SendMUCAnnouncement(jid, fromJid, text, nickname, "", c.xmpp) } } else { fromJid = gateway.CHATNODE(update.ChatId) diff --git a/telegram/utils.go b/telegram/utils.go index 7cb2b01..98fbc3c 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -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 { c.locks.mucCacheLock.Lock() defer c.locks.mucCacheLock.Unlock() @@ -1780,18 +1797,7 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) { } } - if !c.mucCacheHasOccupant(chatId, senderId) { - 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) - } + safeToSend = c.assureMUCOccupant(chatId, senderId, message.SenderId, chat) groupChatFrom = gateway.MUCJID(chatId) + "/" + c.GetMUCNickname(senderId) var ok bool @@ -2096,7 +2102,7 @@ func (c *Client) returnMessage(returnJid string, chatID int64, text string, code if err == nil { nickname = chat.Title } - gateway.SendMUCAnnouncement(returnJid, gateway.MUCJID(chatID), text, nickname, c.xmpp) + gateway.SendMUCAnnouncement(returnJid, gateway.MUCJID(chatID), text, nickname, "", c.xmpp) } } else { gateway.SendTextMessage(returnJid, gateway.CHATNODE(chatID), text, c.xmpp, isGroupchat) diff --git a/xmpp/gateway/gateway.go b/xmpp/gateway/gateway.go index 076635a..b3a0cc9 100644 --- a/xmpp/gateway/gateway.go +++ b/xmpp/gateway/gateway.go @@ -111,7 +111,7 @@ func SendTextMessage(to, from, body string, component *xmpp.Component, isGroupch } // 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 == "" { nickname = "announcement" } @@ -127,9 +127,10 @@ func SendMUCAnnouncement(to, from, body, nickname string, component *xmpp.Compon SPMUCJid(from), ) - var id string - if uuid, err := uuid.NewRandom(); err == nil { - id = uuid.String() + if id == "" { + if uuid, err := uuid.NewRandom(); err == nil { + id = uuid.String() + } } sendMessageWrapper(to, fullFrom, body, "", "", id, component, nil, nil, 0, "", "", false, true, false, false, "", 0, "", "", 0)