§
    s»jª  ã                  ó¨  — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZmZmZmZ  G d„ de¦  «        Z G d	„ d
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 )zŸ
Guild Shared Stash Service with Two-Phase Commit (2PC) Distributed Locking.
Guarantees 0% item duplication and strict role-based access for FreeExile Guilds.
é    )ÚannotationsN)ÚEnumÚauto)Ú	dataclassÚfield)ÚDictÚListÚOptionalÚTuplec                  ó   — e Zd ZdZdZdZdS )Ú	GuildRoleÚMEMBERÚOFFICERÚGUILD_MASTERN)Ú__name__Ú
__module__Ú__qualname__r   r   r   © ó    ú9C:\Projects\FreeExile\server\trade\guild_stash_service.pyr   r      s   € € € € € Ø€FØ€GØ!€L€L€Lr   r   c                  ó   — e Zd ZdZdZdZdS )ÚTabAccessTypeÚPUBLICÚOFFICER_ONLYÚDEPOSIT_ONLYN)r   r   r   r   r   r   r   r   r   r   r      s   € € € € € Ø€FØ!€LØ!€L€L€Lr   r   T)Úslotsc                  ó.   — e Zd ZU ded<   ded<   ded<   dS )ÚGuildMemberÚstrÚ	player_idÚplayer_namer   ÚroleN©r   r   r   Ú__annotations__r   r   r   r   r      s.   € € € € € € à€N€N�NØÐÐÑØ€O€O�O€O€Or   r   c                  óp   — e Zd ZU ded<   ded<   dZded<    ee¬¦  «        Zded	<   d
Zded<   dZ	ded<   dS )Ú	GuildItemr   Ú	item_uuidÚ	item_nameé   ÚintÚ	item_tier©Údefault_factoryzDict[str, str | int | float]Ú
attributesFÚboolÚ	is_lockedNzOptional[str]Úlocked_by_tx)
r   r   r   r$   r+   r   Údictr.   r0   r1   r   r   r   r&   r&   !   su   € € € € € € à€N€N�NØ€N€N�NØ€IÐÐÐÑØ/4¨uÀTÐ/JÑ/JÔ/J€JÐJÐJÐJÑJØ€IÐÐÐÑØ"&€LÐ&Ð&Ð&Ñ&Ð&Ð&r   r&   c                  óP   — e Zd ZU ded<   ded<   ded<    ee¬¦  «        Zded<   d	S )
ÚGuildStashTabr   Útab_idÚtab_namer   Úaccess_typer,   zDict[str, GuildItem]ÚitemsN)r   r   r   r$   r   r2   r8   r   r   r   r4   r4   +   sN   € € € € € € à€K€K�KØ€M€M�MØÐÐÑØ"' %¸Ð"=Ñ"=Ô"=€EÐ=Ð=Ð=Ñ=Ð=Ð=r   r4   c                  ój   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   dS )ÚGuildStashAuditLogr   Úlog_idÚguild_idr5   r    r!   Úactionr'   r(   ÚfloatÚ	timestampNr#   r   r   r   r:   r:   3   si   € € € € € € à€K€K�KØ€M€M�MØ€K€K�KØ€N€N�NØÐÐÑØ€K€K�KØ€N€N�NØ€N€N�NØÐÐÑÐÐr   r:   c                  óp   — e Zd Zd)d„Zd*d„Zd+d„Zd,d„Zd-d„Zd.d„Zd/d„Z	d0d„Z
d1d„Zd2d „Zd3d"„Zd4d5d'„Zd(S )6ÚGuildStashServiceÚreturnÚNonec                óL   — i | _         i | _        i | _        i | _        i | _        d S ©N)Ú_guild_tabsÚ_guild_membersÚ_guild_metadataÚ_active_locksÚ_audit_logs)Úselfs    r   Ú__init__zGuildStashService.__init__A   s0   € à@BˆÔàACˆÔà:<ˆÔà-/ˆÔà@BˆÔÐÐr   r<   r   Ú
guild_nameÚ	master_idc                ó\   — i | j         |<   i | j        |<   ||dœ| j        |<   g | j        |<   d S )N)rM   rN   )rF   rG   rH   rJ   )rK   r<   rM   rN   s       r   Úcreate_guildzGuildStashService.create_guildM   sE   € Ø%'ˆÔ˜Ñ"Ø(*ˆÔ˜HÑ%Ø8BÐQZÐ)[Ð)[ˆÔ˜XÑ&Ø%'ˆÔ˜Ñ"Ð"Ð"r   Úmemberr   c                óV   — || j         vr
i | j         |<   || j         |         |j        <   d S rE   )rG   r    )rK   r<   rQ   s      r   Ú
add_memberzGuildStashService.add_memberS   s8   € Ø˜4Ô.Ð.Ð.Ø,.ˆDÔ Ñ)Ø:@ˆÔ˜HÔ% fÔ&6Ñ7Ð7Ð7r   r    úOptional[GuildMember]c                ó^   — | j                              |i ¦  «                             |¦  «        S rE   )rG   Úget)rK   r<   r    s      r   Ú
get_memberzGuildStashService.get_memberX   s)   € ØÔ"×&Ò& x°Ñ4Ô4×8Ò8¸ÑCÔCÐCr   r5   r6   r7   r   c                óp   — || j         vr
i | j         |<   t          |||¬¦  «        }|| j         |         |<   d S )N)r5   r6   r7   )rF   r4   )rK   r<   r5   r6   r7   Útabs         r   Ú
create_tabzGuildStashService.create_tab[   sI   € Ø˜4Ô+Ð+Ð+Ø)+ˆDÔ˜XÑ&Ý 6°HÈ+ÐVÑVÔVˆØ-0ˆÔ˜Ô" 6Ñ*Ð*Ð*r   úOptional[GuildStashTab]c                ó^   — | j                              |i ¦  «                             |¦  «        S rE   )rF   rV   )rK   r<   r5   s      r   Úget_tabzGuildStashService.get_taba   s)   € ØÔ×#Ò# H¨bÑ1Ô1×5Ò5°fÑ=Ô=Ð=r   úList[GuildItem]c                ó‚   — |                       ||¦  «        }|sg S t          |j                             ¦   «         ¦  «        S rE   )r]   Úlistr8   Úvalues)rK   r<   r5   rY   s       r   Úget_tab_itemszGuildStashService.get_tab_itemsd   s>   € Ø�lŠl˜8 VÑ,Ô,ˆØð 	ØˆIÝ�C”I×$Ò$Ñ&Ô&Ñ'Ô'Ð'r   r'   Útx_idr/   c                ó0   — || j         v rdS || j         |<   dS )NFT)rI   ©rK   r'   rc   s      r   Úacquire_lockzGuildStashService.acquire_lockj   s'   € Ø˜Ô*Ð*Ð*Ø�5Ø(-ˆÔ˜9Ñ%Øˆtr   c                óV   — | j                              |¦  «        |k    r
| j         |= d S d S rE   )rI   rV   re   s      r   Úrelease_lockzGuildStashService.release_lockp   s7   € ØÔ×!Ò! )Ñ,Ô,°Ò5Ð5ØÔ" 9Ð-Ð-Ð-ð 6Ð5r   Úitemr&   úTuple[bool, str]c                ó~  — |                       ||¦  «        }|sdS |                      ||¦  «        }|sdS ||j        |j        <   t	          dt          j        ¦   «         j        d d…         › �||||j        d|j        |j	        t          j
        ¦   «         ¬¦	  «	        }| j        |                              |¦  «         dS )N)FÚPLAYER_NOT_IN_GUILD)FÚTAB_NOT_FOUNDÚlog_é   ÚDEPOSIT©	r;   r<   r5   r    r!   r=   r'   r(   r?   )TÚDEPOSIT_SUCCESS)rW   r]   r8   r'   r:   ÚuuidÚuuid4Úhexr!   r(   ÚtimerJ   Úappend)rK   r<   r5   r    ri   rQ   rY   Ú	log_entrys           r   Údeposit_itemzGuildStashService.deposit_itemt   sÒ   € ð —’ ¨9Ñ5Ô5ˆØð 	0Ø/Ð/à�lŠl˜8 VÑ,Ô,ˆØð 	*Ø)Ð)ð %)ˆŒ	�$”.Ñ!õ 'Ø0�$œ*™,œ,Ô*¨2¨A¨2Ô.Ð0Ð0ØØØØÔ*ØØ”nØ”nÝ”i‘k”kð

