From 422ac9dea69a3c09afc2977b7d6d00607e95465c Mon Sep 17 00:00:00 2001 From: Bohdan Horbeshko Date: Tue, 22 Jul 2025 13:53:19 -0400 Subject: [PATCH] Support retrieving chat administrators/owner in supergroups --- telegram/utils.go | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/telegram/utils.go b/telegram/utils.go index 191a55d..2d0e0b8 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -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 }