Ë
    ¿j¹jøN  ã                   ó*  — 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ZddlZddl	Z	ddl
Z
d„ Zdddddœd	ddd
dœdddddœgZdZd„ Zdd„Zdd„Zdd„Zd„ Zd„ Zedk(  r¨ej*                  j-                  ej*                  j/                  e«      «      Zej*                  j5                  ej*                  j7                  ed«      «      r ej8                  e«       dej:                  v sdej:                  v r e«        y	  e«        yy# e$ r
  e«        Y yw xY w)z“
Bigg Adventure / Heroes Journey EQEmu Server - Client Patcher & Launcher
RoF2 Client Patcher (Port 5999) with PyQt6 GUI & Editable Host Selection
é    Nc           	      ó„  — ddl }ddl}|j                  j                  «       j	                  «       }d}| xs g D �]ƒ  }t
        j                  j                  |«      s#d|j                  dd«      j                  d«      v rŒGt
        j                  j                  ||«      }t
        j                  j                  |«      sŒ‡t
        j                  j                  |d|t
        j                  j                  |«      «      }	t        j                  |	d¬«       t
        j                  j                  |	t
        j                  j                  |«      «      }
t
        j                  j                  |
«      r%|
d	z  }
t
        j                  j                  |
«      rŒ%|j                  ||
«        |d
|› d|› d�«       |dz  }�Œ† |S )zdMove files the server has retired (manifest "retire") into <client>/_retired/<date>/. Never deletes.r   Nz..ú\ú/Ú_retiredT©Úexist_okz.oldu   [âœ“] Retired z -> _retired/é   )ÚdatetimeÚshutilÚdateÚtodayÚ	isoformatÚosÚpathÚisabsÚreplaceÚsplitÚjoinÚlexistsÚdirnameÚmakedirsÚbasenameÚmove)ÚnamesÚ
client_dirÚlogr
   r   ÚstampÚmovedÚrelÚsrcÚdst_dirÚdsts              úheroes_journey_patcher.pyÚretire_client_filesr$      sE  € çØ�M‰M×ÑÓ!×+Ñ+Ó-€EØ€EØŠ{˜ó ˆÜ�7‰7�=‰=˜Ô ¨¯©°T¸3Ó)?×)EÑ)EÀcÓ)JÑ!JØÜ�g‰g�l‰l˜: sÓ+ˆÜ�w‰w�‰˜sÔ#ØÜ—'‘'—,‘,˜z¨:°u¼b¿g¹g¿o¹oÈcÓ>RÓSˆÜ
