
    soj+%                        d dl 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 d dlmZmZ d dlmZ d dlmZ 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 dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5 	 ddedej6        de+de dede7ddfdZ	 ddedej6        de de+dede7ddfdZ8	 ddej6        dede ddfdZ9dS )    N)datetime)Update)ContextTypes)
get_boardsrun_gameissue_life_if_possible)r   issue_hint_if_possible)manage)r   reduce_level_if_possible)Game)User)
GameStatus)Screen)GroupChatExceptionGroupChatError)GameType)Keyboard)datetime_is_afterget_datetime_in_future_secondsget_elapsed_seconds)guess_game_countdown_to_startvalidate_game+challenger_has_finished_or_opponent_timeout!get_generic_boards_for_guess_game#enqueue_timeout_opponent_guess_gameFupdatecontextinbound_keyboardusergameshould_start_immediatelyreturnc           
      v  K   t          | |||           d{V }|dS |                                xt          j        k    r t          }t
          }nyxt          j        k    r t          }t          }nYxt          j	        k    rnxt          j
        k    rn n t          }t          }n%	 t          d|                                            ||           |r.|j                            t          | ||d||                     dS |j        t"          j        k    rot&          j        |_        |                                 |j                            t          | ||t.          j                                        ||                     dS t5          |||           d{V rdS  ||||dd           d{V  dS )a+  
    Manage guessing games
    :param update: The update object
    :param context: The context object
    :param inbound_keyboard: The inbound keyboard
    :param user: The user
    :param game: The game object
    :param should_start_immediately: If to start without waiting
    :return: None
    NUnsupported game type: r   F)should_send_to_all_playersschedule_next_send)r   get_typer   GUESS_OR_LIFErun_game_golget_boards_golPUNK_RECORDSrun_game_prr   SHAMBLESWHOS_WHOrun_game_shambles_ww
ValueErrorapplicationcreate_taskr   screenr   GRP_GAME_OPPONENT_CONFIRMATIONr   COUNTDOWN_TO_STARTstatussaveEnvGAME_START_WAIT_TIMEget_intr   )r   r   r   r   r    r!   run_game_functionget_boards_functions           2/app/src/chat/common/screens/screen_game_manage.pyr
   r
   ,   s#     ( vw0@$GGGGGGGGD|
--//#X#### ,"0"X"""" +"CX!2!2!2!2!2!2!2!2 4"CHt}}HHIII  '')&'4DUW[\\	
 	
 	
 	 &"GGG 3		'')s'?'G'G'I'IK\^b 	
 	
 	

 	8$MMMMMMMM 

tRW               c                    K   |                                 rT|rR|                    |          r=|                    |          r(|j                            t	          ||                     |j                            t          |||                     t          |j                  }|xt          j        k    r t          | ||||           d{V  dS xt          j
        k    r t          | ||||           d{V  dS xt          j        k    rn5xt          j        k    rn$xt          j        k    rnxt          j        k    rn n t!          | |||||           d{V  dS 	 t#          t$          j                  )aC  
    Dispatch game
    :param update: The update
    :param context: The context
    :param user: The user
    :param inbound_keyboard: The inbound keyboard
    :param game: The game
    :param should_start_immediately: If the game should be started immediately, from challenger/opponent confirmation
    :return: None
    )r   N)r!   )	is_globalis_opponentr1   r2   r   restart_hint_thread_if_downr   typeROCK_PAPER_SCISSORS
manage_rpsRUSSIAN_ROULETTE	manage_rrr-   r.   r(   r+   r
   r   r   INVALID_GAME)r   r   r   r   r    r!   	game_types          r=   dispatch_gamerJ   q   s     ( ~~ `4 `9I9I$9O9O `D!! 	`++,OPWY],^,^___##$?TX$Y$Y$YZZZ"49--I
)X))))VWd4DdKKKKKKKKKKK&X&&&&FGT3CTJJJJJJJJJJJ H 1 1 1 1 14JH4J4J4J4JMbXMbMbMbMbMbMbMb )A            $^%@AAAr>   c           
        K   |                                 sdS |                                rdS |                                xt          j        k    r t
          }t          }nyxt          j        k    r t          }t          }nYxt          j
        k    rnxt          j        k    rn n t          }t          }n%	 t          d|                                           |V|                                rB|                                r.| j                            t'          | ||j                             ||j        }|                                r-|r+|                    |          r|                                rdS |                                r|r|                    |          r|j        n|j        }|                                }|!t9          t;          |dz   |                    rdS t=          |          }t?          ||          \  }}	|                                o|o|                    |          }
