§
    ‹ÿ®jÙ9  ã                  ó  — d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZmZmZmZmZmZ ddlmZmZ dZd	Zd
ZdZdZdZ e G d„ d¦  «        ¦   «         Z!e G d„ d¦  «        ¦   «         Z" G d„ d¦  «        Z#dS )u–  AutoPOE2 - Faustus Currency Exchange Handler (Doc 43 / Doc 68 / Doc 69).
=========================================================================
Ä�iá»�u phá»‘i viÃªn Ä‘á»™c láº­p cho SÃ n Giao Dá»‹ch Ngoáº¡i Há»‘i Faustus Currency Exchange:
1. Má»Ÿ sÃ n báº±ng phÃ­m '/' (VK_OEM_2 0xBF, scan code 0x35) chuáº©n SSoT.
2. Tá»± Ä‘á»™ng Ä‘á»•i Chaos Orb láº¥y Waystone T15 khi kho Waystone trong Stash cháº¡m má»‘c 0.
3. TuÃ¢n thá»§ nghiÃªm ngáº·t INV-FOCUS-SAFETY-SEPARATION: Tuyá»‡t Ä‘á»‘i khÃ´ng rÃ² rá»‰ tÃ­n hiá»‡u pháº§n cá»©ng
   ra desktop ngÆ°á»�i dÃ¹ng khi á»Ÿ cháº¿ Ä‘á»™ mÃ´ phá»�ng (is_simulated=True) hoáº·c khi game máº¥t focus.
4. Ä�Ã³ng giao diá»‡n sÃ n an toÃ n báº±ng Spacebar (VK_SPACE 0x20, scan code 0x39).
5. Báº£o vá»‡ quá»¹ vÃ ng sinh tá»“n (INV-EXCHANGE-GOLD-TAX) vÃ  quá»¹ Chaos dá»± trá»¯ (INV-EXCHANGE-RESERVE-SAFE).
6. TuÃ¢n thá»§ Rule 4: Module hÃ³a Ä‘á»™c láº­p, tráº§n file < 500 dÃ²ng.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)ÚSC_SPACEÚVK_OEM_2ÚVK_SPACEÚclickÚdismiss_modalsÚ	press_key)Úensure_window_focusÚis_poe2_window_focusedé5   )é   i¤  )i˜  é  )ih  r   )r   ip  )iž  é´   c                  ó„   — e Zd ZU dZdZded<   dZded<   dZded	<   d
Zded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dS )ÚCurrencyExchangeHandlerConfigu@   Cáº¥u hÃ¬nh an toÃ n vÃ  Ä‘á»‹nh má»©c váº­n hÃ nh SÃ n Faustus.iˆ  ÚintÚmin_gold_reserveg      I@ÚfloatÚmin_chaos_reserveg       @Úchaos_per_waystone_t15é–   Úgold_tax_per_waystoneé   Údefault_buy_countr   Úwaystone_restock_thresholdg      Ð?Úui_open_delay_sg333333Ã?Úui_close_delay_sN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r    r"   r#   r$   r%   © ó    úKC:\Projects\AutoPOE2\src\assistant_tool\market\currency_exchange_handler.pyr   r   (   s§   € € € € € € àJÐJØ ÐÐ Ð Ð Ñ Ø#ÐÐ#Ð#Ð#Ñ#Ø$'ÐÐ'Ð'Ð'Ñ'Ø!$ÐÐ$Ð$Ð$Ñ$ØÐÐÐÐÑØ&'ÐÐ'Ð'Ð'Ñ'Ø!€OÐ!Ð!Ð!Ñ!Ø"ÐÐ"Ð"Ð"Ñ"Ð"Ð"r,   r   c                  óš   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZded<   dZ	d	ed<   dZ
ded<   dZd	ed<   dZded<   dZd	ed<   dd„ZdS )ÚExchangeResultu:   Káº¿t quáº£ thá»±c thi phiÃªn mua bÃ¡n trÃªn SÃ n Faustus.FÚboolÚsuccessÚNONEÚstrÚaction_takenr   r   Úwaystones_boughtg        r   Úchaos_spentÚ
gold_spentÚremaining_chaosÚremaining_goldÚ ÚreasonÚtimestamp_msÚreturnúDict[str, Any]c           
     ót   — | j         | j        | j        | j        | j        | j        | j        | j        | j        dœ	S )N©	r1   r4   r5   r6   r7   r8   r9   r;   r<   r@   ©Úselfs    r-   Úto_dictzExchangeResult.to_dictB   sD   € à”|Ø Ô-Ø $Ô 5ØÔ+Øœ/Ø#Ô3Ø"Ô1Ø”kØ Ô-ð

