mirror of
https://github.com/leminlimez/Nugget.git
synced 2025-04-08 04:23:05 +08:00
add check and dialog when update is available
This commit is contained in:
40
controllers/web_request_handler.py
Normal file
40
controllers/web_request_handler.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from requests import get, RequestException
|
||||||
|
from json import JSONDecodeError
|
||||||
|
from devicemanagement.constants import Version
|
||||||
|
|
||||||
|
Nugget_Repo_URL = "https://api.github.com/repos/leminlimez/Nugget/releases/latest"
|
||||||
|
|
||||||
|
last_fetched_version: str = None
|
||||||
|
|
||||||
|
def is_update_available(version: str, build: int) -> bool:
|
||||||
|
# check github for if version < tag (or == tag but build > 0)
|
||||||
|
latest_version = get_latest_version()
|
||||||
|
if latest_version != None:
|
||||||
|
if build > 0 and latest_version == version: # on beta version when there is a public release
|
||||||
|
return True
|
||||||
|
elif Version(latest_version) > Version(version):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_latest_version() -> str:
|
||||||
|
global last_fetched_version
|
||||||
|
# get the cached version
|
||||||
|
if last_fetched_version != None:
|
||||||
|
return last_fetched_version
|
||||||
|
# fetch with web requests
|
||||||
|
try:
|
||||||
|
response = get(Nugget_Repo_URL)
|
||||||
|
response.raise_for_status() # To raise an exception for 4xx/5xx responses
|
||||||
|
|
||||||
|
data = response.json() # Parse the JSON response
|
||||||
|
|
||||||
|
# Check if "tag_name" exists in the response and compare the version
|
||||||
|
tag_name = data.get("tag_name")
|
||||||
|
if tag_name:
|
||||||
|
last_fetched_version = tag_name.replace("v", "") # Remove 'v' from tag_name
|
||||||
|
return last_fetched_version
|
||||||
|
except RequestException as e:
|
||||||
|
print(f"Error fetching data: {e}")
|
||||||
|
except JSONDecodeError as e:
|
||||||
|
print(f"Error parsing JSON: {e}")
|
||||||
|
return None
|
||||||
68
gui/dialogs.py
Normal file
68
gui/dialogs.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
from PySide6.QtWidgets import QDialog, QDialogButtonBox, QLabel, QVBoxLayout
|
||||||
|
from PySide6.QtGui import QFont
|
||||||
|
|
||||||
|
from webbrowser import open_new_tab
|
||||||
|
|
||||||
|
from controllers.web_request_handler import Nugget_Repo_URL, get_latest_version
|
||||||
|
|
||||||
|
class GestaltDialog(QDialog):
|
||||||
|
def __init__(self, device_manager, gestalt_label, selected_file, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.device_manager = device_manager
|
||||||
|
self.gestalt_label = gestalt_label
|
||||||
|
self.selected_file = selected_file
|
||||||
|
|
||||||
|
QBtn = (
|
||||||
|
QDialogButtonBox.Ok | QDialogButtonBox.Cancel
|
||||||
|
)
|
||||||
|
|
||||||
|
self.buttonBox = QDialogButtonBox(QBtn)
|
||||||
|
self.buttonBox.accepted.connect(self.accept)
|
||||||
|
self.buttonBox.rejected.connect(self.reject)
|
||||||
|
|
||||||
|
layout = QVBoxLayout()
|
||||||
|
message = QLabel("The gestalt file looks like it was made for a different device.\nAre you sure you want to use this one?")
|
||||||
|
layout.addWidget(message)
|
||||||
|
layout.addWidget(self.buttonBox)
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
self.device_manager.data_singleton.gestalt_path = self.selected_file
|
||||||
|
self.gestalt_label.setText(self.selected_file)
|
||||||
|
super().accept()
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateAppDialog(QDialog):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super.__init__(parent)
|
||||||
|
|
||||||
|
QBtn = (
|
||||||
|
QDialogButtonBox.Ok | QDialogButtonBox.Cancel
|
||||||
|
)
|
||||||
|
|
||||||
|
self.buttonBox = QDialogButtonBox(QBtn)
|
||||||
|
self.buttonBox.accepted.connect(self.accept)
|
||||||
|
self.buttonBox.rejected.connect(self.reject)
|
||||||
|
|
||||||
|
layout = QVBoxLayout()
|
||||||
|
title = QLabel("Update Available")
|
||||||
|
title_font = QFont()
|
||||||
|
title_font.setBold(True)
|
||||||
|
title.setFont(title_font)
|
||||||
|
|
||||||
|
message_text = ""
|
||||||
|
latest_version = get_latest_version()
|
||||||
|
if latest_version != None:
|
||||||
|
message_text += f"Nugget v{latest_version} is available. "
|
||||||
|
message_text += "Would you like to go to the download on GitHub?"
|
||||||
|
message = QLabel(message_text)
|
||||||
|
|
||||||
|
layout.addWidget(title)
|
||||||
|
layout.addWidget(message)
|
||||||
|
layout.addWidget(self.buttonBox)
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
# open up the repo page
|
||||||
|
open_new_tab(Nugget_Repo_URL)
|
||||||
|
super().accept()
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
from PySide6.QtWidgets import QDialog, QDialogButtonBox, QLabel, QVBoxLayout
|
|
||||||
|
|
||||||
class GestaltDialog(QDialog):
|
|
||||||
def __init__(self, device_manager, gestalt_label, selected_file, parent=None):
|
|
||||||
super().__init__(parent)
|
|
||||||
self.device_manager = device_manager
|
|
||||||
self.gestalt_label = gestalt_label
|
|
||||||
self.selected_file = selected_file
|
|
||||||
|
|
||||||
QBtn = (
|
|
||||||
QDialogButtonBox.Ok | QDialogButtonBox.Cancel
|
|
||||||
)
|
|
||||||
|
|
||||||
self.buttonBox = QDialogButtonBox(QBtn)
|
|
||||||
self.buttonBox.accepted.connect(self.accept)
|
|
||||||
self.buttonBox.rejected.connect(self.reject)
|
|
||||||
|
|
||||||
layout = QVBoxLayout()
|
|
||||||
message = QLabel("The gestalt file looks like it was made for a different device.\nAre you sure you want to use this one?")
|
|
||||||
layout.addWidget(message)
|
|
||||||
layout.addWidget(self.buttonBox)
|
|
||||||
self.setLayout(layout)
|
|
||||||
|
|
||||||
def accept(self):
|
|
||||||
self.device_manager.data_singleton.gestalt_path = self.selected_file
|
|
||||||
self.gestalt_label.setText(self.selected_file)
|
|
||||||
super().accept()
|
|
||||||
@@ -7,10 +7,12 @@ from pymobiledevice3.lockdown import create_using_usbmux
|
|||||||
|
|
||||||
from qt.ui_mainwindow import Ui_Nugget
|
from qt.ui_mainwindow import Ui_Nugget
|
||||||
|
|
||||||
|
from controllers.web_request_handler import is_update_available
|
||||||
|
|
||||||
from devicemanagement.constants import Version
|
from devicemanagement.constants import Version
|
||||||
from devicemanagement.device_manager import DeviceManager
|
from devicemanagement.device_manager import DeviceManager
|
||||||
|
|
||||||
from gui.gestalt_dialog import GestaltDialog
|
from gui.dialogs import GestaltDialog, UpdateAppDialog
|
||||||
|
|
||||||
from tweaks.tweaks import tweaks
|
from tweaks.tweaks import tweaks
|
||||||
from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks, ValueTypeStrings
|
from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks, ValueTypeStrings
|
||||||
@@ -39,6 +41,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||||||
self.show_uuid = False
|
self.show_uuid = False
|
||||||
self.loadSettings()
|
self.loadSettings()
|
||||||
|
|
||||||
|
# Check for an update
|
||||||
|
if is_update_available(App_Version, App_Build):
|
||||||
|
# notify with prompt to download the new version from github
|
||||||
|
UpdateAppDialog()
|
||||||
# Update the app version/build number label
|
# Update the app version/build number label
|
||||||
self.updateAppVersionLabel()
|
self.updateAppVersionLabel()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user