§
    T‘¦jN  ã                  óÚ   — d Z ddlmZ ddl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 ddlmZmZmZ  ej        d¦  «        ZdZe G d	„ d
¦  «        ¦   «         Z G d„ d¦  «        ZdS )z¿Cloud Dynamic Offsets Auto-Sync for Poe2VisualTool.

Allows seamless offset updates when Path of Exile 2 receives minor patches
without requiring users to re-download the entire application.
é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚDictÚOptionalzPoe2VisualTool.CloudSynczVhttps://raw.githubusercontent.com/mirsixabcf2-commits/Poe2VisualTool/main/offsets.tomlc                  óN   — e Zd ZU ded<   ded<   dZded<   dZded<   dZded	<   d
S )Ú
SyncResultÚboolÚsuccessÚstrÚmessageFÚupdatedÚ Úremote_versionÚlocal_versionN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   © ó    ú7C:\Projects\Poe2VisualTool\src\commercial\cloud_sync.pyr
   r
      sW   € € € € € € à€M€M�MØ€L€L�LØ€GÐÐÐÑØ€NÐÐÐÑØ€MÐÐÐÑÐÐr   r
   c                  óF   — e Zd ZdZdedfdd„Zdd„Zddd„Zdd„Zddd„Z	dS )ÚCloudOffsetsSynczNManages downloading, checking, and updating offsets.toml from a remote source.Ng      @Úlocal_config_pathúOptional[Path]Ú
remote_urlr   Útimeout_secondsÚfloatÚreturnÚNonec                óN   — |pt          d¦  «        | _        || _        || _        d S )Nzoffsets.toml)r   Ú
local_pathr   Útimeout)Úselfr   r   r   s       r   Ú__init__zCloudOffsetsSync.__init__&   s*   € ð ,ÐC­t°NÑ/CÔ/CˆŒØ$ˆŒØ&ˆŒˆˆr   c                óÊ  — | j                              ¦   «         sdS 	 t          | j         dd¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |                     ¦   «         D ]«}|                     ¦   «         }|                     d¦  «        s|                     d¦  «        rk|                     dd	¦  «        }t          |¦  «        d
k    rB|d	                              ¦   «                              d¦  «                             d¦  «        c S Œ¬dt          |¦  «        › �S # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)zAReads local version/fingerprint from offsets.toml or config.toml.r   Úrúutf-8©ÚencodingNÚversionÚ	timestampú=é   é   ú"ú'Úlen_z,Failed to read local offsets fingerprint: %s)r$   ÚexistsÚopenÚreadÚ
splitlinesÚstripÚ
startswithÚsplitÚlenÚ	ExceptionÚloggerÚwarning)r&   ÚfÚcontentÚlineÚstrippedÚpartsÚerrs          r   Úread_local_fingerprintz'CloudOffsetsSync.read_local_fingerprint0   s�  € àŒ×%Ò%Ñ'Ô'ð 	Ø�2ð	Ý�d”o s°WÐ=Ñ=Ô=ð #ÀØŸ&š&™(œ(�ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #à×*Ò*Ñ,Ô,ð Fð F�ØŸ:š:™<œ<�Ø×&Ò& yÑ1Ô1ð F°X×5HÒ5HÈÑ5UÔ5Uð FØ$ŸNšN¨3°Ñ2Ô2�EÝ˜5‘z”z Q’�Ø$ QœxŸ~š~Ñ/Ô/×5Ò5°cÑ:Ô:×@Ò@ÀÑEÔEÐEÐEÐEøà(�#˜g™,œ,Ð(Ð(Ð(øÝð 	ð 	ð 	Ý�NŠNÐIÈ3ÑOÔOÐOØ�2�2�2�2�2øøøøð	øøøsA   �D2 ´AÁ	D2 ÁAÁD2 ÁAÁCD2 ÄD2 Ä2
E"Ä<EÅE"Ú
custom_urlúOptional[str]útuple[bool, str, str]c                ó  — |p| j         }t          j                             |dddœ¬¦  «        }	 t          j                             || j        ¬¦  «        5 }|j        dk    r:|                     ¦   «                              dd¬	¦  «        }d
|dfcddd¦  «         S ddd|j        › �fcddd¦  «         S # 1 swxY w Y   dS # t          j	        j
        $ r}ddd|› �fcY d}~S d}~wt          $ r}ddd|› �fcY d}~S d}~ww xY w)zXFetches remote offsets content.

        Returns (success, content, error_msg).
        z7Poe2VisualTool-Sync/1.2.0 (Windows NT 10.0; Win64; x64)z'text/plain, application/toml, text/toml)z