ð 

ð 
	
r,   N)r=   r>   )r&   r'   r(   r)   r1   r*   r4   r5   r6   r7   r8   r9   r;   r<   rC   r+   r,   r-   r/   r/   5   sÊ   € € € € € € àDÐDØ€GÐÐÐÑØ€LÐÐÐÑØÐÐÐÐÑØ€KÐÐÐÑØ€JÐÐÐÑØ €OÐ Ð Ð Ñ Ø€NÐÐÐÑØ€FÐÐÐÑØ€LÐÐÐÑð
ð 
ð 
ð 
ð 
ð 
r,   r/   c                  ór   — e Zd ZdZ	 	 	 	 	 	 	 d.d/d„Zd0d„Zd1d„Zd2d„Zd2d„Zd3d„Z	d4d$„Z
d5d'„Z	 	 	 d6d7d-„ZdS )8ÚCurrencyExchangeHandlerut  
    Ä�iá»�u phá»‘i viÃªn Ä‘á»™c láº­p cho SÃ n Faustus Currency Exchange.
    - Má»Ÿ sÃ n báº±ng phÃ­m '/' (VK_OEM_2 0xBF).
    - Mua Waystone T15 báº±ng Chaos Orb khi kho cáº¡n kiá»‡t (count <= 0).
    - Ä�Ã³ng sÃ n an toÃ n báº±ng Spacebar (VK_SPACE 0x20).
    - Báº£o vá»‡ Focus Interlock chá»‘ng rÃ² rá»‰ phÃ­m váº­t lÃ½ ra desktop (INV-FOCUS-SAFETY-SEPARATION).
    é 
  é   NFÚscreen_wr   Úscreen_hÚconfigú'Optional[CurrencyExchangeHandlerConfig]Úis_simulatedr0   Úpress_key_funcúOptional[Callable[[int], Any]]Ú
click_funcúOptional[Callable[..., Any]]Úlog_callbackúOptional[Callable[[str], None]]c                óè   — || _         || _        |dk    r|dz  nd| _        |dk    r|dz  nd| _        |pt	          ¦   «         | _        || _        || _        || _        || _	        d| _
        d| _        d S )Nr   g      ¤@g      ð?g     €–@F)rH   rI   Úscale_xÚscale_yr   rJ   rL   rM   rO   rQ   Ú
is_ui_openÚtotal_restock_operations)rB   rH   rI   rJ   rL   rM   rO   rQ   s           r-   Ú__init__z CurrencyExchangeHandler.__init__Y   s‹   € ð !ˆŒØ ˆŒØ,4°qªL¨L�x &Ñ(Ð(¸cˆŒØ,4°qªL¨L�x &Ñ(Ð(¸cˆŒØÐ?Õ =Ñ ?Ô ?ˆŒØ(ˆÔØ,ˆÔØ$ˆŒØ(ˆÔØ %ˆŒØ-.ˆÔ%Ð%Ð%r,   Úmsgr3   r=   ÚNonec                ój   — | j         r|                       |¦  «         d S t          d|› �d¬¦  «         d S )Nz[CurrencyExchangeHandler] T)Úflush)rQ   Úprint)rB   rY   s     r-   ÚlogzCurrencyExchangeHandler.logo   sJ   € ØÔð 	BØ×Ò˜cÑ"Ô"Ð"Ð"Ð"åÐ4¨sÐ4Ð4¸DÐAÑAÔAÐAÐAÐAr,   Ú	area_namec                óB   — |                      ¦   «         }d|v pd|v pd|v S )ub   Kiá»ƒm tra khu vá»±c an toÃ n (INV-EXCHANGE-SAFE-AREA): Chá»‰ má»Ÿ sÃ n táº¡i Hideout hoáº·c Town.ÚhideoutÚtownÚ
encampment)Úlower)rB   r_   rd   s      r-   Úis_safe_areaz$CurrencyExchangeHandler.is_safe_areau   s/   € à—’Ñ!Ô!ˆØ˜UÐ"ÐS¨°%¨ÐS¸\ÈUÐ=RÐSr,   c                óp  — | j         sCt          ¦   «         s5t          d¬¦  «         t          ¦   «         s|                      d¦  «         dS | j        �|                      t
          ¦  «         n-t          t
          t          d| j        j	        | j         ¬¦  «         d| _
        |                      d	¦  «         dS )
