o
    Eº®j-R  ã                   @   sÔ  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZ e e¡ZdZdZdZdaejed< i Zi Ze  ¡ Z i Z!g Z"e#ed< da$e j%ed	< d
e j%fdd„Z&e'ƒ Z(e'ed< i Z)e*ed< de+d
e j%fdd„Z,dZ-dZ.dZ/dZ0dZ1e'ƒ Z2e'ed< g a3e#ed< i Z4e*ed< de+d
e j%fdd„Z5e'ƒ Z6e'ed< de+d
e7fdd„Z8de+fdd„Z9dd„ Z:d d!„ Z;d•d"d#„Z<d$d%„ Z=d&d'„ Z>d(d)„ Z?d
e@fd*d+„ZAd,d-„ ZBd.d/„ ZCd–d0d1„ZDd2d3„ ZEd4d5„ ZFd6d7„ ZGd—d
e7fd9d:„ZHd;d<„ ZId=d>„ ZJd?d@„ ZKdAdB„ ZLdCdD„ ZMdEdF„ ZNdGdH„ ZOdIdJ„ ZPdKe*fdLdM„ZQd˜dNdO„ZRd•dPe+dQe+dRe@fdSdT„ZSd•dPe+d
e#fdUdV„ZTd
e'fdWdX„ZUd
eVfdYdZ„ZWdPe+fd[d\„ZXd•de+fd]d^„ZYd_d`„ ZZdae[d
e[fdbdc„Z\dde[fdedf„Z]dgdh„ Z^didj„ Z_de+d
e+fdkdl„Z`dme+d
e*fdndo„Zai dpdq“drds“dtdu“dvdw“dxdy“dzd8“d{d|“d}d~“dd€“d�d‚“dƒd„“d…d†“d‡ds“dˆd8“d‰d|“dŠd~“d‹d€“d‚dŒdwd�dŽœ¥Zbd
e+fd�d�„Zcd
e7fd‘d’„Zdde+d
eVe7e+f fd“d”„ZedS )™é    N)Údatetime)ÚUserDeactivatedÚUserDeactivatedBanÚUserInvalidÚPeerIdInvalidÚInputUserDeactivatedÚSessionRevokedÚSessionExpiredÚAuthKeyUnregisteredÚAuthKeyDuplicatedÚUserBannedInChannelÚ	FloodWaitz0postgresql://mahde:MahdeFab1YssR@localhost/mahdeé
   i,  Ú_pg_poolÚ_join_notify_bufferÚ_join_notify_lockÚreturnc                   C   s   t d u rt ¡ a t S ©N)r   ÚasyncioÚLock© r   r   ú	shared.pyÚget_join_notify_lock%   s   r   Údead_sessionsÚaccount_locksÚphonec                 C   ó.   | t vr
