Ë
    ö­¦jn6  ã                  ó6  — 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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mZmZmZmZ erd d	lm Z m!Z!  ed
ee«      Z" ed«      Z# G d„ deee"   «      Z$dd„Z% G d„ de$e   «      Z& G d„ de$e   «      Z'y)é    )Úannotations)ÚABC)Údeepcopy)Úchain)Úcycle)ÚTYPE_CHECKINGÚAnyÚGenericÚTypeVarÚcast)ÚCallbackData)ÚCallbackGameÚCopyTextButtonÚInlineKeyboardButtonÚInlineKeyboardMarkupÚKeyboardButtonÚKeyboardButtonPollTypeÚKeyboardButtonRequestChatÚKeyboardButtonRequestUsersÚLoginUrlÚReplyKeyboardMarkupÚSwitchInlineQueryChosenChatÚ
WebAppInfo)Ú	GeneratorÚIterableÚ
ButtonTypeÚTc                  óÐ   — e Zd ZU dZdZded<   dZded<   dZded<   	 d	 	 	 	 	 dd„Ze	dd	„«       Z
dd
„Zdd„Zdd„Zdd„Zd d„Zd!d„Zd"d„Zddœd#d„Zddœd$d„Zd%d„Zd&d„Zd'd„Zy)(ÚKeyboardBuilderz¡
    Generic keyboard builder that helps to adjust your markup with defined shape of lines.

    Works both of InlineKeyboardMarkup and ReplyKeyboardMarkup.
    r   ÚintÚ	max_widthÚ	min_widthÚmax_buttonsNc                ó¨   — t        |t        t        f«      sd|› d�}t        |«      ‚|| _        |r| j                  |«       || _        y g }|| _        y )NzButton type z are not allowed here)Ú
issubclassr   r   Ú
ValueErrorÚ_button_typeÚ_validate_markupÚ_markup)ÚselfÚbutton_typeÚmarkupÚmsgs       úI/var/www/html/venv/lib/python3.12/site-packages/aiogram/utils/keyboard.pyÚ__init__zKeyboardBuilder.__init__+   s]   € ô
 ˜+Ô(<¼nÐ'MÔNØ   Ð-BÐCˆCÜ˜S“/Ð!Ø.9ˆÔÙØ×!Ñ! &Ô)ð 06ˆ�ð ˆFØ/5ˆ�ó    c              #  óf   K  — t        j                  | j                  «       «      E d{  –—†  y7 Œ­w)zB
        Get flatten set of all buttons

        :return:
        N)r   Úfrom_iterableÚexport©r*   s    r.   ÚbuttonszKeyboardBuilder.buttons:   s"   è ø€ ô ×&Ñ& t§{¡{£}Ó5×5Ò5ús   ‚'1©/ª1c                ó˜   — | j                   }t        ||«      s2|›d|j                  ›dt        |«      j                  ›�}t	        |«      ‚y)zb
        Check that button item has correct type

        :param button:
        :return:
        z should be type z not T)r'   Ú
