
    Ii%$                     ~    S r SSKJr  \(       a  SSKJr  SSKJr  SSKJr  SSK	J
r
  SS	KJr  SS
KJr   " S S5      rg)z6Mixin providing action visibility callbacks for games.    )TYPE_CHECKING   )Player)User   )TeamManager)
Visibility)Localization)
TrustLevelc                      \ rS rSrSrSSS\4S jrS\S   4S jrS\	4S jr
SSS\S	-  4S
 jrSSS\4S jrSSS\S	-  4S jrSSS\4S jrSSS\S	-  4S jrSSS\4S jrSSS\S	-  4S jrSSS\4S jrSSS\S\4S jrSSS\S	-  4S jrSSS\4S jrSSS\S	-  4S jrSSS\4S jrSSS\S	-  4S jrSSS\4S jrSSS\S	-  4S jrSSS\4S jrSSS\4S jrSSS\S	-  4S jrSSS\S	-  4S jr SSS\4S jr!SSS\S	-  4S  jr"SSS\4S! jr#SSS\S	-  4S" jr$SSS\4S# jr%SSS\S	-  4S$ jr&SSS\4S% jr'SSS\S	-  4S& jr(SSS\4S' jr)SSS\S	-  4S( jr*SSS\4S) jr+S*r,g	)+ActionVisibilityMixin   a  Provide visibility/enable checks for common actions.

Includes helpers for lobby actions (start/add bot/spectate) and shared
status actions (scores, actions menu, whose turn).

Expected Game attributes:
    status: str.
    host: str.
    players: list[Player].
    team_manager: TeamManager.
    get_user(player) -> User | None.
    get_min_players() -> int.
    get_max_players() -> int.