�‰�G dÕ+Ü�g‰g�l‰l˜7¤B§G¡G×$4Ñ$4°SÓ$9Ó:ˆÜ�g‰g�o‰o˜cÔ"Ø�6‰MˆCô �g‰g�o‰o˜cÕ"à�‰�C˜ÔÙˆn˜S˜E ¨u¨g°QÐ7Ô8Ø�‰
Šðð €Ló    z@biggs-adventure.duckdns.org:5999 (Bigg Adventure Direct DuckDNS)ú,http://192.168.4.78:8080/patch_manifest.jsonú%http://192.168.4.78:8080/patch_files/z biggs-adventure.duckdns.org:5999)ÚnameÚmanifestÚbase_urlÚhostz+192.168.4.78:5999 (Bigg Adventure LAN Host)z192.168.4.78:5999z6login.eqemulator.net:5999 (Official EQEmu LoginServer)úlogin.eqemulator.net:5999z%Host=biggs-adventure.duckdns.org:5999c                 ó\  — t         j                  j                  | «      sy t        j                  «       }	 t        | d«      5 }|j                  d«      x}r%|j                  |«       |j                  d«      x}rŒ%d d d «       |j                  «       S # 1 sw Y   ŒxY w# t        $ r Y y w xY w)NÚrbi   )
r   r   ÚexistsÚhashlibÚsha256ÚopenÚreadÚupdateÚ	hexdigestÚ	Exception)Úfilepathr1   ÚfÚchunks       r#   Ú
get_sha256r:   ?   sŸ   € Ü�7‰7�>‰>˜(Ô#ØÜ�^‰^Ó€FðÜ�(˜DÓ!ð 	% QØŸ6™6 %›=Ð(�%Ð(Ø—‘˜eÔ$ð Ÿ6™6 %›=Ð(�%Ñ(÷	%ð ×ÑÓ!Ð!÷	%ð 	%ûô ò Ùðús)   ¶B Á8BÁ;B ÂBÂB Â	B+Â*B+c                 óz  — |€t        j                  «       }t         j                  j                  |d«      }| j	                  «       }|j                  d«      r|}nd|› �}d|› d�}	 t        |d«      5 }|j                  |«       d d d «       dd|› �fS # 1 sw Y   ŒxY w# t        $ r}dd	|› �fcY d }~S d }~ww xY w)
Nú
eqhost.txtúHost=z[LoginServer]
ú
ÚwTzConfigured eqhost.txt -> FzCould not write eqhost.txt: )	r   Úgetcwdr   r   ÚstripÚ
startswithr2   Úwriter6   )Úhost_stringr   Úeqhost_pathÚ
clean_hostÚ	host_lineÚcontentr8   Úes           r#   Úupdate_eqhost_filerJ   K   sË   € ØÐÜ—Y‘Y“[ˆ
Ü—'‘'—,‘,˜z¨<Ó8€KØ×"Ñ"Ó$€JØ×Ñ˜WÔ%Ø‰	à˜J˜<Ð(ˆ	Ø 	˜{¨"Ð-€Gð9Ü�+˜sÓ#ð 	 qØ�G‰G�GÔ÷	àÐ0°°Ð<Ð<Ð<÷	ð 	ûô ò 9ØÐ4°Q°CÐ8Ð8Õ8ûð9ús6   Á'B  Á3BÂB  ÂBÂB  Â 	B:Â)B5Â/B:Â5B:c                 óÀ  — | €t        j                  «       } t         j                  j                  | d«      }t         j                  j	                  |«      rn	 t        |d«      5 }|D ]Q  }|j                  «       }|j                  d«      sŒ%|j                  dd«      d   j                  «       c cd d d «       S  	 d d d «       yy# 1 sw Y   yxY w# t        $ r Y yw xY w)Nr<   Úrr=   ú=r	   r,   )
r   r@   r   r   r/   r2   rA   rB   r   r6   )r   rE   r8   Úlines       r#   Úread_current_eqhostrO   \   sÇ   € ØÐÜ—Y‘Y“[ˆ
Ü—'‘'—,‘,˜z¨<Ó8€KÜ	‡w�w‡~�~�kÔ"ð	Ü�k 3Ó'ð =¨1Øò =�DØŸ:™:›<�DØ—‘ wÕ/Ø#Ÿz™z¨#¨qÓ1°!Ñ4×:Ñ:Ó<Ñ<÷	=ñ =ñ=÷=ñ '÷=ð 'ûô ò 	ØØ&ð	úsB   ÁC Á#'CÂ$CÂ/	C Â9CÂ;C ÃCÃ
C ÃC Ã	CÃCc                 ó  — | €t        j                  «       } t         j                  j                  | d«      }t         j                  j	                  |«      sdd| › �fS t         j
                  j                  «       }d|vrd|d<   d}|rîdD ]é  }t         j                  j                  t         j                  j                  | |«      «      }t         j                  j	                  |«      sŒ`t         j                  j                  |«      }	 t        j                  j                  d«      rt        j                  |g|¬«       nt        j                  d	|g||¬
«       d}t        j                  d«        n t        j                  j                  d«      r|dg}nd	|dg}	 t        j                  || |¬
«       ddj                  |«      › d�}	|r|	dz  }	d|	fS # t         $ r Y Œpw xY w# t         $ r}
dd|
› �fcY d }
~
S d }
~
ww xY w)Nú
eqgame.exeFzeqgame.exe not found in Ú
WINEPREFIXz/home/tj/.wine)zMacroQuest.exezMacroQuest2.exez../E3_MQ2_RoF2/MacroQuest2.exeÚwin)ÚcwdÚwine)rT   ÚenvTg      ø?ÚpatchmezLaunched EverQuest (ú ú)z + MacroQuestzLaunch failed: )r   r@   r   r   r/   ÚenvironÚcopyÚnormpathr   ÚsysÚplatformrB   Ú
subprocessÚPopenÚtimeÚsleepr6   )r   Ú	launch_mqÚ
eqgame_exerV   Ú
mq_startedÚ	candidateÚmq_pathÚmq_dirÚcmdÚmsgrI   s              r#   Úlaunch_eqgamerk   k   sÂ  € ØÐÜ—Y‘Y“[ˆ
Ü—‘—‘˜j¨,Ó7€JÜ�7‰7�>‰>˜*Ô%ØÐ0°°Ð=Ð=Ð=ä
�*‰*�/‰/Ó
€CØ˜3ÑØ,ˆˆLÑà€JÙØ`ò 	ˆIÜ—g‘g×&Ñ&¤r§w¡w§|¡|°JÀ	Ó'JÓKˆGÜ�w‰w�~‰~˜gÕ&ÜŸ™Ÿ™¨Ó1�ðÜ—|‘|×.Ñ.¨uÔ5Ü"×(Ñ(¨'¨¸Ö?ä"×(Ñ(¨&°'Ð):ÀÈCÕPØ!%�JÜ—J‘J˜s”Oñ ð	ô ‡|�|×Ñ˜uÔ%Ø˜9Ð%‰à�z 9Ð-ˆð,Ü×Ñ˜ *°#Õ6Ø$ S§X¡X¨c£] O°1Ð5ˆÙØ�?Ñ"ˆCØ�SˆyÐøô !ò Ùðûô ò ,Ø˜¨ sÐ+Ð+Õ+ûð,ús1   Ä
A)GÆ 7G' Ç	G$Ç#G$Ç'	HÇ0G<Ç6HÇ<Hc                  óp  ‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡— ddl m} m}mŠmŠmŠ
mŠmŠmŠm	Šm
Š	mŠmŠmŠ ddlm}mŠm} ddlmŠmŠ  G ˆfd„d|«      Š G ˆˆˆ	ˆ
ˆˆˆˆˆˆˆˆˆˆfd„d|«      } | t*        j,                  «      } |«       }|j/                  «        t+        j0                  |j3                  «       «       y )	Nr   )ÚQApplicationÚQMainWindowÚQWidgetÚQVBoxLayoutÚQHBoxLayoutÚQLabelÚQPushButtonÚ	QTextEditÚQProgressBarÚ	QComboBoxÚ	QLineEditÚQMessageBoxÚ	QCheckBox)ÚQtÚ
pyqtSignalÚQObject)ÚQColorÚQPalettec                   óT   •— e Zd Z W ° e«      Z W ° e«      Z W ° e«      Z W ° «       Zy)ú$run_pyqt6_gui.<locals>.WorkerSignalsN)	Ú__name__Ú
__module__Ú__qualname__Ústrr   ÚstatusÚintÚprogressÚfinished)r{   s   €r#   ÚWorkerSignalsr€   ž   s%   ø„ Ú˜‹oˆÚ˜C“ˆÚ˜c“?ˆÚ“<‰r%   r‰   c                   ó|   •‡ — e Zd Zˆˆ fd„Zˆˆˆˆˆˆˆˆ	ˆ
ˆˆˆfd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zˆfd„Zˆ xZS )ú$run_pyqt6_gui.<locals>.PatcherWindowc                 óÆ  •— t         ‰| �  «        | j                  d«       | j                  dd«       | j	                  dd«        ‰«       | _        | j
                  j                  j                  | j                  «       | j
                  j                  j                  | j                  «       | j
                  j                  j                  | j                  «       | j
                  j                  j                  | j                  «       t        j                   j#                  t        j                   j%                  t&        «      «      | _        | j+                  «        y )Nu<   Bigg Adventure - Heroes Journey Patcher (RoF2 â€¢ Port 5999)iø  i  i¼  iô  )ÚsuperÚ__init__ÚsetWindowTitleÚresizeÚsetMinimumSizeÚsignalsr   ÚconnectÚ
