
    Ii/                         S r SSKrSSKJr  SSKJr  SSKJrJrJ	r	  SSK
Jr  SS	KJr  \(       a  SS
KJr  S\SS4S jrS rS r " S S5      rg)z7Administration functionality for the PlayPalace server.    N)TYPE_CHECKING   )NetworkUser)MenuItemEscapeBehavior
TrustLevel   )Localization)show_yes_no_menu)Database
message_idreturnc                 .    U R                   " U4SS0UD6  g)z5Speak a localized activity message to the admin/user.bufferactivityN)speak_l)userr   kwargss      9c:\Users\dbart\PlayPalace11\server\core\administration.py_speak_activityr      s    LL9J9&9    c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )zUDecorator that checks if the user is still an admin before executing an admin action.c                    >#    UR                   R                  [        R                  R                  :  a  [	        US5        U R                  U5        gT" X/UQ70 UD6I Sh  vN $  N7f)z>Run the wrapped action if the user still has admin privileges.znot-admin-anymoreN)trust_levelvaluer   ADMINr   _show_main_menu)selfadminargsr   funcs       r   wrapperrequire_admin.<locals>.wrapper   s_      ""Z%5%5%;%;;E#67  '$777777   A A*#A($A*	functoolswrapsr!   r"   s   ` r   require_adminr)      '     __T8 8 Nr   c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )z]Decorator that checks if the user is the server owner before executing a server owner action.c                    >#    UR                   R                  [        R                  R                  :  a  [	        US5        U R                  U5        gT" X/UQ70 UD6I Sh  vN $  N7f)z=Run the wrapped action if the user is still the server owner.znot-server-ownerN)r   r   r   SERVER_OWNERr   r   )r   ownerr    r   r!   s       r   r"   %require_server_owner.<locals>.wrapper'   s_      ""Z%<%<%B%BBE#56  '$777777r$   r%   r(   s   ` r   require_server_ownerr0   $   r*   r   c                      \ rS rSr% SrS\S'   \\\4   \S'   \\\4   \S'   S\SS	4S
 jr	 SRS\S\S\S	-  SS	4S j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	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\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	4S jrS\S\SS	4S jr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	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)\SS	4S* jr S\S\SS	4S+ jr!S,\S-\S)\SS	4S. jr"S\S&\SS	4S/ jr#S\S&\SS	4S0 jr$S\S&\S)\SS	4S1 jr%S\S&\S)\SS	4S2 jr&S\S&\S)\SS	4S3 jr'S\S&\SS	4S4 jr(S\S&\S)\SS	4S5 jr)S\S&\S)\SS	4S6 jr*S\S&\SS	4S7 jr+S\S&\SS	4S8 jr,S\S&\S)\SS	4S9 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r0S\S&\SS	4S= jr1S\S&\SS	4S> jr2\3S,\S?\SS	4S@ j5       r4\3SSS,\S?\SA\SS	4SB jj5       r5\6SC\S?\S!\SS	4SD j5       r7\6SC\S?\S!\SS	4SE j5       r8 SRS\S\SF\S!\S\S	-  SS	4SG jjr9\6SC\S?\S!\SS	4SH j5       r:\3 STS,\S?\SA\S!\SS	4
SI jj5       r;\3 STS,\S?\SA\S!\SS	4
SJ jj5       r<\6SC\SS	4SK j5       r=\6SC\SS	4SL j5       r>\6SC\SS	4SM j5       r?\6SC\SS	4SN j5       r@\6SC\SS	4SO j5       rA\6SC\SS	4SP j5       rBSQrCg	)UAdministrationMixin3   a  Provide administration menu actions and account moderation flows.

Expected attributes:
    _db: Database instance.
    _users: dict[str, NetworkUser] of online users.
    _user_states: dict[str, dict] of user menu states.
    _show_main_menu(user): Method to show the main menu.
r   _db_users_user_statesr   r   Nc                     [         e)z5Show main menu - to be implemented by the main class.)NotImplementedError)r   r   s     r   r   #AdministrationMixin._show_main_menuA   s    !!r   r   soundexclude_usernamec                    U R                   R                  5        Hc  u  pEUR                  R                  [        R
                  R                  :  a  M9  U(       a  XC:X  a  MG  [        XQ5        UR                  U5        Me     g)zRNotify all online admins with a message and sound, optionally excluding one admin.N)r5   itemsr   r   r   r   r   
