4 Commits

Author SHA1 Message Date
dependabot[bot]
1ad1f536de Bump urllib3 from 2.1.0 to 2.2.2 (#3)
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.1.0 to 2.2.2.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.1.0...2.2.2)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 01:35:25 +07:00
89f56be8b2 Proper variable names
Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com>
2024-06-19 01:30:33 +07:00
2b14be3832 Update README.md
Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com>
2024-06-17 19:14:03 +07:00
6330a0dfa8 Update
* Implemented show_progress_bar and update_progress_bar to interact with progress bars
* Added 3 progress bars to second window
* Imports little optimization

Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com>
2024-06-17 08:26:19 +07:00
7 changed files with 75 additions and 73 deletions

View File

@@ -8,7 +8,7 @@
Features: Features:
1. Decrypt file, if save file crypted 1. Decrypt file, if save file crypted
2. Check for DLC to the save file (available DLC listed at [DLC_TABLE.md](https://github.com/JDM170/SaveWizard/blob/dev/DLC_TABLE.md)) 2. Check for DLC to the save file (available DLC listed at [DLC_TABLE.md](https://github.com/JDM170/SaveWizard/blob/configs/DLC_TABLE.md))
3. Edit money, experience and loan limit 3. Edit money, experience and loan limit
4. Edit skills 4. Edit skills
5. Visit cities, unlock garages, dealers and agencies 5. Visit cities, unlock garages, dealers and agencies

View File

@@ -1,7 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QResizeEvent, QCloseEvent, QClipboard from PyQt5.QtGui import QResizeEvent, QCloseEvent, QClipboard
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QApplication from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QApplication
from ast import literal_eval from ast import literal_eval

View File

@@ -5,7 +5,7 @@ from ast import literal_eval
from ctypes import CDLL from ctypes import CDLL
from os import getcwd, remove from os import getcwd, remove
from PyQt5.QtCore import Qt, QRegExp from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator from PyQt5.QtGui import QRegExpValidator
from PyQt5.QtWidgets import QDialog, QFileDialog from PyQt5.QtWidgets import QDialog, QFileDialog

View File

@@ -4,8 +4,6 @@
import os import os
from ast import literal_eval from ast import literal_eval
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QProgressDialog, QApplication
from requests import get from requests import get
from dataIO import dataIO from dataIO import dataIO
@@ -56,10 +54,7 @@ def update_configs():
update_list = check_remote_hashes() update_list = check_remote_hashes()
if not update_list or len(update_list) == 0: if not update_list or len(update_list) == 0:
return return
progress = QProgressDialog("Downloading configs...", None, 0, len(update_list), flags=Qt.Window | Qt.WindowTitleHint) progress_bar = util.show_progress_bar("Download progress", "Downloading configs...", len(update_list))
progress.setWindowTitle("Download progress")
progress.setWindowModality(Qt.WindowModal)
progress.show()
for cfg in update_list: for cfg in update_list:
check_path(cfg) check_path(cfg)
response_status, response = get_response_result(github_link + cfg) response_status, response = get_response_result(github_link + cfg)
@@ -67,7 +62,5 @@ def update_configs():
remote_cfg = literal_eval(response.text) remote_cfg = literal_eval(response.text)
if dataIO.is_valid_json(cfg) or os.path.exists(cfg): if dataIO.is_valid_json(cfg) or os.path.exists(cfg):
dataIO.save_json(cfg, remote_cfg) dataIO.save_json(cfg, remote_cfg)
progress.setValue(progress.value()+1) util.update_progress_bar(progress_bar)
QApplication.processEvents() util.update_progress_bar(progress_bar, len(update_list))
progress.setValue(len(update_list))
QApplication.processEvents()

View File

@@ -1,7 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog from PyQt5.QtWidgets import QDialog
from .form import Ui_SecondWindow from .form import Ui_SecondWindow
from util import * from util import *
@@ -24,10 +23,9 @@ class SecondWindow(QDialog, Ui_SecondWindow):
self.owns = owns_list # From main window self.owns = owns_list # From main window
# Checking files # Checking config files
cfg_path = "configs/{}".format(selected_game) cfg_path = "configs/{}".format(selected_game)
dealers_path = "{}/dealers.json".format(cfg_path) dealers_path = "{}/dealers.json".format(cfg_path)
agencies_path = "{}/agencies.json".format(cfg_path)
if dataIO.is_valid_json(dealers_path) is False: if dataIO.is_valid_json(dealers_path) is False:
self.dealers = False self.dealers = False
self.ui.dealer_edit.setEnabled(False) self.ui.dealer_edit.setEnabled(False)
@@ -39,6 +37,7 @@ class SecondWindow(QDialog, Ui_SecondWindow):
self.dealers = [] self.dealers = []
self.dealers_file = dataIO.load_json(dealers_path) self.dealers_file = dataIO.load_json(dealers_path)
agencies_path = "{}/agencies.json".format(cfg_path)
if dataIO.is_valid_json(agencies_path) is False: if dataIO.is_valid_json(agencies_path) is False:
self.agencies = False self.agencies = False
self.ui.agency_edit.setEnabled(False) self.ui.agency_edit.setEnabled(False)
@@ -54,36 +53,39 @@ class SecondWindow(QDialog, Ui_SecondWindow):
self.ui.garage_size.addItem("Medium") self.ui.garage_size.addItem("Medium")
self.ui.garage_size.addItem("Big") self.ui.garage_size.addItem("Big")
# Dealers and agencies properties for 'ADD' button self.da_statics = {
self.add_da_dict = { "dealer": [
self.ui.dealer_add: [ self.dealers, # city_list
self.ui.dealer_edit, "unlocked_dealers:", # line_to_search
"unlocked_dealers:", self.check_dealers, # check_func
self.dealers,
"Dealership",
self.check_dealers
], ],
self.ui.agency_add: [ "agency": [
self.ui.agency_edit, self.agencies, # city_list
"unlocked_recruitments:", "unlocked_recruitments:", # line_to_search
self.agencies, self.check_agencies, # check_func
"Recruitment agency",
self.check_agencies
], ],
} }
# Dealers and agencies properties for 'ADD ALL' button
self.add_all_da_dict = { self.add_da_handlers = {
self.ui.dealer_add: [
"dealer",
self.ui.dealer_edit, # city_to_add
"Dealership", # message_variable
],
self.ui.dealer_add_all: [ self.ui.dealer_add_all: [
self.dealers, "dealer",
"unlocked_dealers:", "All dealerships unlocked.", # success_message
"All dealerships unlocked.", "Visiting dealers", # progress_message
self.check_dealers ],
self.ui.agency_add: [
"agency",
self.ui.agency_edit, # city_to_add
"Recruitment agency", # message_variable
], ],
self.ui.agency_add_all: [ self.ui.agency_add_all: [
self.agencies, "agency",
"unlocked_recruitments:", "All recruitment agencies unlocked.", # success_message
"All recruitment agencies unlocked.", "Visiting agencies", # progress_message
self.check_agencies
], ],
} }
@@ -96,14 +98,13 @@ class SecondWindow(QDialog, Ui_SecondWindow):
self.ui.city_add_all.clicked.connect(self.add_all_cities) self.ui.city_add_all.clicked.connect(self.add_all_cities)
self.ui.dealer_add.clicked.connect(self.add_da_clicked) self.ui.dealer_add.clicked.connect(self.add_da_clicked)
self.ui.agency_add.clicked.connect(self.add_da_clicked) self.ui.agency_add.clicked.connect(self.add_da_clicked)
# self.ui.dealer_add_all.clicked.connect(self.add_all_dealers)
# self.ui.agency_add_all.clicked.connect(self.add_all_agencies)
self.ui.dealer_add_all.clicked.connect(self.add_all_da_clicked) self.ui.dealer_add_all.clicked.connect(self.add_all_da_clicked)
self.ui.agency_add_all.clicked.connect(self.add_all_da_clicked) self.ui.agency_add_all.clicked.connect(self.add_all_da_clicked)
if self.owns: if self.owns:
self.fill_list(self.owns, self.dealers, self.dealers_file) self.fill_list(self.owns, self.dealers, self.dealers_file)
self.fill_list(self.owns, self.agencies, self.agencies_file) self.fill_list(self.owns, self.agencies, self.agencies_file)
# Checking save-file # Checking save-file
self.check_cities() self.check_cities()
self.check_dealers() self.check_dealers()
@@ -146,8 +147,8 @@ class SecondWindow(QDialog, Ui_SecondWindow):
array.append(value) array.append(value)
def check_garage_size(self): def check_garage_size(self):
stat = garages_stat[self.ui.garage_size.currentText()] status_id, size = garages_stat[self.ui.garage_size.currentText()]
return str(stat[0]), stat[1] return str(status_id), size
def check_garages(self): def check_garages(self):
self.ui.garages_text.clear() self.ui.garages_text.clear()
@@ -225,11 +226,14 @@ class SecondWindow(QDialog, Ui_SecondWindow):
QMessageBox.critical(self, "Error", "You've already visited \"{}\".".format(city)) QMessageBox.critical(self, "Error", "You've already visited \"{}\".".format(city))
def add_all_cities(self): def add_all_cities(self):
all_cities = self.all_cities()
visited_cities = util.get_array_items(util.search_line("visited_cities:")) visited_cities = util.get_array_items(util.search_line("visited_cities:"))
for city in self.all_cities(): progress = util.show_progress_bar("Visiting cities", "Visiting cities...", len(all_cities)-len(visited_cities))
for city in all_cities:
if city not in visited_cities: if city not in visited_cities:
util.add_array_value(util.search_line("visited_cities:"), city) util.add_array_value(util.search_line("visited_cities:"), city)
util.add_array_value(util.search_line("visited_cities_count:"), "1") util.add_array_value(util.search_line("visited_cities_count:"), "1")
util.update_progress_bar(progress)
QMessageBox.information(self, "Success", "All cities successfully visited.") QMessageBox.information(self, "Success", "All cities successfully visited.")
self.check_cities() self.check_cities()
@@ -243,15 +247,6 @@ class SecondWindow(QDialog, Ui_SecondWindow):
self.ui.dealerships_text.append(dealer) self.ui.dealerships_text.append(dealer)
self.ui.dealerships_text.scrollToAnchor(visited_dealers[0]) self.ui.dealerships_text.scrollToAnchor(visited_dealers[0])
# def add_all_dealers(self):
# all_cities = self.all_cities()
# visited_dealers = util.get_array_items(util.search_line("unlocked_dealers:"))
# for dealer in self.dealers:
# if dealer in all_cities and dealer not in visited_dealers:
# util.add_array_value(util.search_line("unlocked_dealers:"), dealer)
# QMessageBox.information(self, "Success", "All dealerships unlocked.")
# self.check_dealers()
def check_agencies(self): def check_agencies(self):
self.ui.agencies_text.clear() self.ui.agencies_text.clear()
visited_agencies = util.get_array_items(util.search_line("unlocked_recruitments:")) visited_agencies = util.get_array_items(util.search_line("unlocked_recruitments:"))
@@ -262,25 +257,17 @@ class SecondWindow(QDialog, Ui_SecondWindow):
self.ui.agencies_text.append(agency) self.ui.agencies_text.append(agency)
self.ui.agencies_text.scrollToAnchor(visited_agencies[0]) self.ui.agencies_text.scrollToAnchor(visited_agencies[0])
# def add_all_agencies(self):
# all_cities = self.all_cities()
# visited_agencies = util.get_array_items(util.search_line("unlocked_recruitments:"))
# for agency in self.agencies:
# if agency in all_cities and agency not in visited_agencies:
# util.add_array_value(util.search_line("unlocked_recruitments:"), agency)
# QMessageBox.information(self, "Success", "All recruitment agencies unlocked.")
# self.check_agencies()
def add_da_clicked(self): def add_da_clicked(self):
da_arr = self.add_da_dict.get(self.sender()) da_arr = self.add_da_handlers.get(self.sender())
if da_arr is None: if da_arr is None:
return return
edit, line_to_search, city_list, message_variable, check_func = da_arr static_key, city_to_add, message_variable = da_arr
city_element = edit.text().lower() city_list, line_to_search, check_func = self.da_statics.get(static_key)
city_element = city_to_add.text().lower()
if not city_element: if not city_element:
QMessageBox.critical(self, "Error", "Enter city name!") QMessageBox.critical(self, "Error", "Enter city name!")
return return
edit.setText("") city_to_add.setText("")
if city_element not in city_list: if city_element not in city_list:
QMessageBox.critical(self, "Error", "There is no {} in that city.".format(message_variable.lower())) QMessageBox.critical(self, "Error", "There is no {} in that city.".format(message_variable.lower()))
elif city_element in util.get_array_items(util.search_line(line_to_search)): elif city_element in util.get_array_items(util.search_line(line_to_search)):
@@ -293,15 +280,18 @@ class SecondWindow(QDialog, Ui_SecondWindow):
check_func() check_func()
def add_all_da_clicked(self): def add_all_da_clicked(self):
da_arr = self.add_all_da_dict.get(self.sender()) da_arr = self.add_da_handlers.get(self.sender())
if da_arr is None: if da_arr is None:
return return
city_list, line_to_search, success_message, check_func = da_arr static_key, success_message, progress_message = da_arr
city_list, line_to_search, check_func = self.da_statics.get(static_key)
all_cities = self.all_cities() all_cities = self.all_cities()
array_line = util.search_line(line_to_search) array_line = util.search_line(line_to_search)
visited = util.get_array_items(array_line) visited_cities = util.get_array_items(array_line)
progress = util.show_progress_bar(progress_message, progress_message+"...", len(all_cities)-len(visited_cities))
for element in city_list: for element in city_list:
if (element in all_cities) and (element not in visited): if (element in all_cities) and (element not in visited_cities):
util.add_array_value(array_line, element) util.add_array_value(array_line, element)
util.update_progress_bar(progress)
QMessageBox.information(self, "Success", success_message) QMessageBox.information(self, "Success", success_message)
check_func() check_func()

View File

@@ -14,4 +14,4 @@ PyQt5-Qt5==5.15.2
PyQt5-sip==12.13.0 PyQt5-sip==12.13.0
pywin32-ctypes==0.2.2 pywin32-ctypes==0.2.2
requests==2.32.0 requests==2.32.0
urllib3==2.1.0 urllib3==2.2.2

22
util.py
View File

@@ -4,7 +4,10 @@
from os.path import isfile from os.path import isfile
from re import search, match from re import search, match
# from re import search, match, sub # from re import search, match, sub
from PyQt5.QtWidgets import QMessageBox from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QMessageBox, QProgressDialog, QApplication
)
from hashlib import md5 from hashlib import md5
from statics import hash_chunk_size from statics import hash_chunk_size
@@ -32,6 +35,23 @@ class CustomFuncs:
hash_md5.update(chunk) hash_md5.update(chunk)
return hash_md5.hexdigest() return hash_md5.hexdigest()
@staticmethod
def show_progress_bar(title, text, length):
if (not title) or (not text) or (not length) or (length <= 0):
return
progress_bar = QProgressDialog(text, None, 0, length, flags=Qt.Window | Qt.WindowTitleHint)
progress_bar.setWindowTitle(title)
progress_bar.setWindowModality(Qt.WindowModal)
progress_bar.show()
return progress_bar
@staticmethod
def update_progress_bar(progress_bar, value=1):
if not progress_bar:
return
progress_bar.setValue(progress_bar.value() + value)
QApplication.processEvents()
# Stock functions # Stock functions
def search_line(self, term, start=0, cancel=r"this_string_must_not_exist"): def search_line(self, term, start=0, cancel=r"this_string_must_not_exist"):
if search(term, self.lines[start]): if search(term, self.lines[start]):