User-AgentÚAccept)Úheaders)r%   éÈ   r*   Úreplace)ÚerrorsTr   NFzHTTP zNetwork error: zUnexpected error: )r   ÚurllibÚrequestÚRequestÚurlopenr%   Ústatusr7   ÚdecodeÚerrorÚURLErrorr=   )r&   rG   ÚurlÚreqÚresponseÚraw_datarE   s          r   Úfetch_remote_offsetsz%CloudOffsetsSync.fetch_remote_offsetsC   s¾  € ð
 Ð+˜DœOˆÝŒn×$Ò$ØàWØCðð ð %ñ 
ô 
ˆð		9Ý”×'Ò'¨°T´\Ð'ÑBÔBð <ÀhØ”? cÒ)Ð)Ø'Ÿ}š}™œ×5Ò5°gÀiÐ5ÑPÔP�HØ ¨2Ð-ð<ð <ð <ð <ñ <ô <ð <ð <ð ˜bÐ";¨(¬/Ð";Ð";Ð;ð	<ð <ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ð <ð <øõ
 Œ|Ô$ð 	6ð 	6ð 	6Ø˜"Ð5°Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øøøøÝð 	9ð 	9ð 	9Ø˜"Ð8°3Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøs_   ¯&C Á9B4ÂC ÂB4Â'C Â4B8Â8C Â;B8Â<C ÃDÃC"ÃDÃ"DÃ/C<Ã6DÃ<DrA   c                ó¦  — |                      ¦   «         D ]«}|                     ¦   «         }|                     d¦  «        s|                     d¦  «        rk|                     dd¦  «        }t	          |¦  «        dk    rB|d                              ¦   «                              d¦  «                             d¦  «        c S Œ¬dt	          |¦  «        › �S )	z2Parses remote version/timestamp from toml content.r-   r.   r/   r0   r1   r2   r3   r4   )r8   r9   r:   r;   r<   )r&   rA   rB   rC   rD   s        r   Úextract_remote_fingerprintz+CloudOffsetsSync.extract_remote_fingerprint[   sÆ   € à×&Ò&Ñ(Ô(ð 	Bð 	BˆDØ—z’z‘|”|ˆHØ×"Ò" 9Ñ-Ô-ð B°×1DÒ1DÀ[Ñ1QÔ1Qð BØ Ÿš s¨AÑ.Ô.�Ý�u‘:”: ’?�?Ø  œ8Ÿ>š>Ñ+Ô+×1Ò1°#Ñ6Ô6×<Ò<¸SÑAÔAÐAÐAÐAøØ$•c˜'‘l”lÐ$Ð$Ð$r   r
   c                ó  — |                       ¦   «         }|                      |¦  «        \  }}}|st          dd|› �d|¬¦  «        S |                      |¦  «        }|r||k    rt          ddd||¬¦  «        S t	          |¦  «        dk     sd|vrd	|vrt          dd