append_logr…   Ú
set_statusr‡   Úset_progressrˆ   Úon_patch_finishedr   r   r   ÚabspathÚ__file__r   Úinit_ui)Úselfr‰   Ú	__class__s    €€r#   rŽ   z-run_pyqt6_gui.<locals>.PatcherWindow.__init__¥   sâ   ø€ Ü‰GÑÔØ×ÑÐ ^Ô_Ø�K‰K˜˜SÔ!Ø×Ñ  SÔ)Ù(›?ˆDŒLØ�L‰L×Ñ×$Ñ$ T§_¡_Ô5Ø�L‰L×Ñ×'Ñ'¨¯©Ô8Ø�L‰L×!Ñ!×)Ñ)¨$×*;Ñ*;Ô<Ø�L‰L×!Ñ!×)Ñ)¨$×*@Ñ*@ÔAä Ÿg™gŸo™o¬b¯g©g¯o©o¼hÓ.GÓHˆDŒOØ�L‰L�Nr%   c                 óT  •—  ‰«       }|j                  ‰j                  j                   ‰d«      «       |j                  ‰j                  j                   ‰d«      «       |j                  ‰j                  j                   ‰d«      «       |j                  ‰j                  j
                   ‰d«      «       |j                  ‰j                  j                   ‰d«      «       |j                  ‰j                  j                   ‰d«      «       |j                  ‰j                  j                   ‰d«      «       | j                  |«        ‰«       }| j                  |«        ‰|«      }|j                  dddd«       |j                  d	«        ‰«       } ‰d
«      }|j                  d«        ‰d«      }|j                  d«       |j                  |«       |j                  |«       |j                  |«        ‰«       } ‰d«      }|j                  d«        ‰«       | _        | j                   j                  d«       t"        D ]!  }	| j                   j%                  |	d   |	«       Œ# | j                   j&                  j)                  | j*                  «       |j                  |«       |j                  | j                   d«       |j                  |«        ‰«       }
 ‰d«      }|j                  d«        ‰«       | _        t/        | j0                  «      }| j,                  j3                  |«       | j,                  j                  d«        ‰d«      | _        | j4                  j                  d«       | j4                  j6                  j)                  | j8                  «       |
