§
    ˆ¯jÉ%  ã                   óâ   — d Z ddlZddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 ddlZddlZddlmZmZmZ 	 ddlmZmZ n# e$ r ddlmZmZ Y nw xY wddlmZmZmZmZ  G d„ d	¦  «        ZdS )
u  
Module Tá»± Ä�á»™ng Chá»¥p MÃ n HÃ¬nh & GhÃ©p Dá»¯ Liá»‡u Bá»™ Nhá»› Ä�á»ƒ PhÃ¢n TÃ­ch (Screen & Memory Analyzer)
Chá»¥p áº£nh khung hÃ¬nh in-game káº¿t há»£p trÃ­ch xuáº¥t snapshot bá»™ nhá»› thá»�i gian thá»±c Ä‘á»ƒ huáº¥n luyá»‡n vÃ  nÃ¢ng cao cháº¥t lÆ°á»£ng bot.
é    N)Údatetime)ÚAnyÚDictÚOptional)ÚImageÚ	ImageDrawÚ	ImageGrab)ÚSyncMemorySnapshotManagerÚdraw_correlated_image)Úattach_to_default_desktopÚensure_window_focusÚfind_poe2_windowÚget_client_rectc                   óî   — e Zd Zddefd„Zdee         fd„Zddee         defd„Z		 	 	 	 	 ddedee
eef                  dedededee         fd„Zde
eef         fd„Zedee         defd„¦   «         ZdS )ÚScreenCapturerÚcapturesÚ
output_dirc                 óš   — || _         t          j        | j         d¬¦  «         d| _        d| _        d| _        t          ¦   «         | _        d S )NT)Úexist_okr   Ú g        )r   ÚosÚmakedirsÚcapture_countÚlast_capture_pathÚlast_capture_timer
   Úsync_ram_manager)Úselfr   s     ú:C:\Projects\AutoPOE2\src\assistant_tool\screen_capturer.pyÚ__init__zScreenCapturer.__init__    sL   € Ø$ˆŒÝ
Œ�D”O¨dÐ3Ñ3Ô3Ð3ØˆÔØ!#ˆÔØ!$ˆÔÝ 9Ñ ;Ô ;ˆÔÐÐó    Úreturnc                 ó2   — t          ¦   «         }|dk    r|ndS )u%   TÃ¬m HWND cá»­a sá»• Path of Exile 2.r   N)Ú_find_poe2_window)r   Úhwnds     r   r   zScreenCapturer.find_poe2_window(   s   € å Ñ"Ô"ˆØ˜q’y�yˆtˆt dÐ*r    Nr$   c                 ó    — |p|                       ¦   «         }|r$t          j        j                             |¦  «        sdS t          |d¬¦  «        S )uX   Tá»± Ä‘á»™ng chuyá»ƒn tab vÃ  Ä‘Æ°a cá»­a sá»• Path of Exile 2 lÃªn foreground an toÃ n.Fi   )Ú
timeout_ms)r   ÚctypesÚwindllÚuser32ÚIsWindowÚ_ensure_window_focus)r   r$   Útarget_hwnds      r   Úbring_to_foregroundz"ScreenCapturer.bring_to_foreground-   sR   € àÐ5˜d×3Ò3Ñ5Ô5ˆØð 	¥&¤-Ô"6×"?Ò"?ÀÑ"LÔ"Lð 	Ø�5Ý# K¸CÐ@Ñ@Ô@Ð@r    ÚMANUALTFÚ
event_nameÚtelemetry_dataÚcapture_ramÚ
auto_focusÚbackground_modec                 ó  — t          j         ¦   «         }|| j        z
  dk     rt          j        d|| j        z
  z
  ¦  «         t          j         ¦   «         | _        t          j        ¦   «                              d¦  «        dd…         }d                     d„ |D ¦   «         ¦  «                             ¦   «         }|› d|› d�}	|› d|› d	�}
|› d|› d
�}|› d|› d�}t          j	                             | j
        |	¦  «        }t          j	                             | j
        |
