
    nil(                        d dl 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ZdZe G d d	             Zd
edededz  defdZdedefdZdeddfdZdedej&                  ddfdZdedej&                  ddfdZdedej&                  ddfdZdedej&                  ddfdZdedej&                  ddfdZdedej&                  ddfdZdej&                  ddfdZy)    )	dataclassfield)Update)ChatType)ContextTypes)logger   i  c                       e Zd ZU eed<   eed<   eed<   eed<   edz  ed<    ee      Zee	eef      ed<    ee      Z
ee	eef      ed	<   d
Zeed<   y)GatherSessioninviter_name
inviter_idchat_idstatus_message_idNtime_minutes)default_factoryaccepteddeclinedFclosed)__name__
__module____qualname__str__annotations__intr   listr   tupler   r   bool     /app/bot/handlers/gather.pyr   r      sd    OL*&+D&AHd5c?#A&+D&AHd5c?#AFDr   r   user_idnameusernameNreturnc                 "    |rd| S d|  d| dS )N@z<a href="tg://user?id=z">z</a>r   )r!   r"   r#   s      r    _mentionr'      s&    8*~#G9BtfD99r   sessionc                    t        | j                        }| j                  r>|t        k\  r5dj	                  d | j                  D              }dt         dt         d| S dj	                  d | j                  D              xs d}dj	                  d | j
                  D              xs d}d	| dt         d
ddd| d| dt        | j
                         d| g}| j                  r|j                  d       dj	                  |      S )N, c              3   &   K   | ]	  \  }}|  y wNr   .0_r"   s      r    	<genexpr>z%_build_status_text.<locals>.<genexpr>"   s     A0@WQD0@   u   🎮 Party is FULL (/u   ) — GL HF! 🎉

Players: c              3   &   K   | ]	  \  }}|  y wr,   r   r-   s      r    r0   z%_build_status_text.<locals>.<genexpr>(        B1AgaT1Ar1      —c              3   &   K   | ]	  \  }}|  y wr,   r   r-   s      r    r0   z%_build_status_text.<locals>.<genexpr>)   r4   r1      🎮 Party status ()u#   /accept to join · /decline to pass z
Accepted (): z
Declined (u   
⏰ Gather closed.
)lenr   r   	PARTY_MAXjoinr   append)r(   countplayersaccepted_strdeclined_strliness         r    _build_status_textrE      s     !E~~%9,))A0@0@AA"9+Qyk :y"	

 99B1A1ABBKeL99B1A1ABBKeL
eWAi[2-

UG3|n-
S))*+3|n=E ~~+,99Ur   c                    K   	 | j                  |j                  |j                  t        |      d       d {    y 7 # t        $ r Y y w xY ww)NHTML)r   
message_idtext
parse_mode)edit_message_textr   r   rE   	Exception)botr(   s     r    _edit_statusrN   6   sV     ##OO00#G,	 $ 
 	
 	
  s5   A5A ?A AA 	A
AAAupdatecontextc                    K   | j                   }|r|j                  ry |j                  d   }|j                  | j                  j
                  |j
                  |j                  |j                         y w)Nstore)effective_useris_botbot_datarecord_membereffective_chatidr#   
first_name)rO   rP   userrR   s       r    track_memberr[   B   sY       D4;;W%E	--00$''4==$//Zs   A2A4c                   K   | j                   }|sy |j                  j                  }|j                  ry |j                  j
                  }|j                  d   }|j                  j                  }|dv r3|j                  ||j
                  |j                  |j                         y |dv r|j                  ||j
                         y y w)NrR   )memberadministratorcreator)leftkicked
restricted)chat_membernew_chat_memberrZ   rT   chatrX   rU   statusrV   r#   rY   remove_member)rO   rP   rc   rZ   r   rR   rf   s          r    on_chat_member_updaterh   K   s     $$K&&++D{{!!GW%E((//F77GTWWdmmT__M	3	3GTWW- 
4s   CC	c           	        K   | j                   }| j                  }|j                  t        j                  k(  r$| j
                  j                  d       d {    y |j                  d   }|j                  |j                  |j                  |j                  |j                         |j                  d   }|j                  |v r=||j                     j                  s$| j
                  j                  d       d {    y d }|j                  r2	 t        |j                  d         }d|cxk  r
dk  st         t        	 |j!                  |j                        D cg c]  }|j"                  |j                  k7  s|  }}|s$| j
                  j                  d	       d {    y t%        |j                  |j                  |j                        }	|rd
