diff --git a/src/pymax/api/chats/enums.py b/src/pymax/api/chats/enums.py index 4f61325..ffc1275 100644 --- a/src/pymax/api/chats/enums.py +++ b/src/pymax/api/chats/enums.py @@ -22,6 +22,7 @@ class ChatPayloadKey(str, Enum): CHAT = "chat" CHATS = "chats" MEMBERS = "members" + MARKER = "marker" class ChatLinkPrefix(str, Enum): diff --git a/src/pymax/api/chats/payloads.py b/src/pymax/api/chats/payloads.py index 1adc8be..4d8981d 100644 --- a/src/pymax/api/chats/payloads.py +++ b/src/pymax/api/chats/payloads.py @@ -95,6 +95,13 @@ class GetChatInfoPayload(CamelModel): chat_ids: list[int] +class GetChatMembersPayload(CamelModel): + type: str = "MEMBER" # TODO: ENUMM!!! + chat_id: int + marker: int + count: int = 50 + + class LeaveChatPayload(CamelModel): chat_id: int diff --git a/src/pymax/api/chats/service.py b/src/pymax/api/chats/service.py index 83c5469..a731fce 100644 --- a/src/pymax/api/chats/service.py +++ b/src/pymax/api/chats/service.py @@ -7,6 +7,7 @@ from pymax.api.response import ( parse_payload_item_model, parse_payload_list, + payload_item, require_payload_item_model, require_payload_model, ) @@ -27,6 +28,7 @@ FetchChatsPayload, FetchJoinRequests, GetChatInfoPayload, + GetChatMembersPayload, InviteUsersPayload, JoinChatPayload, JoinRequestActionPayload, @@ -266,6 +268,22 @@ async def get_chats(self, chat_ids: list[int]) -> list[Chat]: return [cached[chat_id] for chat_id in chat_ids if chat_id in cached] + async def get_chat_members( + self, + chat_id: int, + marker: int | None = None, + count: int = 50, + ) -> tuple[list[Member], int]: + frame = GetChatMembersPayload(chat_id=chat_id, marker=marker or 0, count=count) + response = await self.app.invoke(Opcode.CHAT_MEMBERS, frame.to_payload()) + + members = bind_api_model( + self.app, + parse_payload_list(response, ChatPayloadKey.MEMBERS, Member), + ) + next_marker = payload_item(response, ChatPayloadKey.MARKER, int) or 0 + return members, next_marker + async def get_chat(self, chat_id: int) -> Chat: chats = await self.get_chats([chat_id]) if not chats: diff --git a/src/pymax/infra/chat.py b/src/pymax/infra/chat.py index 7e13218..34d908c 100644 --- a/src/pymax/infra/chat.py +++ b/src/pymax/infra/chat.py @@ -211,6 +211,28 @@ async def get_chat(self, chat_id: int) -> Chat: """ return await self._app.api.chats.get_chat(chat_id) + async def get_chat_members( + self, + chat_id: int, + marker: int | None = None, + count: int = 50, + ) -> tuple[list[Member], int]: + """Возвращает страницу участников чата по ID. + + Args: + chat_id: ID чата. + marker: Маркер страницы. Если ``None``, запрашивается первая + страница. + count: Максимальное количество участников в ответе. + + Returns: + ``(members, next_marker)``. Если участников больше, чем + уместилось в ответ, ``next_marker`` ненулевой — передайте его в + следующий вызов, чтобы получить следующую страницу. ``0`` + означает, что дальше страниц нет. + """ + return await self._app.api.chats.get_chat_members(chat_id, marker, count) + async def leave_group(self, chat_id: int) -> None: """Выходит из группы.