From 2ec55e103583abfeab37b141ab32a490b960e83b Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sat, 6 Sep 2025 19:07:26 -0500 Subject: [PATCH] first commit --- .gitignore | 8 + Collection Code Frontend.code-workspace | 11 + MainGui.py | 552 ++++++++++++++++++++++++ cloud_backend.py | 168 ++++++++ database.sqlite | Bin 0 -> 167936 bytes easySQL.py | 279 ++++++++++++ export_process.py | 209 +++++++++ helper_functions.py | 9 + icons.py | 37 ++ icons/16x16/export20.png | Bin 0 -> 401 bytes icons/16x16/import.png | Bin 0 -> 325 bytes icons/16x16/import20.png | Bin 0 -> 420 bytes icons/accept.png | Bin 0 -> 2072 bytes icons/cancel.png | Bin 0 -> 20386 bytes icons/caution.png | Bin 0 -> 9481 bytes icons/checkbox.png | Bin 0 -> 11910 bytes icons/checked.png | Bin 0 -> 14518 bytes icons/database_bad.png | Bin 0 -> 10786 bytes icons/database_good.png | Bin 0 -> 10883 bytes icons/exit.png | Bin 0 -> 6343 bytes icons/export.png | Bin 0 -> 6651 bytes icons/filter.png | Bin 0 -> 13314 bytes icons/help.png | Bin 0 -> 2674 bytes icons/import.png | Bin 0 -> 7149 bytes icons/letter-a.png | Bin 0 -> 24052 bytes icons/login.png | Bin 0 -> 18505 bytes icons/open-folder.png | Bin 0 -> 9513 bytes icons/refresh.png | Bin 0 -> 21534 bytes icons/settings.png | Bin 0 -> 25621 bytes icons/upload.png | Bin 0 -> 11529 bytes icons/window_icon.png | Bin 0 -> 28886 bytes import_process.py | 205 +++++++++ main.py | 180 ++++++++ main.spec | 44 ++ main_old.spec | 45 ++ settings.py | 71 +++ tables.py | 54 +++ update_app.py | 34 ++ upload_process.py | 257 +++++++++++ 39 files changed, 2163 insertions(+) create mode 100644 .gitignore create mode 100644 Collection Code Frontend.code-workspace create mode 100644 MainGui.py create mode 100644 cloud_backend.py create mode 100644 database.sqlite create mode 100644 easySQL.py create mode 100644 export_process.py create mode 100644 helper_functions.py create mode 100644 icons.py create mode 100644 icons/16x16/export20.png create mode 100644 icons/16x16/import.png create mode 100644 icons/16x16/import20.png create mode 100644 icons/accept.png create mode 100644 icons/cancel.png create mode 100644 icons/caution.png create mode 100644 icons/checkbox.png create mode 100644 icons/checked.png create mode 100644 icons/database_bad.png create mode 100644 icons/database_good.png create mode 100644 icons/exit.png create mode 100644 icons/export.png create mode 100644 icons/filter.png create mode 100644 icons/help.png create mode 100644 icons/import.png create mode 100644 icons/letter-a.png create mode 100644 icons/login.png create mode 100644 icons/open-folder.png create mode 100644 icons/refresh.png create mode 100644 icons/settings.png create mode 100644 icons/upload.png create mode 100644 icons/window_icon.png create mode 100644 import_process.py create mode 100644 main.py create mode 100644 main.spec create mode 100644 main_old.spec create mode 100644 settings.py create mode 100644 tables.py create mode 100644 update_app.py create mode 100644 upload_process.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a673bdf --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +build/ +dist/ +avatars/ +log.txt +settings.json +test.json +test.py +test.txt diff --git a/Collection Code Frontend.code-workspace b/Collection Code Frontend.code-workspace new file mode 100644 index 0000000..c1a450c --- /dev/null +++ b/Collection Code Frontend.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../../../My Code/website" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/MainGui.py b/MainGui.py new file mode 100644 index 0000000..f77b37d --- /dev/null +++ b/MainGui.py @@ -0,0 +1,552 @@ +from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import (QMainWindow, QWidget, QToolBar, QAction, + QSizePolicy, QToolButton, QTreeWidget, + QListWidget, QListWidgetItem, QTreeWidgetItem, QGroupBox, QLineEdit, + QLabel, QTextEdit, QPushButton, QFileDialog, QSlider, QHBoxLayout, QVBoxLayout, QFrame, QGridLayout, QComboBox, QFontDialog, QTextBrowser) +from PyQt5.QtWidgets import QMessageBox +from PyQt5.QtGui import QIcon, QFont +from qtwidgets import Toggle +from striprtf.striprtf import rtf_to_text +from cloud_backend import LoginDialog, login, upload_file +import tempfile +import export_process, import_process, upload_process +import settings, pathlib, os, sys, icons, easySQL, tables, json, zipfile + +global status_bar +global tool_bar + +class ModificationItem(QTreeWidgetItem): + def __init__(self): + super().__init__() + self.id = 0 + +class ColectionItem(QListWidgetItem): + def __init__(self): + super().__init__() + self.id = 0 + +class MainGui(QMainWindow): + def __init__(self) -> None: + self.app_settings = settings.app_settings + super().__init__() + self.setWindowTitle(self.app_settings.get_setting('window_title')) + self.setMaximumHeight(720) + self.setMaximumWidth(1280) + self.resize(self.app_settings.get_setting('window_width'), self.app_settings.get_setting('window_height')) + self.setWindowIcon(QIcon(icons.window_icon)) + + self.widget = QWidget() + + self.tool_bar = QToolBar() + self.addToolBar(self.tool_bar) + self.tool_bar.setMovable(False) + self.tool_bar.setFixedHeight(35) + + self.exit_app = QAction("Save and exit", self) + self.exit_app.setIcon(QIcon(icons.exit_icon)) + self.exit_app.triggered.connect(self.exit_application) + self.tool_bar.addAction(self.exit_app) + + self.tool_bar.addSeparator() + + # need an import button that imports a selected pcmp from a file dialog + self.import_tool = QAction("Import PCMP File", self) + self.import_tool.setToolTip("Imports a PCMP file from system into your Penumbra installation.") + self.import_tool.setIcon(QIcon(icons.import_icon)) + self.import_tool.triggered.connect(self.import_collection) + self.tool_bar.addAction(self.import_tool) + + # need an export button that exports a selected collection in the list + self.export_tool = QAction("Export Collection to Archive", self) + self.export_tool.setToolTip("Export collection from Penumbra installation into a share-able PCMP archive") + self.export_tool.setIcon(QIcon(icons.export_icon)) + self.export_tool.setEnabled(False) + self.export_tool.triggered.connect(self.export_collection) + self.tool_bar.addAction(self.export_tool) + + # need an upload dummy button for future features + self.upload_tool = QAction("Upload Collection to the set up server.", self) + self.upload_tool.setToolTip("If a server has been configured alongside a profile on that server, you may upload the collection straight there for others to download without needing to share it.") + self.upload_tool.setIcon(QIcon(icons.upload_icon)) + self.upload_tool.setEnabled(False) + self.upload_tool.triggered.connect(self.upload_collection) + self.tool_bar.addAction(self.upload_tool) + + self.refresh_tool = QAction("Refresh", self) + self.refresh_tool.setToolTip("Refreshes the loaded data and selected collection data!") + self.refresh_tool.setIcon(QIcon(icons.refresh)) + self.refresh_tool.setEnabled(True) + self.tool_bar.addAction(self.refresh_tool) + + #add a spacer + self.spacer = QWidget() + self.spacer.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + self.tool_bar.addWidget(self.spacer) + + self.mode_label = QLabel() + self.mode_label.setText('Mode') + self.tool_bar.addWidget(self.mode_label) + + self.mode_slider = Toggle() + self.mode_slider.setToolTip('Sets the mode between basic or advanced details allowing for more manipulation of imports and exports. Only use this if you know what you are doing!') + self.mode_slider.toggled.connect(self.mode_change) + self.tool_bar.addWidget(self.mode_slider) + + + self.settings_button = QAction("Settings", self) + self.settings_button.setIcon(QIcon(icons.configure)) + self.tool_bar.addAction(self.settings_button) + self.settings_button.triggered.connect(self.change_font_size) + + self.help_button = QAction("Help", self) + self.help_button.setIcon(QIcon(icons.help_icon)) + self.tool_bar.addAction(self.help_button) + + # need a database connection indicator + self.database_indicator = QAction("Database Status", self) + self.database_indicator.setIcon(QIcon(icons.database_bad)) + self.tool_bar.addAction(self.database_indicator) + # need a sign-in/profile placard that acts as a button to change login info + self.profile_indicator = QToolButton() + self.profile_indicator.setText("Profile/Login") + self.profile_indicator.setToolTip("If a server is configured use this to attempt so sign in to a profile on that server. This profile will be used for when uploading a collection.") + self.profile_indicator.setIcon(QIcon(icons.profile)) + self.profile_indicator.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) + self.profile_indicator.clicked.connect(self.login_user) + self.tool_bar.addWidget(self.profile_indicator) + + # main vertical layout object + self.horizontal_layout = QHBoxLayout(self) + + # collection layout V + self.collection_vertical_layout = QVBoxLayout() + # self.inner_canvas.setStyleSheet("background-color: blue") + + self.collection_list = QListWidget() + self.col_frame = QFrame() + self.col_frame.setFrameStyle(QFrame.Panel) + + self.collection_list.setFixedWidth(200) + self.collection_list.setFixedHeight(300) + + self.collection_vertical_layout.addWidget(self.collection_list) + self.collection_vertical_layout.addWidget(self.col_frame) + + # Close out collection Layout V + + + self.details_vertical_layout = QVBoxLayout() + + self.details_group = QGroupBox() + self.details_group.setTitle('Collection Details') + + self.details_horizontal_layout = QHBoxLayout() + + self.horizontal_form_layout = QGridLayout() + # ---- Form Control Start ----> + self.name_label = QLabel() + self.name_label.setText("Collection Name") + self.name_edit = QLineEdit() + self.name_edit.setMaximumWidth(200) + + self.version_label = QLabel() + self.version_label.setText("Version") + self.version_edit = QLineEdit() + self.version_edit.setMaximumWidth(200) + + self.comment_label = QLabel() + self.comment_label.setText("Comments") + + self.comment_edit = QTextEdit() + self.comment_edit.setMaximumHeight(150) + self.comment_edit.setMaximumHeight(250) + + + self.horizontal_form_layout.addWidget(self.name_label, 0, 0) + self.horizontal_form_layout.addWidget(self.name_edit, 0, 1) + + self.horizontal_form_layout.addWidget(self.version_label, 1, 0) + self.horizontal_form_layout.addWidget(self.version_edit, 1, 1) + + self.horizontal_form_layout.addWidget(self.comment_label, 2, 0) + self.horizontal_form_layout.addWidget(self.comment_edit, 2, 1) + + # ---- Form Control End ----> + + self.details_group.setLayout(self.horizontal_form_layout) + self.details_group.setFixedHeight(300) + self.details_group.setMaximumWidth(500) + + + self.character_links = QGroupBox() + self.character_links.setTitle("Character Links") + self.character_links.setFixedHeight(300) + self.character_links.setFixedWidth(200) + + self.character_grid_layout = QGridLayout() + self.links_list = QListWidget() + self.character_grid_layout.addWidget(self.links_list) + + self.character_links.setLayout(self.character_grid_layout) + + self.search_horizontal_layout = QHBoxLayout() + + self.clear_filter_mods = QPushButton() + self.clear_filter_mods.setIcon(QIcon(icons.clear_filter)) + self.clear_filter_mods.setMaximumWidth(30) + self.clear_filter_mods.setMaximumHeight(30) + + self.mod_list_search = QLineEdit() + self.mod_list_search.textEdited.connect(self.filter_mods) + self.mod_list_search.setFixedHeight(30) + self.mod_list_search.setFixedWidth(200) + + self.search_horizontal_layout.addWidget(self.clear_filter_mods) + self.search_horizontal_layout.addWidget(self.mod_list_search) + + self.search_horizontal_layout.setSpacing(5) + self.search_horizontal_layout.setAlignment(Qt.AlignLeft) + + + self.mod_list = QTreeWidget() + + + self.details_horizontal_layout.addWidget(self.details_group) + self.details_horizontal_layout.addWidget(self.character_links) + + self.details_vertical_layout.addLayout(self.details_horizontal_layout) + self.details_vertical_layout.addLayout(self.search_horizontal_layout) + self.details_vertical_layout.addWidget(self.mod_list) + # ---- Details/Modlist Layout V ---- > + + self.advanced_widget_canvas = QWidget() + self.advanced_widget_canvas.setLayout(self.details_vertical_layout) + + self.horizontal_layout.addLayout(self.collection_vertical_layout) + + + self.basic_vertical_layout = QVBoxLayout() + self.basic_horizontal_layout = QHBoxLayout() + + self.basic_vertical_layout.addLayout(self.basic_horizontal_layout) + + self.basic_group = QGroupBox() + self.basic_group.setTitle("Basic Mode Instructions") + self.basic_horizontal_layout.addWidget(self.basic_group) + + self.group_layout = QGridLayout() + self.basic_group.setLayout(self.group_layout) + + self.label1 = QLabel() + #self.label1.setAcceptRichText(True) + self.label1.setText("hello World") + self.label1.setWordWrap(True) + self.label1.setMinimumWidth(400) + + + self.group_layout.addWidget(self.label1, 0, 0) + self.group_layout.setAlignment(Qt.AlignLeft) + self.group_layout.addWidget(self.name_edit, 1, 0) + + + self.basic_widget_canvas = QWidget() + self.basic_widget_canvas.setLayout(self.basic_vertical_layout) + + # this is where the if split needs to happen + + basic_mode = True + advanced_mode = False + self.horizontal_layout.addWidget(self.advanced_widget_canvas) + self.horizontal_layout.addWidget(self.basic_widget_canvas) + + + if advanced_mode: + self.basic_widget_canvas.setHidden(True) + self.advanced_widget_canvas.setHidden(False) + if basic_mode: + self.basic_widget_canvas.setHidden(False) + self.advanced_widget_canvas.setHidden(True) + + + self.widget.setLayout(self.horizontal_layout) + self.setCentralWidget(self.widget) + + self.selected_item = None + self.selected_item_meta = {} + self.selected_item_id = 0 + self.selected_item_data = {} + + def change_font_size(self, a): + (font, ok) = QFontDialog.getFont(QFont("Helvetica [Cronyx]", 10), self) + if ok: + # the user clicked OK and font is set to the font the user selected + self.setFont(font) + + def __post__init__(self): + self.collection_list.itemClicked.connect(self.populate_details) + if not settings.app_settings.get_setting("update_opt_in") or settings.app_settings.lock_client: + self.profile_indicator.setEnabled(False) + self.database_indicator.setEnabled(False) + self.repopulate_collections() + self.repopulate_modslist() + + def exit_application(self): + self.app_settings.save_settings() + sys.exit() + + def mode_change(self, a): + if a: + self.setWindowTitle(f"{self.app_settings.get_setting('window_title')} (Advanced Mode)") + self.app_settings.set_setting('advanced_mode', True) + self.basic_widget_canvas.setHidden(True) + self.advanced_widget_canvas.setHidden(False) + else: + self.setWindowTitle(f"{self.app_settings.get_setting('window_title')} (Basic Mode)") + self.app_settings.set_setting('advanced_mode', False) + self.advanced_widget_canvas.setHidden(True) + self.basic_widget_canvas.setHidden(False) + + + if not self.app_settings.get_setting('advanced_mode'): + self.version_edit.setDisabled(True) + self.comment_edit.setDisabled(True) + self.links_list.setDisabled(True) + self.mod_list_search.setDisabled(True) + self.clear_filter_mods.setDisabled(True) + + else: + self.version_edit.setDisabled(False) + self.comment_edit.setDisabled(False) + self.links_list.setDisabled(False) + self.mod_list_search.setDisabled(False) + self.clear_filter_mods.setDisabled(False) + + self.repopulate_modslist() + + def get_export_upload_payload(self) -> dict: + collection_data = easySQL.fetchone_from_table(tables.collections, filter=('collection_id', self.selected_item_id)) + collection_settings = json.loads(collection_data.settings) + + # The below process handles the repackaging payload for a collection allowing for advanced changes such + # as enabling or putting a modification on ignore. + # TODO: enabled_mods and mods_to_copy could be consolidated into a single dictionary + enabled_mods = {} + mods_to_copy = [] + count = self.mod_list.topLevelItemCount() + for index in range(count): + item = self.mod_list.topLevelItem(index) + if item.checkState(0) == 2: + modification_row = easySQL.fetchone_from_table(tables.modifications, filter=('name', item.text(0))) + mods_to_copy.append((modification_row.name, modification_row.mod_path, modification_row.total_files)) + try: + mod_settings = collection_settings[item.text(0)] + mod_settings['Enabled'] = True + enabled_mods[item.text(0)] = mod_settings + except: + pass + + payload: {str, any} = { + 'collection_json':{ + 'Version': collection_data.version, + 'Id': collection_data.uuid, + 'Name': self.name_edit.text(), + 'Settings': enabled_mods, + 'Inheritance': [] + }, + 'character_links': json.loads(collection_data.character_links), + 'meta_data': { + "collection_name": self.name_edit.text(), + "collection_uuid": collection_data.uuid, + "version": self.version_edit.text(), + "comments": self.comment_edit.toPlainText() + }, + 'mods_to_copy': mods_to_copy + } + + return payload + + def upload_collection(self): + payload = self.get_export_upload_payload() + + progress_dialog = upload_process.UploadProgressDialog(self, payload) + progress_dialog.start_upload() + + def export_collection(self): + + payload = self.get_export_upload_payload() + dialog = QFileDialog(self) + dialog.setFileMode(QFileDialog.DirectoryOnly) + if dialog.exec_(): + save_directory = dialog.selectedFiles()[0] + payload['save_directory'] = save_directory + + # todo: remove this + with open('test.json', 'w+') as file: + json.dump(payload, file, indent=2) + + progress_dialog = export_process.ExportProgressDialog(self, payload) + progress_dialog.start_exportation() + + def import_collection(self): + dialog = QFileDialog(self) + dialog.setFileMode(QFileDialog.AnyFile) + dialog.setNameFilter("Archive (*.pcmp)") + if dialog.exec_(): + path_to_zip = pathlib.Path(dialog.selectedFiles()[0]) + print(path_to_zip) # do some validation on the path + + + + with zipfile.ZipFile(path_to_zip) as collection_pcmp: + + + collection_uuid = '' + + with collection_pcmp.open("meta.json") as _file: + meta = json.load(_file) + collection_uuid = meta["collection_uuid"] + + with collection_pcmp.open(f"{collection_uuid}.json") as _file: + collection_data = json.load(_file) + + if collection_uuid in [row.uuid for row in easySQL.fetchall_from_table(tables.collections)]: + warning_dialog = QMessageBox(self) + warning_dialog.setWindowTitle('Collection already exists...') + warning_dialog.setText(f"It appears that this collection already exists, would you like to overwrite it?") + warning_dialog.setIcon(QMessageBox.Question) + warning_dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + button = warning_dialog.exec() + + if button == QMessageBox.No: + return + + + payload = { + 'collection_json': collection_data, + 'meta_data': meta, + 'path_to_zip': path_to_zip, + 'mods_to_copy': [key for key in collection_data['Settings'].keys()] + } + + + print(payload) + self.progress_dialog = import_process.ImportProgressDialog(self, payload) + self.progress_dialog.import_collection() + + def login_user(self): + + dialog = LoginDialog(self) + if dialog.exec_(): + self.app_settings.user_data = dialog.user_data + self.app_settings.connected = True + self.profile_indicator.setIcon(QIcon(settings.app_settings.user_data['avatar'])) + self.profile_indicator.setText(settings.app_settings.username) + self.database_indicator.setIcon(QIcon(icons.database_good)) + + def filter_mods(self): + filter = self.mod_list_search.text() + count = self.mod_list.topLevelItemCount() + for index in range(count): + item = self.mod_list.topLevelItem(index) + present_filter = [mod_name.strip() for mod_name in json.loads(self.selected_item_data.settings).keys()] + if filter in item.text(0) and item.text(0) in present_filter: + item.setHidden(False) + else: + item.setHidden(True) + + def repopulate_modslist(self, enabled: list = [], present: list = []): + self.mod_list.clear() + self.mod_list.setHeaderLabel('Modification Name') + self.mod_list.setAlternatingRowColors(True) + + list = easySQL.fetchall_from_table(tables.modifications) + for d, row in enumerate(list): + + item = ModificationItem() + item.setText(0, row.name) + + if row.name in enabled: + item.setCheckState(0, 2) + else: + item.setCheckState(0, 0) + + item.id = row.mod_id + self.mod_list.addTopLevelItem(item) + + if row.name in present or len(present)==0: + item.setHidden(False) + item.setDisabled(False) + else: + item.setHidden(True) + item.setDisabled(True) + + if not self.app_settings.get_setting('advanced_mode'): + item.setDisabled(True) + + def repopulate_collections(self): + self.collection_list.clear() + self.collection_list.setAlternatingRowColors(True) + + list = [(row.collection_id, row.name) for row in easySQL.fetchall_from_table(tables.collections)] + for id, name in list: + item = ColectionItem() + item.setText(name) + item.id = id + item.setToolTip(f"{id}") + self.collection_list.addItem(item) + + def repopulate_character_links(self): + self.links_list.clear() + links = json.loads(self.selected_item_data.character_links) + + if links['Default']: + item = QListWidgetItem() + item.setText("Default") + item.setCheckState(2) + self.links_list.addItem(item) + if links["Yourself"]: + item = QListWidgetItem() + item.setText("Yourself") + item.setCheckState(2) + self.links_list.addItem(item) + if len(links["Individuals"]) > 0: + for link in links["Individuals"]: + item = QListWidgetItem() + item.setText(link["Display"]) + item.setCheckState(2) + self.links_list.addItem(item) + + def populate_details(self, item): + + self.export_tool.setEnabled(True) + if self.app_settings.connected: + self.upload_tool.setEnabled(True) + else: + self.upload_tool.setEnabled(False) + self.selected_item_id = item.id + self.selected_item = item + self.selected_item_data = easySQL.fetchone_from_table(tables.collections, filter=("collection_id", item.id)) + self.selected_item_meta = easySQL.fetchone_from_table(tables.metadata, filter=("collection_name", self.selected_item_data.name)) + settings_filter = [mod_name.strip() for mod_name, settings in json.loads(self.selected_item_data.settings).items() if settings['Enabled']] + present_filter = [mod_name.strip() for mod_name in json.loads(self.selected_item_data.settings).keys()] + self.repopulate_modslist(enabled=settings_filter, present=present_filter) + self.repopulate_character_links() + self.name_edit.setText(self.selected_item_data.name) + self.version_edit.setText(self.selected_item_meta.version) + self.comment_edit.setPlainText(self.selected_item_meta.comments) + + if not self.app_settings.get_setting('advanced_mode'): + self.version_edit.setDisabled(True) + self.comment_edit.setDisabled(True) + self.links_list.setDisabled(True) + self.mod_list_search.setDisabled(True) + self.clear_filter_mods.setDisabled(True) + self.mod_list.setDisabled(True) + else: + self.version_edit.setDisabled(False) + self.comment_edit.setDisabled(False) + self.links_list.setDisabled(False) + self.mod_list_search.setDisabled(False) + self.clear_filter_mods.setDisabled(False) + self.mod_list.setDisabled(False) \ No newline at end of file diff --git a/cloud_backend.py b/cloud_backend.py new file mode 100644 index 0000000..cb16f0b --- /dev/null +++ b/cloud_backend.py @@ -0,0 +1,168 @@ +from PyQt5.QtWidgets import QDialog, QGridLayout, QLineEdit, QPushButton, QLabel, QVBoxLayout, QRadioButton +import requests, json +from PIL import Image +from io import BytesIO +import settings +import pathlib, os + + +global app_settings +app_settings = settings.app_settings + +class LoginDialog(QDialog): + def __init__(self, parent): + super().__init__(parent) + self.setWindowTitle('Login') + self.grid_layout = QGridLayout() + + self.server_address = QLineEdit() + self.server_address.setText(settings.app_settings.connected_server) + self.server_address_label = QLabel() + self.server_address_label.setText("Server") + + self.username = QLineEdit() + self.username.setText(app_settings.username) + self.username_label = QLabel() + self.username_label.setText("Username") + + self.password = QLineEdit() + self.password.setText(app_settings.password) + self.password_label = QLabel() + self.password_label.setText("Password") + + self.connect_button = QPushButton() + self.connect_button.setText("Connect") + self.connect_button.clicked.connect(self.__login) + + self.grid_layout.addWidget(self.server_address_label, 0, 0) + self.grid_layout.addWidget(self.server_address, 0, 1) + + self.grid_layout.addWidget(self.username_label, 1, 0) + self.grid_layout.addWidget(self.username, 1,1) + + self.grid_layout.addWidget(self.password_label, 2, 0) + self.grid_layout.addWidget(self.password, 2, 1) + + self.grid_layout.addWidget(self.connect_button, 3, 1) + + + self.setLayout(self.grid_layout) + + + self.setFixedSize(300, 200) + self.user_data = {} + self.show() + + def __login(self): + settings.app_settings.username = self.username.text() + settings.app_settings.password = self.password.text() + settings.app_settings.connected_server = self.server_address.text() + user_data = login(settings.app_settings.username, settings.app_settings.password) + if user_data != False: + self.user_data = user_data + + with open('log.txt', 'w+') as file: + file.write(json.dumps(user_data)) + self.accept() + +def ping(url): + request = requests.get(url) + if request.status_code == 200: + return True + return False + + +def upload_file(filename, file_path, external_data: dict): + external_data['username'] = settings.app_settings.username + external_data['password'] = settings.app_settings.password + external_data['filename'] = filename + files = [ + ('file', ('file', open(file_path, 'rb'), 'application/octet')), + ('datas', ('datas', json.dumps(external_data), 'application/json')), + ] + r = requests.post(f"{settings.app_settings.connected_server}/upload_app", files=files) + +def login(username, password): + headers = {'Content-Type': 'application/json'} + data = { + "username": username, + "password": password + } + + response = requests.post(f"{settings.app_settings.connected_server}/login_app", headers=headers, json=data) + user_data = {} + if response.status_code == 200: + user_data = response.json() + settings.app_settings.username = username + settings.app_settings.password = password + + response = requests.post(f"{settings.app_settings.connected_server}/login_app/avatar", json=data) + if response.status_code == 200: + im = Image.open(BytesIO(response.content)) + path = settings.app_settings.external_path / "avatars" / f"{data['username']}_avatar.png" + print(path) + im.save(path) + user_data['avatar'] = str(path.absolute()) + return user_data + user_data['avatar'] = f"icons/avatars/default_avatar.png" + return user_data + return False + + +class UpdateOptInDialog(QDialog): + def __init__(self, parent, default_pipeline): + super().__init__(parent) + self.default_pipeline = default_pipeline + self.setWindowTitle(f"Connectivity Opt In") + self.setMaximumWidth(300) + self.resize(300, 100) + + self.vertical_layout = QVBoxLayout() + + + text = """This seems to be your first time loading this app and we have a important question to ask. That is; do you wish to opt into receiving update requests from our pipelines? If you choose not to then you will not be able to connect to any servers. This is in order to ensure that you stay upto date for those servers.""" + self.message_label = QLabel() + self.message_label.setText(text) + self.message_label.setWordWrap(True) + self.message_label.setFixedSize(400, 100) + + + self.opt_in = QRadioButton() + self.opt_in.setText("I Want to Opt In to Updates") + self.opt_in.toggled.connect(self.radio_changed) + + self.pipeline_edit = QLineEdit() + self.pipeline_edit.setEnabled(False) + + self.confirm_button = QPushButton() + self.confirm_button.setText("Confirm") + self.confirm_button.setMaximumWidth(60) + self.confirm_button.setMaximumHeight(30) + self.confirm_button.clicked.connect(self.confirm_selection) + + + self.vertical_layout.addWidget(self.message_label) + self.vertical_layout.addWidget(self.opt_in) + self.vertical_layout.addWidget(self.pipeline_edit) + self.vertical_layout.addWidget(self.confirm_button) + + self.setLayout(self.vertical_layout) + + self.show() + + def radio_changed(self, state): + if state: + self.pipeline_edit.setEnabled(True) + self.pipeline_edit.setText(self.default_pipeline) + if not state: + self.pipeline_edit.setEnabled(False) + self.pipeline_edit.setText("") + + def get_opt_in_state(self): + return self.opt_in.isChecked() + + def get_pipeline(self): + return self.pipeline_edit.text() + + def confirm_selection(self): + self.accept() \ No newline at end of file diff --git a/database.sqlite b/database.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..17adc25c7e8b4aa0e9df583163d5e611ff4888b7 GIT binary patch literal 167936 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 NR{d0btL1 sqlite3.Connection: + + if not database_path: + database_path = pathlib.Path("test.sqlite") + + global database + database = sqlite3.connect(database=database_path.absolute()) + return database + + +def Table(cls): + """ easySQL decorator for table classes for easy instantiation of many of the SQL_execute strings. + + This class will always need these variables defined within its __init__ method; + + self.name = "foo"; This will be the name of the table in the integrated database + self.columns = {foo: dah, ...}; dictionary of foo being the column name, and dah being the columns type in the database + types for a column are: + - STRING + - INTEGER + - UNIQuE + - JSON + + Returns: + Table: returns a Table class wrapped around the original class. + """ + class Table(cls): + def __init__(self, *args, **kwargs) -> None: + super(Table, self).__init__(*args, **kwargs) + self.data_object = namedtuple(f"{self.name}_row", list(self.columns.keys())) + self.columns_validation = len(self.columns) + + def __repr__(self): + return f"{self.__class__.__name__} ('{self.name}')" + + @property + def create_table(self): + def manufacture_create_SQL_string() -> str: + """ Takes the super()'s columns dictionary and bulds parts of the SQL_execute string. + + Returns: + str: middle of create table SQL_execute string. + """ + # TODO: very crude way of doing it, research a better way. + middle_string = 'id integer PRIMARY KEY, ' + current_count = 0 + for column_name, column_type in self.columns.items(): + if column_type == 'json': + column_type == 'string' + if current_count == len(self.columns.items())-1: + middle_string += f"{column_name} {column_type}" + else: + middle_string += f"{column_name} {column_type}, " + current_count += 1 + return middle_string + return f"CREATE TABLE {self.name} ({manufacture_create_SQL_string()});" + + @property + def drop_table(self): + return f"DROP TABLE {self.name};" + + def select_row(self, column: str = None, match = None): + if column: + column_type = self.columns[column] + if column_type == "string": match = VALDATED_STRING(match, direction=0) + return f"SELECT * FROM {self.name} WHERE {column}= '{match}'" + else: + return f"SELECT * FROM {self.name}" + + def insert_row(self, data) -> namedtuple: + __conversion__ = [] + for id, pointer in enumerate(data): + column_type = list(self.columns.values())[id] + if isinstance(pointer, str) and column_type != "json": + pointer = VALDATED_STRING(pointer, direction=0) + __conversion__.append(pointer) + __conversion__ = tuple(__conversion__) + + def manufacture_insert_SQL_String(): + middle_string = '(' + gavel_string = '(' + current_count = 0 + for column_name in self.columns.keys(): + if current_count == len(self.columns.items())-1: + middle_string += f"{column_name})" + gavel_string += f"?)" + else: + middle_string += f"{column_name}, " + gavel_string += f"?, " + current_count += 1 + return f"{middle_string} VALUES {gavel_string}" + + query = namedtuple('Query', ['query', 'data']) + if len(__conversion__) == self.columns_validation: + return query(query=f"INSERT INTO {self.name}{manufacture_insert_SQL_String()}", data=__conversion__) + else: + return query(query=False, data= f"passed data to {self.name} is not the right length of entries") + + def update_row_by_id(self, data: dict, id: str): + """ Update a row at {id} with {data}. + + Args: + data (dict): key = column, value = data to update to + id (str): row_id in Table + """ + def manufactur_update_SQL_string(data: dict) -> str: + """ takes data and builds a SQL_execute string segment + + Args: + data (dict): Key = column, value = data to update to + + Returns: + _type_: middle segment of SQL_execute string + """ + # TODO: this is a very crude implementtion + middle_string = '' + current_count = 0 + for key, value in data.items(): + if current_count == len(data.items())-1: + middle_string += f" {key} = '{value}'" + else: + middle_string += f" {key} = '{value}', " + current_count += 1 + return middle_string + return f"UPDATE {self.name} SET{manufactur_update_SQL_string(data)} WHERE id = {id}" + + def convert_data(self, rows: list or tuple): + """ Takes rows returned by the tables SQL_select string and returns them as namedtuples. + + Args: + rows (listortuple): + + Returns: + (listortuple): returns a list of namedtuple. + """ + + self.keys = list(self.columns.keys()) + + if isinstance(rows, list): + pointer_list =[] + for row in rows: + __conversion__ = [] + for id, pointer in enumerate(row): + column_type = list(self.columns.values())[id-1] + if isinstance(pointer, str) and column_type != "json": + pointer = VALDATED_STRING(pointer, direction=1) + __conversion__.append(pointer) + __conversion__ = tuple(__conversion__) + pointer_list.append(__conversion__) + return [self.data_object(**{key: data[i+1] for i, key in enumerate(self.keys)}) for data in pointer_list] + + if isinstance(rows, tuple): + __conversion__ = [] + for id, pointer in enumerate(rows): + column_type = list(self.columns.values())[id-1] + if isinstance(pointer, str) and column_type != "json": + pointer = VALDATED_STRING(pointer, direction=1) + __conversion__.append(pointer) + __conversion__ = tuple(__conversion__) + return [self.data_object(**{key: __conversion__[i+1] for i, key in enumerate(self.keys)})][0] + + + return Table + + +def basic_query(query: str): + """ Used as single query functions, ex. creating tables, dropping tables, updating rows + + Args: + query (str): SQL_execute string + """ + with database: + cursor = database.cursor() + cursor.execute(query) + +def create_table(table: Table, drop=False): + + if drop: + drop_table(table=table) + + try: + with database: + cursor = database.cursor() + cursor.execute(table.create_table) + except sqlite3.OperationalError: + pass + +def drop_table(table: Table): + try: + with database: + cursor = database.cursor() + cursor.execute(table.drop_table) + except sqlite3.OperationalError: + pass + + +def update_table_row_by_id(table: Table, row): + query = table.update_row_by_id(data=row[1], id=row[0]) + with database: + cursor = database.cursor() + cursor.execute(query) + + +def insert_into_table(table, data): + """ Passing a query and its data as a namedtuple will insert the query into the database. + + Args: + query (namedtuple): (query.query = SQL_execute string, query.data = tuple of column's data) + """ + query = table.insert_row(data) + assert query.query, query.data + with database: + cursor = database.cursor() + cursor.execute(query.query, query.data) + +def fetchone_from_table(table: Table, filter: tuple([str, Any]) = None, convert_data=True) -> tuple: + if filter: + query = table.select_row(column=filter[0], match=filter[1]) + else: + query = table.select_row() + + with database: + cursor = database.cursor() + cursor.execute(query) + + if not convert_data: + return cursor.fetchone() + + return table.convert_data(cursor.fetchone()) + + +def fetchall_from_table(table, filter: tuple([str, Any]) = None, convert_data=True) -> list: + """ Fetches all rows from the database using passed query + + Args: + query (str): SQL_execute string + + Returns: + list: list of rows as tuples + """ + + if filter: + query = table.select_row(column=filter[0], match=filter[1]) + else: + query = table.select_row() + + with database: + cursor = database.cursor() + cursor.execute(query) + batch = cursor.fetchall() + + if len(batch) == 1: + batch = batch[0] + + if not convert_data: + return batch + + return table.convert_data(batch) \ No newline at end of file diff --git a/export_process.py b/export_process.py new file mode 100644 index 0000000..6c6a82d --- /dev/null +++ b/export_process.py @@ -0,0 +1,209 @@ +""" +This file contains all Gui and logic directly impacting the exportation processing +""" +import datetime +import os +import json +import tempfile +import pathlib +from zipfile import ZIP_DEFLATED, ZipFile +from PyQt5.QtCore import QThread, pyqtSignal +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QDialog, QListWidget, QListWidgetItem, QProgressBar, QLabel, QPushButton +from PyQt5.QtGui import QIcon + +import icons, settings, easySQL, tables + + +global app_settings + +app_settings = settings.app_settings + + +class ExportCollectionThread(QThread): + """This thread logic takes a Penumbra Collection and compresses it into a .pcmp that can later be + imported from another client. + + Args: + QThread (object): adjacent thread to main loop to allow for a progress indication for user QoL + """ + + next_step_signal = pyqtSignal(int) # tells progress bar what step it is on + indicate_change = pyqtSignal(str) # used to change a label and return a string to said label + set_progress_bar_max = pyqtSignal(int) # dynamic way to calculate total progress steps + step_complete = pyqtSignal(int) # used to indicate in the progress dialog what steps are complete for QoL + export_complete = pyqtSignal(bool) # used to indicate the Ui that it needs to repopulate + + def __init__(self, payload) -> None: + super().__init__() + self.payload = payload + def run(self): + """ + Main Thread logic that takes the provided collection and outputs a .pcmp file for use by the client. + """ + + collection_json = self.payload['collection_json'] + meta_json = self.payload['meta_data'] + + #determine what mods to copy and total files + total_files = self.calculate_total_files() + meta_json['totalfiles'] = total_files + #send signals for progress and next step + self.set_progress_bar_max.emit(total_files + 4) + self.next_step_signal.emit(1) + self.step_complete.emit(0) + + #create timestamp and file path + now = datetime.datetime.now() + time_stamp = datetime.datetime.strftime(now, '%Y-%m-%d %H-%M') + name = collection_json['Name'] + final_path = pathlib.Path(f"{self.payload['save_directory']}") / f"{time_stamp}-{name}.pcmp" + self.step_complete.emit(1) + with ZipFile(final_path, 'w', compression=ZIP_DEFLATED) as pcmp_zip_file: + self.next_step_signal.emit(2) + self.copy_manifest_collection_data( + pcmp_zip_file=pcmp_zip_file, + meta=meta_json, + collection_json=collection_json + ) + self.step_complete.emit(2) + + self.next_step_signal.emit(3) + self.copy_modifications_to_zip(pcmp_zip_file=pcmp_zip_file) + self.step_complete.emit(3) + + + self.step_complete.emit(4) + self.next_step_signal.emit(total_files + 4) + self.export_complete.emit(True) + + def copy_modifications_to_zip(self, pcmp_zip_file: ZipFile): + """ Overarching compression of each modification into the pcmp zip + + Args: + zip_ref (zipfile.ZipFile): PenumbraCollection Modification Pack for exportation and importation + mods_to_copy (list): A pre generated list of mod folders to compress into the .pcmp zip + """ + overfile_files = 0 + + for modification in self.payload['mods_to_copy']: + zip_modification_final_path = os.path.join('mods', modification[0]) + local_modification_directory = pathlib.Path(modification[1]) + for current_file, file_path in enumerate(local_modification_directory.rglob("*")): + pcmp_zip_file.write(file_path, arcname=os.path.join(zip_modification_final_path, file_path.relative_to(local_modification_directory))) + overfile_files += 1 + self.indicate_change.emit(f"({current_file + 1}/{modification[2]}) Compressing {file_path} to zip...") + self.next_step_signal.emit(3 + overfile_files) + + def calculate_total_files(self): + """ Calculates the total files to copy into the .pcmp file + + Returns: + total_files (int): + """ + total_files = 0 + + for modification in self.payload['mods_to_copy']: + total_files += modification[2] + return total_files + + def copy_manifest_collection_data(self, pcmp_zip_file: ZipFile, meta:dict, collection_json: dict): + """ Takes all the required files and data and writes them to the pcmp_zip_file + + Args: + pcmp_zip_file (zipfile.ZipFile): PenumbraCollection Modification Pack for exportation and importation + meta (dict): data needed for importation + collection_json_path (str): Penumbra's generated json for the collection + """ + # TODO: figure out how to save a file directly without having to use a temporary directory for it + temporary_directory = tempfile.TemporaryDirectory() + with open(os.path.join(temporary_directory.name, 'meta.json'), 'w') as file: + json.dump(meta, file, indent=3) + with open(os.path.join(temporary_directory.name, f"{collection_json['Id']}.json"), 'w') as file: + json.dump(collection_json, file, indent=3) + pcmp_zip_file.write(os.path.join(temporary_directory.name, 'meta.json'), 'meta.json') + pcmp_zip_file.write(os.path.join(temporary_directory.name, f"{collection_json['Id']}.json"), f"{collection_json['Id']}.json") + temporary_directory.cleanup() + + + +class ExportProgressDialog(QDialog): + """PyQt5 dialog that displays a QoL checklist and progress bar for the end user during the exportation process. + + Args: + QDialog (PyQt5.QtWidgets.QDialog): + """ + export_steps = [ + "Organized environment for export", + "Created manifest, paths, collection information", + "Archive created and Collection and manifest copied", + "Modifications copied", + "Cleaning Up with Finishing Touches", + "Export Done" + ] + + def __init__(self, parent, payload): + super().__init__(parent) + + self.payload = payload + + self.resize(400, 360) + self.setWindowTitle('Exporting Collection...') + self.progress_bar = QProgressBar(self) + self.progress_bar.setMaximum(10) + + self.QoL_step_label = QLabel(self) + self.QoL_step_label.setWordWrap(True) + + self.QoL_step_list = QListWidget(self) + self.abort_button = QPushButton(self) + self.abort_button.setText("Abort") + + self.QoL_step_label.setGeometry(30, 25, 340, 25) + self.progress_bar.setGeometry(30, 60, 340, 25) + self.QoL_step_list.setGeometry(30, 95, 340, 215) + self.abort_button.setGeometry(310, 325, 80, 25) + + + for each in self.export_steps: + item = QListWidgetItem() + item.setIcon(QIcon(icons.step_incomplete)) + item.setText(each) + self.QoL_step_list.addItem(item) + + self.show() + + def start_exportation(self): + self.my_thread = ExportCollectionThread(payload=self.payload) + self.my_thread.next_step_signal.connect(self.onStepChange) + self.my_thread.indicate_change.connect(self.onLabelChange) + self.my_thread.set_progress_bar_max.connect(self.set_dynamic_maximum) + self.my_thread.step_complete.connect(self.stepComplete) + self.my_thread.start() + + def onStepChange(self, value): + self.progress_bar.setValue(value) + + def onLabelChange(self, text): + self.QoL_step_label.setText(text) + + def set_dynamic_maximum(self, value): + self.progress_bar.setMaximum(value) + + def abort_export(self): + # TODO: abort logic requires that the ZIP be deleted so there is no confusion on a half baked modpack + pass + + def close(self) -> bool: + self.my_thread.exit() + return super().close() + + def stepComplete(self, index): + self.QoL_step_list.item(index).setIcon(QIcon(icons.step_complete)) + if index == 4: + self.QoL_step_list.item(4).setIcon(QIcon(icons.step_complete)) + self.QoL_step_list.item(5).setIcon(QIcon(icons.step_complete)) + self.abort_button.setText('Done') + self.abort_button.clicked.connect(self.close) + else: + self.QoL_step_list.item(index).setIcon(QIcon(icons.step_complete)) \ No newline at end of file diff --git a/helper_functions.py b/helper_functions.py new file mode 100644 index 0000000..ff887b4 --- /dev/null +++ b/helper_functions.py @@ -0,0 +1,9 @@ +import json, pathlib + +""" Here i will be putting any helper functions that may be used throughout +the application in order to not have to write the same code at the same time. """ + +def load_bom_json(file_path: pathlib.Path) -> json: + """ helper function to encode a json as utf-8 and then load it returning the dict. """ + with file_path.open(encoding="utf-8-sig") as loaded_file: + return json.load(loaded_file) \ No newline at end of file diff --git a/icons.py b/icons.py new file mode 100644 index 0000000..df19a18 --- /dev/null +++ b/icons.py @@ -0,0 +1,37 @@ +import sys, os +def resource_path(relative_path): + try: + base_path = sys._MEIPASS + except: + base_path = os.path.abspath(".") + + return os.path.join(base_path, relative_path) + + +icon_dir = resource_path("icons") + + + +# Filter icons created by Freepik - Flaticon +clear_filter = f"{icon_dir}\\filter.png" + +#Letter a icons created by Ivan Repin - Flaticon +active_collection = f'{icon_dir}\\letter-a.png' + +window_icon = f'{icon_dir}\\window_icon.png' +step_incomplete = f'{icon_dir}\\checkbox.png' +step_complete = f'{icon_dir}\\accept.png' +caution = f'{icon_dir}\\caution.png' +configure = f'{icon_dir}\\settings.png' +open_folder = f'{icon_dir}\\open-folder.png' +connected_true = f'{icon_dir}\\checked.png' +connected_false = f'{icon_dir}\\cancel.png' +refresh = f'{icon_dir}\\refresh.png' +import_icon = f'{icon_dir}\\import.png' +export_icon = f'{icon_dir}\\export.png' +upload_icon = f'{icon_dir}\\upload.png' +database_good = f'{icon_dir}\\database_good.png' +database_bad = f'{icon_dir}\\database_bad.png' +profile = f'{icon_dir}\\login.png' +help_icon = f'{icon_dir}\\help.png' +exit_icon = f'{icon_dir}\\exit.png' \ No newline at end of file diff --git a/icons/16x16/export20.png b/icons/16x16/export20.png new file mode 100644 index 0000000000000000000000000000000000000000..185930e7b6c069a931837fe9b6e94dcddf87a879 GIT binary patch literal 401 zcmV;C0dD?@P)L$vh+ z8k(fv(9+@_L_tn{3`UVtL=;72Q52LR<;Qs&qQg1lNng=>d!OgMFYfmfS}bu6RBks& z#f+mQ(15dod>zPm^4S}BvX@0Mp%Lf-R8(R!Z@&e@h8^vMHDLgKh>SW5Hjqxs)P()W zQZAq2HLqDU2fRE3tJ*@~c^1;^Q2hAQ^3^nyOYnH(4J;Pm{t7nNAeI<(w(M)8PPcop z{7(S93WL0mo?DATjA2*;YZ vJmpf(S#a;6uNv3-V3n~iQ^|MD5PJFs22xZd9@o;i00000NkvXXu0mjf`FW^i literal 0 HcmV?d00001 diff --git a/icons/16x16/import.png b/icons/16x16/import.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9483830a99494cb40ca3b67d9c5daf34fbfb3c GIT binary patch literal 325 zcmV-L0lNN)P)R#>mIXthy3^)(~rdf@1q+Pn4;aZSsE; zNG6TT=Ni(L(!m7oE2IS3#{C%v39$x3&J${8+XwrI=9h2k2`Q4_*Ze`lP#~S7W5%%o XIABK@!*d*L00000NkvXXu0mjfwC#@p literal 0 HcmV?d00001 diff --git a/icons/16x16/import20.png b/icons/16x16/import20.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbfb0cc680655868902b917816cb3eedeebe922 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWCjMtNKY5X z5R2aAgat+kF3{d2whvHJg(ofm#Rzdpa-y<%@q++&juzu$2$myne3@hrGd zT-Ihkt7n~>d?J%i!S%O0v|JV?@&Lgkdx^-e6IdUx)&2ZFd8W(Z1$sZ*7xi;aw<=-` zWcz1V-0sEp@BjG^#lIul@{P*`auvA!HvjvR`eR>${NeYH%_TtK-<_JS(7Wf0%X#N% ztJqAa+3C$bhf#WH&`7BE-Nxbc5dDwDEsm)(xW9=TiZ z{}~(1QMbP0l+XkKGnKEV literal 0 HcmV?d00001 diff --git a/icons/accept.png b/icons/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..9d77848f5c90f4f390cc0caffefaef14427be541 GIT binary patch literal 2072 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 literal 0 HcmV?d00001 diff --git a/icons/checked.png b/icons/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..951ed8f33f2f24f68c64ea8988698fd03b398d3b GIT binary patch literal 14518 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 E0Gd^V$^ZZW literal 0 HcmV?d00001 diff --git a/icons/database_bad.png b/icons/database_bad.png new file mode 100644 index 0000000000000000000000000000000000000000..65f2f8ee7eeb6cdc993137228e2733a13f393d67 GIT binary patch literal 10786 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 UU1^KD5ct4Mt00Lv_f3;+NC literal 0 HcmV?d00001 diff --git a/icons/exit.png b/icons/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..c6afb36aded67bc067d3bde4920fea1880b5b675 GIT binary patch literal 6343 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 literal 0 HcmV?d00001 diff --git a/icons/export.png b/icons/export.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1e269e83314d020f58ecffdd48d1c1407a4ef8 GIT binary patch literal 6651 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 A)&Kwi literal 0 HcmV?d00001 diff --git a/icons/help.png b/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..a074dec6c536b4c4fc56998a5417d2b256e9219e GIT binary patch literal 2674 zcmV-&3XS!NP)(Eb!2_QshT5}wDslnE*ioM&W)!(Gl|BRvSb11i- zFa+FzT-d7-L5Ax8&d~2hNPPl41^mlU|2K*4RPkFw-9t!!U!AG#CxESEpWVR8No9`$ ze@3Q!tynSEkG+}tQk&EzO6!YE?iZh?+uwscb(R4aB2TnkOuhI3`+)}(Tm3crl9khP zjk;l;1TF%;1pG0gzV<@t0yxdM4>)3|KS=nA^H$)zT0P2$3qWU?vHlS7NT7Tcve48K zxBzt40`rZ(bJ`38E&%b_hdhF_fp;2hY64hK-gS{=TmZs0rQCYQ{+_U?UJP7iv{?if zfS}#6*8ndv+RQDgBDesAhk$1S9 zxyUwf3!12|#_n;fjSHYPqvUtz{sP%9Rz(l+4x`Q5xB#lr?$|zHj=|n2`8|%caRF5G zBP8QT6=x&+1uevQ92?Cm81WE>u->uv1OE<`pATGOv{?%mK$w^X981!O_rht16crdfg zWLy9`1B7G!R$_POc8qh#1)wv8p4G#8!8B358F+=!W)d!dIC9^ye$jy=0rM+^flfH)o{9P2j=yE|7Cz&d2Lu_!Kpcyc?3evRZ4s$vcjlUNiNKs+%4 zr1Ok6+a5XO0*FToAe~440MhHI&N!9@7eG8E0!V)fJR2xK3%J5)(}WAaMoh@J#hp8h z_!~kL9R^$gHndp36nAcJkE00}fQ=Hdem_8t&Z%M{vNBi%7l57I?%X4^F}tV>z|H{S zSicl^Zf=ibG%f%;B?3sd5q1tOC-3Pc6Sx4<$i0rgAK5mZ(`FPdfHbrypSNIl=eET; zJ0O@_m!I)K?jch{Af(xKNG3)pickVG7%r5EzsE-yvdI4~; z(PnN@RpJ7u&tc#vN*(JRJ4pCU#tVfma!A&cFqbkKDt6=5Yi`Dpd;?Kt419q?{RCe2;(&ARjRS zq`6NZO^HgLf(sxoxnun_k7J6crr-j|OH4jsO91I8g#$=k0D1Wt;lm1fk$On+%kt*gW)UfR7>Kc?S6ASiM;BCd~#?&#&)Ba_D{?cwVV{G4SrhcB=RY5{v&UrCu-a zL7E@xwjnQsRgdKhkks*aj{V$6efMrZ@TrS~C`+ATU<7&5-Uuv3 zj+MKd@Ty=J#ytWqfU;NxaBS>%K7fRRUjcjt$u17E`E;{l!}K1IIt>JQ>)eTCx2R$c zG7T&-4}S{Th7~$~Wg)PJf@#(ib|c@rFvY2Y}wEA5XW`}<;<^f!cY!ll796%Pe-j6K-W%7<; zZTa$+NIUa^U5YL1Qt&R~FY3n?TcwwRC$mE7%P8XbxeM`g$w~j;1bkHaog+vv=E*>vbCD@lh+zsJ%{Gm_WQglGa1zN}{`Xde zb-aNfe(I$)ZKTozT-2tv>o7pro0pqzWRJjCs|uZFX~$l{%ITmBpn0?a(h{tr;%V;! zXr7o8NOLnx#kF<;v1E5=PTiM4CyntFNR#9G6%HZ?Qf?V*t8(*<3!puW zpFmnW%hx3KA$tn9AbT}K)8h$T0PSOd`T}?ix!~K-^Axtk1<*bQ2?vn2Vgz^?x#-_P z5>(bAB!D3#aj`AP z-1LKxdXX{mMB(;_fNN@gPj%Q>(Xai$9Z27rT&8v!rU%*CGYUKod=a<=pPs+q@C)uZ gj^j9v<21+r0g=H<<)3hCf&c&j07*qoM6N<$f<$fORsaA1 literal 0 HcmV?d00001 diff --git a/icons/import.png b/icons/import.png new file mode 100644 index 0000000000000000000000000000000000000000..8e34d9bd1bf9c14fab63c5bb2f8aefcfd5fe2edb GIT binary patch literal 7149 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 literal 0 HcmV?d00001 diff --git a/icons/login.png b/icons/login.png new file mode 100644 index 0000000000000000000000000000000000000000..a1baa9baff4bf72c2f67afccda161eed5645e764 GIT binary patch literal 18505 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 literal 0 HcmV?d00001 diff --git a/icons/refresh.png b/icons/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..1c750fcf7845173cf589d6c60f5ee329fa2bd32a GIT binary patch literal 21534 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 S_z)b71umNZgC?1}#{D0A(#{_M literal 0 HcmV?d00001 diff --git a/icons/settings.png b/icons/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..171e589d76fb5c1ac7c7f9f882eac6d4fae9b39c GIT binary patch literal 25621 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 ZAJdA-OZ!IZ=YSGJG7|5^OGFL){|~Mx=+6KE literal 0 HcmV?d00001 diff --git a/import_process.py b/import_process.py new file mode 100644 index 0000000..4f2c1ea --- /dev/null +++ b/import_process.py @@ -0,0 +1,205 @@ +from PyQt5.QtWidgets import (QDialog, QProgressBar, QLabel, QListWidget, QPushButton, QListWidgetItem) +from PyQt5.QtGui import QIcon +import json, zipfile, pathlib, shutil, os +from PyQt5.QtCore import QThread, pyqtSignal +import icons, settings, helper_functions + +global app_settings +app_settings = settings.app_settings + +class ImportCollectionThread(QThread): + """This Thread logic takes a Penumbra Collection ModPack (.pcmp) and decompresses it into the users Modification + and collection folders. + + Args: + QThread (object): adjacent thread to main loop to allow for a progress indication for user QoL + """ + next_step_signal = pyqtSignal(int) # tells progress bar what step it is on + indicate_change = pyqtSignal(str) # used to change a label and return a string to said label + set_progress_bar_max = pyqtSignal(int) # dynamic way to calculate total progress steps + step_complete = pyqtSignal(int) # used to indicate in the progress dialog what steps are complete for QoL + + def __init__(self, payload): + """ + Args: + path_to_pcmp (str): + user_collection_directory (str): + user_modification_directory (str): + """ + super().__init__() + self.payload = payload + + def run(self): + + self.collection_uuid = self.payload['meta_data']['collection_uuid'] + self.collection_name = self.payload['meta_data']['collection_name'] + #save collection + collections_folder = pathlib.Path(app_settings.get_setting('collections_folder')) + collection_path = collections_folder / f"{self.collection_uuid}.json" + + + # need to modify collection json for unique tag... + collection_settings = self.payload['collection_json']['Settings'] + new_settings = {} + for key, value in collection_settings.items(): + new_settings[f"({self.collection_name}) {key}"] = value + self.payload['collection_json']['Settings'] = new_settings + + + with collection_path.open('w+') as file: + try: + json.dump(self.payload['collection_json'], file, indent=2) + except TypeError as e: + print(e) + + sort_order_json = pathlib.Path(app_settings.get_setting('penumbra_path'), f"Penumbra/sort_order.json") + print(sort_order_json) + sort_order = helper_functions.load_bom_json(sort_order_json) + sort_order_data = sort_order['Data'] + + self.step_complete.emit(0) # copy over collection data signal + self.set_progress_bar_max.emit(self.payload['meta_data']['totalfiles']) + # TODO: create a database to save what collections are imported. + + with zipfile.ZipFile(self.payload['path_to_zip']) as pcmp_file: + self.step_complete.emit(1) # open zip folder and set up environment signal + # copy mods into mod folder + name_list = pcmp_file.namelist() + overcount_files = 0 + for modification in self.payload['mods_to_copy']: + sort_order_data[f"({self.collection_name}) {modification}"] = f"{self.collection_name}/({self.collection_name}) {modification}" + #makes all mod folders unique by default TODO: replace mod_folder_test with user folder + + # Determine modifactions target directory and make sure it does not exists + modification_folder = pathlib.Path(app_settings.get_setting("modification_folder"), f"({self.collection_name}) {modification}") + if not os.path.exists(modification_folder): + os.mkdir(modification_folder) + + # Create a filtered lists of all the found paths in the archives mods folder + filtered_paths_to_copy = [path for path in name_list if f"mods/{modification}" in path] + + file_paths = [] # stores file paths and name for indexing and saving an index in the mods folder for future use. + + # Start the counter and copying each filtered file in the archive over to the modification target + for current_count, path in enumerate(filtered_paths_to_copy): + + target_path = modification_folder / path.replace(f"mods/{modification}/", "") + file_paths.append(tuple([path, str(target_path)])) + + member_info = pcmp_file.getinfo(path) + + # if the path is a inner directory then make it else, copy the file over into the target_path + if member_info.is_dir(): + try: + os.makedirs(target_path) + except FileExistsError as e: + #print(e) + pass + elif "meta.json" in path: + data = json.load(pcmp_file.open(path)) + data['Name'] = f"({self.collection_name}) {data['Name']}" + with target_path.open("w+") as _file: + json.dump(data, _file, indent=2) + else: + source = pcmp_file.open(path) # path into the archive + target = open(target_path, 'wb+') # target path on the local machine + with source, target_path: + shutil.copyfileobj(source, target) + target.close() + + overcount_files += 1 + self.indicate_change.emit(f"({current_count}/{len(filtered_paths_to_copy)}) decompressing {path} to {modification_folder}...") + self.next_step_signal.emit(overcount_files) + + # Save a files index into the modifications folder + files_index_json = modification_folder / "pcmp_index.json" + with files_index_json.open('w+') as index_file: + json.dump(file_paths, index_file, indent=2) + + sort_order['Data'] = sort_order_data + + with sort_order_json.open('w+') as _file: + json.dump(sort_order, _file, indent=2) + + self.step_complete.emit(2) # Modifications copied signal + self.step_complete.emit(3) # clean up and closing files signal + self.step_complete.emit(4) # import done + +class ImportProgressDialog(QDialog): + steps = [ + "Opened Archive", + "Copying Collection files", + "Modifications Copied", + "Cleaning Up with Finishing Touches", + "Import Done" + ] + + def __init__(self, parent, payload): + super().__init__(parent) + + self.payload = payload + + self.resize(400, 360) + self.setWindowTitle('Importing Collection...') + self.progress_bar = QProgressBar(self) + self.progress_bar.setMaximum(10) + + self.QoL_step_label = QLabel(self) + self.QoL_step_label.setWordWrap(True) + + self.QoL_step_list = QListWidget(self) + self.abort_button = QPushButton(self) + self.abort_button.setText("Abort") + + self.QoL_step_label.setGeometry(30, 25, 340, 25) + self.progress_bar.setGeometry(30, 60, 340, 25) + self.QoL_step_list.setGeometry(30, 95, 340, 215) + self.abort_button.setGeometry(310, 325, 80, 25) + + + for each in self.steps: + item = QListWidgetItem() + item.setIcon(QIcon(icons.step_incomplete)) + item.setText(each) + self.QoL_step_list.addItem(item) + + self.show() + + def import_collection(self): + """ main function that leads into the import thread. + + Args: + path_to_pcmp (str): pcmp file to import + """ + # TODO: I want to be able to manipulate this data + self.my_thread = ImportCollectionThread(payload=self.payload) + self.my_thread.next_step_signal.connect(self.do_step_change) + self.my_thread.indicate_change.connect(self.change_label) + self.my_thread.set_progress_bar_max.connect(self.set_Progress_Bar_max) + self.my_thread.step_complete.connect(self.step_complete) + self.my_thread.start() + + def do_step_change(self, progress_value: int): + self.progress_bar.setValue(progress_value) + + def change_label(self, text: str): + self.QoL_step_label.setText(text) + + def set_Progress_Bar_max(self, progress_max: int): + self.progress_bar.setMaximum(progress_max) + + def abort_import(self): + pass + + def done_button(self): + self.my_thread.exit() + return super().close() + + def step_complete(self, index): + if index == 3: + self.QoL_step_list.item(3).setIcon(QIcon(icons.step_complete)) + self.QoL_step_list.item(4).setIcon(QIcon(icons.step_complete)) + self.abort_button.setText('Done') + self.abort_button.clicked.connect(self.done_button) + else: + self.QoL_step_list.item(index).setIcon(QIcon(icons.step_complete)) \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..fa811dc --- /dev/null +++ b/main.py @@ -0,0 +1,180 @@ +# external modules +import sys, json, pathlib, os, datetime, requests, tempfile, zipfile, subprocess +from PyQt5.QtWidgets import QApplication, QMessageBox +from PyQt5 import QtCore +from cloud_backend import UpdateOptInDialog, ping + + +# internal modules +from MainGui import MainGui +import settings, helper_functions, easySQL, tables + +def penumbra_path_validation(parent): + """ This function is a preload warning if penumbra is not installed in the correct path which is + usually an indication it isnt installed at all.""" + if not os.path.exists(settings.app_settings.get_setting('penumbra_path')): + warning_dialog = QMessageBox(parent) + warning_dialog.setWindowTitle('Incorrect Penumbra Installation...') + warning_dialog.setText(f"""It appears that Penumbra is not installed on your system at: \n{settings.app_settings.get_setting('penumbra_path')}\nThat means this program is useless to you at the moment! Please install Penumbra and follow its instructions before using this application!""") + warning_dialog.setIcon(QMessageBox.Warning) + warning_dialog.setStandardButtons(QMessageBox.Close) + button = warning_dialog.exec() + + if button == QMessageBox.Close: + sys.exit() + +def build_and_update_collections_database(): + """ updates collections installed in the collections folder into the database """ + collections_folder = pathlib.Path(settings.app_settings.get_setting('penumbra_path')) / "Penumbra" / "collections" + settings.app_settings.set_setting(key="collections_folder", value=str(collections_folder.absolute())) + + active_collections_json = pathlib.Path(settings.app_settings.get_setting('penumbra_path')) / "Penumbra" / "active_collections.json" + settings.app_settings.set_setting(key="active_collections", value=str(active_collections_json.absolute())) + + active_collections = helper_functions.load_bom_json(active_collections_json) + individuals = active_collections.pop("Individuals") + active_collections.pop("Version") + + if os.path.isdir(collections_folder): + for id, collection_json in enumerate(collections_folder.glob("*")): + file_extension = os.path.splitext(collection_json)[1] + if file_extension == ".json": + data = helper_functions.load_bom_json(collection_json) + character_links = {} + + for key, collection in active_collections.items(): + if collection == data['Name']: + character_links[key] = True + else: + character_links[key] = False + + collection_indvi = [] + for individual in individuals: + if individual['Collection'] == data['Name']: + collection_indvi.append(individual) + + character_links['Individuals'] = collection_indvi + + easySQL.insert_into_table(tables.collections, + (id, + data['Version'], + data['Id'], + data['Name'], + json.dumps(data['Settings']), + json.dumps(data['Inheritance']), + json.dumps(character_links) + )) + + v = datetime.datetime.now().strftime("v%y.%m.%d") + easySQL.insert_into_table(tables.metadata, ( + id, + data['Name'], + "Dummy Comment", + str(v) + )) + +def build_and_update_modifications_database(): + """get the mod directory and updates into the modification database""" + modification_folder = pathlib.Path(helper_functions.load_bom_json(pathlib.Path(settings.app_settings.get_setting('penumbra_path')) / "Penumbra.json")["ModDirectory"]) + settings.app_settings.set_setting(key="modification_folder", value=str(modification_folder.absolute())) + + if os.path.isdir(modification_folder): + + for id, modification in enumerate(modification_folder.glob("*")): + try: + meta_path = pathlib.Path(modification / "meta.json") + if os.path.isdir(modification) and os.path.exists(meta_path): + length = 0 + for file_path in modification.rglob("*"): + length += 1 + + meta = helper_functions.load_bom_json(modification / "meta.json") + easySQL.insert_into_table(tables.modifications, ( + id, + meta['FileVersion'], + meta['Name'], + meta['Author'], + meta['Description'], + meta['Version'], + meta['Website'], + json.dumps(meta['ModTags']), + str(modification.absolute()), + length + )) + elif pathlib.Path(modification).suffix == ".pmp": + print(modification) + except: + print(modification) + +if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'): + QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, False) + +if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'): + QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, False) + +def main(): + app = QApplication(sys.argv) + settings.app_settings.load_settings() + settings.app_settings.external_path = pathlib.Path.cwd() + + main_gui = MainGui() + + if settings.app_settings.first_load: + dialog = UpdateOptInDialog(main_gui, "https://ffxiv.treehousefullofstars.com/update_app/latest") + result = dialog.exec() + if result == 1: + settings.app_settings.set_setting("update_opt_in", dialog.get_opt_in_state()) + settings.app_settings.set_setting("update_pipeline", dialog.get_pipeline()) + settings.app_settings.save_settings() + else: + return False + + + if settings.app_settings.get_setting("update_opt_in"): + pipeline = settings.app_settings.get_setting("update_pipeline") + app_version = settings.app_settings.get_setting("app_version") + url_break = pipeline.split("/") + url = url_break[0] + "//" + url_break[2] + "/check_server" + result = ping(url) + if result: + update_info = requests.get(str(pipeline + "/" + app_version)).json()['data'] + + print(update_info['update_ready']) + if update_info['update_ready']: + msg_box_name = QMessageBox() + msg_box_name.setIcon(QMessageBox.Question) + msg_box_name.setWindowTitle("Update Available...") + msg_box_name.setText(f"It appears there is an update to the app available.\n\nYour current version is: {app_version}\nThe new version is: {update_info['latest_version']}\n\nPlease update your app, if you decline to then your ability to connect to servers will be disabled!") + msg_box_name.setStandardButtons(QMessageBox.Ok | QMessageBox.No) + retval = msg_box_name.exec_() + + if retval == QMessageBox.No: + settings.app_settings.lock_client = True + + if retval == QMessageBox.Ok: + return False + + # penumbra validation to ensure the plugin is even installed and set up! + penumbra_path_validation(parent=main_gui) + + # build database + build_and_update_collections_database() + build_and_update_modifications_database() + + main_gui.__post__init__() + main_gui.show() + + settings.app_settings.save_settings() + + avatars = pathlib.Path(settings.app_settings.external_path.absolute()) / "avatars" + avatars.mkdir(parents=True, exist_ok=True) + sys.exit(app.exec_()) + +if __name__ == '__main__': + print(sys.argv) + try: + main() + sys.exit() + except Exception as e: + with open('log.txt', "w+") as file: + file.write(str(e)) \ No newline at end of file diff --git a/main.spec b/main.spec new file mode 100644 index 0000000..4e5780d --- /dev/null +++ b/main.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['main.py'], + pathex=[], + binaries=[], + datas=[('./icons', './icons')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=["database.sqlite", "settings.json"], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='Collection Sharing App', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='Collection Sharing App V1.0', +) diff --git a/main_old.spec b/main_old.spec new file mode 100644 index 0000000..dac32d8 --- /dev/null +++ b/main_old.spec @@ -0,0 +1,45 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['main.py'], + pathex=[], + binaries=[], + datas=[('./icons', './icons')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=['settings.json', 'database,sqlite'], + noarchive=False, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='Collection Sharing App', + debug=True, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + contents_directory='.', +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='Collection Sharing App v1.0', +) + diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..d9b6478 --- /dev/null +++ b/settings.py @@ -0,0 +1,71 @@ +import json, os, pathlib + +class AppSettings(object): + def __init__(self, path) -> None: + self.path = pathlib.Path(path) + self.__get__ = {} + self.username = "" + self.password = "" + self.connected_server = "" + self.port = "" + self.user_data = {} + self.connected = False + self.external_path = "" + self.update_opt_in = False + self.update_pipeline = "" + self.first_load = False + self.app_version = "" + self.lock_client = False + + def get_setting(self, key=None): + """ getter for any key in the settings dictionary! call it without a provided key to get the whole dictionary or pass a + key value and it returns that settings. + """ + if key: + return self.__get__[key] + return self.__get__ + + def set_setting(self, key, value): + """ setter for any value in the settings """ + self.__get__[key] = value + + def load_settings(self): + """ This loads pre-existing settings or the default if none exists! """ + # check if settings exists if does then load that into variable + if os.path.exists(self.path.absolute()): + with self.path.open('r+') as file: + file_contents = json.load(file) + self.__get__ = file_contents + self.first_load = False + self.lock_client = False + # if not then create it and load in defaults + else: + global default_settings + with self.path.open('w+') as file: + json.dump(default_settings, file) + self.__get__ = default_settings + self.first_load = True + + def save_settings(self): + """ Saves the current settings values to self.path! """ + # check to see if the path exists for failsafe and then write to json + if os.path.exists(self.path.absolute()): + with self.path.open('w+') as file: + json.dump(self.__get__, file, indent=2) + + + +global app_settings +app_settings = AppSettings('settings.json') + +global default_settings +default_settings = { + "window_title": "Collection Sharing App", + "window_height": 400, + "window_width": 640, + "penumbra_path": str(pathlib.Path(pathlib.Path.home() / "AppData/Roaming" / "XIVLauncher" / "pluginConfigs").absolute()), + "advanced_mode": False, + "update_opt_in": False, + "update_pipeline": "", + "app_version": "alpha_v1.0" +} \ No newline at end of file diff --git a/tables.py b/tables.py new file mode 100644 index 0000000..b4dad7a --- /dev/null +++ b/tables.py @@ -0,0 +1,54 @@ +import easySQL +import pathlib + +@easySQL.Table +class Collections: + def __init__(self) -> None: + self.name = "Collections" + self.columns = { + 'collection_id': easySQL.INTEGER, + 'version': easySQL.INTEGER, + 'uuid': easySQL.STRING, + 'name': easySQL.STRING, + 'settings': easySQL.JSON, + 'inheritance': easySQL.JSON, + 'character_links': easySQL.JSON + } + +@easySQL.Table +class CollectionMeta: + def __init__(self) -> None: + self.name = "MetaTable" + self.columns = { + 'meta_id': easySQL.INTEGER, + 'collection_name': easySQL.STRING, + 'comments': easySQL.STRING, + 'version': easySQL.STRING + } + + +@easySQL.Table +class Modifications: + def __init__(self) -> None: + self.name = "Modifications" + self.columns = { + 'mod_id': easySQL.INTEGER, + 'fileversion': easySQL.INTEGER, + 'name': easySQL.STRING, + 'author': easySQL.STRING, + 'description': easySQL.STRING, + 'version': easySQL.INTEGER, + 'website': easySQL.STRING, + 'modtags': easySQL.JSON, + 'mod_path': easySQL.STRING, + 'total_files': easySQL.INTEGER + } + +collections = Collections() +modifications = Modifications() +metadata = CollectionMeta() + +easySQL.intergrate(database_path=pathlib.Path('database.sqlite')) +easySQL.create_table(collections, drop=True) +easySQL.create_table(modifications, drop=True) +easySQL.create_table(metadata, drop=True) \ No newline at end of file diff --git a/update_app.py b/update_app.py new file mode 100644 index 0000000..6d18a0a --- /dev/null +++ b/update_app.py @@ -0,0 +1,34 @@ +import sys, json, psutil, requests, tempfile, os, zipfile, signal + +def update_app(url, external_path): + print(url) + result = requests.get(url) + print(external_path) + + with tempfile.TemporaryDirectory() as temp_dir: + print(temp_dir) + with open(f"{temp_dir}/temp.zip", "wb") as file: + file.write(result.content) + with zipfile.ZipFile(f"{temp_dir}/temp.zip", 'r') as zip_ref: + for member in zip_ref.namelist(): + print(member) + filepath = os.path.join(external_path, member) + os.remove(filepath) if os.path.exists(filepath) else None # Remove if exists + zip_ref.extractall(external_path) + + with open('log.txt', "w+") as file: + file.write(str("updated")) + +try: + test =psutil.Process(int(sys.argv[1])) + os.kill(int(sys.argv[1]), signal.SIGTERM) +except psutil.NoSuchProcess as e: + try: + update_app(url=sys.argv[2], external_path=sys.argv[3]) + except Exception as e: + test = str(e) + +with open("log.txt", "w+") as file: + file.write(json.dumps(test)) + +sys.exit() diff --git a/upload_process.py b/upload_process.py new file mode 100644 index 0000000..e7ff66a --- /dev/null +++ b/upload_process.py @@ -0,0 +1,257 @@ +""" +This file contains all Gui and logic directly impacting the exportation processing +""" +import httpx +import datetime +import os +import json +import tempfile +import pathlib +from zipfile import ZIP_DEFLATED, ZipFile +from PyQt5.QtCore import QThread, pyqtSignal +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QDialog, QListWidget, QListWidgetItem, QProgressBar, QLabel, QPushButton +from PyQt5.QtGui import QIcon + +import icons, settings + +from cloud_backend import upload_file + + +global app_settings + +app_settings = settings.app_settings + + +class UploadCollectionThread(QThread): + """This thread logic takes a Penumbra Collection and compresses it into a .pcmp that can later be + imported from another client. + + Args: + QThread (object): adjacent thread to main loop to allow for a progress indication for user QoL + """ + + next_step_signal = pyqtSignal(int) # tells progress bar what step it is on + indicate_change = pyqtSignal(str) # used to change a label and return a string to said label + set_progress_bar_max = pyqtSignal(int) # dynamic way to calculate total progress steps + step_complete = pyqtSignal(int) # used to indicate in the progress dialog what steps are complete for QoL + export_complete = pyqtSignal(bool) # used to indicate the Ui that it needs to repopulate + + def __init__(self, payload) -> None: + super().__init__() + self.payload = payload + self.final_path = "" + + def run(self): + """ + Main Thread logic that takes the provided collection and outputs a .pcmp file for use by the client. + """ + + collection_json = self.payload['collection_json'] + meta_json = self.payload['meta_data'] + + #determine what mods to copy and total files + total_files = self.calculate_total_files() + meta_json['totalfiles'] = total_files + #send signals for progress and next step + self.set_progress_bar_max.emit(total_files + 4) + self.next_step_signal.emit(1) + self.step_complete.emit(0) + + #create timestamp and temp folder for file path + temporary_directory = tempfile.TemporaryDirectory() + now = datetime.datetime.now() + time_stamp = datetime.datetime.strftime(now, '%Y-%m-%d %H-%M') + name = collection_json['Name'] + filename = f"{time_stamp}-{name}.pcmp" + self.final_path = pathlib.Path(f"{temporary_directory.name}") / filename + self.step_complete.emit(1) + + with ZipFile(self.final_path, 'w', compression=ZIP_DEFLATED) as pcmp_zip_file: + self.next_step_signal.emit(2) + self.copy_manifest_collection_data( + pcmp_zip_file=pcmp_zip_file, + meta=meta_json, + collection_json=collection_json, + temporary_directory=temporary_directory.name + ) + + self.step_complete.emit(2) + + self.next_step_signal.emit(3) + self.copy_modifications_to_zip(pcmp_zip_file=pcmp_zip_file) + self.step_complete.emit(3) + + + self.upload_file(filename, self.final_path) + self.step_complete.emit(4) + self.next_step_signal.emit(total_files + 4) + temporary_directory.cleanup() + self.export_complete.emit(True) + + def copy_modifications_to_zip(self, pcmp_zip_file: ZipFile): + """ Overarching compression of each modification into the pcmp zip + + Args: + zip_ref (zipfile.ZipFile): PenumbraCollection Modification Pack for exportation and importation + mods_to_copy (list): A pre generated list of mod folders to compress into the .pcmp zip + """ + overfile_files = 0 + + for modification in self.payload['mods_to_copy']: + zip_modification_final_path = os.path.join('mods', modification[0]) + local_modification_directory = pathlib.Path(modification[1]) + for current_file, file_path in enumerate(local_modification_directory.rglob("*")): + pcmp_zip_file.write(file_path, arcname=os.path.join(zip_modification_final_path, file_path.relative_to(local_modification_directory))) + overfile_files += 1 + self.indicate_change.emit(f"({current_file + 1}/{modification[2]}) Compressing {file_path} to zip...") + self.next_step_signal.emit(3 + overfile_files) + + def calculate_total_files(self): + """ Calculates the total files to copy into the .pcmp file + + Returns: + total_files (int): + """ + total_files = 0 + + for modification in self.payload['mods_to_copy']: + total_files += modification[2] + return total_files + + def copy_manifest_collection_data(self, pcmp_zip_file: ZipFile, meta:dict, collection_json: dict, temporary_directory: str): + """ Takes all the required files and data and writes them to the pcmp_zip_file + + Args: + pcmp_zip_file (zipfile.ZipFile): PenumbraCollection Modification Pack for exportation and importation + meta (dict): data needed for importation + collection_json_path (str): Penumbra's generated json for the collection + """ + # TODO: figure out how to save a file directly without having to use a temporary directory for it + with open(os.path.join(temporary_directory, 'meta.json'), 'w') as file: + json.dump(meta, file, indent=3) + with open(os.path.join(temporary_directory, f"{collection_json['Id']}.json"), 'w') as file: + json.dump(collection_json, file, indent=3) + pcmp_zip_file.write(os.path.join(temporary_directory, 'meta.json'), 'meta.json') + pcmp_zip_file.write(os.path.join(temporary_directory, f"{collection_json['Id']}.json"), f"{collection_json['Id']}.json") + + def upload_file(self, filename, path): + chunk_size = 10485760 + url = f"{settings.app_settings.connected_server}/upload_file" + total = os.path.getsize(path) + self.next_step_signal.emit(0) + self.set_progress_bar_max.emit(total) + self.indicate_change.emit(f"Uploading to {settings.app_settings.connected_server}...") + data = {'filename': filename} + total_chunks_transferred = 0 + with open(path, 'rb') as f: + while (chunk := f.read(chunk_size)): + files = {'file': (filename, chunk)} + response = httpx.post(url, files=files, timeout=None) + total_chunks_transferred += len(chunk) + self.next_step_signal.emit(total_chunks_transferred) + if response.status_code != 200: + break + + headers = {'Content-Type': 'application/json'} + meta_data = self.payload['meta_data'] + collection_json = self.payload['collection_json'] + character_links = self.payload['character_links'] + mod_list = self.payload['mods_to_copy'] + data = { + "username": settings.app_settings.username, + "password": settings.app_settings.password, + "filename": filename, + "meta_data": meta_data, + "collection_json": collection_json, + "character_links": character_links, + "mod_list": mod_list + } + + response = httpx.post(f"{settings.app_settings.connected_server}/upload_info", headers=headers, json=data) + print(response) + +class UploadProgressDialog(QDialog): + """PyQt5 dialog that displays a QoL checklist and progress bar for the end user during the exportation process. + + Args: + QDialog (PyQt5.QtWidgets.QDialog): + """ + export_steps = [ + "Organized environment for upload", + "Created manifest and collection information", + "Archive created and Collection and manifest copied", + "Modifications copied", + "Cleaning Up with Finishing Touches, Uploading", + "Upload Done" + ] + + def __init__(self, parent, payload): + super().__init__(parent) + + self.payload = payload + + self.resize(400, 360) + self.setWindowTitle('Uploading Collection...') + self.progress_bar = QProgressBar(self) + self.progress_bar.setMaximum(10) + + self.QoL_step_label = QLabel(self) + self.QoL_step_label.setWordWrap(True) + + self.QoL_step_list = QListWidget(self) + self.abort_button = QPushButton(self) + self.abort_button.setText("Abort") + + self.QoL_step_label.setGeometry(30, 25, 340, 25) + self.progress_bar.setGeometry(30, 60, 340, 25) + self.QoL_step_list.setGeometry(30, 95, 340, 215) + self.abort_button.setGeometry(310, 325, 80, 25) + + + for each in self.export_steps: + item = QListWidgetItem() + item.setIcon(QIcon(icons.step_incomplete)) + item.setText(each) + self.QoL_step_list.addItem(item) + + self.final_path = "" + + + self.show() + + def start_upload(self): + self.my_thread = UploadCollectionThread(payload=self.payload) + self.my_thread.next_step_signal.connect(self.onStepChange) + self.my_thread.indicate_change.connect(self.onLabelChange) + self.my_thread.set_progress_bar_max.connect(self.set_dynamic_maximum) + self.my_thread.step_complete.connect(self.stepComplete) + self.my_thread.start() + + def onStepChange(self, value): + self.progress_bar.setValue(value) + + def onLabelChange(self, text): + self.QoL_step_label.setText(text) + + def set_dynamic_maximum(self, value): + self.progress_bar.setMaximum(value) + + def abort_upload(self): + # TODO: abort logic requires that the ZIP be deleted so there is no confusion on a half baked modpack + pass + + def close(self) -> bool: + self.final_path = self.my_thread.final_path + self.my_thread.exit() + return super().close() + + def stepComplete(self, index): + self.QoL_step_list.item(index).setIcon(QIcon(icons.step_complete)) + if index == 4: + self.QoL_step_list.item(4).setIcon(QIcon(icons.step_complete)) + self.QoL_step_list.item(5).setIcon(QIcon(icons.step_complete)) + self.abort_button.setText('Done') + self.abort_button.clicked.connect(self.close) + else: + self.QoL_step_list.item(index).setIcon(QIcon(icons.step_complete)) \ No newline at end of file