maxapi-python 2.1.0__tar.gz → 2.1.1__tar.gz

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.
Files changed (221) hide show
  1. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/PKG-INFO +1 -1
  2. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/account.rst +15 -10
  3. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/index.rst +1 -0
  4. maxapi_python-2.1.1/docs/release-2-1-1.rst +16 -0
  5. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/pyproject.toml +1 -1
  6. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/__init__.py +1 -1
  7. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/self/service.py +11 -4
  8. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/uploads/service.py +4 -2
  9. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/app.py +4 -0
  10. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/self.py +2 -6
  11. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/transport/tcp.py +4 -2
  12. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/connection/test_readers_and_transports.py +47 -0
  13. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/uv.lock +1 -1
  14. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
  17. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.github/pull_request_template.md +0 -0
  18. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.github/workflows/publish.yml +0 -0
  19. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.gitignore +0 -0
  20. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/.pre-commit-config.yaml +0 -0
  21. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/LICENSE +0 -0
  22. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/README.md +0 -0
  23. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/_static/.gitkeep +0 -0
  24. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/api/auth.rst +0 -0
  25. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/api/client.rst +0 -0
  26. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/api/files.rst +0 -0
  27. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/api/router.rst +0 -0
  28. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/auth.rst +0 -0
  29. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/chats.rst +0 -0
  30. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/client.rst +0 -0
  31. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/conf.py +0 -0
  32. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/examples.rst +0 -0
  33. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/faq.rst +0 -0
  34. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/files.rst +0 -0
  35. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/formatting.rst +0 -0
  36. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/getting-started.rst +0 -0
  37. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/messages.rst +0 -0
  38. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/release-2-1-0.rst +0 -0
  39. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/router.rst +0 -0
  40. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/troubleshooting.rst +0 -0
  41. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/audio_attachment.rst +0 -0
  42. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/call_attachment.rst +0 -0
  43. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/chat.rst +0 -0
  44. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/contact_attachment.rst +0 -0
  45. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/control_attachment.rst +0 -0
  46. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/element.rst +0 -0
  47. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/enums.rst +0 -0
  48. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/file_attachment.rst +0 -0
  49. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/folder.rst +0 -0
  50. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/folder_list.rst +0 -0
  51. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/folder_update.rst +0 -0
  52. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/index.rst +0 -0
  53. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/inline_keyboard_attachment.rst +0 -0
  54. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/message.rst +0 -0
  55. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/message_delete_event.rst +0 -0
  56. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/name.rst +0 -0
  57. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/photo_attachment.rst +0 -0
  58. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/profile.rst +0 -0
  59. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/reaction_counter.rst +0 -0
  60. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/reaction_info.rst +0 -0
  61. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/read_state.rst +0 -0
  62. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/session.rst +0 -0
  63. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/share_attachment.rst +0 -0
  64. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/sticker_attachment.rst +0 -0
  65. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/sync_overrides.rst +0 -0
  66. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/sync_state.rst +0 -0
  67. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/user.rst +0 -0
  68. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/types/video_attachment.rst +0 -0
  69. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/docs/users.rst +0 -0
  70. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/__init__.py +0 -0
  71. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/auth/__init__.py +0 -0
  72. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/auth/enums.py +0 -0
  73. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/auth/payloads.py +0 -0
  74. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/auth/service.py +0 -0
  75. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/auth/types.py +0 -0
  76. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/bots/__init__.py +0 -0
  77. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/bots/payloads.py +0 -0
  78. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/bots/service.py +0 -0
  79. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/chats/__init__.py +0 -0
  80. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/chats/enums.py +0 -0
  81. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/chats/payloads.py +0 -0
  82. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/chats/service.py +0 -0
  83. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/facade.py +0 -0
  84. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/messages/__init__.py +0 -0
  85. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/messages/enums.py +0 -0
  86. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/messages/payloads.py +0 -0
  87. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/messages/service.py +0 -0
  88. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/models.py +0 -0
  89. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/response.py +0 -0
  90. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/self/__init__.py +0 -0
  91. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/self/enums.py +0 -0
  92. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/self/payloads.py +0 -0
  93. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/session/__init__.py +0 -0
  94. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/session/enums.py +0 -0
  95. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/session/payloads.py +0 -0
  96. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/session/service.py +0 -0
  97. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/uploads/__init__.py +0 -0
  98. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/uploads/models.py +0 -0
  99. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/uploads/payloads.py +0 -0
  100. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/users/__init__.py +0 -0
  101. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/users/enums.py +0 -0
  102. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/users/payloads.py +0 -0
  103. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/api/users/service.py +0 -0
  104. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/__init__.py +0 -0
  105. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/base.py +0 -0
  106. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/email.py +0 -0
  107. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/models.py +0 -0
  108. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/providers.py +0 -0
  109. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/qr.py +0 -0
  110. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/service.py +0 -0
  111. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/auth/sms.py +0 -0
  112. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/base.py +0 -0
  113. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/client.py +0 -0
  114. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/client_web.py +0 -0
  115. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/config.py +0 -0
  116. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/__init__.py +0 -0
  117. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/connection.py +0 -0
  118. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/pending.py +0 -0
  119. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/readers/__init__.py +0 -0
  120. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/readers/base.py +0 -0
  121. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/readers/tcp.py +0 -0
  122. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/connection/readers/ws.py +0 -0
  123. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/dispatch/__init__.py +0 -0
  124. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/dispatch/dispatcher.py +0 -0
  125. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/dispatch/enums.py +0 -0
  126. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/dispatch/mapping.py +0 -0
  127. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/dispatch/resolvers.py +0 -0
  128. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/dispatch/router.py +0 -0
  129. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/exceptions.py +0 -0
  130. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/files/__init__.py +0 -0
  131. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/files/base.py +0 -0
  132. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/files/file.py +0 -0
  133. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/files/photo.py +0 -0
  134. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/files/static.py +0 -0
  135. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/files/video.py +0 -0
  136. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/formatting/__init__.py +0 -0
  137. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/formatting/markdown.py +0 -0
  138. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/__init__.py +0 -0
  139. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/auth.py +0 -0
  140. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/base.py +0 -0
  141. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/bots.py +0 -0
  142. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/chat.py +0 -0
  143. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/message.py +0 -0
  144. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/protocol.py +0 -0
  145. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/infra/user.py +0 -0
  146. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/logging.py +0 -0
  147. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/__init__.py +0 -0
  148. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/base.py +0 -0
  149. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/enums.py +0 -0
  150. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/models.py +0 -0
  151. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/tcp/__init__.py +0 -0
  152. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/tcp/compression.py +0 -0
  153. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/tcp/framing.py +0 -0
  154. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/tcp/payload.py +0 -0
  155. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/tcp/protocol.py +0 -0
  156. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/ws/__init__.py +0 -0
  157. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/protocol/ws/protocol.py +0 -0
  158. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/py.typed +0 -0
  159. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/routers.py +0 -0
  160. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/session/__init__.py +0 -0
  161. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/session/models.py +0 -0
  162. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/session/protocol.py +0 -0
  163. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/session/store.py +0 -0
  164. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/telemetry/__init__.py +0 -0
  165. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/telemetry/navigation.py +0 -0
  166. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/telemetry/payloads.py +0 -0
  167. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/telemetry/service.py +0 -0
  168. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/transport/__init__.py +0 -0
  169. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/transport/base.py +0 -0
  170. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/transport/websocket.py +0 -0
  171. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/__init__.py +0 -0
  172. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/__init__.py +0 -0
  173. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/__init__.py +0 -0
  174. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/audio.py +0 -0
  175. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/call.py +0 -0
  176. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/contact.py +0 -0
  177. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/control.py +0 -0
  178. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/enums.py +0 -0
  179. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/file.py +0 -0
  180. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/keyboards/__init__.py +0 -0
  181. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/keyboards/inline.py +0 -0
  182. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/photo.py +0 -0
  183. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/share.py +0 -0
  184. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/sticker.py +0 -0
  185. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/attachments/video.py +0 -0
  186. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/auth.py +0 -0
  187. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/base.py +0 -0
  188. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/bots.py +0 -0
  189. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/chat.py +0 -0
  190. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/element.py +0 -0
  191. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/enums.py +0 -0
  192. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/error.py +0 -0
  193. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/folder.py +0 -0
  194. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/login.py +0 -0
  195. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/member.py +0 -0
  196. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/message.py +0 -0
  197. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/name.py +0 -0
  198. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/presence.py +0 -0
  199. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/profile.py +0 -0
  200. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/session.py +0 -0
  201. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/sync.py +0 -0
  202. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/domain/user.py +0 -0
  203. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/events/__init__.py +0 -0
  204. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/events/file.py +0 -0
  205. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/events/message.py +0 -0
  206. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/src/pymax/types/events/video.py +0 -0
  207. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/__init__.py +0 -0
  208. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/api/test_auth_service.py +0 -0
  209. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/api/test_chat_user_self_session_services.py +0 -0
  210. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/api/test_message_service.py +0 -0
  211. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/api/test_upload_service.py +0 -0
  212. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/app/test_app_runtime.py +0 -0
  213. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/auth/test_auth_flows.py +0 -0
  214. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/conftest.py +0 -0
  215. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/connection/test_connection.py +0 -0
  216. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/dispatch/test_dispatcher.py +0 -0
  217. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/domain/test_bound_models.py +0 -0
  218. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/files/test_files_and_formatting.py +0 -0
  219. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/protocol/test_protocols.py +0 -0
  220. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/session/test_store.py +0 -0
  221. {maxapi_python-2.1.0 → maxapi_python-2.1.1}/tests/telemetry/test_telemetry.py +0 -0