t ¡ t | < t d| › d�¡ t |  S )Nz[LOCK] account_lock õ    â–¶)r   r   r   ÚlogÚdebug©r   r   r   r   Úget_account_lock/   ó   r!   FÚ_background_tasksÚ_admins_cacheÚ_get_client_locksc                 C   r   )Nz[LOCK] client_open_lock r   )r%   r   r   r   r   r    r   r   r   Úget_client_open_lock?   r"   r&   Ú_banned_channelsÚtargetc                 C   s   t | ƒtv S r   )Únorm_ch_keyr'   )r(   r   r   r   Úis_channel_bannedF   s   r*   c              	   Ã   s‚   �t | ƒ}t |¡ t d|› �¡ t ¡ 4 I d H š}| d|t 	¡  
¡ ¡I d H  W d   ƒI d H  d S 1 I d H s:w   Y  d S )Nu%   [CHANNEL BAN] Ù‚Ù†Ø§Ø© Ù…Ø­Ø¸ÙˆØ±Ø©: zAINSERT INTO banned_channels VALUES ($1,$2) ON CONFLICT DO NOTHING)r)   r'   Úaddr   Úwarningr   ÚacquireÚexecuter   ÚnowÚ	isoformat)r(   ÚkeyÚconr   r   r   Úban_channelI   s   €
þ.ÿr3   c               	   Ã   s  �t jtdddd�I dH at ¡ 4 I dH š<} |  d¡I dH  g d¢}|D ]\}}|  d||¡I dH  q$|  d	d
d¡I dH  |  d	dd¡I dH  W d  ƒI dH  n1 I dH sWw   Y  t d¡I dH }|D ]	}t |d ¡ qft	 
dttƒ› d�¡ t	 
d¡ dS )u@   Ø¥Ù†Ø´Ø§Ø¡ Pool ÙˆØ§Ù„Ø¬Ø¯Ø§ÙˆÙ„ Ø¥Ø°Ø§ Ù„Ù… ØªÙƒÙ† Ù…ÙˆØ¬ÙˆØ¯Ø©é   é   é   )Úmin_sizeÚmax_sizeÚcommand_timeoutNa˜  
            CREATE TABLE IF NOT EXISTS settings (
                key TEXT PRIMARY KEY,
                value TEXT
            );
            CREATE TABLE IF NOT EXISTS admins (
                user_id BIGINT PRIMARY KEY
            );
            CREATE TABLE IF NOT EXISTS accounts (
                phone TEXT PRIMARY KEY,
                banned INTEGER DEFAULT 0
            );
            CREATE TABLE IF NOT EXISTS banned_accounts (
                phone TEXT PRIMARY KEY,
                banned_at TEXT,
                reason TEXT
            );
            CREATE TABLE IF NOT EXISTS bots (
                username TEXT PRIMARY KEY,
                url TEXT
            );
            CREATE TABLE IF NOT EXISTS channels (
                id BIGINT,
                title TEXT,
                username TEXT,
                url TEXT,
                joined_at TEXT,
                PRIMARY KEY (id, url)
            );
            CREATE TABLE IF NOT EXISTS force_sub_channels (
                bot_username TEXT NOT NULL,
                url TEXT NOT NULL,
                channel_id BIGINT,
                PRIMARY KEY (bot_username, url)
            );
        ))Úgathering_speedÚ5)Ú
concurrentÚ20)Ú	is_activeÚ0)Úwork_minutesÚ15)Úrest_minutesr;   )Ú
active_botÚ z?INSERT INTO settings VALUES ($1,$2) ON CONFLICT(key) DO NOTHINGúKINSERT INTO settings VALUES ($1,$2) ON CONFLICT(key) DO UPDATE SET value=$2r>   r?   rC   rD   z'SELECT channel_key FROM banned_channelsÚchannel_keyu   [DB] ØªÙ… ØªØ­Ù…ÙŠÙ„ u    Ù‚Ù†Ø§Ø© Ù…Ø­Ø¸ÙˆØ±Ø©u   [DB] PostgreSQL pool Ø¬Ø§Ù‡Ø²)ÚasyncpgÚcreate_poolÚPG_DSNr   r-   r.   Úfetchr'   r+   r   ÚinfoÚlen)r2   ÚdefaultsÚkÚvÚrowsÚrr   r   r   Úinit_dbT   s:   €ü%þ
ýý(Ç>rR   c                  C   s\   ddl } z|  t¡}| ¡ }| d¡ | ¡ }| ¡  dd„ |D ƒW S  ty-   g  Y S w )uA   Ù„Ù„Ø§Ø³ØªØ®Ø¯Ø§Ù… Ø¹Ù†Ø¯ Ø§Ù„Ø¥Ù‚Ù„Ø§Ø¹ Ù‚Ø¨Ù„ Ø¨Ø¯Ø¡ event loopr   NúSELECT user_id FROM adminsc                 S   ó   g | ]}|d  ‘qS )r   r   ©Ú.0rQ   r   r   r   Ú
<listcomp>«   ó    z#get_admins_sync.<locals>.<listcomp>)Úpsycopg2ÚconnectrI   Úcursorr.   ÚfetchallÚcloseÚ	Exception)rY   r2   ÚcurrP   r   r   r   Úget_admins_sync¢   s   