j                  |«       |
j                  | j,                  d«       |
j                  | j4                  «       |j                  |
«        ‰«       | _        | j:                  j=                  d«       | j:                  j                  d«       |j                  | j:                  d«        ‰d«      | _        | j>                  j                  d«       |j                  | j>                  «        ‰«       | _         | j@                  jC                  dd«       | j@                  jE                  d«       | j@                  j                  d«       |j                  | j@                  «        ‰«       } ‰d«      | _#        | jF                  j                  d«       | jF                  j6                  j)                  | jH                  «        ‰d «      | _%        | jJ                  jM                  d«       | jJ                  j                  d!«        ‰d"«      | _'        | jN                  j                  d#«       | jN                  j6                  j)                  | jP                  «       |j                  | jF                  «       |j                  | jJ                  «       |jS                  «        |j                  | jN                  «       |j                  |«       | jU                  d$«       | j9                  «        y )%Nz#121212z#E0E0E0z#1E1E1Ez#2A2A2Az#D4D4D4z#222222é   é   é
   u!   HEROES JOURNEY â€¢ EVERQUEST RoF2z3color: #00E5FF; font-size: 20px; font-weight: bold;uM   Dragons of Norrath / DoDH Era â€¢ 3-Class Multiclass Server (Login Port 5999)z4color: #FFB300; font-size: 13px; font-style: italic;zPreset Server:z1color: #AAAAAA; font-size: 12px; min-width: 90px;zgbackground-color: #222222; color: #FFFFFF; padding: 4px; border: 1px solid #444444; border-radius: 4px;r(   r	   zActive eqhost:z’background-color: #1E1E1E; color: #00E5FF; padding: 5px; border: 1px solid #444444; border-radius: 4px; font-family: monospace; font-weight: bold;z	Save HostzObackground-color: #37474F; color: white; padding: 5px 12px; border-radius: 4px;Tzšbackground-color: #1A1A1A; color: #D4D4D4; border: 1px solid #333333; border-radius: 4px; font-family: Consolas, monospace; font-size: 12px; padding: 8px;zReady to connect and play.z color: #B0BEC5; font-size: 12px;r   éd   zäQProgressBar { background-color: #222222; border: 1px solid #333333; border-radius: 4px; height: 16px; text-align: center; color: #FFFFFF; font-size: 11px; } QProgressBar::chunk { background-color: #00E5FF; border-radius: 3px; }zCHECK FOR UPDATESa	  QPushButton { background-color: #1976D2; color: #FFFFFF; font-weight: bold; font-size: 13px; padding: 10px 20px; border-radius: 4px; border: none; } QPushButton:hover { background-color: #2196F3; } QPushButton:disabled { background-color: #444444; color: #888888; }z%Auto-Launch MacroQuest (Next / ImGui)zFcolor: #76FF03; font-weight: bold; font-size: 12px; margin-left: 15px;zPLAY HEROES JOURNEYzÅQPushButton { background-color: #2E7D32; color: #FFFFFF; font-weight: bold; font-size: 14px; padding: 10px 25px; border-radius: 4px; border: none; } QPushButton:hover { background-color: #388E3C; }uä   Welcome to Bigg Adventure Patcher (RoF2)!
