o
    .˜Žj#  ã                   @   sx   d dl 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
mZmZ d dlmZ d dlmZ G dd	„ d	eƒZdS )
é    N)ÚListÚTupleÚAnyé   )ÚDummyMongoClient)ÚMongoClientÚ	UpdateOneÚ
DeleteMany)ÚStorage)Úget_input_peerc                       s”  e Zd ZU dZejed< dZ	d:dede	de
f‡ fdd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zdeeeeeeef  fdd„Zdeeeef  fdd„Zefdeeeeeef fdd„Zdd„ Zdefdd„Zd efd!d"„Zd#efd$d%„Zd&d'„ Zdefd(d)„Zefdefd*d+„Zefdefd,d-„Zefdefd.d/„Z efde
fd0d1„Z!efde"fd2d3„Z#efdefd4d5„Z$efdefd6d7„Z%efde
fd8d9„Z&‡  Z'S );ÚMongoStoragea  
    Initializes a new session.

    Parameters:
        - name (`str`):
            The session name used for database name.

        - connection (`obj`):
            Mongodb connections object.
            ~async_pymongo.AsyncClient or ~motor.motor_asyncio.AsyncIOMotorClient object

        - remove_peers (`bool`, *optional*):
            Flag to remove data in the peers collection. If set to True, 
            the data related to peers will be removed everytime client log out. 
            If set to False or None, the data will not be removed.

    Example:
        import async_pymongo

        conn = async_pymongo.AsyncClient("mongodb://...")
        bot_db = conn["my_bot"]
        session = MongoStorage("my_session", connection=conn, remove_peers=True)
    Úlocki€p  FÚnameÚ
connectionÚremove_peersc                    s‚   t ƒ j|d� d }t|tƒrt|tƒrtdƒ‚|| }ntdƒ‚t ¡ | _|| _	|d | _
|d | _|d | _|d | _|| _d S )N)r   zmPymongo MongoClient object is not supported! please use async mongodb driver such as async_pymongo and motor.zZWrong connection object type! please pass valid connection object to connection parameter!ÚpeersÚsessionÚ	usernamesÚupdate_state)ÚsuperÚ__init__Ú
isinstancer   r   Ú	ExceptionÚasyncioÚLockr   ÚdatabaseÚ_peerÚ_sessionÚ
_usernamesÚ_statesÚ_remove_peers)Úselfr   r   r   r   ©Ú	__class__© ú[/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/pyrogram/storage/mongo_storage.pyr   :   s   








zMongoStorage.__init__c                 Ã   sF   �| j  ddii ¡I dH rdS | j  dddddddddœ¡I dH  dS )zØ

        dc_id     INTEGER PRIMARY KEY,
        api_id    INTEGER,
        test_mode INTEGER,
        auth_key  BLOB,
        date      INTEGER NOT NULL,
        user_id   INTEGER,
        is_bot    INTEGER
        Ú_idr   Né   ó    )r&   Údc_idÚapi_idÚ	test_modeÚauth_keyÚdateÚuser_idÚis_bot)r   Úfind_oneÚ
insert_one©r!   r$   r$   r%   ÚopenR   s   €øÿzMongoStorage.openc                 Ã   ó   �d S ©Nr$   r2   r$   r$   r%   Úsavem   ó   €zMongoStorage.savec                 Ã   r4   r5   r$   r2   r$   r$   r%   Úclosep   r7   zMongoStorage.closec              
   Ã   sd   �z| j  ddi¡I d H  | jr| j i ¡I d H  W d S W d S  ty1 } zW Y d }~d S d }~ww )Nr&   r   )r   Ú
delete_oner    r   Úremover   )r!   Ú_r$   r$   r%   Údeletes   s   €ÿ€ÿzMongoStorage.deleter   c                 ƒ   s>   �t t ¡ ƒ‰ ‡ fdd„|D ƒ}|sdS | j |¡I dH  dS )z/(id, access_hash, type, username, phone_number)c                    sB   g | ]}t d |d id|d |d |d |d ˆ dœidd	�‘qS )
r&   r   ú$setr   r'   é   é   )Úaccess_hashÚtypeÚusernameÚphone_numberÚlast_update_onT©Úupsert©r   ©Ú.0Úi©Úsr$   r%   Ú
<listcomp>~   s    ö
û÷ÿz-MongoStorage.update_peers.<locals>.<listcomp>N)ÚintÚtimer   Ú
bulk_write)r!   r   Úbulkr$   rK   r%   Úupdate_peers{   s   €
õÿzMongoStorage.update_peersr   c                 ƒ   s^   �t t ¡ ƒ‰ dd„ |D ƒ}‡ fdd„|D ƒ}|sd S | j |¡I d H  | j |¡I d H  d S )Nc                 S   s   g | ]
}t d |d iƒ‘qS )Úpeer_idr   )r	   rH   r$   r$   r%   rM   “   s    þ
ÿÿz1MongoStorage.update_usernames.<locals>.<listcomp>c                    s0   g | ]}t d |d id|d ˆ dœidd�‘qS )r&   r   r=   r   ©rS   rD   TrE   rG   rH   rK   r$   r%   rM   ˜   s    ù
þúÿ)rN   rO   r   rP   )r!   r   Úbulk_deleterQ   r$   rK   r%   Úupdate_usernames‘   s    €ý
ø