ÿr`   c              	   Ã   sd   �t  ¡ 4 I d H š}| d| ¡I d H }|r|d n|W  d   ƒI d H  S 1 I d H s+w   Y  d S )Nz'SELECT value FROM settings WHERE key=$1Úvalue©r   r-   Úfetchrow)r1   Údefaultr2   Úrowr   r   r   Úget_setting°   s   €
ÿ0ürf   c              	   Ã   s\   �t  ¡ 4 I d H š}| d| t|ƒ¡I d H  W d   ƒI d H  d S 1 I d H s'w   Y  d S )NrE   )r   r-   r.   Ústr)r1   ra   r2   r   r   r   Úset_setting¸   s   €ý.ÿrh   c                   Ã   ó4   �zt ttddƒI d H ƒdƒW S  ty   Y dS w )Nr:   r4   r   ©ÚmaxÚintrf   r^   r   r   r   r   Ú	get_speedÁ   ó   €ÿrm   c                   Ã   ri   )Nr<   r5   é   rj   r   r   r   r   Úget_concurrentÈ   rn   rp   c                   Ã   ri   )NÚconcurrent_all_botsé<   ro   rj   r   r   r   r   Úget_concurrent_all_botsÎ   rn   rs   c                   Ã   ri   )Nr@   é   ro   rj   r   r   r   r   Úget_work_minutesÕ   rn   ru   c                   Ã   ri   )NrB   r4   ro   rj   r   r   r   r   Úget_rest_minutesÜ   rn   rv   c              	   Ã   s–   �t  ¡ 4 I d H š5}| r%| d¡I d H }dd„ |D ƒW  d   ƒI d H  S | d¡I d H }dd„ |D ƒW  d   ƒI d H  S 1 I d H sDw   Y  d S )Nz)SELECT phone FROM accounts WHERE banned=0c                 S   s   g | ]}d |d  i‘qS r    r   rU   r   r   r   rW   é   ó    z get_accounts.<locals>.<listcomp>z1SELECT phone, banned FROM accounts WHERE banned=0c                 S   s"   g | ]}|d  t |d ƒdœ‘qS )r   Úbanned)r   rx   )ÚboolrU   r   r   r   rW   í   s   " ©r   r-   rJ   )Úactive_onlyr2   rP   r   r   r   Úget_accountsã   s   €
ÿû
ÿ0÷r|   c               	   Ã   sb   �t  ¡ 4 I d H š} |  d¡I d H }|r|d ndW  d   ƒI d H  S 1 I d H s*w   Y  d S )Nz,SELECT COUNT(*) FROM accounts WHERE banned=0Úcountr   rb   )r2   re   r   r   r   Úget_active_countð   s   €
ÿ0ür~   c              	   Ã   óV   �t  ¡ 4 I d H š}| d| ¡I d H  W d   ƒI d H  d S 1 I d H s$w   Y  d S )Nz9INSERT INTO accounts VALUES ($1,0) ON CONFLICT DO NOTHING©r   r-   r.   ©r   r2   r   r   r   Úadd_accountø   s   €þ.ÿr‚   c              	   Ã   r   )Nú#DELETE FROM accounts WHERE phone=$1r€   r�   r   r   r   Údel_account   ó   €ÿ.ÿr„   õ
   Ù…Ø­Ø¸ÙˆØ±c           	      Ã   sŒ  �t  d| › d|› �¡ t ¡ 4 I dH š,}| d| ¡I dH }| d| ¡I dH  | d| t ¡  ¡ |¡I dH  W d  ƒI dH  n1 I dH sFw   Y  |rXt  d| › d�¡ dS t	| ƒI dH  t
j d	d
| ¡}t
j|dd� d}| › d�| › d�fD ]=}t
j d	|¡}zt
j |¡r™t
 |t
j ||¡¡ |d7 }W qz ty· } zt  d| › d|› �¡ W Y d}~qzd}~ww t  d| › d|› d�¡ dS )uz   
    ÙŠØ¹ÙŠØ¯ True Ø¥Ø°Ø§ ÙƒØ§Ù† Ø§Ù„Ø­Ø¸Ø± Ø¬Ø¯ÙŠØ¯Ø§Ù‹
    ÙŠØ¹ÙŠØ¯ False Ø¥Ø°Ø§ ÙƒØ§Ù† Ù…Ø­Ø¸ÙˆØ±Ø§Ù‹ Ù…Ø³Ø¨Ù‚Ø§Ù‹
    z[BAN] u    â–¶ Ø­Ø¸Ø±: Nz,SELECT 1 FROM banned_accounts WHERE phone=$1rƒ   zXINSERT INTO banned_accounts VALUES ($1,$2,$3) ON CONFLICT(phone) DO UPDATE SET reason=$3u'    â–  ÙƒØ§Ù† Ù…Ø­Ø¸ÙˆØ±Ø§Ù‹ Ù…Ø³Ø¨Ù‚Ø§Ù‹FÚsessionsÚ
quarantineT)Úexist_okr   z.sessionz.session-journalro   u%    âœ— Ù†Ù‚Ù„ Ù„Ù„ quarantÙŠÙ† Ù�Ø´Ù„: u+    âœ“ Ø¬Ù„Ø³Ø© Ù†Ù�Ù‚Ù„Øª Ù„Ù„ quarantÙŠÙ† (u    Ù…Ù„Ù�))r   r,   r   r-   rc   r.   r   r/   r0   Úcleanup_clientÚosÚpathÚjoinÚmakedirsÚexistsÚrenamer^   ÚerrorrK   )	r   Úreasonr2   ÚalreadyÚqdirÚmovedÚnamerŒ   Úer   r   r   Úban_account  sD   €
ÿ
ÿý(ù€"€ÿr˜   c               	   Ã   ó`   �t  ¡ 4 I d H š} |  d¡I d H }dd„ |D ƒW  d   ƒI d H  S 1 I d H s)w   Y  d S )Nz4SELECT phone, banned_at, reason FROM banned_accountsc                 S   s(   g | ]}|d  |d |d pddœ‘qS )r   Ú	banned_atr’   r†   )r   rš   r’   r   rU   r   r   r   rW   4  s    ü
ýÿzget_banned.<locals>.<listcomp>rz   ©r2   rP   r   r   r   Ú
get_banned/  s   €
ÿú0ürœ   c               	   Ã   r™   )NzSELECT username, url FROM botsc                 S   s   g | ]}|d  |d dœ‘qS )ÚusernameÚurl©r�   rž   r   rU   r   r   r   rW   A  s    zget_bots.<locals>.<listcomp>rz   r›   r   r   r   Úget_bots>  ó
   €0þr    c              	   Ã   sX   �t  ¡ 4 I d H š}| d| |¡I d H  W d   ƒI d H  d S 1 I d H s%w   Y  d S )Nz6INSERT INTO bots VALUES ($1,$2) ON CONFLICT DO NOTHINGr€   )r�   rž   r2   r   r   r   Úadd_botD  s   €þ.ÿr¢   c              	   Ã   r   )Nz"DELETE FROM bots WHERE username=$1r€   )r�   r2   r   r   r   Údel_botL  r…   r£   c               	   Ã   r™   )NrS   c                 S   rT   )Úuser_idr   rU   r   r   r   rW   V  rX   zget_admins.<locals>.<listcomp>rz   r›   r   r   r   Ú