â€¢ RoF2 Login Server uses Port 5999.
â€¢ Log in with your EQEmu account and select Bigg Adventure from the server list!
=================================================================)+ÚsetColorÚ	ColorRoleÚWindowÚ
WindowTextÚBaseÚAlternateBaseÚTextÚButtonÚ
ButtonTextÚ
setPaletteÚsetCentralWidgetÚsetContentsMarginsÚ
setSpacingÚsetStyleSheetÚ	addWidgetÚ	addLayoutÚserver_comboÚCANDIDATE_SERVERSÚaddItemÚcurrentIndexChangedr“   Úon_preset_selectedÚ
host_inputrO   r   ÚsetTextÚapply_host_btnÚclickedÚsave_custom_hostÚlog_textÚsetReadOnlyÚ
status_lblÚprogress_barÚsetRangeÚsetValueÚ	check_btnÚstart_patch_threadÚmq_checkboxÚ
setCheckedÚplay_btnÚon_play_clickedÚ
addStretchr”   )r›   ÚpaletteÚcentralÚlayoutÚheader_layoutÚ	title_lblÚsubtitle_lblÚpreset_layoutÚ
preset_lblÚsÚhost_layoutÚhost_lblÚ	current_hÚ
btn_layoutry   r}   rv   rq   rr   rw   r~   ru   rs   rt   rp   ro   s                 €€€€€€€€€€€€r#   rš   z,run_pyqt6_gui.<locals>.PatcherWindow.init_ui³   sv  ø€ Ù“jˆGØ×Ñ˜X×/Ñ/×6Ñ6¹¸yÓ8IÔJØ×Ñ˜X×/Ñ/×:Ñ:¹FÀ9Ó<MÔNØ×Ñ˜X×/Ñ/×4Ñ4±f¸YÓ6GÔHØ×Ñ˜X×/Ñ/×=Ñ=¹vÀiÓ?PÔQØ×Ñ˜X×/Ñ/×4Ñ4±f¸YÓ6GÔHØ×Ñ˜X×/Ñ/×6Ñ6¹¸yÓ8IÔJØ×Ñ˜X×/Ñ/×:Ñ:¹FÀ9Ó<MÔNØ�O‰O˜GÔ$á“iˆGØ×!Ñ! 'Ô*Ù  Ó)ˆFØ×%Ñ% b¨"¨b°"Ô5Ø×Ñ˜bÔ!ñ (›MˆMÙÐBÓCˆIØ×#Ñ#Ð$YÔZÙ!Ð"qÓrˆLØ×&Ñ&Ð']Ô^Ø×#Ñ# IÔ.Ø×#Ñ# LÔ1Ø×Ñ˜]Ô+ñ (›MˆMÙÐ 0Ó1ˆJØ×$Ñ$Ð%XÔYÙ )£ˆDÔØ×Ñ×+Ñ+ð  -Vô  WÜ&ò 8�Ø×!Ñ!×)Ñ)¨!¨F©)°QÕ7ð8à×Ñ×1Ñ1×9Ñ9¸$×:QÑ:QÔRØ×#Ñ# JÔ/Ø×#Ñ# D×$5Ñ$5°qÔ9Ø×Ñ˜]Ô+ñ &›-ˆKÙÐ.Ó/ˆHØ×"Ñ"Ð#VÔWÙ'›kˆDŒOÜ+¨D¯O©OÓ<ˆIØ�O‰O×#Ñ# IÔ.Ø�O‰O×)Ñ)ð  +ô  @á"-¨kÓ":ˆDÔØ×Ñ×-Ñ-Ð.ô  AØ×Ñ×'Ñ'×/Ñ/°×0EÑ0EÔFà×!Ñ! (Ô+Ø×!Ñ! $§/¡/°1Ô5Ø×!Ñ! $×"5Ñ"5Ô6Ø×Ñ˜[Ô)ñ &›KˆDŒMØ�M‰M×%Ñ% dÔ+Ø�M‰M×'Ñ'ðSôð ×Ñ˜TŸ]™]¨AÔ.ñ %Ð%AÓBˆDŒOØ�O‰O×)Ñ)Ð*LÔMØ×Ñ˜TŸ_™_Ô-á ,£ˆDÔØ×Ñ×&Ñ& q¨#Ô.Ø×Ñ×&Ñ& qÔ)Ø×Ñ×+Ñ+ðYôð ×Ñ˜T×.Ñ.Ô/ñ %›ˆJÙ(Ð)<Ó=ˆDŒNØ�N‰N×(Ñ(ðVôð
 �N‰N×"Ñ"×*Ñ*¨4×+BÑ+BÔCá(Ð)PÓQˆDÔØ×Ñ×'Ñ'¨Ô-Ø×Ñ×*Ñ*Ð+sÔtá'Ð(=Ó>ˆDŒMØ�M‰M×'Ñ'ðCôð �M‰M×!Ñ!×)Ñ)¨$×*>Ñ*>Ô?à× Ñ  §¡Ô0Ø× Ñ  ×!1Ñ!1Ô2Ø×!Ñ!Ô#Ø× Ñ  §¡Ô/Ø×Ñ˜ZÔ(ð �O‰Oð  Nô  OØ×!Ñ!Õ#r%   c                 óš   — | j                   j                  «       }|r/| j                  j                  |d   «       | j	                  «        y y )Nr+   )r²   ÚcurrentDatar·   r¸   r»   )r›   Úsrvs     r#   r¶   z7run_pyqt6_gui.<locals>.PatcherWindow.on_preset_selected#  s@   € Ø×#Ñ#×/Ñ/Ó1ˆCÙØ—‘×'Ñ'¨¨F©Ô4Ø×%Ñ%Õ'ð r%   c                 óò   — | j                   j                  «       j                  «       }|sd}| j                   j                  |«       t	        || j
                  «      \  }}|r| j                  d|› �«       y y )Nr,   õ   [âœ“] )r·   ÚtextrA   r¸   rJ   r   r”   )r›   ÚtargetÚokrj   s       r#   r»   z5run_pyqt6_gui.<locals>.PatcherWindow.save_custom_host)  se   € Ø—_‘_×)Ñ)Ó+×1Ñ1Ó3ˆFÙØ4�Ø—‘×'Ñ'¨Ô/Ü(¨°·±ÓA‰GˆB�ÙØ—‘ &¨¨ Õ/ð r%   c                 óØ   — | j                   j                  |«       | j                   j                  «       j                  | j                   j                  «       j	                  «       «       y ©N)r¼   ÚappendÚverticalScrollBarrÁ   Úmaximum©r›   rÛ   s     r#   r”   z/run_pyqt6_gui.<locals>.PatcherWindow.append_log2  sE   € Ø�M‰M× Ñ  Ô&Ø�M‰M×+Ñ+Ó-×6Ñ6°t·}±}×7VÑ7VÓ7X×7`Ñ7`Ó7bÕcr%   c                 ó:   — | j                   j                  |«       y rß   )r¾   r¸   rã   s     r#   r•   z/run_pyqt6_gui.<locals>.PatcherWindow.set_status6  s   € Ø�O‰O×#Ñ# DÕ)r%   c                 ó:   — | j                   j                  |«       y rß   )r¿   rÁ   )r›   Úvals     r#   r–   z1run_pyqt6_gui.<locals>.PatcherWindow.set_progress9  s   € Ø×Ñ×&Ñ& sÕ+r%   c                 óB  — | j                   j                  d«       | j                  «        | j                  j	                  «       }| j
                  j                  «       j                  «       }t        j                  | j                  ||fd¬«      j                  «        y )NFT)rÜ   ÚargsÚdaemon)rÂ   Ú
