
    Ii,                     F    S r SSKJr  \(       a  SSKJrJr   " S S5      rg)z)Mixin providing event handling for games.    )TYPE_CHECKING   )PlayerActionContextc                   N   \ rS rSrSrSSS\SS4S jrSSS\SS4S	 jrSSS\SS4S
 jrSSS\SS4S jr	SSS\
SS4S jrSSS\S\
SS4S jrSSS\S\
SS4S jrSSS\
S\S\
S-  4S jrSSS\S\
SS4S jr\S\S\
4S j5       rSSS\S\S\
S-  SSS\4S jrSSS\S\4S jrSrg)EventHandlingMixin	   aK  Handle menu/editbox/keybind events for a game.

Expected Game attributes:
    _actions_menu_open: set[str].
    _pending_actions: dict[str, str].
    _status_box_open: set[str].
    _keybinds: dict[str, list[Keybind]].
    get_user(player) -> User | None.
    find_action(player, action_id) -> Action | None.
    resolve_action(player, action) -> ResolvedAction.
    execute_action(player, action_id, input_value?, context?).
    get_all_visible_actions(player) -> list[ResolvedAction].
    rebuild_player_menu(player).
    rebuild_all_menus().
    _is_player_spectator(player) -> bool.
playerr   eventreturnNc                     UR                  S5      nUS:X  a  U R                  X5        gUS:X  a  U R                  X5        gUS:X  a  U R                  X5        gg)zHandle an event from a player.typemenueditboxkeybindN)get_handle_menu_event_handle_editbox_event_handle_keybind_event)selfr
   r   
