maxapi-python 2.4.0__py3-none-any.whl → 2.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. {maxapi_python-2.4.0.dist-info → maxapi_python-2.5.0.dist-info}/METADATA +22 -12
  2. maxapi_python-2.5.0.dist-info/RECORD +195 -0
  3. {maxapi_python-2.4.0.dist-info → maxapi_python-2.5.0.dist-info}/WHEEL +1 -1
  4. pymax/__init__.py +8 -2
  5. pymax/_data/apk_fingerprints.json +374 -17
  6. pymax/_data/rootca_ssl_rsa2022.crt +33 -0
  7. pymax/api/auth/service.py +15 -2
  8. pymax/api/auth/types.py +3 -0
  9. pymax/api/bots/payloads.py +8 -0
  10. pymax/api/bots/service.py +13 -1
  11. pymax/api/chats/enums.py +1 -0
  12. pymax/api/chats/payloads.py +21 -1
  13. pymax/api/chats/service.py +41 -0
  14. pymax/api/facade.py +2 -0
  15. pymax/api/messages/__init__.py +1 -1
  16. pymax/api/messages/enums.py +1 -0
  17. pymax/api/messages/payloads.py +56 -4
  18. pymax/api/messages/service.py +405 -27
  19. pymax/api/response.py +1 -1
  20. pymax/api/stories/__init__.py +2 -0
  21. pymax/api/stories/enums.py +19 -0
  22. pymax/api/stories/payloads.py +64 -0
  23. pymax/api/stories/service.py +198 -0
  24. pymax/api/uploads/payloads.py +42 -1
  25. pymax/api/uploads/service.py +171 -69
  26. pymax/app.py +39 -8
  27. pymax/auth/__init__.py +2 -0
  28. pymax/auth/exceptions.py +9 -0
  29. pymax/auth/providers.py +6 -2
  30. pymax/auth/qr.py +11 -1
  31. pymax/auth/sms.py +11 -1
  32. pymax/base.py +146 -27
  33. pymax/client.py +39 -11
  34. pymax/client_web.py +15 -12
  35. pymax/config.py +101 -53
  36. pymax/di/__init__.py +2 -0
  37. pymax/di/context.py +18 -0
  38. pymax/di/resolver.py +38 -0
  39. pymax/dispatch/__init__.py +7 -0
  40. pymax/dispatch/dispatcher.py +143 -40
  41. pymax/dispatch/enums.py +1 -0
  42. pymax/dispatch/mapping.py +23 -3
  43. pymax/dispatch/middleware.py +32 -0
  44. pymax/dispatch/resolvers.py +4 -0
  45. pymax/dispatch/router.py +86 -34
  46. pymax/files/base.py +58 -1
  47. pymax/files/video.py +32 -40
  48. pymax/files/voice.py +18 -4
  49. pymax/filters/__init__.py +15 -0
  50. pymax/filters/base.py +218 -0
  51. pymax/filters/containers/__init__.py +2 -0
  52. pymax/filters/containers/chat.py +240 -0
  53. pymax/filters/containers/message.py +147 -0
  54. pymax/filters/filters.py +211 -0
  55. pymax/filters/magic.py +13 -0
  56. pymax/filters/presets.py +88 -0
  57. pymax/filters/refs.py +56 -0
  58. pymax/fingerprint/fingerprint.py +5 -22
  59. pymax/fingerprint/models.py +1 -0
  60. pymax/formatting/markdown.py +55 -1
  61. pymax/fsm/__init__.py +3 -0
  62. pymax/fsm/context.py +30 -0
  63. pymax/fsm/protocol.py +14 -0
  64. pymax/fsm/state.py +70 -0
  65. pymax/fsm/storage.py +151 -0
  66. pymax/infra/base.py +2 -0
  67. pymax/infra/bots.py +20 -0
  68. pymax/infra/chat.py +37 -5
  69. pymax/infra/message.py +204 -9
  70. pymax/infra/protocol.py +5 -1
  71. pymax/infra/stories.py +205 -0
  72. pymax/integrations/__init__.py +0 -0
  73. pymax/integrations/dishka.py +109 -0
  74. pymax/protocol/enums.py +2 -0
  75. pymax/protocol/tcp/payload.py +0 -2
  76. pymax/session/__init__.py +1 -1
  77. pymax/session/models.py +30 -0
  78. pymax/session/protocol.py +33 -7
  79. pymax/session/store.py +73 -5
  80. pymax/transport/tcp.py +11 -3
  81. pymax/types/domain/__init__.py +23 -1
  82. pymax/types/domain/attachments/__init__.py +1 -1
  83. pymax/types/domain/attachments/call.py +7 -1
  84. pymax/types/domain/attachments/contact.py +3 -3
  85. pymax/types/domain/attachments/control.py +3 -0
  86. pymax/types/domain/attachments/enums.py +16 -0
  87. pymax/types/domain/attachments/keyboards/__init__.py +1 -1
  88. pymax/types/domain/attachments/keyboards/enums.py +12 -0
  89. pymax/types/domain/attachments/keyboards/inline.py +74 -3
  90. pymax/types/domain/attachments/video.py +3 -3
  91. pymax/types/domain/callback.py +19 -0
  92. pymax/types/domain/comment.py +24 -0
  93. pymax/types/domain/enums.py +7 -0
  94. pymax/types/domain/message.py +158 -9
  95. pymax/types/domain/story.py +126 -0
  96. pymax/types/events/reaction.py +28 -4
  97. pymax/versions/__init__.py +2 -0
  98. pymax/versions/catalog.py +104 -0
  99. pymax/versions/exceptions.py +10 -0
  100. maxapi_python-2.4.0.dist-info/RECORD +0 -161
  101. {maxapi_python-2.4.0.dist-info → maxapi_python-2.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,3 +1,7 @@
1
+ from typing import Any
2
+
3
+ from pydantic import model_validator
4
+
1
5
  from pymax.types.domain.base import CamelModel
2
6
  from pymax.types.domain.message import ReactionCounter
3
7
 
@@ -6,16 +10,36 @@ class ReactionUpdateEvent(CamelModel):
6
10
  """Событие обновления реакций сообщения.
7
11
 
8
12
  :ivar message_id: ID сообщения.
9
- :vartype message_id: str
13
+ :vartype message_id: int
10
14
  :ivar chat_id: ID чата.
11
15
  :vartype chat_id: int
12
- :ivar counters: Счетчики реакций по типам.
13
- :vartype counters: list[ReactionCounter]
16
+ :ivar counters: Счетчики реакций по типам, если Max их прислал.
17
+ :vartype counters: list[ReactionCounter] | None
14
18
  :ivar total_count: Общее количество реакций.
15
19
  :vartype total_count: int
20
+ :ivar your_reaction: Реакция текущего пользователя, если она есть.
21
+ :vartype your_reaction: str | None
16
22
  """
17
23
 
18
- message_id: str
24
+ message_id: int
19
25
  chat_id: int
20
26
  counters: list[ReactionCounter] | None = None
21
27
  total_count: int = 0
28
+ your_reaction: str | None = None
29
+
30
+ @model_validator(mode="before")
31
+ @classmethod
32
+ def _unwrap_reaction_info(cls, value: Any) -> Any:
33
+ if not isinstance(value, dict):
34
+ return value
35
+
36
+ reaction_info = value.get("reactionInfo")
37
+ if not isinstance(reaction_info, dict):
38
+ return value
39
+
40
+ data = value.copy()
41
+ for field in ("counters", "totalCount", "yourReaction"):
42
+ if field in reaction_info:
43
+ data[field] = reaction_info[field]
44
+
45
+ return data
@@ -0,0 +1,2 @@
1
+ from .catalog import VersionCatalog
2
+ from .exceptions import VersionNotFoundError
@@ -0,0 +1,104 @@
1
+ import json
2
+ from importlib import resources
3
+ from typing import Any
4
+
5
+ import aiohttp
6
+
7
+ from pymax.fingerprint.models import ApkBuildFingerprint
8
+
9
+ from .exceptions import VersionAlreadyExistsError, VersionNotFoundError
10
+
11
+
12
+ class VersionCatalog:
13
+ """Каталог fingerprints Android-клиента Max.
14
+
15
+ Встроенные версии загружаются при создании объекта. При ``remote=True``
16
+ вызов :meth:`load` дополнительно получает каталог с
17
+ ``DEFAULT_REMOTE_URL`` и объединяет его со встроенным. Ошибки сети, HTTP и
18
+ валидации удаленного ответа не подавляются.
19
+
20
+ Args:
21
+ remote: Загружать ли удаленные версии при :meth:`load`.
22
+ """
23
+
24
+ RECOMMENDED_APP_VERSION: str = "26.37.1"
25
+ DEFAULT_REMOTE_URL: str = "https://hashes.pymax.org/versions.json"
26
+
27
+ def __init__(self, remote: bool = False) -> None:
28
+ self.path = resources.files("pymax._data") / "apk_fingerprints.json"
29
+ self.remote = remote
30
+ self._data = self._load_fingerprints()
31
+ self.versions = self._convert_data()
32
+
33
+ @staticmethod
34
+ def recommended() -> str:
35
+ """Возвращает версию, используемую ``Client`` по умолчанию."""
36
+ return VersionCatalog.RECOMMENDED_APP_VERSION
37
+
38
+ async def load(self) -> "VersionCatalog":
39
+ """Загружает удаленные версии, если включен ``remote``.
40
+
41
+ Returns:
42
+ Этот же каталог с добавленными удаленными версиями.
43
+ """
44
+ if not self.remote:
45
+ return self
46
+
47
+ versions = await self._fetch()
48
+ self.versions.update(versions)
49
+
50
+ return self
51
+
52
+ def add(self, version: str, fingerprint: ApkBuildFingerprint, override: bool = False) -> None:
53
+ """Добавляет fingerprint версии в текущий каталог.
54
+
55
+ Args:
56
+ version: Строка версии Android-клиента.
57
+ fingerprint: Fingerprint и build number этой версии.
58
+ override: Заменить существующую запись. По умолчанию ``False``.
59
+
60
+ Raises:
61
+ ValueError: Если версия уже существует и ``override=False``.
62
+ """
63
+ if self.versions.get(version) is not None and override is False:
64
+ raise VersionAlreadyExistsError(version)
65
+
66
+ self.versions[version] = fingerprint
67
+
68
+ def resolve(self, version: str) -> ApkBuildFingerprint:
69
+ """Возвращает fingerprint версии.
70
+
71
+ Raises:
72
+ VersionNotFoundError: Если версии нет в каталоге.
73
+ """
74
+ try:
75
+ return self.versions[version]
76
+ except KeyError as e:
77
+ raise VersionNotFoundError(version) from e
78
+
79
+ async def _fetch(self) -> dict[str, ApkBuildFingerprint]:
80
+ async with (
81
+ aiohttp.ClientSession() as session,
82
+ session.get(self.DEFAULT_REMOTE_URL) as response,
83
+ ):
84
+ response.raise_for_status()
85
+ data = await response.json()
86
+
87
+ if not isinstance(data, dict):
88
+ raise ValueError # TODO: msg
89
+
90
+ versions: dict[str, ApkBuildFingerprint] = {}
91
+ for k, v in data.items():
92
+ versions[k] = ApkBuildFingerprint.model_validate(v)
93
+
94
+ return versions
95
+
96
+ def _load_fingerprints(self) -> dict[str, Any]:
97
+ with self.path.open("r", encoding="utf-8") as f:
98
+ return json.load(f)
99
+
100
+ def _convert_data(self) -> dict[str, ApkBuildFingerprint]:
101
+ versions: dict[str, ApkBuildFingerprint] = {}
102
+ for k, v in self._data.items():
103
+ versions[k] = ApkBuildFingerprint.model_validate(v)
104
+ return versions
@@ -0,0 +1,10 @@
1
+ class VersionNotFoundError(ValueError):
2
+ """Выбранная версия приложения отсутствует в каталоге fingerprints."""
3
+
4
+ def __init__(self, version: str) -> None:
5
+ super().__init__(f"Could not find version {version} in registry")
6
+
7
+
8
+ class VersionAlreadyExistsError(ValueError):
9
+ def __init__(self, version: str) -> None:
10
+ super().__init__(f"Version {version} already exists in registry")
@@ -1,161 +0,0 @@
1
- pymax/__init__.py,sha256=REPRjrZ-Nv-VcQfGeB9D-NdWq1fF2oODuu2tkvdJbQ4,1657
2
- pymax/app.py,sha256=78xYZ7PWVQNVTR6aEue1q-xzQBUtaCVoQl29Y4k7JAo,13021
3
- pymax/base.py,sha256=WTjHE5D1ZFor547FnmgOKpYu3o59xtytnW7jKB71hR8,10842
4
- pymax/client.py,sha256=ePDxR6wEeHJbk23wI_PkOVFQuyy5tQyckV-OmKEwz5U,3985
5
- pymax/client_web.py,sha256=lDpzNmkW2wgShddgEw5542KDy1_8R-H8POAoQLqmxHA,3028
6
- pymax/config.py,sha256=uPfgFZL9TfeblRrSZL2hJD_JTdzsYxUb2tIIekza3m4,11059
7
- pymax/exceptions.py,sha256=8pxjZsfgrMPrZfE3zedIbabqP75diEr2_6Xg3PGjiSQ,963
8
- pymax/logging.py,sha256=j2-7guTR8otCrSk0w7NL2y-d_gJoNUS5Fh9NtsdEgIg,4632
9
- pymax/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- pymax/routers.py,sha256=UvIEWcBF1VPBmUFrubBQ7uo3DZylf4qdbnQGDkUYjyE,225
11
- pymax/_data/apk_fingerprints.json,sha256=0CT99vB-0OmOmWWaz21Ampz6AyasC0fc8_KpKfvfW74,34882
12
- pymax/api/__init__.py,sha256=oWC09vGaP6S7_nnTJ4y5PbTkbA4U29DhafpwIqD2QGI,356
13
- pymax/api/binding.py,sha256=q63tSMxwh8cX28r2JwK3_TyxsV8zThflMaQiMb0vx8M,1613
14
- pymax/api/facade.py,sha256=WapwUPspVxA8JMYRvWGKtaKs9rUvIJLTMaXods6julo,899
15
- pymax/api/models.py,sha256=Vc0y9__za1aju3zgHW4aS6lMr1SyZi7q0lrQhfviFUA,344
16
- pymax/api/response.py,sha256=7rXgqtaGeDd60FGMxlLwqARzgFIawX8OkMqA9TL8HRE,2591
17
- pymax/api/auth/__init__.py,sha256=m6yw6RPrq10iNkSI8z59n3OXTnAw8VfxIALnhVztL2g,33
18
- pymax/api/auth/enums.py,sha256=m8zRS62894Szs-xyGIIvyGS51Fjq5ldp89kvxu_C3gg,681
19
- pymax/api/auth/payloads.py,sha256=TA5am-M5IIOE2CWENQ8NEIjoYYHzyZdahS24OPA3VnA,3888
20
- pymax/api/auth/service.py,sha256=W2xsh_gSYFs1DJmn9gz9Dv-5FmFYPjnswaBBcS8dRCY,15479
21
- pymax/api/auth/types.py,sha256=VrYR7rIZOrW45yKnQmC5MSe9kxgXmqPzh9VG_y1tSEs,200
22
- pymax/api/bots/__init__.py,sha256=4P7rM-XeeDOElEktov1Vbfo8nzjJgmyA4_pQl4WvzRQ,33
23
- pymax/api/bots/payloads.py,sha256=aXriolCN_YvBvDZO_MPmD-fkrIVJIpVDXkOkOZVes_c,166
24
- pymax/api/bots/service.py,sha256=ziqVlQUMFHjQydMDFyWcQMIATboQTvIdGtJhf-AK9tA,847
25
- pymax/api/chats/__init__.py,sha256=P_T3sFrAL-8WCGEWaRGTjQfiOIdjJpp0PU5Pzh49Pp0,179
26
- pymax/api/chats/enums.py,sha256=WbJJ9C_SfCIFIWOjxg6KszhWFB5zQX-t_NTozLqeTJo,899
27
- pymax/api/chats/payloads.py,sha256=ae5DaSbNJGovticS4UNoUDtlOmlsqWVCtWM75ULbIQs,3241
28
- pymax/api/chats/service.py,sha256=75vqRYOJtoY2illLJrbv0kB0Xn3l_tNgNBhxdU5x3Dw,13172
29
- pymax/api/messages/__init__.py,sha256=fw_uF6tgSbkxvqaSVE65wU0KWsu47u1CtR0Y4BbD-K0,36
30
- pymax/api/messages/enums.py,sha256=tp5S2Q97a-FILcqpRhQiIRKdj0P_KSEBiCqWmb05dHs,368
31
- pymax/api/messages/payloads.py,sha256=VWJExhX8mxJL1wOm3IPXLtjer8Edhel91Ul5Zl2RWDs,2908
32
- pymax/api/messages/service.py,sha256=mFG79AAeq_EIJB98-HxkdY1ldmnmr0gPZ6ooAjfIyO4,14887
33
- pymax/api/self/__init__.py,sha256=f3c1icSKASVm2BKuDLzNmniJHokLk9d82GC3EfyJ5tc,138
34
- pymax/api/self/enums.py,sha256=5WUmdfyFVCaMIeiTngIa2X8pK7DBvkGtWgeopgWwkWI,393
35
- pymax/api/self/payloads.py,sha256=wVIaETW0MwY1cKbQsNZgyqPm6dGFM_q0ih-TuWWXD1s,2468
36
- pymax/api/self/service.py,sha256=tge8jTFruJRrZRNkP7HGbWR9ztIPBqGPkA8hh_Ww3Es,6089
37
- pymax/api/session/__init__.py,sha256=zo-rCKBVBsFK-810T-Le4VbAYKt109cQ6elf0UkgiNk,36
38
- pymax/api/session/enums.py,sha256=InBdwAu_filqW3rMfGrOkHgmFfqgB1ytjnCcxDq29xc,236
39
- pymax/api/session/payloads.py,sha256=KJBoP_XfL2lJbXvR3tzWf2WaLn73L2LiEuqP0cdJ6u0,2258
40
- pymax/api/session/service.py,sha256=h4WmKDHeO60VgjjZwdx2CFcrOEsx3k9CGqWfy7jICfk,2356
41
- pymax/api/uploads/__init__.py,sha256=E7INNsBeMStze2VWMADX4mrswsQeJb85C71sSuiOpv0,35
42
- pymax/api/uploads/models.py,sha256=c2Yunnl9nRkDZuItXGKlY0Oi5DjnB4f5bcruQ49ARZk,934
43
- pymax/api/uploads/payloads.py,sha256=kQX6WHPVQXAoZGI0Xq7dpbzF6-APUPrqG14AkaoFtGk,818
44
- pymax/api/uploads/service.py,sha256=KCkDPohMbwYXJoWsOSK5kxeSjq2YMAniOCDekvOaWeo,26374
45
- pymax/api/users/__init__.py,sha256=CDakgSKwVAkX-kNoDmIo2JsFPsS7Nx3j2vIMwQnPRck,82
46
- pymax/api/users/enums.py,sha256=m3d225sjWkBIRF5NNi3ChnyZ6BgKUEbPYoYwVjpifZ4,205
47
- pymax/api/users/payloads.py,sha256=mWrbhu3KzrsxmBdRQU3bG8W46vtFq_Kdfb2YA7_QkNI,876
48
- pymax/api/users/service.py,sha256=ndYv60kKkqZPnFOgvfau2LAjgOf-NsLQ7P4xxoWBAr4,4663
49
- pymax/auth/__init__.py,sha256=KgghKg0CPcJzX_D14TvxuDzhNmoVoFGjv414NouJVgk,512
50
- pymax/auth/base.py,sha256=v492FMUmSKft6oJRmCdIr33sy50Z0kqBwu5t7cVLQe4,1222
51
- pymax/auth/email.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- pymax/auth/models.py,sha256=2SbjOJev1-B1bFEFM0NJPNX4wBTc4JbVDDouRHoAYc0,91
53
- pymax/auth/providers.py,sha256=B3EaS-iKxrZffcxiBKjoA1TsytwybHUunjZUtbjiiVE,4148
54
- pymax/auth/qr.py,sha256=Kkj5_2UEfdqgov76TIIdobCvJxltv8A1CPVunDlQa-w,4203
55
- pymax/auth/service.py,sha256=cUZxs5UW9ysSaJ-UXSOz0ug3fDo1eN0xAjO7VP1MdTU,619
56
- pymax/auth/sms.py,sha256=-Y9iW4kZmi2IMsH9pylNS96U-37Kj_1pkUab0xNmp9w,4909
57
- pymax/connection/__init__.py,sha256=YTboFk9AfYkRUw2Hf4oxn63LTGV475fxp_oel1j4gas,42
58
- pymax/connection/connection.py,sha256=4mLJ5eec43fRV09OSC5I4A2DO9Wxrl7TTcBBeYn7pDY,8268
59
- pymax/connection/pending.py,sha256=qezxL019d1E6oiCmSgCSfojLj7sxR1BEGgcKBWSFhok,1328
60
- pymax/connection/readers/__init__.py,sha256=9g5ZbcWiHxW1kAi2ckiNqejoGHwoDwFd4WvtYQSyRzU,52
61
- pymax/connection/readers/base.py,sha256=FlvyMUFoZ4FORAh0vBU6_I0BnrQ9_1twpUIKz-Vkj58,126
62
- pymax/connection/readers/tcp.py,sha256=62nqlllE0gjQQQYVfjBt0arAJ8tEHH_SMZOOjtXNYdw,1073
63
- pymax/connection/readers/ws.py,sha256=IjeH5CoXvBWde46tZLx6uKONkjhCU6NeC79x3Swfw8E,368
64
- pymax/dispatch/__init__.py,sha256=Big4ZqRSP4fzNAKc5mISkqQbWcYhjYMfg7UtHHCGZJw,376
65
- pymax/dispatch/dispatcher.py,sha256=xk_8ZbJRoRUOTPg5idlZPCAAZ_kOBbrrcT2LuI57SdE,11782
66
- pymax/dispatch/enums.py,sha256=JIoO6YIlv6j2M4x41mp-ovdoZpW7fu0PaGb_KkHVh8s,478
67
- pymax/dispatch/mapping.py,sha256=yQYFEK4Nn1CzpUat_bNx2CGYpL96wmfDwVMEe9abqZ8,3447
68
- pymax/dispatch/resolvers.py,sha256=jSwziNf0vA-38ZyEQr87ThzN1rJ1u1tgbEtaZdsNBKE,2203
69
- pymax/dispatch/router.py,sha256=0dwXCR7TgAGNiq9oryXIuyAsJ15DJ3OMt9hrRenUBio,10453
70
- pymax/files/__init__.py,sha256=BQB0iOnsyIBaVq77ii82T3Fu70oTlXGqAifen10zPhE,192
71
- pymax/files/base.py,sha256=0aksCGxmrvqEKJdhRWcuPZJfEn7RWcl5tn5gn63q1os,2689
72
- pymax/files/file.py,sha256=JSkuKx0fdGxzcsyMajWTosFzTlfgZYvQbh-RDp9OZyQ,2337
73
- pymax/files/photo.py,sha256=jvHihuyghDljY9PLh3ymJfoj5KksIRBWIK3z9Dmgjuk,3604
74
- pymax/files/static.py,sha256=U_KfM0rbGMEWcsBnWIhIXzzk46hHYQ7KJnrGnfDLoMs,142
75
- pymax/files/video.py,sha256=lwXFj0cFhb-yqqVvp1FaiAGMhV_tbnhE-h4hQE56G3o,3938
76
- pymax/files/voice.py,sha256=QmgEwOKUwyMvuV6n4jQEg8DWil22khXF6DQTDX5Ui-s,1166
77
- pymax/fingerprint/__init__.py,sha256=W5N5XEr45qdgt8hWUwQ8jc0USHZs12ZKtChhILOK3do,46
78
- pymax/fingerprint/fingerprint.py,sha256=DDQqKkeRhTDUfxw8v0PDE4wKNuXdzJHalYhzEskT5LE,1298
79
- pymax/fingerprint/models.py,sha256=ZSVGrwxah7qR8byEXOa4L73J8bDzPr_EaMzyn18xvPk,273
80
- pymax/formatting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- pymax/formatting/markdown.py,sha256=xHF2XEGjiyJHN7WUZI312a2EkBZRxw38e1y-QQ-8dr8,6637
82
- pymax/infra/__init__.py,sha256=lKq6cehhB87HltV53TD0kr0p7ekWlZlrKTpaYiq0XFw,28
83
- pymax/infra/auth.py,sha256=5Up9VVtq9ZV2AtUVK4FvlRhHmMlDjeQ29aPRq1HKQEI,3877
84
- pymax/infra/base.py,sha256=sOo40Qkp14bE6CxVKppJhy3e0F5VhFPhnL3iBs8y5dA,368
85
- pymax/infra/bots.py,sha256=6o0owuxZbWBg55W7fsuL4PQ9OqkGsMFvd6LU6RL12ds,1182
86
- pymax/infra/chat.py,sha256=gc5A6fWm4tgIF19J8-SCmoo_ffQ6UnsKWjK5-GmpF8U,15522
87
- pymax/infra/message.py,sha256=jp3uo-shce3JTQr0FtwQDDbsUqWL7eN-TX9q-vR_HvU,12687
88
- pymax/infra/protocol.py,sha256=I2WrAeAgATuNSdK2gvHU-MhhxdRBfSMGMovF5HPFsQw,208
89
- pymax/infra/self.py,sha256=QnZehUgm9-pCrw5seu4K_DhpdSlhvyOt1zU4yJ6Y2II,5907
90
- pymax/infra/user.py,sha256=wy6lElmJx7Ypjkk48kDrlLiL3V3p7pzO2MevsgCNy1k,4801
91
- pymax/protocol/__init__.py,sha256=rDn1Twi1iBDUk1155YI9jyeQyaGVDRuPoWdlaaLZnsw,242
92
- pymax/protocol/base.py,sha256=_bisk1BU_GSMSPIqfnizSCgm_qBrdbB5cJw6foAa2tc,294
93
- pymax/protocol/enums.py,sha256=MMZtY5bVob-EiDhDzLOeJ-ojXmbF3-LGwfxYevsr70o,4731
94
- pymax/protocol/models.py,sha256=kno-09OoPoLKBMixS9nrDkCbxcIwvU37RlZgaq5MfVo,584
95
- pymax/protocol/tcp/__init__.py,sha256=ivIZZ-UoT_MiRIUWTLiyeKSBOzf9XztSprHPHgoWNuI,34
96
- pymax/protocol/tcp/compression.py,sha256=JsW84MOjtUCJPxMfsfc4CX2bMH0D5sb_2mut189KHmU,3545
97
- pymax/protocol/tcp/framing.py,sha256=qH2zNsJLfg5J2wNTcp1hPqsrWhZHajK-Ja7pdB_Gji0,1630
98
- pymax/protocol/tcp/payload.py,sha256=zl34Xk0AB1nzZsvke4vo-7HcwnfwoP61typu7j0Q3JI,4857
99
- pymax/protocol/tcp/protocol.py,sha256=b5AAYQUOhq985Wc1pCPzt84pjGnVGfGxbdwRN0R91xk,2380
100
- pymax/protocol/ws/__init__.py,sha256=oQK0h28B6gGItf7eHanWy_XsgUA_L9Lclnuz9ZQL9YI,33
101
- pymax/protocol/ws/protocol.py,sha256=z6zzBQTlJfzwOmLsJYoYQ2L1AYpY5wYMJyPir_zfNBQ,913
102
- pymax/session/__init__.py,sha256=natjnLjPjTvkfvSYtoiPxzmU44XJi0MpjWiOPD-On4g,100
103
- pymax/session/models.py,sha256=jvnTHfjCX1p5TcANfWZ0vUJlciuqumatwdrgYiKm4kY,250
104
- pymax/session/protocol.py,sha256=8ibp-HiaJaGmx23v7GeL0GFsvLPZZqWOuIOJnanqoCM,612
105
- pymax/session/store.py,sha256=xzUpLuS8OpcYNB1lNvUwzOJIcsGz516_aOXBh2jIWT4,8087
106
- pymax/telemetry/__init__.py,sha256=6mP5y-iTbVIlqpSWIKWCTz2fFNBwkAEYwS4PFbyv9xM,71
107
- pymax/telemetry/navigation.py,sha256=vlP7d863s9aIBpt9SPpjEbTXLoq3uqpuhD-VWj0w9hI,5441
108
- pymax/telemetry/payloads.py,sha256=MCKYGpQ4Tvx_8LH86Et0yevea2Th2z3b7a9pfmrQRys,3959
109
- pymax/telemetry/service.py,sha256=rlFQAlMFnNZjw631bPHRSLWMkrIvyji47SYnGRJ0Apk,6952
110
- pymax/transport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- pymax/transport/base.py,sha256=0D3srQ36F0s23pIjqd6YzRGKK9wCmXKr3wfe2XYYlos,448
112
- pymax/transport/tcp.py,sha256=AVzSHkJK98lYFmPPIKEmR-3lNmgOwrOAihJOd7VEW3I,3323
113
- pymax/transport/websocket.py,sha256=_G9sxRqitahlhENF3XVB6yBo0wFWoXBRJn9KC7GEZso,1617
114
- pymax/types/__init__.py,sha256=y77mfDRgxmfcamobi0rj2d3PsxhH0zxyvKPhL2iUdS8,44
115
- pymax/types/domain/__init__.py,sha256=w3uzu6VF4ci-EYRHHH-Ksm9nk4Wm5LCPablKAndyAj8,553
116
- pymax/types/domain/auth.py,sha256=RmEXFS7TAgtFhnfXaiJH5XDb__2MUVgQ_Noavo9hFRY,6019
117
- pymax/types/domain/base.py,sha256=Q32PcKR3gtrISySowR3zPyl9KeQCoUL6lfyTR3ulMzo,623
118
- pymax/types/domain/bots.py,sha256=dErZZbvspznU6yUupzCs4R55pEWgoeps7NEhZFrb-Uo,333
119
- pymax/types/domain/chat.py,sha256=jIXCnzynlkGQMbrbvU2wtqHIkXqMwkAYI9U8Cd-iV-w,20502
120
- pymax/types/domain/element.py,sha256=Hks0MulMcPAhbpuUmJa5c2d9Emwy3garh1k6bd4QHKA,655
121
- pymax/types/domain/enums.py,sha256=eGMWnlv0mYJ8K-0FsC_wp4Co2M6YWyKI1Lx90MJ6s4g,412
122
- pymax/types/domain/error.py,sha256=WZoDAXf5vt8O4VYy7iEHLGBfH6hZQZ1fVkTz9rVCTN0,584
123
- pymax/types/domain/folder.py,sha256=Z9pXMzOTfxuhUfrJpLjl5LPnVXqqFsBVfKBQm4IbGWM,2225
124
- pymax/types/domain/handshake.py,sha256=9eOPYBJ3O4UAPNUfk7bPnZ3mwBtJw7kfhE8W4aK2k0U,417
125
- pymax/types/domain/login.py,sha256=LIw7b2aYqPWfRhCWrBU1zeCtDazJQwoWN3Cdz-WdS4w,2303
126
- pymax/types/domain/member.py,sha256=8gUNn4fBS_S2ap45A40lRlrDXYFMoq0Kx-dh57hMWQc,490
127
- pymax/types/domain/message.py,sha256=Nkfie2iZFhBjiYh-W9BQ0dxGEzHjNOWLPguAsyWaYFg,16398
128
- pymax/types/domain/name.py,sha256=qMIshIqgWkVuROxmiCRhwfJf8XtmhSBoEU6nXs_gEh0,523
129
- pymax/types/domain/presence.py,sha256=lKvkK0uYwY0gTSEEkaVdI-tEpWjxLOtH7gp2dy5Uh-0,534
130
- pymax/types/domain/profile.py,sha256=taN5PjlKp4EDypVhDx89vmBDpSKh-kT-ISpu1tR2cY8,471
131
- pymax/types/domain/session.py,sha256=T0b0qjI65kNQOCgx3nIkaIqynD4eGKyqnscbIlPFVnQ,2002
132
- pymax/types/domain/sync.py,sha256=lBDWo4ACLq2ov5XBccfnI8s_dsGEA7O4mIJVBSUpyrc,3248
133
- pymax/types/domain/user.py,sha256=Vj9HvSVQKKLJ1HX-OM9T1knvPNyCqrwJnWkz16ByeLg,5367
134
- pymax/types/domain/attachments/__init__.py,sha256=loACz_Tp9KWwQSjBwAski55eyRGpMurZ6mrpaVDrXo4,544
135
- pymax/types/domain/attachments/audio.py,sha256=I_Qq1qQ9bXsEzWwxEbQbkiY8CEjSKqGqinDFYY_5DY8,1117
136
- pymax/types/domain/attachments/call.py,sha256=RV-BFutymZFinzUiRdaIryqx6ubku2v6y6brc-qsHOQ,818
137
- pymax/types/domain/attachments/contact.py,sha256=EO-B0klgUMITL05fBgFXi99i8VzxBj3D2pLB0JBWy_M,996
138
- pymax/types/domain/attachments/control.py,sha256=1Zr0pM1ODZgYRX3CDw7yGzqEgb6R_JjRSQOSI_FDpDE,502
139
- pymax/types/domain/attachments/enums.py,sha256=pVA3_ejrUbdsTWVs5ckqH3Pis2lHK6CKbbUlqo-DIjQ,1228
140
- pymax/types/domain/attachments/file.py,sha256=3lqsPIkg75-AmcaEbXwc1eiQHIv9JpWzMc0z4u2MupE,1595
141
- pymax/types/domain/attachments/photo.py,sha256=8q79OuQ0V8t-s9pZM8ClAmgJI71m-bgES4Bd5ZSNVI0,1413
142
- pymax/types/domain/attachments/poll.py,sha256=-p3KJX_X6Nno8I3qA813-9pFkp8VFrLRgx7sL5Aauac,3569
143
- pymax/types/domain/attachments/share.py,sha256=BHJIVjTC99wfbUn8wSN4j0aSNlEpojzv87uwbmhPPt0,924
144
- pymax/types/domain/attachments/sticker.py,sha256=sJn13LuyF5u7Oy9HLGBIlXmdPjxAib0oy30TZz455vE,1544
145
- pymax/types/domain/attachments/unknown.py,sha256=oThuTVkzkdmpCftRoa42b1jyy-QbBbfgyc0ocX0jeS8,917
146
- pymax/types/domain/attachments/video.py,sha256=GO8wtuTTCNIVAfsSxRGT-M9KKhlsb5nDLWWX09bfjPg,3731
147
- pymax/types/domain/attachments/keyboards/__init__.py,sha256=1X5UGBe5E_DO7e4p8_JmJEocHLzXOezutieRuQsVpRA,45
148
- pymax/types/domain/attachments/keyboards/inline.py,sha256=3RNubcqx7RZ1f6zfJ7JaNFCPx5mnmJ5vYsL1i7lSMAM,577
149
- pymax/types/events/__init__.py,sha256=fvCPR_ZN-zRow3eeJ3hzDn2auWfnOxFFQ8GRTZTFfMA,294
150
- pymax/types/events/file.py,sha256=XhpXn0Vt9OODkx1OkGb9jfQwc1uNgz1NTn_j9FZnQ8s,102
151
- pymax/types/events/mark.py,sha256=5o3QP3VH9NJBVonBJNf88pzXkS9lLYaDFyju6yczAow,894
152
- pymax/types/events/message.py,sha256=o2ql3y1DzM-OKg72LR5dr4aCelGksBypIevTEmG-0K4,3249
153
- pymax/types/events/presence.py,sha256=77Cy352CdfIkbH6ZfLijHffF8gcMz-AZk5OCeESQeDY,451
154
- pymax/types/events/reaction.py,sha256=d-oA9czes9vQIO8jaEmdiUWIrE8Dea0jhHnCA5f9FO4,690
155
- pymax/types/events/typing.py,sha256=vDMgqYE0jz8dN2YfqsNaJLB8k7pMd6kaDEdR_KrLk5g,376
156
- pymax/types/events/video.py,sha256=swBHYadmDS0SjLXGqVqRYsuMoVZ6MjD2aYR2fbM-AJc,104
157
- pymax/types/events/voice.py,sha256=E4BjLBnqsu05s8ZxFN4I_B5OVaecoPvXI-826YJ_ze8,104
158
- maxapi_python-2.4.0.dist-info/METADATA,sha256=Ab1QeIiU0mPXYonfXA4fLB6WXL5piiJTqKdCtSSa4B8,7379
159
- maxapi_python-2.4.0.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
160
- maxapi_python-2.4.0.dist-info/licenses/LICENSE,sha256=hOR249ItqMdcly1A0amqEWRNRTq4Gv5NJtmQ3A5qK4E,1070
161
- maxapi_python-2.4.0.dist-info/RECORD,,