Support retrieving chat administrators/owner in supergroups

This commit is contained in:
Bohdan Horbeshko 2025-07-22 13:53:19 -04:00
parent 10fc1d26ef
commit 422ac9dea6

View file

@ -2732,11 +2732,14 @@ func (c *Client) GetChatMembers(chatID int64, limited bool, query string, member
return []*client.ChatMember{chatMember}, nil
}
} else if chatType == client.TypeChatTypeSupergroup {
// noop, use complex filtering strategy later
} else {
return nil, errors.New("Creator not found")
}
return nil, errors.New("Creator not found")
}
var administratorsRequest bool
var filters []client.ChatMembersFilter
switch membersList {
case MembersListMembers:
@ -2747,7 +2750,8 @@ func (c *Client) GetChatMembers(chatID int64, limited bool, query string, member
filters = []client.ChatMembersFilter{&client.ChatMembersFilterBanned{}}
case MembersListBannedAndAdministrators:
filters = []client.ChatMembersFilter{&client.ChatMembersFilterBanned{}, &client.ChatMembersFilterAdministrators{}}
case MembersListAdministrators:
case MembersListAdministrators, MembersListCreators:
administratorsRequest = true
filters = []client.ChatMembersFilter{&client.ChatMembersFilterAdministrators{}}
}
@ -2792,6 +2796,18 @@ func (c *Client) GetChatMembers(chatID int64, limited bool, query string, member
}
}
administrators := make(map[int64]*client.ChatAdministrator)
if administratorsRequest {
chatAdministrators, err := c.client.GetChatAdministrators(&client.GetChatAdministratorsRequest{
ChatId: chatID,
})
if err == nil {
for _, administrator := range chatAdministrators.Administrators {
administrators[administrator.UserId] = administrator
}
}
}
var members []*client.ChatMember
for _, filter := range filters {
chatMembers, err := c.client.SearchChatMembers(&client.SearchChatMembersRequest{
@ -2803,7 +2819,17 @@ func (c *Client) GetChatMembers(chatID int64, limited bool, query string, member
if err != nil {
return nil, err
}
members = append(members, chatMembers.Members...)
for _, member := range chatMembers.Members {
switch membersList {
case MembersListAdministrators, MembersListCreators:
senderId := c.GetSenderId(member.MemberId)
administrator, ok := administrators[senderId]
if !ok || (administrator.IsOwner == (membersList == MembersListAdministrators)) {
continue
}
}
members = append(members, member)
}
}
return members, nil
}