diff --git a/telegram/handlers.go b/telegram/handlers.go index 8d63971..92e55c9 100644 --- a/telegram/handlers.go +++ b/telegram/handlers.go @@ -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() + } +} diff --git a/telegram/utils.go b/telegram/utils.go index 65ee9d5..b166551 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -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,47 +620,31 @@ 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 - } - - nickname := c.GetMUCNickname(senderId) - affiliation, role := c.memberStatusToAffiliationAndRole(member.Status) - mucState.Members[senderId] = &MUCMember{ - Nickname: nickname, - Affiliation: affiliation, - Role: role, - } - - if c.me != nil && senderId == c.me.Id { - myNickname = nickname - myAffiliation = affiliation - myRole = role - continue - } - - c.sendPresence( - gateway.SPFrom(sChatId), - gateway.SPResource(nickname), - gateway.SPImmed(true), - gateway.SPMUCAffiliation(affiliation), - gateway.SPMUCRole(affiliation), - gateway.SPMUCJid(gateway.CHATJID(senderId, true)), - ) + for _, member := range members { + senderId := c.GetSenderId(member.MemberId) + nickname := c.GetMUCNickname(senderId) + affiliation, role := c.memberStatusToAffiliationAndRole(member.Status) + mucState.Members[senderId] = &MUCMember{ + Nickname: nickname, + Affiliation: affiliation, + Role: role, } + + if c.me != nil && senderId == c.me.Id { + myNickname = nickname + myAffiliation = affiliation + myRole = role + continue + } + + c.sendPresence( + gateway.SPFrom(sChatId), + gateway.SPResource(nickname), + gateway.SPImmed(true), + gateway.SPMUCAffiliation(affiliation), + gateway.SPMUCRole(role), + gateway.SPMUCJid(gateway.CHATJID(senderId, true)), + ) } // according to the spec, own member entry should be sent the last