isinstanceÚ__name__Útyper&   )r*   ÚbuttonÚallowedr-   s       r.   Ú_validate_buttonz KeyboardBuilder._validate_buttonC   sO   € ð ×#Ñ#ˆÜ˜& 'Ô*Ø�JÐ.¨w×/?Ñ/?Ð.BÀ%ÌÈVË×H]ÑH]ÐG`ÐaˆCÜ˜S“/Ð!Ør0   c                ó@   — t        t        | j                  |«      «      S )zi
        Check that all passed button has correct type

        :param buttons:
        :return:
        )ÚallÚmapr<   )r*   r5   s     r.   Ú_validate_buttonsz!KeyboardBuilder._validate_buttonsP   s   € ô ”3�t×,Ñ,¨gÓ6Ó7Ð7r0   c                ó(  — t        |t        «      s=d|›d| j                  j                  › dt	        |«      j                  › �}t        |«      ‚t        |«      | j                  kD  rd|›d| j                  › d�}t        |«      ‚ | j                  |Ž  y)z­
        Check that row of buttons are correct
        Row can be only list of allowed button types and has length 0 <= n <= 8

        :param row:
        :return:
        zRow z should be type 'list[z]' not type z is too long (max width: ú)T)	r7   Úlistr'   r8   r9   r&   Úlenr!   r@   )r*   Úrowr-   s      r.   Ú_validate_rowzKeyboardBuilder._validate_rowY   sœ   € ô ˜#œtÔ$à�s�gÐ3°D×4EÑ4E×4NÑ4NÐ3Oð PÜ  ›I×.Ñ.Ð/ð1ð ô ˜S“/Ð!Üˆs‹8�d—n‘nÒ$Ø˜˜Ð8¸¿¹Ð8HÈÐJˆCÜ˜S“/Ð!Øˆ×Ñ Ñ$Ør0   c                ó:  — d}t        |t        «      s:d| j                  j                  › dt	        |«      j                  ›�}t        |«      ‚|D ]!  }| j                  |«       |t        |«      z  }Œ# || j                  kD  rd| j                  › �}t        |«      ‚y)z™
        Check that passed markup has correct data structure
        Markup is list of lists of buttons

        :param markup:
        :return:
        r   z!Markup should be type 'list[list[z]]' not type z.Too much buttons detected Max allowed count - T)	r7   rC   r'   r8   r9   r&   rF   rD   r#   )r*   r,   Úcountr-   rE   s        r.   r(   z KeyboardBuilder._validate_markupm   s®   € ð ˆÜ˜&¤$Ô'à3°D×4EÑ4E×4NÑ4NÐ3Oð PÜ  ›L×1Ñ1Ð4ð6ð ô ˜S“/Ð!Øò 	ˆCØ×Ñ˜sÔ#Ø”S˜“XÑ‰Eð	ð �4×#Ñ#Ò#ØBÀ4×CSÑCSÐBTÐUˆCÜ˜S“/Ð!Ør0   c                óà   — t        |t        «      sd}t        |«      ‚|t        | j                  | j
                  dz   «      vr+d|› d| j                  › d| j
                  › d�}t        |«      ‚|S )z[
        Validate that passed size is legit

        :param size:
        :return:
        zOnly int sizes are allowedé   z	Row size z is not allowed, range: [z, ú])r7   r    r&   Úranger"   r!   )r*   Úsizer-   s      r.   Ú_validate_sizezKeyboardBuilder._validate_size„   sn   € ô ˜$¤Ô$Ø.ˆCÜ˜S“/Ð!Ø”u˜TŸ^™^¨T¯^©^¸aÑ-?Ó@Ñ@Ø˜d˜VÐ#<¸T¿^¹^Ð<LÈBÈtÏ~É~ÐN^Ð^_Ð`ˆCÜ˜S“/Ð!Øˆr0   c                ó,   — t        | j                  «      S )aB  
        Export configured markup as list of lists of buttons

        .. code-block:: python

            >>> builder = KeyboardBuilder(button_type=InlineKeyboardButton)
            >>> ... # Add buttons to builder
            >>> markup = InlineKeyboardMarkup(inline_keyboard=builder.export())

        :return:
        )r   r)   r4   s    r.   r3   zKeyboardBuilder.export“   s   € ô ˜Ÿ™Ó%Ð%r0   c                óÊ  —  | j                   |Ž  | j                  «       }|rSt        |d   «      | j                  k  r8|d   }| j                  t        |«      z
  }|d| ||d }}|j	                  |«       | j                  dkD  r>|rV|d| j                   || j                  d }}|j                  t        |«      «       |rŒ;n|j                  t        |«      «       || _        | S )z^
        Add one or many buttons to markup.

        :param buttons:
        :return:
        éÿÿÿÿNr   )r@   r3   rD   r!   ÚextendÚappendrC   r)   )r*   r5   r,   Úlast_rowÚposÚheadrE   s          r.   ÚaddzKeyboardBuilder.add¡   sØ   € ð 	ˆ×Ñ Ñ(Ø—‘“ˆñ ”c˜& ™*“o¨¯©Ò6Ø˜b‘zˆHØ—.‘.¤3 x£=Ñ0ˆCØ# D S˜M¨7°3°4¨=�'ˆDØ�O‰O˜DÔ!ð �>‰>˜AÒÙØ&Ð'7¨¯©Ð8¸'À$Ç.Á.ÐBRÐ:S�W�Ø—‘œd 3›iÔ(ó ð �M‰Mœ$˜w›-Ô(àˆŒØˆr0   )Úwidthc          	     óØ   ‡‡— ‰€| j                   Š| j                  ‰«        | j                  ‰Ž  | j                  j	                  ˆˆfd„t        dt        ‰«      ‰«      D «       «       | S )z®
        Add row to markup

        When too much buttons is passed it will be separated to many rows

        :param buttons:
        :param width:
        :return:
        c              3  ó@   •K  — | ]  }t        ‰||‰z    «      –— Œ y ­w©N)rC   )Ú.0rU   r5   rX   s     €€r.   ú	<genexpr>z&KeyboardBuilder.row.<locals>.<genexpr>Ì   s&   øè ø€ ò 