playerr   returnc                     UR                   $ )z!Check if a player is a spectator.is_spectatorselfr   s     Hc:\Users\dbart\PlayPalace11\server\game_utils\action_visibility_mixin.py_is_player_spectator*ActionVisibilityMixin._is_player_spectator!   s    """    c                 j    U R                    Vs/ s H  oR                  (       a  M  UPM     sn$ s  snf )z>Get list of players who are not spectators (actually playing).)playersr   )r   ps     r   get_active_players(ActionVisibilityMixin.get_active_players%   s"    <<><a~~<>>>s   00c                 4    [        U R                  5       5      $ )z1Get the number of active (non-spectator) players.)lenr   )r   s    r   get_active_player_count-ActionVisibilityMixin.get_active_player_count)   s    4**,--r   Nc                 \    U R                   S:w  a  gUR                  U R                  :w  a  gg)z&Check if start_game action is enabled.waitingaction-game-in-progressaction-not-hostNstatusnamehostr   s     r   _is_start_game_enabled,ActionVisibilityMixin._is_start_game_enabled/   '    ;;)#,;;$))#$r   c                     U R                   S:w  a  [        R                  $ UR                  U R                  :w  a  [        R                  $ [        R
                  $ )z%Check if start_game action is hidden.r$   r(   r	   HIDDENr)   r*   VISIBLEr   s     r   _is_start_game_hidden+ActionVisibilityMixin._is_start_game_hidden7   B    ;;)#$$$;;$))#$$$!!!r   c                     U R                   S:w  a  gUR                  U R                  :w  a  g[        S U R                   5       5      nX R                  5       :  a  gg)z#Check if add_bot action is enabled.r$   r%   r&   c              3   J   #    U  H  oR                   (       a  M  S v   M     g7fr   Nr   .0r   s     r   	<genexpr><ActionVisibilityMixin._is_add_bot_enabled.<locals>.<genexpr>E   s     Il..11ls   #	#zaction-table-fullN)r(   r)   r*   sumr   get_max_players)r   r   active_counts      r   _is_add_bot_enabled)ActionVisibilityMixin._is_add_bot_enabled?   sM    ;;)#,;;$))#$IdllII//11&r   c                 "    [         R                  $ )z+Add bot is always hidden (F5/keybind only).r	   r0   r   s     r   _is_add_bot_hidden(ActionVisibilityMixin._is_add_bot_hiddenJ          r   c                     U R                   S:w  a  gUR                  U R                  :w  a  g[        S U R                   5       5      (       d  gg)z&Check if remove_bot action is enabled.r$   r%   r&   c              3   8   #    U  H  oR                   v   M     g 7f)N)is_botr8   s     r   r:   ?ActionVisibilityMixin._is_remove_bot_enabled.<locals>.<genexpr>T   s     2\88\s   zaction-no-botsN)r(   r)   r*   anyr   r   s     r   _is_remove_bot_enabled,ActionVisibilityMixin._is_remove_bot_enabledN   s?    ;;)#,;;$))#$2T\\222#r   c                 "    [         R                  $ )z.Remove bot is always hidden (F5/keybind only).rB   r   s     r   _is_remove_bot_hidden+ActionVisibilityMixin._is_remove_bot_hiddenX   rE   r   c                 J    U R                   S:w  a  gUR                  (       a  gg)z,Check if toggle_spectator action is enabled.r$   r%   zaction-bots-cannotN)r(   rH   r   s     r   _is_toggle_spectator_enabled2ActionVisibilityMixin._is_toggle_spectator_enabled\   s    ;;)#,=='r   c                 "    [         R                  $ )z4Toggle spectator is always hidden (F5/keybind only).rB   r   s     r   _is_toggle_spectator_hidden1ActionVisibilityMixin._is_toggle_spectator_hiddend   rE   r   	action_idc                     U R                  U5      nU(       a  UR                  OSnUR                  (       a  [        R                  " US5      $ [        R                  " US5      $ )z.Get dynamic label for toggle_spectator action.enplayspectate)get_userlocaler   r
   get)r   r   rV   userr\   s        r   _get_toggle_spectator_label1ActionVisibilityMixin._get_toggle_spectator_labelh   sL    }}V$ $$##FF33
33r   c                     g)zLeave game is always enabled.N r   s     r   _is_leave_game_enabled,ActionVisibilityMixin._is_leave_game_enabledp       r   c                 "    [         R                  $ )z.Leave game is always hidden (F5/keybind only).rB   r   s     r   _is_leave_game_hidden+ActionVisibilityMixin._is_leave_game_hiddent   rE   r   c                 \    U R                   S:w  a  gUR                  U R                  :w  a  gg)z?Check if option actions are enabled (waiting state, host only).r$   r%   r&   Nr'   r   s     r   _is_option_enabled(ActionVisibilityMixin._is_option_enabledz   r-   r   c                     U R                   S:w  a  [        R                  $ UR                  U R                  :w  a  [        R                  $ [        R
                  $ )z7Options are visible in waiting state for the host only.r$   r/   r   s     r   _is_option_hidden'ActionVisibilityMixin._is_option_hidden   r4   r   c                     U R                   S:w  a  gU R                  U5      nU(       a2  UR                  R                  [        R
                  R                  :  a  gg)z-Check if estimate_duration action is enabled.r$   r%   zaction-not-availableN)r(   r[   trust_levelvaluer   ADMINr   r   r^   s      r   _is_estimate_duration_enabled3ActionVisibilityMixin._is_estimate_duration_enabled   sG    ;;)#,}}V$t''--
0@0@0F0FF)r   c                    U R                   S:w  a  [        R                  $ U R                  U5      nU(       a2  UR                  R
                  [        R                  R
                  :  a  [        R                  $ [        R                  $ )z.Estimate duration is visible in waiting state.r$   )	r(   r	   r0   r[   rp   rq   r   rr   r1   rs   s      r   _is_estimate_duration_hidden2ActionVisibilityMixin._is_estimate_duration_hidden   sb    ;;)#$$$}}V$t''--
0@0@0F0FF$$$!!!r   c                     g)z$Show actions menu is always enabled.Nrb   r   s     r   _is_show_actions_enabled.ActionVisibilityMixin._is_show_actions_enabled   re   r   c                 d    UR                   (       a  [        R                  $ [        R                  $ )z=Show actions is hidden for players but visible to spectators.)r   r	   r1   r0   r   s     r   _is_show_actions_hidden-ActionVisibilityMixin._is_show_actions_hidden   s#    %%%   r   c                 "    [         R                  $ )z0Always hide an action from menus (keybind only).rB   r   s     r   _is_always_hidden'ActionVisibilityMixin._is_always_hidden   rE   r   c                     g)z@Always disable an action (used with keep_visible_when_disabled).zaction-lockedrb   r   s     r   _is_always_disabled)ActionVisibilityMixin._is_always_disabled   s    r   c                 :    UR                   U R                  :w  a  gg)z&Check if save_table action is enabled.r&   N)r)   r*   r   s     r   _is_save_table_enabled,ActionVisibilityMixin._is_save_table_enabled   s    ;;$))#$r   c                 "    [         R                  $ )z+Save table is always hidden (keybind only).rB   r   s     r   _is_save_table_hidden+ActionVisibilityMixin._is_save_table_hidden   rE   r   c                 &    U R                   S:w  a  gg)z&Check if whose_turn action is enabled.playingaction-not-playingN)r(   r   s     r   _is_whose_turn_enabled,ActionVisibilityMixin._is_whose_turn_enabled   s    ;;)#'r   c                 "    [         R                  $ )z+Whose turn is always hidden (keybind only).rB   r   s     r   _is_whose_turn_hidden+ActionVisibilityMixin._is_whose_turn_hidden   rE   r   c                     g)z)Check if whos_at_table action is enabled.Nrb   r   s     r   _is_whos_at_table_enabled/ActionVisibilityMixin._is_whos_at_table_enabled   re   r   c                 "    [         R                  $ )z.Whos at table is always hidden (keybind only).rB   r   s     r   _is_whos_at_table_hidden.ActionVisibilityMixin._is_whos_at_table_hidden   rE   r   c                 n    U R                   S:w  a  g[        U R                  R                  5      S:X  a  gg)z(Check if check_scores action is enabled.r   r   r   action-no-scoresNr(   r    team_managerteamsr   s     r   _is_check_scores_enabled.ActionVisibilityMixin._is_check_scores_enabled   0    ;;)#'t  &&'1,%r   c                 "    [         R                  $ )z-Check scores is always hidden (keybind only).rB   r   s     r   _is_check_scores_hidden-ActionVisibilityMixin._is_check_scores_hidden   rE   r   c                 n    U R                   S:w  a  g[        U R                  R                  5      S:X  a  gg)z1Check if check_scores_detailed action is enabled.r   r   r   r   Nr   r   s     r   !_is_check_scores_detailed_enabled7ActionVisibilityMixin._is_check_scores_detailed_enabled   r   r   c                 "    [         R                  $ )z6Check scores detailed is always hidden (keybind only).rB   r   s     r    _is_check_scores_detailed_hidden6ActionVisibilityMixin._is_check_scores_detailed_hidden   rE   r   c                 l    U R                   S:w  a  g[        S U R                   5       5      nUS:  a  gg)z,Check if predict_outcomes action is enabled.r   r   c              3   p   #    U  H,  oR                   (       a  M  UR                  (       a  M(  S v   M.     g7fr7   )rH   r   r8   s     r   r:   EActionVisibilityMixin._is_predict_outcomes_enabled.<locals>.<genexpr>   s     Y\!!..!!\s   66	6r   zaction-need-more-humansN)r(   r<   r   )r   r   human_counts      r   _is_predict_outcomes_enabled2ActionVisibilityMixin._is_predict_outcomes_enabled   s2    ;;)#'YT\\YY?,r   c                 "    [         R                  $ )z1Predict outcomes is always hidden (keybind only).rB   r   s     r   _is_predict_outcomes_hidden1ActionVisibilityMixin._is_predict_outcomes_hidden   rE   r   rb   )-__name__
__module____qualname____firstlineno____doc__boolr   listr   intr!   strr+   r	   r2   r?   rC   rK   rN   rQ   rT   r_   rc   rg   rj   rm   rt   rw   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__rb   r   r   r   r      s   "#8 # #?DN ?. .X #* "H " "	( 	sTz 	! !j !X #* !H ! !8 d
 !( !z !4( 4s 4s 4X #* !H ! ! cDj " "Z "H t "8 "
 "x C$J !h !: !! !Z !( sTz X #* !H ! !X #* !H ! ! S4Z !x !J !x C$J !h !: ! S4Z !x !J !8 d
 !( !z !r   r   N)r   typingr   
games.baser   server.core.users.baser   r   r   actionsr	   messages.localizationr
   r   r   rb   r   r   <module>r      s,    <  #+"  0 -c! c!r   