
    dh)                        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m	Z	m
Z
mZ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# d dl$m%Z% dedededdfdZ&de%dejN                  dee(e)f   fdZ*de%de	ejN                  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)Any	AwaitableCallableDictOptionalSetTuplecast)JsonPayloadMultipartWriterPayloadweb)Handler)Application)
middleware)Bot
Dispatcherloggers)TelegramMethod)TelegramType)	InputFile)IPFilter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     X/var/www/netwell/bot/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_applicationr0      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)r5   F)headersgetsplitr   r   	transportget_extra_info)r2   r3   forwarded_for_	peer_namehosts         r)   check_iprC   -   s    ++,=rBB}B *//a/@my888 G$5$56EEjQQyQaTY&&& r1   c                 ^     t         dt        j                  dt        dt        f fd       }|S )z)

    :param ip_filter:
    :return:
    r3   handlerr   c                    K   t        |       \  }}|s4t        j                  j                  d|       t	        j
                          ||        d {   S 7 w)N)r2   r3   z,Blocking request from an unauthorized IP: %s)rC   r   webhookwarningr   HTTPUnauthorized)r3   rE   
ip_addressacceptr2   s       r)   _ip_filter_middlewarez3ip_filter_middleware.<locals>._ip_filter_middlewareH   sQ     %	7K
FOO##$RT^_&&((W%%%%s   AAAA)r   r   Requestr   r   )r2   rL   s   ` r)   ip_filter_middlewarerN   ?   s8     &S[[ &7 &s & & ! r1   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e      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   rQ   rR   set_background_feed_update_tasks)selfr   rQ   rR   s       r)   __init__zBaseRequestHandler.__init__T   s$     %$8!	EHU*r1   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)rV   r   rX   r   s       r)   registerzBaseRequestHandler.registerg   s=     	t112

VT4;;A&Ar1   r!   r"   c                 @   K   | j                          d {    y 7 wN)close)rV   r!   r"   s      r)   r[   z BaseRequestHandler._handle_closer   s     jjls   c                    K   y wra   r%   rV   s    r)   rb   zBaseRequestHandler.closeu   s	        r3   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%   rV   r3   s     r)   resolve_botzBaseRequestHandler.resolve_boty   s      	re   telegram_secret_tokenbotc                      y ra   r%   rV   ri   rj   s      r)   verify_secretz BaseRequestHandler.verify_secret   s    r1   updatec                    K    | j                   j                  d||d| j                   d {   }t        |t              r&| j                   j                  ||       d {    y y 7 ;7 w)Nrj   rn   rj   resultr%   )r   feed_raw_updaterR   
isinstancer   silent_call_request)rV   rj   rn   rr   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loadsrp   )dumps)asynciocreate_taskrv   jsonsession
json_loadsrU   addadd_done_callbackdiscardr   json_response
json_dumps)rV   rj   r3   feed_update_tasks       r)   _handle_request_backgroundz-BaseRequestHandler._handle_request_background   s     "..((gll9O9Ol&P P ) 

 	**../?@**4+M+M+U+UV  3;;+A+ABB !Qs   ACC A9Crr   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)rj   files)r   filename)r   r   secretstoken_urlsafer/   __api_method__set_content_disposition
model_dumpitemsr~   prepare_valuereadr   )rV   rj   rr   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 , 	 r1   c                   K    | j                   j                  ||j                  |j                  j                         d {   fi | j
                   d {   }t        j                  | j                  ||            S 7 B7 -w)Nrx   rq   )body)	r   feed_webhook_updater}   r~   r   rR   r   Responser   )rV   rj   r3   rr   s       r)   _handle_requestz"BaseRequestHandler._handle_request   sy     6Ydoo6Y6Y,,S[[%;%;,<<7
 ii7
 1

 ||!<!<V!<!TUU =1
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-Tokenr5   Unauthorizedi  )r   status)rj   r3   )	rh   rm   r:   r;   r   r   rQ   r   r   )rV   r3   rj   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   rW   strr   r_   r[   r   rb   r   rM   r   rh   rm   r	   rv   r   r   r
   r   r   r   r   r   r^   __call__r%   r1   r)   rP   rP   S   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!! ()E F!	!FV Vs{{ Vs|| VDCKK DCLL D Hr1   rP   c                        e Zd Z	 	 ddedededee   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   rj   rQ   secret_tokenrR   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   rQ   Nr%   )superrW   rj   r   )rV   r   rj   rQ   r   rR   	__class__s         r)   rW   zSimpleRequestHandler.__init__   s-      	bJEYb]ab(r1   ri   c                 \    | j                   r t        j                  || j                         S yNT)r   r   compare_digestrl   s      r)   rm   z"SimpleRequestHandler.verify_secret   s(    ))*?ARARSSr1   c                 h   K   | j                   j                  j                          d{    y7 w)z#
        Close bot session
        N)rj   r~   rb   rd   s    r)   rb   zSimpleRequestHandler.close   s$      hh$$&&&s   (202r3   c                 "   K   | j                   S wra   )rj   rg   s     r)   rh   z SimpleRequestHandler.resolve_bot   s     xxs   TNr   )r   r   r   r   r   r   r
   r   r   rW   rm   rb   r   rM   rh   __classcell__r   s   @r)   r   r      s    
 &*&*)) ) #	)
 sm) ) 
)(3 S T 
'  r1   r   c                        e Zd Z	 	 ddededeeeef      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   rQ   bot_settingsrR   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   rW   r   bots)rV   r   rQ   r   rR   r   s        r)   rW   z!TokenBasedRequestHandler.__init__   s8    * 	bJEYb]abL($&	r1   ri   rj   c                      yr   r%   rl   s      r)   rm   z&TokenBasedRequestHandler.verify_secret  s    r1   c                    K   | j                   j                         D ]$  }|j                  j                          d {    & y 7 wra   )r   valuesr~   rb   )rV   rj   s     r)   rb   zTokenBasedRequestHandler.close  s;     99##% 	&C++##%%%	&%s   ;AAArX   r   r   c                H    d|vrt        d      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}' substringrX   N)
ValueErrorr   r_   )rV   r   rX   r   r   s       r)   r_   z!TokenBasedRequestHandler.register  s0     $KLL24262r1   r3   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   )rV   r3   r   s      r)   rh   z$TokenBasedRequestHandler.resolve_bot!  sT      "";/		!"DD$2C2CDDIIeyys   AAr   r   )r   r   r   r   r   r
   r	   r   r   rW   r   rm   rb   r   r_   r   rM   rh   r   r   s   @r)   r   r      s     &*15	'' #' tCH~.	'
 ' 
'63 S T &
3# 
3K 
3 
3 
3
  
  
 r1   r   )/r{   r   abcr   r   r   typingr   r   r   r	   r
   r   r   r   aiohttpr   r   r   r   aiohttp.typedefsr   aiohttp.web_appr   aiohttp.web_middlewaresr   aiogramr   r   r   aiogram.methodsr   aiogram.methods.baser   aiogram.typesr   aiogram.webhook.securityr   r0   rM   r   r   rC   rN   rP   r   r   r%   r1   r)   <module>r      s      #  M M M > > $ ' . , , * - # -(; (J (S (UY (4 3;; 5d;K $!!s{{G$in45!(x xv!- !H9 1 9 r1   