play_sound)r   r   r:   r;   usernamer   s         r   _notify_admins"AdministrationMixin._notify_adminsE   s_     #kk//1NH%%
(8(8(>(>>H$@D-OOE" 2r   c                    [        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9/nUR                  R
                  [        R                  R
                  :  a  UR                  [        [        R                  " UR                  S5      S	S95        UR                  [        [        R                  " UR                  S
5      SS95        UR                  [        [        R                  " UR                  S5      SS95        UR                  [        [        R                  " UR                  S5      SS95        UR                  [        [        R                  " UR                  S5      SS95        UR                  SUS[        R                  S9  SS0U R                  UR                  '   g)zShow administration menu.zaccount-approvalaccount_approvaltextidzban-userban_userz
unban-user
unban_userzpromote-adminpromote_adminzdemote-admindemote_adminzvirtual-botsvirtual_botsztransfer-ownershiptransfer_ownershipback
admin_menuTmultiletterescape_behaviormenuN)r   r
   getlocaler   r   r   r-   append	show_menur   SELECT_LASTr6   r?   )r   r   r=   s      r   _show_admin_menu$AdministrationMixin._show_admin_menuS   s    !%%dkk3EF% !%%dkk:> !%%dkk<@
 !!Z%<%<%B%BBLL%))$++G& LL%))$++~F% LL%))$++~F% LL%))$++7KL+ 	X<#3#3DKK#HVTU*66	 	 	
 -3L+A$--(r   c                    U R                   R                  5       nU(       d  [        US5        U R                  U5        g/ nU H3  nUR	                  [        UR                  SUR                   3S95        M5     UR	                  [        [        R                  " UR                  S5      SS95        UR                  SUS[        R                  S9  S	S0U R                  UR                  '   g)
z.Show account approval menu with pending users.zno-pending-accountsNpending_rD   rM   account_approval_menuTrO   rR   )r4   get_pending_usersr   rX   rU   r   r?   r
   rS   rT   rV   r   rW   r6   )r   r   pendingr=   pending_users        r   _show_account_approval_menu/AdministrationMixin._show_account_approval_menu   s    ((,,.D"78!!$'#LLLl33(<CXCXBY8Z[ $ 	X<#3#3DKK#HVTU#*66	 	 	
 -34K+L$--(r   pending_usernamec                 p   [        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9/nUR	                  SUS[
        R                  S	9  SUS
.U R                  UR                  '   g)z3Show actions for a pending user (approve, decline).zapprove-accountapproverD   zdecline-accountdeclinerM   pending_user_actions_menuTrO   rR   rb   N	r   r
   rS   rT   rV   r   rW   r6   r?   )r   r   rb   r=   s       r   _show_pending_user_actions_menu3AdministrationMixin._show_pending_user_actions_menu   s     ,**4;;8IJyY,**4;;8IJyY,**4;;?FK

 	'*66	 	 	
 0 0,
$--(r   c                    U R                   R                  5       nU(       d"  UR                  SSS9  U R                  U5        g/ nU H3  nUR	                  [        UR                  SUR                   3S95        M5     UR	                  [        [        R                  " UR                  S5      SS95        UR                  SUS	[        R                  S
9  SS0U R                  UR                  '   g)z5Show promote admin menu with list of non-admin users.zno-users-to-promotemiscr   Npromote_rD   rM   promote_admin_menuTrO   rR   r4   get_non_admin_usersr   rX   rU   r   r?   r
   rS   rT   rV   r   rW   r6   )r   r   
non_adminsr=   	non_admins        r   _show_promote_admin_menu,AdministrationMixin._show_promote_admin_menu   s    XX113
LL.vL>!!$'#ILLy'9'9I[I[H\>]^_ $X<#3#3DKK#HVTU *66	 	 	
 -34H+I$--(r   c                 H   U R                   R                  SS9nU Vs/ s H   o3R                  UR                  :w  d  M  UPM"     nnU(       d"  UR                  SSS9  U R	                  U5        g/ nU H3  nUR                  [        UR                  SUR                   3S95        M5     UR                  [        [        R                  " UR                  S	5      S	S95        UR                  S
US[        R                  S9  SS
0U R                  UR                  '   gs  snf )z0Show demote admin menu with list of admin users.Finclude_server_ownerzno-admins-to-demoterl   rm   Ndemote_rD   rM   demote_admin_menuTrO   rR   )r4   get_admin_usersr?   r   rX   rU   r   r
   rS   rT   rV   r   rW   r6   )r   r   adminsar=   r   s         r   _show_demote_admin_menu+AdministrationMixin._show_demote_admin_menu   s     ))u)E $CVzzT]]'B!VCLL.vL>!!$'ELLu~~GENNCS:TUV X<#3#3DKK#HVTU*66	 	 	
 -34G+H$--(% Ds
   DDtarget_usernamec                     [         R                  " UR                  SUS9n[        USU5        SUS.U R                  UR
                  '   g)z5Show confirmation menu for promoting a user to admin.zconfirm-promoteplayerpromote_confirm_menurR   r   Nr
   rS   rT   r   r6   r?   r   r   r   questions       r   _show_promote_confirm_menu.AdministrationMixin._show_promote_confirm_menu   sD    ##DKK1B?[5x@*.,
$--(r   c                     [         R                  " UR                  SUS9n[        USU5        SUS.U R                  UR
                  '   g)z-Show confirmation menu for demoting an admin.zconfirm-demoter   demote_confirm_menur   Nr   r   s       r   _show_demote_confirm_menu-AdministrationMixin._show_demote_confirm_menu   sD    ##DKK1A/Z4h?).,
$--(r   actionc                 r   [        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9/nUR	                  SUS	[
        R                  S
9  SUUS.U R                  UR                  '   g)zRShow menu to choose broadcast audience (all users, admins only, or nobody/silent).broadcast-to-allallrD   broadcast-to-adminsr|   broadcast-to-nobodynobodybroadcast_choice_menuTrO   )rR   r   r   Nrh   )r   r   r   r   r=   s        r   _show_broadcast_choice_menu/AdministrationMixin._show_broadcast_choice_menu   s    
 ,**4;;8JKPUV,**4;;8MNS[\,**4;;8MNS[\

 	#*66	 	 	
 ,.,
$--(r   c                    U R                   R                  SS9nU(       d"  UR                  SSS9  U R                  U5        g/ nU H3  nUR	                  [        UR                  SUR                   3S95        M5     UR	                  [        [        R                  " UR                  S	5      S	S95        UR                  S
US[        R                  S9  SS
0U R                  UR                  '   g)z6Show transfer ownership menu with list of admin users.Frw   zno-admins-for-transferrl   rm   N	transfer_rD   rM   transfer_ownership_menuTrO   rR   )r4   r{   r   rX   rU   r   r?   r
   rS   rT   rV   r   rW   r6   )r   r   r|   r=   r   s        r   _show_transfer_ownership_menu1AdministrationMixin._show_transfer_ownership_menu  s     ))u)ELL1&LA!!$'ELLu~~IennEU:VWX X<#3#3DKK#HVTU%*66	 	 	
 -34M+N$--(r   c                     [         R                  " UR                  SUS9n[        USU5        SUS.U R                  UR
                  '   g)z2Show confirmation menu for transferring ownership.zconfirm-transfer-ownershipr   transfer_ownership_confirm_menur   Nr   r   s       r   %_show_transfer_ownership_confirm_menu9AdministrationMixin._show_transfer_ownership_confirm_menu  sK      ##KK5o
 	@(K5.,
$--(r   c                 p   [        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9[        [        R                  " UR                  S5      SS9/nUR	                  SUS	[
        R                  S
9  SUS.U R                  UR                  '   g)z>Show menu to choose broadcast audience for ownership transfer.r   r   rD   r   r|   r   r   transfer_broadcast_choice_menuTrO   r   Nrh   )r   r   r   r=   s       r   $_show_transfer_broadcast_choice_menu8AdministrationMixin._show_transfer_broadcast_choice_menu+  s     ,**4;;8JKPUV,**4;;8MNS[\,**4;;8MNS[\

 	,*66	 	 	
 5.,
$--(r   c                    U R                   R                  SS9nU(       d"  UR                  SSS9  U R                  U5        g/ nU H3  nUR	                  [        UR                  SUR                   3S95        M5     UR	                  [        [        R                  " UR                  S	5      S	S95        UR                  S
US[        R                  S9  SS
0U R                  UR                  '   g)zBShow ban user menu with list of non-admin users who aren't banned.T)exclude_bannedzno-users-to-banrl   rm   Nban_rD   rM   ban_user_menurO   rR   rp   )r   r   bannable_usersr=   bannable_users        r   _show_ban_user_menu'AdministrationMixin._show_ban_user_menu=  s     55T5JLL*6L:!!$'+MLL}'='=DI_I_H`Babc ,X<#3#3DKK#HVTU*66	 	 	
 -3O+D$--(r   c                    U R                   R                  5       nU(       d"  UR                  SSS9  U R                  U5        g/ nU H3  nUR	                  [        UR                  SUR                   3S95        M5     UR	                  [        [        R                  " UR                  S5      SS95        UR                  SUS	[        R                  S
9  SS0U R                  UR                  '   g)z/Show unban user menu with list of banned users.zno-users-to-unbanrl   rm   Nunban_rD   rM   unban_user_menuTrO   rR   )r4   get_banned_usersr   rX   rU   r   r?   r
   rS   rT   rV   r   rW   r6   )r   r   banned_usersr=   banned_users        r   _show_unban_user_menu)AdministrationMixin._show_unban_user_menuT  s    xx002LL,VL<!!$''KLL{';';&I]I]H^@_`a (X<#3#3DKK#HVTU*66	 	 	
 -34E+F$--(r   c                     [         R                  " UR                  SUS9n[        USU5        SUS.U R                  UR
                  '   g)z*Show confirmation menu for banning a user.zconfirm-banr   ban_confirm_menur   Nr   r   s       r   _show_ban_confirm_menu*AdministrationMixin._show_ban_confirm_menuj  sC    ##DKKW18<&.,
$--(r   c                     [         R                  " UR                  SUS9n[        USU5        SUS.U R                  UR
                  '   g)z,Show confirmation menu for unbanning a user.zconfirm-unbanr   unban_confirm_menur   Nr   r   s       r   _show_unban_confirm_menu,AdministrationMixin._show_unban_confirm_menus  sC    ##DKKY3X>(.,
$--(r   broadcast_scopec                     [         R                  " UR                  S5      nUR                  SUSSSS9  SUUS.U R                  UR
                  '   g)	z%Show editbox for entering ban reason.zban-reason-prompt
ban_reason Fdefault_value	multiline	read_onlyban_reason_editboxrR   r   r   Nr
   rS   rT   show_editboxr6   r?   r   r   r   r   prompts        r   _show_ban_reason_editbox,AdministrationMixin._show_ban_reason_editbox|  s^     !!$++/BC 	 	
 )..,
$--(r   c                     [         R                  " UR                  S5      nUR                  SUSSSS9  SUUS.U R                  UR
                  '   g)	z'Show editbox for entering unban reason.zunban-reason-promptunban_reasonr   Fr   unban_reason_editboxr   Nr   r   s        r   _show_unban_reason_editbox.AdministrationMixin._show_unban_reason_editbox  s^     !!$++/DE 	 	
 +..,
$--(r   c                 N   Sn[        U S5      (       a:  U R                  (       a)  U R                  R                  5       nSUS    SUS    S3n[        [        R
                  " UR                  S5      U-   S	S
9[        [        R
                  " UR                  S5      SS
9[        [        R
                  " UR                  S5      SS
9[        [        R
                  " UR                  S5      SS
9[        [        R
                  " UR                  S5      SS
9[        [        R
                  " UR                  S5      SS
9[        [        R
                  " UR                  S5      SS
9/nUR                  SUS[        R                  S9  SS0U R                  UR                  '   g)z"Show virtual bots management menu.r   _virtual_botsz (online/total)zvirtual-bots-fillfillrD   zvirtual-bots-clearclearzvirtual-bots-statusstatuszvirtual-bots-guided-overviewguidedzvirtual-bots-groups-overviewgroupszvirtual-bots-profiles-overviewprofilesrM   virtual_bots_menuTrO   rR   N)hasattrr   
get_statusr   r
   rS   rT   rV   r   rW   r6   r?   )r   r   status_textr   r=   s        r   _show_virtual_bots_menu+AdministrationMixin._show_virtual_bots_menu  s    4))d.@.@''224Fvh/0&/1B!DK !%%dkk3FG+U !%%dkk3GH !%%dkk3HI !%%dkk3QR !%%dkk3QR !%%dkk3ST ,**4;;?FK3
6 	*66	 	 	
 -34G+H$--(r   c                     [         R                  " UR                  S5      n[        USU5        SS0U R                  UR
                  '   g)z5Show confirmation menu for clearing all virtual bots.zvirtual-bots-clear-confirmvirtual_bots_clear_confirm_menurR   Nr   )r   r   r   s      r   %_show_virtual_bots_clear_confirm_menu9AdministrationMixin._show_virtual_bots_clear_confirm_menu  s@    ##DKK1MN@(K,24U+V$--(r   selection_idc                   #    US:X  a  U R                  U5        g	US:X  a  U R                  U5        g	US:X  a  U R                  U5        g	US:X  a  U R                  U5        g	US:X  a  U R	                  U5        g	US:X  a  U R                  U5        g	US:X  a  U R                  U5        g	US:X  a  U R                  U5        g	g	7f)
zHandle admin menu selection.rC   rI   rJ   rL   rG   rH   rK   rM   N)r`   rt   r~   r   r   r   r   r   r   r   r   s      r   _handle_admin_menu_selection0AdministrationMixin._handle_admin_menu_selection  s     --,,T2_,))$/^+((.11..t4Z'$$T*\)&&t,^+((.V#  & $s   CCc                    #    US:X  a  U R                  U5        gUR                  S5      (       a  USS nU R                  X5        gg7f)z'Handle account approval menu selection.rM   r[      N)rX   
startswithri   )r   r   r   rb   s       r   "_handle_account_approval_selection6AdministrationMixin._handle_account_approval_selection  sN      6!!!$'$$Z00+AB/00H 1   AA	statec                   #    UR                  S5      nU(       d  U R                  U5        gUS:X  a  U R                  X5      I Sh  vN   gUS:X  a  U R                  X5        gUS:X  a  U R                  U5        gg N67f)z+Handle pending user actions menu selection.rb   Nrd   re   rM   )rS   r`   _approve_user_show_decline_reason_editbox)r   r   r   r   rb   s        r   &_handle_pending_user_actions_selection:AdministrationMixin._handle_pending_user_actions_selection  s}      !99%78,,T29$$$T<<<Y&--dEV#,,T2 $ =s   AB A>7B c                     [         R                  " UR                  S5      nUR                  SUSSSS9  SUS.U R                  UR
                  '   g)	z)Show editbox for entering decline reason.zdecline-reason-promptdecline_reasonr   Fr   decline_reason_editboxrg   Nr   )r   r   rb   r   s       r   r   0AdministrationMixin._show_decline_reason_editbox   sY    !!$++/FG 	 	
 - 0,
$--(r   r   rE   c                    #    UR                  S5      nU(       d  U R                  U5        gU R                  XUS9I Sh  vN   g N7f)z)Handle decline reason editbox submission.rb   N)reason)rS   r`   _decline_user)r   r   rE   r   rb   s        r   _handle_decline_reason_editbox2AdministrationMixin._handle_decline_reason_editbox  sF      !99%78,,U3    FFFs   >A AAc                    #    US:X  a  U R                  U5        gUR                  S5      (       a  USS nU R                  X5        gg7f)z$Handle promote admin menu selection.rM   rn   r   N)rX   r   r   r   r   r   r   s       r   _handle_promote_admin_selection3AdministrationMixin._handle_promote_admin_selection  sK     6!!!$'$$Z00*12.O++DB 1r   c                    #    US:X  a  U R                  U5        gUR                  S5      (       a  USS nU R                  X5        gg7f)z#Handle demote admin menu selection.rM   ry      N)rX   r   r   r  s       r   _handle_demote_admin_selection2AdministrationMixin._handle_demote_admin_selection#  sK     6!!!$'$$Y//*12.O**4A 0r   c                    #    UR                  S5      nU(       d  U R                  U5        gUS:X  a  U R                  USU5        gU R                  U5        g7f)z+Handle promote confirmation menu selection.r   Nyespromote)rS   rt   r   r   r   r   r   r   s        r   !_handle_promote_confirm_selection5AdministrationMixin._handle_promote_confirm_selection+  sT       ))$56))$/5 ,,T9oN ))$/   AAc                    #    UR                  S5      nU(       d  U R                  U5        gUS:X  a  U R                  USU5        gU R                  U5        g7f)z*Handle demote confirmation menu selection.r   Nr  demote)rS   r~   r   r  s        r    _handle_demote_confirm_selection4AdministrationMixin._handle_demote_confirm_selection;  sT       ))$56((.5 ,,T8_M ((.r  c                   #    UR                  S5      nUR                  S5      nU(       a  U(       d  U R                  U5        gUnUS:X  a  U R                  XU5      I Sh  vN   gUS:X  a  U R                  XU5      I Sh  vN   gUS:X  a  U R	                  XU5        gUS:X  a  U R                  XU5        gg NY N:7f)z'Handle broadcast choice menu selection.r   r   Nr  r  banunban)rS   rX   _promote_to_admin_demote_from_adminr   r   )r   r   r   r   r   r   r   s          r   "_handle_broadcast_choice_selection6AdministrationMixin._handle_broadcast_choice_selectionK  s      8$))$56_!!$' 'Y((PPPx))$QQQu_))$Qw++D?S  QQs$   A C "B<# C B>9C >C c                    #    US:X  a  U R                  U5        gUR                  S5      (       a  USS nU R                  X5        gg7f)z)Handle transfer ownership menu selection.rM   r   	   N)rX   r   r   r  s       r   $_handle_transfer_ownership_selection8AdministrationMixin._handle_transfer_ownership_selectionb  sM      6!!!$'$$[11*12.O66tM 2r   c                    #    UR                  S5      nU(       d  U R                  U5        gUS:X  a  U R                  X5        gU R                  U5        g7f)z6Handle transfer ownership confirmation menu selection.r   Nr  )rS   r   r   r  s        r   ,_handle_transfer_ownership_confirm_selection@AdministrationMixin._handle_transfer_ownership_confirm_selectionl  sP       ))$56..t45 55dL ..t4s   AAc                    #    UR                  S5      nU(       d  U R                  U5        gUnU R                  XU5      I Sh  vN   g N7f)z0Handle transfer broadcast choice menu selection.r   N)rS   rX   _transfer_ownership)r   r   r   r   r   r   s         r   +_handle_transfer_broadcast_choice_selection?AdministrationMixin._handle_transfer_broadcast_choice_selection|  sG       ))$56!!$' '&&toNNNs   AAA
Ac                    #    US:X  a  U R                  U5        gUR                  S5      (       a  USS nU R                  X5        gg7f)zHandle ban user menu selection.rM   r      N)rX   r   r   r  s       r   _handle_ban_user_selection.AdministrationMixin._handle_ban_user_selection  sK     6!!!$'$$V,,*12.O''> -r   c                    #    US:X  a  U R                  U5        gUR                  S5      (       a  USS nU R                  X5        gg7f)z!Handle unban user menu selection.rM   r      N)rX   r   r   r  s       r   _handle_unban_user_selection0AdministrationMixin._handle_unban_user_selection  sK     6!!!$'$$X..*12.O))$@ /r   c                    #    UR                  S5      nU(       d  U R                  U5        gUS:X  a  U R                  USU5        gU R                  U5        g7f)z'Handle ban confirmation menu selection.r   Nr  r  )rS   r   r   r  s        r   _handle_ban_confirm_selection1AdministrationMixin._handle_ban_confirm_selection  sT       ))$56$$T*5 ,,T5/J $$T*r  c                    #    UR                  S5      nU(       d  U R                  U5        gUS:X  a  U R                  USU5        gU R                  U5        g7f)z)Handle unban confirmation menu selection.r   Nr  r  )rS   r   r   r  s        r   _handle_unban_confirm_selection3AdministrationMixin._handle_unban_confirm_selection  sT       ))$56&&t,5 ,,T7OL &&t,r  c                    #    UR                  S5      nUR                  SS5      nU(       d  U R                  U5        gU R                  XX%S9I Sh  vN   g N7f)z%Handle ban reason editbox submission.r   r   r   Nr   r   )rS   r   	_ban_userr   r   rE   r   r   r   s         r   _handle_ban_reason_editbox.AdministrationMixin._handle_ban_reason_editbox  sQ     ))$56))$5x@$$U+ nnUDnbbb   AAAAc                    #    UR                  S5      nUR                  SS5      nU(       d  U R                  U5        gU R                  XX%S9I Sh  vN   g N7f)z'Handle unban reason editbox submission.r   r   r   Nr7  )rS   r   _unban_userr9  s         r   _handle_unban_reason_editbox0AdministrationMixin._handle_unban_reason_editbox  sV       ))$56))$5x@&&u- uddddr<  c                   #    US:X  a  U R                  U5      I Sh  vN   gUS:X  a  U R                  U5        gUS:X  a  U R                  U5      I Sh  vN   gUS:X  a  U R                  U5      I Sh  vN   gUS:X  a  U R	                  U5      I Sh  vN   gUS:X  a  U R                  U5      I Sh  vN   gUS:X  a  U R                  U5        gg N N Nb ND N&7f)	z#Handle virtual bots menu selection.r   Nr   r   r   r   r   rM   )_fill_virtual_botsr   _show_virtual_bots_status"_show_virtual_bots_guided_overview"_show_virtual_bots_groups_overview$_show_virtual_bots_profiles_overviewrX   r   s      r   _handle_virtual_bots_selection2AdministrationMixin._handle_virtual_bots_selection  s     6!))$///W$66t<X%00666X%99$???X%99$???Z';;DAAAV#!!$' $ 0 7??AsW   CC7CCC5C6CCC5C6CCCCCc                 r   #    US:X  a  U R                  U5      I Sh  vN   gU R                  U5        g N7f)z6Handle virtual bots clear confirmation menu selection.r  N)_clear_virtual_botsr   r   s      r   ,_handle_virtual_bots_clear_confirm_selection@AdministrationMixin._handle_virtual_bots_clear_confirm_selection  s6      5 **4000((. 1s   757r?   c                    #    U R                   R                  U5      (       a  [        USUS9  U R                  SSUR                  S9  U R
                  R                  U5      nU(       a  UR                  S5        U R                  U5        U R                  R                  U0 5      nUR                  S5      S:X  a.  [        US	5        UR                  S
5        U R                  U5        U R                  U5        g7f)zApprove a pending user account.zaccount-approvedr   account-actionaccountactionnotify.oggr;   TrR   	main_menuzaccount-approved-welcomeaccountapprove.oggN)r4   approve_userr   r@   r?   r5   rS   set_approved_broadcast_login_presencer6   r>   r   r`   )r   r   r?   waiting_userwaiting_states        r   r   !AdministrationMixin._approve_user  s      88  **E#5hG  ";enn   
  ;;??84L))$/ ..|< $ 1 1 5 5h C $$V,;#L2LM ++,@A((6((/s   C<C>r   c                   #    U R                   R                  U5      nU R                  R                  U5      (       Ga  [	        USUS9  U R                  SSUR                  S9  U(       a  [        R                  " UR                  S5      nU(       a  UR                  5       OSnU(       d!  [        R                  " UR                  S5      nU S	U 3nUR                  S
5        UR                  USS9  UR                  5        H&  nUR                  R                  U5      I Sh  vN   M(     UR                  R                  SSSSUS.5      I Sh  vN   U R                  U5        g NC N7f)z*Decline and delete a pending user account.zaccount-declinedr   rN  rO  rP  zaccount-declined-goodbyer   zapproval-reject-no-reason
zaccountdeny.oggr   rm   N
disconnectFT)type	reconnectshow_messagereturn_to_loginmessage)r5   rS   r4   delete_userr   r@   r?   r
   rT   stripr>   speakget_queued_messages
connectionsendr`   )	r   r   r?   r   rV  decline_messagedisplay_reasonfull_messagemsgs	            r   r   !AdministrationMixin._decline_user  sW     {{x088))E#5hG  ";enn   
 "."2"2<3F3FHb"c39r%%1%5%5$++-H&N #2!2"^4DE''(9:""<
"C';;=C&1166s;;; >"--22 ,%*(,+/#/   	((/ <s$   D%E/'E+(,E/E-E/-E/r.   c                   #    U R                   R                  U[        R                  5        U R                  R                  U5      nU(       a  UR                  [        R                  5        U(       a  [        US5        UR                  S5        US:X  a  [        USUS9  UR                  S5        OU R                  SSUUUS9  U R                  U5        g7f)z7Promote a user to admin. Only server owner can do this.zpromote-announcement-youzaccountpromoteadmin.oggr   zpromote-announcementr   rP  N)r4   update_user_trust_levelr   r   r5   rS   set_trust_levelr   r>   _broadcast_admin_changerX   r   r.   r?   r   target_users        r   r  %AdministrationMixin._promote_to_admin6  s      	((:3C3CD kkooh/''
(8(89 K)CD""#<= h&E#9(K67 ((&)!) )  	e$   CCc                   #    U R                   R                  U[        R                  5        U R                  R                  U5      nU(       a  UR                  [        R                  5        U(       a  [        US5        UR                  S5        US:X  a  [        USUS9  UR                  S5        OU R                  SSUUUS9  U R                  U5        g7f)z?Demote an admin to regular user. Only server owner can do this.zdemote-announcement-youzaccountdemoteadmin.oggr   zdemote-announcementr   rP  N)r4   rm  r   USERr5   rS   rn  r   r>   ro  rX   rp  s        r   r  &AdministrationMixin._demote_from_adminY  s      	((:??C kkooh/''
8 K)BC""#;< h&E#8J56 ((%(!) )  	e$rs  player_namec                 6   U R                   R                  5        H{  u  pgUR                  (       d  M  U(       a  Xe:X  a  M&  US:X  a4  UR                  R                  [
        R                  R                  :  a  M`  [        XqUS9  UR                  U5        M}     g)z3Broadcast an admin promotion/demotion announcement.r|   r   N)	r5   r=   approvedr   r   r   r   r   r>   )r   r   r:   rw  r   r;   r?   r   s           r   ro  +AdministrationMixin._broadcast_admin_change|  sr     #kk//1NH==H$@(*t/?/?/E/E
HXHXH^H^/^D[AOOE" 2r   c                 ^  #    U R                   R                  U[        R                  5        U R                   R                  UR                  [        R
                  5        U R                  R                  U5      nU(       a  UR                  [        R                  5        UR                  [        R
                  5        U(       a  [        US5        UR                  S5        US:X  a  [        USUS9  UR                  S5        OU R                  SSUUUS9  U R                  U5        g7f)zJTransfer server ownership to another admin. Only server owner can do this.z#transfer-ownership-announcement-youzaccounttransferownership.oggr   ztransfer-ownership-announcementr   rP  N)r4   rm  r   r-   r?   r   r5   rS   rn  r   r>   ro  rX   rp  s        r   r%  'AdministrationMixin._transfer_ownership  s      	((:3J3JK 	((9I9IJ kkooh/''
(?(?@ 	j../ K)NO""#AB h&E#DXV;< ((1.!) )  	e$s   D+D-c                 T  #    U R                   R                  U5      nU R                  R                  U[        R
                  5        US:X  a  [        USUS9  UR                  S5        OU R                  SSUU5        U(       Ga  UR                  [        R
                  5        [        R                  " UR                  S5      nU(       a  UR                  5       OSnU(       d!  [        R                  " UR                  S5      nU SU 3nUR                  S5        UR                  US	S
9  UR                  5        H&  n	UR                  R!                  U	5      I Sh  vN   M(     UR                  R!                  SSSUS.5      I Sh  vN   U R#                  U5        g NB N7f)z0Ban a user. Admins and server owner can do this.r   zuser-bannedr   zaccountban.oggzyou-have-been-bannedr   zban-no-reasonrZ  r   rm   Nr[  FT)r\  r]  r^  r`  )r5   rS   r4   rm  r   BANNEDr   r>   ro  rn  r
   rT   rb  rc  rd  re  rf  r   )
r   r   r?   r   r   rq  ban_messagerh  ri  rj  s
             r   r8  AdministrationMixin._ban_user  s}     kkooh/ 	((:3D3DE h&E=B-. (( 	 ''
(9(9: '**;+=+=?UVK/5V\\^2N!!-!1!1+2D2Do!V)]"^,<=L""#34l:>"668!,,11#666 9((--(!&$(+	   	  ' 7s$   EF(!F$"+F(F&F(&F(c                 &  #    U R                   R                  U[        R                  5        U R                   R	                  U5        US:X  a  [        USUS9  UR                  S5        OU R                  SSUU5        U R                  U5        g7f)z2Unban a user. Admins and server owner can do this.r   zuser-unbannedr   rR  N)	r4   rm  r   ru  rS  r   r>   ro  r   )r   r   r?   r   r   s        r   r>  AdministrationMixin._unban_user  s      	((:??C 	h' h&E?8D12 (($	 	""5)s   BBc                 r  #    [        U S5      (       a  U R                  (       d"  UR                  SSS9  U R                  U5        gU R                  R	                  5       u  p#US:  a,  UR                  SX#SS9  U R                  R                  5         OUR                  S	SS9  U R                  U5        g7f)
z.Fill the server with virtual bots from config.r   virtual-bots-not-availablerl   rm   Nr   zvirtual-bots-filled)addedr   r   zvirtual-bots-already-filled)r   r   r   r   fill_server
save_state)r   r.   r  r   s       r   rB  &AdministrationMixin._fill_virtual_bots
  s      t_--T5G5GMM6vMF((/**66819MM/uTZM[))+MM7MG$$U+s   B5B7c                 @  #    [        U S5      (       a  U R                  (       d"  UR                  SSS9  U R                  U5        gU R                  R	                  5       u  p#US:  a  UR                  SUUSS9  OUR                  S	SS9  U R                  U5        g7f)
z'Clear all virtual bots from the server.r   r  rl   rm   Nr   zvirtual-bots-cleared)botstablesr   zvirtual-bots-none-to-clear)r   r   r   r   
clear_bots)r   r.   bots_clearedtables_killeds       r   rJ  'AdministrationMixin._clear_virtual_bots  s      t_--T5G5GMM6vMF((/&*&8&8&C&C&E#!MM&!$	   MM6vMF$$U+s   BBc           	      *  #    [        U S5      (       a  U R                  (       d"  UR                  SSS9  U R                  U5        gU R                  R	                  5       nUR                  SUS   US   US	   US
   SS9  U R                  U5        g7f)zShow virtual bots status.r   r  rl   rm   Nzvirtual-bots-status-reportr   r   offlinein_game)r   r   r  r  r   )r   r   r   r   r   )r   r.   r   s      r   rC  -AdministrationMixin._show_virtual_bots_status1  s      t_--T5G5GMM6vMF((/##..0(/(#9%9% 	 	
 	$$U+s   BBc                   #    [        U SS5      nU(       d  [        US5        U R                  U5        gUR                  5       nUR                  nUS   n[
        R                  " US[        US   5      US   US   US	   S
9/nUS   nU(       d(  UR                  [
        R                  " US5      5        GOSSS.nSSSS.n	U GH  n
[
        R                  " XHU
S      5      n[
        R                  " UXS      U
S   =(       d    SU
R                  S5      =(       d    SU
R                  SS5      U
R                  SS5      S9nU
S   c  [
        R                  " US5      nO[
        R                  " USU
S   S9nU
S    (       a  [
        R                  " US!5      OS"nU
S#   nU(       a  [
        R                  " XO5      O[
        R                  " US$5      nU
S%   (       a  U
S%   O[
        R                  " US&5      nU
S'   b  U
S'   OS(nUR                  [
        R                  " US)U
S*   U
S+   U
S,   U
S-   U
S.   UU
S/   U
S0   UUUUUUS195        GM     UR                  S2R                  U5      S3S49  U R                  U5        g7f)5zShow guided table overview.r   Nr  configzvirtual-bots-guided-headerguided_tablesallocation_modefallback_behaviordefault_profile)count
allocationfallbackr  zvirtual-bots-guided-emptyz!virtual-bots-guided-status-activez#virtual-bots-guided-status-inactive)TFz virtual-bots-guided-table-linkedzvirtual-bots-guided-table-stalez$virtual-bots-guided-table-unassigned)linkedstale
unassignedactivetable_statetable_id-hosttotal_playersr   human_players)r  r  playershumansticks_until_next_changezvirtual-bots-guided-no-schedulezvirtual-bots-guided-next-change)tickswarningzvirtual-bots-guided-warningr   
bot_groupsvirtual-bots-groups-no-rulesprofilez$virtual-bots-profile-inherit-defaultmax_botsu   ∞zvirtual-bots-guided-linenamegamepriorityassigned_botsmin_botswaiting_botsunavailable_bots)tabler  r  assignedr  r  waitingunavailabler   r  r   r  next_changewarning_textrZ  rl   rm   getattrr   r   get_admin_snapshotrT   r
   rS   lenrU   format_list_andrc  join)r   r.   managersnapshotrT   r  linesr  status_keystable_state_keysentryr   table_state_textnext_change_textr  r   groups_textprofile_text	max_labels                      r   rD  6AdministrationMixin._show_virtual_bots_guided_overviewD  s     $6E#?@((/--/(#,(?34!"34 34 &'8 9	
 /*LL))&2MNO :<K
 =:D 
  *..v5?7ST#/#3#3$=%9:":.5#6*1c!IIoq9 99_a8$  23;'3'7'7@a'b$'3'7'79#$=>($ Y' !$$V-JK 
 |,  !00@%))&2PQ  Y' )$%))&2XY 
 27z1B1NE*-TY	 $$2#Fm"6]!&z!2!&!7!&z!2!* %n 5$)*<$=* ,*$4$4%1!G  p 	DIIe$V4$$U+s   J	Jc                   #    [        U SS5      nU(       d  [        US5        U R                  U5        gUR                  5       nUS   nUR                  n[
        R                  " US[        U5      US   S   S9/nU(       d'  UR                  [
        R                  " US	5      5        OU H  nUS
   nUS   (       a  US   O[
        R                  " US5      n	US   (       a  [
        R                  " XWS   5      O[
        R                  " US5      n
UR                  [
        R                  " USUS   U	US   US   US   US   US   U
S9
5        M     UR                  SR                  U5      SS9  U R                  U5        g7f)zShow bot group inventory.r   Nr  r   zvirtual-bots-groups-headerr  configured_bots)r  r  zvirtual-bots-groups-emptycountsr  zvirtual-bots-no-profileassigned_rulesr  zvirtual-bots-groups-liner  r   r   r  r  r  )groupr  r   r   r  r  r  rulesrZ  rl   rm   r  )r   r.   r  r  r   rT   r  r  r  r  
rules_texts              r   rE  6AdministrationMixin._show_virtual_bots_groups_overview  s     $6E#?@((/--/(#,&kh'(9:	
 LL))&2MNOx Y' )$%))&2KL  -. !00?O9PQ%))&2PQ 
  $$2#Fm ,$Wo%h/ &y 1 &y 1 &y 1(  6 	DIIe$V4$$U+s   FFc                   #    [        U SS5      nU(       d  [        US5        U R                  U5        gUR                  5       nUS   nUR                  n[
        R                  " US[        U5      US   S   S9/nU(       d'  UR                  [
        R                  " US	5      5        OU Hz  nUS
   nU(       a'  SR                  S UR                  5        5       5      n	O[
        R                  " US5      n	UR                  [
        R                  " USUS   US   U	S95        M|     UR                  SR                  U5      SS9  U R                  U5        g7f)zShow profile override summary.r   Nr  r   zvirtual-bots-profiles-headerr  r  )r  r  zvirtual-bots-profiles-empty	overridesz, c              3   4   #    U  H  u  pU S U 3v   M     g7f)=N ).0keyr   s      r   	<genexpr>KAdministrationMixin._show_virtual_bots_profiles_overview.<locals>.<genexpr>  s     )_M^zsSE5'*:M^s   z"virtual-bots-profiles-no-overrideszvirtual-bots-profiles-liner  	bot_count)r  r  r  rZ  rl   rm   )r  r   r   r  rT   r
   rS   r  rU   r  r=   rc  )
r   r.   r  r  r   rT   r  r  r  	formatteds
             r   rF  8AdministrationMixin._show_virtual_bots_profiles_overview  sD     $6E#?@((/--/J'.(m ( 23D E	
 LL))&2OPQ!!+.	 $		)_Y__M^)_ _I , 0 09] ^I $$4 %f"'"4"+ "  	DIIe$V4$$U+s   EEr  )N)r   )r   r   )D__name__
__module____qualname____firstlineno____doc____annotations__dictstrr   r   r@   rX   r`   ri   rt   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r"  r&  r*  r.  r1  r4  r:  r?  rG  rK  r)   r   r   r0   r  r  ro  r%  r8  r>  rB  rJ  rC  rD  rE  rF  __static_attributes__r  r   r   r2   r2   3   s    
Ok!""sDy/!"K "D "
 KO
#
#&)
#=@4Z
#	
#1B[ 1BT 1BfM M M0
K 
SV 
[_ 
$J[ JT J,IK ID I4
{ 
S 
UY 

k 
C 
TX 


),
?B
	
*O+ O$ O.

25
	

 
WZ 
_c 
$E E E.G+ G$ G,
; 
 
QU 

[ 
3 
SW 


25
HK
	
$

25
HK
	
$)IK )ID )IVW+ W$ W'{ 'RU 'Z^ '&II/2I	I33/23;?3	3 
 
PS 
X\ 

G 
G(+
G48
G	
GC+ CUX C]a CB BTW B\` B00/20;?0	0 ///2/;?/	/ TT/2T;?T	T.NN/2N	N55/25;?5	5 OO/2O;?O	O?[ ?PS ?X\ ?A{ ARU AZ^ A++/2+;?+	+ --/2-;?-	- 	ck 	c 	cUY 	c^b 	ce e(+e48e	e( (TW (\` ("///2/	/ 0 0 0 0 08 '0 '0 '0S '0Z^ '0 '0R  %  %,/ %BE %	 %  %D  %  %,/ %BE %	 %  %P (,## # 	#
 # *# 
#& &% &%,/&%BE&%	&% &%P Zb2( 2(,/2(9<2(TW2(	2( 2(h Zb* *,/*9<*TW*	* *8 ,k ,d , ," ,{ ,t , ,( ,[ ,T , ,$ [,k [,d [, [,z 2,k 2,d 2, 2,h ', ',PT ', ',r   r2   )r  r&   typingr   users.network_userr   
users.baser   r   r   messages.localizationr
   ui.common_flowsr   persistence.databaser   r  r   r)   r0   r2   r  r   r   <module>r     sL    =    + < < 0 -/:c : :
L, L,r   