¦  «        }t          j	                             | j
        |¦  «        }t          j	                             | j
        |¦  «        }|                      ¦   «         }|r|s|r|                      |¦  «         d}d\  }}}}d}|r,t          |¦  «        \  }}}}|dk    r|dk    r||||z   ||z   f}|r'	 ddlm}  ||d¬¦  «        }n# t           $ r d}Y nw xY w|€6|r4|dk    r.|dk    r(	 ddlm}  |||||¦  «        }n# t           $ r d}Y nw xY w|€‘|r�	 ddlm}  ||d¬¦  «        }|rb|dk    r\|dk    rV|j        \  }}t)          d||z
  dz  ¦  «        }t)          d||z
  |z
  ¦  «        }|                     ||||z   ||z   f¦  «        }n|r|}n# t           $ r d}Y nw xY w|€+|�)	 t-          j        |¬¦  «        }n# t           $ r d}Y nw xY w|�€-|sdn=t)          d|d         |d         z
  ¦  «        t)          d|d         |d         z
  ¦  «        f\  }}t1          j        d||fd¬¦  «        }t5          j        |¦  «        } |                      dd|dz
  |dz
  gdd¬ ¦  «         |                      d!d"|› �d¬#¦  «         |                      d$d%|› �d&¬#¦  «         d'}!|s|                      d(|!fd)d*¬#¦  «         |!d+z  }!|r>|                     ¦   «         D ])\  }"}#|                      d(|!f|"› d,|#› �d-¬#¦  «         |!d+z  }!Œ*	 |                     |d.¦  «         | xj         dz  c_         || _!        d}$|rz|j        \  }%}&| j"         #                    ||%|&¬/¦  «        }$tI          |d0d1¬2¦  «        5 }'tK          j&        |$|'dd3¬4¦  «         ddd¦  «         n# 1 swxY w Y   tO          ||$|¦  «         | j         ||tQ          |¦  «        ||pi |r|nd|r|nd|$r#tS          |$ *                    d5g ¦  «        ¦  «        ndd6œ	}(tI          |d0d1¬2¦  «        5 }'tK          j&        |(|'dd3¬4¦  «         ddd¦  «         n# 1 swxY w Y   |S # t           $ r})tW          d7|)› �d¬8¦  «         Y d})~)dS d})~)ww xY w)9u¡  
        Chá»¥p mÃ n hÃ¬nh cá»­a sá»• game Ä�á»’NG Bá»˜ vá»›i RAM Snapshot táº¡i cÃ¹ng timestamp chÃ­nh xÃ¡c.
        Tá»± Ä‘á»™ng xuáº¥t áº£nh phÃ¢n tÃ­ch tÆ°Æ¡ng quan (_CORRELATED.png) vÃ  dump RAM (_RAM.json).
        
        TuÃ¢n thá»§ INV-CAPTURE-CLIENT-ONLY: Chá»‰ chá»¥p Client Area (loáº¡i trá»« title bar vÃ  viá»�n),
        khÃ´ng cÆ°á»›p focus cá»§a ngÆ°á»�i dÃ¹ng khi á»Ÿ background_mode=True.
        g333333Ó?z%Y%m%d_%H%M%S_%fNé   r   c              3   óF   K  — | ]}|                      ¦   «         r|nd V — ŒdS )Ú_N)Úisalnum)Ú.0Úcs     r   ú	<genexpr>z4ScreenCapturer.capture_screenshot.<locals>.<genexpr>J   s3   è è € ÐKÐK¸1 !§)¢)¡+¤+Ð6˜Q˜Q°3ÐKÐKÐKÐKÐKÐKr    r7   z.pngz.jsonz	_RAM.jsonz_CORRELATED.png)r   r   r   r   r   )Úcapture_window_bitbltT)Úclient_only)Úcapture_rect_bitblt)Úcapture_window_print)Úrender_full_contenté   )Úbbox)i   iÐ  i�  i,  é   é   ÚRGB)é   é   é*   )Úcoloré
   )éõ   éž   é   )ÚoutlineÚwidth)é   rP   z%AutoPOE2 Diagnostic Capture - Event: )Úfill)rP   é2   zTimestamp: )éâ   éè   éð   éK   rP   zNWindow Status: NOT FOUND (INV-CAPTURE-CLIENT-ONLY: Desktop capture prohibited))éï   éD   rX   é   z: )é”   é£   é¸   ÚPNG)Úfallback_telemetryÚscreen_wÚscreen_hÚwzutf-8)ÚencodingF)ÚindentÚensure_asciiÚmonsters)	Ú
