Files
Horizon-OC/Source/Configurator/src/installer.py
souldbminersmwc fadaf47001 add configurator
2025-09-27 14:41:46 -04:00

174 lines
6.1 KiB
Python

"""
HOC Configurator
Copyright (C) Souldbminer
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
import dearpygui.dearpygui as dpg
import psutil
import os
import common as c
import urllib.request
import zipfile
import kip as k
from defaults import d
def autosave_toggle(sender, app_data):
d.autosave=app_data
print(f"Autosave toggled to {d.autosave}")
def get_drives():
drives = []
for part in psutil.disk_partitions(all=False):
drives.append(part.device)
return drives
# Change if you plan to fork
kip_download_link="https://github.com/souldbminersmwc/Horizon-OC/releases/latest/download/loader.kip"
hoc_clk_download_link="https://github.com/souldbminersmwc/Horizon-OC/releases/latest/download/hoc-clk.zip"
ams_download_link=""
def download_and_extract_zip(c, download_url, zip_filename="temp.zip", success_message="Installed file!"):
"""
Downloads a zip file from the given URL, extracts it to the selected drive,
and cleans up the zip afterwards.
Args:
c: Context object with attributes:
- drive (str): Installation path.
- show_popup (callable): Function to show popup messages.
download_url (str): The URL of the zip file.
zip_filename (str, optional): Name for the downloaded zip file. Defaults to "temp.zip".
success_message (str, optional): Success popup message. Defaults to "Installed hoc-clk!".
"""
if not c.drive or c.drive == "0" or c.drive == 0:
c.show_popup(title="Error", content="Please select an installation drive first!")
return False
zip_path = os.path.join(c.drive, zip_filename)
try:
print(f"Downloading {zip_filename} to {c.drive} ...")
urllib.request.urlretrieve(download_url, zip_path)
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(c.drive)
c.show_popup(title="Success", content=success_message)
return True
except Exception as e:
c.show_popup(title="Error", content=f"Download failed:\n{e}")
return False
finally:
if os.path.exists(zip_path):
os.remove(zip_path)
def downloadLoader(): # This has to be different as it extracts to a custom location and downloads a FILE, not a zip
print("Downloading HOC.kip...")
if c.drive==0:
print("Drive not selected!")
c.show_popup(title="Error:", content="Please select a installation c.drive first!")
else:
try:
directory_make = c.drive + "atmosphere/kips/"
urllib.request.urlretrieve(kip_download_link, directory_make + "hoc.kip")
except Exception as e:
c.show_popup(title="Error", content=f"Download failed:\n{e}")
finally:
c.show_popup(title="Info:", content="Downloaded kip!")
drive_list = get_drives()
def check_atmosphere(sender, app_data, user_data):
c.drive = app_data
atmosphere_path = os.path.join(c.drive, "atmosphere")
package3_path = os.path.join(atmosphere_path, "package3")
if os.path.isfile(f"{atmosphere_path}/kips/hoc.kip"):
dpg.set_value("status_text", "Horizon OC Install Found!")
k.kip_file_path = f"{atmosphere_path}/kips/hoc.kip"
k.read_kip(c.drive + "atmosphere/kips/hoc.kip")
print(f"Reading kip from drive {c.drive}")
k.load_all_vars()
elif os.path.isdir(atmosphere_path) and os.path.isfile(package3_path):
dpg.set_value("status_text", "Atmosphere install found!")
else:
dpg.set_value("status_text", "Atmosphere not found!")
def download_and_install(download_url, install_path, c=None,
filename=None, success_message="Download complete!"):
"""
Downloads a file from the given URL, optionally extracts if it's a zip,
and deletes the temporary zip afterwards if extracted.
Args:
download_url (str): The URL of the file.
install_path (str): Directory where the file will be saved or extracted.
c (object, optional): Context object with show_popup(title, content). If given, used for popups.
filename (str, optional): Name for the downloaded file. Defaults to inferred name from URL.
success_message (str, optional): Message shown on success.
"""
def show_popup(title, content):
if c and hasattr(c, "show_popup"):
c.show_popup(title=title, content=content)
else:
print(f"[{title}] {content}")
if not install_path or not os.path.isdir(install_path):
msg = f"Invalid installation path: {install_path}"
show_popup("Error", msg)
return False
# Infer filename if not provided
if not filename:
filename = os.path.basename(download_url) or "downloaded_file"
file_path = os.path.join(install_path, filename)
try:
print(f"Downloading {filename} to {install_path} ...")
urllib.request.urlretrieve(download_url, file_path)
if filename.lower().endswith(".zip"):
try:
with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall(install_path)
show_popup("Success", success_message)
return True
except zipfile.BadZipFile:
msg = f"Downloaded file '{filename}' is not a valid archive."
show_popup("Error", msg)
return False
finally:
if os.path.exists(file_path):
os.remove(file_path)
else:
# Non-zip file: just keep it
show_popup("Success", success_message)
return True
except Exception as e:
msg = f"Download failed: {e}"
show_popup("Error", msg)
return False