Ø14ŒD�˜˜s U™{Ð+×,ñ
ùs   ƒr   )r!   rN   r@   r)   rR   rL   rD   )r*   rX   r5   s    ``r.   rE   zKeyboardBuilder.row½   sd   ù€ ð ˆ=Ø—N‘NˆEà×Ñ˜EÔ"Øˆ×Ñ Ñ(Ø�‰×Ñô 
Ü8=¸aÄÀWÃÈuÓ8Uô
ô 	
ð ˆr0   F)Úrepeatc               ón  — |s| j                   f}t        | j                  |«      }|rt        |«      n
t	        |«      }t        |«      }g }g }| j                  D ]?  }t        |«      |k\  r|j                  |«       t        |«      }g }|j                  |«       ŒA |r|j                  |«       || _	        | S )a‰  
        Adjust previously added buttons to specific row sizes.

        By default, when the sum of passed sizes is lower than buttons count the last
        one size will be used for tail of the markup.
        If repeat=True is passed - all sizes will be cycled when available more buttons
        count than all sizes

        :param sizes:
        :param repeat:
        :return:
        )
r!   r?   rN   Ú
repeat_allÚrepeat_lastÚnextr5   rD   rS   r)   )	r*   r^   ÚsizesÚvalidated_sizesÚ
sizes_iterrM   r,   rE   r:   s	            r.   ÚadjustzKeyboardBuilder.adjustÑ   s¯   € ñ Ø—^‘^Ð%ˆEä˜d×1Ñ1°5Ó9ˆÙ4:”Z Ô0ÄÈOÓ@\ˆ
Ü�JÓˆàˆØ "ˆØ—l‘lò 	ˆFÜ�3‹x˜4ÒØ—‘˜cÔ"Ü˜JÓ'�Ø�Ø�J‰J�vÕð	ñ Ø�M‰M˜#ÔØˆŒØˆr0   c                ó°   — t        |j                  d«      x}t        «      r|j                  «       |d<    | j                  di |¤Ž}| j                  |«      S )zO
        Add button to markup

        :param kwargs:
        :return:
        Úcallback_data© )r7   Úgetr   Úpackr'   rW   )r*   Úkwargsrh   r:   s       r.   Ú_buttonzKeyboardBuilder._buttonò   sS   € ô  v§z¡z°/Ó'BÐB�mÄLÔQØ&3×&8Ñ&8Ó&:ˆF�?Ñ#Ø"�×"Ñ"Ñ, VÑ,ˆØ�x‰x˜ÓÐr0   c                ó  — | j                   t        u r9t        t        t        t              | j	                  «       «      }t        dd|i|¤ŽS t        t        t        t              | j	                  «       «      }t        |¬«      S )NÚkeyboard©Úinline_keyboardri   )r'   r   r   rC   r3   r   r   r   )r*   rl   ro   rq   s       r.   Ú	as_markupzKeyboardBuilder.as_markupþ   sg   € Ø×Ñ¤Ñ.ÜœD¤¤nÑ!5Ñ6¸¿¹»ÓFˆHÜ&ÑC°ÐC¸FÑCÐCÜœt¤DÔ)=Ñ$>Ñ?ÀÇÁÃÓOˆÜ#°OÔDÐDr0   c                ód  — t        |t        «      s#dt        |«      j                  › �}t	        |«      ‚|j
                  | j
                  ur;d| j
                  j                  › d|j
                  j                  › �}t	        |«      ‚| j                  j                  |j                  «       «       | S )Nz*Only KeyboardBuilder can be attached, not z9Only builders with same button type can be attached, not z and )	r7   r   r9   r8   r&   r'   r)   rR   r3   )r*   Úbuilderr-   s      r.   ÚattachzKeyboardBuilder.attach  s    € Ü˜'¤?Ô3Ø>¼tÀG»}×?UÑ?UÐ>VÐWˆCÜ˜S“/Ð!Ø×Ñ t×'8Ñ'8Ñ8ðØ×(Ñ(×1Ñ1Ð2°%¸×8LÑ8L×8UÑ8UÐ7VðXð ô ˜S“/Ð!Ø�‰×Ñ˜GŸN™NÓ,Ô-Øˆr0   r[   )r+   ztype[ButtonType]r,   zlist[list[ButtonType]] | NoneÚreturnÚNone)rv   z!Generator[ButtonType, None, None])r:   r   rv   Úbool)r5   r   rv   rx   )rE   zlist[ButtonType]rv   rx   )r,   úlist[list[ButtonType]]rv   rx   )rM   r	   rv   r    )rv   ry   )r5   r   rv   úKeyboardBuilder[ButtonType])r5   r   rX   z
