maxapi-python 2.1.0__py3-none-any.whl → 2.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxapi-python
3
- Version: 2.1.0
3
+ Version: 2.1.1
4
4
  Summary: Python wrapper для API мессенджера Max
5
5
  Project-URL: Homepage, https://github.com/MaxApiTeam/PyMax
6
6
  Project-URL: Repository, https://github.com/MaxApiTeam/PyMax
@@ -1,5 +1,5 @@
1
- pymax/__init__.py,sha256=-f9yJXBxQn-YB5JLrX3VrTKV7_vFjPJs13AQqraH2ao,1255
2
- pymax/app.py,sha256=SZMvhC237H1N58b5XcjRNGjwK-FiTgsevHnpzt-sdvg,9643
1
+ pymax/__init__.py,sha256=4tc91HCbTG_Xq6M7IPdc3sF_7bpScpoXEG0CQZyvDAs,1255
2
+ pymax/app.py,sha256=3FlgRT7Lj4LxoRQfSsuw1kHby5au6klhxnjHBXrvmQ0,9819
3
3
  pymax/base.py,sha256=Q6FR5K1nOaeVnYlzRgqC6_v7AWUiJJCkI4TuzCYbj-U,7255
4
4
  pymax/client.py,sha256=KiDEiUL49IGxRtq4-Sr3IABa8Rh1TRPq41Gv5jH2m_Q,4013
5
5
  pymax/client_web.py,sha256=iTwlsY75d_wg-vUGObTq7SVinp0L__2r8cvG49BtmUI,3041
@@ -31,7 +31,7 @@ pymax/api/messages/service.py,sha256=N5_KYArZB-VX7kOLMfkrwzrpNgvqNFLRLOym_ghM6IQ
31
31
  pymax/api/self/__init__.py,sha256=TfbqL4xLb5IMhbW8mlAK-AwVFqqPWMADogKZeWtkw0A,79
32
32
  pymax/api/self/enums.py,sha256=iKEqPy44LyQKvAPfyhpkSXgmWWohxry73F0CVgtekwY,180
33
33
  pymax/api/self/payloads.py,sha256=-SFqkNxC5ZLKnLty_Gyz_b_P3X1esu_7Urb4HjrQxM4,774
34
- pymax/api/self/service.py,sha256=3TBB-wxGTJ9jRCJJNfitk0hJNtWQDn9gWS_sap1Hou8,4685
34
+ pymax/api/self/service.py,sha256=Fr4PlGT4Vn50kVQC9rleZu5UTvxLjTAsfR5mxY2IIUw,4921
35
35
  pymax/api/session/__init__.py,sha256=zo-rCKBVBsFK-810T-Le4VbAYKt109cQ6elf0UkgiNk,36
36
36
  pymax/api/session/enums.py,sha256=InBdwAu_filqW3rMfGrOkHgmFfqgB1ytjnCcxDq29xc,236
37
37
  pymax/api/session/payloads.py,sha256=mDXgI_oVfqLim7J9F9BMUwKx9Vs8EknJ02kstrF3ClE,2340
@@ -39,7 +39,7 @@ pymax/api/session/service.py,sha256=8ELcsnKNHLT8hgExw5laZvHF6SIOSQB6RpXoxf1rbbI,
39
39
  pymax/api/uploads/__init__.py,sha256=E7INNsBeMStze2VWMADX4mrswsQeJb85C71sSuiOpv0,35
40
40
  pymax/api/uploads/models.py,sha256=c2Yunnl9nRkDZuItXGKlY0Oi5DjnB4f5bcruQ49ARZk,934
41
41
  pymax/api/uploads/payloads.py,sha256=hf0MwLdtTHnt5KGONbV4hnByjy5X0PJLqer6uq9nuuw,694
42
- pymax/api/uploads/service.py,sha256=5wa4MI3jL7BFWCWbMLWZBP-NTOqRcblUq4Iz19ekXx4,19481
42
+ pymax/api/uploads/service.py,sha256=qiYYPqryWr9h0EOWrglWz6z70I3UYXgBglTn0e0USFY,19533
43
43
  pymax/api/users/__init__.py,sha256=CDakgSKwVAkX-kNoDmIo2JsFPsS7Nx3j2vIMwQnPRck,82
44
44
  pymax/api/users/enums.py,sha256=m3d225sjWkBIRF5NNi3ChnyZ6BgKUEbPYoYwVjpifZ4,205
45
45
  pymax/api/users/payloads.py,sha256=VoXXctQDl7WXt5zqoRKzdONqmris5Cxf7-6Hy_Gcd-A,288
