
    G˝i)                        d dl Z d dlZd dlmZmZ d dl mZ d dlmZmZ d dl	m
Z
mZmZ d dl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mZmZ d dlmZ d dlmZ d dl m!Z! e
rd dl"m#Z# dedededdfdZ$de!dejJ                  de&e'e(f   fdZ)de!deejJ                  egee   f   fdZ* G d de      Z+ G d de+      Z, G d de+      Z-y)    N)ABCabstractmethod)	Transport)	AwaitableCallable)TYPE_CHECKINGAnycast)JsonPayloadMultipartWriterPayloadweb)Handler)Application)
middleware)Bot
Dispatcherloggers)TelegramMethod)TelegramType)IPFilter)	InputFileapp
dispatcherkwargsreturnc                    | dj                   |dt        dt        ddffd}dt        dt        ddffd}| j                  j                  |       | j                  j                  |       y)z
    This function helps to configure a startup-shutdown process

    :param app: aiohttp application
    :param dispatcher: aiogram dispatcher
    :param kwargs: additional data
    :return:
    )r   r   akwr   Nc                  F   K    j                   di  d {    y 7 wN )emit_startupr   r   r   workflow_datas     W/home/leshdev/mybot/venv/lib/python3.12/site-packages/aiogram/webhook/aiohttp_server.py
on_startupz%setup_application.<locals>.on_startup&   s      %j%%6666   !!c                  F   K    j                   di  d {    y 7 wr!   )emit_shutdownr$   s     r&   on_shutdownz&setup_application.<locals>.on_shutdown)   s      &j&&7777r(   )r%   r	   r'   appendr+   )r   r   r   r'   r+   r%   s    `   @r&   setup_applicationr-      s       
"
" 	M7S 7 7 78c 8 8 8 NN*%OO;'    	ip_filterrequestc                     |j                   j                  dd      x}r|j                  dd      ^}}||| v fS t        t        |j
                        j                  d      x}r|\  }}||| v fS y)NzX-Forwarded-For ,   )maxsplitpeername)r2   F)headersgetsplitr
   r   	transportget_extra_info)r/   r0   forwarded_for_	peer_namehosts         r&   check_ipr@   0   s    ++,=rBB}B *//a/@my888 G$5$56EEjQQyQaTY&&& r.   c                 ^     t         dt        j                  dt        dt        f fd       }|S )z)

    :param ip_filter:
    :return:
    r0   handlerr   c                    K   t        |       \  }}|s4t        j                  j                  d|       t	        j
                          ||        d {   S 7 w)N)r/   r0   z,Blocking request from an unauthorized IP: %s)r@   r   webhookwarningr   HTTPUnauthorized)r0   rB   
ip_addressacceptr/   s       r&   _ip_filter_middlewarez3ip_filter_middleware.<locals>._ip_filter_middlewareK   sQ     %	7K
FOO##$RT^_&&((W%%%%s   AAAA)r   r   Requestr   r	   )r/   rI   s   ` r&   ip_filter_middlewarerK   B   s8     &S[[ &7 &s & & ! r.   c            	          e Zd Z	 ddedededdfdZdeded	eddfd
Z	dededdfdZ
edd       Zedej                  defd       Zedededefd       Zdedeeef   ddfdZdedej                  dej(                  fdZdedee   dz  defdZdedej                  dej(                  fdZdej                  dej(                  fdZeZy)BaseRequestHandlerr   handle_in_backgrounddatar   Nc                 L    || _         || _        || _        t               | _        y)aZ  
        Base handler that helps to handle incoming request from aiohttp
        and propagate it to the Dispatcher

        :param dispatcher: instance of :class:`aiogram.dispatcher.dispatcher.Dispatcher`
        :param handle_in_background: immediately responds to the Telegram instead of
            a waiting end of a handler process
        N)r   rN   rO   set_background_feed_update_tasks)selfr   rN   rO   s       r&   __init__zBaseRequestHandler.__init__W   s$     %$8!	EHU*r.   pathr   r   c                    |j                   j                  | j                          |j                  j                  d|| j
                  fi | y)z
        Register route and shutdown callback

        :param app: instance of aiohttp Application
        :param path: route path
        :param kwargs:
        POSTN)r+   r,   _handle_closerouter	add_routehandle)rS   r   rU   r   s       r&   registerzBaseRequestHandler.registerj   s=     	t112