@@ -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
@@ -32,21 +32,26 @@ Account
32
32
  Фотография профиля
33
33
  ------------------
34
34
 
35
- Сейчас ``change_profile(photo=...)`` не загружает файл напрямую. Для фото
36
- нужен ``photo_token`` от API Max:
35
+ Передайте ``Photo`` в ``change_profile(photo=...)``, чтобы PyMax сам загрузил
36
+ файл и применил новый токен фотографии:
37
37
 
38
38
  .. code-block:: python
39
39
 
40
- upload_url = await client.request_profile_photo_upload_url()
41
- print(upload_url)
40
+ from pymax import Photo
42
41
 
43
42
  await client.change_profile(
44
43
  first_name="Alex",
45
- photo_token="PHOTO_TOKEN",
44
+ photo=Photo(path="avatar.jpg"),
46
45
  )
47
46
 
48
- Если передать ``photo`` вместо ``photo_token``, PyMax выбросит
49
- ``NotImplementedError``.
47
+ Если у вас уже есть токен фотографии от API Max, его можно передать напрямую:
48
+
49
+ .. code-block:: python
50
+
51
+ await client.change_profile(
52
+ first_name="Alex",
53
+ photo_token="PHOTO_TOKEN",
54
+ )
50
55
 
51
56
  Папки чатов