| dnd}
dj'                  d |D              }| j
                  j                  d|	 d|
 d| d       d {    | j
                  j                  dt(         d|j                   d       d {   }	 |j+                  d       d {    t/        |j                  |j                  |j                  |j0                  ||j                  |j                  fg      }|||j                  <   |r|dz  nt2        }|j4                  j7                  t8        |d|j                  id|j                          y 7 7 (# t        $ r' | j
                  j                  d       d {  7   Y y w xY wc c}w 7 7 B7 7 # t,        $ r Y w xY ww)NzUse /party in a group chat.rR   gather_sessionsz;A party is already active! Use /accept or /decline to join.r      i  u!   Usage: /party [minutes] (1–480)uE   No group members recorded yet — have everyone send a message first.u    ⏰ Starting in z minr9    c              3   r   K   | ]/  }t        |j                  |j                  |j                         1 y wr,   )r'   r!   rY   r#   )r.   ms     r    r0   zgather.<locals>.<genexpr>   s)     ^V]QRx		1<<LV]s   57u   🚨 z is gathering a Dota 2 party!u   

👥 Players pool:
rG   )rJ   u   🎮 Party status (1/u5   )
/accept to join · /decline to pass

Accepted (1): u   
Declined (0): —T)disable_notification)r   r   r   r   r   r   <   r   gather_)whendatar"   )rW   rS   typer   PRIVATEmessage
reply_textrU   rV   rX   r#   rY   r   argsr   
ValueErrorlist_membersr!   r'   r>   r=   pinrL   r   rH   GATHER_EXPIRY_SECONDS	job_queuerun_onceexpire_gather)rO   rP   re   rZ   rR   sessionsr   rn   membersinviter_mentiontime_strmember_mentions
status_msgr(   expirys                  r    gatherr   [   sL      D  DyyH$$$nn''(EFFFW%E	$--I)0)9)9:K)LHww(8DGG#4#;#;nn''I
 	
 	
 	#L||	w||A/L,,   -   -  ,,TWW5N5Qdgg9Mq5GNnn''S
 	
 	
 	twwGO9E"<.52Hhh^V]^^O
..
#
#
  =hZ H./	1 $    ~~00
	{ +) *	 Jnn$n777 __77$//!77DOO,-G  HTWW$0lR6KF!twwi 	  } 	G	
  	..++,OPPP	 O	
 	8 s   AM8L B$M8;L#<M80L&  M8M=M"M8#M$A;M8M! 7M8M$M8M) 2M'3M) 7B*M8#M8&'MMMM8M	M8!M8$M8'M) )	M52M84M55M8c                   
K   | j                   }| j                  

r
j                  ry |j                  t        j
                  k(  r$| j                  j                  d       d {    y |j                  d   }|j                  |j                  
j                  
j                  
j                         |j                  d   }|j                  |j                        }|r|j                  r$| j                  j                  d       d {    y 
j                  }t        
fd|j                   D              r$| j                  j                  d       d {    y |j"                  D cg c]  \  }}|
j                  k7  s||f c}}|_        |j                   j%                  
j                  |f       t'        |j                         t(        k\  rDd|_        |j*                  j-                  d|j                         D ]  }	|	j/                           t1        |j2                  |       d {    y 7 7 37 c c}}w 7 w)	NzUse /accept in a group chat.rR   rj   z)No active party. Use /party to start one.c              3   B   K   | ]  \  }}|j                   k(    y wr,   rX   r.   uidr/   rZ   s      r    r0   zaccept.<locals>.<genexpr>         
9(8fc13$''>(8   u   You're already in! 👍Trq   )rW   rS   rT   rt   r   ru   rv   rw   rU   rV   rX   r#   rY   getr   anyr   r   r?   r<   r=   r}   get_jobs_by_nameschedule_removalrN   rM   )rO   rP   re   rR   r   r(   displayr   r"   jobrZ   s             @r    acceptr      s      D  D4;;yyH$$$nn''(FGGGW%E	$--I)0)9)9:K)LHll477#Ggnnnn''(STTTooG

9(8(8
99nn''(ABBB5<5E5EX5E	TPTPWPWd5EXGTWWg./
7	)$$55y6IJC  " K w{{G
,,,3 	H 	U
 	C Y -s]   A#I&H='B&II AIII0IIB)I7I8I IIIc                   	K   | j                   }| j                  		r	j                  ry |j                  t        j
                  k(  r$| j                  j                  d       d {    y |j                  d   }|j                  |j                  	j                  	j                  	j                         |j                  d   }|j                  |j                        }|r|j                  r$| j                  j                  d       d {    y 	j                  }t        	fd|j                   D              r$| j                  j                  d       d {    y |j"                  D cg c]  \  }}|	j                  k7  s||f c}}|_        |j                   j%                  	j                  |f       t'        |j(                  |       d {    y 7 w7 7 c c}}w 7 w)NzUse /decline in a group chat.rR   rj   zNo active gather.c              3   B   K   | ]  \  }}|j                   k(    y wr,   r   r   s      r    r0   zdecline.<locals>.<genexpr>   r   r   zYou already declined.)rW   rS   rT   rt   r   ru   rv   rw   rU   rV   rX   r#   rY   r   r   r   r   r   r?   rN   rM   )
rO   rP   re   rR   r   r(   r   r   r"   rZ   s
            @r    decliner      s      D  D4;;yyH$$$nn''(GHHHW%E	$--I)0)9)9:K)LHll477#Ggnnnn''(;<<<ooG

9(8(8
99nn''(?@@@5<5E5EX5E	TPTPWPWd5EXGTWWg./
w{{G
,,,) 	I 	=
 	A Y -s]   A#G,&G'B&G,G AG,G"G,0G$G$A	G,G*G, G,"G,$G,c                 
  K   | j                   }| j                  }|r|j                  ry |j                  t        j
                  k(  r$| j                  j                  d       d {    y |j                  d   }|j                  |j                        }|r|j                  r$| j                  j                  d       d {    y |j                  |j                  k7  r$| j                  j                  d       d {    y d|_        |j                  j                  d|j                         D ]  }|j                           	 t!        |j"                        }dj%                  d |j"                  D              xs d	}dj%                  d
 |j&                  D              xs d	}	d| dt(         d| d| dt!        |j&                         d|	 d|j*                   d}