capture_idÚ	timestampÚeventÚwindow_foundrB   Ú	telemetryÚram_snapshot_fileÚcorrelated_imageÚmobs_detected_in_ramu'   [ScreenCapture Error] Lá»—i lÆ°u file: )Úflush),Útimer   Úsleepr   ÚnowÚstrftimeÚjoinÚupperr   Úpathr   r   r-   r   Úsrc.common.screen_capturer<   Ú	Exceptionr>   r?   ÚsizeÚmaxÚcropr	   Úgrabr   Únewr   ÚDrawÚ	rectangleÚtextÚitemsÚsaver   r   r   Úcapture_ram_snapshotÚopenÚjsonÚdumpr   ÚboolÚlenÚgetÚprint)*r   r/   r0   r1   r2   r3   rq   Útimestamp_strÚ
safe_eventÚimg_filenameÚjson_filenameÚram_filenameÚcorr_filenameÚimg_pathÚ	json_pathÚram_pathÚ	corr_pathr$   rB   ÚclÚctÚcwÚchÚ
screenshotr<   r>   r?   Úfullra   ÚhÚbxÚbyÚdrawÚyÚkÚvÚram_snapshotÚswÚshÚfÚmetaÚes*                                             r   Úcapture_screenshotz!ScreenCapturer.capture_screenshot4   sÉ  € õ Œi‰kŒkˆà�Ô'Ñ'¨#Ò-Ð-ÝŒJ�s˜c DÔ$:Ñ:Ñ;Ñ<Ô<Ð<å!%¤¡¤ˆÔÝ œ™œ×/Ò/Ð0BÑCÔCÀCÀRÀCÔHˆØ—W’WÐKÐKÀ
ÐKÑKÔKÑKÔK×QÒQÑSÔSˆ
à'Ð:Ð:¨*Ð:Ð:Ð:ˆØ(Ð<Ð<¨:Ð<Ð<Ð<ˆØ'Ð?Ð?¨*Ð?Ð?Ð?ˆØ(ÐFÐF¨:ÐFÐFÐFˆå”7—<’< ¤°Ñ>Ô>ˆÝ”G—L’L ¤°-Ñ@Ô@ˆ	Ý”7—<’< ¤°Ñ>Ô>ˆÝ”G—L’L ¤°-Ñ@Ô@ˆ	à×$Ò$Ñ&Ô&ˆàð 	+˜oð 	+°$ð 	+Ø×$Ò$ TÑ*Ô*Ð*àˆØ#‰ˆˆB��BØˆ
Øð 	2Ý,¨TÑ2Ô2‰NˆB��B˜Ø�AŠvˆv˜"˜qš&˜&Ø˜B  R¡¨¨b©Ð1�ð ð 	"ð"ØKÐKÐKÐKÐKÐKØ2Ð2°4ÀTÐJÑJÔJ�
�
øÝð "ð "ð "Ø!�
�
�
ð"øøøð Ð $Ð¨2°ª6¨6°b¸1²f°fð"ØIÐIÐIÐIÐIÐIØ0Ð0°°R¸¸RÑ@Ô@�
�
øÝð "ð "ð "Ø!�
�
�
ð"øøøð Ð $Ðð"ØJÐJÐJÐJÐJÐJØ+Ð+¨DÀdÐKÑKÔK�Øð &˜B šF˜F r¨A¢v vØœ9‘D�A�qÝ˜Q  R¡¨A¡Ñ.Ô.�BÝ˜Q  B¡¨¡Ñ,Ô,�BØ!%§¢¨B°°B¸±G¸RÀ"¹WÐ+EÑ!FÔ!F�J�JØð &Ø!%�JøøÝð "ð "ð "Ø!�
�
�
ð"øøøð
 Ð $Ð"2ð"Ý&œ^°Ð6Ñ6Ô6�
�
øÝð "ð "ð "Ø!�
�
�
ð"øøøð
 ÑØ&*Ðj�;�;µ°S¸$¸q¼'ÀDÈÄGÑ:KÑ1LÔ1LÍcÐRUÐW[Ð\]ÔW^ÐaeÐfgÔahÑWhÑNiÔNiÐ0j‰DˆAˆqÝœ 5¨1¨a¨&¸ÐEÑEÔEˆJÝ”> *Ñ-Ô-ˆDØ�NŠN˜B  A¨¡F¨A°©FÐ3¸^ÐSTˆNÑUÔUÐUØ�IŠI�hÐ TÈ
Ð TÐ TÐ[iˆIÑjÔjÐjØ�IŠI�hÐ =¨mÐ =Ð =ÀOˆIÑTÔTÐTØˆAØð Ø—	’	˜2˜q˜'Ð#sð  {H�	ñ  Iô  Ið  IØ�R‘�Øð Ø*×0Ò0Ñ2Ô2ð ð ‘D�A�qØ—I’I˜r 1˜g¨! { {¨q { {¸�IÑIÔIÐIØ˜‘G�A�Að'	Ø�OŠO˜H eÑ,Ô,Ð,ØÐÔ !Ñ#ÐÔØ%-ˆDÔ"ð  ˆLØð IØ#œ‘��BØ#Ô4×IÒIØ'5ØØð  Jñ  ô  �õ
 ˜( C°'Ð:Ñ:Ô:ð M¸aÝ”I˜l¨A°aÀeÐLÑLÔLÐLðMð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mõ & h°¸iÑHÔHÐHð #Ô0Ø*Ø#Ý $ T¡
¤
ØØ+Ð1¨rØ5@Ð%J \ \ÀdØ5@Ð$J M MÀdØQ]Ð(d­¨L×,<Ò,<¸ZÈÑ,LÔ,LÑ(MÔ(MÐ(MÐcdð
ð 
ˆDõ �i ¨wÐ7Ñ7Ô7ð A¸1Ý”	˜$ ¨!¸%Ð@Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að ˆOøÝð 	ð 	ð 	ÝÐ?¸AÐ?Ð?ÀtÐLÑLÔLÐLØ�4�4�4�4�4øøøøð	øøøs«   ÇG+ Ç+G:Ç9G:ÈH# È#H2È1H2È:A;J6 Ê6KËKËK# Ë#K2Ë1K2Ð&A*U" ÒR5Ò)U" Ò5R9Ò9U" Ò<R9Ò=A3U" Ô0UÕ	U" ÕUÕU" ÕUÕU" Õ"
VÕ,VÖVc                 óf   — | j         t          j                             | j        ¦  «        | j        dœS )N)Útotal_capturesr   Úlast_capture)r   r   ru   Úabspathr   r   )r   s    r   Ú	get_statszScreenCapturer.get_statsÅ   s0   € à"Ô0Ýœ'Ÿ/š/¨$¬/Ñ:Ô:Ø Ô2ð
ð 
ð 	
r    Ú	file_pathc                 ó  — | rt           j                             | ¦  «        sdS 	 t          j        | ¦  «        5 }|                     d¦  «        }t          |t          ¦  «        rut          |¦  «        dk    rbt          |d         dz
  ¦  «        dk    rFt          |d         dz
  ¦  «        dk    r*t          |d         d	z
  ¦  «        dk    r	 d