setEnabledr»   r²   r×   r·   rÛ   rA   Ú	threadingÚThreadÚrun_patch_workerÚstart)r›   rØ   Útarget_hosts      r#   rÃ   z7run_pyqt6_gui.<locals>.PatcherWindow.start_patch_thread<  sv   € Ø�N‰N×%Ñ% eÔ,Ø×!Ñ!Ô#Ø×#Ñ#×/Ñ/Ó1ˆCØŸ/™/×.Ñ.Ó0×6Ñ6Ó8ˆKÜ×Ñ D×$9Ñ$9ÀÀkÐ@RÐ[_Ô`×fÑfÕhr%   c           	      óÆ  — | j                   j                  j                  d«       |r|d   nd}|r|d   nd}| j                   j                  j                  d|› d�«       d }|gt        D �cg c]  }|d   |k7  sŒ|d   ‘Œ c}z   }|D ]Ü  }	 t
        j                  j                  |dd	i¬
«      }	t
        j                  j                  |	d¬«      5 }
|
j                  dk(  r|t        j                  |
j                  «       j                  «       «      }|j                  dd«      d   dz   }| j                   j                  j                  d|› �«       	 d d d «        n	 d d d «       ŒÞ |sÕ| j                   j                  j                  d«       t        || j                   «       | j                   j                  j                  d|› �«       | j                   j                  j                  d|› �«       | j                   j"                  j                  d«       | j                   j$                  j                  «        y |j'                  dd«      }|r,| j                   j                  j                  d|› d�dz   «       |j'                  dd|› �«      }t        || j                   «       t)        |j'                  d«      | j                   | j                   j                  j                  «       | j                   j                  j                  d|› �«       |j'                  d g «      }t+        |«      }|dk(  r”| j                   j                  j                  d!«       | j                   j                  j                  d"«       | j                   j"                  j                  d«       | j                   j$                  j                  «        y d}t-        |«      D �]¢  \  }}|d#   }|d$   }t.        j0                  j3                  | j                   |«      }|j5                  «       d%k(  rŒOt7        |«      }t9        |dz   |z  dz  «      }| j                   j"                  j                  |«       | j                   j                  j                  d&|dz   › d|› d'|› �«       ||k7  sŒÊ| j                   j                  j                  d(|› �«       ||z   }t.        j0                  j;                  |«      }|rt/        j<                  |d)¬*«       	 t
        j                  j?                  ||«       |dz  }|j5                  «       jA                  d+«      rŒ| j                   j                  j                  d,|› d�«       dd l!}|jE                  |d-«      5 }|jG                  | j                   «       d d d «       | j                   j                  j                  d.|› �«       n£|jI                  d/«      r’dd l%}t.        j0                  j3                  | j                   d0t.        j0                  jM                  |«      «      }t/        j<                  t.        j0                  j;                  |«      d)¬*«       |jO                  ||«       �Œ¥ | j                   j                  j                  d3|› d4�«       | j                   j                  j                  d5«       | j                   j$                  j                  «        y c c}w # 1 sw Y   �Œ›xY w# t        $ r Y �Œ‡w xY w# 1 sw Y   �ŒnxY w# t        $ r6}| j                   j                  j                  d1|› d2|› �«       Y d }~�Œ‚d }~ww xY w)6NzChecking manifest server...r)   r&   r*   r'   z