VT4;;A&Ar.   r   r   c                 @   K   | j                          d {    y 7 wN)close)rS   r   r   s      r&   rX   z BaseRequestHandler._handle_closeu   s     jjls   c                    K   y wr^   r"   rS   s    r&   r_   zBaseRequestHandler.closex   s	        r0   c                    K   yw)z
        This method should be implemented in subclasses of this class.

        Resolve Bot instance from request.

        :param request:
        :return: Bot instance
        Nr"   rS   r0   s     r&   resolve_botzBaseRequestHandler.resolve_bot|   s     rb   telegram_secret_tokenbotc                      y r^   r"   rS   rf   rg   s      r&   verify_secretz BaseRequestHandler.verify_secret   s    r.   updatec                    K    | j                   j                  d||d| j                   d {   }t        |t              r&| j                   j                  ||       d {    y y 7 ;7 w)Nrg   rk   rg   resultr"   )r   feed_raw_updaterO   
isinstancer   silent_call_request)rS   rg   rk   ro   s       r&   _background_feed_updatez*BaseRequestHandler._background_feed_update   sf     6t66[3v[QUQZQZ[[fn-//55#f5MMM . \Ms!   -A/A+4A/$A-%A/-A/c                   K   t        j                  | j                  ||j                  |j                  j
                         d {               }| j                  j                  |       |j                  | j                  j                         t        j                  i |j                  j                        S 7 xw)Nloadsrm   )dumps)asynciocreate_taskrs   jsonsession
json_loadsrR   addadd_done_callbackdiscardr   json_response
json_dumps)rS   rg   r0   feed_update_tasks       r&   _handle_request_backgroundz-BaseRequestHandler._handle_request_background   s     "..(($\\0F0F\GG ) 
 	**../?@**4+M+M+U+UV  3;;+A+ABB Hs   ACC A9Cro   c                 T   |st        i       S t        ddt        j                  d             }|j	                  |j
                        }|j                  dd       i }|j                  d      j                         D ]J  \  }}|j                  j                  |||	      }|s'|j	                  |      }|j                  d|       L |j                         D ]G  \  }}|j	                  |j                  |            }|j                  d||j                  xs |
       I |S )Nz	form-datawebhookBoundary   )boundarymethod)nameF)warnings)rg   files)r   filename)r   r   secretstoken_urlsafer,   __api_method__set_content_disposition
model_dumpitemsr{   prepare_valuereadr   )rS   rg   ro   writerpayloadr   keyvalues           r&   _build_response_writerz)BaseRequestHandler._build_response_writer   s/   
  r?" &w'<'<R'@&AB

 -- 5 56''('C&( ++U+;AAC 	CJCKK--eE-JEmmE*G++Kc+B	C  ++- 	JCmmEJJsO4G++.3 , 	 r.   c                   K    | j                   j                  ||j                  |j                  j                         d {   fi | j
                   d {   }t        j                  | j                  ||            S 7 B7 -w)Nru   rn   )body)	r   feed_webhook_updaterz   r{   r|   rO   r   Responser   )rS   rg   r0   ro   s       r&   _handle_requestz"BaseRequestHandler._handle_request   sy     3V4??3V3V,,S[[%;%;,<<4
 ii4
 .

 ||!<!<V!<!TUU =.
s$   AB
B
B
B,B
B
c                 R  K   | j                  |       d {   }| j                  |j                  j                  dd      |      st	        j
                  dd      S | j                  r| j                  ||       d {   S | j                  ||       d {   S 7 7 !7 w)NzX-Telegram-Bot-Api-Secret-Tokenr2   Unauthorizedi  )r   status)rg   r0   )	re   rj   r7   r8   r   r   rN   r   r   )rS   r0   rg   s      r&   r[   zBaseRequestHandler.handle   s     $$W--!!'//"5"56WY["\^ab<<^C@@$$88S'8RRR))c7)CCC . SCs4   B'B!A)B'B#B'B%B'#B'%B')Fr   N)__name__