52
57
  -----------
@@ -118,9 +123,9 @@ Account
118
123
  ``on_start`` или после успешного ``await client.start()`` в собственном
119
124
  lifecycle.
120
125
 
121
- ``NotImplementedError`` при ``change_profile(photo=...)``
122
- Прямая загрузка фото через параметр ``photo`` пока не реализована.
123
- Используйте ``photo_token``.
126
+ Фото профиля не обновилось
127
+ Если переданы и ``photo``, и ``photo_token``, PyMax загрузит ``photo`` и
128
+ использует новый токен загруженной фотографии.
124
129
 
125
130
  Папка создалась, но список старый
126
131
  Используйте ``get_folders()`` после изменения и сохраняйте новый
@@ -22,6 +22,7 @@ PyMax - асинхронная Python-библиотека для Max API. Он
22
22
  :maxdepth: 1
23
23
  :caption: Новости
24
24
 
25
+ release-2-1-1
25
26
  release-2-1-0
26
27
 
27
28
  .. toctree::
@@ -0,0 +1,16 @@
1
+ PyMax 2.1.1
2
+ ===========
3
+
4
+ Изменения относительно ``2.1.0``.
5
+
6
+ Добавлено
7
+ ---------
8
+
9
+ * ``change_profile(photo=...)`` теперь загружает фотографию профиля напрямую.
10
+
11
+ Исправлено
12
+ ----------
13
+
14
+ * TLS-handshake при TCP-подключении через proxy передает ``server_hostname``.
15
+ * Локальный токен обновляется после ``close_all_sessions()`` и при получении
16
+ нового токена во время handshake.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "maxapi-python"
3
- version = "2.1.0"
3
+ version = "2.1.1"
4
4
  description = "Python wrapper для API мессенджера Max"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -1,4 +1,4 @@
1
- __version__ = "2.1.0"
1
+ __version__ = "2.1.1"
2
2
 
3
3
 
4
4
  from .auth import (
@@ -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(
@@ -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
@@ -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,
@@ -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",
@@ -104,6 +104,53 @@ async def test_tcp_transport_connect_send_recv_and_close(
104
104
  assert writer.closed is True
105
105
 
106
106
 
107
+ @pytest.mark.asyncio
108
+ async def test_tcp_transport_proxy_ssl_passes_server_hostname(
109
+ monkeypatch: pytest.MonkeyPatch,
110
+ ) -> None:
111
+ reader = FakeStreamReader()
112
+ writer = FakeStreamWriter()
113
+ sock = object()
114
+ proxy_connect_kwargs = {}
115
+ open_connection_kwargs = {}
116
+
117
+ class FakeProxy:
118
+ async def connect(self, **kwargs):
119
+ proxy_connect_kwargs.update(kwargs)
120
+ return sock
121
+
122
+ async def open_connection(*args, **kwargs):
123
+ open_connection_kwargs.update(kwargs)
124
+ return reader, writer
125
+
126
+ monkeypatch.setattr(
127
+ "pymax.transport.tcp.Proxy.from_url",
128
+ lambda proxy_url: FakeProxy(),
129
+ )
130
+ monkeypatch.setattr(
131
+ "pymax.transport.tcp.asyncio.open_connection", open_connection
132
+ )
133
+
134
+ transport = TCPTransport(
135
+ "example.test",
136
+ 443,
137
+ proxy="socks5://localhost:9050",
138
+ use_ssl=True,
139
+ )
140
+
141
+ await transport.connect()
142
+
143
+ assert proxy_connect_kwargs == {
144
+ "dest_host": "example.test",
145
+ "dest_port": 443,
146
+ }
147
+ assert open_connection_kwargs == {
148
+ "sock": sock,
149
+ "ssl": True,
150
+ "server_hostname": "example.test",
151
+ }
152
+
153
+
107
154
  class FakeWebSocket:
108
155
  def __init__(self) -> None:
109
156
  self.close_code = None
@@ -1033,7 +1033,7 @@ wheels = [
1033
1033
 
1034
1034
  [[package]]
1035
1035
  name = "maxapi-python"
1036
- version = "2.1.0"
1036
+ version = "2.1.1"
1037
1037
  source = { editable = "." }
1038
1038
  dependencies = [
1039
1039
  { name = "aiofiles" },
File without changes
File without changes
File without changes