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:
|
case client.TypeUpdateChatReadOutbox:
|
||||||
typedUpdate, _ := update.(*client.UpdateChatReadOutbox)
|
typedUpdate, _ := update.(*client.UpdateChatReadOutbox)
|
||||||
c.updateChatReadOutbox(typedUpdate)
|
c.updateChatReadOutbox(typedUpdate)
|
||||||
|
case client.TypeUpdateBasicGroupFullInfo:
|
||||||
|
typedUpdate, _ := update.(*client.UpdateBasicGroupFullInfo)
|
||||||
|
c.updateBasicGroupFullInfo(typedUpdate)
|
||||||
default:
|
default:
|
||||||
// log only handled types
|
// log only handled types
|
||||||
continue
|
continue
|
||||||
|
|
@ -477,3 +480,19 @@ func (c *Client) updateChatTitle(update *client.UpdateChatTitle) {
|
||||||
func (c *Client) updateChatReadOutbox(update *client.UpdateChatReadOutbox) {
|
func (c *Client) updateChatReadOutbox(update *client.UpdateChatReadOutbox) {
|
||||||
c.sendMarker(update.ChatId, update.LastReadOutboxMessageId, gateway.MarkerTypeDisplayed)
|
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
|
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)
|
sChatId := gateway.MUCNODE(chatID)
|
||||||
myNickname := "me"
|
myNickname := "me"
|
||||||
if c.me != nil {
|
if c.me != nil {
|
||||||
|
|
@ -611,47 +620,31 @@ func (c *Client) sendMUCStatuses(chatID int64) {
|
||||||
myAffiliation := "member"
|
myAffiliation := "member"
|
||||||
myRole := "participant"
|
myRole := "participant"
|
||||||
|
|
||||||
members, err := c.client.SearchChatMembers(&client.SearchChatMembersRequest{
|
for _, member := range members {
|
||||||
ChatId: chatID,
|
senderId := c.GetSenderId(member.MemberId)
|
||||||
Limit: 200,
|
nickname := c.GetMUCNickname(senderId)
|
||||||
Filter: &client.ChatMembersFilterMembers{},
|
affiliation, role := c.memberStatusToAffiliationAndRole(member.Status)
|
||||||
})
|
mucState.Members[senderId] = &MUCMember{
|
||||||
if err == nil {
|
Nickname: nickname,
|
||||||
for _, member := range members.Members {
|
Affiliation: affiliation,
|
||||||
var senderId int64
|
Role: role,
|
||||||
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)),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
// according to the spec, own member entry should be sent the last
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue