
    soj                        d dl Z d dl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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 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" d dl#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. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d d lDmEZEmFZFmGZGmHZHmIZImJZJ d d!lKmLZLmMZM d d"lNmOZO d d#lPmQZQ d d$lRmSZS d d%lTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[ d d&l\m]Z] d d'l^m_Z_m`Z`maZambZb d d(lcmdZd d)ed*eed+e,d,effd-Zgd.ed/e
jh        d)ed+e,d,df
d0Zi	 dJd.ed/e
jh        d)ed+e,d1eed2e?d3ed,dfd4Zjd.ed/e
jh        d,dfd5Zkd.ed/e
jh        d)ed2e?d+e,d,dfd6ZldKd.ed7e?d,edz  fd8Zmd9 Zn	 dJd/e
jh        d:eez  d;ed<eod,df
d=Zpd>ed?eqef         d+e,d,edz  fd@ZrdAed3ed,esetefefefeff         fdBZu	 dJd.ed/e
jh        d)ed*eed7e?d,eefdCZv	 dJd.ed/e
jh        d)ed7e?d;ed,dfdDZw	 dJd.ed/e
jh        d)ed2e?d;ed,dfdEZxdAed3ed,esefefefetefefeff         fdFZy	 dJd.ed/e
jh        d)ed*eed7e?d,eefdGZz	 dJd.ed/e
jh        d)ed7e?d;ed,dfdHZ{	 dJd.ed/e
jh        d)ed2e?d;ed,dfdIZ|dS )L    N)ceil)fn)UpdateMessage)ContextTypes)phrasesEnvironment)
BountyLoan)Fight)	GroupChat)Plunder)User)BountyLoanSource)
GameStatus)get_rank_by_leaderboard_user)Log)LogType)FightAttackNotificationPlunderAttackNotification)ReservedKeyboardKeysFightPlunderReservedKeys)SavedMediaName)	ScoutType)Screen)DevilFruitAbilityType)ImpelDownBountyAction)ImpelDownSentenceType)ImpelDownSource)IncomeTaxEventType)OpponentValidationException)GroupChatExceptionGroupChatError)Keyboard)add_loan)add_or_remove_bounty)convert_hours_to_durationconvert_seconds_to_durationdatetime_is_afterget_elapsed_hoursget_datetime_in_future_hoursget_elapsed_duration)get_ability_valueget_ability_adjusted_datetime)add_sentence)get_current_leaderboard_user)user_has_combat_loss_immunity)get_yes_no_keyboardfull_media_senddelete_message"full_message_or_media_send_or_editfull_message_sendmention_markdown_v2mention_markdown_user)send_notification)add_percentage_to_valueget_value_from_percentageget_random_winformat_percentage_value)get_belly_formatteduseris_group
scout_typereturnc                    t           j                                        }|| j        z  }|r!|t           j                                        z  }|t          j        u rS| j        dk    r%t          t          || j        dz
                      }t          t          || j                            }nR| j        dk    r%t          t          || j        dz
                      }t          t          || j                            }|t          j        u rt          j        nt          j        }t          t          | ||                    }|S )z
    Get the scout price
    :param user: The user
    :param is_group: If the scout is for a group
    :param scout_type: The scout type
    :return: The scout price
    r      )EnvFIGHT_PLUNDER_SCOUT_BASE_PRICEget_intlocation_level(FIGHT_PLUNDER_SCOUT_FEE_MULTIPLIER_GROUP	get_floatr   FIGHTfight_scout_countintr9   plunder_scout_countr   FIGHT_SCOUT_FEEPLUNDER_SCOUT_FEEr,   )r>   r?   r@   pricedf_ability_types        )/app/src/service/fight_plunder_service.pyget_scout_feerS   B   s6    3;;==E 
T  E  J=GGIII Y_$$!A%%/t7MPQ7QRRSSE+E43IJJKK!A%%/t7MPQ7QRRSSE+E43KLLMM
 (( 	--"4 
 !$??@@EL    updatecontextc           
        K   t          |           }t          j                            |                                t          t          |d|                              }t          ||t          j	        u rt          j        nt          j        t          j        t          j        dt          j        |j        i          g}t%          |t&          j        | ||dd           d{V  dS )z
    Send request to confirm fight
    :param update: The update
    :param context: The context
    :param user: The user
    :param scout_type: The scout type
    :return: None
    FT)screenyes_textno_textno_is_delete_buttonyes_extra_keys)saved_media_namerU   captionkeyboardadd_delete_buttonignore_bad_request_exceptionN)get_opponentr   FIGHT_PLUNDER_SCOUT_USER_GROUPformatget_markdown_mentionr=   rS   r1   r   rJ   r   	GRP_FIGHTGRP_PLUNDERKEYBOARD_OPTION_SCOUTKEYBOARD_OPTION_RETREATr   OPPONENT_IDidr2   r   FIGHT_PLUNDER_SCOUT)rU   rV   r>   r@   opponentr^   inline_keyboards          rR   group_send_scout_requestro   i   s       "&))H4;;%%''M$zBBCC G 	'1Y_'D'D6##&J\23 $4@(+N	
 	
 	
	-O '; %)           rT   is_new_scoutinbound_keyboardrm   c                 
  K   t          |d|          }g }|t          j                            t	          |          |                                          }	|                    t          ||t          j	        u rt          j        nt          j        t          j        d                     nd}