u–   
        Má»Ÿ sÃ n Faustus Currency Exchange báº±ng phÃ­m '/' (VK_OEM_2 0xBF).
        TuÃ¢n thá»§ Rule 7 SSoT & INV-FOCUS-SAFETY-SEPARATION.
        i,  )Ú
timeout_msuU   Lá»–I: Game client khÃ´ng cÃ³ Focus. Cháº·n gá»­i phÃ­m '/' Ä‘á»ƒ báº£o vá»‡ desktop.FNgš™™™™™©?)ÚvkÚscanÚhold_msÚdelay_afterrL   Tu4   Ä�Ã£ phÃ¡t phÃ­m '/' má»Ÿ Faustus Currency Exchange.)rL   r   r   r^   rM   r   Úwin32_press_keyÚSC_SLASHrJ   r$   rV   rA   s    r-   Úopen_currency_exchangez.CurrencyExchangeHandler.open_currency_exchangez   sÅ   € ð Ô ð 	!Ý)Ñ+Ô+ð !Ý#¨sÐ3Ñ3Ô3Ð3Ý-Ñ/Ô/ð !Ø—H’HÐtÑuÔuÐuØ ˜5ð ÔÐ*Ø×Ò¥Ñ)Ô)Ð)Ð)åÝÝØØ œKÔ7Ø!Ô.ðñ ô ð ð ˆŒØ�ŠÐGÑHÔHÐHØˆtr,   c                ó  — | j         s%t          ¦   «         s|                      d¦  «         dS | j        �|                      t          ¦  «         n!t          d| j        j        | j         ¬¦  «         d| _        |                      d¦  «         dS )u‹   
        Ä�Ã³ng sÃ n Faustus an toÃ n báº±ng phÃ­m Spacebar (VK_SPACE 0x20).
        TuÃ¢n thá»§ Rule 7 SSoT & INV-SPACEBAR-CLOSE.
        u3   Cáº¢NH BÃ�O: Game khÃ´ng giá»¯ Focus khi Ä‘Ã³ng UI.FNé   )Úcount_or_imgrk   rL   u;   Ä�Ã£ phÃ¡t phÃ­m Spacebar Ä‘Ã³ng Faustus Currency Exchange.T)	rL   r   r^   rM   r   Úwin32_dismiss_modalsrJ   r%   rV   rA   s    r-   Úclose_currency_exchangez/CurrencyExchangeHandler.close_currency_exchange—   s    € ð
 Ô ð 	Ý)Ñ+Ô+ð Ø—’ÐNÑOÔOÐOØ�uð ÔÐ*Ø×Ò¥Ñ)Ô)Ð)Ð)å ØØ œKÔ8Ø!Ô.ðñ ô ð ð  ˆŒØ�ŠÐNÑOÔOÐOØˆtr,   Úwaystone_stockc                ó"   — || j         j        k    S )uN   Kiá»ƒm tra xem cÃ³ cáº§n bá»• sung Waystone T15 hay khÃ´ng (kho <= ngÆ°á»¡ng).)rJ   r#   )rB   rt   s     r-   Úcheck_restock_neededz,CurrencyExchangeHandler.check_restock_needed¯   s   € à ¤Ô!GÒGÐGr,   Úavailable_chaosr   Úavailable_goldÚtarget_countúTuple[bool, int, str]c           	     ó¶  — || j         j        z
  }|| j         j        k     r#ddd|› d| j         j        › d| j         j        › d�fS || j         j        z
  }|| j         j        k     r#ddd|› d| j         j        › d	| j         j        › d�fS t          || j         j        z  ¦  «        }t          || j         j        z  ¦  «        }t          |||¦  «        }|dk    rd