int | Nonerv   rz   )rc   r    r^   rx   rv   rz   )rl   r	   rv   rz   )rl   r	   rv   z*InlineKeyboardMarkup | ReplyKeyboardMarkup)rt   rz   rv   rz   )r8   Ú
__module__Ú__qualname__Ú__doc__r!   Ú__annotations__r"   r#   r/   Úpropertyr5   r<   r@   rF   r(   rN   r3   rW   rE   rf   rm   rr   ru   ri   r0   r.   r   r       sª   … ñð €IˆsÓØ€IˆsÓØ€K�Óð
 15ð6à%ð6ð .ð6ð 
ó	6ð ò6ó ð6óó8óó(ó.ó&óð8 =Aõ ð( 27õ óB
 óEôr0   r   c              #  ó¬   K  — t        | «      }	 t        |«      }|–— d}	 |s	 t        |«      }|–— Œ# t        $ r Y y w xY w# t        $ r d}Y Œ!w xY w­w)NFT)Úiterrb   ÚStopIteration)ÚitemsÚ
items_iterÚvalueÚfinisheds       r.   ra   ra     ss   è ø€ Ü�e“€JðÜ�ZÓ ˆð ‚KØ€HØ
Ùð Ü˜ZÓ(�ð Šð øô ò áðûô !ò  Ø’ð üsE   ‚A�4 š	A¤A ¯A´	A ½A¿A Á AÁAÁAÁAÁAc                  óâ   ‡ — e Zd ZU dZdZded<   dZded<   dZded<   d	d	d	d	d	d	d	d	d	d	d	d	d
œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdˆ fd„Z	ddˆ fd„Z
dd„Ze	 	 	 	 	 	 dd„«       Zˆ xZS )ÚInlineKeyboardBuilderzK
    Inline keyboard builder inherits all methods from generic builder
    é   r    r!   rJ   r"   éd   r#   N)Úicon_custom_emoji_idÚstyleÚurlrh   Úweb_appÚ	login_urlÚswitch_inline_queryÚ switch_inline_query_current_chatÚswitch_inline_query_chosen_chatÚ	copy_textÚcallback_gameÚpayc               ó^   — t        t         | j                  d|||||||||	|
|||dœ|¤Ž«      S )N)Útextr‹   rŒ   r�   rh   rŽ   r�   r�   r‘   r’   r“   r”   r•   ri   )r   rˆ   rm   )r*   r—   r‹   rŒ   r�   rh   rŽ   r�   r�   r‘   r’   r“   r”   r•   rl   s                  r.   r:   zInlineKeyboardBuilder.button.  sX   € ô$ Ü!ØˆD�L‰Lð ØØ%9ØØØ+ØØ#Ø$7Ø1QØ0OØ#Ø+Øñð ñó
ð 	
r0   c                ó>   •— t        t        t        ‰| �  di |¤Ž«      S )z!Construct an InlineKeyboardMarkupri   )r   r   Úsuperrr   ©r*   rl   Ú	__class__s     €r.   rr   zInlineKeyboardBuilder.as_markupT  s   ø€ äÔ(¬%©'Ñ*;Ñ*E¸fÑ*EÓFÐFr0   c                ó0   •— t         ‰| �  t        |¬«       y ©N)r+   r,   )r™   r/   r   ©r*   r,   r›   s     €r.   r/   zInlineKeyboardBuilder.__init__X  s   ø€ Ü‰ÑÔ%9À&ÐÕIr0   c                ó6   — t        | j                  «       ¬«      S ©zQ
        Make full copy of current builder with markup

        :return:
        ©r,   )rˆ   r3   r4   s    r.   ÚcopyzInlineKeyboardBuilder.copy[  s   € ô %¨D¯K©K«MÔ:Ð:r0   c                ó(   —  | |j                   ¬«      S ©z^
        Create builder from existing markup

        :param markup:
        :return:
        r¡   rp   ©Úclsr,   s     r.   Úfrom_markupz!InlineKeyboardBuilder.from_markupc  s   € ñ ˜&×0Ñ0Ô1Ð1r0   )r—   Ústrr‹   ú
str | NonerŒ   r©   r�   r©   rh   zstr | CallbackData | NonerŽ   úWebAppInfo | Noner�   zLoginUrl | Noner�   r©   r‘   r©   r’   z"SwitchInlineQueryChosenChat | Noner“   zCopyTextButton | Noner”   zCallbackGame | Noner•   úbool | Nonerl   r	   rv   rˆ   )rl   r	   rv   r   r[   )r,   z'list[list[InlineKeyboardButton]] | Nonerv   rw   )r*   rˆ   rv   rˆ   )r¦   ztype[InlineKeyboardBuilder]r,   r   rv   rˆ   ©r8   r{   r|   r}   r!   r~   r"   r#   r:   rr   r/   r¢   Úclassmethodr§   Ú__classcell__©r›   s   @r.   rˆ   rˆ   %  s*  ø… ñð €IˆsÓØ€IˆsÓØ€K�Óð ,0Ø ØØ37Ø%)Ø%)Ø*.Ø7;ØNRØ+/Ø-1Øñ$
ð ð$
ð )ð	$
ð
 ð$