Checking manifest at ú...z
User-AgentzHeroesJourneyPatcher/2.0)Úheadersé   )ÚtimeoutéÈ   r   r	   r   z/patch_files/u$   [âœ“] Connected to manifest server: zG[!] Notice: HTTP patch server is offline. Using direct connection mode.u!   [âœ“] eqhost.txt is set to: Host=zReady to connect to r¡   ÚnewsÚ z
SERVER NEWS:
r>   zA-----------------------------------------------------------------Úeqhostr=   Úretireu   [âœ“] Configured eqhost.txt -> Úfilesu%   [âœ“] No custom patch files required.zClient is up to date!r   r1   rQ   zChecking file (z): z![-->] Downloading updated asset: Tr   z.zipz[-->] Extracting archive: rL   u   [âœ“] Successfully extracted zmq/lua/Úluaz![!] Error downloading/extracting z: u   
[âœ“] Patch check completed! (z files updated)z"Client is fully patched and ready!)(r’   r…   Úemitr   r³   ÚurllibÚrequestÚRequestÚurlopenÚjsonÚloadsr3   ÚdecodeÚrsplitr6   rJ   r   r‡   rˆ   Úgetr$   ÚlenÚ	enumerater   r   r   Úlowerr:   r†   r   r   ÚurlretrieveÚendswithÚzipfileÚZipFileÚ
extractallrB   r   r   Úcopy2)r›   Úsrv_inforï   Úmanifest_urlr*   Úmanifest_datarÑ   Ú	test_urlsÚuÚreqÚrespÚserver_newsÚeqhost_settingÚfiles_to_patchÚtotal_filesÚupdated_countÚidxÚ	file_infoÚrel_pathÚexpected_hashÚ
local_pathÚ
local_hashÚprogress_pctÚdownload_urlÚdir_namer  Úzip_refr   Údest_luarI   s                                 r#   rí   z5run_pyqt6_gui.<locals>.PatcherWindow.run_patch_workerC  s'  € Ø�L‰L×Ñ×$Ñ$Ð%BÔCÙ3;˜8 JÒ/ÐAoˆLÙ/7�x 
Ò+Ð=dˆHà�L‰L×Ñ×!Ñ!Ð$;¸L¸>ÈÐ"MÔNØ ˆMà%˜ÔARÖ)t¸AÐVWÐXbÑVcÐgsÓVs¨!¨J«-Ò)tÑtˆIàò 
�ð	Ü Ÿ.™.×0Ñ0°¸\ÐKeÐ<fÐ0Óg�CÜŸ™×/Ñ/°¸QÐ/Ó?ð "À4ØŸ;™;¨#Ò-Ü,0¯J©J°t·y±y³{×7IÑ7IÓ7KÓ,L˜MØ'(§x¡x°°QÓ'7¸Ñ':¸_Ñ'L˜HØ ŸL™L×,Ñ,×1Ñ1Ð4XÐYZÐX[Ð2\Ô]Ø!÷"ñ "Ø-÷"øð
ñ !Ø—‘× Ñ ×%Ñ%Ð&oÔpÜ" ;°·±Ô@Ø—‘× Ñ ×%Ñ%Ð(IÈ+ÈÐ&WÔXØ—‘×#Ñ#×(Ñ(Ð+?À¸}Ð)MÔNØ—‘×%Ñ%×*Ñ*¨3Ô/Ø—‘×%Ñ%×*Ñ*Ô,Øà'×+Ñ+¨F°BÓ7ˆKÙØ—‘× Ñ ×%Ñ%Ð(8¸¸ÀRÐ&HÈ6Ñ&QÔRà*×.Ñ.¨x¸5ÀÀÐ9NÓOˆNÜ˜~¨t¯©Ô?Ü × 1Ñ 1°(Ó ;¸T¿_¹_ÈdÏlÉl×N^ÑN^×NcÑNcÔdØ�L‰L×Ñ×!Ñ!Ð$CÀNÐCSÐ"TÔUà*×.Ñ.¨w¸Ó;ˆNÜ˜nÓ-ˆKà˜aÒØ—‘× Ñ ×%Ñ%Ð&MÔNØ—‘×#Ñ#×(Ñ(Ð)@ÔAØ—‘×%Ñ%×*Ñ*¨3Ô/Ø—‘×%Ñ%×*Ñ*Ô,ØàˆMÜ"+¨NÓ";ó $c‘��YØ$ VÑ,�Ø )¨(Ñ 3�ÜŸW™WŸ\™\¨$¯/©/¸8ÓD�
ð —>‘>Ó# |Ò3Øä'¨
Ó3�
ä" S¨1¡W°Ñ$;¸sÑ#BÓC�Ø—‘×%Ñ%×*Ñ*¨<Ô8Ø—‘×#Ñ#×(Ñ(¨?¸3¸q¹5¸'ÀÀ;À-ÈsÐS[ÐR\Ð)]Ô^à Ó.Ø—L‘L×$Ñ$×)Ñ)Ð,MÈhÈZÐ*XÔYØ#+¨hÑ#6�LÜ!Ÿw™wŸ™¨zÓ:�HÙÜŸ™ H°tÕ<ðcÜŸ™×2Ñ2°<ÀÔLØ%¨Ñ*˜Ø#Ÿ>™>Ó+×4Ñ4°VÔ<Ø ŸL™L×,Ñ,×1Ñ1Ð4NÈxÈjÐX[Ð2\Ô]Û*Ø!(§¡°¸SÓ!Að DÀWØ '× 2Ñ 2°4·?±?Ô C÷Dà ŸL™L×,Ñ,×1Ñ1Ð4QÐRZÐQ[Ð2\Õ]Ø%×0Ñ0°Ô;Û)Ü')§w¡w§|¡|°D·O±OÀUÌBÏGÉG×L\ÑL\Ð]eÓLfÓ'g˜HÜŸK™K¬¯©¯©¸Ó(AÈDÕQØ"ŸL™L¨°XÔ>ùðE$cðL �L‰L×Ñ×!Ñ!Ð$DÀ]ÀOÐSbÐ"cÔdØ�L‰L×Ñ×$Ñ$Ð%IÔJØ�L‰L×!Ñ!×&Ñ&Õ(ùòg *u÷
"ñ "ûô !ò Úðú÷vDñ Dûô %ò cØŸ™×(Ñ(×-Ñ-Ð0QÐRZÐQ[Ð[]Ð^_Ð]`Ð.a×bÒbûðcúsp   Á-[2Á;[2ÂA\ÃB[7Å\Å\Ô	B\!Ö\Ö(C\!Û7\	Û<\Ü	\Ü\Ü\	Ü\!Ü!	] Ü*+]Ý] c                 ó:   — | j                   j                  d«       y ©NT)rÂ   rê   )r›   s    r#   r—   z6run_pyqt6_gui.<locals>.PatcherWindow.on_patch_finished   s   € Ø�N‰N×%Ñ% dÕ+r%   c                 ór  •— | j                  «        | j                  j                  «       }| j                  d|rdnd› d�«       t	        | j
                  |¬«      \  }}|r0| j                  d|› �«       | j                  j                  d«       y | j                  d|› �«       ‰j                  | d	|«       y )
NzLaunching EverQuest RoF2z with MacroQuestr÷   rñ   )rc   rÚ   zGame launched!z[!] Error: zLaunch Error)	r»   rÄ   Ú	isCheckedr”   rk   r   r¾   r¸   Úcritical)r›   rc   rÝ   rj   rx   s       €r#   rÇ   z4run_pyqt6_gui.<locals>.PatcherWindow.on_play_clicked£  s¢   ø€ Ø×!Ñ!Ô#Ø×(Ñ(×2Ñ2Ó4ˆIØ�O‰OÐ6ÉYÑ7IÐ\^Ð6_Ð_bÐcÔdÜ# D§O¡O¸yÔI‰GˆB�ÙØ—‘ &¨¨ Ô/Ø—‘×'Ñ'Ð(8Õ9à—‘ +¨c¨UÐ 3Ô4Ø×$Ñ$ T¨>¸3Õ?r%   )r�   r‚   rƒ   rŽ   rš   r¶   r»   r”   r•   r–   rÃ   rí   r—   rÇ   Ú__classcell__)rœ   ry   r}   rv   rq   rr   rw   rx   r~   ru   rs   rt   rp   ro   r‰   s   @€€€€€€€€€€€€€€r#   ÚPatcherWindowr‹   ¤   sM   ù„ õ	÷n	$÷ n	$ò`	(ò	0ò	dò	*ò	,ò	iò[	)òz	,÷
	@ð 
	@r%   r,  )ÚPyQt6.QtWidgetsrm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   ÚPyQt6.QtCorerz   r{   r|   ÚPyQt6.QtGuir}   r~   r]   ÚargvÚshowÚexitÚexec)rm   rn   rz   r|   r,  ÚapprS   ry   r}   rv   rq   rr   rw   rx   r~   ru   rs   rt   rp   ro   r‰   r{   s          @@@@@@@@@@@@@@@r#   Úrun_pyqt6_guir5  –   s€   ÿþ€ ÷÷ ÷ õ ÷ 5Ñ4ß,ö ˜ô  ÷I@÷ I@ó I@˜ô I@ñV ”s—x‘xÓ
 €CÙ
‹/€CØ‡H�H„JÜ‡H�HˆS�X‰X‹ZÕr%   c                  ó.  — t         j                  j                  t         j                  j                  t        «      «      } t        d«       t        d«       t        d«       t        d| › �«       d}t        t        j                  «      dkD  r5t        j                  d   j                  d«      st        j                  d   }t        d|› �| «       t        d|› �«       d	t        j                  v r$t        | «      \  }}t        d
|rdnd› d|› �«       y y )NzA=================================================================z<Bigg Adventure - Heroes Journey Patcher (RoF2 Port 5999 CLI)zWorking Directory: r,   r	   z--r=   u$   [âœ“] Configured eqhost.txt -> Host=ú--launchú[u   âœ“ú!z] )r   r   r   r˜   r™   Úprintr  r]   r0  rB   rJ   rk   )r   r+   rÝ   rj   s       r#   Úrun_cli_patcherr;  µ  sØ   € Ü—‘—‘¤§¡§¡´Ó!:Ó;€JÜ	ˆ&„MÜ	Ð
HÔIÜ	ˆ&„MÜ	Ð 
˜|Ð
,Ô-à&€DÜ
Œ3�8‰8ƒ}�qÒ¤§¡¨!¡×!7Ñ!7¸Ô!=Ü�x‰x˜‰{ˆä˜˜t˜f�~ zÔ2Ü	Ð0°°Ð
7Ô8à”S—X‘XÑÜ 
Ó+‰ˆˆCÜ�™2‘% 3Ð' r¨#¨Ð/Õ0ð r%   Ú__main__rQ   z--clir7  rß   r'  )Ú__doc__r   r]   r  r0   Úurllib.requestrý   r_   rë   Úsocketra   r$   r³   ÚDEFAULT_EQHOSTr:   rJ   rO   rk   r5  r;  r�   r   r   r˜   r™   Ú
script_dirr/   r   Úchdirr0  r6   © r%   r#   ú<module>rD     s0  ðñó
 
Û 
Û Û Û Û Û Û Û òð0 SØBØ;Ø2ñ	ð >ØBØ;Ø#ñ	ð IØBØ;Ø+ñ	ðÐ ð* 9€ò
ó9ó"'ó(,òV\ò~1ð$ ˆzÒØ—‘—‘ §¡§¡°Ó!:Ó;€JØ	‡w�w‡~�~�b—g‘g—l‘l :¨|Ó<Ô=Øˆ�‰�Ôà�#—(‘(Ñ˜j¨C¯H©HÑ4ÙÕð	Ù�Oð øð ò 	ÙÖð	ús   Ã:D ÄDÄD