get_adminsS  r¡   r¥   c              	   Ã   ó`   �t  ¡ 4 I d H š}| d| ¡I d H  W d   ƒI d H  n1 I d H s#w   Y  tƒ I d H ad S )Nz5INSERT INTO admins VALUES ($1) ON CONFLICT DO NOTHING©r   r-   r.   r¥   r$   ©Úuidr2   r   r   r   Ú	add_adminY  s   €þ(ÿrª   c              	   Ã   r¦   )Nz#DELETE FROM admins WHERE user_id=$1r§   r¨   r   r   r   Ú	del_adminc  s   €ÿ(ÿr«   c               	   Ã   r™   )Nz8SELECT id, title, username, url, joined_at FROM channelsc                 S   s0   g | ]}|d  |d |d |d |d dœ‘qS )ÚidÚtitler�   rž   Ú	joined_at)r¬   r­   r�   rž   r®   r   rU   r   r   r   rW   q  s    úûÿz get_channels.<locals>.<listcomp>rz   r›   r   r   r   Úget_channelsl  s   €
ÿø0ür¯   Úchc                 Ã   sÄ   �|   d¡pd}|   d¡pd}t ¡ 4 I d H š>}| d||¡I d H }|sJ| d||   d¡|   d¡||   d	t ¡  ¡ ¡¡I d H  W d   ƒI d H  d S W d   ƒI d H  d S 1 I d H s[w   Y  d S )
Nr¬   r   rž   rD   zFSELECT 1 FROM channels WHERE (id=$1 AND id!=0) OR (url=$2 AND url!='')zCINSERT INTO channels VALUES ($1,$2,$3,$4,$5) ON CONFLICT DO NOTHINGr­   r�   r®   )Úgetr   r-   rc   r.   r   r/   r0   )r°   Úch_idrž   r2   r�   r   r   r   Úadd_channel}  s(   €
þúú.ûr³   c              	   Ã   sž   �t  ¡ 4 I d H š9}| r| d| ¡I d H  n!|r,| d|¡I d H  W d   ƒI d H  d S W d   ƒI d H  d S W d   ƒI d H  d S 1 I d H sHw   Y  d S )Nz DELETE FROM channels WHERE id=$1z!DELETE FROM channels WHERE url=$1r€   )r²   rž   r2   r   r   r   Údel_channel�  s   €ÿÿúû.þr´   Úbot_usernamerž   Ú
channel_idc              	   Ã   sh   �t  ¡ 4 I d H š}| d|  ¡  d¡| ¡ |¡I d H  W d   ƒI d H  d S 1 I d H s-w   Y  d S )NzÈINSERT INTO force_sub_channels (bot_username, url, channel_id) VALUES ($1,$2,$3) ON CONFLICT (bot_username, url) DO UPDATE SET channel_id = COALESCE(EXCLUDED.channel_id, force_sub_channels.channel_id)ú@©r   r-   r.   ÚlowerÚstrip)rµ   rž   r¶   r2   r   r   r   Úadd_force_sub_channelœ  s   €ü.ÿr»   c              	   Ã   s‚   �t  ¡ 4 I d H š+}| r| d|  ¡  d¡¡I d H }n| d¡I d H }dd„ |D ƒW  d   ƒI d H  S 1 I d H s:w   Y  d S )NzRSELECT bot_username, url, channel_id FROM force_sub_channels WHERE bot_username=$1r·   z<SELECT bot_username, url, channel_id FROM force_sub_channelsc                 S   s   g | ]}t |ƒ‘qS r   )ÚdictrU   r   r   r   rW   ±  rX   z*get_force_sub_channels.<locals>.<listcomp>)r   r-   rJ   r¹   rº   )rµ   r2   rP   r   r   r   Úget_force_sub_channels¦  s   €þ
ÿ0ör½   c               	   Ã   r™   )Nz"SELECT url FROM force_sub_channelsc                 S   s   h | ]}|d    ¡ ’qS ©rž   )rº   rU   r   r   r   Ú	<setcomp>·  rw   z)get_all_force_sub_urls.<locals>.<setcomp>rz   r›   r   r   r   Úget_all_force_sub_urls´  r¡   rÀ   c               	   Ã   sv   �t  ¡ 4 I dH š%} |  d¡I dH }dd„ |D ƒ}dd„ |D ƒ}||fW  d  ƒI dH  S 1 I dH s4w   Y  dS )uÌ  ÙŠØ¹ÙŠØ¯ (Ù…Ø¬Ù…ÙˆØ¹Ø© Ù…Ù�Ø§ØªÙŠØ­ Ù…ÙˆØ­Ù‘Ø¯Ø© Ø¹Ø¨Ø± norm_ch_keyØŒ Ù…Ø¬Ù…ÙˆØ¹Ø© channel_id) Ù„Ù‚Ù†ÙˆØ§Øª
    Ø§Ù„Ø§Ø´ØªØ±Ø§Ùƒ Ø§Ù„Ø¥Ø¬Ø¨Ø§Ø±ÙŠ. ÙŠÙ�Ø³ØªØ®Ø¯Ù… Ù„Ù„Ù…Ù‚Ø§Ø±Ù†Ø© Ø§Ù„Ø¯Ù‚ÙŠÙ‚Ø© Ø¨Ø¯Ù„ ØªØ·Ø§Ø¨Ù‚ Ù†ØµÙŠ Ø®Ø§Ù… Ø¹Ù„Ù‰ Ø§Ù„Ø±Ø§Ø¨Ø·ØŒ
    Ù„Ø£Ù† Ø§Ù„Ø±Ø§Ø¨Ø· Ø§Ù„Ù…Ø®Ø²ÙŽÙ‘Ù† Ù‡Ù†Ø§ Ø®Ø§Ù… ÙƒÙ…Ø§ ÙˆØ±Ø¯ Ù…Ù† Ø§Ù„Ø±Ø³Ø§Ù„Ø© (Ù‚Ø¯ ÙŠØ®ØªÙ„Ù� Ø¨Ø§Ù„Ø­Ø§Ù„Ø©/Ø§Ù„ØµÙŠØºØ©
    Ø¹Ù† Ø§Ù„Ø±Ø§Ø¨Ø· Ø§Ù„Ø·Ø¨ÙŠØ¹ÙŠ Ø§Ù„Ù…Ø®Ø²ÙŽÙ‘Ù† Ù�ÙŠ Ø¬Ø¯ÙˆÙ„ channels).Nz.SELECT url, channel_id FROM force_sub_channelsc                 S   s    h | ]}|d  rt |d  ƒ’qS r¾   )r)   rU   r   r   r   r¿   Á  s     z)get_all_force_sub_keys.<locals>.<setcomp>c                 S   s$   h | ]}|d  durt |d  ƒ’qS )r¶   N)rl   rU   r   r   r   r¿   Â  s   $ rz   )r2   rP   ÚkeysÚidsr   r   r   Úget_all_force_sub_keysº  s   €0ürÃ   c              	   Ã   s`   �t  ¡ 4 I d H š}| d|  ¡  d¡¡I d H  W d   ƒI d H  d S 1 I d H s)w   Y  d S )Nz4DELETE FROM force_sub_channels WHERE bot_username=$1r·   r¸   )rµ   r2   r   r   r   Údel_force_sub_channelsÆ  s   €þ.ÿrÄ   c                 Ã   sÆ  �t  d| › d�¡ t| ƒ}|4 I d H šÂ t | ¡}|d u r3t  d| › d�¡ 	 W d   ƒI d H  d S |d urP||urPt  d| › d�¡ 	 W d   ƒI d H  d S t | d ¡ ztj| 	¡ dd�I d H  t  d| › d�¡ W nR t
y¿ } zFt  d| › d|› �¡ ztj| ¡ dd�I d H  t  d| › d	�¡ W n t
y´ } zt  d| › d
|› �¡ W Y d }~nd }~ww W Y d }~nd }~ww W d   ƒI d H  d S W d   ƒI d H  d S 1 I d H sÜw   Y  d S )Nz
[CLEANUP] u    â–¶ Ø¨Ø¯Ø¡ Ø§Ù„ØªÙ†Ø¸ÙŠÙ�u+    â–  Ù„Ø§ ÙŠÙˆØ¬Ø¯ Ø¹Ù…ÙŠÙ„ Ù�ÙŠ Ø§Ù„ÙƒØ§Ø´u<    â–  Ø­Ø§Ø±Ø³ Ø§Ù„Ù‡ÙˆÙŠØ©: Ø¹Ù…ÙŠÙ„ Ù…Ø®ØªÙ„Ù�ØŒ ØªØ¬Ø§Ù‡Ù„r   )Útimeoutu    âœ“ stop() Ù†Ø¬Ø­u    âš ï¸� stop() Ù�Ø´Ù„: u    âœ“ disconnect() Ù†Ø¬Ø­u    âœ— disconnect() Ù�Ø´Ù„: )r   rK   r&   Úclientsr±   r,   Úpopr   Úwait_forÚstopr^   Ú
disconnect)r   ÚclientÚlockÚcurrentr—   Úe2r   r   r   rŠ   Î  s@   €
ü÷
"€ÿ€ùÿó€. rŠ   c                 C   s$   t  | ¡}t |¡ | tj¡ |S r   )r   Úcreate_taskr#   r+   Úadd_done_callbackÚdiscard)ÚcoroÚtaskr   r   r   Úcreate_tracked_taskê  s   

