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.
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/PKG-INFO +17 -9
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/README.md +14 -8
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/TODO.md +7 -6
- maxapi_python-2.5.0/docs/api/router.rst +41 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/client.rst +21 -11
- maxapi_python-2.5.0/docs/di.rst +144 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/examples.rst +5 -12
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/faq.rst +2 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/files.rst +9 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/formatting.rst +10 -1
- maxapi_python-2.5.0/docs/fsm.rst +160 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/getting-started.rst +10 -5
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/index.rst +4 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/messages.rst +101 -8
- maxapi_python-2.5.0/docs/release-2-5-0.rst +181 -0
- maxapi_python-2.5.0/docs/router.rst +391 -0
- maxapi_python-2.5.0/docs/stories.rst +203 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/troubleshooting.rst +4 -3
- maxapi_python-2.5.0/docs/types/callback_response.rst +9 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/index.rst +8 -0
- maxapi_python-2.5.0/docs/types/story.rst +62 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/pyproject.toml +5 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/__init__.py +5 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/_data/apk_fingerprints.json +272 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/service.py +1 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/types.py +3 -0
- maxapi_python-2.5.0/src/pymax/api/bots/payloads.py +15 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/bots/service.py +13 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/enums.py +1 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/payloads.py +19 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/service.py +34 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/facade.py +2 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/enums.py +1 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/payloads.py +47 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/service.py +308 -24
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/response.py +1 -1
- maxapi_python-2.5.0/src/pymax/api/stories/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/api/stories/enums.py +19 -0
- maxapi_python-2.5.0/src/pymax/api/stories/payloads.py +64 -0
- maxapi_python-2.5.0/src/pymax/api/stories/service.py +198 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/payloads.py +10 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/service.py +94 -7
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/app.py +16 -4
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/qr.py +11 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/base.py +70 -25
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/client.py +0 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/config.py +38 -32
- maxapi_python-2.5.0/src/pymax/di/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/di/context.py +18 -0
- maxapi_python-2.5.0/src/pymax/di/resolver.py +38 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/__init__.py +7 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/dispatcher.py +143 -40
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/enums.py +1 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/mapping.py +23 -3
- maxapi_python-2.5.0/src/pymax/dispatch/middleware.py +32 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/resolvers.py +4 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/dispatch/router.py +86 -34
- maxapi_python-2.5.0/src/pymax/filters/__init__.py +15 -0
- maxapi_python-2.5.0/src/pymax/filters/base.py +218 -0
- maxapi_python-2.5.0/src/pymax/filters/containers/__init__.py +2 -0
- maxapi_python-2.5.0/src/pymax/filters/containers/chat.py +240 -0
- maxapi_python-2.5.0/src/pymax/filters/containers/message.py +147 -0
- maxapi_python-2.5.0/src/pymax/filters/filters.py +211 -0
- maxapi_python-2.5.0/src/pymax/filters/magic.py +13 -0
- maxapi_python-2.5.0/src/pymax/filters/presets.py +88 -0
- maxapi_python-2.5.0/src/pymax/filters/refs.py +56 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/formatting/markdown.py +55 -1
- maxapi_python-2.5.0/src/pymax/fsm/__init__.py +3 -0
- maxapi_python-2.5.0/src/pymax/fsm/context.py +30 -0
- maxapi_python-2.5.0/src/pymax/fsm/protocol.py +14 -0
- maxapi_python-2.5.0/src/pymax/fsm/state.py +70 -0
- maxapi_python-2.5.0/src/pymax/fsm/storage.py +151 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/base.py +2 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/bots.py +20 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/chat.py +28 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/message.py +195 -6
- maxapi_python-2.5.0/src/pymax/infra/stories.py +205 -0
- maxapi_python-2.5.0/src/pymax/integrations/dishka.py +109 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/enums.py +2 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/payload.py +0 -2
- maxapi_python-2.5.0/src/pymax/transport/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/__init__.py +23 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/__init__.py +1 -1
- maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/__init__.py +1 -0
- maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/enums.py +12 -0
- maxapi_python-2.5.0/src/pymax/types/domain/attachments/keyboards/inline.py +90 -0
- maxapi_python-2.5.0/src/pymax/types/domain/callback.py +19 -0
- maxapi_python-2.5.0/src/pymax/types/domain/comment.py +24 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/message.py +91 -22
- maxapi_python-2.5.0/src/pymax/types/domain/story.py +126 -0
- maxapi_python-2.5.0/src/pymax/types/events/reaction.py +45 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/versions/catalog.py +1 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_message_service.py +0 -5
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/app/test_app_runtime.py +7 -1
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/conftest.py +2 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/dispatch/test_dispatcher.py +33 -7
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/files/test_files_and_formatting.py +35 -0
- maxapi_python-2.5.0/tests/filters/test_magic.py +145 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/uv.lock +18 -2
- maxapi_python-2.4.1/docs/api/router.rst +0 -16
- maxapi_python-2.4.1/docs/router.rst +0 -247
- maxapi_python-2.4.1/src/pymax/api/bots/payloads.py +0 -7
- maxapi_python-2.4.1/src/pymax/types/domain/attachments/keyboards/__init__.py +0 -1
- maxapi_python-2.4.1/src/pymax/types/domain/attachments/keyboards/inline.py +0 -19
- maxapi_python-2.4.1/src/pymax/types/events/reaction.py +0 -21
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/ISSUE_TEMPLATE/refactor.md +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/pull_request_template.md +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/workflows/publish.yml +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.github/workflows/tests.yml +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.gitignore +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/.pre-commit-config.yaml +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/LICENSE +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/_static/.gitkeep +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/account.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/auth.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-client.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-config.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-session.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-versions.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client-web.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/client.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/api/files.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/auth.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/chats.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/conf.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-0.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-1.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-2.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-1-3.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-2-0.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-3-0.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-3-1.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-4-0.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/release-2-4-1.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/audio_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/call_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/chat.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/contact_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/contact_info.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/control_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/element.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/enums.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/file_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/folder.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/folder_list.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/folder_update.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/inline_keyboard_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/message.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/message_delete_event.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/message_read_event.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/name.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/photo_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/poll.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/poll_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/presence_event.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/profile.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/reaction_counter.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/reaction_info.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/reaction_update_event.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/read_state.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/session.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/share_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/sticker_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/sync_overrides.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/sync_state.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/typing_event.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/user.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/types/video_attachment.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/docs/users.rst +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/scripts/todo.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/_data/rootca_ssl_rsa2022.crt +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/enums.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/auth/payloads.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/binding.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/bots/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/chats/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/messages/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/enums.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/payloads.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/self/service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/enums.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/payloads.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/session/service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/uploads/models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/enums.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/payloads.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/api/users/service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/base.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/email.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/exceptions.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/providers.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/auth/sms.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/client_web.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/connection.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/pending.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/base.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/tcp.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/connection/readers/ws.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/exceptions.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/base.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/file.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/photo.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/static.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/video.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/files/voice.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/fingerprint/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/fingerprint/fingerprint.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/fingerprint/models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/formatting/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/auth.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/protocol.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/self.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/infra/user.py +0 -0
- {maxapi_python-2.4.1/src/pymax/transport → maxapi_python-2.5.0/src/pymax/integrations}/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/logging.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/base.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/compression.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/framing.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/tcp/protocol.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/ws/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/protocol/ws/protocol.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/py.typed +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/routers.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/protocol.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/session/store.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/navigation.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/payloads.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/telemetry/service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/transport/base.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/transport/tcp.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/transport/websocket.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/audio.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/call.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/contact.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/control.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/enums.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/file.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/photo.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/poll.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/share.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/sticker.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/unknown.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/attachments/video.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/auth.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/base.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/bots.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/chat.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/element.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/enums.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/error.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/folder.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/handshake.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/login.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/member.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/name.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/presence.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/profile.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/session.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/sync.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/domain/user.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/file.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/mark.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/message.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/presence.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/typing.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/video.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/types/events/voice.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/versions/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/src/pymax/versions/exceptions.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/__init__.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_auth_service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_chat_user_self_session_services.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/api/test_upload_service.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/app/test_client_user_agent_config.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/auth/test_auth_flows.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/connection/test_connection.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/connection/test_readers_and_transports.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_bound_models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_login_models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_message_models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/domain/test_user_models.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/protocol/test_protocols.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/session/test_store.py +0 -0
- {maxapi_python-2.4.1 → maxapi_python-2.5.0}/tests/telemetry/test_telemetry.py +0 -0
- {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.
|
|
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
|
-
|
|
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) - роутеры,
|
|
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
|
-
|
|
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) - роутеры,
|
|
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
|
-
- [ ] src/pymax/api/messages/service.py:
|
|
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:
|
|
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:
|
|
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:
|
|
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()`` выполняет один цикл
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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()`` удаляет загруженную
|
|
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
|
-
|
|
374
|
-
|
|
374
|
+
``start()`` закрывает соединение, ждет ``reconnect_delay`` секунд и повторяет
|
|
375
|
+
подключение с login.
|
|
375
376
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
сообщений. Форматирование применяется автоматически
|
|
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
|
+
|