
    ;Si~                         d Z ddlZddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZ  e ej                  d      dd  Zej                  ej                  	      Z G d
 d      Zy)z6
This module contains the BinaryReader utility class.
    N)datetime	timedeltatimezone   )TypeNotFoundError)	tlobjects)core_objects   )tzinfoc                       e Zd ZdZd Zd ZddZddZd Zd Z	ddZ
dd	Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)BinaryReaderz2
    Small utility class to read binary data.
    c                 6    |xs d| _         d| _        d | _        y )N    r   )streamposition_last)selfdatas     e/var/www/OnlineNewsSite/project/venv/lib/python3.12/site-packages/telethon/extensions/binaryreader.py__init__zBinaryReader.__init__   s    kc
r   c                     t        j                  d| j                  | j                        \  }| xj                  dz  c_        |S )zReads a single byte value.z<B   structunpack_fromr   r   r   values     r   	read_bytezBinaryReader.read_byte   3    ##D$++t}}Er   c                     |rdnd}t        j                  || j                  | j                        \  }| xj                  dz  c_        |S )z!Reads an integer (4 bytes) value.z<iz<I   r   r   signedfmtr   s       r   read_intzBinaryReader.read_int$   <    d$##CdmmDr   c                     |rdnd}t        j                  || j                  | j                        \  }| xj                  dz  c_        |S )z%Reads a long integer (8 bytes) value.z<qz<Q   r   r"   s       r   	read_longzBinaryReader.read_long+   r&   r   c                     t        j                  d| j                  | j                        \  }| xj                  dz  c_        |S )z,Reads a real floating point (4 bytes) value.z<fr!   r   r   s     r   
read_floatzBinaryReader.read_float2   r   r   c                     t        j                  d| j                  | j                        \  }| xj                  dz  c_        |S )z,Reads a real floating point (8 bytes) value.z<dr(   r   r   s     r   read_doublezBinaryReader.read_double8   r   r   c                 V    t         j                  | j                  |dz        d|      S )z"Reads a n-bits long integer value.r(   little)	byteorderr#   )int
from_bytesread)r   bitsr#   s      r   read_large_intzBinaryReader.read_large_int>   s.    ~~IIdai HV  E 	Er   c           
         |dk\  r<| j                   | j                  | j                  |z    }| xj                  |z  c_        n7| j                   | j                  d }| xj                  t        |      z  c_        |dk\  rPt        |      |k7  rBt        dj	                  |t        |      t        |      t        | j                                    || _        |S )z<Read the given amount of bytes, or -1 to read all remaining.r   Nz=No more data left to read (need {}, got {}: {}); last read {})r   r   lenBufferErrorformatreprr   )r   lengthresults      r   r3   zBinaryReader.readC   s    Q;[[t}}v/EFFMMV#M[[0FMMS[(MaKc&kV3OFT&\4

;KL 
 
r   c                     | j                   S )z?Gets the byte array representing the current buffer as a whole.r   r   s    r   	get_byteszBinaryReader.get_bytesT   s    {{r   c                    | j                         }|dk(  r>| j                         | j                         dz  z  | j                         dz  z  }|dz  }n
|}|dz   dz  }| j                  |      }|dkD  rd|z
  }| j                  |       |S )zi
        Reads a Telegram-encoded byte array, without the need of
        specifying its length.
           r(      r!   r   r   )r   r3   )r   
first_byter;   paddingr   s        r   tgread_byteszBinaryReader.tgread_bytes\   s    
 ^^%
^^%)9Q)>? B&(FqjGFzQ&Gyy Q;'kGIIgr   c                 :    t        | j                         dd      S )z Reads a Telegram-encoded string.zutf-8replace)encodingerrors)strrF   r?   s    r   tgread_stringzBinaryReader.tgread_stringq   s    4$$&KKr   c                     | j                  d      }|dk(  ry|dk(  ryt        dj                  t        |                  )zReads a Telegram boolean value.Fr#      u2 T   7x zInvalid boolean code {})r%   RuntimeErrorr9   hexr   s     r   tgread_boolzBinaryReader.tgread_boolu   sC    U+Jj 8??E
KLLr   c                 H    | j                         }t        t        |      z   S )zbReads and converts Unix time (used by Telegram)
           into a Python datetime object.
        )seconds)r%   _EPOCHr   r   s     r   tgread_datezBinaryReader.tgread_date   s     	%000r   c                    | j                  d      }t        j                  |d      }||}|dk(  ry|dk(  ry|dk(  r5t        | j                               D cg c]  }| j	                          c}S t        j                  |d      }|N| j                  d       | j                         }t        || j                               }| j                  |       ||j                  |       S c c}w )	zReads a Telegram object.FrN   NrO   TrP   ĵ)r%   r   getrangetgread_objectr	   seektell_positionr   r3   set_positionfrom_reader)r   constructor_idclazzr   _poserrors          r   r]   zBinaryReader.tgread_object   s    e4nd3= #E
"*$*$6;DMMO6LM**,MM $$^T:E}		"((*).$))+F!!#&  && Ns   C*c                     d| j                  d      k7  rt        d      | j                         }t        |      D cg c]  }| j                          c}S c c}w )z,Reads a vector (a list) of Telegram objects.rY   FrN   z-Invalid constructor code, vector was expected)r%   rQ   r\   r]   )r   countrd   s      r   tgread_vectorzBinaryReader.tgread_vector   sM    e44NOO.3El;""$;;;s   Ac                     d| _         y)z.Closes the reader, freeing the BytesIO stream.r   Nr>   r?   s    r   closezBinaryReader.close   s	    r   c                     | j                   S )z)Tells the current position on the stream.r   r?   s    r   r_   zBinaryReader.tell_position   s    }}r   c                     || _         y)z(Sets the current position on the stream.Nrm   )r   r   s     r   r`   zBinaryReader.set_position   s	     r   c                 .    | xj                   |z  c_         y)zz
        Seeks the stream position given an offset from the current position.
        The offset may be negative.
        Nrm   )r   offsets     r   r^   zBinaryReader.seek   s    
 	r   c                     | S N r?   s    r   	__enter__zBinaryReader.__enter__   s    r   c                 $    | j                          y rr   )rk   )r   exc_typeexc_valexc_tbs       r   __exit__zBinaryReader.__exit__   s    

r   N)T))__name__
__module____qualname____doc__r   r   r%   r)   r+   r-   r5   r3   r@   rF   rL   rS   rW   r]   ri   rk   r_   r`   r^   rt   ry   rs   r   r   r   r      ss    E
"*LM1'4<! r   r   )r~   r   timer   r   r   rJ   r   tl.alltlobjectsr   tl.corer	   gmtime_EPOCH_NAIVErH   utcrV   r   rs   r   r   <module>r      s_      2 2 & ' "Q+,			X\\		2w wr   