rÔ   Úbasec                 C   s8   t d| d ƒ}t || ¡}t d| › d|d›d�¡ |S )Nç      ð?g333333ã?z[RAND_DELAY] base=u    â†’ z.2fÚs)rk   ÚrandomÚuniformr   r   )rÕ   ÚlowÚvalr   r   r   Ú
rand_delayñ  s   rÜ   Úsecondsc                 Ã   sˆ   �t  d| d›d�¡ d}d}|| k r8t ¡ r#t  d|d›d�¡ d S t t|| | ƒ¡I d H  ||7 }|| k st  d| d›d�¡ d S )	Nz[SAFE_SLEEP] z.1fu   s â–¶r   rÖ   u#   [SAFE_SLEEP] â–  stop_event Ø¨Ø¹Ø¯ r×   u   s âœ“)r   r   Ú
stop_eventÚis_setr   ÚsleepÚmin)rÝ   ÚelapsedÚintervalr   r   r   Ú
safe_sleepø  s   €ûrä   c                 C   s&   |   d¡p|   d¡rd| d › �S d S )Nrž   r�   úhttps://t.me/)r±   )r°   r   r   r   Úch_link  s
   
ÿÿræ   c                 C   sœ   | s| S |   ¡ } dD ]}|  |¡r| t|ƒd … } q
|  d¡r%| dd … } d| v r1|  dd¡d } |  d¡s;|  d¡r@d| › �S d	| v rL|  d	d¡d } | S )
N)úhttps://úhttp://út.me/útelegram.me/r·   ro   ú?r   ú+z	joinchat/rå   ú/)rº   Ú
startswithrL   Úsplit)ra   Úpr   r   r   Únorm_target  s    
€