|
rt@          j        nt@          j        }|
rdnd}tA          j!        di |tE          j#                    idt@          j$        dz   i%                    t@          j&        |j&        k    ||k    z            '                                }|d	k    rdS |xj$        dz  c_$        tQ          |          D ]} |||          s|d	k    r dS  ntS          j*        d
|j&         d| d| d|j&                    | j                             || ||||	z
                       dS )z
    Restart the hint thread if it's down
    :param context: The context object
    :param game: The game object
    :param user: The user
    :return: None
    Nr$   
   )
start_timelast_hint_opponent_datelast_hint_datethread_restart_count   r   zRestart hint thread for game z after z seconds delay and z missed hints for user )hint_wait_seconds )+is_guess_basedis_finishedr'   r   r(   issue_hint_if_possible_golr)   r+   issue_hint_if_possible_prr,   r-   r.   "issue_hint_if_possible_shambles_wwr/   r0   r@   has_opponentr1   r2   rB   opponent
challengeris_challengerchallenger_has_finishedrA   rN   rO   get_seconds_for_every_hintr   r   r   divmodr   r   r   nowrP   whereidexecuterangelogginginfo)r   r    r   issue_hint_if_possible_functionr;   rO   hint_every_secondsseconds_since_last_hinthints_to_issuehint_seconds_remainingis_opponent_hint
date_fielddate_field_nameclaimed_rows_s                  r=   rB   rB      s          
--//#X####.H+ ,"X"""".G+ +X!2!2!2!2!2!2!2!2.P+ 4Ht}}HHIII |((|T->->-@-@|''(CGTSWS`(a(abbb| ~~ D T%7%7%=%= $B^B^B`B`  >>	! $	!)-)9)9$)?)?	!$$   88:: !2&'9B'>>ZZZ" " 	1.AA-34KM_-`-`*N* ~~''KDKT5E5Ed5K5K1AZ--tGZJ3CY//IYO 	 	
 	
/	
 	
!%!:Q!>	
 	
 	
 
47"z^'CD	E	E	  q" >""  ..tT:: 	AvvE	
 L	+ 	+ 	+8O 	+ 	+dr 	+ 	+!%	+ 	+   ##14JJ		
 	
 	
    r>   )F)N):re   r   src.tg_compatr   src.tg_compat.extr   resources.EnvironmentEnvironmentr8   'src.chat.common.screens.screen_game_golr   r*   r   r)   r   rV   &src.chat.common.screens.screen_game_prr,   r	   rW   'src.chat.common.screens.screen_game_rpsr
   rE   &src.chat.common.screens.screen_game_rrrG   /src.chat.common.screens.screen_game_shambles_wwr/   r   rX   src.model.Gamer   src.model.Userr   src.model.enums.GameStatusr   src.model.enums.Screenr   src.model.error.GroupChatErrorr   r   src.model.game.GameTyper   src.model.pojo.Keyboardr   src.service.date_servicer   r   r   src.service.game_servicer   r   r   r   r   DEFAULT_TYPEboolrJ   rB   rS   r>   r=   <module>r      s5                      * * * * * * # # # # # #         
        I H H H H H F F F F F F                     1 1 1 1 1 1 ) ) ) ) ) ) M M M M M M M M , , , , , , , , , , , ,         
              &+B BB&B B 	B
 B #B 
B B B BV &+/B /B/B&/B /B 	/B
 /B #/B 
/B /B /B /Bf BFi i&i.2i:>i	i i i i i ir>   