S d|dfS )ué   
        Ä�Ã¡nh giÃ¡ tÃ­nh kháº£ thi vÃ  sá»‘ lÆ°á»£ng Waystone T15 cÃ³ thá»ƒ mua Ä‘Æ°á»£c:
        - Báº£o vá»‡ Chaos sinh tá»“n (INV-EXCHANGE-RESERVE-SAFE).
        - Báº£o vá»‡ VÃ ng Ä‘Ã³ng thuáº¿ (INV-EXCHANGE-GOLD-TAX).
        Fr   u-   Báº£o vá»‡ Chaos Orb: Sá»‘ Chaos hiá»‡n cÃ³ (u   ) - ngÆ°á»¡ng dá»± trá»¯ (u   ) < Ä‘Æ¡n giÃ¡ (z).u,   Báº£o vá»‡ Gold Tax: Sá»‘ VÃ ng hiá»‡n cÃ³ (u   ) - ngÆ°á»¡ng sÃ n (u   ) < thuáº¿ giao dá»‹ch ()Fr   uK   KhÃ´ng Ä‘á»§ Chaos Orb hoáº·c VÃ ng Ä‘á»ƒ mua tá»‘i thiá»ƒu 1 Waystone T15.Tu8   Ä�á»§ Ä‘iá»�u kiá»‡n thanh toÃ¡n vÃ  ná»™p thuáº¿ VÃ ng.)rJ   r   r   r   r    r   Úmin)	rB   rw   rx   ry   Úusable_chaosÚusable_goldÚmax_by_chaosÚmax_by_goldÚaffordable_counts	            r-   Úevaluate_restock_feasibilityz4CurrencyExchangeHandler.evaluate_restock_feasibility³   sP  € ð '¨¬Ô)FÑFˆØ˜$œ+Ô<Ò<Ð<àØðHÀð Hð HÐkoÔkvô  lIð Hð HØ!%¤Ô!CðHð Hð Hðð ð % t¤{Ô'CÑCˆØ˜œÔ:Ò:Ð:àØðO¸~ð Oð OÐcgÔcnÔcð Oð OØ)-¬Ô)JðOð Oð Oðð õ ˜<¨4¬;Ô+MÑMÑNÔNˆÝ˜+¨¬Ô)JÑJÑKÔKˆÝ˜|¨\¸;ÑGÔGÐà˜qÒ Ð ØjÐjàÐ%Ð'aÐaÐar,   Únormalized_posúTuple[int, int]c                ó,  — t          t          |d         | j        z  ¦  «        ¦  «        }t          t          |d         | j        z  ¦  «        ¦  «        }| j        �#t          |                      ||¦  «        ¦  «        S t          ||| j        ¬¦  «        S )u3   Click tá»�a Ä‘á»™ co giÃ£n theo Ä‘á»™ phÃ¢n giáº£i.r   rp   N)rL   )r   ÚroundrT   rU   rO   r0   Úwin32_clickrL   )rB   rƒ   Úscreen_xÚscreen_ys       r-   Ú_simulate_or_click_screenz1CurrencyExchangeHandler._simulate_or_click_screenÜ   s€   € å•u˜^¨AÔ.°´Ñ=Ñ>Ô>Ñ?Ô?ˆÝ•u˜^¨AÔ.°´Ñ=Ñ>Ô>Ñ?Ô?ˆØŒ?Ð&Ý˜Ÿš¨°(Ñ;Ô;Ñ<Ô<Ð<Ý˜8 X¸DÔ<MÐNÑNÔNÐNr,   úShoreline HideoutÚ	buy_countúOptional[int]Únow_msr/   c                ó”  — |€#t          t          j        ¦   «         dz  ¦  «        }|                      |¦  «        s2|                      d|› d�¦  «         t	          dd||d|› d�|¬	¦  «        S |                      |¦  «        s?|                      d
