Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 45 additions & 9 deletions src/pymax/mixins/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,48 @@
class AuthMixin(ClientProtocol):
def _check_phone(self) -> bool:
return bool(re.match(PHONE_REGEX, self.phone))

async def request_code(self, phone: str, language: str = "ru") -> str:

def _split_phone(self, phone: str) -> str:
placeholder = ""
result = ""
digit_index = 0
if phone.startswith("+7"):
result = "+7 "
placeholder = "000 000 00 00"
if phone.startswith("+375"):
result = "+375 "
placeholder = "00 000 00 00"
if phone.startswith("+994"):
result = "+994 "
placeholder = "00 000 00 00"
if phone.startswith("+374"):
result = "+374 "
placeholder = "00 000 000"
if phone.startswith("+995"):
result = "+995 "
placeholder = "000 00 00 00"
if phone.startswith("+996"):
result = "+996 "
placeholder = "000 000 000"
if phone.startswith("+373"):
result = "+373 "
placeholder = "0000 0000"
if phone.startswith("+992"):
result = "+992 "
placeholder = "00 000 0000"
if phone.startswith("+998"):
result = "+998 "
placeholder = "00 000 00 00"
phone = phone[len(result)-1:]
for char in placeholder:
if char == "0" and digit_index < len(phone):
result += phone[digit_index]
digit_index += 1
elif char == " ":
result += " "
return result

async def request_code(self, phone: str) -> str:
"""
Запрашивает код аутентификации для указанного номера телефона и возвращает временный токен.

Expand All @@ -39,8 +79,6 @@ async def request_code(self, phone: str, language: str = "ru") -> str:

:param phone: Номер телефона в международном формате.
:type phone: str
:param language: Язык для сообщения с кодом. По умолчанию "ru".
:type language: str
:return: Временный токен для дальнейшей аутентификации.
:rtype: str
:raises ValueError: Если полученные данные имеют неверный формат.
Expand All @@ -52,7 +90,7 @@ async def request_code(self, phone: str, language: str = "ru") -> str:
self.logger.info("Requesting auth code")

payload = RequestCodePayload(
phone=phone, type=AuthType.START_AUTH, language=language
phone=self._split_phone(phone), type=AuthType.START_AUTH
).model_dump(by_alias=True)

data = await self._send_and_wait(opcode=Opcode.AUTH_REQUEST, payload=payload)
Expand All @@ -72,14 +110,12 @@ async def request_code(self, phone: str, language: str = "ru") -> str:
self.logger.error("Invalid payload data received")
raise ValueError("Invalid payload data received")

async def resend_code(self, phone: str, language: str = "ru") -> str:
async def resend_code(self, phone: str) -> str:
"""
Повторно запрашивает код аутентификации для указанного номера телефона и возвращает временный токен.

:param phone: Номер телефона в международном формате.
:type phone: str
:param language: Язык для сообщения с кодом. По умолчанию "ru".
:type language: str
:return: Временный токен для дальнейшей аутентификации.
:rtype: str
:raises ValueError: Если полученные данные имеют неверный формат.
Expand All @@ -88,7 +124,7 @@ async def resend_code(self, phone: str, language: str = "ru") -> str:
self.logger.info("Resending auth code")

payload = RequestCodePayload(
phone=phone, type=AuthType.RESEND, language=language
phone=self._split_phone(phone), type=AuthType.RESEND
).model_dump(by_alias=True)

data = await self._send_and_wait(opcode=Opcode.AUTH_REQUEST, payload=payload)
Expand Down
2 changes: 1 addition & 1 deletion src/pymax/mixins/socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ def _perform_ssl_handshake(self, raw_sock: socket.socket) -> socket.socket:
suppress_ragged_eofs=True,
)
wrapped.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
wrapped.setblocking(False)
wrapped.setblocking(True)
return wrapped
except ssl.SSLError as e:
self.logger.error("SSL handshake failed: %s", e)
Expand Down
1 change: 0 additions & 1 deletion src/pymax/payloads.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ class UserAgentPayload(CamelModel):
class RequestCodePayload(CamelModel):
phone: str
type: AuthType = AuthType.START_AUTH
language: str = "ru"


class SendCodePayload(CamelModel):
Expand Down
4 changes: 2 additions & 2 deletions src/pymax/static/constant.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@
DEFAULT_LOCALE: Final[str] = "ru"
DEFAULT_DEVICE_LOCALE: Final[str] = "ru"
DEFAULT_DEVICE_NAME: Final[str] = choice(DEVICE_NAMES)
DEFAULT_APP_VERSION: Final[str] = "25.12.14"
DEFAULT_APP_VERSION: Final[str] = "25.21.0"
DEFAULT_SCREEN: Final[str] = choice(SCREEN_SIZES)
DEFAULT_OS_VERSION: Final[str] = choice(OS_VERSIONS)
DEFAULT_USER_AGENT: Final[str] = ua_generator.generate().text
DEFAULT_BUILD_NUMBER: Final[int] = 0x97CB
DEFAULT_BUILD_NUMBER: Final[int] = 0x9E2A
DEFAULT_CLIENT_SESSION_ID: Final[int] = randint(1, 15)
DEFAULT_TIMEZONE: Final[str] = choice(TIMEZONES)
DEFAULT_CHAT_MEMBERS_LIMIT: Final[int] = 50
Expand Down