o
    .˜ŽjÏ"  ã                   @   s‚   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
 ddlmZ dZd	Zd
ededefdd„ZG dd„ de
ƒZdS )é    N)ÚListÚTupleÚAny)Úrawé   )ÚStorageé   )Úutilsaì  
CREATE TABLE sessions
(
    dc_id     INTEGER PRIMARY KEY,
    api_id    INTEGER,
    test_mode INTEGER,
    auth_key  BLOB,
    date      INTEGER NOT NULL,
    user_id   INTEGER,
    is_bot    INTEGER
);

CREATE TABLE peers
(
    id             INTEGER PRIMARY KEY,
    access_hash    INTEGER,
    type           INTEGER NOT NULL,
    username       TEXT,
    phone_number   TEXT,
    last_update_on INTEGER NOT NULL DEFAULT (CAST(STRFTIME('%s', 'now') AS INTEGER))
);

CREATE TABLE update_state
(
    id   INTEGER PRIMARY KEY,
    pts  INTEGER,
    qts  INTEGER,
    date INTEGER,
    seq  INTEGER
);

CREATE TABLE version
(
    number INTEGER PRIMARY KEY
);

CREATE INDEX idx_peers_id ON peers (id);
CREATE INDEX idx_peers_username ON peers (username);
CREATE INDEX idx_peers_phone_number ON peers (phone_number);

CREATE TRIGGER trg_peers_last_update_on
    AFTER UPDATE
    ON peers
BEGIN
    UPDATE peers
    SET last_update_on = CAST(STRFTIME('%s', 'now') AS INTEGER)
    WHERE id = NEW.id;
END;
až  
CREATE TABLE IF NOT EXISTS usernames
(
    id             TEXT PRIMARY KEY,
    peer_id        INTEGER NOT NULL,
    last_update_on INTEGER NOT NULL DEFAULT (CAST(STRFTIME('%s', 'now') AS INTEGER))
);

CREATE TRIGGER IF NOT EXISTS trg_usernames_last_update_on
    AFTER UPDATE
    ON usernames
BEGIN
    UPDATE usernames
    SET last_update_on = CAST(STRFTIME('%s', 'now') AS INTEGER)
    WHERE id = NEW.id;
END;
Úpeer_idÚaccess_hashÚ	peer_typec                 C   s\   |dv rt jj| |d�S |dkrt jj|  d�S |dv r't jjt | ¡|d�S td|› �ƒ‚)N)ÚuserÚbot)Úuser_idr   Úgroup)Úchat_id)ÚchannelÚ
supergroup)Ú
channel_idr   zInvalid peer type: )r   ÚtypesÚInputPeerUserÚInputPeerChatÚInputPeerChannelr	   Úget_channel_idÚ
ValueError)r
   r   r   © r   ú\/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/pyrogram/storage/sqlite_storage.pyÚget_input_peerd   s   þÿþr   c                       s–  e Zd ZdZdZdef‡ fdd„Z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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 ):ÚSQLiteStorageé   i€p  Únamec                    s   t ƒ  |¡ d | _d S ©N)ÚsuperÚ__init__Úconn)Úselfr    ©Ú	__class__r   r   r#   }   s   
zSQLiteStorage.__init__c                 C   sd   | j �% | j  t¡ | j  t¡ | j  d| jf¡ | j  dd¡ W d   ƒ d S 1 s+w   Y  d S )NzINSERT INTO version VALUES (?)z1INSERT INTO sessions VALUES (?, ?, ?, ?, ?, ?, ?))r   NNNr   NN)r$   ÚexecutescriptÚSCHEMAÚUNAME_SCHEMAÚexecuteÚVERSION©r%   r   r   r   Úcreate‚   s   þþ"÷zSQLiteStorage.createc                 Ã   ó   �t ‚r!   ©ÚNotImplementedErrorr-   r   r   r   Úopen‘   ó   €zSQLiteStorage.openc                 Ã   s(   �|   tt ¡ ƒ¡I d H  | j ¡  d S r!   )ÚdateÚintÚtimer$   Úcommitr-   r   r   r   Úsave”   s   €zSQLiteStorage.savec                 Ã   s   �| j  ¡  d S r!   )r$   Úcloser-   r   r   r   r9   ˜   s   €zSQLiteStorage.closec                 Ã   r/   r!   r0   r-   r   r   r   Údelete›   r3   zSQLiteStorage.deleteÚpeersc                 Ã   s   �| j  d|¡ d S )NzXREPLACE INTO peers (id, access_hash, type, username, phone_number)VALUES (?, ?, ?, ?, ?))r$   Úexecutemany)r%   r;   r   r   r   Úupdate_peersž   s
   €ýzSQLiteStorage.update_peersÚ	usernamesc                 Ã   s>   �| j  t¡ |D ]}| j  d|d f¡ q	| j  d|¡ d S )Nz%DELETE FROM usernames WHERE peer_id=?r   z1REPLACE INTO usernames (peer_id, id)VALUES (?, ?))r$   r(   r*   r+   r<   )r%   r>   r   r   r   r   Úupdate_usernames¥   s   €þýzSQLiteStorage.update_usernamesÚvaluec                 Ã   s€   �|t kr| j d¡ ¡ S | j�& t|tƒr| j d|f¡ n| j d|¡ W d   ƒ d S W d   ƒ d S 1 s9w   Y  d S )Nz0SELECT id, pts, qts, date, seq FROM update_stateú%DELETE FROM update_state WHERE id = ?zIREPLACE INTO update_state (id, pts, qts, date, seq)VALUES (?, ?, ?, ?, ?))Úobjectr$   r+   ÚfetchallÚ