|› d| j        j        › d�¦  «         t	          dd||d|› d�|¬	¦  «        S |�|dk    r|n| j        j        }|  	                    |||¬¦  «        \  }}	}
|s5d|
v rdnd}|                      d|
› �¦  «         t	          d||||
|¬	¦  «        S |  
                    ¦   «         st	          dd||d|¬	¦  «        S t          |	| j        j        z  d¦  «        }|	| j        j        z  }|                      t          ¦  «         |                      t           ¦  «         |                      t"          ¦  «         |                      ¦   «          t          ||z
  d¦  «        }||z
  }| xj        dz  c_        |                      d|	› d|› d|› d|› d|› d �¦  «         t	          dd!|	||||d"|	› d#�|¬$¦	  «	        S )%uÞ  
        Thá»±c thi quy trÃ¬nh Ä‘á»•i Chaos Orb láº¥y Waystone T15 khi háº¿t kho Stash:
        1. Kiá»ƒm tra an toÃ n khu vá»±c (INV-EXCHANGE-SAFE-AREA).
        2. Kiá»ƒm tra nhu cáº§u restock (kho <= threshold).
        3. Ä�Ã¡nh giÃ¡ tÃ­nh kháº£ thi tÃ i chÃ­nh & thuáº¿ VÃ ng.
        4. Má»Ÿ sÃ n báº±ng phÃ­m '/'.
        5. Thá»±c thi giao dá»‹ch náº¡p Ä‘Æ¡n hÃ ng.
        6. Ä�Ã³ng sÃ n báº±ng phÃ­m Spacebar.
        7. Tráº£ vá»� káº¿t quáº£ ExchangeResult.
        Niè  u4   Tá»« chá»‘i má»Ÿ sÃ n: Ä�ang á»Ÿ vÃ¹ng nguy hiá»ƒm 'z'!FÚREJECTED_UNSAFE_AREAu   Khu vá»±c 'u0   ' khÃ´ng an toÃ n Ä‘á»ƒ má»Ÿ sÃ n ngoáº¡i há»‘i.)r1   r4   r8   r9   r;   r<   u   Kho Stash váº«n cÃ²n u    Waystone (ngÆ°á»¡ng: u   ). Bá»� qua.TÚNO_ACTION_REQUIREDu   Kho Stash cÃ²n u(    Waystone, chÆ°a cháº¡m má»‘c bá»• sung.r   )rw   rx   ry   ÚChaosÚREJECTED_LOW_CHAOSÚREJECTED_LOW_GOLDu   Tá»« chá»‘i giao dá»‹ch: ÚERROR_CANNOT_OPEN_UIuY   KhÃ´ng thá»ƒ má»Ÿ giao diá»‡n Faustus Currency Exchange (máº¥t focus hoáº·c lá»—i input).é   rp   u"   Thá»±c thi thÃ nh cÃ´ng: Ä�Ã£ mua u    Waystone T15. Chi phÃ­: u    Chaos, Thuáº¿: u    VÃ ng. CÃ²n láº¡i: z Chaos, u    VÃ ng.ÚRESTOCKED_WAYSTONESu   Ä�Ã£ mua thÃ nh cÃ´ng u    Waystone T15 qua SÃ n Faustus.r@   )r   Útimere   r^   r/   rv   rJ   r#   r"   r‚   rn   r†   r   r    rŠ   ÚEXCHANGE_CURRENCY_HAVE_POS_2560ÚEXCHANGE_CURRENCY_WANT_POS_2560ÚEXCHANGE_CONFIRM_BTN_POS_2560rs   rW   )rB   rt   rw   rx   rŒ   r_   rŽ   Ú