ÿÿzMongoStorage.update_usernamesÚvaluec                 Ã   sž   �|t krdd„ | j ¡ 2 ƒI d H }t|ƒdkr|S d S t|tƒr.| j d|i¡I d H  d S | jjd|d id|d |d |d |d	 d
œidd�I d H  d S )Nc                 Ó   s:   �g | z3 d H W }|d |d |d |d |d g‘q6 S )Nr&   ÚptsÚqtsr-   Úseqr$   )rI   Ústater$   r$   r%   rM   ­   s   €8 z-MongoStorage.update_state.<locals>.<listcomp>r   r&   r=   r   r'   r>   r?   )rX   rY   r-   rZ   TrE   )Úobjectr   ÚfindÚlenr   rN   r9   Ú
update_one)r!   rW   Ústatesr$   r$   r%   r   «   s   €
BzMongoStorage.update_statec                 Ã   s   �| j  d|i¡I d H  d S )Nr&   )r   r9   )r!   Úchat_idr$   r$   r%   Úremove_stateµ   s   €zMongoStorage.remove_staterS   c                 Ã   sL   �| j  d|iddddœ¡I d H }|std|› �ƒ‚t|d |d |d ƒS )Nr&   r   ©r&   r@   rA   zID not found: r@   rA   ©r   r0   ÚKeyErrorr   )r!   rS   Úrr$   r$   r%   Úget_peer_by_id¸   s
   € zMongoStorage.get_peer_by_idrB   c                 Ã   s  �| j  d|idddddœ¡I d H }|d u rb| j d|idddœ¡I d H }|d u r0td|› �ƒ‚tt ¡ |d  ƒ| jkrDtd|› �ƒ‚| j  d|d	 idddddœ¡I d H }|d u rbtd|› �ƒ‚tt ¡ |d  ƒ| jkrvtd|› �ƒ‚t|d |d
 |d ƒS )NrB   r   )r&   r@   rA   rD   r&   rT   zUsername not found: rD   zUsername expired: rS   r@   rA   )r   r0   r   re   ÚabsrO   ÚUSERNAME_TTLr   )r!   rB   rf   Úr2r$   r$   r%   Úget_peer_by_username¿   s(   €
ÿ
ÿ
ÿz!MongoStorage.get_peer_by_usernamerC   c                 Ã   sP   �| j  d|iddddœ¡I d H }|d u rtd|› �ƒ‚t|d |d |d ƒS )NrC   r   rc   zPhone number not found: r&   r@   rA   rd   )r!   rC   rf   r$   r$   r%   Úget_peer_by_phone_numberÕ   s   €

ÿz%MongoStorage.get_peer_by_phone_numberc                 Ã   s<   �t  ¡ d j}| j ddi|di¡I d H }|sd S || S )Nr'   r&   r   r   )ÚinspectÚstackÚfunctionr   r0   )r!   ÚattrÚdr$   r$   r%   Ú_getà   s   €zMongoStorage._getc                 Ã   s8   �t  ¡ d j}| jjddid||iidd�I d H  d S )Nr'   r&   r   r=   TrE   )rm   rn   ro   r   r_   )r!   rW   rp   r$   r$   r%   Ú_setç   s   €(zMongoStorage._setc                 Ã   s(   �|t kr|  ¡ I d H S |  |¡I d H S r5   )r\   rr   rs   ©r!   rW   r$   r$   r%   Ú	_accessorë   s   €&zMongoStorage._accessorc                 Ã   ó   �|   |¡I d H S r5   ©ru   rt   r$   r$   r%   r)   î   ó   €zMongoStorage.dc_idc                 Ã   rv   r5   rw   rt   r$   r$   r%   r*   ñ   rx   zMongoStorage.api_idc                 Ã   rv   r5   rw   rt   r$   r$   r%   r+   ô   rx   zMongoStorage.test_modec                 Ã   rv   r5   rw   rt   r$   r$   r%   r,   ÷   rx   zMongoStorage.auth_keyc                 Ã   rv   r5   rw   rt   r$   r$   r%   r-   ú   rx   zMongoStorage.datec                 Ã   rv   r5   rw   rt   r$   r$   r%   r.   ý   rx   zMongoStorage.user_idc                 Ã   rv   r5   rw   rt   r$   r$   r%   r/      rx   zMongoStorage.is_bot)F)(Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__ri   Ústrr   Úboolr   r3   r6   r8   r<   r   r   rN   rR   rV   r\   r   rb   rg   rk   rl   rr   r   rs   ru   r)   r*   r+   Úbytesr,   r-   r.   r/   Ú__classcell__r$   r$   r"   r%   r      sB   
 
üþýü  
r   )r   rm   rO   Útypingr   r   r   Údummy_clientr   Úpymongor   r   r	   Úpyrogram.storage.storager
   Úpyrogram.storage.sqlite_storager   r   r$   r$   r$   r%   Ú<module>   s   