§
    ªi»j�'  ã                   ó¤  — d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZ ddlmZmZ  G d„ dee¦  «        Z G d„ d	ee¦  «        Z ed
¬¦  «         G d„ d¦  «        ¦   «         Z ed
¬¦  «         G d„ d¦  «        ¦   «         Z ed
¬¦  «         G d„ d¦  «        ¦   «         Z ed
¬¦  «         G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )uÜ  
Seasonal League & Realm Partitioning System for FreeExile.
Provides Path of Exile 2 style League mechanics:
- Permanent Standard Realm (ThÃ¡i HÆ° Giá»›i) vs Seasonal Challenge Leagues (ThiÃªn Ä�áº¡o LuÃ¢n Há»“i).
- Clean slate resets every season (level 1, empty stash, fresh economy).
- Remove-Only stash tabs for non-destructive seasonal merge.
- Hardcore Permadeath immediate migration to Standard.
- Solo Self-Found (SSF) isolation with voluntary opt-in trade migration.
é    )ÚEnumN)ÚDictÚListÚOptionalÚTupleÚAnyÚSet)Ú	dataclassÚfieldc                   ó   — e Zd ZdZdZdZdZdS )Ú
LeagueTypeÚstandardÚ	challengeÚhardcoreÚsolo_self_foundN)Ú__name__Ú
__module__Ú__qualname__ÚSTANDARDÚ	CHALLENGEÚHARDCOREÚSOLO_SELF_FOUND© ó    ú;C:\Projects\FreeExile\server\world\season_league_manager.pyr   r      s"   € € € € € Ø€HØ€IØ€HØ'€O€O€Or   r   c                   ó"   — e Zd ZdZdZdZdZdZdS )ÚLeagueStatusÚupcomingÚactiveÚfreezingÚ	migratingÚarchivedN)r   r   r   ÚUPCOMINGÚACTIVEÚFREEZINGÚ	MIGRATINGÚARCHIVEDr   r   r   r   r      s'   € € € € € Ø€HØ€FØ€HØ€IØ€H€H€Hr   r   T)Úslotsc                   ó€   — e Zd ZU eed<   eed<   dZeed<   dZeed<   dZeed<    e	e
¬¦  «        Zeeef         ed	<   d
S )ÚSeasonStashItemÚ	item_uuidÚ	item_nameé   Ústack_countÚ
item_levelÚ	PHAM_PHAMÚrarity©Údefault_factoryÚraw_propertiesN)r   r   r   ÚstrÚ__annotations__r.   Úintr/   r1   r   Údictr4   r   r   r   r   r   r*   r*   !   sy   € € € € € € à€N€N�NØ€N€N�NØ€K�ÐÐÑØ€J�ÐÐÑØ€FˆCÐÐÑØ%* U¸4Ð%@Ñ%@Ô%@€N�D˜˜c˜”NÐ@Ð@Ñ@Ð@Ð@r   r*   c                   óä   — e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZeed<   d	Ze	ed
<    e
e¬¦  «        Zeeef         ed<   defd„Zdeddfd„Zdedee         fd„Zdefd„Zdefd„ZdS )ÚStashTabÚtab_idÚ
account_idÚ	league_idÚnameFÚis_remove_onlyz#d97706Ú	color_hexé�   Úcapacityr2   ÚitemsÚreturnc                 óL   — | j          ot          | j        ¦  «        | j        k     S ©N)r?   ÚlenrC   rB   ©Úselfs    r   Úcan_depositzStashTab.can_deposit6   s"   € ØÔ&Ð&ÐJ­3¨t¬z©?¬?¸T¼]Ò+JÐJr   ÚitemNc                 óÊ   — | j         rt          d¦  «        ‚t          | j        ¦  «        | j        k    r t          d| j        › d| j        › d�¦  «        ‚|| j        |j        <   d S )Nz)Cannot deposit into Remove-Only stash tabzStash tab 'z' is full (z slots))r?   Ú
ValueErrorrG   rC   rB   r>   r+   )rI   rK   s     r   Údeposit_itemzStashTab.deposit_item9   sl   € ØÔð 	JÝÐHÑIÔIÐIÝˆtŒz‰?Œ?˜dœmÒ+Ð+ÝÐW¨4¬9ÐWÐWÀÄÐWÐWÐWÑXÔXÐXØ%)ˆŒ
�4”>Ñ"Ð"Ð"r   r+   c                 ó8   — | j                              |d ¦  «        S rF   )rC   Úpop)rI   r+   s     r   Úwithdraw_itemzStashTab.withdraw_item@   s   € ØŒz�~Š~˜i¨Ñ.Ô.Ð.r   c                 ó2   — t          | j        ¦  «        dk    S )Nr   )rG   rC   rH   s    r   Úis_emptyzStashTab.is_emptyC   s   € Ý�4”:‰Œ !Ò#Ð#r   c                 ó8   — | j         o|                      ¦   «         S )zHA Remove-Only tab that has been completely emptied can be safely pruned.)r?   rS   rH   s    r   Úis_prunablezStashTab.is_prunableF   s   € àÔ"Ð6 t§}¢}¡¤Ð6r   )r   r   r   r5   r6   r?   Úboolr@   rB   r7   r   r8   rC   r   r*   rJ   rN   r   rQ   rS   rU   r   r   r   r:   r:   +   s0  € € € € € € à€K€K�KØ€O€O�OØ€N€N�NØ
€I€I�IØ €N�DÐ Ð Ñ Ø€IˆsÐÐÑØ€HˆcÐÐÑØ(-¨¸dÐ(CÑ(CÔ(C€Eˆ4��_Ð$Ô%ÐCÐCÑCðK˜Tð Kð Kð Kð Kð* ð *°Tð *ð *ð *ð *ð/ sð /¨x¸Ô/Hð /ð /ð /ð /ð$˜$ð $ð $ð $ð $ð7˜Tð 7ð 7ð 7ð 7ð 7ð 7r   r:   c                   óî   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dZeed<   dZeed	<    e	d
„ ¬¦  «        Z
eed<    e	e¬¦  «        Zeeeef                  ed<    e	e¬¦  «        Zee         ed<   dS )ÚSeasonCharacterÚcharacter_idr<   r>   Úmartial_classr=   r-   ÚlevelTÚis_alivec                  óH   — t          t          j        ¦   «         dz  ¦  «        S ©Niè  ©r7   Útimer   r   r   ú<lambda>zSeasonCharacter.<lambda>T   s   € µs½4¼9¹;¼;ÈÑ;MÑ7NÔ7N€ r   r2   Úcreated_at_msÚ	inventoryÚmeridian_nodes_unlockedN)r   r   r   r5   r6   r[   r7   r\   rV   r   rb   Úlistrc   r   r   r   Úsetrd   r	   r   r   r   rX   rX   K   sÏ   € € € € € € àÐÐÑØ€O€O�OØ
€I€I�IØÐÐÑØ€N€N�NØ€Eˆ3€N€N�NØ€HˆdÐÐÑØ˜Ð/NÐ/NÐOÑOÔO€M�3ÐOÐOÑOØ&+ e¸DÐ&AÑ&AÔ&A€Iˆt�D˜˜c˜”NÔ#ÐAÐAÑAØ(-¨¸cÐ(BÑ(BÔ(BÐ˜S œXÐBÐBÑBÐBÐBr   rX   c                   ó¸   — e Zd ZU eed<   eed<   eed<   eed<   dZeed<    ed„ ¬¦  «        Z	e
ed	<   d
Ze
ed<    ee¬¦  «        Zeeef         ed<   d
Ze
ed<   dS )ÚLeaguer=   Údisplay_nameÚleague_typeÚstatusúv1.0.0Úversion_requirementc                  óH   — t          t          j        ¦   «         dz  ¦  «        S r^   r_   r   r   r   ra   zLeague.<lambda>`   s   € ½SÅÄÁÄÈtÑASÑ=TÔ=T€ r   r2   Ústart_time_epoch_msr   Úend_time_epoch_msÚmechanic_flagsÚactive_characters_countN)r   r   r   r5   r6   r   r   rm   r   ro   r7   rp   r8   rq   r   rr   r   r   r   rh   rh   Y   s¹   € € € € € € à€N€N�NØÐÐÑØÐÐÑØÐÐÑØ'Ð˜Ð'Ð'Ñ'Ø$˜uÐ5TÐ5TÐUÑUÔUÐ˜ÐUÐUÑUØÐ�sÐÐÑØ%* U¸4Ð%@Ñ%@Ô%@€N�D˜˜c˜”NÐ@Ð@Ñ@Ø#$Ð˜SÐ$Ð$Ñ$Ð$Ð$r   rh   c                   óT  — e Zd ZdZdd„Zdd„Zej        ddfdeded	e	d
edede
eeef                  defd„Zdede
e         fd„Zdededdfd„Zdededededef
d„Zdede
e         fd„Zdededefd„Zdedeeef         fd„Zdededeeef         fd„Zdededee         fd„ZdS )ÚSeasonLeagueManagerz”
    Central Coordinator for Realms and Seasonal Leagues.
    Enforces realm partition rules, character creation gates, and status transitions.
    rD   Nc                 óX   — i | _         i | _        i | _        |                      ¦   «          d S rF   )ÚleaguesÚ
charactersÚstashesÚ_init_standard_realmrH   s    r   Ú__init__zSeasonLeagueManager.__init__l   s1   € Ø*,ˆŒØ68ˆŒà>@ˆŒð 	×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c           	      óp   — t          ddt          j        t          j        dddi¬¦  «        }|| j        d<   d S )Nr   u!   ThÃ¡i HÆ° Giá»›i (Standard Realm)rl   Ú	core_onlyÚtrue©r=   ri   rj   rk   rm   rq   )rh   r   r   r   r$   rv   )rI   r   s     r   ry   z(SeasonLeagueManager._init_standard_realmu   sG   € ÝØ Ø<Ý"Ô+ÝÔ&Ø (Ø'¨Ð0ð
ñ 
ô 
ˆð $,ˆŒ�ZÑ Ð Ð r   rl   r=   ri   rj   rk   rm   rq   c                 ó€   — || j         v rt          d|› d�¦  «        ‚t          ||||||pi ¬¦  «        }|| j         |<   |S )NzLeague with ID 'z' already existsr~   )rv   rM   rh   )rI   r=   ri   rj   rk   rm   rq   Úleagues           r   Úcreate_leaguez!SeasonLeagueManager.create_league€   si   € ð ˜œÐ$Ð$ÝÐK°	ÐKÐKÐKÑLÔLÐLåØØ%Ø#ØØ 3Ø)Ð/¨Rð
ñ 
ô 
ˆð #)ˆŒ�YÑØˆr   c                 ó6   — | j                              |¦  «        S rF   )rv   Úget)rI   r=   s     r   Ú
get_leaguezSeasonLeagueManager.get_league—   s   € ØŒ|×Ò 	Ñ*Ô*Ð*r   Ú
new_statusc                 óÚ   — | j                              |¦  «        }|st          d|› d�¦  «        ‚|j        t          j        k    r|t          j        k    rt          d¦  «        ‚||_	        d S )NúLeague 'ú' not foundz!Standard realm cannot be archived)
rv   rƒ   ÚKeyErrorrj   r   r   r   r'   rM   rk   )rI   r=   r…   r€   s       r   Úset_league_statusz%SeasonLeagueManager.set_league_statusš   sq   € Ø”×!Ò! )Ñ,Ô,ˆØð 	>ÝÐ< iÐ<Ð<Ð<Ñ=Ô=Ð=ØÔ¥Ô!4Ò4Ð4¸Å|ÔG\Ò9\Ð9\ÝÐ@ÑAÔAÐAØ"ˆŒˆˆr   r<   Úcharacter_namerZ   c           	      ó  — | j                              |¦  «        }|st          d|› d�¦  «        ‚|j        t          j        k    r t          d|› d|j        j        › d�¦  «        ‚dt          j	        ¦   «         j
        d d…         › �}t          |||||dd	¬
¦  «        }|| j        |<   |xj        dz  c_        ||f}|| j        vr@t          dt          j	        ¦   «         j
        d d…         › �||dd¬¦  «        }	|	g| j        |<   |S )NúTarget league 'z' does not existr‡   z' status is 'z-', which is not active for character creationÚchar_é   r-   T)rY   r<   r>   rZ   r=   r[   r\   Ústash_é   zKho Chung 1F)r;   r<   r=   r>   r?   )rv   rƒ   r‰   rk   r   r$   rM   ÚvalueÚuuidÚuuid4ÚhexrX   rw   rr   rx   r:   )
rI   r<   r‹   rZ   r=   r€   Úchar_idÚcharÚ	stash_keyÚdefault_tabs
             r   Úcreate_characterz$SeasonLeagueManager.create_character¢   sc  € ð ”×!Ò! )Ñ,Ô,ˆØð 	JÝÐH¨YÐHÐHÐHÑIÔIÐIØŒ=�LÔ/Ò/Ð/Ýð  C¨	ð  Cð  CÀÄÔ@Sð  Cð  Cð  Cñ  Dô  Dð  Dà1�$œ*™,œ,Ô*¨3¨B¨3Ô/Ð1Ð1ˆÝØ Ø!ØØ'ØØØð
ñ 
ô 
ˆð $(ˆŒ˜Ñ ØÐ&Ô&¨!Ñ+Ð&Ô&ð   Ð+ˆ	Ø˜DœLÐ(Ð(Ý"Ø6¥¤
¡¤Ô 0°°!°Ô 4Ð6Ð6Ø%Ø#Ø"Ø$ðñ ô ˆKð (3 mˆDŒL˜Ñ#àˆr   rY   c                 ó6   — | j                              |¦  «        S rF   )rw   rƒ   )rI   rY   s     r   Úget_characterz!SeasonLeagueManager.get_characterÊ   s   € ØŒ×"Ò" <Ñ0Ô0Ð0r   Úworld_instance_league_idc                 óT   — | j                              |¦  «        }|sdS |j        |k    S )zÄ
        Validates that a character is strictly authorized to enter an instance of that league.
        Prevents Standard realm characters from entering Seasonal instances and vice versa.
        F)rw   rƒ   r=   )rI   rY   r�   r—   s       r   Úvalidate_realm_accessz)SeasonLeagueManager.validate_realm_accessÍ   s4   € ð
 Œ×"Ò" <Ñ0Ô0ˆØð 	Ø�5ØŒ~Ð!9Ò9Ð9r   c                 ó€  — | j                              |¦  «        }|sdd|› d�fS | j                             |j        ¦  «        }|r|j        t
          j        k    rdd|› d�fS |j        }d|_        d|_        |j        dk    r|xj        dz  c_        | j        d         }|xj        dz  c_        dd|j	        › d	|› d
�fS )z•
        Permadeath handler for Hardcore leagues.
        The dead character is not deleted, but immediately migrated to the Standard realm.
        FúCharacter 'rˆ   z' is not in a Hardcore leaguer   Tr   r-   z' perished in 'z' and was migrated to Standard)
rw   rƒ   rv   r=   rj   r   r   r\   rr   r>   )rI   rY   r—   Úsource_leagueÚold_league_idÚ
std_leagues         r   Úhandle_hardcore_deathz)SeasonLeagueManager.handle_hardcore_death×   sü   € ð
 Œ×"Ò" <Ñ0Ô0ˆØð 	BØÐA¨ÐAÐAÐAÐAÐAàœ×(Ò(¨¬Ñ8Ô8ˆØð 	T Ô 9½ZÔ=PÒ PÐ PØÐS¨ÐSÐSÐSÐSÐSð œˆØ#ˆŒØˆŒð Ô0°1Ò4Ð4ØÐ1Ô1°QÑ6Ð1Ô1Ø”\ *Ô-ˆ
ØÐ*Ô*¨aÑ/Ð*Ô*àÐj 4¤9ÐjÐj¸]ÐjÐjÐjÐjÐjr   Útarget_trade_league_idc                 óZ  — | j                              |¦  «        }|sdd|› d�fS | j                             |j        ¦  «        }|r|j        t
          j        k    rdS | j                             |¦  «        }|r|j        t          j	        k    rdd|› d�fS ||_        dd|j
        › d|› d	�fS )
zs
        Allows a Solo Self-Found character to voluntarily migrate to the trade league of the same season.
        Fr¡   rˆ   )FzEOnly Solo Self-Found characters can request voluntary trade migrationr�   z' is not an active trade leagueTz)' successfully migrated to trade league 'ú')rw   rƒ   rv   r=   rj   r   r   rk   r   r$   r>   )rI   rY   r¦   r—   r¢   Útarget_leagues         r   Úhandle_ssf_voluntary_migrationz2SeasonLeagueManager.handle_ssf_voluntary_migrationñ   sß   € ð Œ×"Ò" <Ñ0Ô0ˆØð 	BØÐA¨ÐAÐAÐAÐAÐAàœ×(Ò(¨¬Ñ8Ô8ˆØð 	b Ô 9½ZÔ=WÒ WÐ WØaÐaàœ×(Ò(Ð)?Ñ@Ô@ˆØð 	d Ô 4½Ô8KÒ KÐ KØÐcÐ,BÐcÐcÐcÐcÐcà/ˆŒØÐp 4¤9ÐpÐpÐWmÐpÐpÐpÐpÐpr   c                 ó<   — | j                              ||fg ¦  «        S rF   )rx   rƒ   )rI   r<   r=   s      r   Úget_account_stashesz'SeasonLeagueManager.get_account_stashes  s   € ØŒ|×Ò ¨YÐ 7¸Ñ<Ô<Ð<r   )rD   N)r   r   r   Ú__doc__rz   ry   r   r$   r5   r   r   r   rh   r�   r„   rŠ   rX   rš   rœ   rV   rŸ   r   r¥   rª   r   r:   r¬   r   r   r   rt   rt   f   sC  € € € € € ðð ð
$ð $ð $ð $ð	,ð 	,ð 	,ð 	,ð   ,Ô2Ø#+Ø37ðð àðð ðð  ð	ð
 ðð !ðð !  c¨3 h¤Ô0ðð 
ðð ð ð ð.+ Cð +¨H°VÔ,<ð +ð +ð +ð +ð#¨3ð #¸Lð #ÈTð #ð #ð #ð #ð&àð&ð ð&ð ð	&ð
 ð&ð 
ð&ð &ð &ð &ðP1¨#ð 1°(¸?Ô2Kð 1ð 1ð 1ð 1ð:°#ð :ÐQTð :ÐY]ð :ð :ð :ð :ðk°#ð k¸%ÀÀcÀ	Ô:Jð kð kð kð kð4qàðqð !$ðqð 
ˆt�SˆyÔ	ð	qð qð qð qð.=¨cð =¸cð =ÀdÈ8Änð =ð =ð =ð =ð =ð =r   rt   )r­   Úenumr   r`   r“   Útypingr   r   r   r   r   r	   Údataclassesr
   r   r5   r   r   r*   r:   rX   rh   rt   r   r   r   ú<module>r±      s)  ððð ð Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ð(ð (ð (ð (ð (��dñ (ô (ð (ðð ð ð ð �3˜ñ ô ð ð €�ÐÑÔðAð Að Að Að Añ Aô Añ ÔðAð €�ÐÑÔð7ð 7ð 7ð 7ð 7ñ 7ô 7ñ Ôð7ð> €�ÐÑÔð
Cð 
Cð 
Cð 
Cð 
Cñ 
Cô 
Cñ Ôð
Cð €�ÐÑÔð	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ñ Ôð	%ðc=ð c=ð c=ð c=ð c=ñ c=ô c=ð c=ð c=ð c=r   