target_qtyÚfeasibleÚcount_to_buyr;   Úaction_codeÚtotal_chaos_costÚtotal_gold_taxr8   r9   s                   r-   Úexecute_waystone_t15_restockz4CurrencyExchangeHandler.execute_waystone_t15_restockä   sm  € ð& ˆ>Ý�œ™œ tÑ+Ñ,Ô,ˆFð × Ò  Ñ+Ô+ð 		Ø�HŠHÐYÈIÐYÐYÐYÑZÔZÐZÝ!ØØ3Ø /Ø-Ø` YÐ`Ð`Ð`Ø#ðñ ô ð ð ×(Ò(¨Ñ8Ô8ð 		Ø�HŠHð  H¨^ð  Hð  HÐSWÔS^ÔSyð  Hð  Hð  Hñ  Iô  Ið  IÝ!ØØ1Ø /Ø-Øa¨ÐaÐaÐaØ#ðñ ô ð ð $-Ð#8¸YÈº]¸]�Y�YÐQUÔQ\ÔQnˆ
Ø)-×)JÒ)JØ+Ø)Ø#ð *Kñ *
ô *
Ñ&ˆ�, ð ð 
	Ø29¸VÐ2CÐ2CÐ.Ð.ÐI\ˆKØ�HŠHÐ9°Ð9Ð9Ñ:Ô:Ð:Ý!ØØ(Ø /Ø-ØØ#ðñ ô ð ð ×*Ò*Ñ,Ô,ð 	Ý!ØØ3Ø /Ø-ØrØ#ðñ ô ð õ ! °´Ô0RÑ!RÐTUÑVÔVÐØ%¨¬Ô(IÑIˆð 	×&Ò&Õ'FÑGÔGÐGØ×&Ò&Õ'FÑGÔGÐGØ×&Ò&Õ'DÑEÔEÐEð 	×$Ò$Ñ&Ô&Ð&õ   Ð2BÑ BÀAÑFÔFˆØ'¨.Ñ8ˆØÐ%Ô%¨Ñ*Ð%Ô%à�ŠðL°ð Lð LØ)ðLð LØ;IðLð Là*ðLð Là4BðLð Lð Lñ	
ô 	
ð 	
õ ØØ.Ø)Ø(Ø%Ø+Ø)ØY¨LÐYÐYÐYØð

ñ 

ô 

ð 
	
r,   )rF   rG   NFNNN)rH   r   rI   r   rJ   rK   rL   r0   rM   rN   rO   rP   rQ   rR   )rY   r3   r=   rZ   )r_   r3   r=   r0   )r=   r0   )rt   r   r=   r0   )rw   r   rx   r   ry   r   r=   rz   )rƒ   r„   r=   r0   )Nr‹   N)rt   r   rw   r   rx   r   rŒ   r�   r_   r3   rŽ   r�   r=   r/   )r&   r'   r(   r)   rX   r^   re   rn   rs   rv   r‚   rŠ   r¢   r+   r,   r-   rE   rE   P   s  € € € € € ðð ð ØØ:>Ø"Ø9=Ø37Ø8<ð/ð /ð /ð /ð /ð,Bð Bð Bð BðTð Tð Tð Tð
ð ð ð ð:ð ð ð ð0Hð Hð Hð Hð'bð 'bð 'bð 'bðROð Oð Oð Oð $(Ø,Ø $ðn
ð n
ð n
ð n
ð n
ð n
ð n
r,   rE   )$r)   Ú
__future__r   r˜   Údataclassesr   r   Útypingr   r   r   r	   r
   r   Úsrc.common.win32_inputr   r   r   r   r‡   r   rr   r   rl   Úsrc.common.win32_windowr   r   rm   ÚEXCHANGE_SEARCH_INPUT_POS_2560r™   rš   r›   ÚEXCHANGE_CLOSE_BTN_POS_2560r   r/   rE   r+   r,   r-   ú<module>rª      sª  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð PÐ OÐ OÐ OÐ OÐ OÐ OÐ Oð €ð "-Ð Ø",Ð Ø"-Ð Ø +Ð Ø)Ð ð ð	#ð 	#ð 	#ð 	#ð 	#ñ 	#ô 	#ñ „ð	#ð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð4B
ð B
ð B
ð B
ð B
ñ B
ô B
ð B
ð B
ð B
r,   