o
    <6j                     @   s   d dl Z d dlmZmZ d dl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mZ d dlmZ d d	lmZmZmZmZmZmZ d
ededee fddZ	dded
ededee def
ddZdedededdfddZdS )    N)datetimetimezone)ListOptional)Bot)TelegramForbiddenErrorTelegramRetryAfterTelegramBadRequest)logger)selectupdate)AsyncSession)BroadcastMessageBroadcastStatusBroadcastTarget	MediaTypeUserLanguagesessiontargetreturnc                    s
  ddl m} ttjtjdktjdk}|tj	kr/t 
tj|dd }|tj|k}nE|tjkrHt 
tj|dd }|tj|k}n,|tjkrW|tjtjk}n|tjkrf|tjtjk}n|tjkrt|tjtjk}| |I dH }d	d
 | D S )z-Target ga qarab user Telegram ID larini olishr   )	timedeltaFT   )days   Nc                 S   s   g | ]}|d  qS )r    ).0rowr   r   E/var/www/www-root/data/www/ai-bot.pdev.uz/bot/services/broadcaster.py
<listcomp>,   s    z'get_target_user_ids.<locals>.<listcomp>)r   r   r   r   telegram_idwhere	is_banned	is_activer   	ACTIVE_7Dnowr   utclast_active_at
ACTIVE_30DLANG_UZlanguager   UZLANG_RURULANG_ENENexecuteall)r   r   r   qsinceresultr   r   r   get_target_user_ids   s"   




r5   bot	broadcastuser_idsc                    sZ  t |}d}d}tj|_ttj|_||_	|
 I dH  td|j d| d t|D ]\}}	zt| |	|I dH  |d7 }W n tyc   |tttj|	kjddI dH  |d7 }Y nb ty }
 z6td	|
j d
 t|
jI dH  zt| |	|I dH  |d7 }W n ty   |d7 }Y nw W Y d}
~
n%d}
~
w ty }
 ztd|	 d|
  |d7 }W Y d}
~
nd}
~
ww |r|d d dkrz||| |I dH  W n	 ty   Y nw tdI dH  |d d dkr||_||_|
 I dH  q/tj |_||_||_ttj|_!|
 I dH  td|j d| d|  |S )u   
    Broadcast xabarini yuborish.
    Telegram rate limit: 30 msg/sec — biz 25 ta/sek yuboramiz.

    Args:
        progress_callback: async funksiya (sent, total) — progress bildirish uchun
    r   NzBroadcast #z boshlandi. Jami: z user   F)r#   zRate limit! zs kutilyapti...zUser z ga yuborishda xatolik: 2   g{Gz?d   z yakunlandi. Yuborildi: z, Xato: )"lenr   RUNNINGstatusr   r%   r   r&   
started_attotal_userscommitr
   infoid	enumerate_send_to_userr   r0   r   r   r!   r    valuesr   warningretry_afterasynciosleep	Exceptionerror
total_senttotal_failedDONEfinished_at)r6   r   r7   r8   progress_callbacktotalsentfailediuser_ider   r   r   run_broadcast/   sz   

rX   rV   c                    s   |j pd}|j}|j}|tjkr |r | j|||dI dH  dS |tjkr4|r4| j|||dI dH  dS |tjkrH|rH| j	|||dI dH  dS |tj
kr\|r\| j|||dI dH  dS | j||dI dH  dS )u   Bitta usergа xabar yuborish )chat_idphotocaptionN)rZ   videor\   )rZ   documentr\   )rZ   	animationr\   )rZ   text)r`   media_file_id
media_typer   PHOTO
send_photoVIDEO
send_videoDOCUMENTsend_document	ANIMATIONsend_animationsend_message)r6   rV   r7   r`   file_idrb   r   r   r   rE      s   
rE   )N)rI   r   r   typingr   r   aiogramr   aiogram.exceptionsr   r   r	   logurur
   
sqlalchemyr   r   sqlalchemy.ext.asyncior   bot.database.modelsr   r   r   r   r   r   intr5   rX   rE   r   r   r   r   <module>   sJ     
#
R