d|¬¦  «        S | j                             ¦   «         rh| j                             d¦  «        }	 t          j	        | j        |¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w| j                             d¦  «        }		 t          |	dd¬¦  «        5 }
|
                     |¦  «         ddd¦  «         n# 1 swxY w Y   |	                     | j        ¦  «         t          ddd||¬¦  «        S # t          $ rH}|	                     ¦   «         r|	                     ¦   «          t          dd|› �d|¬¦  «        cY d}~S d}~ww xY w)zGCompares local vs remote offsets and safely updates if remote is newer.FzCloud sync unreachable: )r   r   r   r   TzOffsets are already up-to-date)r   r   r   r   r   é   ú[r/   z+Invalid offsets content received from cloudz	.toml.bakz+Could not create backup of offsets.toml: %sNz.tmpÚwr*   r+   z'Offsets successfully updated from cloudz!Failed to write updated offsets: )rF   r\   r
   r^   r<   r$   r5   Úwith_suffixÚshutilÚcopy2r=   r>   r?   r6   ÚwriterN   Úunlink)r&   rG   Úlocal_fpr   rA   rE   Ú	remote_fpÚbackup_pathÚ
backup_errÚ	temp_pathr@   Ú	write_errs               r   ÚsynczCloudOffsetsSync.synce   så  € à×.Ò.Ñ0Ô0ˆØ $× 9Ò 9¸*Ñ EÔ EÑˆ�˜#Øð 	ÝØØ8°3Ð8Ð8ØØ&ð	ñ ô ð ð ×3Ò3°GÑ<Ô<ˆ	Øð 	˜ IÒ-Ð-ÝØØ8ØØ&Ø(ðñ ô ð õ ˆw‰<Œ<˜"ÒÐ ¨GÐ!3Ð!3¸À7Ð8JÐ8JÝØØEØØ&ð	ñ ô ð ð Œ?×!Ò!Ñ#Ô#ð 	ZØœ/×5Ò5°kÑBÔBˆKðZÝ”˜Tœ_¨kÑ:Ô:Ð:Ð:øÝð Zð Zð ZÝ—’ÐLÈjÑYÔYÐYÐYÐYÐYÐYÐYøøøøðZøøøð ”O×/Ò/°Ñ7Ô7ˆ	ð	Ý�i ¨wÐ7Ñ7Ô7ð !¸1Ø—’˜Ñ Ô Ð ð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !à×Ò˜dœoÑ.Ô.Ð.ÝØØAØØ&Ø(ðñ ô ð øõ ð 	ð 	ð 	Ø×ÒÑ!Ô!ð #Ø× Ò Ñ"Ô"Ð"ÝØØG¸IÐGÐGØØ&ð	ñ ô ð ð ð ð ð ð øøøøð	øøøsZ   ÃC4 Ã4
D#Ã>DÄD#ÅF. ÅE5Å)F. Å5E9Å9F. Å<E9Å=0F. Æ.
H Æ8=G;Ç5H Ç;H )r   r   r   r   r   r    r!   r"   )r!   r   )N)rG   rH   r!   rI   )rA   r   r!   r   )rG   rH   r!   r
   )
r   r   r   Ú__doc__ÚDEFAULT_OFFSETS_URLr'   rF   r\   r^   rn   r   r   r   r   r   #   s˜   € € € € € ØXÐXð -1Ø-Ø!$ð	'ð 'ð 'ð 'ð 'ðð ð ð ð&9ð 9ð 9ð 9ð 9ð0%ð %ð %ð %ð<ð <ð <ð <ð <ð <ð <r   r   )ro   Ú
__future__r   ÚjsonÚloggingÚosrd   Úurllib.errorrP   Úurllib.requestÚdataclassesr   Úpathlibr   Útypingr   r   r   Ú	getLoggerr>   rp   r
   r   r   r   r   ú<module>r{      s/  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à	ˆÔ	Ð5Ñ	6Ô	6€ð ]ð ð
 ðð ð ð ð ñ ô ñ „ðð~ð ~ð ~ð ~ð ~ñ ~ô ~ð ~ð ~ð ~r   