@@ -80,7 +80,7 @@ pymax/infra/bots.py,sha256=IJs4ErFxjbMeiHfQgpDiDhtEu9ws-lIp8fb8I96szy8,1202
80
80
  pymax/infra/chat.py,sha256=gZdkciUl_BCnPucxb8JubQ6phPCTcmVfX9C3edKXZRM,12690
81
81
  pymax/infra/message.py,sha256=Hee5z9a47aZRnSAvTMdTaa5BzwMnOnSoB-z3JVX3J3o,8518
82
82
  pymax/infra/protocol.py,sha256=I2WrAeAgATuNSdK2gvHU-MhhxdRBfSMGMovF5HPFsQw,208
83
- pymax/infra/self.py,sha256=w2eHIgmKkarhfbtAdGo_iZ4Qbs2DaSzzm-TLzXKNn8E,4963
83
+ pymax/infra/self.py,sha256=h2GnzcCF2-FeY9-qBjtHjrSCx7elc4RjuCXPaewDkgg,4828
84
84
  pymax/infra/user.py,sha256=nv9jkWpWvCWETHZsyUMmm5FWkzLTJT2SHXZ7SglZE8M,4331
85
85
  pymax/protocol/__init__.py,sha256=rDn1Twi1iBDUk1155YI9jyeQyaGVDRuPoWdlaaLZnsw,242
86
86
  pymax/protocol/base.py,sha256=_bisk1BU_GSMSPIqfnizSCgm_qBrdbB5cJw6foAa2tc,294
@@ -103,7 +103,7 @@ pymax/telemetry/payloads.py,sha256=MCKYGpQ4Tvx_8LH86Et0yevea2Th2z3b7a9pfmrQRys,3
103
103
  pymax/telemetry/service.py,sha256=xuAUsLt0QOwypxn8NjSUtSTfcZxgIY9YVWnvZ-KawZY,7120
104
104
  pymax/transport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  pymax/transport/base.py,sha256=0D3srQ36F0s23pIjqd6YzRGKK9wCmXKr3wfe2XYYlos,448
106
- pymax/transport/tcp.py,sha256=9HCmPK-qBC5AvFINW4jHyzXQPTWvIYFiwxDmVHA8-og,2998
106
+ pymax/transport/tcp.py,sha256=aV7KzjAbjtQ7irTKsdlfDyZWhREW1QqOe_fBZSxMekE,3097
107
107
  pymax/transport/websocket.py,sha256=0ezkSoENWKV00EATIizGx16-ihCnaTC76zzGnwbS_3c,1504
108
108
  pymax/types/__init__.py,sha256=y77mfDRgxmfcamobi0rj2d3PsxhH0zxyvKPhL2iUdS8,44
109
109
  pymax/types/domain/__init__.py,sha256=R4iJv0b5gnNVG3MrerVlGVzPvNR-n36QZFukEX64fn4,470
@@ -141,7 +141,7 @@ pymax/types/events/__init__.py,sha256=fNLP_8zYRsew2k-1s8wXCJeSPm8QQ4gmiZ86B51SuC
141
141
  pymax/types/events/file.py,sha256=XhpXn0Vt9OODkx1OkGb9jfQwc1uNgz1NTn_j9FZnQ8s,102
142
142
  pymax/types/events/message.py,sha256=d4dlnpu3VCtZ4vFdRXaACvydAE9sbGGkk52E48K0U_U,1248
143
143
  pymax/types/events/video.py,sha256=swBHYadmDS0SjLXGqVqRYsuMoVZ6MjD2aYR2fbM-AJc,104
144
- maxapi_python-2.1.0.dist-info/METADATA,sha256=kmE4GpooJO7S8X4GH8qELBv0cQZqDJvXZlBH_t2vktE,7637
145
- maxapi_python-2.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
146
- maxapi_python-2.1.0.dist-info/licenses/LICENSE,sha256=hOR249ItqMdcly1A0amqEWRNRTq4Gv5NJtmQ3A5qK4E,1070
147
- maxapi_python-2.1.0.dist-info/RECORD,,
144
+ maxapi_python-2.1.1.dist-info/METADATA,sha256=2z2avbn6KZLKC63s-N9Gl8Wu78IsT75BMkas8p6rZi0,7637
145
+ maxapi_python-2.1.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
146
+ maxapi_python-2.1.1.dist-info/licenses/LICENSE,sha256=hOR249ItqMdcly1A0amqEWRNRTq4Gv5NJtmQ3A5qK4E,1070
147
+ maxapi_python-2.1.1.dist-info/RECORD,,
pymax/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "2.1.0"
1
+ __version__ = "2.1.1"
2
2
 
