From 47179e9c77fdf88ed813a801a38e391b53773a7b Mon Sep 17 00:00:00 2001 From: Bohdan Horbeshko Date: Thu, 31 Jul 2025 12:51:25 -0400 Subject: [PATCH] Move to new MUC on upgrading basic group to supergroup --- telegram/connect.go | 2 +- telegram/utils.go | 31 +++++++++++++++++++------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/telegram/connect.go b/telegram/connect.go index afdf5f3..bee3366 100644 --- a/telegram/connect.go +++ b/telegram/connect.go @@ -240,7 +240,7 @@ func (c *Client) Disconnect(resource string, quit bool) bool { if c.Session.MUC { c.locks.mucCacheLock.Lock() for chatID := range c.mucCache { - c.kickMeFromMUC(chatID, []uint16{110, 332}, false, nil) + c.kickMeFromMUC(chatID, []uint16{110, 332}, false, c.mucCache[chatID]) } c.locks.mucCacheLock.Unlock() } diff --git a/telegram/utils.go b/telegram/utils.go index c736f1c..367fda8 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -661,19 +661,22 @@ func (c *Client) DestroyMUC(chatId int64) error { return err } + c.deleteMUC(chatId, nil, true) + + return nil +} + +func (c *Client) deleteMUC(chatId int64, statusCodes []uint16, destroy bool) { c.locks.mucCacheLock.Lock() defer c.locks.mucCacheLock.Unlock() mucState, ok := c.mucCache[chatId] if !ok || mucState == nil { - return nil + return } - c.kickMeFromMUC(chatId, nil, true, mucState) - + c.kickMeFromMUC(chatId, statusCodes, destroy, mucState) delete(c.mucCache, chatId) - - return nil } func (c *Client) sendMUCStatuses(chatID int64) { @@ -1817,9 +1820,16 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) { case client.TypeMessageChatDeleteMember: deleteMember, _ := message.Content.(*client.MessageChatDeleteMember) c.mucOccupantRolePresence(chatId, deleteMember.UserId, ChatMemberStatusKicked, c.GetMUCNickname(deleteMember.UserId)) - case client.TypeMessageBasicGroupChatCreate, client.TypeMessageSupergroupChatCreate: + case client.TypeMessageBasicGroupChatCreate, client.TypeMessageSupergroupChatCreate, client.TypeMessageChatUpgradeTo: + inviteChatId := chatId + if message.Content.MessageContentType() == client.TypeMessageChatUpgradeTo { + c.deleteMUC(chatId, nil, true) + + upgradeTo, _ := message.Content.(*client.MessageChatUpgradeTo) + inviteChatId = -1000000000000 - upgradeTo.SupergroupId // 🫃 + } for _, jid := range c.GetCarbonFullJids(true, "", false) { - gateway.InviteToMUC(chatId, jid, c.xmpp) + gateway.InviteToMUC(inviteChatId, jid, c.xmpp) } } @@ -2908,7 +2918,7 @@ func (c *Client) kickMeFromMUC(chatID int64, statusCodes []uint16, destroy bool, if c.me != nil { myJid = gateway.CHATJID(c.me.Id, true) } - _, toJids := c.getMUCJoinedJIDs(chatID, mucState, false) + _, toJids := c.getMUCJoinedJIDs(chatID, mucState, mucState == nil) args := []args.V{ gateway.SPFrom(gateway.MUCNODE(chatID)), gateway.SPResource(c.GetMUCNickname(0)), @@ -2979,13 +2989,10 @@ func (c *Client) MigrateFromMUCs() { chatIDs = append(chatIDs, chat.Id) } - c.locks.mucCacheLock.Lock() for _, chatID := range chatIDs { - c.kickMeFromMUC(chatID, []uint16{110, 332}, false, nil) - delete(c.mucCache, chatID) + c.deleteMUC(chatID, []uint16{110, 332}, false) c.subscribeToID(chatID, nil, false) } - c.locks.mucCacheLock.Unlock() } // SetChatMemberStatus is a handy wrapper for the following TDLib method