|t          j	        u r)t          ||          \  }}}}}|r|xj        dz  c_        nW	 t!          ||          \  }}}}}}}t          j                            t%          |                    }
|r|xj        dz  c_        |rt)          ||d           d{V  t+          j                                        t*          j        |k    t*          j        t4          j        k    z  t*          j                                        z                                             |j        g}|                     tB          j"                  rN|#                    |$                    tB          j"                             tK          tM          |                    }t          |d|          }t          j'                            |(                                |t	          |          t	          |          |
t	          |          |                                          }	|                    t          ||t          j	        u rt          j        nt          j        t          j)        dtB          j*        |j        tB          j"        |i                     |                    tW          t          j,        |t          j	        u rt          j        nt          j        |j-        tB          j"        |itB          j.        tB          j*        g	          g           |r|t          j/        |	z   }	ta          |tb          j2        | |	|dt          j3        |du d
	  	         d{V  dS )a[  
    Send request to confirm fight
    :param update: The update
    :param context: The context
    :param user: The user
    :param scout_type: The scout type
    :param is_new_scout: If the scout is new, so add scout count and deduct fee
    :param inbound_keyboard: The inbound keyboard
    :param opponent: The opponent
    :return: None
    FNT)rX   rY   exclude_no_button rC   )add)rX   rY   rs   
extra_keys)rX   inbound_infoinfoexclude_key_from_inbound_info)r]   rU   r^   r_   r`   delete_button_textnew_messagera   )4rS   r   FIGHT_PLUNDER_SCOUT_SEARCHrd   r=   get_bounty_formattedappendr1   r   rJ   r   	PVT_FIGHTPVT_PLUNDERrh   fight_get_oddsrK   plunder_get_odds"FIGHT_PLUNDER_SCOUT_USER_JAIL_TIMEr&   rM   r%   r   deletewhere
challengerstatusr   IN_PROGRESS
group_chatis_nullexecuterk   has_keyr   USED_OPPONENTS_IDSextendgetlistsetFIGHT_PLUNDER_SCOUT_SEARCH_USERget_markdown_nameKEYBOARD_OPTION_CHOOSErj   r#   KEYBOARD_OPTION_NEW_SCOUTrx   ITEM_ID#FIGHT_PLUNDER_SCOUT_SEARCH_USER_NEWr2   r   rl   KEYBOARD_OPTION_CANCEL)rU   rV   r>   r@   rp   rq   rm   	scout_feern   r^   potential_jail_time_textwin_probability
win_amountlose_amountfinal_bounty_if_winfinal_bounty_if_losewin_percentagesentenceused_opponent_idsnext_scout_fees                       rR   private_send_scout_requestr      s2     * dE:66I,.O 4;;	**D,E,E,G,G
 
 	+5+H+Hv''fN` 6"&	  	
 	
 	
 	
 $& ((tX.. `OZ6IK_  ,&&!+&& !x00#$'.'Q'X'X)(33( ($  .((A-(( 	&tYEBBBBBBBBBBLNN  !T)<:#99;#++--/  giii &[M##$<$OPP 	=$$ $$%=%PQQ   !%S):%;%; < <&tUJ??9@@&&((
++,,$//%%''
 
 	+5+H+Hv''fN` 7"&,8(+,?AR	 	 		
 	
 	
 	5,6)/,I,I((vOa!1!62EGXY080<3  	
 	
 	
"  H,=G
'; "9%%)
 
 
 
 
 
 
 
 
 
 
 
rT   c                 h   K   t          |t          j        | t          j        dd           d{V  dS )zx
    Send no opponent found message
    :param update: The update
    :param context: The context
    :return: None
    T)r]   rU   r^   r`   ra   N)r2   r   rl   r   %FIGHT_PLUNDER_SCOUT_NO_OPPONENT_FOUND)rU   rV   s     rR   private_send_no_opponent_foundr     s_       ';=%)           rT   c           	        K   |t          d          }|                    t          j                  s;|                    t          j                  st          | |||d|           d{V  dS |                    t          j                  r|                    t          j                  sg }|                    t          j                  r|                    t          j                  }t          |||          }|t          | |           d{V  dS t          | |||d||           d{V  dS |                    t          j                  rz|                    t          j                  r[|                    t          j                  s<||j        u rt          | |||           d{V  nt          | |||           d{V  dS |                    t          j                  r[|                    t          j                  r<||j        u rt          | |||           d{V  nt!          | |||           d{V  dS t#          d          )z
    Manage the fight request
    :param update: The update object
    :param context: The context object
    :param user: The user object
    :param inbound_keyboard: The keyboard object
    :param scout_type: The scout type
    :return: None
    Nrt   TzInvalid keyboard)r#   r   r   CONFIRMr   rj   r   r   r   find_random_opponentr   r   rJ   fight_send_requestplunder_send_requestfight_confirm_requestplunder_confirm_request
ValueError)rU   rV   r>   rq   r@   used_user_idsrm   s          rR   private_manager   1  s     $ #B<< ##$8$@AA JZJbJb ,K K  )$
DRbccccccccc  4 <== FVF^F^ ,G G  $&##$<$OPP 	^,001I1\]]M'mZHH0AAAAAAAAAF )GT:t5Ex
 
 	
 	
 	
 	
 	
 	
 	
 	 	  !5!=>>	$$%=%IJJ	 !(()A)IJJ	
 )))$VWd<LMMMMMMMMMM&vw>NOOOOOOOOO  4 <== BRBZBZ (C C  )))'?OPPPPPPPPPP)&'4AQRRRRRRRRR
'
(
((rT   r_   c                     | j         6t          j        t          j        | j        j        j        j        k              S t          j        t          |
                    t          j                                      S )z
    Get opponent from update or keyboard
    :param update: The update object. If None, the opponent is taken from the keyboard
    :param keyboard: The keyboard object. If None, the opponent is taken from the update
    :return: The opponent object
    )callback_queryr   get_or_none
tg_user_idmessagereply_to_message	from_userrk   	get_by_idrL   rF   r   rj   )rU   r_   s     rR   rb   rb   z  sZ     $6>3R3\3_ _```>#h../G/STTUUVVVrT   c                  Z   t          j        t           j        dz
                                t           j        dk                                               t          j        t           j        dz
                                t           j        dk                                               dS )z4
    Decrease the scout count
    :return: None
    rC   )rK   r   )rM   N)r   rU   rK   r   r   rM    rT   rR   decrease_scout_countr     sz     	d&<q&@AAA	t%)	*	*	 	(@1(DEEE	t'!+	,	,	rT   itemr   chat_idc                    K   ||t          d          t          | |||j                   d{V  |                                 dS )z
    Delete plunder
    :param context: The context
    :param item: The item
    :param group_chat: The group chat
    :param chat_id: The chat id
    :return: None
    Nz&Group chat or chat id must be provided)rV   r   r   
message_id)r   r3   r   delete_instance)rV   r   r   r   s       rR   delete_item_in_chatr     s}       goABBB JDO         
 	rT   playerexclude_user_idsc           	         t           j                                         }|t          j        u rt          j                                        t          j        |k     z  }t          j        t          j	        | j	        z
            
                                t          j        t          j        | j        z
            
                                f}nt          j                                        t          j        |k     z  }t          j        t          j	        | j	        z
            
                                t          j        
                                f}t           t	          j                                        t          j	        t"          j                                        k    |z  t	          j                    z  t          j        dk    z  t          j        dk    z  t          j                            |          z  t          j        | j        k    z  t          j        dk    z            j        |                     d                    }t7          |          dk    rdS t9          j        |          S )z
    Find a fight opponent, a random player with the required conditions
    :param player: The user
    :param exclude_user_ids: The list of already used opponents
    :param scout_type: The scout type
    :return: The opponent
    Fi  T
   r   N)datetimenowr   rJ   r   fight_immunity_end_dater   r   absrG   ascbountyplunder_immunity_end_datelast_system_interaction_dater   selectr   rD   REQUIRED_LOCATION_LEVEL_FIGHTrF   'get_is_not_arrested_statement_conditionis_adminrk   not_in	is_activeorder_bylimitlenrandomchoice)r   r   r@   r   immunity_conditionorder_by_conditioneligible_userss          rR   r   r     s	    



!
!CY_$$":BBDD(3.

 F4&)>>??CCEEF4;.//3355

 #<DDFF*S0

 F4&)>>??CCEE-1133
 		 C$E$M$M$O$OO !;==? }%' {T!	#
 w~~.//1 w&)#% ~%'	

 	

 
%	' 
r N  >at =(((rT   r   c           	      &   t          | j        |                                z  dz            }t          |           }t	          |          }t          ||j                  }t          ||j                  }| 	                                r,t          |t          j                                                  }d|z
  }t          |t          j        |d          }t!          t          |t          j                                                  d          }t!          d|z
  d          |}}t%          t'          |j        |                    }t%          t'          | j        t          ||                              }| j        |z   }	| j        |z
  }
||||	|
fS )a  
    Get the win probability
    :param challenger: The challenger object
    :param opponent: The opponent object
    :return: list -  [0] - Win probability, [1] - Win amount, [2] - Lose amount
            [3] - Final bounty if user win, [4] - Final bounty if user lose
    2   d   T)add_to_value   )r<   r   get_max_bountyr/   r   maxmin_win_probabilityminmax_win_probabilityhas_bounty_gain_limitationsrD   (FIGHT_MAX_WIN_PROBABILITY_FINAL_LOCATIONrI   r,   r   FIGHT_DEFENSE_BOOSTround3FIGHT_MAX_WIN_PROBABILITY_DEVIL_FRUIT_DEFENSE_BOOSTrL   r:   )r   rm   r   leaderboard_userleaderboard_ranklose_probabilityopponent_win_probabilityr   r   final_bounty_if_wonr   s              rR   r   r     s    .z/@8CZCZC\C\/\`b.bccO 4J??34DEE/+;+OPPO/+;+OPPO--// 
SISSUU
 
 _,  1';=M\`       %$CMMOO	
 	
 	
    	c,,a00  &O .x@PQQRRJ !*"3SJZ5[5[\\ K %+j8%,{:J5HJ^^^rT   c                 	  K   |t          d          }d}| j        ~|                    t          j                  r_t          j        t
          j        t          |j	        t          j                           k              }|t          t          j                  t          j                                        }|9|                                t           j        urt          t          j                  |                    t          j                  x}rt          j        |          }t*          j                                        }	t1          |j                  |	k    r[t4          j                            t;          |	          t=          |j                            }
t?          ||
| dd           d{V  dS |                                 ]t4          j!                            tE          j#        tH          j%        |j                            }
t?          ||
| dd           d{V  dS dS |j&        |j&        |k    rtO          |j&        t          j                                        z
  (                                          }t4          j)                            |          }
t?          ||
| dd           d{V  dS |r$|du p|                    t          j                   n|                    t          j*                   }|rtW          ||tX          j%                  }|j-        |k     ri|rt4          j.        nt4          j/                            ta          |          |1                                          }
t?          ||
| dd           d{V  dS |s!|                    t          j*                  sdS 	 te          | |          }|+tg          t          j4        5                                          |j6        t*          j7                                        k     rtg                      tq          |j9                  rtg                      |:                                rtg                      nb# tf          $ rU}|j;        t?          ||j;        | d           d{V  n$t?          |t4          j<        | dd           d{V  Y d}~dS d}~ww xY wdS )a&  
    Validate the fight request
    :param update: The update object
    :param context: The context object
    :param user: The user object
    :param is_group: If the fight is for a group
    :param keyboard: The keyboard object
    :return: True if the request is valid, False otherwise
    Nrt   Tr`   ra   Fra   rU   r`   ra   )=r#   r   r   r   r   r   r   rk   rL   rx   r!   r"   ITEM_NOT_FOUNDr   r   
get_statusr   r   ITEM_IN_WRONG_STATUSIN_REVENGE_TO_ATTACK_IDr   rD   $FIGHT_PLUNDER_REVENGE_DURATION_HOURSrF   r)   dater   PLUNDER_REVENGE_TOO_LATErd   r&   r+   r4   get_revenge_fight PLUNDER_REVENGE_ALREADY_REVENGEDr   get_deeplink_by_typer   rJ   fight_cooldown_end_dater'   total_secondsFIGHT_USER_IN_COOLDOWNrj   rS   r   r   -FIGHT_PLUNDER_GROUP_INSUFFICIENT_SCOUT_BOUNTY/FIGHT_PLUNDER_PRIVATE_INSUFFICIENT_SCOUT_BOUNTYr=   r}   rb   r    FIGHT_OPPONENT_NOT_FOUNDbuildrG   r   r(   r   is_arrestedr   FIGHT_CANNOT_FIGHT_USER)rU   rV   r>   r?   r_   fightr   attack_fight_idattack_fightfight_revenge_hoursot_textremaining_timeabout_to_charge_scout_feer   rm   oves                   rR   fight_validater  ,  s     " B<< E(X-=-=>V>^-_-_((HHM*B*JKLLL
 
 =$^%BCCC




!
!C U--//z7MMM !DEEE #../G/_``` #oo>> $'#K#S#S#U#U\.//2EEE6==)*=>>$\%677 G 5&D_c          5 ))++7>EE(HH G 5&D_c          5 t #/D4PSV4V4V4)H,=,A,A,C,CCRRTT
 
 077GG0'6]a  AE  F  F  F  	F  	F  	F  	F  	F  	F  	Fu 	HT		S!1!12J2R!S!SS!!":"FGGG 
 ! 	!$)/BB	;"" MEELf(33T5N5N5P5PQQ	 
 5Wgvae  EI  J  J  J  J  J  J  J  J  J  J5  H,,-E-QRR t%fh77 -n.U.[.[.].]^^^ "S%F%N%N%P%PPP-/// X=>> 	0-/// !! 	0-///	0 '   ;"4Wck6ptuuuuuuuuuuu48[_  C          uuuuu 4   ;B6Q2 2
S<A
SSc                   K   |Vt          |t          |dt          j                  dd           d{V  |xj        dz  c_        |                                 t          j                                        t          j	        |k    t          j
        t          j        k    z            }|D ] }t          ||||j                   d{V  !t          | |          }t!          ||          \  }}	}
}}t                      }||_	        ||_        ||_        |	|_        ||_        |                                 |dk    rt*          j        }|}nt*          j        }d|z
  }|                                r |                                st*          j        nd	}t*          j                            |                                |                                ||||                                tA          |          tA          |                    }tC          ||tD          j#        ntD          j$        t*          j%        t*          j&        |j'        |d
          g}||(                    tR          j*                  s|+                    tY          t*          j-        |j.        tR          j/        gtD          j$                  g           |t*          j0                            tA          t          |dt          j                                      z  }tc          |td          j        | ||d           d{V }|r|j3        |_3        |                                 dS )z
    Send request to confirm fight
    :param update: The update
    :param context: The context
    :param user: The user
    :param keyboard: The keyboard
    :param group_chat: The group chat
    :return: None
    NTFru   should_saverC   r   r   r   rt   rX   rY   rZ   primary_keyrq   add_inbound_key_inforw   ry   rX   r]   rU   r^   r_   ra   )4r%   rS   r   rJ   rK   saver   r   r   r   r   r   r   r   r   rb   r   rm   r   bellyr   r   "FIGHT_CONFIRMATION_OUTCOME_VICTORY!FIGHT_CONFIRMATION_OUTCOME_DEFEATis_crew_member#has_higher_bounty_than_crew_average$FIGHT_CONFIRMATION_ODDS_RECALCULATEDFIGHT_CONFIRMATION_REQUESTrd   re   r   r}   r=   r1   r   rf   r   KEYBOARD_OPTION_FIGHTri   rk   r   r   r   r~   r#   r   rx   rj   FIGHT_PLUNDER_SCOUT_NEXT_FEEr2   r   r   )rU   rV   r>   r_   r   previous_fightsprevious_fightrm   r   r   r   r   r   r  outcomeoutcome_probabilityodds_recalculated_textr^   rn   r   s                       rR   r   r     s       "4tT9?)S)SY^lpqqqqqqqqqq!#		 $)<>>#7#7		T	!elj6L&LM$ $O * ` `!'>:t___________ "&(33HtX&& XOZ.ACW
 77EEEN+EEK!E	JJLLL"<-;!O3 ""$$	-5-Y-Y-[-[	44  077!!##""$$!!##/00011	 	G 	'1'=6##6CS23%!%	
 	
 	

-O ("2"2 8# # 	5!)0<3 "+  		
 	
 	
 	77>>dE9? K KLL
 
 	
 %4'- %)% % %      G  ."-	JJLLLLLrT   c           
      	  K   t          j        t           j        |j        t          j                 k              }|                    t          j                  }|j        t          j	                 s|:t          |t          j        | d           d{V  t          |||           d{V S |j        }|                                 |rt!          |            d{V S t#          | ||t$          j        d||           d{V S |j        }t)          ||          \  }}	}
}}||_        t,          j                                        |_        |r6t          j        |                    t          j                            |_        t9          |          rt:          j        |_        tA          |          rdn|	}	|	|_!        |	dk    rFtE          ||	|| tF          j        |j        d|           d{V  tE          ||	d| d           d{V  t          j$        %                    tM          |j'        d	          tQ          |          tS          |	          |*                                          }nt:          j+        |_        tA          |          rdn|
}
|
|_!        |
dk    rFtE          ||
d| d           d{V  tE          ||
|| tF          j        |j        d|           d{V  t          j,        %                    tM          |j'        d	          tQ          |          tS          |
          |*                                          }|st[          |t\          j/        t`          j/                                                  |_1        d|_1        t[          |t\          j2        t`          j2                                                  |_3        d|_3        g }d}|t          j4        }|s|t          j5        %                    tS          tm          |dt$          j                                      z  }|7                    tq          t          j9        tt          j;        |j        t          j        t          j<        g
          g           t{          ||| dd||d           d{V  |>                                 |>                                 t          ||j        t          |                     d{V  dS )
    Keyboard interaction
    :param update: The update
    :param context: The context
    :param user: The user
    :param inbound_keyboard: The keyboard
    :param group_chat: The group chat
    :return: None
    NTanswer_callbackrU   Fr   rV   rU   tax_event_typeevent_idr  rm   ru   rU   r  yourX   rw   ry   )r^   rU   r`   edit_only_caption_and_keyboardrz   r_   ra   )Ar   r   rk   rx   r   r   r   r   r   r   r5   r   FIGHT_CONFIRMATION_RETREATr   rm   r   r3   r   r   rJ   r   r   r   r   r   r   rF   in_revenge_to_fightr;   r   WONr   r0   r  r%   r   	FIGHT_WINrd   r6   r   r7   r=   r}   LOST
FIGHT_LOSEr-   r   FIGHT_IMMUNITY_DURATIONrD   r   FIGHT_COOLDOWN_DURATIONr   KEYBOARD_OPTION_CLOSEr$  rS   r~   r#   r   r   r   rj   r2   r  r8   r   )rU   rV   r>   rq   r   r  
is_revengerm   r   r   r   r   r   r^   rn   rz   s                   rR   r   r   '  s     ( 9UX)9)>?W?_)``aaE!))*B*Z[[J  !5!=> 
!#;VUY          -WeZHHHHHHHHH  	7'v6666666666 0GT9?E;KX
 
 
 
 
 
 
 
 	
 ^H 	tX&& XOZ.ACW ,E"&&((EJ 
$)O$$%=%UVV%
 %
! o&& 1
!~7AAQQQz
 >>&17 	 	 	 	 	 	 	 	 	 	 '*%D          #**77!(++
++%%''	
 
 "8>>OaaK!??&t[eF`deeeeeeeeee&17 	 	 	 	 	 	 	 	 	 	 $++77!(++,,%%''	
 
  0+H!9'//11,
 ,
( (,$ (E!9'//11(
 (
$ ,0(,.O$: 	w;BB#M$y$O$OPP  G ""9%/%5%:4<4@7	  
   '+- %)	 	 	 	 	 	 	 	 	 	 MMOOO	JJLLL GU^5LU5S5S
T
TTTTTTTTTTrT   c                 *   t          t          |j                            }t          t	          |t
          j                                                  t
          j                                                  }d|z
  dz  }t          t          |j        |                    }t          t          | t          j        |                    }t          |t
          j                                        z            }| j        |z   }| j        |z
  }|||||||fS )aI  
    Get the win probability
    :param challenger: The challenger object
    :param opponent: The opponent object
    :return: list -  [0] - Win probability, [1] - Win amount, [2] - Lose amount,
     [3] - Win percentage [4] - Final bounty if user win, [5] - Final bounty if user lose,
     [6] - Sentence duration in hours
    r   r   )r   r)   r   r   r   rD   PLUNDER_MIN_INACTIVE_HOURSrF   PLUNDER_MAX_INACTIVE_HOURSrL   r:   r   r,   r   PLUNDER_SENTENCE_DURATIONPLUNDER_REPAY_MULTIPLIERrI   )	r   rm   r   r   r   sentence_durationr   r   r   s	            rR   r   r     s    ,X-RSSTTOOS;CCEEFF&..00 O O+q0N.xOOPPJ-G	
 	
 
 j3#?#I#I#K#KKLLK$+j8%,{: 	 rT   c                 	  K   |t          d          }d}| j        ~|                    t          j                  r_t          j        t
          j        t          |j	        t          j                           k              }|t          t          j                  t          j                                        }|9|                                t           j        urt          t          j                  |                    t          j                  x}rt          j        |          }t*          j                                        }	t1          |j                  |	k    r[t4          j                            t;          |	          t=          |j                            }
t?          ||
| dd           d{V  dS |                                 ]t4          j!                            tE          j#        tH          j%        |j                            }
t?          ||
| dd           d{V  dS dS |j&        |j&        |k    rtO          |j&        t          j                                        z
  (                                          }t4          j)                            |          }
t?          ||
| dd           d{V  dS |r$|du p|                    t          j                   n|                    t          j*                   }|rtW          ||tX          j%                  }|j-        |k     ri|rt4          j.        nt4          j/                            ta          |          |1                                          }
t?          ||
| dd           d{V  dS |s!|                    t          j*                  sdS 	 te          | |          }|+tg          t          j        4                                          |j5        t*          j6                                        k     rtg                      to          |j8                  rtg                      |9                                rtg                      nb# tf          $ rU}|j:        t?          ||j:        | d           d{V  n$t?          |t4          j;        | dd           d{V  Y d}~dS d}~ww xY wdS )a*  
    Validate the plunder request
    :param update: The update object
    :param context: The context object
    :param user: The user object
    :param is_group: If the plunder is for a group
    :param keyboard: The keyboard object
    :return: True if the request is valid, False otherwise
    Nrt   Tr   Fr   r   )<r#   r   r   r   r   r   r   rk   rL   rx   r!   r"   r   r   r   r   r   r   r   r   r   rD   r   rF   r)   r   r   r   rd   r&   r+   r4   get_revenge_plunderr   r   r   r   PLUNDERplunder_cooldown_end_dater'   r   PLUNDER_USER_IN_COOLDOWNrj   rS   r   r   r  r  r=   r}   rb   r    r  rG   REQUIRED_LOCATION_LEVEL_PLUNDERr(   r   r  r   PLUNDER_CANNOT_PLUNDER_USER)rU   rV   r>   r?   r_   plunderr   attack_plunder_idattack_plunderplunder_revenge_hoursr  r  r  r   rm   r  s                   rR   plunder_validaterQ     s     " B<< #G(X-=-=>V>^-_-_(".J#hm,D,LMNNN
 
 ?$^%BCCC




!
!C w1133:;QQQ !DEEE %001I1abbb ")"34E"F"F &)%M%U%U%W%W^0114III6==)*?@@$^%899 G 5&D_c          5 --//;>EE(.:KLL G 5&D_c          5 t %1d6TWZ6Z6Z4+h.?.C.C.E.EETTVV
 
 299.II0'6]a  AE  F  F  F  	F  	F  	F  	F  	F  	F  	Fu 	HT		S!1!12J2R!S!SS!!":"FGGG 
 ! 	!$)2CDD	;"" MEELf(33T5N5N5P5PQQ	 
 5Wgvae  EI  J  J  J  J  J  J  J  J  J  J5  H,,-E-QRR t%fh77 -n.K.Q.Q.S.STTT "S%H%P%P%R%RRR-/// X?@@ 	0-/// !! 	0-///	0 '   ;"4Wck6ptuuuuuuuuuuu4<V_c  CG          uuuuu 4r  c                 V  K   |Vt          |t          |dt          j                  dd           d{V  |xj        dz  c_        |                                 t          j                                        t          j	        |k    t          j
        t          j        k    z            }|D ] }t          ||||j                   d{V  !t          | |          }t!          ||          \  }}	}
}}}}t                      }||_	        ||_        ||_        |	|_        ||_        ||_        |                                 t,          j                            |                                |                                t7          |	          t7          |
          t9          |d          |j        |                                t7          |          t7          |          	  	        }t=          ||t>          j         nt>          j!        t,          j"        t,          j#        |j$        |d          g}||%                    tL          j'                  s|(                    tS          t,          j*        |j+        tL          j,        gt>          j!        	          g           |t,          j-                            t7          t          |dt          j                                      z  }t]          |t^          j        | ||d
           d{V }|r|j0        |_0        |                                 dS )z
    Send request to confirm plunder
    :param update: The update
    :param context: The context
    :param user: The user
    :param keyboard: The keyboard
    :param group_chat: The group chat
    :return: None
    NTFr  rC   r  	show_fullr  r  r  )1r%   rS   r   rH  rM   r  r   r   r   r   r   r   r   r   r   rb   r   rm   r   r  r   rE  r   PLUNDER_CONFIRMATION_REQUESTrd   re   r   r=   r&   r}   r1   r   rg   r   KEYBOARD_OPTION_PLUNDERri   rk   r   r   r   r~   r#   r   rx   rj   r$  r2   r   r   )rU   rV   r>   r_   r   previous_plundersprevious_plunderrm   r   r   r   r   r   r   r   rM  r^   rn   r   s                      rR   r   r     sV       "4tT9CT)U)U[`nrssssssssss  A%  		 (/~'7'7'='=		t	#*:P(PQ( ( . b b!'+;ZQUQ`aaaaaaaaaaa "&(33H 	x(( yyGGG-GGM#G (GLLNNN299!!##""$$J''K((!(d;;;!!##/00011
 
G 	)3)?6%%VEW43
%!%	
 	
 	

-O ("2"2 8# # 	5!)0<3 "-  		
 	
 	
 	77>>dE9;L M MNN
 
 	
 %4'/ %)% % %      G  0$/LLNNNNNrT   c           
        K   t          j        t           j        |j        t          j                 k              }|                    t          j                  }|j        t          j	                 s|:t          |t          j        | d           d{V  t          |||           d{V S |rt          |            d{V S |j        }|                                 t#          | ||t$          j        d||           d{V S |j        }t)          ||          \  }}	}
}}}}||_        t,          j                                        |_        |	|_        ||_        |r6t          j        |                    t          j                            |_        t=          |          rt>          j         |_!        tE          |          rdn|	}	|	|_        |	dk    rFtG          ||	|| tH          j        |j        d|           d{V  tG          ||	d| d           d{V  t          j%        &                    |'                                |(                                tS          |	          |*                                          }tV          j,        }nt>          j-        |_!        tE          |          rAt          j.        &                    |'                                t_          |                    }n&ta          |||
|tb          j        |j2        |j        	          }t          j3        &                    |'                                t_          |          ti          |j        d
          tS          |
          |5                                |6                                          }to          ||tp          j9        tt          j;        ty          |j                  t          j=        &                    |j>                  t~          j        |j                   d{V  tV          j@        }|st          |t          jC        t          jC                                                  |_E        d|_E        t          |t          jF        t          jF                                                  |_G        d|_G        g }d}|t          jH        }|s|t          jI        &                    tS          t          |dt$          j                                      z  }|K                    t          t          jM        t          jO        |j        t          j        t          jP        g          g           t          |||| d||d           d{V  |R                                 |R                                 t          ||j        t          |                     d{V  dS )r+  NTr,  r.  Fr   r/  r2  )r   external_idrS  )rZ  r4  )r]   r^   rU   r`   rz   r_   ra   )Ur   r   rk   rx   r   r   r   r   r   r   r5   r   r6  r   r3   rm   r   r   r   rH  r   r   r   r   r   r  rE  r   rF   in_revenge_to_plunderr;   r   r8  r   r0   r%   r   PLUNDER_WINrd   get_you_markdown_mentionre   r=   r}   r   PLUNDER_SUCCESSr:  PLUNDER_LOSE_IMMUNEr7   r$   r   r   PLUNDER_LOSEr&   get_deeplinkr   r.   r   	TEMPORARYr   NONEr*   PLUNDER_LOSE_SENTENCE_REASONtg_first_namer   PLUNDER_FAILr-   r   PLUNDER_IMMUNITY_DURATIONrD   r   PLUNDER_COOLDOWN_DURATIONrI  r>  r$  rS   r~   r#   r   r   r   rj   r2   r  r8   r   )rU   rV   r>   rq   r   rM  r?  rm   r   r   r   r   r   r   r   r^   r]   loanrn   rz   s                       rR   r   r     sd     ( {
&+,D,LMM G "))*B*Z[[J  !5!=> 
!#;VUY          -WgzJJJJJJJJJ  	7'v6666666666 !)!!!/GT9#4e=Mx
 
 
 
 
 
 
 
 	
 %H 	x(( .G$((**GLGM (G 
(/(9$$%=%UVV)
 )
% o&& DG#7AAQQQz
">>&19  !	 	 	 	 	 	 	 	 	 	 '*%D          %,,))++))++
++%%''	
 
 ,:+I#(.. $	188--//%h// GG  ( ("-#J     D *11--//%h//)'*CtTTT#K00!!##**,, G %/%*,W-FGG4;;H<RSS'#J	 	 	 	 	 	 	 	 	 	 ,:+F 2-J!;)1133.
 .
* *.& *G!;)1133*
 *
& .2*,.O$: 	w;BB#M$y?P$Q$QRR  G ""9%1%5%:4<4@7	  
   )- %)	 	 	 	 	 	 	 	 	 	 MMOOOLLNNN GW%57PQX7Y7Y
Z
ZZZZZZZZZZrT   )N)NN)}r   r   mathr   peeweer   src.tg_compatr   r   src.tg_compat.extr   	resourcesr   r	   rD   src.model.BountyLoanr
   src.model.Fightr   src.model.GroupChatr   src.model.Plunderr   src.model.Userr    src.model.enums.BountyLoanSourcer   src.model.enums.GameStatusr   src.model.enums.LeaderboardRankr   src.model.enums.Logr   src.model.enums.LogTyper   src.model.enums.Notificationr   r   $src.model.enums.ReservedKeyboardKeysr   r   src.model.enums.SavedMediaNamer   src.model.enums.ScoutTyper   src.model.enums.Screenr   1src.model.enums.devil_fruit.DevilFruitAbilityTyper   0src.model.enums.impel_down.ImpelDownBountyActionr   0src.model.enums.impel_down.ImpelDownSentenceTyper   *src.model.enums.impel_down.ImpelDownSourcer   -src.model.enums.income_tax.IncomeTaxEventTyper   src.model.error.CustomExceptionr    src.model.error.GroupChatErrorr!   r"   src.model.pojo.Keyboardr#   src.service.bounty_loan_servicer$   src.service.bounty_servicer%   src.service.date_servicer&   r'   r(   r)   r*   r+   src.service.devil_fruit_servicer,   r-   src.service.impel_down_servicer.   src.service.leaderboard_servicer/   src.service.user_servicer0   src.service.message_servicer1   r2   r3   r4   r5   r6   r7    src.service.notification_servicer8   src.utils.math_utilsr9   r:   r;   r<   src.utils.string_utilsr=   boolrL   rS   DEFAULT_TYPEro   r   r   r   rb   r   strr   r   r   tuplefloatr   r  r   r   r   rQ  r   r   r   rT   rR   <module>r     s	                 ) ) ) ) ) ) ) ) * * * * * * 1 1 1 1 1 1 1 1 + + + + + + ! ! ! ! ! ! ) ) ) ) ) ) % % % % % %       = = = = = = 1 1 1 1 1 1 H H H H H H # # # # # # + + + + + + [ [ [ [ [ [ [ [ _ _ _ _ _ _ _ _ 9 9 9 9 9 9 / / / / / / ) ) ) ) ) ) S S S S S S R R R R R R R R R R R R F F F F F F L L L L L L G G G G G G M M M M M M M M , , , , , , 4 4 4 4 4 4 ; ; ; ; ; ;                ] \ \ \ \ \ \ \ 7 7 7 7 7 7 H H H H H H B B B B B B                  ? > > > > >            7 6 6 6 6 6$ $ $) $ $ $ $ $N&&)6&>B&PY&	& & & &` I II&I I 	I
 I I I 
I I I IX)6	   &F)F)&F) F) 	F)
 F) 
F) F) F) F)RW W W( WdTk W W W W  . 	 &
E/  	
 
   67)7)$(I7);D7)	D[7) 7) 7) 7)t7_t 7_t 7_eS#sTW>W8X 7_ 7_ 7_ 7_B A AA&A A 	A
 A 
A A A AR !s ss&s s 	s
 s 
s s s sx !iU iUiU&iU iU 	iU
 iU 
iU iU iU iUX(( $(
3S%c3./( ( ( (d A AA&A A 	A
 A 
A A A AR !l ll&l l 	l
 l 
l l l lj !G[ G[G[&G[ G[ 	G[
 G[ 
G[ G[ G[ G[ G[ G[rT   