event_types       Ec:\Users\dbart\PlayPalace11\server\game_utils\event_handling_mixin.pyhandle_eventEventHandlingMixin.handle_event   sW    YYv&
##F29$&&v59$&&v5 %    c                 t   UR                  S5      nUR                  SS5      nUS:X  a  U R                  XU5        gUS:X  a  U(       a  U R                  X5        ggUS:X  ar  U R                  U5      nU(       aY  UR	                  S5        UR                  S5        U R                  R                  UR                  5        U R                  U5        ggUS:X  a,  US	:X  a  U R                  US	5        gU R                  US	5        gUS
:X  a  U R                  XU5        gUS:X  a  U R                  XU5        gg)zHandle a menu selection event.menu_idselection_id 	turn_menuactions_menu
status_boxzstatus-box-closed	game_over
leave_gameaction_input_menuleave_game_confirmN)r   _handle_turn_menu_selection_handle_actions_menu_selectionget_userremove_menuspeak_l_status_box_opendiscardidrebuild_player_menuexecute_action_handle_action_input_menu_handle_leave_game_confirm)r   r
   r   r   r   users         r   r   %EventHandlingMixin._handle_menu_event(   s$   ))I&yy4k!,,VLI&33FI  $==(D  .01%%--fii8((0	  # |+##FL9 ##FL9++**6,G,,++F<H -r   c                 ,   UR                  SS5      nUR                  SS5      nUS:X  aj  UR                  U R                  ;   a>  U R                  R                  UR                  5      nU(       a  U R	                  XU5        U R                  U5        gg)z#Handle an editbox submission event.input_idr   textaction_input_editboxN)r   r.   _pending_actionspopr0   r/   )r   r
   r   r6   r7   	action_ids         r   r   (EventHandlingMixin._handle_editbox_eventK   s}    99Z,yy$--yyD111 1155fii@	''4@$$V, .r   c                    U R                  U5      nUR                  S5      nUR                  S5      nUS:X  a:  [        U SS5      S:w  a)  U(       a"  [        U SS5      nU(       a  U" X5      (       a  gU R                  R                  U5      nUc  gU R	                  U5      nSS	KJn	  U	" UUS
S9n
U R                  XXU
5      nU R                  X5      (       a  U R                  5         gg)zHandle a keybind press event.menu_item_id
menu_indexspacestatusplaying_speak_option_descriptionNr   )r   T)r>   r?   from_keybind)
_normalize_keybindr   getattr	_keybinds_is_player_spectator
games.baser   _execute_keybinds_should_rebuild_after_keybindrebuild_all_menus)r   r
   r   keyr>   r?   handlerkeybindsis_spectatorr   contextexecuted_anys               r   r   (EventHandlingMixin._handle_keybind_eventX   s    %%e,yy0YY|,
 '>gdHi@IMR^d$?FG7688>>%%c*008.%!
 --f\cd--fCC""$ Dr   r;   c                    U R                   R                  UR                  5        US:X  a  U R                  U5        gU R	                  X5      nU(       a3  U R                  X5      nUR                  (       a  U R                  X5        UR                  U R                  ;  a-  UR                  U R                  ;  a  U R                  U5        ggg)z'Handle selection from the actions menu.go_backN)
_actions_menu_openr-   r.   r/   find_actionresolve_actionenabledr0   r9   r,   )r   r
   r;   actionresolveds        r   r(   1EventHandlingMixin._handle_actions_menu_selectionw   s     	''		2	!$$V,!!&4**6:H##F699D111fiitG\G\6\$$V, 7]1r   r   c                    U R                   R                  UR                  5        U(       a  U R                  X5      OS nU(       Ga  U R	                  X5      nUR
                  (       a<  U R                  X5        UR                  U R                  ;  a  U R                  5         g U R                  U5      nU(       a  UR                  (       a  UR                  UR                  5        g UR                  (       a\  [        UR                  [        5      (       a"  UR                  u  pxUR                  " U40 UD6  g UR                  UR                  5        g UR                  SS5      S-
  n	U R!                  U5      n
SU	s=::  a  [#        U
5      :  aX  O  g X   nU R                  XR$                  R                  5        UR                  U R                  ;  a  U R                  5         g g g )N	selection   r   )rV   r-   r.   rW   rX   rY   r0   r9   rL   r)   disabled_messager+   disabled_reason
isinstancetupler   get_all_visible_actionslenrZ   )r   r
   r   r   rZ   r[   r3   rM   kwargsr^   visibles              r   r'   .EventHandlingMixin._handle_turn_menu_selection   s   ''		2;G!!&7T**6:H##F999D$9$99**,  }}V,..V%<%<=  "11%h&>&>FF*2*B*BKC LL77  !LL)A)ABIIk1-1	..v6	(CL()H(:(:;yy 5 55&&( 6 )r   c                    UR                   U R                  ;   a_  U R                  R                  UR                   5      nU=(       d    U R                  XU5      nU(       a  US:w  a  U R	                  XU5        UR                   U R                  ;  aH  UR                   U R
                  ;  a-  UR                   U R                  ;  a  U R                  U5        g g g g )N_cancel)r.   r9   r:   "_resolve_action_input_selection_idr0   r,   rV   r/   )r   r
   r   r   r;   resolved_selection_ids         r   r1   ,EventHandlingMixin._handle_action_input_menu   s    99-----11&))<I$0 %D4[4[55! %)>))K##F7LMIIT222		!6!66		!8!88$$V, 9 7 3r   c                    U R                  X5      nU(       d  g UR                  nU(       d  g UR                  S5      n[        U[        5      (       d  g US-
  n[        U S5      (       a  U R                  XA5      nOS nU(       a  SUs=::  a  [        U5      :  a   X   $   [        USS5      n	U	(       a  U(       a  U[        U5      :X  a  gg )Nr^   r_   _get_menu_options_for_actionr   include_cancelFrj   )	rW   input_requestr   rb   inthasattrro   re   rF   )
r   r
   r;   r   rZ   rq   r^   selection_indexoptionsrp   s
             r   rk   5EventHandlingMixin._resolve_action_input_selection_id   s     !!&4,,IIk*	)S))#a-478877GGGqO:c'l:++ ; !0@%Hg/S\*Ir   c                    U R                  U5      nU(       a  UR                  S5        UR                  U R                  ;   a&  U R                  R	                  UR                  S 5        UnU(       d  UR                  SS5      S-
  nUS:X  a  SOSnUS:X  a  [        U SS 5      nU(       a	  U" U5        g g U R                  S:X  a.  [        U S	S 5      (       a  U R                  U R                  5        g U R                  U5        g )
Nr&   r^   r_   r   yesno_perform_leave_gamefinished_last_game_result)r)   r*   r.   r9   r:   r   rF   rA   _show_end_screenr|   r/   )r   r
   r   r   r3   choicer^   rN   s           r   r2   -EventHandlingMixin._handle_leave_game_confirm   s    }}V$1299---!!%%fii6		+q1A5I'1nU$FU?d$94@G [[J&749Ld+S+S!!$"8"89$$V,r   c                 l   U R                  SS5      R                  5       nU R                  S5      (       a  UR                  S5      (       d  SU 3nU R                  S5      (       a  UR                  S5      (       d  SU 3nU R                  S5      (       a  UR                  S5      (       d  SU 3nU$ )	NrM   r   shiftzshift+controlzctrl+altzalt+)r   lower
startswith)r   rM   s     r   rE   %EventHandlingMixin._normalize_keybind   s    iir"((*99WcnnX&>&>3%.C99Yw(?(?#-C99UCNN6$:$:,C
r   rO   rP   r>   rQ   r   c                    SnU GHD  nUR                  XU5      (       d  M  UR                  (       a  XGR                  ;  a  M?  UR                   H  nU R                  X5      n	U	(       d  M  U R	                  X5      n
U
R
                  (       a  U R                  XUS9  SnMS  U	R                  (       a7  U R                  U5      nU(       a  UR                  U	R                  5        M  M  U
R                  (       d  M  U
R                  S:w  d  M  U R                  U5      nU(       d  M  UR                  U
R                  5        M     GMG     U$ )NF)rQ   Tzaction-not-available)can_player_userequires_focusactionsrW   rX   rY   r0   r`   r)   r+   ra   )r   r
   rO   rP   r>   rQ   rR   r   r;   rZ   r[   r3   s               r   rJ   $EventHandlingMixin._execute_keybinds   s    G))$EE%%,oo*M$__	))&<6#226BH''++Fw+O'+00#}}V4 LL)@)@A  !111#337MM#'==#8D#t $X-E-E F -  * r   rR   c                     U=(       aY    UR                   U R                  ;  =(       a9    UR                   U R                  ;  =(       a    UR                   U R                  ;  $ )N)r.   r9   r,   rV   )r   r
   rR   s      r   rK   0EventHandlingMixin._should_rebuild_after_keybind  sQ     9		!6!669		!6!669 		!8!88		
r    )__name__
__module____qualname____firstlineno____doc__dictr   r   r   r   strr(   r'   r1   rk   r2   staticmethodrE   listboolrJ   rK   __static_attributes__r   r   r   r   r   	   s   "68 6D 6T 6!I !I$ !I4 !IF-H -T -d -%H %T %d %>-X -# -RV -")( )4 )WZ )_c )<- - -UX -]a -+.7;	t8- -$ -VY -^b -& $ 3    	
 Dj ! 
@
H 
D 
UY 
r   r   N)r   typingr   rI   r   r   r   r   r   r   <module>r      s    /  2L
 L
r   