3
3
 
4
4
  from .auth import (
pymax/api/self/service.py CHANGED
@@ -9,6 +9,7 @@ from pymax.api.response import (
9
9
  require_payload_item_model,
10
10
  require_payload_model,
11
11
  )
12
+ from pymax.files import Photo
12
13
  from pymax.logging import get_logger
13
14
  from pymax.protocol import Opcode
14
15
  from pymax.types.domain import FolderList, FolderUpdate, Profile
@@ -47,15 +48,20 @@ class SelfService:
47
48
  first_name: str,
48
49
  last_name: str | None = None,
49
50
  description: str | None = None,
50
- photo: Any | None = None,
51
+ photo: Photo | None = None,
51
52
  *,
52
53
  photo_token: str | None = None,
53
54
  ) -> bool:
54
55
  if photo is not None:
55
- raise NotImplementedError(
56
- "Profile photo upload is not implemented without upload infra. "
57
- "Pass photo_token instead."
56
+ attach = await self.app.api.uploads.upload_photo(
57
+ photo, profile=True
58
58
  )
59
+ if photo_token:
60
+ logger.warning(
61
+ "photo_token argument was provided but will be overridden by the uploaded photo token"
62
+ )
63
+
64
+ photo_token = attach.photo_token
59
65
 
60
66
  frame = ChangeProfilePayload(
61
67
  first_name=first_name,
@@ -145,6 +151,7 @@ class SelfService:
145
151
  return False
146
152
 
147
153
  await self.app.store.update_token(self.app.session.token, token)
154
+ self.app.session.token = token
148
155
 
149
156
  return True
150
157
 
@@ -51,11 +51,13 @@ class UploadService:
51
51
  self.on_file_attach
52
52
  )
53
53
 
54
- async def upload_photo(self, photo: Photo) -> AttachPhotoPayload:
54
+ async def upload_photo(
55
+ self, photo: Photo, profile: bool = False
56
+ ) -> AttachPhotoPayload:
55
57
  logger.info("Uploading photo")
56
58
  logger.debug("Preparing photo upload payload")
57
59
 
58
- payload = UploadPayload().model_dump()
60
+ payload = UploadPayload(profile=profile).model_dump()
59
61
 
60
62
  try:
61
63
  data = await self.app.invoke(
pymax/app.py CHANGED
@@ -135,6 +135,10 @@ class App(Generic[ClientT]):
135
135
  self.config.device.user_agent,
136
136
  )
137
137
 
138
+ if response.token != self.session.token:
139
+ await self.store.update_token(self.session.token, response.token)
140
+ self.session.token = response.token
141
+
138
142
  self.me = response.profile
139
143
  self.chats = response.chats
140
144
  self.users[self.me.contact.id] = self.me.contact
pymax/infra/self.py CHANGED
@@ -29,17 +29,13 @@ class SelfMixin(IClientProtocol):
29
29
  first_name: Имя профиля.
30
30
  last_name: Фамилия профиля.
31
31
  description: Описание профиля.
32
- photo: Файл или объект фото. Прямая загрузка через этот
33
- параметр пока не реализована.
32
+ photo: Файл или объект фото, который нужно загрузить как новую
33
+ фотографию профиля.
34
34
  photo_token: Токен фотографии, уже загруженной через API Max.
35
35
 
36
36
  Returns:
37
37
  ``True`` после успешного обновления. Клиент также обновит
38
38
  ``client.me`` и кеш текущего контакта.
39
-
40
- Raises:
41
- NotImplementedError: Если передан ``photo`` вместо
42
- ``photo_token``.
43
39
  """
44
40
  return await self._app.api.account.change_profile(
45
41
  first_name=first_name,
pymax/transport/tcp.py CHANGED
@@ -33,10 +33,12 @@ class TCPTransport(Transport):
33
33
  sock = await proxy.connect(
34
34
  dest_host=self._host,
35
35
  dest_port=self._port,
36
- ssl=self._use_ssl,
37
36
  )
37
+ server_hostname = self._host if self._use_ssl else None
38
38
  self._reader, self._writer = await asyncio.open_connection(
39
- sock=sock, ssl=self._use_ssl
39
+ sock=sock,
40
+ ssl=self._use_ssl,
41
+ server_hostname=server_hostname,
40
42
  )
41
43
  logger.info(
42
44
  "tcp connected via proxy %s host=%s port=%s ssl=%s",