o
    HEDi2                     @   sl  d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ ddlmZ ddlmZ dd	lmZmZmZ d
Zd+d,ddZdddddddddd	dee	e  fddZddddddedddededee j dedee dee dedeeeef  d ed!ee fd"d#Zdddddded$d%d&Z ddddd'd(d)Z!G d*d dZ"dS )-    N)CallableUnionOptionalAnyList)warn)web)Application   )log)
Dispatcher)BOT_DISPATCHER_KEYDEFAULT_ROUTE_NAMEWebhookRequestHandlerAPP_EXECUTORexecutorExecutorc                 C   s,   |d ur	|  | |d ur| | d S d S N)
on_startupon_shutdown)r   r   r    r   e/var/www/www-root/data/www/ovozai.pdev.uz/venv/lib/python3.10/site-packages/aiogram/utils/executor.py_setup_callbacks   s
   
r   FT   皙?)	loopskip_updatesreset_webhookr   r   timeoutrelaxfastallowed_updatesr!   c       	         C   s2   t | ||d}
t|
|| |
j|||||	d dS )a  
    Start bot in long-polling mode

    :param dispatcher:
    :param loop:
    :param skip_updates:
    :param reset_webhook:
    :param on_startup:
    :param on_shutdown:
    :param timeout:
    :param relax:
    :param fast:
    :param allowed_updates:
    r   r   r   r   r   r    r!   N)r   r   start_polling)
dispatcherr   r   r   r   r   r   r   r    r!   r   r   r   r   r$      s   
r$   )r   r   r   r   check_ipretry_after
route_nameweb_appr%   webhook_pathr   r   r   r   r&   r'   r(   r)   c                C   s2   t | ||||d}
t|
|| |
j|||	d |
S )ag  
    Set webhook for bot

    :param dispatcher: Dispatcher
    :param webhook_path: str
    :param loop: Optional[asyncio.AbstractEventLoop] (default: None)
    :param skip_updates: bool (default: None)
    :param on_startup: Optional[Callable] (default: None)
    :param on_shutdown: Optional[Callable] (default: None)
    :param check_ip: bool (default: False)
    :param retry_after: Optional[Union[str, int]] See https://tools.ietf.org/html/rfc7231#section-7.1.3 (default: None)
    :param route_name: str (default: 'webhook_handler')
    :param web_app: Optional[Application] (default: None)
    :return:
    )r   r&   r'   r   )r(   r)   )r   r   set_webhook)r%   r*   r   r   r   r   r&   r'   r(   r)   r   r   r   r   r+   6   s   
r+   )r   r   r   r   r&   r'   r(   c                K   s.   t | ||||||||d	}
|
jdi |	 dS )z
    Start bot in webhook mode

    :param dispatcher:
    :param webhook_path:
    :param loop:
    :param skip_updates:
    :param on_startup:
    :param on_shutdown:
    :param check_ip:
    :param route_name:
    :param kwargs:
    :return:
    )	r%   r*   r   r   r   r   r&   r'   r(   Nr   r+   run_app)r%   r*   r   r   r   r   r&   r'   r(   kwargsr   r   r   r   start_webhookR   s   	r/   )r   r   r   r   c                C   s$   t | ||d}t||| ||S )z
    Execute Future.

    :param dispatcher: instance of Dispatcher
    :param future: future
    :param loop: instance of AbstractEventLoop
    :param skip_updates:
    :param on_startup:
    :param on_shutdown:
    :return:
    r"   )r   r   start)r%   futurer   r   r   r   r   r   r   r   r0   o   s   
r0   c                
   @   sD  e Zd ZdZd;ddZedejfddZed	d
 Z	de
jfddZede
jfddZd<defddZd<defddZdd Zdd ZdeedfddZdeedfdee dededee fd d!Zd"d# Zdeefd$d%Z		d=d(eee  fd)d*Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d>d5d6Z#d>d7d8Z$d9d: Z%dS )?r   z
    Main executor class
    NFc                 C   s   |d ur|| _ || _|| _|| _|| _td| _d | _g | _	g | _
g | _g | _d| _ddlm}m} ||j || d S )N   Fr   )Botr   )_loopr%   r   r&   r'   secretstoken_urlsafe	_identity_web_app_on_startup_webhook_on_startup_polling_on_shutdown_webhook_on_shutdown_polling_freezeaiogramr3   r   set_currentbot)selfr%   r   r&   r'   r   r3   r   r   r   r   __init__   s    zExecutor.__init__returnc                 C   s   t | dt S )Nr4   )getattrasyncioget_event_looprA   r   r   r   r      s   zExecutor.loopc                 C   s   | j S r   )r=   rG   r   r   r   frozen   s   zExecutor.frozenapplicationc                 C   s
   || _ dS )zY
        Change instance of aiohttp.web.Application

        :param application:
        N)r8   )rA   rI   r   r   r   set_web_app   s   
zExecutor.set_web_appc                 C   s   | j d u r	td| j S )Nz$web.Application() is not configured!)r8   RuntimeErrorrG   r   r   r   r)      s   
zExecutor.web_appTcallbackc                 C   r   |    |s|stdt dS t|tttfr%|D ]	}| ||| qdS |r-| j	| |r7| j
	| dS dS )z
        Register a callback for the startup process

        :param callback:
        :param polling: use with polling
        :param webhook: use with webhook
        This action has no effect!N)_check_frozenr   UserWarning