rñ   c                 C   sL   | sdS |   ¡  ¡ } dD ]}|  |¡r| t|ƒd … } q|  d¡d  d¡S )NrD   )rå   zhttp://t.me/ré   r·   rë   r   rí   )rº   r¹   rî   rL   rï   Úrstrip)r(   rð   r   r   r   r)     s   
€r)   ra   c                 C   s´   |   ¡ } d }|  d¡s|  d¡r>|  dd¡ dd¡}dD ]}| |¡r+|t|ƒd … }q| d¡d  d¡d  d¡}|}n|  d¡rJ| d	d … }n| }||rVd
|› �dœS d dœS )Nrç   rè   rD   )ré   rê   rë   r   rí   r·   ro   rå   rŸ   )rº   rî   ÚreplacerL   rï   Úlstrip)ra   r�   Úrawrð   r   r   r   Úparse_bot_input'  s$   
€
þþrö   r   u   Ù…Ø­Ø¸ÙˆØ± Ù†Ù‡Ø§Ø¦ÙŠØ§Ù‹r   u   ØªÙ… ØªØ¬Ù…ÙŠØ¯Ù‡r   u%   Ø­Ø³Ø§Ø¨ ØºÙŠØ± ØµØ§Ù„Ø­ (Ù…Ø­Ø°ÙˆÙ�)r   u   Ù…Ø³ØªØ®Ø¯Ù… Ù…Ø¹Ø·Ù„r   u.   Ù…Ø¹Ø±Ù� ØºÙŠØ± ØµØ§Ù„Ø­ (Ø­Ø³Ø§Ø¨ Ù…Ø­Ø°ÙˆÙ�)ÚAccountBannedr
   u   Ø§Ù„Ø¬Ù„Ø³Ø© Ù…Ù†ØªÙ‡ÙŠØ©r   u   ØªÙ… Ø¥Ù„ØºØ§Ø¡ Ø§Ù„Ø¬Ù„Ø³Ø©r	   u$   Ø§Ù†ØªÙ‡Øª ØµÙ„Ø§Ø­ÙŠØ© Ø§Ù„Ø¬Ù„Ø³Ø©r   u   Ø¬Ù„Ø³Ø© Ù…ÙƒØ±Ø±Ø©r   u   Ù…Ø­Ø¸ÙˆØ± Ù�ÙŠ Ø§Ù„Ù‚Ù†Ø§Ø©ÚAccountInvalidatedu   Ø§Ù„Ø­Ø³Ø§Ø¨ ØºÙŠØ± ØµØ§Ù„Ø­ÚDEACTIVATEDÚBANNEDÚAUTH_KEY_UNREGISTEREDÚSESSION_REVOKEDÚSESSION_EXPIREDu   Ø­Ø³Ø§Ø¨ ØºÙŠØ± ØµØ§Ù„Ø­u   Ù…Ø¹Ø±Ù� ØºÙŠØ± ØµØ§Ù„Ø­)ÚAUTH_KEY_DUPLICATEDÚUSER_INVALIDÚINPUT_USER_DEACTIVATEDÚPEER_ID_INVALIDc                 C   sP   t | ƒj}|tv rt| S t| ƒ ¡ }t ¡ D ]\}}| ¡ |v r%|  S qdS )Nr†   )ÚtypeÚ__name__ÚBAN_REASONSrg   ÚupperÚitems)r—   Ú	type_nameÚerrr1   r’   r   r   r   Úget_ban_reasonT  s   
