maxapi-python 2.4.0__tar.gz → 2.5.0__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 (314) hide show
  1. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/PKG-INFO +22 -12
  2. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/README.md +18 -10
  3. maxapi_python-2.5.0/TODO.md +45 -0
  4. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/account.rst +2 -3
  5. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/auth.rst +2 -0
  6. maxapi_python-2.5.0/docs/api/client-session.rst +20 -0
  7. maxapi_python-2.5.0/docs/api/client-versions.rst +12 -0
  8. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client.rst +2 -0
  9. maxapi_python-2.5.0/docs/api/router.rst +41 -0
  10. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/auth.rst +24 -0
  11. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/chats.rst +8 -0
  12. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/client.rst +125 -12
  13. maxapi_python-2.5.0/docs/di.rst +144 -0
  14. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/examples.rst +5 -12
  15. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/faq.rst +7 -3
  16. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/files.rst +27 -7
  17. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/formatting.rst +10 -1
  18. maxapi_python-2.5.0/docs/fsm.rst +160 -0
  19. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/getting-started.rst +10 -5
  20. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/index.rst +5 -0
  21. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/messages.rst +169 -12
  22. maxapi_python-2.5.0/docs/release-2-4-1.rst +103 -0
  23. maxapi_python-2.5.0/docs/release-2-5-0.rst +181 -0
  24. maxapi_python-2.5.0/docs/router.rst +391 -0
  25. maxapi_python-2.5.0/docs/stories.rst +203 -0
  26. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/troubleshooting.rst +8 -6
  27. maxapi_python-2.5.0/docs/types/callback_response.rst +9 -0
  28. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/enums.rst +9 -0
  29. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/index.rst +12 -3
  30. maxapi_python-2.5.0/docs/types/story.rst +62 -0
  31. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/pyproject.toml +6 -2
  32. maxapi_python-2.5.0/scripts/todo.py +48 -0
  33. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/__init__.py +8 -2
  34. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/_data/apk_fingerprints.json +374 -17
  35. maxapi_python-2.5.0/src/pymax/_data/rootca_ssl_rsa2022.crt +33 -0
  36. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/service.py +15 -2
  37. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/types.py +3 -0
  38. maxapi_python-2.5.0/src/pymax/api/bots/payloads.py +15 -0
  39. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/bots/service.py +13 -1
  40. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/enums.py +1 -0
  41. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/payloads.py +21 -1
  42. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/service.py +41 -0
  43. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/facade.py +2 -0
  44. maxapi_python-2.5.0/src/pymax/api/messages/__init__.py +1 -0
  45. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/messages/enums.py +1 -0
  46. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/messages/payloads.py +56 -4
  47. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/messages/service.py +405 -27
  48. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/response.py +1 -1
  49. maxapi_python-2.5.0/src/pymax/api/stories/__init__.py +2 -0
  50. maxapi_python-2.5.0/src/pymax/api/stories/enums.py +19 -0
  51. maxapi_python-2.5.0/src/pymax/api/stories/payloads.py +64 -0
  52. maxapi_python-2.5.0/src/pymax/api/stories/service.py +198 -0
  53. maxapi_python-2.5.0/src/pymax/api/uploads/payloads.py +72 -0
  54. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/uploads/service.py +171 -69
  55. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/app.py +39 -8
  56. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/__init__.py +2 -0
  57. maxapi_python-2.5.0/src/pymax/auth/exceptions.py +9 -0
  58. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/providers.py +6 -2
  59. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/qr.py +11 -1
  60. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/sms.py +11 -1
  61. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/base.py +146 -27
  62. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/client.py +39 -11
  63. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/client_web.py +15 -12
  64. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/config.py +101 -53
  65. maxapi_python-2.5.0/src/pymax/di/__init__.py +2 -0
  66. maxapi_python-2.5.0/src/pymax/di/context.py +18 -0
  67. maxapi_python-2.5.0/src/pymax/di/resolver.py +38 -0
  68. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/__init__.py +7 -0
  69. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/dispatcher.py +143 -40
  70. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/enums.py +1 -0
  71. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/mapping.py +23 -3
  72. maxapi_python-2.5.0/src/pymax/dispatch/middleware.py +32 -0
  73. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/resolvers.py +4 -0
  74. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/dispatch/router.py +86 -34
  75. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/base.py +58 -1
  76. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/video.py +32 -40
  77. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/voice.py +18 -4
  78. maxapi_python-2.5.0/src/pymax/filters/__init__.py +15 -0
  79. maxapi_python-2.5.0/src/pymax/filters/base.py +218 -0
  80. maxapi_python-2.5.0/src/pymax/filters/containers/__init__.py +2 -0
  81. maxapi_python-2.5.0/src/pymax/filters/containers/chat.py +240 -0
  82. maxapi_python-2.5.0/src/pymax/filters/containers/message.py +147 -0
  83. maxapi_python-2.5.0/src/pymax/filters/filters.py +211 -0
  84. maxapi_python-2.5.0/src/pymax/filters/magic.py +13 -0
  85. maxapi_python-2.5.0/src/pymax/filters/presets.py +88 -0
  86. maxapi_python-2.5.0/src/pymax/filters/refs.py +56 -0
  87. maxapi_python-2.5.0/src/pymax/fingerprint/fingerprint.py +30 -0
  88. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/fingerprint/models.py +1 -0
  89. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/formatting/markdown.py +55 -1
  90. maxapi_python-2.5.0/src/pymax/fsm/__init__.py +3 -0
  91. maxapi_python-2.5.0/src/pymax/fsm/context.py +30 -0
  92. maxapi_python-2.5.0/src/pymax/fsm/protocol.py +14 -0
  93. maxapi_python-2.5.0/src/pymax/fsm/state.py +70 -0
  94. maxapi_python-2.5.0/src/pymax/fsm/storage.py +151 -0
  95. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/base.py +2 -0
  96. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/bots.py +20 -0
  97. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/chat.py +37 -5
  98. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/message.py +204 -9
  99. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/protocol.py +5 -1
  100. maxapi_python-2.5.0/src/pymax/infra/stories.py +205 -0
  101. maxapi_python-2.5.0/src/pymax/integrations/dishka.py +109 -0
  102. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/enums.py +2 -0
  103. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/payload.py +0 -2
  104. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/session/__init__.py +1 -1
  105. maxapi_python-2.5.0/src/pymax/session/models.py +41 -0
  106. maxapi_python-2.5.0/src/pymax/session/protocol.py +40 -0
  107. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/session/store.py +73 -5
  108. maxapi_python-2.5.0/src/pymax/transport/__init__.py +0 -0
  109. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/transport/tcp.py +11 -3
  110. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/__init__.py +23 -1
  111. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/__init__.py +1 -1
  112. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/call.py +7 -1
  113. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/contact.py +3 -3
  114. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/control.py +3 -0
  115. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/enums.py +16 -0
  116. maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/__init__.py +1 -0
  117. maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/enums.py +12 -0
  118. maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/inline.py +90 -0
  119. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/video.py +3 -3
  120. maxapi_python-2.5.0/src/pymax/types/domain/callback.py +19 -0
  121. maxapi_python-2.5.0/src/pymax/types/domain/comment.py +24 -0
  122. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/enums.py +7 -0
  123. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/message.py +158 -9
  124. maxapi_python-2.5.0/src/pymax/types/domain/story.py +126 -0
  125. maxapi_python-2.5.0/src/pymax/types/events/reaction.py +45 -0
  126. maxapi_python-2.5.0/src/pymax/versions/__init__.py +2 -0
  127. maxapi_python-2.5.0/src/pymax/versions/catalog.py +104 -0
  128. maxapi_python-2.5.0/src/pymax/versions/exceptions.py +10 -0
  129. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_auth_service.py +8 -19
  130. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_chat_user_self_session_services.py +10 -2
  131. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_message_service.py +6 -8
  132. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/api/test_upload_service.py +6 -7
  133. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/app/test_app_runtime.py +129 -2
  134. maxapi_python-2.5.0/tests/app/test_client_user_agent_config.py +37 -0
  135. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/auth/test_auth_flows.py +4 -1
  136. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/conftest.py +13 -2
  137. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/connection/test_readers_and_transports.py +1 -1
  138. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/dispatch/test_dispatcher.py +33 -7
  139. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_bound_models.py +1 -1
  140. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/files/test_files_and_formatting.py +35 -0
  141. maxapi_python-2.5.0/tests/filters/test_magic.py +145 -0
  142. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/session/test_store.py +65 -0
  143. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/uv.lock +22 -6
  144. maxapi_python-2.4.0/docs/api/router.rst +0 -16
  145. maxapi_python-2.4.0/docs/router.rst +0 -247
  146. maxapi_python-2.4.0/src/pymax/api/bots/payloads.py +0 -7
  147. maxapi_python-2.4.0/src/pymax/api/messages/__init__.py +0 -1
  148. maxapi_python-2.4.0/src/pymax/api/uploads/payloads.py +0 -31
  149. maxapi_python-2.4.0/src/pymax/fingerprint/fingerprint.py +0 -47
  150. maxapi_python-2.4.0/src/pymax/session/models.py +0 -11
  151. maxapi_python-2.4.0/src/pymax/session/protocol.py +0 -14
  152. maxapi_python-2.4.0/src/pymax/types/domain/attachments/keyboards/__init__.py +0 -1
  153. maxapi_python-2.4.0/src/pymax/types/domain/attachments/keyboards/inline.py +0 -19
  154. maxapi_python-2.4.0/src/pymax/types/events/reaction.py +0 -21
  155. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  156. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  157. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
  158. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/pull_request_template.md +0 -0
  159. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/workflows/publish.yml +0 -0
  160. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.github/workflows/tests.yml +0 -0
  161. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.gitignore +0 -0
  162. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/.pre-commit-config.yaml +0 -0
  163. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/LICENSE +0 -0
  164. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/_static/.gitkeep +0 -0
  165. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client-client.rst +0 -0
  166. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client-config.rst +0 -0
  167. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/client-web.rst +0 -0
  168. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/api/files.rst +0 -0
  169. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/conf.py +0 -0
  170. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-0.rst +0 -0
  171. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-1.rst +0 -0
  172. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-2.rst +0 -0
  173. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-1-3.rst +0 -0
  174. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-2-0.rst +0 -0
  175. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-3-0.rst +0 -0
  176. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-3-1.rst +0 -0
  177. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/release-2-4-0.rst +0 -0
  178. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/audio_attachment.rst +0 -0
  179. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/call_attachment.rst +0 -0
  180. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/chat.rst +0 -0
  181. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/contact_attachment.rst +0 -0
  182. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/contact_info.rst +0 -0
  183. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/control_attachment.rst +0 -0
  184. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/element.rst +0 -0
  185. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/file_attachment.rst +0 -0
  186. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/folder.rst +0 -0
  187. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/folder_list.rst +0 -0
  188. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/folder_update.rst +0 -0
  189. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/inline_keyboard_attachment.rst +0 -0
  190. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/message.rst +0 -0
  191. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/message_delete_event.rst +0 -0
  192. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/message_read_event.rst +0 -0
  193. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/name.rst +0 -0
  194. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/photo_attachment.rst +0 -0
  195. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/poll.rst +0 -0
  196. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/poll_attachment.rst +0 -0
  197. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/presence_event.rst +0 -0
  198. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/profile.rst +0 -0
  199. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/reaction_counter.rst +0 -0
  200. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/reaction_info.rst +0 -0
  201. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/reaction_update_event.rst +0 -0
  202. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/read_state.rst +0 -0
  203. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/session.rst +0 -0
  204. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/share_attachment.rst +0 -0
  205. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/sticker_attachment.rst +0 -0
  206. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/sync_overrides.rst +0 -0
  207. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/sync_state.rst +0 -0
  208. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/typing_event.rst +0 -0
  209. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/user.rst +0 -0
  210. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/types/video_attachment.rst +0 -0
  211. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/docs/users.rst +0 -0
  212. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/__init__.py +0 -0
  213. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/__init__.py +0 -0
  214. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/enums.py +0 -0
  215. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/auth/payloads.py +0 -0
  216. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/binding.py +0 -0
  217. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/bots/__init__.py +0 -0
  218. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/chats/__init__.py +0 -0
  219. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/models.py +0 -0
  220. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/__init__.py +0 -0
  221. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/enums.py +0 -0
  222. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/payloads.py +0 -0
  223. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/self/service.py +0 -0
  224. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/__init__.py +0 -0
  225. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/enums.py +0 -0
  226. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/payloads.py +0 -0
  227. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/session/service.py +0 -0
  228. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/uploads/__init__.py +0 -0
  229. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/uploads/models.py +0 -0
  230. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/__init__.py +0 -0
  231. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/enums.py +0 -0
  232. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/payloads.py +0 -0
  233. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/api/users/service.py +0 -0
  234. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/base.py +0 -0
  235. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/email.py +0 -0
  236. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/models.py +0 -0
  237. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/auth/service.py +0 -0
  238. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/__init__.py +0 -0
  239. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/connection.py +0 -0
  240. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/pending.py +0 -0
  241. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/__init__.py +0 -0
  242. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/base.py +0 -0
  243. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/tcp.py +0 -0
  244. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/connection/readers/ws.py +0 -0
  245. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/exceptions.py +0 -0
  246. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/__init__.py +0 -0
  247. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/file.py +0 -0
  248. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/photo.py +0 -0
  249. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/files/static.py +0 -0
  250. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/fingerprint/__init__.py +0 -0
  251. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/formatting/__init__.py +0 -0
  252. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/__init__.py +0 -0
  253. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/auth.py +0 -0
  254. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/self.py +0 -0
  255. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/infra/user.py +0 -0
  256. {maxapi_python-2.4.0/src/pymax/transport → maxapi_python-2.5.0/src/pymax/integrations}/__init__.py +0 -0
  257. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/logging.py +0 -0
  258. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/__init__.py +0 -0
  259. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/base.py +0 -0
  260. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/models.py +0 -0
  261. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/__init__.py +0 -0
  262. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/compression.py +0 -0
  263. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/framing.py +0 -0
  264. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/protocol.py +0 -0
  265. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/ws/__init__.py +0 -0
  266. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/protocol/ws/protocol.py +0 -0
  267. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/py.typed +0 -0
  268. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/routers.py +0 -0
  269. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/__init__.py +0 -0
  270. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/navigation.py +0 -0
  271. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/payloads.py +0 -0
  272. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/telemetry/service.py +0 -0
  273. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/transport/base.py +0 -0
  274. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/transport/websocket.py +0 -0
  275. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/__init__.py +0 -0
  276. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/audio.py +0 -0
  277. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/file.py +0 -0
  278. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/photo.py +0 -0
  279. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/poll.py +0 -0
  280. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/share.py +0 -0
  281. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/sticker.py +0 -0
  282. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/unknown.py +0 -0
  283. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/auth.py +0 -0
  284. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/base.py +0 -0
  285. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/bots.py +0 -0
  286. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/chat.py +0 -0
  287. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/element.py +0 -0
  288. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/error.py +0 -0
  289. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/folder.py +0 -0
  290. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/handshake.py +0 -0
  291. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/login.py +0 -0
  292. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/member.py +0 -0
  293. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/name.py +0 -0
  294. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/presence.py +0 -0
  295. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/profile.py +0 -0
  296. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/session.py +0 -0
  297. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/sync.py +0 -0
  298. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/domain/user.py +0 -0
  299. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/__init__.py +0 -0
  300. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/file.py +0 -0
  301. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/mark.py +0 -0
  302. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/message.py +0 -0
  303. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/presence.py +0 -0
  304. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/typing.py +0 -0
  305. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/video.py +0 -0
  306. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/src/pymax/types/events/voice.py +0 -0
  307. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/__init__.py +0 -0
  308. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/connection/test_connection.py +0 -0
  309. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_login_models.py +0 -0
  310. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_message_models.py +0 -0
  311. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/domain/test_user_models.py +0 -0
  312. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/protocol/test_protocols.py +0 -0
  313. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/telemetry/test_telemetry.py +0 -0
  314. {maxapi_python-2.4.0 → maxapi_python-2.5.0}/tests/test_logging.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: maxapi-python
