1+ import requests
2+ import time
3+ import random
4+ import os
5+ import sys
6+ import subprocess
7+ import json
8+ from packaging .version import parse as parse_version
9+ import tempfile
10+ import platform
11+ import logging
12+
13+ sleep = time .sleep
14+
15+ CONFIG_PATH = os .path .join (
16+ os .path .dirname (os .path .abspath (sys .argv [0 ])),
17+ "data" , "config" , "config.json"
18+ )
19+
20+ Name_Program = "Check_update"
21+ version_soft = "1.0.2-beta+build.1"
22+
23+ LOG_DIR = "logs"
24+ LOG_FILE = os .path .join (LOG_DIR , "logs.txt" )
25+ if not os .path .exists (LOG_DIR ):
26+ os .makedirs (LOG_DIR )
27+
28+ logging .basicConfig (
29+ level = logging .DEBUG ,
30+ format = '%(asctime)s [%(levelname)s] %(message)s' ,
31+ handlers = [
32+ logging .FileHandler (LOG_FILE , mode = 'w' , encoding = 'utf-8' ),
33+ # logging.StreamHandler() # Вывод в консоль
34+ ]
35+ )
36+
37+ logger = logging .getLogger ()
38+ logging .info (f"--- { Name_Program } { version_soft } ---" )
39+
40+ VERSION_URL = "https://raw.githubusercontent.com/BrocatScript/PowerSetSetup/main/version.json"
41+
42+ def clear ():
43+ if platform .system () == 'Windows' :
44+ os .system ('cls' )
45+ else :
46+ error_os ()
47+
48+ def error_os ():
49+ try :
50+ clear ()
51+ print (f"ERROR: YOU SYSTEM NOT WINDOWS! YOU SYSTEM { platform .system } " )
52+ sys .exit (5 )
53+ except Exception as e :
54+ clear ()
55+ logging .error (f"Critical error in error_os: { e } , uninstall program please!" )
56+ print (f"Critical error in error_os: { e } " )
57+ sys .exit (5 )
58+
59+ def load_config ():
60+ try :
61+ with open (CONFIG_PATH , 'r' , encoding = 'utf-8' ) as f :
62+ return json .load (f )
63+ except FileNotFoundError :
64+ print (f"Ошибка: файл конфигурации не найден по пути { CONFIG_PATH } " )
65+ sys .exit (2 )
66+ except json .JSONDecodeError :
67+ print ("Ошибка: не удалось разобрать config.json (некорректный JSON)" )
68+ sys .exit (2 )
69+ except Exception as e :
70+ print (f"Ошибка при чтении config.json: { e } " )
71+ sys .exit (2 )
72+
73+ def build_full_version (config ):
74+ version = config .get ("version" )
75+ if not version :
76+ print ("Ошибка: в файле config.json отсутствует поле 'version'" )
77+ sys .exit (2 )
78+
79+ build = config .get ("build" )
80+ if build is not None :
81+ try :
82+ build_num = int (build )
83+ return f"{ version } +build.{ build_num } "
84+ except (ValueError , TypeError ):
85+ return version
86+ return version
87+
88+ def check_for_updates ():
89+ try :
90+ config = load_config ()
91+ current_version_str = build_full_version (config )
92+ allow_beta = config .get ("allow_beta" , False )
93+ auto_download = config .get ("auto_download_install" , False )
94+
95+ url = f"{ VERSION_URL } ?t={ int (time .time ())} &r={ random .random ()} "
96+ headers = {"Cache-Control" : "no-cache" , "Pragma" : "no-cache" }
97+ resp = requests .get (url , timeout = 5 , headers = headers )
98+ resp .raise_for_status ()
99+ data = resp .json ()
100+
101+ if not isinstance (data , dict ):
102+ print (f"Ошибка: сервер вернул не объект JSON, а { type (data ).__name__ } " )
103+ os .system ("pause" )
104+ open_powersetsetup ()
105+
106+ server_version_str = data .get ("version" )
107+ if not server_version_str :
108+ print ("Ошибка: в JSON отсутствует поле 'version'" )
109+ os .system ("pause" )
110+ open_powersetsetup ()
111+
112+ print (f"🌐: { server_version_str } " )
113+ print (f"🖥️: { current_version_str } " )
114+
115+ server_version = parse_version (server_version_str )
116+ current_version = parse_version (current_version_str )
117+
118+ if not allow_beta and server_version .is_prerelease :
119+ print ("✅ Update beta: ❌ The beta version is not available (allow_beta = false)." )
120+ print ("🌐🤜 🤛🖥️👍" )
121+ os .system ("pause" )
122+ open_powersetsetup ()
123+
124+ if server_version > current_version :
125+ print (f"✅ Update: { server_version_str } " )
126+ download_url = data .get ("download_url" )
127+ if download_url :
128+ if auto_download :
129+ download_and_update (download_url )
130+ else :
131+ print ("\n Download the update?" )
132+ answer = input ("Enter the choice: " ).lower ()
133+ if answer in ["y" , "yes" , "д" , "да" ]:
134+ download_and_update (download_url )
135+ else :
136+ clear ()
137+ open_powersetsetup ()
138+ else :
139+ print ("ERROR: Error code: 1x1013" )
140+ open_powersetsetup ()
141+ else :
142+ print ("🖥️ = 🌐 ✅" )
143+ sleep (2 )
144+ open_powersetsetup ()
145+
146+ except Exception as e :
147+ print (f"❌ ERROR: { e } " )
148+ os .system ("pause" )
149+
150+ def open_powersetsetup ():
151+ try :
152+ base_path = os .path .dirname (sys .executable )
153+ exe_path = os .path .join (base_path , "PowerSetSetup.exe" )
154+ subprocess .Popen ([exe_path ], creationflags = subprocess .CREATE_NEW_CONSOLE )
155+ sys .exit (0 )
156+ except Exception as e :
157+ clear ()
158+ logging .error ("Error start PowerSetSetup" )
159+ print ("ERROR: Error start" )
160+ sys .exit (2 )
161+
162+ def download_and_update (url : str ):
163+ try :
164+ temp_dir = os .path .join (tempfile .gettempdir (), "PowerSetSetup_temp_update" )
165+ os .makedirs (temp_dir , exist_ok = True )
166+
167+ filename = url .split ('/' )[- 1 ]
168+ save_path = os .path .join (temp_dir , filename )
169+
170+ print (f"\n Install in { save_path } ..." )
171+ response = requests .get (url , stream = True )
172+ response .raise_for_status ()
173+ total_size = int (response .headers .get ('content-length' , 0 ))
174+ block_size = 8192
175+ downloaded = 0
176+ print ()
177+ with open (save_path , 'wb' ) as file :
178+ for chunk in response .iter_content (chunk_size = block_size ):
179+ file .write (chunk )
180+ downloaded += len (chunk )
181+ if total_size > 0 :
182+ percent = downloaded / total_size * 100
183+ print (f"\r 💾: { percent :.1f} %" , end = '' )
184+ print ("\n 💾👍 = ✅" )
185+
186+ script_dir = os .path .dirname (sys .argv [0 ])
187+ update_exe = os .path .join (script_dir , "update.exe" )
188+
189+ sleep (2 )
190+ if os .path .isfile (update_exe ):
191+ print (f"\n Start { update_exe } ...\n \n \n " )
192+ subprocess .Popen ([update_exe , temp_dir ])
193+ sys .exit (0 )
194+ else :
195+ print (f"ERROR: File { update_exe } not found. Please run the installer manually from the folder { temp_dir } ." )
196+ sleep (2 )
197+ except Exception as e :
198+ print (f"ERROR: Error code 0x0000: { e } " )
199+ sleep (2 )
200+
201+ def main ():
202+ print ("=== Update Check ===" )
203+ check_for_updates ()
204+ sleep (2 )
205+
206+ if __name__ == "__main__" :
207+ main ()
0 commit comments