|j,                  j/                  |j                  |j0                  |
       d {    	 |j,                  j5                  |j                  |j0                         d {    y 7 7 7 `7 H# t2        $ r Y Qw xY w7 # t2        $ r Y y w xY ww)NzUse /abandon in a group chat.rj   zNo active gather to abandon.z$Only the gather host can abandon it.Trq   r*   c              3   &   K   | ]	  \  }}|  y wr,   r   r-   s      r    r0   zabandon.<locals>.<genexpr>         F5E'!T5Er1   r5   c              3   &   K   | ]	  \  }}|  y wr,   r   r-   s      r    r0   zabandon.<locals>.<genexpr>   r   r1   r7   r2   )

Accepted (r:   
Declined (u(   

❌ Gather was abandoned by the host (z).r   rH   rI   r   rH   )rW   rS   rT   rt   r   ru   rv   rw   rU   r   rX   r   r   r}   r   r   r<   r   r>   r   r=   r   rM   rK   r   rL   unpin_chat_message)rO   rP   re   rZ   r   r(   r   r@   rB   rC   rI   s              r    abandonr      sY      D  D4;;yyH$$$nn''(GHHH)0)9)9:K)LHll477#Ggnnnn''(FGGGww'$$$nn''(NOOOGN  11GDGG92EF GG$$%yy FW5E5E FFO%yy FW5E5E FFO%!%) 5s<. 1W--./s<. A55<5I5I4J"N 	 kk++GG00 , 
 	
 	
kk,,TWWIbIb,cccI 	I 	H 	P"	

   	d s   A#J%I&AJI<J>I?A	J	CI# I!I# 4I4 I2I4 JJJ!I# #	I/,J.I//J2I4 4	J =J?J  Jc                   K   | j                   j                  d   }| j                  d   }|j                  |      }|r|j                  ry d|_        	 t        |j                        }dj                  d |j                  D              xs d}dj                  d |j                  D              xs d}d| d	t         d
| d| dt        |j                         d| d}| j                  j                  ||j                  |       d {    	 | j                  j                  ||j                         d {    y 7 5# t        $ r Y >w xY w7 # t        $ r Y y w xY ww)Nr   rj   Tr*   c              3   &   K   | ]	  \  }}|  y wr,   r   r-   s      r    r0   z expire_gather.<locals>.<genexpr>  r   r1   r5   c              3   &   K   | ]	  \  }}|  y wr,   r   r-   s      r    r0   z expire_gather.<locals>.<genexpr>  r   r1   r7   r2   r   r:   r   u"   

⏰ Time's up — gather closed.r   r   )r   rs   rU   r   r   r<   r   r>   r   r=   rM   rK   r   rL   r   )rP   r   r   r(   r@   rB   rC   rI   s           r    r   r     sr    kky)G)0)9)9:K)LHll7#GgnnGNG$$%yy FW5E5E FFO%yy FW5E5E FFO%!%) 5s<. 1W--./s<. A// 	 kk++00 , 
 	
 	
kk,,WIbIb,ccc	

   	d sm   AE#B8E EE *E ;E<E  E#E 	EE#EE#E 	E E#E  E#)dataclassesr   r   telegramr   telegram.constantsr   telegram.extr   bot.core.loggerr   r=   r|   r   r   r   r'   rE   rN   DEFAULT_TYPEr[   rh   r   r   r   r   r   r   r   r    <module>r      sh   (  ' % "	    :c : :d
 :s : # .	] 	t 	[v [0I0I [d [. .9R9R .W[ . G G,*C*C G GT- -,*C*C - -D-& -<+D+D - -:,& ,<+D+D , ,^!:!: t r   