Skip to content
This repository was archived by the owner on Feb 11, 2026. It is now read-only.

Commit 0e32693

Browse files
committed
Добавить поддержку байтов в файлах, рефактор транспортов и метод read_message
1 parent b519264 commit 0e32693

22 files changed

Lines changed: 745 additions & 942 deletions

redocs/source/clients.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,19 @@ MaxClient
8484
limit=50
8585
)
8686
87+
# Изменить профиль с загрузкой фото
88+
result = await client.change_profile(
89+
first_name="Иван",
90+
last_name="Петров",
91+
description="Привет!",
92+
photo=Photo(...) # Новая фотография профиля
93+
)
94+
95+
# Разрешить группу по ссылке
96+
group = await client.resolve_group_by_link(
97+
link="https://max.app/g/ABC123"
98+
)
99+
87100
Свойства:
88101

89102
.. code-block:: python
@@ -95,6 +108,7 @@ MaxClient
95108
client.channels # Список каналов (list[Channel])
96109
client.phone # Номер телефона (str)
97110
client.token # Токен сессии (str | None)
111+
client.contacts # Список контактов (list[User])
98112
99113
Обработчики событий:
100114

redocs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
project = "PyMax"
77
author = "ink-developer"
88
copyright = "2025, ink-developer"
9-
release = "1.1.21"
9+
release = "1.2.3"
1010

1111
# -- Path setup ---------------------------------------------------------------
1212
sys.path.insert(0, os.path.abspath("../../src"))

redocs/source/index.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
.. image:: _static/logo.svg
66
:align: center
77
:width: 320px
8+
89
PyMax
910
=====
1011

@@ -34,13 +35,18 @@ PyMax
3435
decorators
3536
examples
3637
guides
38+
release_notes
3739

3840
.. rubric:: Особенности
3941

4042
- Вход по номеру телефона
4143
- Отправка / редактирование / удаление сообщений
4244
- Управление чатами, каналами и диалогами
4345
- Получение истории сообщений
46+
- Загрузка фотографий профиля
47+
- Разрешение групп по ссылке
48+
- Поддержка контактов в сообщениях
49+
- Управление списком контактов
4450

4551
---
4652

redocs/source/release_notes.rst

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
Release Notes v1.2.3
2+
====================
3+
4+
Новые функции
5+
-------------
6+
7+
**Загрузка фотографий профиля**
8+
Профиль теперь может быть обновлен с загрузкой новой фотографии через метод ``change_profile()``.
9+
10+
**Разрешение групп по ссылке**
11+
Группы теперь могут быть разрешены (получены) прямо по их ссылке через метод ``resolve_group_by_link()``.
12+
13+
**Поддержка контактов в сообщениях**
14+
Сообщения теперь поддерживают вложения типа контакта с информацией о контакте (ContactAttach).
15+
16+
**Список контактов клиента**
17+
Клиент теперь ведет список всех контактов пользователя через свойство ``client.contacts``.
18+
19+
Новые методы
20+
------------
21+
22+
MaxClient.resolve_group_by_link(link: str) -> Chat | None
23+
Разрешает группу по ссылке. Возвращает объект чата группы или None, если не найдено.
24+
25+
MaxClient.change_profile(first_name, last_name, description, photo)
26+
Изменяет информацию профиля текущего пользователя, включая загрузку новой фотографии.
27+
28+
Новые типы
29+
----------
30+
31+
ContactAttach
32+
Представляет контакт в сообщении. Содержит информацию о контакте (ID, имя, фамилия, фото).
33+
34+
Измененные типы
35+
---------------
36+
37+
Message
38+
Теперь поддерживает вложения типа ContactAttach в список attaches.
39+
40+
Names
41+
Улучшен для работы с различными форматами имен пользователя.
42+
43+
StickerAttach
44+
Улучшено представление стикеров в сообщениях.
45+
46+
Photo
47+
Улучшено для работы с фотографиями профиля.
48+
49+
AttachType
50+
Добавлено значение CONTACT для контактов.
51+
52+
Новые параметры
53+
---------------
54+
55+
MaxClient.contacts: list[User]
56+
Список контактов текущего пользователя.
57+
58+
Версия
59+
------
60+
61+
**1.2.3** - выпущена 24 декабря 2025 г.

src/pymax/files.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99

1010

1111
class BaseFile(ABC):
12-
def __init__(self, url: str | None = None, path: str | None = None) -> None:
12+
def __init__(
13+
self, raw: bytes | None = None, *, url: str | None = None, path: str | None = None
14+
) -> None:
15+
self.raw = raw
1316
self.url = url
1417
self.path = path
1518

@@ -21,6 +24,9 @@ def __init__(self, url: str | None = None, path: str | None = None) -> None:
2124

2225
@abstractmethod
2326
async def read(self) -> bytes:
27+
if self.raw is not None:
28+
return self.raw
29+
2430
if self.url:
2531
async with (
2632
ClientSession() as session,
@@ -45,13 +51,15 @@ class Photo(BaseFile):
4551
".bmp",
4652
} # FIXME: костыль ✅
4753

48-
def __init__(self, url: str | None = None, path: str | None = None) -> None:
54+
def __init__(
55+
self, raw: bytes | None = None, *, url: str | None = None, path: str | None = None
56+
) -> None:
4957
if path:
5058
self.file_name = Path(path).name
5159
elif url:
5260
self.file_name = Path(url).name
5361

54-
super().__init__(url, path)
62+
super().__init__(raw=raw, url=url, path=path)
5563

5664
def validate_photo(self) -> tuple[str, str] | None:
5765
if self.path:
@@ -83,7 +91,9 @@ async def read(self) -> bytes:
8391

8492

8593
class Video(BaseFile):
86-
def __init__(self, url: str | None = None, path: str | None = None) -> None:
94+
def __init__(
95+
self, raw: bytes | None = None, *, url: str | None = None, path: str | None = None
96+
) -> None:
8797
self.file_name: str = ""
8898
if path:
8999
self.file_name = Path(path).name
@@ -92,15 +102,17 @@ def __init__(self, url: str | None = None, path: str | None = None) -> None:
92102

93103
if not self.file_name:
94104
raise ValueError("Either url or path must be provided.")
95-
super().__init__(url, path)
105+
super().__init__(raw=raw, url=url, path=path)
96106

97107
@override
98108
async def read(self) -> bytes:
99109
return await super().read()
100110

101111

102112
class File(BaseFile):
103-
def __init__(self, url: str | None = None, path: str | None = None) -> None:
113+
def __init__(
114+
self, raw: bytes | None = None, *, url: str | None = None, path: str | None = None
115+
) -> None:
104116
self.file_name: str = ""
105117
if path:
106118
self.file_name = Path(path).name
@@ -110,7 +122,7 @@ def __init__(self, url: str | None = None, path: str | None = None) -> None:
110122
if not self.file_name:
111123
raise ValueError("Either url or path must be provided.")
112124

113-
super().__init__(url, path)
125+
super().__init__(raw=raw, url=url, path=path)
114126

115127
@override
116128
async def read(self) -> bytes:

0 commit comments

Comments
 (0)