ñ 

ô 

ˆ	ð 	Ô˜Ô"×)Ò)¨)Ñ4Ô4Ð4Ø&Ð&r   ú%Tuple[bool, str, Optional[GuildItem]]c                óz  — |                       ||¦  «        }|sdS |                      ||¦  «        }|sdS |j        t          j        k    r"|j        t          j        t          j        fvrdS n6|j        t          j	        k    r!|j        t          j        t          j        fvrdS ||j
        vrdS || j        v rdS dt          j        ¦   «         j        d d…         › �}|                      ||¦  «        sdS 	 |j
                             |¦  «        }t#          d	t          j        ¦   «         j        d d…         › �||||j        d
|j        |j        t+          j        ¦   «         ¬¦	  «	        }	| j        |                              |	¦  «         dd|f|                      ||¦  «         S # |                      ||¦  «         w xY w)N)Frl   N)Frm   N)FÚPERMISSION_DENIED_OFFICER_ONLYN)FÚ'DEPOSIT_ONLY_TAB_MEMBER_CANNOT_WITHDRAWN)FÚITEM_NOT_FOUNDN)FÚ"ITEM_LOCKED_CONCURRENT_TRANSACTIONNÚtx_withdraw_ro   rn   ÚWITHDRAWrq   TÚWITHDRAW_SUCCESS)rW   r]   r7   r   r   r"   r   r   r   r   r8   rI   rs   rt   ru   rf   Úpopr:   r!   r'   r(   rv   rJ   rw   rh   )
rK   r<   r5   r    r'   rQ   rY   rc   Úwithdrawn_itemrx   s
             r   Úwithdraw_itemzGuildStashService.withdraw_item•   så  € ð —’ ¨9Ñ5Ô5ˆØð 	6Ø5Ð5à�lŠl˜8 VÑ,Ô,ˆØð 	0Ø/Ð/ð Œ?�mÔ8Ò8Ð8ØŒ{¥9Ô#4µiÔ6LÐ"MÐMÐMØDÐDð NàŒ_¥Ô :Ò:Ð:ØŒ{¥9Ô#4µiÔ6LÐ"MÐMÐMØMÐMð ˜CœIÐ%Ð%Ø0Ð0ð ˜Ô*Ð*Ð*ØDÐDð 6�tœz™|œ|Ô/°°°Ô3Ð5Ð5ˆØ× Ò  ¨EÑ2Ô2ð 	EØDÐDð	0à œYŸ]š]¨9Ñ5Ô5ˆNõ +Ø4�dœj™lœlÔ.¨r°¨rÔ2Ð4Ð4Ø!ØØ#Ø"Ô.Ø!Ø(Ô2Ø(Ô2Ýœ)™+œ+ð
ñ 
ô 
ˆIð Ô˜XÔ&×-Ò-¨iÑ8Ô8Ð8ØÐ+¨^Ð;à×Ò˜i¨Ñ/Ô/Ð/Ð/øˆD×Ò˜i¨Ñ/Ô/Ð/Ð/øøøs   Ã4BF" Æ"F:é2   Úlimitr*   úList[GuildStashAuditLog]c                óN   — | j                              |g ¦  «        }|| d …         S rE   )rJ   rV   )rK   r<   r‡   Úlogss       r   Úget_audit_logsz GuildStashService.get_audit_logsÎ   s*   € ØÔ×#Ò# H¨bÑ1Ô1ˆØ�U�F�G�GŒ}Ðr   N)rB   rC   )r<   r   rM   r   rN   r   rB   rC   )r<   r   rQ   r   rB   rC   )r<   r   r    r   rB   rT   )
r<   r   r5   r   r6   r   r7   r   rB   rC   )r<   r   r5   r   rB   r[   )r<   r   r5   r   rB   r^   )r'   r   rc   r   rB   r/   )r'   r   rc   r   rB   rC   )
r<   r   r5   r   r    r   ri   r&   rB   rj   )
r<   r   r5   r   r    r   r'   r   rB   rz   )r†   )r<   r   r‡   r*   rB   rˆ   )r   r   r   rL   rP   rS   rW   rZ   r]   rb   rf   rh   ry   r…   r‹   r   r   r   rA   rA   @   s  € € € € € ð
Cð 
Cð 
Cð 
Cð(ð (ð (ð (ðAð Að Að Að
Dð Dð Dð Dð1ð 1ð 1ð 1ð>ð >ð >ð >ð(ð (ð (ð (ðð ð ð ð.ð .ð .ð .ð'ð 'ð 'ð 'ðB70ð 70ð 70ð 70ðrð ð ð ð ð ð r   rA   )Ú__doc__Ú
__future__r   rv   rs   Úenumr   r   Údataclassesr   r   Útypingr   r	   r
   r   r   r   r   r&   r4   r:   rA   r   r   r   ú<module>r‘      s!  ððð ð
 #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .ð"ð "ð "ð "ð "�ñ "ô "ð "ð"ð "ð "ð "ð "�Dñ "ô "ð "ð €�ÐÑÔðð ð ð ð ñ ô ñ Ôðð €�ÐÑÔð'ð 'ð 'ð 'ð 'ñ 'ô 'ñ Ôð'ð €�ÐÑÔð>ð >ð >ð >ð >ñ >ô >ñ Ôð>ð €�ÐÑÔð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ Ôð	ðPð Pð Pð Pð Pñ Pô Pð Pð Pð Pr   