__module____qualname__r   boolr	   rT   strr   r\   rX   r   r_   r   rJ   r   re   rj   dictrs   r   r   r   r   r   r   r   r[   __call__r"   r.   r&   rM   rM   V   s    &+KK #K 	K
 
K&	B# 	BK 	B 	B 	Bc          3 S T  N Nd38n NQU N
	CC 	C#++ 	CRUR^R^ 	C## |,t3# 
	#JV Vs{{ Vs|| VDCKK DCLL D Hr.   rM   c                        e Zd Z	 	 ddededededz  deddf fdZd	ededefd
Z	ddZ
dej                  defdZ xZS )SimpleRequestHandlerNr   rg   rN   secret_tokenrO   r   c                 F    t        |   d||d| || _        || _        y)aM  
        Handler for single Bot instance

        :param dispatcher: instance of :class:`aiogram.dispatcher.dispatcher.Dispatcher`
        :param handle_in_background: immediately responds to the Telegram instead of
            a waiting end of handler process
        :param bot: instance of :class:`aiogram.client.bot.Bot`
        r   rN   Nr"   )superrT   rg   r   )rS   r   rg   rN   r   rO   	__class__s         r&   rT   zSimpleRequestHandler.__init__   s-      	bJEYb]ab(r.   rf   c                 \    | j                   r t        j                  || j                         S yNT)r   r   compare_digestri   s      r&   rj   z"SimpleRequestHandler.verify_secret   s(    ))*?ARARSSr.   c                 h   K   | j                   j                  j                          d{    y7 w)z#
        Close bot session
        N)rg   r{   r_   ra   s    r&   r_   zSimpleRequestHandler.close   s$      hh$$&&&s   (202r0   c                 "   K   | j                   S wr^   )rg   rd   s     r&   re   z SimpleRequestHandler.resolve_bot   s     xxs   TNr   )r   r   r   r   r   r   r   r	   rT   rj   r_   r   rJ   re   __classcell__r   s   @r&   r   r      s    
 &*#')) ) #	)
 Dj) ) 
)(3 S T 
'  r.   r   c                        e Zd Z	 	 ddededeeef   dz  deddf
 fdZded	e	defd
Z
ddZdedededdf fdZdej                  de	fdZ xZS )TokenBasedRequestHandlerNr   rN   bot_settingsrO   r   c                 N    t        |   d||d| |i }|| _        i | _        y)aP  
        Handler that supports multiple bots the context will be resolved
        from path variable 'bot_token'

        .. note::

            This handler is not recommended in due to token is available in URL
            and can be logged by reverse proxy server or other middleware.

        :param dispatcher: instance of :class:`aiogram.dispatcher.dispatcher.Dispatcher`
        :param handle_in_background: immediately responds to the Telegram instead of
            a waiting end of handler process
        :param bot_settings: kwargs that will be passed to new Bot instance
        r   Nr"   )r   rT   r   bots)rS   r   rN   r   rO   r   s        r&   rT   z!TokenBasedRequestHandler.__init__   s8    * 	bJEYb]abL($&	r.   rf   rg   c                      yr   r"   ri   s      r&   rj   z&TokenBasedRequestHandler.verify_secret  s    r.   c                    K   | j                   j                         D ]$  }|j                  j                          d {    & y 7 wr^   )r   valuesr{   r_   )rS   rg   s     r&   r_   zTokenBasedRequestHandler.close  s;     99##% 	&C++##%%%	&%s   ;AAArU   r   r   c                L    d|vrd}t        |      t        |   |fd|i| y)z
        Validate path, register route and shutdown callback

        :param app: instance of aiohttp Application
        :param path: route path
        :param kwargs:
        z{bot_token}z,Path should contains '{bot_token}' substringrU   N)
ValueErrorr   r\   )rS   r   rU   r   msgr   s        r&   r\   z!TokenBasedRequestHandler.register  s3     $@CS/!24262r.   r0   c                    K   |j                   d   }|| j                  vr$t        dd|i| j                  | j                  |<   | j                  |   S w)z
        Get bot token from a path and create or get from cache Bot instance

        :param request:
        :return:
        	bot_tokentokenr"   )
match_infor   r   r   )rS   r0   r   s      r&   re   z$TokenBasedRequestHandler.resolve_bot'  sT      "";/		!"DD$2C2CDDIIeyys   AAr   r   )r   r   r   r   r   r   r   r	   rT   r   rj   r_   r   r\   r   rJ   re   r   r   s   @r&   r   r      s     &*.2	'' #' 38nt+	'
 ' 
'63 S T &3# 3K 3 3 3
  
  
 r.   r   ).rx   r   abcr   r   r   collections.abcr   r   typingr   r	   r
   aiohttpr   r   r   r   aiohttp.typedefsr   aiohttp.web_appr   aiohttp.web_middlewaresr   aiogramr   r   r   aiogram.methodsr   aiogram.methods.baser   aiogram.webhook.securityr   aiogram.typesr   r-   rJ   tupler   r   r@   rK   rM   r   r   r"   r.   r&   <module>r      s      #  / + + > > $ ' . , , * - -'(; (J (S (UY (4 3;; 5d;K $!!s{{G$in45!(z zz!- !H: 1 : r.   