isinstancelisttuplesetr   r:   appendr9   rA   rL   pollingwebhookcbr   r   r   r         
zExecutor.on_startupc                 C   rM   )z
        Register a callback for the shutdown process

        :param callback:
        :param polling: use with polling
        :param webhook: use with webhook
        rN   N)rO   r   rP   rQ   rR   rS   rT   r   r<   rU   r;   rV   r   r   r   r      rZ   zExecutor.on_shutdownc                 C   s   | j rtdd S )NzExecutor is frozen!)rH   rK   rG   r   r   r   rO      s   zExecutor._check_frozenc                 C   s   |    d| _d S )NT)rO   r=   rG   r   r   r   _prepare_polling   s   
zExecutor._prepare_pollingc                    s       d _|d ur| _n jd u rt   _}ntd jr( j|d<  j| jkr3d S |d urA|j	j
d|||d  fdd} jD ]}|jt|| qJ fdd	}|j|  |t<  j|t< tj | j<  j|d
< d S )NTz(web.Application() is already configured!RETRY_AFTER*)namec                    s   |  j I d H S r   )r%   )rY   _rG   r   r   _wrap_callback  s   z1Executor._prepare_webhook.<locals>._wrap_callbackc                    s      I d H  d S r   )_shutdown_webhook)r_   rG   r   r   _on_shutdown  s   z/Executor._prepare_webhook.<locals>._on_shutdown	_check_ip)rO   r=   r8   r   r	   rK   r'   r7   getrouter	add_router9   r   rU   	functoolspartialr   APP_EXECUTOR_KEYr%   r   datetimenowr&   )rA   pathhandlerr(   appr`   rL   rb   r   rG   r   _prepare_webhook   s,   



zExecutor._prepare_webhookr*   request_handlerr(   r)   c                 C   s$   |  |||| | j|   dS )aO  
        Set webhook for bot

        :param webhook_path: Optional[str] (default: None)
        :param request_handler: Any (default: WebhookRequestHandler)
        :param route_name: str Name of webhook handler route (default: 'webhook_handler')
        :param web_app: Optional[Application] (default: None)
        :return:
        N)ro   r   run_until_complete_startup_webhook)rA   r*   rp   r(   r)   r   r   r   r+        zExecutor.set_webhookc                 K   s   t j| jfi | d S r   )r   r-   r8   )rA   r.   r   r   r   r-   #  s   zExecutor.run_appc                 K   s$   | j |||d | jdi | dS )z
        Start bot in webhook mode

        :param webhook_path:
        :param request_handler:
        :param route_name: Name of webhook handler route
        :param kwargs:
        :return:
        )r*   rp   r(   Nr   r,   )rA   r*   rp   r(   r.   r   r   r   r/   &  rs   zExecutor.start_webhookr   r   r!   c              
   C   s   |    t }zEz||   || jj|||||d |  W n t	t
fy/   Y nw W ||   td dS W ||   td dS ||   td w )zg
        Start bot in long-polling mode

        :param reset_webhook:
        :param timeout:
        r#   Goodbye!N)r[   rE   rF   rq   _startup_pollingcreate_taskr%   r$   run_foreverKeyboardInterrupt
SystemExit_shutdown_pollingr   warning)rA   r   r   r   r    r!   r   r   r   r   r$   4  s&   zExecutor.start_pollingc              
   C   s   |    d| _| j}z>z||   ||}W n ttfy*   d}|  Y nw W ||   t	
d |S W ||   t	
d |S ||   t	
d w )z
        Execute Future.

        Return the Future's result, or raise its exception.

        :param future:
        :return:
        TNrt   )rO   r=   r   rq   ru   rx   ry   stoprz   r   r{   )rA   r1   r   resultr   r   r   r0   K  s(   	

zExecutor.startc                    s2   | j dI d H  | j  I d H  td d S )NTz"Updates were skipped successfully.)r%   r   r   r   r{   rG   r   r   r   _skip_updatesc  s   zExecutor._skip_updatesc                    s2   | j jjI d H }td|j d|j d d S )NzBot: z [@])r%   r@   mer   info	full_nameusername)rA   userr   r   r   _welcomeh  s    zExecutor._welcomec                    sT   | j   | j j I d H  | j j I d H  | j j I d H }| I d H  d S r   )r%   stop_pollingstorageclosewait_closedr@   get_session)rA   sessionr   r   r   	_shutdownl  s   
zExecutor._shutdownc                    sD   |   I d H  | jr|  I d H  | jD ]
}|| jI d H  qd S r   )r   r   r~   r:   r%   )rA   rL   r   r   r   ru   s  s   
zExecutor._startup_pollingc                    H   | j D ]
}|| jI d H  q|  I d H  |r"| j I d H  d S d S r   )r<   r%   r   r   rA   r   rL   r   r   r   rz   {     
zExecutor._shutdown_pollingc                    r   r   )r;   r%   r   r   r   r   r   r   ra     r   zExecutor._shutdown_webhookc                    s,   |   I d H  | jr|  I d H  d S d S r   )r   r   r~   rG   r   r   r   rr     s
   zExecutor._startup_webhook)NFNN)TT)Nr   r   TN)F)&__name__
__module____qualname____doc__rB   propertyrE   AbstractEventLoopr   rH   r   r	   rJ   r)   callabler   r   rO   r[   r   r   ro   r   strr   r+   r-   r/   r   r$   r0   r~   r   r   ru   rz   ra   rr   r   r   r   r   r      sJ    

)




		)NN)r   r   )#rE   rj   rg   r5   typingr   r   r   r   r   warningsr   aiohttpr   aiohttp.web_appr	   bot.apir   dispatcher.dispatcherr   dispatcher.webhookr   r   r   ri   r   r   r$   r   boolintr+   r/   r0   r   r   r   r   r   <module>   s\    