ÿr	  c                    sL   t | ƒj}|tv r|dv rdS dS t| ƒ ¡ ‰ g d¢}t‡ fdd„|D ƒƒS )N)r   FT)
rù   rû   rü   rý   rþ   ÚACCOUNT_INVALIDÚUSER_DEACTIVATEDrÿ   r   ÚUSER_IS_BLOCKEDc                 3   s   � | ]}|ˆ v V  qd S r   r   )rV   rN   ©r  r   r   Ú	<genexpr>l  s   € zis_ban_error.<locals>.<genexpr>)r  r  r  rg   r  Úany)r—   r  Úban_keywordsr   r  r   Úis_ban_error_  s   
r  c              
   Ã   sØ   �z8ddl m} |d| › �tjtjdd�}| ¡ I d H  | ¡ I d H }| ¡ I d H  |s7t| dƒI d H  W dS W dS  t	yk } z&t
|ƒr[t|ƒ}t| |ƒI d H  d	|fW  Y d }~S d	t|ƒfW  Y d }~S d }~ww )
Nr   )ÚClientz	sessions/T)Úapi_idÚapi_hashÚ
no_updatesõ   Ø­Ø³Ø§Ø¨ ØºÙŠØ± Ù…ÙˆØ¬ÙˆØ¯)Fr  )TrD   F)Úpyrogramr  ÚconfigÚAPI_IDÚAPI_HASHÚstartÚget_merÉ   r˜   r^   r  r	  rg   )r   r  ÚcÚmer—   r’   r   r   r   Úverify_account_validityo  s0   €ü€ûr  r   )F)r†   )NN)fr   rG   Úloggingr‹   ÚgcrØ   r   r  Úpyrogram.errorsr   r   r   r   r   r   r	   r
   r   r   r   Ú	getLoggerr  r   rI   Ú	BOT_DELAYÚ
BATCH_RESTr   ÚPoolÚ__annotations__rÆ   Ú	flood_mapÚEventrÞ   Úaccount_join_countr   Úlistr   r   r   Úsetr   r   r¼   rg   r!   Úall_bots_taskÚall_bots_onÚleave_all_taskÚleave_all_onÚleave_all_pausedr#   r$   r%   r&   r'   ry   r*   r3   rR   r`   rf   rh   rm   rp   rl   rs   ru   rv   r|   r~   r‚   r„   r˜   rœ   r    r¢   r£   r¥   rª   r«   r¯   r³   r´   r»   r½   rÀ   ÚtuplerÃ   rÄ   rŠ   rÔ   ÚfloatrÜ   rä   ræ   rñ   r)   rö   r  r	  r  r  r   r   r   r   Ú<module>   sè   
4
N
	
(
	


ÿþýüûúùø	÷
öõôóòñðïë