mirror of
https://dev.narayana.im/narayana/telegabber.git
synced 2026-08-05 04:07:07 +00:00
Process basic group member list updates
This commit is contained in:
parent
9ed3a8b875
commit
8ce5c8373f
2 changed files with 52 additions and 40 deletions
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue