§
    soj7  ã                   óª   — d dl Z d dlT 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mZ  G d„ d	e¦  «        Ze                     ¦   «          dS )
é    N)Ú*)Ú	BaseModel)Ú	GroupChat)ÚUser)Ú
GameStatus)Úget_elapsed_hoursÚget_remaining_durationÚget_datetime_in_future_hoursc                   ó¬  — e Zd ZU dZ eeddd¬¦  «        Zeez  ed<    eeddd¬¦  «        Zeez  ed<    e	¦   «         Z
ee	z  ed<    eej        j        ¬	¦  «        Zej        ez  ed
<    eej        ¬	¦  «        Zeez  ed<    eedddd¬¦  «        Zeez  ed<    ed¬¦  «        Zeez  ed<    ed¬¦  «        Zeez  ed<    eddddd¬¦  «        ZdZ G d„ d¦  «        Zdedefd„Ze dededefd„¦   «         Z!e dededefd„¦   «         Z"e dededd fd„¦   «         Z#e dedeeffd„¦   «         Z$dedefd „Z%defd!„Z&d%d"„Z'd&dedefd#„Z(de)fd$„Z*dS )'ÚFightz
    Fight class
    Úfight_challengersÚCASCADE)ÚbackrefÚ	on_deleteÚ	on_updateÚ
challengerÚfight_opponentsÚopponentÚwin_probability)ÚdefaultÚdateÚstatusTÚfight_groups_chatsÚRESTRICT)Únullr   r   r   Ú
group_chat)r   Ú
message_idÚbellyÚselfÚrevenge_attack_fightsNc                   ó   — e Zd ZdZdS )ú
Fight.MetaÚfightN)Ú__name__Ú
__module__Ú__qualname__Údb_table© ó    ú/app/src/model/Fight.pyÚMetar"   4   s   € € € € € Øˆˆˆr)   r+   ÚuserÚreturnc                 ó‚   — |j         | j        j         k    r!t          t          | j        ¦  «        ¦  «        S d| j        z
  S )zz
        Get the win probability given a user

        :param user: The user
        :return: The win probability
        éd   )Úidr   ÚfloatÚstrr   ©r   r,   s     r*   Úget_win_probabilityzFight.get_win_probability7   s=   € ð Œ7d”oÔ(Ò(Ð(Ý˜TÔ1Ñ2Ô2Ñ3Ô3Ð3à˜Ô-Ñ-Ð-r)   c                 ó¸  — t          ¦   «                              ¦   «                              t           j        | k    t           j        |k    z  ¦  «                             ¦   «         t          ¦   «                              ¦   «                              t           j        | k    t           j        |                     ¦   «         k    z  ¦  «                             ¦   «         z   S )zÂ
        Get the total amount of wins or losses a user has
        param user: The user
        param status: The status (won or lost)
        return: The total amount of wins or losses
        )r   ÚselectÚwherer   r   Úcountr   Úget_opposite_status©r,   r   s     r*   Úget_total_win_or_losszFight.get_total_win_or_lossD   s“   € õ ‰GŒGNŠNÑÔ×"Ò"¥EÔ$4¸Ò$<ÅÄÐQWÒAWÑ#XÑYÔY×_Ò_ÑaÔaÝ‰gŒgßŠV‰XŒXßŠU•E”N dÒ*­u¬|¸v×?YÒ?YÑ?[Ô?[Ò/[Ñ\Ñ]Ô]ßŠU‰WŒWñ	ð	
r)   c                 ó(  — t                                t                               t           j        ¦  «        ¦  «                             t           j        | k    t           j        |k    z  ¦  «                             ¦   «         t                                t                               t           j        ¦  «        ¦  «                             t           j	        | k    t           j        | 
                    ¦   «         k    z  ¦  «                             ¦   «         z   S )z¼
        Get the total amount of belly a user has won or lost
        param user: The user
        param status: The status (won or lost)
        return: The total amount of belly
        )r   r6   ÚfnÚSUMr   r7   r   r   Úscalarr   r9   r:   s     r*   Úget_total_belly_won_or_lostz!Fight.get_total_belly_won_or_lostU   s·   € õ LŠLŸš¥¤Ñ,Ô,Ñ-Ô-×3Ò3ÝÔ! TÒ)­e¬l¸fÒ.DÑEñô ÷ Š&‰(Œ(ÝLŠLŸš¥¤Ñ,Ô,Ñ-Ô-×3Ò3Ý” 4Ò'­E¬L¸F×<VÒ<VÑ<XÔ<XÒ,XÑYñô ÷ Š&‰(Œ(ñð 	r)   c                 ó˜  — t          ¦   «                              ¦   «                              t           j        | k    t           j        |k    z  ¦  «                             t           j                             ¦   «         ¦  «                             ¦   «         }t          ¦   «                              ¦   «                              t           j	        | k    t           j        | 
                    ¦   «         k    z  ¦  «                             t           j                             ¦   «         ¦  «                             ¦   «         }t          ||d„ ¬¦  «        S )z¤
        Get the fight with the max belly won or lost
        param user: The user
        param status: The status (won or lost)
        return: The fight
        c                 ó   — | j         S ©N)r   )Úfs    r*   ú<lambda>z+Fight.get_max_won_or_lost.<locals>.<lambda>„   s
   € ÐQRÔQX€ r)   )Úkey)r   r6   r7   r   r   Úorder_byr   ÚdescÚfirstr   r9   Úmax)r,   r   Úmax_fight_as_challengerÚmax_fight_as_opponents       r*   Úget_max_won_or_lostzFight.get_max_won_or_losth   sâ   € õ ‰GŒGßŠV‰XŒXßŠU•EÔ$¨Ò,µ´ÀÒ1GÑHÑIÔIßŠX•e”k×&Ò&Ñ(Ô(Ñ)Ô)ßŠU‰WŒWð 	 õ ‰GŒGßŠV‰XŒXßŠU•E”N dÒ*­u¬|¸v×?YÒ?YÑ?[Ô?[Ò/[Ñ\Ñ]Ô]ßŠX•e”k×&Ò&Ñ(Ô(Ñ)Ô)ßŠU‰WŒWð 	õ Ð*Ð,AÐGXÐGXÐYÑYÔYÐYr)   c                 óÚ  — t          ¦   «                              t           j        t                               t           j        ¦  «                             d¦  «        ¦  «                             t           j        | k    ¦  «                             t           j        ¦  «         	                    t          d¦  «                             ¦   «         ¦  «                             ¦   «         }|j        }t          ¦   «                              t           j        t                               t           j        ¦  «                             d¦  «        ¦  «                             t           j        | k    ¦  «                             t           j        ¦  «         	                    t          d¦  «                             ¦   «         ¦  «                             ¦   «         }|j        }||k    r	|j        |fS |j        |fS )zž
        Get the most fought user and the amount of fights
        param user: The user
        return: The most fought user and the amount of fights
        r8   )r   r6   r   r=   ÚCOUNTÚaliasr7   r   Úgroup_byrG   ÚSQLrH   rI   r8   )r,   Úmost_fought_user_as_challengerÚamount_as_challengerÚmost_fought_user_as_opponentÚamount_as_opponents        r*   Úget_most_fought_userzFight.get_most_fought_user†   sR  € õ ‰GŒGßŠV•E”N¥B§H¢H­U¬^Ñ$<Ô$<×$BÒ$BÀ7Ñ$KÔ$KÑLÔLßŠU•5Ô# tÒ+Ñ,Ô,ßŠX•e”nÑ%Ô%ßŠX•c˜'‘l”l×'Ò'Ñ)Ô)Ñ*Ô*ßŠU‰WŒWð 	'ð  >ÔCÐõ ‰GŒGßŠV•EÔ$¥b§h¢h­uÔ/?Ñ&@Ô&@×&FÒ&FÀwÑ&OÔ&OÑPÔPßŠU•5”> TÒ)Ñ*Ô*ßŠX•eÔ&Ñ'Ô'ßŠX•c˜'‘l”l×'Ò'Ñ)Ô)Ñ*Ô*ßŠU‰WŒWð 	%ð :Ô?ÐàÐ 4Ò4Ð4Ø/Ô:Ð<NÐNÐNà-Ô6Ð8LÐLÐLr)   c                 ó4   — | j         |k    r| j         n| j        S )zb
        Get the other opponent
        param user: The user
        return: The opponent
        )r   r   r3   s     r*   Úget_opponentzFight.get_opponent§   s   € ð #'¤/°TÒ"9Ð"9ˆtŒˆ¸t¼}ÐLr)   c                 ó*   — t          | j        ¦  «        S )zT
        Get the status of the game
        :return: The status of the game
        )r   r   ©r   s    r*   Ú
get_statuszFight.get_status²   s   € õ ˜$œ+Ñ&Ô&Ð&r)   c                 óR   — t                                t           j        | k    ¦  «        S )zJ
        Get the revenge fight
        :return: The revenge fight
        )r   Úget_or_noneÚin_revenge_to_fightr[   s    r*   Úget_revenge_fightzFight.get_revenge_fightº   s    € õ × Ò ¥Ô!:¸dÒ!BÑCÔCÐCr)   c                 óÊ   — | j         |k    rdS t          | j        ¦  «        t          j                             ¦   «         k    rdS | j        dS |                      ¦   «         dS dS )a  
        Check if a fight can be revenged.
        User can revenge a fight if they were attacked less than x time ago and have not
        already revenged that fight
        :param user: The user
        :return: True if the user can revenge the fight, False otherwise
        FNT)r   r   r   ÚEnvÚ$FIGHT_PLUNDER_REVENGE_DURATION_HOURSÚget_intr_   r`   r3   s     r*   Úcan_revengezFight.can_revengeÂ   so   € ð Œ?˜dÒ"Ð"Ø5õ ˜TœYÑ'Ô'­#Ô*R×*ZÒ*ZÑ*\Ô*\Ò\Ð\Ø5ð Ô#Ð/Ø5ð ×!Ò!Ñ#Ô#Ð/Ø5àˆtr)   c                 ó~   — t          t          t          j                             ¦   «         | j        ¦  «        ¦  «        S )zd
        Get the remaining duration for the revenge
        :return: The remaining duration
        )r	   r
   rb   rc   rd   r   r[   s    r*   Úget_revenge_remaining_durationz$Fight.get_revenge_remaining_durationÝ   s9   € õ &Ý(ÝÔ8×@Ò@ÑBÔBÀDÄIñô ñ
ô 
ð 	
r)   )r-   r   rC   )+r$   r%   r&   Ú__doc__ÚForeignKeyFieldr   r   Ú__annotations__r   Ú
FloatFieldr   r1   ÚDateTimeFieldÚdatetimeÚnowr   ÚSmallIntegerFieldr   ÚIN_PROGRESSr   Úboolr   r   ÚIntegerFieldr   ÚintÚBigIntegerFieldr   r_   r    r+   r4   Ústaticmethodr;   r@   rM   rW   rY   r\   r`   re   r2   rg   r(   r)   r*   r   r      st  € € € € € € ðð ð *9¨ØÐ)°YÈ)ð*ñ *ô *€JÑ&ð ð ñ ð (7 ØÐ'°9È	ð(ñ (ô (€Hˆd_Ñ$ð ð ñ ð +5¨*©,¬,€OU˜ZÑ'Ð6Ð6Ñ6Ø.;¨mÀHÔDUÔDYÐ.ZÑ.ZÔ.Z€Dˆ(Ô
˜mÑ
+ÐZÐZÑZØ'8Ð'8ÀÔAWÐ'XÑ'XÔ'X€FˆDÐ$Ñ$ÐXÐXÑXØ.=¨oØØØ$ØØð/ñ /ô /€J	˜OÑ+ð ð ñ ð &2 \°tÐ%<Ñ%<Ô%<€JlÑ"Ð<Ð<Ñ<Ø#2 ?¸Ð#=Ñ#=Ô#=€Eˆ3Ñ Ð=Ð=Ñ=à)˜/ØØØ'ØØðñ ô Ðð !Ððð ð ð ð ñ ô ð ð.¨ð .°ð .ð .ð .ð .ð ð
 Dð 
°*ð 
Àð 
ð 
ð 
ñ „\ð
ð  ð¨$ð ¸
ð Àsð ð ð ñ „\ðð$ ðZ $ð Z°
ð Z¸wð Zð Zð Zñ „\ðZð: ðM 4ð M¨T°3¨Kð Mð Mð Mñ „\ðMð@	M ð 	M¨$ð 	Mð 	Mð 	Mð 	Mð'˜Jð 'ð 'ð 'ð 'ðDð Dð Dð Dðð  ð °ð ð ð ð ð6

°ð 

ð 

ð 

ð 

ð 

ð 

r)   r   )rm   ÚpeeweeÚresources.EnvironmentÚEnvironmentrb   Úsrc.model.BaseModelr   Úsrc.model.GroupChatr   Úsrc.model.Userr   Úsrc.model.enums.GameStatusr   Úsrc.service.date_servicer   r	   r
   r   Úcreate_tabler(   r)   r*   ú<module>r      só   ðØ €€€à Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #Ø )Ð )Ð )Ð )Ð )Ð )Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð ð ð ð ð ð ð ð ðV
ð V
ð V
ð V
ð V
ˆIñ V
ô V
ð V
ðr × Ò Ñ Ô Ð Ð Ð r)   