diff --git a/telegram/utils.go b/telegram/utils.go index e041412..618ca6f 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -91,6 +91,7 @@ const ( MembersListBanned MembersListBannedAndAdministrators MembersListAdministrators + MembersListCreators ) const ( @@ -221,6 +222,18 @@ func (c *Client) GetContactByID(id int64, chat *client.Chat) (*client.Chat, *cli return chat, user, nil } +// GetChatByID gets exactly a chat from a cache, or error if chat is not found +func (c *Client) GetChatByID(id int64, chat *client.Chat) (*client.Chat, error) { + chat, _, err := c.GetContactByID(id, nil) + if err != nil { + return nil, err + } else if chat == nil { + return nil, errors.New("Chat not found") + } + + return chat, nil +} + // GetChatType obtains chat type from its information func (c *Client) GetChatType(id int64) (ChatType, *client.Chat, error) { if !c.Online() || id == 0 { @@ -2620,6 +2633,38 @@ func (c *Client) sendMessagesReverse(chatID int64, messages []*client.Message, p // GetChatMembers retrieves a list of chat members. "Limited" mode works only if there are no more than 20 members at all func (c *Client) GetChatMembers(chatID int64, limited bool, query string, membersList MembersList) ([]*client.ChatMember, error) { + if membersList == MembersListCreators { + chat, err := c.GetChatByID(chatID, nil) + if err != nil { + return nil, err + } + + chatType := chat.Type.ChatTypeType() + if chatType == client.TypeChatTypeBasicGroup { + basicGroupType, _ := chat.Type.(*client.ChatTypeBasicGroup) + fullInfo, err := c.client.GetBasicGroupFullInfo(&client.GetBasicGroupFullInfoRequest{ + BasicGroupId: basicGroupType.BasicGroupId, + }) + if err != nil { + return nil, err + } + + if fullInfo.CreatorUserId != 0 { + chatMember, err := c.client.GetChatMember(&client.GetChatMemberRequest{ + ChatId: chatID, + MemberId: &client.MessageSenderUser{UserId: fullInfo.CreatorUserId}, + }) + if err != nil { + return nil, err + } + + return []*client.ChatMember{chatMember}, nil + } + } + + return nil, errors.New("Creator not found") + } + var filters []client.ChatMembersFilter switch membersList { case MembersListMembers: @@ -2638,11 +2683,9 @@ func (c *Client) GetChatMembers(chatID int64, limited bool, query string, member if limited { limit = 20 - chat, _, err := c.GetContactByID(chatID, nil) + chat, err := c.GetChatByID(chatID, nil) if err != nil { return nil, err - } else if chat == nil { - return nil, errors.New("Chat not found") } chatType := chat.Type.ChatTypeType() diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 8a8bc51..576b533 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -1233,8 +1233,7 @@ func handleGetQueryMucAdmin(s xmpp.Sender, iq *stanza.IQ, query *extensions.Quer } switch item.Affiliation { case "owner": - iqAnswerSetError(answer, 403) - return + membersList = telegram.MembersListCreators case "admin": membersList = telegram.MembersListAdministrators case "member":