Move to new MUC on upgrading basic group to supergroup

This commit is contained in:
Bohdan Horbeshko 2025-07-31 12:51:25 -04:00
parent b2c4ade6b9
commit 47179e9c77
2 changed files with 20 additions and 13 deletions

View file

@ -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()
}

View file

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