
    G˝i                    |    d Z ddlmZ ddlmZmZ ddlmZ erddlm	Z	 	 d	 	 	 	 	 ddZ
	 d	 	 	 	 	 ddZdd	Zdd
Zy)a  
Payload preparing

We have added some utils to make work with payload easier.

Basic encode example:

    .. code-block:: python

        from aiogram.utils.payload import encode_payload

        encoded = encode_payload("foo")

        # result: "Zm9v"

Basic decode it back example:

    .. code-block:: python

        from aiogram.utils.payload import decode_payload

        encoded = "Zm9v"
        decoded = decode_payload(encoded)
        # result: "foo"

Encoding and decoding with your own methods:

    1. Create your own cryptor

        .. code-block:: python

            from Cryptodome.Cipher import AES
            from Cryptodome.Util.Padding import pad, unpad

            class Cryptor:
                def __init__(self, key: str):
                    self.key = key.encode("utf-8")
                    self.mode = AES.MODE_ECB  # never use ECB in strong systems obviously
                    self.size = 32

                @property
                def cipher(self):
                    return AES.new(self.key, self.mode)

                def encrypt(self, data: bytes) -> bytes:
                    return self.cipher.encrypt(pad(data, self.size))

                def decrypt(self, data: bytes) -> bytes:
                    decrypted_data = self.cipher.decrypt(data)
                    return unpad(decrypted_data, self.size)

    2. Pass cryptor callable methods to aiogram payload tools

        .. code-block:: python

            cryptor = Cryptor("abcdefghijklmnop")
            encoded = encode_payload("foo", encoder=cryptor.encrypt)
            decoded = decode_payload(encoded_payload, decoder=cryptor.decrypt)

            # result: decoded == "foo"

    )annotations)urlsafe_b64decodeurlsafe_b64encode)TYPE_CHECKING)CallableNc                    t        | t              st        |       } | j                  d      }| ||      }t        |      S )z[Encode payload with encoder.

    Result also will be encoded with URL-safe base64url.
    zutf-8)
isinstancestrencode_encode_b64)payloadencoderpayload_bytess      N/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/utils/payload.pyencode_payloadr   I   s@     gs#g,NN7+M.}%%    c                h    t        |       }||j                         S  ||      j                         S )z/Decode URL-safe base64url payload with decoder.)_decode_b64decode)r   decoderoriginal_payloads      r   decode_payloadr   [   s8    
 #7+&&((#$++--r   c                \    t        |       }|j                         }|j                  dd      S )zEncode with URL-safe base64url.= )r   r   replace)r   bytes_payloadstr_payloads      r   r   r   h   s-    ,W5M&&(KsB''r   c                b    | ddt        |       dz  z
  z  z  } t        | j                               S )zDecode with URL-safe base64url.r      )lenr   r   )r   s    r   r   r   o   s1    sa#g,**++GW^^-..r   )N)r   r
   r   Callable[[bytes], bytes] | Nonereturnr
   )r   r
   r   r"   r#   r
   )r   bytesr#   r
   )r   r
   r#   r$   )__doc__
__future__r   base64r   r   typingr   collections.abcr   r   r   r   r    r   r   <module>r+      sn   =~ # 7  (
 04&&,& 	&( 04
.
.,
. 	
.(/r   