Ë
    çObjØ)  ã                   óœ  — 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     €€úQ/var/www/html/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Ò7úr(   )r%   r	   r'   Úappendr+   )r   r   r   r'   r+   r%   s    `   @r&   Úsetup_applicationr-      s†   ù€ ð Ø ñð ×
"Ñ
"ðð ð	€Mð7œSð 7¬ð 7°ö 7ð8œcð 8¬ð 8°ö 8ð ‡N�N×Ñ˜*Ô%Ø‡O�O×Ñ˜;Õ'ó    Ú	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Ð/Ó@Ðˆ˜Ø˜m¨yÐ8Ð8Ð8ô œ G×$5Ñ$5Ó6×EÑEÀjÓQÐQ€yÐQØ‰ˆˆaØ�T˜YÐ&Ð&Ð&ð 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ÙÜ�O‰O×#Ñ#Ð$RÐT^Ô_Ü×&Ñ&Ó(Ð(Ù˜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ˆÔ!ØˆŒ	ÜEHÃUˆÕ*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Øˆ�
‰
×Ñ˜V T¨4¯;©;ÑA¸&ÓAr.   r   r   c              �   ó@   K  — | j                  «       ƒ d {  –—†  y 7 Œ­w©N)Úclose)rS   r   r   s      r&   rX   z BaseRequestHandler._handle_closeu   s   è ø€ Ø�j‰j‹l×Òú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   è ø€ Ø6�t—‘×6Ñ6Ð[¸3ÀvÑ[ÐQU×QZÑQZÑ[×[ˆÜ�fœnÔ-Ø—/‘/×5Ñ5¸#ÀfÐ5ÓM×MÑMð .ð \øàMús!   ‚-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œ   è ø€ Ü"×.Ñ.Ø×(Ñ(ØØ$Ÿ\™\°·±×0FÑ0F˜\Ó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‰JˆC�Ø—K‘K×-Ñ-¨e¸ÀEÐ-ÓJˆEÙØØ—m‘m EÓ*ˆGØ×+Ñ+¨K¸cÐ+ÕBð	Cð  Ÿ+™+›-ò 	‰JˆC�Ø—m‘m E§J¡J¨s£OÓ4ˆGØ×+Ñ+ØØØŸ™Ò.¨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   è ø€ Ø3V°4·?±?×3VÑ3VØØ—,‘, S§[¡[×%;Ñ%;�,Ó<×<ñ4
ð �i‰iñ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Ñ"5Ð6WÐY[Ó"\Ð^aÔbÜ—<‘< ^¸CÔ@Ð@Ø×$Ò$Ø×8Ñ8¸SÈ'Ð8ÓR×RÐRØ×)Ñ)¨c¸7Ð)ÓC×CÐCð .øð SøØCús4   ‚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¸dÀ3ÈÀ8¹nð NÐQUó Nð
	C°Cð 	CÀ#Ç+Á+ð 	CÐRU×R^ÑR^ó 	Cð#àð#ð ˜|Ñ,¨tÑ3ð#ð 
ó	#ðJV¨ð V°s·{±{ð VÀsÇ|Á|ó VðD C§K¡Kð D°C·L±Ló 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-   ø€ ô  	‰ÑÐb JÐEYÑ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(   € Ø×ÒÜ×)Ñ)Ð*?À×ARÑARÓ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$   è ø€ ð �h‰h×Ñ×$Ñ$Ó&×&Ò&ús   ‚(2ª0«2r0   c              ƒ   ó"   K  — | j                   S ­wr^   )rg   rd   s     r&   re   z SimpleRequestHandler.resolve_botó   s   è ø€ Ø�x‰xˆùs   ‚©TNr¢   )r£   r¤   r¥   r   r   r¦   r§   r	   rT   rj   r_   r   rJ   re   Ú__classcell__©r°   s   @r&   r«   r«   Ó   s„   ø„ ð
 &*Ø#'ñ)àð)ð ð)ð #ð	)ð
 ˜D‘jð)ð ð)ð 
õ)ð(°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   ø€ ô* 	‰ÑÐb JÐEYÑ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;   è ø€ Ø—9‘9×#Ñ#Ó%ò 	&ˆ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“/Ð!Ü‰Ñ˜Ñ2 4Ð2¨6Ó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°$×2CÑ2CÑDˆD�I‰I�eÑØ�y‰y˜ÑÐù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 ˜8‘n tÑ+ð	'ð
 ð'ð 
õ'ð6°3ð ¸Sð ÀTó ó&ð3°#ð 3˜Kð 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.   