ð ð$
ð 1ð$
ð #ð$
ð #ð$
ð (ð$
ð +5ð$
ð *Lð$
ð )ð$
ð +ð$
ð ð$
ð  ð!$
ð" 
ó#$
õLGöJó;ð ð
2Ø(ð
2à$ð
2ð 
ò
2ó ô
2r0   rˆ   c            	      ó¾   ‡ — e Zd ZU dZdZded<   dZded<   dZded<   d	d	d	d	d	d	d	d	d
œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdˆ fd„Z	ddˆ fd„Z
dd„Zedd„«       Zˆ xZS )ÚReplyKeyboardBuilderzJ
    Reply keyboard builder inherits all methods from generic builder
    é
   r    r!   rJ   r"   i,  r#   N)r‹   rŒ   Úrequest_usersÚrequest_chatÚrequest_contactÚrequest_locationÚrequest_pollrŽ   c       	        óV   — t        t         | j                  d|||||||||	dœ	|
¤Ž«      S )N)	r—   r‹   rŒ   r³   r´   rµ   r¶   r·   rŽ   ri   )r   r±   rm   )r*   r—   r‹   rŒ   r³   r´   rµ   r¶   r·   rŽ   rl   s              r.   r:   zReplyKeyboardBuilder.buttonz  sL   € ô Ü ØˆD�L‰Lð ØØ%9ØØ+Ø)Ø /Ø!1Ø)Øñð ñó
ð 	
r0   c                ó>   •— t        t        t        ‰| �  di |¤Ž«      S )zConstruct a ReplyKeyboardMarkupri   )r   r   r™   rr   rš   s     €r.   rr   zReplyKeyboardBuilder.as_markup˜  s   ø€ äÔ'¬©Ñ):Ñ)D¸VÑ)DÓEÐEr0   c                ó0   •— t         ‰| �  t        |¬«       y r�   )r™   r/   r   rž   s     €r.   r/   zReplyKeyboardBuilder.__init__œ  s   ø€ Ü‰Ñ¤^¸FÐÕCr0   c                ó6   — t        | j                  «       ¬«      S r    )r±   r3   r4   s    r.   r¢   zReplyKeyboardBuilder.copyŸ  s   € ô $¨4¯;©;«=Ô9Ð9r0   c                ó(   —  | |j                   ¬«      S r¤   )ro   r¥   s     r.   r§   z ReplyKeyboardBuilder.from_markup§  s   € ñ ˜&Ÿ/™/Ô*Ð*r0   )r—   r¨   r‹   r©   rŒ   r©   r³   z!KeyboardButtonRequestUsers | Noner´   z KeyboardButtonRequestChat | Nonerµ   r«   r¶   r«   r·   zKeyboardButtonPollType | NonerŽ   rª   rl   r	   rv   r±   )rl   r	   rv   r   r[   )r,   z!list[list[KeyboardButton]] | Nonerv   rw   )r*   r±   rv   r±   )r,   r   rv   r±   r¬   r¯   s   @r.   r±   r±   q  sÚ   ø… ñð €IˆsÓØ€IˆsÓØ€K�Óð ,0Ø Ø;?Ø9=Ø'+Ø(,Ø6:Ø%)ñ
ð ð
ð )ð	
ð
 ð
ð 9ð
ð 7ð
ð %ð
ð &ð
ð 4ð
ð #ð
ð ð
ð 
ó
õ<FöDó:ð ò+ó ô+r0   r±   N)rƒ   zIterable[T]rv   zGenerator[T, None, None])(Ú
__future__r   Úabcr   r¢   r   Ú	itertoolsr   r   r`   Útypingr   r	   r
   r   r   Úaiogram.filters.callback_datar   Úaiogram.typesr   r   r   r   r   r   r   r   r   r   r   r   Úcollections.abcr   r   r   r   r   ra   rˆ   r±   ri   r0   r.   ú<module>rÄ      s’   ðÝ "å Ý Ý Ý )ß =Õ =å 6÷÷ ÷ ó ñ ß3á�\Ð#7¸ÓH€
ÙˆCƒL€ôp�c˜7 :Ñ.ô pófô$I2˜OÐ,@ÑAô I2ôX>+˜?¨>Ñ:õ >+r0   