import socket as _socket from typing import Optional ZERO_64 = b'\x00' * 64 HANDSHAKE_LEN = 64 SKIP_LEN = 8 PREKEY_LEN = 32 KEY_LEN = 32 IV_LEN = 16 PROTO_TAG_POS = 56 DC_IDX_POS = 60 PROTO_TAG_ABRIDGED = b'\xef\xef\xef\xef' PROTO_TAG_INTERMEDIATE = b'\xee\xee\xee\xee' PROTO_TAG_SECURE = b'\xdd\xdd\xdd\xdd' PROTO_ABRIDGED_INT = 0xEFEFEFEF PROTO_INTERMEDIATE_INT = 0xEEEEEEEE PROTO_PADDED_INTERMEDIATE_INT = 0xDDDDDDDD RESERVED_FIRST_BYTES = {0xEF} RESERVED_STARTS = {b'\x48\x45\x41\x44', b'\x50\x4F\x53\x54', b'\x47\x45\x54\x20', b'\xee\xee\xee\xee', b'\xdd\xdd\xdd\xdd', b'\x16\x03\x01\x02'} RESERVED_CONTINUE = b'\x00\x00\x00\x00' def human_bytes(n: int) -> str: for unit in ('B', 'KB', 'MB', 'GB'): if abs(n) < 1024: return f"{n:.1f}{unit}" n /= 1024 # type: ignore return f"{n:.1f}TB" def get_link_host(host: str) -> Optional[str]: if host == '0.0.0.0': try: with _socket.socket(_socket.AF_INET, _socket.SOCK_DGRAM) as _s: _s.connect(('8.8.8.8', 80)) link_host = _s.getsockname()[0] except OSError: link_host = '127.0.0.1' return link_host else: return host