3
- Version: 2.4.0
3
+ Version: 2.5.0
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,6 +32,8 @@ Requires-Dist: python-socks[asyncio]>=2.8.1
32
32
  Requires-Dist: qrcode>=8.2
33
33
  Requires-Dist: websockets>=16.0
34
34
  Requires-Dist: zstandard>=0.25.0
35
+ Provides-Extra: dishka
36
+ Requires-Dist: dishka>=1.10.1; extra == 'dishka'
35
37
  Provides-Extra: video
36
38
  Requires-Dist: tinytag>=2.2.1; extra == 'video'
37
39
  Description-Content-Type: text/markdown
@@ -43,6 +45,7 @@ Python-библиотека для Max API.
43
45
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
44
46
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
45
47
  [![Package](https://img.shields.io/badge/package-maxapi--python-orange.svg)](https://pypi.org/project/maxapi-python/)
48
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/maxapi-python?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/maxapi-python)
46
49
 
47
50
  > [!WARNING]
48
51
  > PyMax использует неофициальный внутренний API Max. API может измениться без
@@ -61,11 +64,15 @@ WebSocket.
61
64
 
62
65
  - Авторизация по телефону и SMS-коду через `Client`.
63
66
  - QR-авторизация web-клиента через `WebClient`.
64
- - Роутеры, фильтры, `on_start`, raw-события и typed events.
65
- - Сообщения: отправка, ответы, reply, реакции, pin, read, delete и история.
67
+ - Роутеры, составные фильтры, middleware, `on_start`, raw-события и typed events.
68
+ - FSM для диалогов и необязательная интеграция с Dishka.
69
+ - Сообщения: отправка и планирование, ответы, реакции, pin, read, delete и история.
70
+ - Комментарии к постам каналов и нажатия inline-кнопок ботов.
71
+ - Сторис: фото и видео, лента, реакции и статистика просмотров.
66
72
  - Чаты, группы, участники, invite-ссылки и настройки групп.
67
73
  - Пользователи, контакты, профиль, папки, активные сессии и 2FA.
68
- - Вложения: `Photo`, `File`, `Video`.
74
+ - Вложения: `Photo`, `File`, `Video`, `Voice`, `VideoNote`.
75
+ - Выбор версии mobile-клиента с локальным или обновляемым каталогом fingerprints.
69
76
  - SQLite-сессии, sync-state, reconnect и debug-логи.
70
77
  - Pydantic-модели и удобные domain-объекты.
71
78
 
@@ -98,6 +105,7 @@ pip install git+https://github.com/MaxApiTeam/PyMax.git
98
105
  import asyncio
99
106
 
100
107
  from pymax import Client, Message
108
+ from pymax.filters import Command
101
109
 
102
110
  client = Client(
103
111
  phone="+79990000000",
@@ -112,7 +120,7 @@ async def on_start(client: Client) -> None:
112
120
  print("Ваш ID:", client.me.contact.id if client.me else "unknown")
113
121
 
114
122
 
115
- @client.on_message()
123
+ @client.on_message(Command("start"))
116
124
  async def on_message(message: Message, client: Client) -> None:
117
125
  print(message.chat_id, message.sender, message.text)
118
126
 
@@ -128,6 +136,8 @@ if __name__ == "__main__":
128
136
  asyncio.run(main())
129
137
  ```
130
138
 
139
+ Отправьте `/start`, чтобы вызвать обработчик.
140
+
131
141
  ## WebClient
132
142
 
133
143
  `WebClient` использует WebSocket и QR-авторизацию:
@@ -155,15 +165,12 @@ Handler всегда принимает событие и клиента: `(even
155
165
 
156
166
  ```python
157
167
  from pymax import Client, ClientRouter, Message
168
+ from pymax.filters import Command
158
169
 
159
170
  router = ClientRouter()
160
171
 
161
172
 
162
- def is_start(message: Message) -> bool:
163
- return message.text == "/start"
164
-
165
-
166
- @router.on_message(is_start)
173
+ @router.on_message(Command("start"))
167
174
  async def start(message: Message, client: Client) -> None:
168
175
  await message.answer("Готово")
169
176
 
@@ -176,8 +183,11 @@ client.include_router(router)
176
183
 
177
184
  - [Getting Started](docs/getting-started.rst) - первый запуск и сессии.
178
185
  - [Client](docs/client.rst) - жизненный цикл клиента, reconnect и sync-state.
179
- - [Router](docs/router.rst) - роутеры, фильтры и raw events.
186
+ - [Router](docs/router.rst) - роутеры, фильтры, middleware и raw events.
187
+ - [FSM](docs/fsm.rst) - состояния и данные диалога.
188
+ - [DI и Dishka](docs/di.rst) - зависимости обработчиков.
180
189
  - [Messages](docs/messages.rst) - сообщения, реакции, история и вложения.
190
+ - [Stories](docs/stories.rst) - публикация и чтение сторис.
181
191
  - [Files](docs/files.rst) - отправка и скачивание файлов.
182
192
  - [FAQ](docs/faq.rst) и [Troubleshooting](docs/troubleshooting.rst) - частые
183
193
  проблемы.
@@ -5,6 +5,7 @@ Python-библиотека для Max API.
5
5
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
6
6
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
7
  [![Package](https://img.shields.io/badge/package-maxapi--python-orange.svg)](https://pypi.org/project/maxapi-python/)
8
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/maxapi-python?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/maxapi-python)
8
9
 
9
10
  > [!WARNING]
10
11
  > PyMax использует неофициальный внутренний API Max. API может измениться без
@@ -23,11 +24,15 @@ WebSocket.
23
24
 
24
25
  - Авторизация по телефону и SMS-коду через `Client`.
25
26
  - QR-авторизация web-клиента через `WebClient`.
26
- - Роутеры, фильтры, `on_start`, raw-события и typed events.
27
- - Сообщения: отправка, ответы, reply, реакции, pin, read, delete и история.
27
+ - Роутеры, составные фильтры, middleware, `on_start`, raw-события и typed events.
28
+ - FSM для диалогов и необязательная интеграция с Dishka.
29
+ - Сообщения: отправка и планирование, ответы, реакции, pin, read, delete и история.
30
+ - Комментарии к постам каналов и нажатия inline-кнопок ботов.
31
+ - Сторис: фото и видео, лента, реакции и статистика просмотров.
28
32
  - Чаты, группы, участники, invite-ссылки и настройки групп.
29
33
  - Пользователи, контакты, профиль, папки, активные сессии и 2FA.
30
- - Вложения: `Photo`, `File`, `Video`.
34
+ - Вложения: `Photo`, `File`, `Video`, `Voice`, `VideoNote`.
35
+ - Выбор версии mobile-клиента с локальным или обновляемым каталогом fingerprints.
31
36
  - SQLite-сессии, sync-state, reconnect и debug-логи.
32
37
  - Pydantic-модели и удобные domain-объекты.
33
38
 
@@ -60,6 +65,7 @@ pip install git+https://github.com/MaxApiTeam/PyMax.git
60
65
  import asyncio
61
66
 
62
67
  from pymax import Client, Message
68
+ from pymax.filters import Command
63
69
 
64
70
  client = Client(
65
71
  phone="+79990000000",
@@ -74,7 +80,7 @@ async def on_start(client: Client) -> None:
74
80
  print("Ваш ID:", client.me.contact.id if client.me else "unknown")
75
81
 
76
82
 
77
- @client.on_message()
83
+ @client.on_message(Command("start"))
78
84
  async def on_message(message: Message, client: Client) -> None:
79
85
  print(message.chat_id, message.sender, message.text)
80
86
 
@@ -90,6 +96,8 @@ if __name__ == "__main__":
90
96
  asyncio.run(main())
91
97
  ```
92
98
 
99
+ Отправьте `/start`, чтобы вызвать обработчик.
100
+
93
101
  ## WebClient
94
102
 
95
103
  `WebClient` использует WebSocket и QR-авторизацию:
@@ -117,15 +125,12 @@ Handler всегда принимает событие и клиента: `(even
117
125
 
118
126
  ```python
119
127
  from pymax import Client, ClientRouter, Message
128
+ from pymax.filters import Command
120
129
 
121
130
  router = ClientRouter()
122
131
 
123
132
 
124
- def is_start(message: Message) -> bool:
125
- return message.text == "/start"
126
-
127
-
128
- @router.on_message(is_start)
133
+ @router.on_message(Command("start"))
129
134
  async def start(message: Message, client: Client) -> None:
130
135
  await message.answer("Готово")
131
136
 
@@ -138,8 +143,11 @@ client.include_router(router)
138
143
 
139
144
  - [Getting Started](docs/getting-started.rst) - первый запуск и сессии.
140
145
  - [Client](docs/client.rst) - жизненный цикл клиента, reconnect и sync-state.
141
- - [Router](docs/router.rst) - роутеры, фильтры и raw events.
146
+ - [Router](docs/router.rst) - роутеры, фильтры, middleware и raw events.
147
+ - [FSM](docs/fsm.rst) - состояния и данные диалога.
148
+ - [DI и Dishka](docs/di.rst) - зависимости обработчиков.
142
149
  - [Messages](docs/messages.rst) - сообщения, реакции, история и вложения.
150
+ - [Stories](docs/stories.rst) - публикация и чтение сторис.
143
151
  - [Files](docs/files.rst) - отправка и скачивание файлов.
144
152
  - [FAQ](docs/faq.rst) и [Troubleshooting](docs/troubleshooting.rst) - частые
145
153
  проблемы.
@@ -0,0 +1,45 @@
1
+ # PyMax TODO :3
2
+
3
+ > [!NOTE]
4
+ > This file is maintained by the project owner. Please do not edit it in pull requests.
5
+
6
+ Format:
7
+ - Refactoring / Bugs: `TEXT. PATH. PRIORITY`
8
+ - Features: `TEXT. TARGET. PRIORITY`
9
+
10
+ ## Refactoring
11
+
12
+ - [ ] Перевести все аргументы, связанные со временем, на `DateTimeUnion`. `api/messages/service.py:65`. P: 50
13
+ - [ ] Перенести часть общих типов в `common`, например `SendAttachments`. -. P: 40
14
+ - [ ] Пересмотреть систему типов, возможно разбить её на более мелкие части. -. P: 70
15
+
16
+ ## Bugs
17
+
18
+ - [X] Исправить голосовые/кружки. `api/upload/service.py`. P: 100
19
+ - [X] Исправить генерацию device_id. `src/pymax/base.py:111`. P: 80
20
+
21
+ ## Features
22
+
23
+ - [ ] FSM. Почти готово. `2.5.0`. P: 80
24
+ - [ ] DI. `2.5.0`. P: 75
25
+ - [ ] Улучшенная система фильтров. Почти готово. `2.5.0`. P: 90
26
+
27
+
28
+ # Autogenerated TODO. Please, dont touch it
29
+ - [ ] src/pymax/api/chats/payloads.py:100: ENUMM!!!
30
+ - [ ] src/pymax/api/chats/payloads.py:123: ENUMM!!!
31
+ - [ ] src/pymax/api/messages/payloads.py:40: enum?
32
+ - [ ] src/pymax/api/messages/service.py:137: TypeAlias
33
+ - [ ] src/pymax/api/uploads/service.py:68: ENUM!!!!
34
+ - [ ] src/pymax/api/uploads/service.py:85: enum maybe?
35
+ - [ ] src/pymax/api/uploads/service.py:291: Error handing (yes, with 200 status 💔)
36
+ - [ ] src/pymax/api/users/service.py:133: maybe also return phone mapping?
37
+ - [ ] src/pymax/config.py:52: delete maybe
38
+ - [ ] src/pymax/dispatch/dispatcher.py:79: make better comparison or just remove it
39
+ - [ ] src/pymax/dispatch/dispatcher.py:204: create iter_on_start_handlers
40
+ - [ ] src/pymax/protocol/tcp/payload.py:34: deprecate? idk
41
+ - [ ] src/pymax/transport/websocket.py:28: origin should be configurable
42
+ - [ ] src/pymax/types/domain/attachments/video.py:70: idk maybe | None = None better
43
+ - [ ] src/pymax/types/domain/user.py:14: move to another file
44
+ - [ ] src/pymax/types/events/message.py:49: impl it in the better way maybe
45
+ - [ ] src/pymax/versions/catalog.py:88: msg
@@ -129,9 +129,8 @@ login или ping:
129
129
  -------------
130
130
 
131
131
  ``client.me`` равен ``None``
132
- Login еще не завершился или клиент не запущен. Читайте профиль внутри
133
- ``on_start`` или после успешного ``await client.start()`` в собственном
134
- lifecycle.
132
+ Login еще не завершился. Читайте профиль внутри ``on_start`` или после
133
+ успешного ``await client.connect()``.
135
134
 
136
135
  Фото профиля не обновилось
137
136
  Если переданы и ``photo``, и ``photo_token``, PyMax загрузит ``photo`` и
@@ -33,3 +33,5 @@ Auth API
33
33
 
34
34
  .. autoclass:: pymax.ConsoleQrHandler
35
35
  :members:
36
+
37
+ .. autoclass:: pymax.PasswordAttemptsExceededError
@@ -0,0 +1,20 @@
1
+ Session storage
2
+ ===============
3
+
4
+ .. currentmodule:: pymax.session
5
+
6
+ ``Client`` и ``WebClient`` используют этот контракт для token,
7
+ device/user-agent и sync-state. Выбор и lifecycle хранилища описаны в разделе
8
+ :ref:`client-session-guide`.
9
+
10
+ .. autoclass:: SessionInfo
11
+ :members:
12
+
13
+ .. autoclass:: StoreProtocol
14
+ :members:
15
+
16
+ .. autoclass:: SessionStore
17
+ :members:
18
+
19
+ .. autoclass:: InMemoryStore
20
+ :members:
@@ -0,0 +1,12 @@
1
+ Version Catalog
2
+ ===============
3
+
4
+ .. currentmodule:: pymax.versions
5
+
6
+ ``VersionCatalog`` связывает версию Android-клиента с build number и
7
+ fingerprint, которые использует ``Client``.
8
+
9
+ .. autoclass:: VersionCatalog
10
+ :members:
11
+
12
+ .. autoclass:: VersionNotFoundError
@@ -23,3 +23,5 @@ Clients API
23
23
  client-client
24
24
  client-web
25
25
  client-config
26
+ client-session
27
+ client-versions
@@ -0,0 +1,41 @@
1
+ Router API
2
+ ==========
3
+
4
+ .. autoclass:: pymax.Router
5
+ :members:
6
+ :show-inheritance:
7
+
8
+ .. autoclass:: pymax.dispatch.ErrorScope
9
+ :members:
10
+
11
+ .. autoclass:: pymax.dispatch.ErrorContext
12
+ :members:
13
+
14
+ .. autodata:: pymax.ClientRouter
15
+
16
+ .. autodata:: pymax.WebRouter
17
+
18
+ Фильтры
19
+ -------
20
+
21
+ Примеры регистрации и объединения фильтров приведены в :doc:`/router`.
22
+
23
+ .. autoclass:: pymax.filters.Filter
24
+ :exclude-members: resolve_filter_result
25
+
26
+ .. autoclass:: pymax.filters.Command
27
+
28
+ .. autoclass:: pymax.filters.Reply
29
+
30
+ .. autoclass:: pymax.filters.Forwarded
31
+
32
+ .. autoclass:: pymax.filters.FromMe
33
+
34
+ .. autoclass:: pymax.filters.HasAttachment
35
+
36
+ Middleware
37
+ ----------
38
+
39
+ .. autoclass:: pymax.dispatch.Middleware
40
+
41
+ .. autodata:: pymax.dispatch.MiddlewareNext
@@ -88,6 +88,30 @@ Provider нужен, когда код приходит не из консоли
88
88
  Если provider вернет пустую строку или Max отклонит пароль, ``SmsAuthFlow``
89
89
  попросит пароль снова.
90
90
 
91
+ Количество попыток можно ограничить через ``ExtraConfig``:
92
+
93
+ .. code-block:: python
94
+
95
+ from pymax import Client, ExtraConfig, PasswordAttemptsExceededError
96
+
97
+ client = Client(
98
+ phone="+79990000000",
99
+ password_provider=EnvPasswordProvider(),
100
+ extra_config=ExtraConfig(password_max_attempts=3),
101
+ )
102
+
103
+ try:
104
+ await client.connect()
105
+ except PasswordAttemptsExceededError:
106
+ print("Пароль 2FA не принят")
107
+
108
+ ``password_max_attempts=None`` означает неограниченное число попыток и
109
+ сохраняет прежнее поведение. Пустой пароль, ``ApiError``, ошибка в ответе Max
110
+ и ответ без login token расходуют одну попытку. При ``0`` или отрицательном
111
+ значении provider не вызывается, а ``PasswordAttemptsExceededError``
112
+ возникает сразу. Исключение наследуется напрямую от ``Exception``, поэтому
113
+ его нужно перехватывать отдельно от ``PyMaxError``.
114
+
91
115
  Кастомный QR handler
92
116
  --------------------
93
117
 
@@ -129,10 +129,13 @@ login/sync, а также методы для загрузки, создания
129
129
 
130
130
  .. code-block:: python
131
131
 
132
+ from pymax import Photo
133
+
132
134
  await client.change_group_profile(
133
135
  chat_id=123456,
134
136
  name="Новый заголовок",
135
137
  description="Описание группы",
138
+ photo=Photo(path="group.jpg"),
136
139
  )
137
140
 
138
141
  await client.change_group_settings(
@@ -141,6 +144,11 @@ login/sync, а также методы для загрузки, создания
141
144
  only_admin_can_call=True,
142
145
  )
143
146
 
147
+ ``name``, ``description`` и ``photo`` независимы: передавайте только поля,
148
+ которые нужно изменить. Значение ``None`` исключает поле из запроса. Перед
149
+ обновлением профиля PyMax автоматически загружает ``Photo`` и отправляет Max
150
+ полученный photo token.
151
+
144
152
  Через объект ``Chat`` можно менять настройки и перевыпускать invite-ссылку:
145
153
 
146
154
  .. code-block:: python
@@ -7,9 +7,9 @@ Client
7
7
  ``Client`` и ``WebClient`` - главные объекты библиотеки. Они держат соединение,
8
8
  авторизацию, локальную сессию, кеш профиля/чатов и методы для API Max.
9
9
 
10
- ``Client`` не является обычным HTTP-wrapper-ом на один запрос. После
11
- ``await client.start()`` он остается подключенным, слушает события Max,
12
- отвечает на ping и вызывает ваши handler-ы.
10
+ ``Client`` не является обычным HTTP-wrapper-ом на один запрос. После запуска
11
+ он остается подключенным, слушает события Max, отвечает на ping и вызывает
12
+ ваши handler-ы.
13
13
 
14
14
  Как выбрать клиента
15
15
  -------------------
@@ -27,12 +27,32 @@ Client
27
27
 
28
28
  1. Вы создаете ``Client`` или ``WebClient``.
29
29
  2. Регистрируете handler-ы и подключаете роутеры.
30
- 3. Вызываете ``await client.start()``.
30
+ 3. Вызываете ``await client.start()`` или ``await client.connect()``.
31
31
  4. PyMax открывает соединение, делает handshake и login.
32
32
  5. После login доступны ``client.me`` и ``client.chats``.
33
33
  6. Вызывается ``on_start``.
34
34
  7. Клиент слушает события до закрытия соединения или отмены задачи.
35
35
 
36
+ ``start()`` - long-running режим с автоматическим reconnect. Метод не
37
+ возвращается, пока соединение не закрыто штатно или задача не отменена.
38
+
39
+ ``connect()`` выполняет один цикл подключения и login, запускает
40
+ ``on_start``-обработчики и возвращается, оставляя соединение открытым.
41
+ Обработчики выполняются в отдельных задачах: возврат из ``connect()`` не
42
+ означает, что они уже завершились. Приложение само выполняет работу и затем
43
+ вызывает ``stop()`` или ``close()``; reconnect loop этот метод не запускает.
44
+
45
+ .. code-block:: python
46
+
47
+ await client.connect()
48
+ try:
49
+ await client.send_message(chat_id=123456, text="Готово")
50
+ finally:
51
+ await client.close()
52
+
53
+ После успешного запуска состояние соединения доступно через
54
+ ``client.is_connected``.
55
+
36
56
  Если ``start()`` запущен отдельной задачей, ``stop()`` штатно закрывает
37
57
  соединение и завершает эту задачу без ``CancelledError``:
38
58
 
@@ -51,7 +71,7 @@ Client
51
71
  После успешного login клиент хранит несколько кешей, которые пришли от Max:
52
72
 
53
73
  ``client.me``
54
- Профиль текущего аккаунта или ``None``, если login еще не завершился.
74
+ Профиль текущего аккаунта.
55
75
 
56
76
  ``client.chats``
57
77
  Чаты из login/sync. Это не гарантированно полный список всех чатов.
@@ -106,7 +126,46 @@ Client
106
126
  Имя файла сессии внутри ``work_dir``.
107
127
 
108
128
  ``extra_config``
109
- Настройки соединения, логов, reconnect, token, device/user-agent и sync.
129
+ Настройки соединения, логов, reconnect, token, хранения сессии,
130
+ device/user-agent и sync.
131
+
132
+ ``app_version``
133
+ Версия Android-клиента, которую ``Client`` использует для user-agent и
134
+ fingerprint. По умолчанию - версия, возвращаемая
135
+ ``VersionCatalog.recommended()``.
136
+
137
+ ``catalog``
138
+ Каталог fingerprints для ``app_version``. По умолчанию используется
139
+ встроенный каталог.
140
+
141
+ Версия mobile-клиента
142
+ ---------------------
143
+
144
+ ``Client`` связывает выбранную ``app_version`` с соответствующими build number
145
+ и fingerprint. Разрешение версии происходит при ``connect()`` или ``start()``,
146
+ а не при создании объекта клиента.
147
+
148
+ .. code-block:: python
149
+
150
+ from pymax import Client
151
+ from pymax.versions import VersionCatalog
152
+
153
+ client = Client(
154
+ phone="+79990000000",
155
+ app_version="26.28.0",
156
+ catalog=VersionCatalog(remote=True),
157
+ )
158
+
159
+ Обычный ``VersionCatalog()`` использует только данные, поставляемые вместе с
160
+ PyMax. При ``remote=True`` метод ``load()`` загружает свежий каталог с
161
+ ``hashes.pymax.org`` и добавляет его записи поверх встроенных. Сетевые,
162
+ HTTP- и validation-ошибки удаленного каталога не скрываются и возникают во
163
+ время ``connect()``/``start()``.
164
+
165
+ Если выбранной версии нет в итоговом каталоге, PyMax выбрасывает
166
+ ``VersionNotFoundError``. Пользовательский ``ExtraConfig.user_agent`` не
167
+ отменяет проверку ``app_version``: fingerprint для версии всё равно должен
168
+ существовать.
110
169
 
111
170
  Тип устройства
112
171
  ---------------
@@ -209,6 +268,8 @@ Client
209
268
  qr_provider=ConfirmQrWithClient(mobile_client),
210
269
  )
211
270
 
271
+ .. _client-session-guide:
272
+
212
273
  Сессия и sync-state
213
274
  -------------------
214
275
 
@@ -218,6 +279,7 @@ Client
218
279
  * ``device_id``;
219
280
  * телефон;
220
281
  * ``mt_instance_id``;
282
+ * device/user-agent;
221
283
  * sync-маркеры ``chats_sync``, ``contacts_sync``, ``drafts_sync``,
222
284
  ``presence_sync`` и ``config_hash``.
223
285
 
@@ -225,11 +287,49 @@ Client
225
287
  ``session_name="account.db"`` это будет ``cache/account.db``. Если файл удалить,
226
288
  PyMax потеряет token и попросит авторизацию снова.
227
289
 
290
+ Для автоматически создаваемого user-agent PyMax восстанавливает из сессии
291
+ модель устройства, версию ОС, экран, locale и timezone. ``app_version`` и build
292
+ number всегда берутся из конфигурации текущего запуска, поэтому смена версии
293
+ клиента не сбрасывает сохраненный профиль устройства. Явный
294
+ ``ExtraConfig.user_agent`` имеет приоритет и заменяет значение из сессии.
295
+
296
+ Старый SQLite-файл обновляется автоматически: PyMax добавляет nullable-колонку
297
+ ``user_agent`` и при первом успешном login сохраняет в нее текущий payload.
298
+
228
299
  При login PyMax отправляет сохраненные маркеры серверу. Если маркер актуален,
229
300
  сервер может вернуть только изменения. Поэтому повторный запуск отличается от
230
301
  первого: первый запуск обычно использует ``-1`` и получает начальный sync,
231
302
  а последующие запуски продолжают с сохраненного состояния.
232
303
 
304
+ Пользовательский ``StoreProtocol`` может возвращать
305
+ ``SessionInfo.user_agent=None`` для совместимости, но тогда профиль устройства
306
+ не сохраняется между запусками. Чтобы получить стандартное поведение, храните и
307
+ возвращайте это необязательное поле вместе с остальными данными сессии.
308
+
309
+ Сессия только в памяти
310
+ ----------------------
311
+
312
+ Чтобы не создавать и не обновлять SQLite-файл, передайте
313
+ ``persist_session=False``:
314
+
315
+ .. code-block:: python
316
+
317
+ from pymax import Client, ExtraConfig
318
+
319
+ client = Client(
320
+ phone="+79990000000",
321
+ extra_config=ExtraConfig(
322
+ persist_session=False,
323
+ reconnect=False,
324
+ ),
325
+ )
326
+
327
+ В этом режиме PyMax использует отдельный ``InMemoryStore``. Переданный
328
+ ``ExtraConfig.store`` игнорируется. Сессия доступна только текущему runtime и
329
+ теряется при его пересоздании; reconnect без ``ExtraConfig.token`` поэтому снова
330
+ запускает SMS- или QR-авторизацию. Если автоматический reconnect в таком режиме
331
+ не нужен, отключите его как в примере.
332
+
233
333
  Принудительный sync
234
334
  -------------------
235
335
 
@@ -262,7 +362,7 @@ PyMax потеряет token и попросит авторизацию снов
262
362
 
263
363
  await client.relogin()
264
364
 
265
- ``relogin()`` удаляет загруженную сессию из store, закрывает текущий runtime и
365
+ ``relogin()`` удаляет загруженную локальную сессию, закрывает соединение и
266
366
  по умолчанию сразу запускает клиента снова. Если token был передан через
267
367
  ``ExtraConfig(token=...)``, он тоже сбрасывается; это можно отключить через
268
368
  ``drop_config_token=False``.
@@ -271,12 +371,17 @@ Reconnect
271
371
  ---------
272
372
 
273
373
  По умолчанию reconnect включен. Если соединение падает из-за сетевой ошибки,
274
- клиент закрывает текущий runtime, ждет ``reconnect_delay`` секунд, заново
275
- создает соединение и app, затем снова выполняет start/login.
374
+ ``start()`` закрывает соединение, ждет ``reconnect_delay`` секунд и повторяет
375
+ подключение с login.
376
+
377
+ Регистрации обработчиков и middleware, а также данные FSM в памяти
378
+ сохраняются при reconnect того же клиента. ``on_start`` вызывается после
379
+ каждого успешного подключения. Завершение процесса очищает FSM в памяти.
276
380
 
277
- Роутеры после reconnect не теряются: корневой ``Router`` хранится на клиенте,
278
- а новый ``App`` снова получает тот же root router. ``on_start`` вызывается
279
- после каждого успешного reconnect.
381
+ Если сервер отозвал login token, ``ExtraConfig(relogin=True)`` по умолчанию
382
+ сбрасывает текущую сессию и запускает авторизацию заново. Значение ``False``
383
+ отключает этот автоматический сброс. Если новый token тоже отклонен, ошибка
384
+ передается вызывающему коду без повторного автоматического запроса авторизации.
280
385
 
281
386
  Перед повторным подключением можно зарегистрировать ``on_disconnect``:
282
387
 
@@ -325,6 +430,14 @@ Debug-логи показывают handshake, login, входящие собы
325
430
  ``delete_message()``, ``pin_message()``, ``read_message()``, реакции и
326
431
  получение URL для входящих файлов/видео.
327
432
 
433
+ Комментарии
434
+ ``send_comment()``, ``fetch_comments()``, редактирование, удаление,
435
+ реакции и подписка на ветку поста. Подробнее: :doc:`messages`.
436
+
437
+ Сторис
438
+ ``send_story()``, ``get_stories_feed()``, ``get_stories()``, просмотр,
439
+ реакции и подробная статистика. Подробнее: :doc:`stories`.
440
+
328
441
  Чаты
329
442
  ``get_chat()``, ``fetch_chats()``, создание групп, invite-ссылки,
330
443
  участники, назначение администраторов, настройки групп, удаление чатов и