Process basic group member list updates

This commit is contained in:
Bohdan Horbeshko 2025-06-15 05:16:58 -04:00
parent 9ed3a8b875
commit 8ce5c8373f
2 changed files with 52 additions and 40 deletions

View file

@ -130,6 +130,9 @@ func (c *Client) updateHandler() {
case client.TypeUpdateChatReadOutbox:
typedUpdate, _ := update.(*client.UpdateChatReadOutbox)
c.updateChatReadOutbox(typedUpdate)
case client.TypeUpdateBasicGroupFullInfo:
typedUpdate, _ := update.(*client.UpdateBasicGroupFullInfo)
c.updateBasicGroupFullInfo(typedUpdate)
default:
// log only handled types
continue
@ -477,3 +480,19 @@ func (c *Client) updateChatTitle(update *client.UpdateChatTitle) {
func (c *Client) updateChatReadOutbox(update *client.UpdateChatReadOutbox) {
c.sendMarker(update.ChatId, update.LastReadOutboxMessageId, gateway.MarkerTypeDisplayed)
}
func (c *Client) updateBasicGroupFullInfo(update *client.UpdateBasicGroupFullInfo) {
if c.Session.MUC && update.BasicGroupFullInfo != nil {
chatID := -update.BasicGroupId
c.locks.mucCacheLock.Lock()
mucState, ok := c.mucCache[chatID]
if ok && mucState != nil {
mucState.Members = make(map[int64]*MUCMember)
c.updateMUCMembers(mucState, chatID, update.BasicGroupFullInfo.Members)
}
c.locks.mucCacheLock.Unlock()
}
}

View file

@ -603,6 +603,15 @@ func (c *Client) sendMUCStatuses(chatID int64) {
c.mucCache[chatID] = mucState
}
members, _ := c.client.SearchChatMembers(&client.SearchChatMembersRequest{
ChatId: chatID,
Limit: 200,
Filter: &client.ChatMembersFilterMembers{},
})
c.updateMUCMembers(mucState, chatID, members.Members)
}
func (c *Client) updateMUCMembers(mucState *MUCState, chatID int64, members []*client.ChatMember) {
sChatId := gateway.MUCNODE(chatID)
myNickname := "me"
if c.me != nil {
@ -611,23 +620,8 @@ func (c *Client) sendMUCStatuses(chatID int64) {
myAffiliation := "member"
myRole := "participant"
members, err := c.client.SearchChatMembers(&client.SearchChatMembersRequest{
ChatId: chatID,
Limit: 200,
Filter: &client.ChatMembersFilterMembers{},
})
if err == nil {
for _, member := range members.Members {
var senderId int64
switch member.MemberId.MessageSenderType() {
case client.TypeMessageSenderUser:
memberUser, _ := member.MemberId.(*client.MessageSenderUser)
senderId = memberUser.UserId
case client.TypeMessageSenderChat:
memberChat, _ := member.MemberId.(*client.MessageSenderChat)
senderId = memberChat.ChatId
}
for _, member := range members {
senderId := c.GetSenderId(member.MemberId)
nickname := c.GetMUCNickname(senderId)
affiliation, role := c.memberStatusToAffiliationAndRole(member.Status)
mucState.Members[senderId] = &MUCMember{
@ -648,11 +642,10 @@ func (c *Client) sendMUCStatuses(chatID int64) {
gateway.SPResource(nickname),
gateway.SPImmed(true),
gateway.SPMUCAffiliation(affiliation),
gateway.SPMUCRole(affiliation),
gateway.SPMUCRole(role),
gateway.SPMUCJid(gateway.CHATJID(senderId, true)),
)
}
}
// according to the spec, own member entry should be sent the last
c.sendPresence(