maxapi-python 2.4.1__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 (309) hide show
  1. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/PKG-INFO +17 -9
  2. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/README.md +14 -8
  3. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/TODO.md +7 -6
  4. maxapi_python-2.5.0/docs/api/router.rst +41 -0
  5. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/client.rst +21 -11
  6. maxapi_python-2.5.0/docs/di.rst +144 -0
  7. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/examples.rst +5 -12
  8. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/faq.rst +2 -0
  9. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/files.rst +9 -0
  10. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/formatting.rst +10 -1
  11. maxapi_python-2.5.0/docs/fsm.rst +160 -0
  12. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/getting-started.rst +10 -5
  13. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/index.rst +4 -0
  14. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/messages.rst +101 -8
  15. maxapi_python-2.5.0/docs/release-2-5-0.rst +181 -0
  16. maxapi_python-2.5.0/docs/router.rst +391 -0
  17. maxapi_python-2.5.0/docs/stories.rst +203 -0
  18. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/troubleshooting.rst +4 -3
  19. maxapi_python-2.5.0/docs/types/callback_response.rst +9 -0
  20. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/index.rst +8 -0
  21. maxapi_python-2.5.0/docs/types/story.rst +62 -0
  22. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/pyproject.toml +5 -1
  23. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/__init__.py +5 -1
  24. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/_data/apk_fingerprints.json +272 -0
  25. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/service.py +1 -0
  26. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/types.py +3 -0
  27. maxapi_python-2.5.0/src/pymax/api/bots/payloads.py +15 -0
  28. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/bots/service.py +13 -1
  29. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/enums.py +1 -0
  30. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/payloads.py +19 -0
  31. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/service.py +34 -0
  32. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/facade.py +2 -0
  33. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/enums.py +1 -0
  34. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/payloads.py +47 -1
  35. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/service.py +308 -24
  36. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/response.py +1 -1
  37. maxapi_python-2.5.0/src/pymax/api/stories/__init__.py +2 -0
  38. maxapi_python-2.5.0/src/pymax/api/stories/enums.py +19 -0
  39. maxapi_python-2.5.0/src/pymax/api/stories/payloads.py +64 -0
  40. maxapi_python-2.5.0/src/pymax/api/stories/service.py +198 -0
  41. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/payloads.py +10 -1
  42. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/service.py +94 -7
  43. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/app.py +16 -4
  44. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/qr.py +11 -1
  45. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/base.py +70 -25
  46. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/client.py +0 -1
  47. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/config.py +38 -32
  48. maxapi_python-2.5.0/src/pymax/di/__init__.py +2 -0
  49. maxapi_python-2.5.0/src/pymax/di/context.py +18 -0
  50. maxapi_python-2.5.0/src/pymax/di/resolver.py +38 -0
  51. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/__init__.py +7 -0
  52. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/dispatcher.py +143 -40
  53. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/enums.py +1 -0
  54. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/mapping.py +23 -3
  55. maxapi_python-2.5.0/src/pymax/dispatch/middleware.py +32 -0
  56. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/resolvers.py +4 -0
  57. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/router.py +86 -34
  58. maxapi_python-2.5.0/src/pymax/filters/__init__.py +15 -0
  59. maxapi_python-2.5.0/src/pymax/filters/base.py +218 -0
  60. maxapi_python-2.5.0/src/pymax/filters/containers/__init__.py +2 -0
  61. maxapi_python-2.5.0/src/pymax/filters/containers/chat.py +240 -0
  62. maxapi_python-2.5.0/src/pymax/filters/containers/message.py +147 -0
  63. maxapi_python-2.5.0/src/pymax/filters/filters.py +211 -0
  64. maxapi_python-2.5.0/src/pymax/filters/magic.py +13 -0
  65. maxapi_python-2.5.0/src/pymax/filters/presets.py +88 -0
  66. maxapi_python-2.5.0/src/pymax/filters/refs.py +56 -0
  67. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/formatting/markdown.py +55 -1
  68. maxapi_python-2.5.0/src/pymax/fsm/__init__.py +3 -0
  69. maxapi_python-2.5.0/src/pymax/fsm/context.py +30 -0
  70. maxapi_python-2.5.0/src/pymax/fsm/protocol.py +14 -0
  71. maxapi_python-2.5.0/src/pymax/fsm/state.py +70 -0
  72. maxapi_python-2.5.0/src/pymax/fsm/storage.py +151 -0
  73. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/base.py +2 -0
  74. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/bots.py +20 -0
  75. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/chat.py +28 -0
  76. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/message.py +195 -6
  77. maxapi_python-2.5.0/src/pymax/infra/stories.py +205 -0
  78. maxapi_python-2.5.0/src/pymax/integrations/dishka.py +109 -0
  79. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/enums.py +2 -0
  80. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/payload.py +0 -2
  81. maxapi_python-2.5.0/src/pymax/transport/__init__.py +0 -0
  82. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/__init__.py +23 -1
  83. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/__init__.py +1 -1
  84. maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/__init__.py +1 -0
  85. maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/enums.py +12 -0
  86. maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/inline.py +90 -0
  87. maxapi_python-2.5.0/src/pymax/types/domain/callback.py +19 -0
  88. maxapi_python-2.5.0/src/pymax/types/domain/comment.py +24 -0
  89. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/message.py +91 -22
  90. maxapi_python-2.5.0/src/pymax/types/domain/story.py +126 -0
  91. maxapi_python-2.5.0/src/pymax/types/events/reaction.py +45 -0
  92. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/versions/catalog.py +1 -1
  93. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_message_service.py +0 -5
  94. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/app/test_app_runtime.py +7 -1
  95. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/conftest.py +2 -0
  96. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/dispatch/test_dispatcher.py +33 -7
  97. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/files/test_files_and_formatting.py +35 -0
  98. maxapi_python-2.5.0/tests/filters/test_magic.py +145 -0
  99. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/uv.lock +18 -2
  100. maxapi_python-2.4.1/docs/api/router.rst +0 -16
  101. maxapi_python-2.4.1/docs/router.rst +0 -247
  102. maxapi_python-2.4.1/src/pymax/api/bots/payloads.py +0 -7
  103. maxapi_python-2.4.1/src/pymax/types/domain/attachments/keyboards/__init__.py +0 -1
  104. maxapi_python-2.4.1/src/pymax/types/domain/attachments/keyboards/inline.py +0 -19
  105. maxapi_python-2.4.1/src/pymax/types/events/reaction.py +0 -21
  106. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  107. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  108. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
  109. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/pull_request_template.md +0 -0
  110. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/workflows/publish.yml +0 -0
  111. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/workflows/tests.yml +0 -0
  112. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.gitignore +0 -0
  113. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.pre-commit-config.yaml +0 -0
  114. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/LICENSE +0 -0
  115. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/_static/.gitkeep +0 -0
  116. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/account.rst +0 -0
  117. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/auth.rst +0 -0
  118. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-client.rst +0 -0
  119. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-config.rst +0 -0
  120. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-session.rst +0 -0
  121. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-versions.rst +0 -0
  122. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-web.rst +0 -0
  123. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client.rst +0 -0
  124. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/files.rst +0 -0
  125. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/auth.rst +0 -0
  126. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/chats.rst +0 -0
  127. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/conf.py +0 -0
  128. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-0.rst +0 -0
  129. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-1.rst +0 -0
  130. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-2.rst +0 -0
  131. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-3.rst +0 -0
  132. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-2-0.rst +0 -0
  133. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-3-0.rst +0 -0
  134. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-3-1.rst +0 -0
  135. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-4-0.rst +0 -0
  136. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-4-1.rst +0 -0
  137. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/audio_attachment.rst +0 -0
  138. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/call_attachment.rst +0 -0
  139. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/chat.rst +0 -0
  140. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/contact_attachment.rst +0 -0
  141. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/contact_info.rst +0 -0
  142. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/control_attachment.rst +0 -0
  143. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/element.rst +0 -0
  144. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/enums.rst +0 -0
  145. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/file_attachment.rst +0 -0
  146. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/folder.rst +0 -0
  147. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/folder_list.rst +0 -0
  148. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/folder_update.rst +0 -0
  149. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/inline_keyboard_attachment.rst +0 -0
  150. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/message.rst +0 -0
  151. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/message_delete_event.rst +0 -0
  152. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/message_read_event.rst +0 -0
  153. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/name.rst +0 -0
  154. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/photo_attachment.rst +0 -0
  155. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/poll.rst +0 -0
  156. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/poll_attachment.rst +0 -0
  157. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/presence_event.rst +0 -0
  158. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/profile.rst +0 -0
  159. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/reaction_counter.rst +0 -0
  160. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/reaction_info.rst +0 -0
  161. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/reaction_update_event.rst +0 -0
  162. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/read_state.rst +0 -0
  163. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/session.rst +0 -0
  164. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/share_attachment.rst +0 -0
  165. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/sticker_attachment.rst +0 -0
  166. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/sync_overrides.rst +0 -0
  167. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/sync_state.rst +0 -0
  168. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/typing_event.rst +0 -0
  169. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/user.rst +0 -0
  170. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/video_attachment.rst +0 -0
  171. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/users.rst +0 -0
  172. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/scripts/todo.py +0 -0
  173. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/_data/rootca_ssl_rsa2022.crt +0 -0
  174. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/__init__.py +0 -0
  175. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/__init__.py +0 -0
  176. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/enums.py +0 -0
  177. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/payloads.py +0 -0
  178. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/binding.py +0 -0
  179. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/bots/__init__.py +0 -0
  180. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/__init__.py +0 -0
  181. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/__init__.py +0 -0
  182. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/models.py +0 -0
  183. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/__init__.py +0 -0
  184. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/enums.py +0 -0
  185. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/payloads.py +0 -0
  186. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/service.py +0 -0
  187. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/__init__.py +0 -0
  188. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/enums.py +0 -0
  189. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/payloads.py +0 -0
  190. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/service.py +0 -0
  191. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/__init__.py +0 -0
  192. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/models.py +0 -0
  193. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/__init__.py +0 -0
  194. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/enums.py +0 -0
  195. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/payloads.py +0 -0
  196. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/service.py +0 -0
  197. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/__init__.py +0 -0
  198. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/base.py +0 -0
  199. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/email.py +0 -0
  200. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/exceptions.py +0 -0
  201. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/models.py +0 -0
  202. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/providers.py +0 -0
  203. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/service.py +0 -0
  204. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/sms.py +0 -0
  205. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/client_web.py +0 -0
  206. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/__init__.py +0 -0
  207. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/connection.py +0 -0
  208. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/pending.py +0 -0
  209. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/__init__.py +0 -0
  210. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/base.py +0 -0
  211. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/tcp.py +0 -0
  212. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/ws.py +0 -0
  213. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/exceptions.py +0 -0
  214. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/__init__.py +0 -0
  215. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/base.py +0 -0
  216. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/file.py +0 -0
  217. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/photo.py +0 -0
  218. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/static.py +0 -0
  219. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/video.py +0 -0
  220. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/voice.py +0 -0
  221. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/fingerprint/__init__.py +0 -0
  222. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/fingerprint/fingerprint.py +0 -0
  223. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/fingerprint/models.py +0 -0
  224. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/formatting/__init__.py +0 -0
  225. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/__init__.py +0 -0
  226. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/auth.py +0 -0
  227. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/protocol.py +0 -0
  228. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/self.py +0 -0
  229. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/user.py +0 -0
  230. {maxapi_python-2.4.1/src/pymax/transport → maxapi_python-2.5.0/src/pymax/integrations}/__init__.py +0 -0
  231. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/logging.py +0 -0
  232. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/__init__.py +0 -0
  233. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/base.py +0 -0
  234. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/models.py +0 -0
  235. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/__init__.py +0 -0
  236. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/compression.py +0 -0
  237. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/framing.py +0 -0
  238. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/protocol.py +0 -0
  239. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/ws/__init__.py +0 -0
  240. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/ws/protocol.py +0 -0
  241. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/py.typed +0 -0
  242. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/routers.py +0 -0
  243. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/__init__.py +0 -0
  244. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/models.py +0 -0
  245. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/protocol.py +0 -0
  246. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/store.py +0 -0
  247. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/__init__.py +0 -0
  248. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/navigation.py +0 -0
  249. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/payloads.py +0 -0
  250. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/service.py +0 -0
  251. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/transport/base.py +0 -0
  252. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/transport/tcp.py +0 -0
  253. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/transport/websocket.py +0 -0
  254. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/__init__.py +0 -0
  255. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/audio.py +0 -0
  256. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/call.py +0 -0
  257. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/contact.py +0 -0
  258. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/control.py +0 -0
  259. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/enums.py +0 -0
  260. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/file.py +0 -0
  261. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/photo.py +0 -0
  262. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/poll.py +0 -0
  263. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/share.py +0 -0
  264. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/sticker.py +0 -0
  265. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/unknown.py +0 -0
  266. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/video.py +0 -0
  267. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/auth.py +0 -0
  268. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/base.py +0 -0
  269. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/bots.py +0 -0
  270. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/chat.py +0 -0
  271. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/element.py +0 -0
  272. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/enums.py +0 -0
  273. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/error.py +0 -0
  274. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/folder.py +0 -0
  275. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/handshake.py +0 -0
  276. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/login.py +0 -0
  277. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/member.py +0 -0
  278. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/name.py +0 -0
  279. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/presence.py +0 -0
  280. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/profile.py +0 -0
  281. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/session.py +0 -0
  282. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/sync.py +0 -0
  283. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/user.py +0 -0
  284. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/__init__.py +0 -0
  285. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/file.py +0 -0
  286. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/mark.py +0 -0
  287. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/message.py +0 -0
  288. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/presence.py +0 -0
  289. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/typing.py +0 -0
  290. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/video.py +0 -0
  291. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/voice.py +0 -0
  292. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/versions/__init__.py +0 -0
  293. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/versions/exceptions.py +0 -0
  294. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/__init__.py +0 -0
  295. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_auth_service.py +0 -0
  296. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_chat_user_self_session_services.py +0 -0
  297. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_upload_service.py +0 -0
  298. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/app/test_client_user_agent_config.py +0 -0
  299. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/auth/test_auth_flows.py +0 -0
  300. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/connection/test_connection.py +0 -0
  301. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/connection/test_readers_and_transports.py +0 -0
  302. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_bound_models.py +0 -0
  303. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_login_models.py +0 -0
  304. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_message_models.py +0 -0
  305. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_user_models.py +0 -0
  306. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/protocol/test_protocols.py +0 -0
  307. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/session/test_store.py +0 -0
  308. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/telemetry/test_telemetry.py +0 -0
  309. {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/test_logging.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: maxapi-python
3
- Version: 2.4.1
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
@@ -62,8 +64,11 @@ WebSocket.
62
64
 
63
65
  - Авторизация по телефону и SMS-коду через `Client`.
64
66
  - QR-авторизация web-клиента через `WebClient`.
65
- - Роутеры, фильтры, `on_start`, raw-события и typed events.
67
+ - Роутеры, составные фильтры, middleware, `on_start`, raw-события и typed events.
68
+ - FSM для диалогов и необязательная интеграция с Dishka.
66
69
  - Сообщения: отправка и планирование, ответы, реакции, pin, read, delete и история.
70
+ - Комментарии к постам каналов и нажатия inline-кнопок ботов.
71
+ - Сторис: фото и видео, лента, реакции и статистика просмотров.
67
72
  - Чаты, группы, участники, invite-ссылки и настройки групп.
68
73
  - Пользователи, контакты, профиль, папки, активные сессии и 2FA.
69
74
  - Вложения: `Photo`, `File`, `Video`, `Voice`, `VideoNote`.
@@ -100,6 +105,7 @@ pip install git+https://github.com/MaxApiTeam/PyMax.git
100
105
  import asyncio
101
106
 
102
107
  from pymax import Client, Message
108
+ from pymax.filters import Command
103
109
 
104
110
  client = Client(
105
111
  phone="+79990000000",
@@ -114,7 +120,7 @@ async def on_start(client: Client) -> None:
114
120
  print("Ваш ID:", client.me.contact.id if client.me else "unknown")
115
121
 
116
122
 
117
- @client.on_message()
123
+ @client.on_message(Command("start"))
118
124
  async def on_message(message: Message, client: Client) -> None:
119
125
  print(message.chat_id, message.sender, message.text)
120
126
 
@@ -130,6 +136,8 @@ if __name__ == "__main__":
130
136
  asyncio.run(main())
131
137
  ```
132
138
 
139
+ Отправьте `/start`, чтобы вызвать обработчик.
140
+
133
141
  ## WebClient
134
142
 
135
143
  `WebClient` использует WebSocket и QR-авторизацию:
@@ -157,15 +165,12 @@ Handler всегда принимает событие и клиента: `(even
157
165
 
158
166
  ```python
159
167
  from pymax import Client, ClientRouter, Message
168
+ from pymax.filters import Command
160
169
 
161
170
  router = ClientRouter()
162
171
 
163
172
 
164
- def is_start(message: Message) -> bool:
165
- return message.text == "/start"
166
-
167
-
168
- @router.on_message(is_start)
173
+ @router.on_message(Command("start"))
169
174
  async def start(message: Message, client: Client) -> None:
170
175
  await message.answer("Готово")
171
176
 
@@ -178,8 +183,11 @@ client.include_router(router)
178
183
 
179
184
  - [Getting Started](docs/getting-started.rst) - первый запуск и сессии.
180
185
  - [Client](docs/client.rst) - жизненный цикл клиента, reconnect и sync-state.
181
- - [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) - зависимости обработчиков.
182
189
  - [Messages](docs/messages.rst) - сообщения, реакции, история и вложения.
190
+ - [Stories](docs/stories.rst) - публикация и чтение сторис.
183
191
  - [Files](docs/files.rst) - отправка и скачивание файлов.
184
192
  - [FAQ](docs/faq.rst) и [Troubleshooting](docs/troubleshooting.rst) - частые
185
193
  проблемы.
@@ -24,8 +24,11 @@ WebSocket.
24
24
 
25
25
  - Авторизация по телефону и SMS-коду через `Client`.
26
26
  - QR-авторизация web-клиента через `WebClient`.
27
- - Роутеры, фильтры, `on_start`, raw-события и typed events.
27
+ - Роутеры, составные фильтры, middleware, `on_start`, raw-события и typed events.
28
+ - FSM для диалогов и необязательная интеграция с Dishka.
28
29
  - Сообщения: отправка и планирование, ответы, реакции, pin, read, delete и история.
30
+ - Комментарии к постам каналов и нажатия inline-кнопок ботов.
31
+ - Сторис: фото и видео, лента, реакции и статистика просмотров.
29
32
  - Чаты, группы, участники, invite-ссылки и настройки групп.
30
33
  - Пользователи, контакты, профиль, папки, активные сессии и 2FA.
31
34
  - Вложения: `Photo`, `File`, `Video`, `Voice`, `VideoNote`.
@@ -62,6 +65,7 @@ pip install git+https://github.com/MaxApiTeam/PyMax.git
62
65
  import asyncio
63
66
 
64
67
  from pymax import Client, Message
68
+ from pymax.filters import Command
65
69
 
66
70
  client = Client(
67
71
  phone="+79990000000",
@@ -76,7 +80,7 @@ async def on_start(client: Client) -> None:
76
80
  print("Ваш ID:", client.me.contact.id if client.me else "unknown")
77
81
 
78
82
 
79
- @client.on_message()
83
+ @client.on_message(Command("start"))
80
84
  async def on_message(message: Message, client: Client) -> None:
81
85
  print(message.chat_id, message.sender, message.text)
82
86
 
@@ -92,6 +96,8 @@ if __name__ == "__main__":
92
96
  asyncio.run(main())
93
97
  ```
94
98
 
99
+ Отправьте `/start`, чтобы вызвать обработчик.
100
+
95
101
  ## WebClient
96
102
 
97
103
  `WebClient` использует WebSocket и QR-авторизацию:
@@ -119,15 +125,12 @@ Handler всегда принимает событие и клиента: `(even
119
125
 
120
126
  ```python
121
127
  from pymax import Client, ClientRouter, Message
128
+ from pymax.filters import Command
122
129
 
123
130
  router = ClientRouter()
124
131
 
125
132
 
126
- def is_start(message: Message) -> bool:
127
- return message.text == "/start"
128
-
129
-
130
- @router.on_message(is_start)
133
+ @router.on_message(Command("start"))
131
134
  async def start(message: Message, client: Client) -> None:
132
135
  await message.answer("Готово")
133
136
 
@@ -140,8 +143,11 @@ client.include_router(router)
140
143
 
141
144
  - [Getting Started](docs/getting-started.rst) - первый запуск и сессии.
142
145
  - [Client](docs/client.rst) - жизненный цикл клиента, reconnect и sync-state.
143
- - [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) - зависимости обработчиков.
144
149
  - [Messages](docs/messages.rst) - сообщения, реакции, история и вложения.
150
+ - [Stories](docs/stories.rst) - публикация и чтение сторис.
145
151
  - [Files](docs/files.rst) - отправка и скачивание файлов.
146
152
  - [FAQ](docs/faq.rst) и [Troubleshooting](docs/troubleshooting.rst) - частые
147
153
  проблемы.
@@ -28,17 +28,18 @@ Format:
28
28
  # Autogenerated TODO. Please, dont touch it
29
29
  - [ ] src/pymax/api/chats/payloads.py:100: ENUMM!!!
30
30
  - [ ] src/pymax/api/chats/payloads.py:123: ENUMM!!!
31
- - [ ] src/pymax/api/messages/payloads.py:32: enum?
32
- - [ ] src/pymax/api/messages/service.py:94: TypeAlias
31
+ - [ ] src/pymax/api/messages/payloads.py:40: enum?
32
+ - [ ] src/pymax/api/messages/service.py:137: TypeAlias
33
33
  - [ ] src/pymax/api/uploads/service.py:68: ENUM!!!!
34
- - [ ] src/pymax/api/uploads/service.py:286: Error handing (yes, with 200 status 💔)
34
+ - [ ] src/pymax/api/uploads/service.py:85: enum maybe?
35
+ - [ ] src/pymax/api/uploads/service.py:291: Error handing (yes, with 200 status 💔)
35
36
  - [ ] src/pymax/api/users/service.py:133: maybe also return phone mapping?
36
- - [ ] src/pymax/base.py:226: maybe impl it better way
37
37
  - [ ] src/pymax/config.py:52: delete maybe
38
- - [ ] src/pymax/dispatch/dispatcher.py:190: create iter_on_start_handlers
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
39
40
  - [ ] src/pymax/protocol/tcp/payload.py:34: deprecate? idk
40
41
  - [ ] src/pymax/transport/websocket.py:28: origin should be configurable
41
42
  - [ ] src/pymax/types/domain/attachments/video.py:70: idk maybe | None = None better
42
43
  - [ ] src/pymax/types/domain/user.py:14: move to another file
43
44
  - [ ] src/pymax/types/events/message.py:49: impl it in the better way maybe
44
- - [ ] src/pymax/versions/catalog.py:56: msg
45
+ - [ ] src/pymax/versions/catalog.py:88: msg
@@ -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
@@ -36,10 +36,11 @@ Client
36
36
  ``start()`` - long-running режим с автоматическим reconnect. Метод не
37
37
  возвращается, пока соединение не закрыто штатно или задача не отменена.
38
38
 
39
- ``connect()`` выполняет один цикл подключения, login и ``on_start``, после
40
- чего возвращается, оставляя соединение открытым. Он не запускает reconnect
41
- loop: приложение само выполняет работу и затем вызывает ``stop()`` или
42
- ``close()``.
39
+ ``connect()`` выполняет один цикл подключения и login, запускает
40
+ ``on_start``-обработчики и возвращается, оставляя соединение открытым.
41
+ Обработчики выполняются в отдельных задачах: возврат из ``connect()`` не
42
+ означает, что они уже завершились. Приложение само выполняет работу и затем
43
+ вызывает ``stop()`` или ``close()``; reconnect loop этот метод не запускает.
43
44
 
44
45
  .. code-block:: python
45
46
 
@@ -361,7 +362,7 @@ number всегда берутся из конфигурации текущег
361
362
 
362
363
  await client.relogin()
363
364
 
364
- ``relogin()`` удаляет загруженную сессию из store, закрывает текущий runtime и
365
+ ``relogin()`` удаляет загруженную локальную сессию, закрывает соединение и
365
366
  по умолчанию сразу запускает клиента снова. Если token был передан через
366
367
  ``ExtraConfig(token=...)``, он тоже сбрасывается; это можно отключить через
367
368
  ``drop_config_token=False``.
@@ -370,16 +371,17 @@ Reconnect
370
371
  ---------
371
372
 
372
373
  По умолчанию reconnect включен. Если соединение падает из-за сетевой ошибки,
373
- клиент закрывает текущий runtime, ждет ``reconnect_delay`` секунд, заново
374
- создает соединение и app, затем снова выполняет start/login.
374
+ ``start()`` закрывает соединение, ждет ``reconnect_delay`` секунд и повторяет
375
+ подключение с login.
375
376
 
376
- Роутеры после reconnect не теряются: корневой ``Router`` хранится на клиенте,
377
- а новый ``App`` снова получает тот же root router. ``on_start`` вызывается
378
- после каждого успешного reconnect.
377
+ Регистрации обработчиков и middleware, а также данные FSM в памяти
378
+ сохраняются при reconnect того же клиента. ``on_start`` вызывается после
379
+ каждого успешного подключения. Завершение процесса очищает FSM в памяти.
379
380
 
380
381
  Если сервер отозвал login token, ``ExtraConfig(relogin=True)`` по умолчанию
381
382
  сбрасывает текущую сессию и запускает авторизацию заново. Значение ``False``
382
- отключает этот автоматический сброс.
383
+ отключает этот автоматический сброс. Если новый token тоже отклонен, ошибка
384
+ передается вызывающему коду без повторного автоматического запроса авторизации.
383
385
 
384
386
  Перед повторным подключением можно зарегистрировать ``on_disconnect``:
385
387
 
@@ -428,6 +430,14 @@ Debug-логи показывают handshake, login, входящие собы
428
430
  ``delete_message()``, ``pin_message()``, ``read_message()``, реакции и
429
431
  получение URL для входящих файлов/видео.
430
432
 
433
+ Комментарии
434
+ ``send_comment()``, ``fetch_comments()``, редактирование, удаление,
435
+ реакции и подписка на ветку поста. Подробнее: :doc:`messages`.
436
+
437
+ Сторис
438
+ ``send_story()``, ``get_stories_feed()``, ``get_stories()``, просмотр,
439
+ реакции и подробная статистика. Подробнее: :doc:`stories`.
440
+
431
441
  Чаты
432
442
  ``get_chat()``, ``fetch_chats()``, создание групп, invite-ссылки,
433
443
  участники, назначение администраторов, настройки групп, удаление чатов и
@@ -0,0 +1,144 @@
1
+ Внедрение зависимостей
2
+ ======================
3
+
4
+ Встроенная передача ``FSMContext`` описана в разделе :doc:`fsm` и работает без
5
+ дополнительных пакетов. Для собственных сервисов и других зависимостей
6
+ можно подключить Dishka.
7
+
8
+ Установка
9
+ ---------
10
+
11
+ .. code-block:: bash
12
+
13
+ pip install -U 'maxapi-python[dishka]'
14
+
15
+ или через uv:
16
+
17
+ .. code-block:: bash
18
+
19
+ uv add 'maxapi-python[dishka]'
20
+
21
+ Подключение Dishka
22
+ ------------------
23
+
24
+ Создайте ``AsyncContainer`` и свяжите его с клиентом через
25
+ ``setup_dishka(container, client)``. Параметры, которые должен заполнить
26
+ контейнер, помечаются ``FromDishka[T]``. Событие и клиент остаются первыми
27
+ двумя аргументами обработчика.
28
+
29
+ .. code-block:: python
30
+
31
+ import asyncio
32
+
33
+ from dishka import FromDishka, Provider, Scope, make_async_container, provide
34
+
35
+ from pymax import Client, ClientRouter, Message
36
+ from pymax.filters import Command
37
+ from pymax.integrations.dishka import inject, setup_dishka
38
+
39
+
40
+ class GreetingService:
41
+ def text(self) -> str:
42
+ return "Привет от сервиса!"
43
+
44
+
45
+ class AppProvider(Provider):
46
+ @provide(scope=Scope.APP)
47
+ def greetings(self) -> GreetingService:
48
+ return GreetingService()
49
+
50
+
51
+ router = ClientRouter()
52
+
53
+
54
+ @router.on_message(Command("hello"))
55
+ @inject
56
+ async def hello(
57
+ message: Message,
58
+ client: Client,
59
+ greetings: FromDishka[GreetingService],
60
+ ) -> None:
61
+ await message.answer(greetings.text())
62
+
63
+
64
+ async def main() -> None:
65
+ container = make_async_container(AppProvider())
66
+ client = Client(phone="+79990000000", work_dir="cache")
67
+ client.include_router(router)
68
+ setup_dishka(container, client)
69
+
70
+ try:
71
+ await client.start()
72
+ finally:
73
+ await container.close()
74
+
75
+
76
+ if __name__ == "__main__":
77
+ asyncio.run(main())
78
+
79
+ ``@inject`` находится под ``@router.on_message(...)``: сначала создается
80
+ обертка Dishka, затем роутер регистрирует ее. Одна аннотация
81
+ ``GreetingService`` без ``FromDishka`` не включает внедрение зависимости.
82
+
83
+ В примере сервис имеет ``Scope.APP`` и повторно используется в пределах
84
+ созданного контейнера. Контейнер привязан к конкретному экземпляру клиента.
85
+ Если один роутер подключен к нескольким клиентам, вызовите ``setup_dishka``
86
+ для каждого из них с нужным контейнером.
87
+
88
+ Автоматическое оборачивание обработчиков
89
+ ----------------------------------------
90
+
91
+ Вместо ``@inject`` у каждого обработчика можно включить ``auto_inject``:
92
+
93
+ .. code-block:: python
94
+
95
+ client.include_router(router)
96
+ setup_dishka(container, client, auto_inject=True)
97
+
98
+ Сначала зарегистрируйте обработчики и подключите роутеры, затем вызовите
99
+ ``setup_dishka``. Интеграция обойдет текущее дерево роутеров клиента и обернет
100
+ уже зарегистрированные обработчики событий. Обработчики, у которых уже есть
101
+ ``@inject``, повторно не оборачиваются.
102
+
103
+ Если нужно обернуть только отдельный роутер и его детей, используйте
104
+ ``inject_router``:
105
+
106
+ .. code-block:: python
107
+
108
+ from pymax.integrations.dishka import inject_router
109
+
110
+ inject_router(router)
111
+
112
+ Этот вызов не заменяет ``setup_dishka``: контейнер по-прежнему нужно связать
113
+ с клиентом. Оба способа оборачивают только существующие регистрации; новые
114
+ обработчики и позже подключенные роутеры автоматически не обрабатываются.
115
+ Для них используйте ``@inject`` или повторите оборачивание после регистрации.
116
+
117
+ Автоматическое оборачивание относится к обработчикам событий, например
118
+ ``on_message`` и ``on_raw``. Оно не затрагивает ``on_start``, ``on_error``
119
+ и ``on_disconnect``.
120
+
121
+ Scope и завершение работы
122
+ -------------------------
123
+
124
+ Интеграция получает зависимости непосредственно из контейнера, переданного
125
+ в ``setup_dishka``. Отдельный ``Scope.REQUEST`` для каждого события не
126
+ открывается. При обычном контейнере со ``Scope.APP`` зависимости уровня
127
+ ``Scope.REQUEST`` автоматически недоступны.
128
+
129
+ PyMax также не добавляет ``Message``, ``Client`` или ``FSMContext`` в контекст
130
+ Dishka. Событие и клиент передаются самим PyMax, а ``FSMContext`` можно
131
+ добавить отдельным обязательным параметром с этой аннотацией.
132
+
133
+ Созданием, выбором scope и закрытием контейнера управляет приложение.
134
+ ``client.close()`` не закрывает контейнер Dishka. В примере это делает
135
+ ``await container.close()`` в ``finally`` после завершения работы клиента.
136
+
137
+ API reference
138
+ -------------
139
+
140
+ .. autofunction:: pymax.integrations.dishka.inject
141
+
142
+ .. autofunction:: pymax.integrations.dishka.inject_router
143
+
144
+ .. autofunction:: pymax.integrations.dishka.setup_dishka
@@ -9,11 +9,12 @@ Examples
9
9
  import asyncio
10
10
 
11
11
  from pymax import Client, Message
12
+ from pymax.filters import FromMe
12
13
 
13
14
  client = Client(phone="+79990000000", work_dir="cache")
14
15
 
15
16
 
16
- @client.on_message()
17
+ @client.on_message(~FromMe())
17
18
  async def echo(message: Message, client: Client) -> None:
18
19
  if message.chat_id is None or not message.text:
19
20
  return
@@ -28,26 +29,18 @@ Examples
28
29
 
29
30
  .. code-block:: python
30
31
 
31
- from collections.abc import Callable
32
-
33
32
  from pymax import Client, ClientRouter, Message
33
+ from pymax.filters import Command
34
34
 
35
35
  router = ClientRouter()
36
36
 
37
37
 
38
- def command(name: str) -> Callable[[Message], bool]:
39
- def filter_message(message: Message) -> bool:
40
- return message.text == f"/{name}"
41
-
42
- return filter_message
43
-
44
-
45
- @router.on_message(command("start"))
38
+ @router.on_message(Command("start"))
46
39
  async def start(message: Message, client: Client) -> None:
47
40
  await message.answer("Привет")
48
41
 
49
42
 
50
- @router.on_message(command("me"))
43
+ @router.on_message(Command("me"))
51
44
  async def me(message: Message, client: Client) -> None:
52
45
  if client.me:
53
46
  await message.answer(f"Ваш ID: {client.me.contact.id}")
@@ -26,6 +26,8 @@ FAQ
26
26
  ``@client.on_message()``;
27
27
  * handler принимает один аргумент вместо ``(event, client)``;
28
28
  * фильтр вернул ``False`` или упал с ошибкой;
29
+ * вместо экземпляра ``Filter`` передана обычная функция;
30
+ * более ранний обработчик этого роутера уже подошел под событие;
29
31
  * событие другого типа;
30
32
  * payload не прошел Pydantic-валидацию.
31
33
 
@@ -95,6 +95,15 @@ Files
95
95
  или другого аудиофайла в ``.ogg`` недостаточно: PyMax загружает исходные байты
96
96
  без перекодирования.
97
97
 
98
+ Пример подготовки Ogg/Opus из видео или аудиофайла:
99
+
100
+ .. code-block:: console
101
+
102
+ ffmpeg -i input.mp4 -vn -c:a libopus -ac 1 -ar 48000 -b:a 32k -f ogg voice.ogg
103
+
104
+ Команда создает монофайл Opus с частотой 48 кГц. PyMax загружает уже
105
+ подготовленный файл; FFmpeg не требуется во время отправки.
106
+
98
107
  ``VideoNote`` также не перекодирует видео. Для совместимости с официальным
99
108
  клиентом 26.21.1 рекомендуется следующий формат:
100
109
 
@@ -2,7 +2,8 @@ Text Formatting
2
2
  ===============
3
3
 
4
4
  PyMax поддерживает базовое Markdown-подобное форматирование при отправке
5
- сообщений. Форматирование применяется автоматически в ``send_message()``,
5
+ сообщений. Форматирование применяется автоматически при отправке и
6
+ редактировании сообщений и комментариев, в том числе через
6
7
  ``Message.answer()``, ``Message.reply()`` и ``Chat.answer()``: библиотека
7
8
  удаляет служебные маркеры из текста и передает Max список ``Element``.
8
9
 
@@ -67,6 +68,10 @@ PyMax поддерживает базовое Markdown-подобное форм
67
68
  Этот фрагмент будет отправлен как текст ``print("hello")`` с элементом
68
69
  ``CODE``.
69
70
 
71
+ Содержимое inline-кода и блоков кода передается буквально: звёздочки,
72
+ подчёркивания, ссылки, заголовки и цитаты внутри них не разбираются как
73
+ дополнительная разметка.
74
+
70
75
  Ограничения
71
76
  -----------
72
77
 
@@ -79,3 +84,7 @@ PyMax поддерживает базовое Markdown-подобное форм
79
84
 
80
85
  Экранирование служебных символов обратным слешем пока не обрабатывается.
81
86
 
87
+ Одиночное подчёркивание между буквами или цифрами сохраняется, поэтому
88
+ ``snake_case_name`` и URL с такими подчёркиваниями остаются целыми.
89
+ Для звёздочки это правило не действует: ``foo*bar*baz`` содержит выделение.
90
+