isinstancer5   ©r%   r@   r   r   r   Úupdate_state²   s(   €ÿþ
þýù"þzSQLiteStorage.update_statec                 Ã   s   �| j  d|f¡ d S )NrA   )r$   r+   )r%   r   r   r   r   Úremove_stateÅ   s
   €þzSQLiteStorage.remove_stater
   c                 Ã   ó4   �| j  d|f¡ ¡ }|d u rtd|› �ƒ‚t|Ž S )Nz4SELECT id, access_hash, type FROM peers WHERE id = ?zID not found: ©r$   r+   ÚfetchoneÚKeyErrorr   )r%   r
   Úrr   r   r   Úget_peer_by_idË   ó   €þýzSQLiteStorage.get_peer_by_idÚusernamec                 Ã   sÚ   �| j  d|f¡ ¡ }|d u rQ| j  d|f¡ ¡ }|d u r$td|› �ƒ‚tt ¡ |d  ƒ| jkr8td|› �ƒ‚| j  d|d f¡ ¡  }}|d u rQtd|› �ƒ‚tt ¡ |d  ƒ| jkretd|› �ƒ‚t|d d… Ž S )	NzfSELECT id, access_hash, type, last_update_on FROM peers WHERE username = ?ORDER BY last_update_on DESCzVSELECT peer_id, last_update_on FROM usernames WHERE id = ?ORDER BY last_update_on DESCzUsername not found: r   zUsername expired: z`SELECT id, access_hash, type, last_update_on FROM peers WHERE id = ?ORDER BY last_update_on DESCr   é   )r$   r+   rJ   rK   Úabsr6   ÚUSERNAME_TTLr   )r%   rO   rL   Úr2r   r   r   Úget_peer_by_usernameÖ   s:   €ýüýüýüz"SQLiteStorage.get_peer_by_usernameÚphone_numberc                 Ã   rH   )Nz>SELECT id, access_hash, type FROM peers WHERE phone_number = ?zPhone number not found: rI   )r%   rU   rL   r   r   r   Úget_peer_by_phone_numberô   rN   z&SQLiteStorage.get_peer_by_phone_numberc                 C   s*   t  ¡ d j}| j d|› d�¡ ¡ d S )Nr   zSELECT z FROM sessionsr   )ÚinspectÚstackÚfunctionr$   r+   rJ   )r%   Úattrr   r   r   Ú_getÿ   s   
ÿþzSQLiteStorage._getc                 C   sR   t  ¡ d j}| j� | j d|› d�|f¡ W d   ƒ d S 1 s"w   Y  d S )Nr   zUPDATE sessions SET z = ?)rW   rX   rY   r$   r+   )r%   r@   rZ   r   r   r   Ú_set  s   
þ"ÿzSQLiteStorage._setc                 C   s   |t kr|  ¡ S |  |¡S r!   )rB   r[   r\   rE   r   r   r   Ú	_accessor  s   zSQLiteStorage._accessorc                 Ã   ó   �|   |¡S r!   ©r]   rE   r   r   r   Údc_id  ó   €
zSQLiteStorage.dc_idc                 Ã   r^   r!   r_   rE   r   r   r   Úapi_id  ra   zSQLiteStorage.api_idc                 Ã   r^   r!   r_   rE   r   r   r   Ú	test_mode  ra   zSQLiteStorage.test_modec                 Ã   r^   r!   r_   rE   r   r   r   Úauth_key  ra   zSQLiteStorage.auth_keyc                 Ã   r^   r!   r_   rE   r   r   r   r4     ra   zSQLiteStorage.datec                 Ã   r^   r!   r_   rE   r   r   r   r   !  ra   zSQLiteStorage.user_idc                 Ã   r^   r!   r_   rE   r   r   r   Úis_bot$  ra   zSQLiteStorage.is_botc                 C   sX   |t kr| j d¡ ¡ d S | j� | j d|f¡ W d   ƒ d S 1 s%w   Y  d S )NzSELECT number FROM versionr   zUPDATE version SET number = ?)rB   r$   r+   rJ   rE   r   r   r   Úversion'  s   ÿþþ"ÿzSQLiteStorage.version)&Ú__name__Ú
__module__Ú__qualname__r,   rR   Ústrr#   r.   r2   r8   r9   r:   r   r   r5   r=   r?   rB   rF   rG   rM   rT   rV   r[   r   r\   r]   r`   rb   Úboolrc   Úbytesrd   r4   r   re   rf   Ú__classcell__r   r   r&   r   r   y   s6      	r   )rW   Úsqlite3r6   Útypingr   r   r   Úpyrogramr   Ústorager   Ú r	   r)   r*   r5   rj   r   r   r   r   r   r   Ú<module>   s   3