d
d
¦  «         dS d
d
d
¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wdS )uf   Kiá»ƒm tra xem file áº£nh cÃ³ pháº£i lÃ  áº£nh chuáº©n Ä‘oÃ¡n cháº¯p vÃ¡ (Diagnostic Fallback) khÃ´ng.T)é   r¯   rC   r   rF   rA   rD   rG   rH   NF)r   ru   Úexistsr   rƒ   ÚgetpixelÚ
isinstanceÚtupler‡   Úabsrw   )r­   ÚimgÚpxs      r   Úis_diagnostic_capture_filez)ScreenCapturer.is_diagnostic_capture_fileÌ   s]  € ð ð 	¥¤§¢¨yÑ 9Ô 9ð 	Ø�4ð	Ý”˜IÑ&Ô&ð $¨#à—\’\ (Ñ+Ô+�Ý˜b¥%Ñ(Ô(ð $­S°©W¬W¸ª\¨\Ý˜2˜aœ5 2™:‘”¨!Ò+Ð+µ°B°q´E¸B±J±´À1Ò0DÐ0DÍÈRÐPQÌUÐUWÉZÉÌÐ\]ÒI]ÐI]Ø#ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøõ ð 	ð 	ð 	ØˆDð	øøøàˆus;   ¥C1 ¹BC%ÃC1 ÃC1 Ã%C)Ã)C1 Ã,C)Ã-C1 Ã1
C>Ã=C>)r   )N)r.   NTFT)Ú__name__Ú
__module__Ú__qualname__Ústrr   r   Úintr   r†   r-   r   r   r§   r¬   Ústaticmethodr·   © r    r   r   r      s[  € € € € € ð<ð < 3ð <ð <ð <ð <ð+ (¨3¤-ð +ð +ð +ð +ð
Að A¨°¬ð AÀð Að Að Að Að #Ø37Ø Ø Ø $ðOð OàðOð !  c¨3 h¤Ô0ðOð ð	Oð
 ðOð ðOð 
�#ŒðOð Oð Oð Oðb
˜4  S œ>ð 
ð 
ð 
ð 
ð ð¨h°s¬mð Àð ð ð ñ „\ðð ð r    r   )Ú__doc__r'   Úctypes.wintypesr„   r   ro   r   Útypingr   r   r   Úwin32conÚwin32guiÚPILr   r   r	   Ú'src.assistant_tool.sync_memory_snapshotr
   r   ÚImportErrorÚsync_memory_snapshotÚsrc.common.win32_windowr   r   r+   r   r#   r   r   r¾   r    r   ú<module>rÉ      sw  ððð ð
 €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à €€€Ø €€€Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +ðVØhÐhÐhÐhÐhÐhÐhÐhÐhøØð Vð Vð VØUÐUÐUÐUÐUÐUÐUÐUÐUÐUðVøøøðð ð ð ð ð ð ð ð ð ð ð ð{ð {ð {ð {ð {ñ {ô {ð {ð {ð {s   ºA ÁAÁA