From 3589a1d8a9fddc85f7f0d9647296bcb7277c93bf Mon Sep 17 00:00:00 2001 From: Skrepysh Date: Mon, 16 Oct 2023 23:52:58 +0300 Subject: [PATCH] v2.23 Updated program to version 2.23 --- main.py | 53 ++++++++--------- minesquid.py | 157 ++++++++++++++++++++++++++++++++++++--------------- version.txt | 2 +- 3 files changed, 141 insertions(+), 71 deletions(-) diff --git a/main.py b/main.py index b9d6207..3e10eca 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from argparse import ArgumentParser from minesquid import MineSquid, ZeroSelector, Restart from tkinter import messagebox as msg +from colorama import Fore parser = ArgumentParser(description='Привет!') group1 = parser.add_mutually_exclusive_group() @@ -19,37 +20,37 @@ group1.add_argument("--restore", default=0, nargs='?', const=1, help="используйте --restore, чтобы восстановить бэкап") args = parser.parse_args() -program_version = "2.22" -ok = MineSquid(program_version) -logging = ok.logging +program_version = "2.23" +program = MineSquid(program_version) +logging = program.logging while True: try: - ok.setup_logger() + program.setup_logger() logging.info(f'Версия программы: {program_version}') - ok.read_config() - ok.checker() - ok.build_list() - logging.info(f'Путь к программе: {ok.program_directory}') - logging.info(f'Путь к игре: {ok.game_directory}') - logging.info(f'Путь к папке с пользовательскими данными: {ok.userappdata}') - if (int(args.mpnum) != 0 and int(args.mpnum) > 0) and int(args.mpnum) < len(ok.list)+1: - ok.load_modpack(modpack_number=(int(args.mpnum) - 1)) - elif str(args.mpname) in ok.list: - ok.load_modpack(modpack_number=ok.list.index(args.mpname)) + program.read_config() + program.checker() + program.build_list() + logging.info(f'Путь к программе: {program.program_directory}') + logging.info(f'Путь к игре: {program.game_directory}') + logging.info(f'Путь к папке с пользовательскими данными: {program.userappdata}') + if (int(args.mpnum) != 0 and int(args.mpnum) > 0) and int(args.mpnum) < len(program.list)+1: + program.load_modpack(modpack_number=(int(args.mpnum) - 1)) + elif str(args.mpname) in program.list: + program.load_modpack(modpack_number=program.list.index(args.mpname)) else: if args.restore != 0: - ok.restore_backup() + program.restore_backup() else: - ok.run() + program.run() except KeyError as err: logging.error("KeyError") logging.exception(err) - ok.repair_config() + program.repair_config() except IndexError as err: logging.error("IndexError") logging.exception(err) - print("неверное значение\nперезапуск") - ok.error() + print(Fore.RED + f"Неверное значение!{Fore.MAGENTA}\nПерезапуск") + program.error() except PermissionError as err: logging.error("PermissionError") logging.exception(err) @@ -60,19 +61,19 @@ exit() except ZeroSelector: logging.error("ZeroSelector") - print("неверное значение\nперезапуск") - ok.error() + print(Fore.RED + f"Неверное значение!{Fore.MAGENTA}\nПерезапуск") + program.error() except ValueError as err: logging.error("ValueError") logging.exception(err) - print("неверное значение\nперезапуск") - ok.error() + print(Fore.RED + f"Неверное значение!{Fore.MAGENTA}\nПерезапуск") + program.error() except FileNotFoundError as err: logging.error("FileNotFoundError") logging.exception(err) logging.error("FileNotFoundError, запуск чекера") - ok.checker() - ok.finish() + program.checker() + program.finish() except Restart: print("Перезапуск...") logging.info("Программа перезапускается...") @@ -81,7 +82,7 @@ except Exception as err: system("cls") logging.error("Неизвестная ошибка!!") - print("Неизвестная ошибка, смотри логи") + print(Fore.RED + f"Неизвестная ошибка, смотри {Fore.MAGENTA}логи") logging.exception(err) time.sleep(7) break diff --git a/minesquid.py b/minesquid.py index 8fca02b..bf226d5 100644 --- a/minesquid.py +++ b/minesquid.py @@ -3,7 +3,7 @@ import logging import os from sys import exit, argv -from shutil import rmtree, copy +from shutil import rmtree, copy, copytree from time import sleep from progress.bar import Bar from datetime import datetime @@ -11,6 +11,7 @@ from tkinter import filedialog import requests from subprocess import Popen +from colorama import Fore, init class ZeroSelector(Exception): @@ -21,6 +22,10 @@ class Restart(Exception): pass +class DiskRoot(Exception): + pass + + class MineSquid: def __init__(self, version): self.username = os.getlogin() @@ -33,6 +38,7 @@ def __init__(self, version): self.userappdata = f'{os.environ["appdata"]}\\mineSquid' self.config = ConfigParser() self.logging = logging + init(autoreset=True) # noinspection PyGlobalUndefined @staticmethod @@ -42,20 +48,49 @@ def error(): @staticmethod def finish(): - print("завершение работы...") + print(Fore.RED + "Завершение работы...") sleep(0.5) logging.info("Работа программы завершена") exit() + def settings(self): + logging.info('Открыты настройки') + print('1 - изменить путь к папке с игрой\n2 - изменить имя пользователя, ' + 'отображаемое в программе\n3 - выход\n*') + input1 = input("Выберите настройку: ") + if str(input1) == '1': + logging.info('Начат процесс изменения пути к папке с игрой') + self.edit_config('options', 'game_path', self.enter_path()) + time.sleep(0.5) + elif str(input1) == '2': + logging.info('Начат процесс изменения пользовательского никнейма') + username = input('Введите новое имя пользователя(default - сбросить имя): ') + if username != 'default': + self.edit_config('options', 'custom_username', username) + else: + self.edit_config('options', 'custom_username', 'default') + time.sleep(0.5) + elif str(input1) == '3': + logging.info('Выход из настроек...') + time.sleep(0.5) + else: + print('Неизвестный параметр') + time.sleep(0.5) + def enter_path(self): while True: path = filedialog.askdirectory(initialdir=f'{os.environ["appdata"]}\\.minecraft') - if path != '': - return path - else: + if path == '': print("Редактирование отменено") time.sleep(1) return self.game_directory + elif path.replace('\\', '').replace('/', '') == path[:2]: + logging.warning('Пользователь попытался выбрать корень диска в качестве пути к игре!') + logging.info(f'Пользователь выбрал {path}') + print(Fore.RED + 'Похоже, в качестве директории игры выбран корень диска\nВ целях безопасности ' + f'данных так делать нельзя\n{Fore.MAGENTA}Пожалуйста, выберите другой путь') + else: + return path def setup_logger(self): if not os.path.exists(f"{self.userappdata}\\logs"): @@ -78,18 +113,23 @@ def read_config(self): logging.error("Не найден config.ini!, Запуск repair_config`а") self.repair_config() raise Restart - self.config.read(f"{self.userappdata}\\config.ini") + self.config.read(f"{self.userappdata}\\config.ini", encoding="windows-1251") game_directory = self.config['options']['game_path'].replace('"', '').replace('/', '\\') custom_username = self.config['options']['custom_username'] logging.info("Конфиг прочитан") if game_directory == "default" and os.path.exists(f'{os.environ["appdata"]}\\.minecraft'): self.game_directory = f'{os.environ["appdata"]}\\.minecraft' elif os.path.exists(game_directory): - self.game_directory = game_directory + if game_directory.replace('\\', '').replace('/', '') == game_directory[:2]: + print(Fore.RED+'Похоже, в качестве директории игры выбран корень диска\nВ целях безопасности ' + f'данных так делать нельзя\n{Fore.MAGENTA}Пожалуйста, выберите другой путь') + self.edit_config('options', 'game_path', self.enter_path()) + else: + self.game_directory = game_directory else: pass if custom_username == 'default': - pass + self.username = os.getlogin() else: self.username = custom_username logging.info("Конфиг обработан") @@ -113,7 +153,7 @@ def checker(self): msg.showwarning(title="Ошибка", message="Не удалось создать папку mods в корне игры, похоже, указан неверный путь!" f"\nПроверьте путь к папке с игрой: {self.game_directory}") - self.edit_config() + self.edit_config('options', 'game_path', self.enter_path()) raise Restart if not os.path.exists(f"{self.userappdata}/modpacks"): logging.warning("Отсутствует хранилище модпаков:-(") @@ -129,9 +169,9 @@ def checker(self): def ui(self): logging.info("UI запущен") - print(f"Привет, {self.username}!") - print("Версия программы: " + self.version) - print(f'Путь к папке с игрой: {self.game_directory}') + print(f"Привет, {Fore.RED + self.username}!") + print("Версия программы: " + Fore.GREEN + self.version) + print(f'Путь к папке с игрой: {Fore.CYAN+self.game_directory}') print("Список модпаков: ") print("*") counter = 1 @@ -147,7 +187,7 @@ def ui(self): print(str(counter) + ". " + str(ver)) counter += 1 print("*") - print("re - восстановление бэкапа\nset - изменить путь к папке с игрой\nupd - обновление программы" + print("re - восстановление бэкапа\nset - открыть настройки\nupd - обновление программы" "\n? - открыть readME\nq - выход") logging.info(f"Количество модпаков: {int(counter) - 1}") logging.info("Ждем выбора модпака пользователем...") @@ -155,9 +195,9 @@ def ui(self): if selector == "re": self.restore_backup() elif selector == "set": - print("Редактирование конфига...") - logging.info("Введена команда set, начат процесс изменения пути к папке с игрой...") - self.edit_config() + print("Открытие настроек...\n*") + logging.info("Введена команда set, открыты настройки...") + self.settings() raise Restart elif selector == "upd": logging.info('Пользователь ввел upd') @@ -183,13 +223,13 @@ def build_list(self): os.chdir(f"{self.userappdata}\\modpacks") self.list = [e for e in os.listdir() if os.path.isdir(e)] else: - self.list = ["Папка с игрой не назначена", "Модпаки недоступны", "Для выбора папки введите set"] + self.list = ["Папка с игрой не назначена", "Модпаки недоступны", Fore.RED + "Для выбора папки введите set"] logging.info("Составлен список модпаков") - def edit_config(self): + def edit_config(self, section, option, what): logging.info('Запущен edit_config') logging.info("Начато редактирование config файла") - self.config.set("options", "game_path", self.enter_path()) + self.config.set(section, option, what) with open(f"{self.userappdata}\\config.ini", "w") as f: self.config.write(f) logging.info('Конфиг отредактирован успешно') @@ -205,7 +245,7 @@ def repair_config(self): self.config.set("options", "game_path", "default") self.config.set("options", "custom_username", "default") self.config.write(cfg) - self.edit_config() + self.edit_config('options', 'game_path', self.enter_path()) logging.info('Конфиг восстановлен') def load_modpack(self, modpack_number): @@ -213,32 +253,49 @@ def load_modpack(self, modpack_number): self.user_choice = self.list[modpack_number] fileslist1 = os.listdir(f"{self.userappdata}\\modpacks\\{self.user_choice}") fileslist2 = os.listdir(f"{self.game_directory}\\mods") - print("Выбрана версия " + self.user_choice) - print("работаю..") + print("Выбрана версия " + Fore.GREEN + self.user_choice) + print(Fore.RED + "Работаю...") logging.info("Начата работа над модпаком...") - pb1 = Bar("Резервное коп-е", max=len(fileslist2), fill='@') - for file in os.listdir(f'{self.userappdata}\\backup'): - os.remove(f'{self.userappdata}\\backup\\{file}') - logging.info("Удален текущий бэкап") - for file in fileslist2: - copy(src=f"{self.game_directory}\\mods\\{file}", dst=f"{self.userappdata}\\backup") - pb1.next() - logging.info("Сделан бэкап текущих модов") - pb1.finish() - pb2 = Bar("Выполнение", max=len(fileslist1)+1, fill='@') + if len(fileslist2) > 1: + pb1 = Bar(Fore.LIGHTMAGENTA_EX + "Резервное коп-е" + Fore.CYAN, max=len(fileslist2), fill=Fore.GREEN + '@' + Fore.CYAN) + for file in os.listdir(f'{self.userappdata}\\backup'): + if os.path.isfile(f'{self.userappdata}\\backup\\{file}'): + os.remove(f'{self.userappdata}\\backup\\{file}') + else: + rmtree(f'{self.userappdata}\\backup\\{file}') + logging.info("Удален текущий бэкап") + for file in fileslist2: + if os.path.isdir(f"{self.game_directory}\\mods\\{file}"): + copytree(f"{self.game_directory}\\mods\\{file}", + f"{self.userappdata}\\backup\\{file}", dirs_exist_ok=True) + else: + copy(src=f"{self.game_directory}\\mods\\{file}", dst=f"{self.userappdata}\\backup") + pb1.next() + logging.info("Сделан бэкап текущих модов") + pb1.finish() + else: + logging.info('Папка модов пуста, бэкапить нечего') + pb2 = Bar(Fore.LIGHTMAGENTA_EX + "Выполнение" + Fore.CYAN, max=len(fileslist1) + 1, fill=Fore.GREEN + '@' + Fore.CYAN) for file in os.listdir(f"{self.game_directory}\\mods\\"): - os.remove(f"{self.game_directory}\\mods\\{file}") + if os.path.isfile(f"{self.game_directory}\\mods\\{file}"): + os.remove(f"{self.game_directory}\\mods\\{file}") + else: + rmtree(f"{self.game_directory}\\mods\\{file}") logging.info("Папка mods очищена") pb2.next() for file in fileslist1: - copy(src=f"{self.userappdata}\\modpacks\\{self.user_choice}\\{file}", - dst=f"{self.game_directory}\\mods") + if os.path.isdir(f"{self.userappdata}\\modpacks\\{self.user_choice}\\{file}"): + copytree(f"{self.userappdata}\\modpacks\\{self.user_choice}\\{file}", + f"{self.game_directory}\\mods\\{file}", dirs_exist_ok=True) + else: + copy(src=f"{self.userappdata}\\modpacks\\{self.user_choice}\\{file}", + dst=f"{self.game_directory}\\mods") pb2.next() # copytree(f"{self.userappdata}\\modpacks\\{self.user_choice}", f"{self.game_directory}\\mods\\") logging.info("Модпак скопирован в папку mods") logging.info("ГОТОВО!") pb2.finish() - print("готово") + print(Fore.GREEN + "Готово") self.finish() else: print("Папка с игрой не указана!") @@ -255,26 +312,38 @@ def restore_backup(self): fileslist = os.listdir(f"{self.game_directory}\\mods") fileslist2 = os.listdir(f'{self.userappdata}\\backup') bob = False + print(Fore.RED + "Работаю...") logging.info("Пользователь запустил восстановление бэкапа") - if os.path.exists(f"{self.game_directory}\\mods"): - pb1 = Bar("Резервное коп-е", max=len(fileslist), fill='@') + if os.path.exists(f"{self.game_directory}\\mods") and len(os.listdir(f"{self.game_directory}\\mods")): + pb1 = Bar(Fore.LIGHTMAGENTA_EX + "Резервное коп-е" + Fore.CYAN, max=len(fileslist), fill=Fore.GREEN + '@' + Fore.CYAN) bob = True if not os.path.exists(f"{self.userappdata}\\bob\\"): os.mkdir(f"{self.userappdata}\\bob\\") # copytree(f"{self.game_directory}\\mods", f"{self.userappdata}\\bob", dirs_exist_ok=True) for file in fileslist: - copy(f"{self.game_directory}\\mods\\{file}", f"{self.userappdata}\\bob\\") + if os.path.isdir(f"{self.game_directory}\\mods\\{file}"): + copytree(f"{self.game_directory}\\mods\\{file}", + f"{self.userappdata}\\bob\\{file}", dirs_exist_ok=True) + else: + copy(f"{self.game_directory}\\mods\\{file}", f"{self.userappdata}\\bob\\") pb1.next() logging.info("Бэкап сделан перед восстановлением бэкапа)") - for file in os.listdir(f'{self.game_directory}\\mods'): - os.remove(f'{self.game_directory}\\mods\\{file}') + for file in os.listdir(f"{self.game_directory}\\mods\\"): + if os.path.isfile(f"{self.game_directory}\\mods\\{file}"): + os.remove(f"{self.game_directory}\\mods\\{file}") + else: + rmtree(f"{self.game_directory}\\mods\\{file}") logging.info("Папка mods очищена") pb1.finish() else: pass - pb2 = Bar('Восстановление', max=len(fileslist2)+2, fill='@') + pb2 = Bar(Fore.LIGHTMAGENTA_EX + "Восстановление" + Fore.CYAN, max=len(fileslist2), fill=Fore.GREEN + '@' + Fore.CYAN) for file in fileslist2: - copy(f'{self.userappdata}\\backup\\{file}', f'{self.game_directory}\\mods') + if os.path.isfile(f'{self.userappdata}\\backup\\{file}'): + copy(f'{self.userappdata}\\backup\\{file}', f'{self.game_directory}\\mods') + else: + copytree(f'{self.userappdata}\\backup\\{file}', + f'{self.game_directory}\\mods\\{file}', dirs_exist_ok=True) pb2.next() # copytree(f"{self.userappdata}\\backup", f"{self.game_directory}\\mods\\") pb2.next() @@ -286,7 +355,7 @@ def restore_backup(self): logging.info("Бэкап восстановлен") pb2.next() pb2.finish() - print("Бэкап восстановлен") + print(Fore.GREEN + "Бэкап восстановлен") self.finish() else: print("Папка с игрой не указана!") diff --git a/version.txt b/version.txt index 72ee782..8f14589 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.22 \ No newline at end of file +2.23 \ No newline at end of file