diff --git a/.gitignore b/.gitignore index fefd511..ce12201 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.log modules/__pycache__ +*.idea +app.log +.gigaide \ No newline at end of file diff --git a/modules/clear_db.py b/modules/clear_db.py new file mode 100644 index 0000000..f7d85bd --- /dev/null +++ b/modules/clear_db.py @@ -0,0 +1,72 @@ +import os +import glob +import re + +from .log import * + +def main_clear_db(): + base_dir = os.path.dirname(os.path.realpath(__file__)) + portwine_db_path = os.path.join(base_dir, 'portwine_db') + os.makedirs(portwine_db_path, exist_ok=True) + + for filename in glob.glob(os.path.join(portwine_db_path, '*')): # Установка разрешений на файлы + os.chmod(filename, 0o644) + + duplicate_finder = {} #Поиск дубликатов в файлах + for filename in glob.glob(os.path.join(portwine_db_path, '*')): + with open(filename, 'r') as file: + lines = file.readlines() + for line in lines: + if '.exe' in line and '#' in line: + line = line.strip() + if line not in duplicate_finder: + duplicate_finder[line] = [] + duplicate_finder[line].append(filename) + + duplicates = {line: files for line, files in duplicate_finder.items() if len(files) > 1} + if duplicates: + log.warning("Обнаружены дубликаты в файлах:") + for line, files in duplicates.items(): + for file in files: + log.info(f"{file.split('portwine_db/')[1]} содержит дубликат: {line}") + exit(1) + + + for ppdb in glob.glob(os.path.join(portwine_db_path, '*')): # Обработка каждого файла + log.debug(ppdb) + + with open(ppdb, 'r') as file: # Удаление определённых строк + lines = file.readlines() + + lines = [line for line in lines if not line.startswith(('##export', '##add_'))] + lines = [line for line in lines if not ( + re.search(r'MANGOHUD|FPS_LIMIT|VKBASALT|_RAY_TRACING|_DLSS|PW_GUI_DISABLED_CS|PW_USE_GAMEMODE|' + r'PW_USE_SYSTEM_VK_LAYERS|PW_DISABLE_COMPOSITING|PW_USE_EAC_AND_BE|PW_USE_OBS_VKCAPTURE|' + r'GAMESCOPE|PW_GS', line) + )] + + if any(re.search(r'PW_USE_DGVOODOO2="0"|PW_DGVOODOO2="0"', line) for line in lines): + lines = [line for line in lines if not re.search(r'PW_USE_DGVOODOO2|PW_DGV', line)] + + + lines = [re.sub(r'export PW_WINE_USE=.*', 'export PW_WINE_USE="WINE_LG"', line) + if 'PW_WINE_USE="WINE_LG' in line else line for line in lines] + lines = [re.sub(r'export PW_WINE_USE=.*', 'export PW_WINE_USE="PROTON_LG"', line) + if 'PW_WINE_USE="PROTON_LG' in line else line for line in lines] + + with open(ppdb, 'w') as file: # Сохранение изменений + file.writelines(lines) + + ppdb_base = os.path.basename(ppdb) # Переименование файлов + if ppdb_base.endswith('.exe.ppdb'): + new_name = f"{ppdb_base[:-9]}.ppdb" + os.rename(ppdb, os.path.join(portwine_db_path, new_name)) + elif ppdb_base.endswith('.EXE.ppdb'): + new_name = f"{ppdb_base[:-9]}.ppdb" + os.rename(ppdb, os.path.join(portwine_db_path, new_name)) + elif not ppdb_base.endswith('.ppdb'): + new_name = f"{ppdb_base}.ppdb" + os.rename(ppdb, os.path.join(portwine_db_path, new_name)) + + log.info("ГОТОВО!") + exit(0) diff --git a/modules/downloader.py b/modules/downloader.py index a351811..d21e050 100755 --- a/modules/downloader.py +++ b/modules/downloader.py @@ -6,7 +6,7 @@ from .files_worker import * def try_download(url, save_path=None): """ - Скачивает файл по указанному URL с отображением прогресса. + Скачивает файл по-указанному URL с отображением прогресса. :param url: URL файла для скачивания. :param save_path: Путь для сохранения файла. Если None или директория, то используется имя файла из URL. diff --git a/modules/files_worker.py b/modules/files_worker.py index a97eef4..d683c81 100755 --- a/modules/files_worker.py +++ b/modules/files_worker.py @@ -31,10 +31,10 @@ def try_force_link_file(source, link): os.symlink(source, link) except Exception as e: - print(f"failed to create link for file: {e}") + log.error(f"failed to create link for file: {e}") -def try_remove_file(path): +def try_remove_file(file_path): if os.path.exists(file_path) and os.path.isfile(file_path): try: os.remove(file_path) @@ -59,10 +59,10 @@ def try_force_link_dir(path, link): os.symlink(path, link) except Exception as e: - print(f"failed to create link for file: {e}") + log.error(f"failed to create link for file: {e}") def try_remove_dir(path): - if os.path.exist(path) and os.path.isdir(path): + if os.path.exists(path) and os.path.isdir(path): try: shutil.rmtree(path) except Exception as e: @@ -73,7 +73,7 @@ def unpack(archive_path, extract_to=None): if extract_to is None: # TODO: перенести распаковку по умолчанию в tmp extract_to = os.path.dirname(archive_path) - elif not os.exists.isdir(extract_to): + elif not os.path.isdir(extract_to): create_new_dir(extract_to) with tarfile.open(archive_path, mode="r:*") as tar: diff --git a/modules/log.py b/modules/log.py index 91a5a24..beb9fef 100755 --- a/modules/log.py +++ b/modules/log.py @@ -2,8 +2,7 @@ import logging import sys class ColoredFormatter(logging.Formatter): - # ANSI escape sequences for colors - COLORS = { + COLORS = { # ANSI escape sequences for colors 'DEBUG': '\033[35m', # Purple 'INFO': '\033[36m', # Green 'WARNING': '\033[33m', # Yellow @@ -21,19 +20,33 @@ class ColoredFormatter(logging.Formatter): sys.exit(1) return formatted_message -# Настраиваем логирование -log = logging.getLogger() -# TODO: добавить case с переменной для управление уровнем -log.setLevel(logging.DEBUG) -# Создаем консольный обработчик -handler = logging.StreamHandler() +log = logging.getLogger() # Настраиваем логирование +def set_logging_level(level_string): + levels = { + 'DEBUG': logging.DEBUG, + 'INFO': logging.INFO, + 'WARNING': logging.WARNING, + 'ERROR': logging.ERROR, + 'CRITICAL': logging.CRITICAL + } + + level = levels.get(level_string, logging.WARNING) # Уровень по умолчанию + if level == logging.WARNING: + print(f"Неизвестный уровень логирования: {level_string}. Устанавливается уровень WARNING.") + return level + + +log_level_input = 'DEBUG' # Задаем уровень логирования через функцию +log.setLevel(set_logging_level(log_level_input)) + +handler = logging.StreamHandler() # Создаем консольный обработчик handler.setFormatter(ColoredFormatter('%(levelname)s: %(message)s')) -# Создаем файловый обработчик -# TODO: добавить условие для управления перемееной пути сохранения лога -file_handler = logging.FileHandler('app.log') +# TODO: добавить условие для управления переменой пути сохранения лога +log_file_path = 'app.log' # Это может быть переменная, установленная пользователем +file_handler = logging.FileHandler(log_file_path) # Создаем файловый обработчик file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s: %(message)s')) -log.addHandler(file_handler) +log.addHandler(file_handler) log.addHandler(handler) diff --git a/test.py b/test.py index 38810bf..a9ee8ad 100755 --- a/test.py +++ b/test.py @@ -6,5 +6,8 @@ from modules.files_worker import * from modules.downloader import * if __name__ == "__main__": - + log.debug("Привет мир!") log.info("Привет мир!") + log.warning("Привет мир!") + log.error("Привет мир!") + log.critical("Привет мир!") \ No newline at end of file