mirror of
https://github.com/RedDeadDepresso/KKAFIO.git
synced 2025-12-22 01:10:01 +00:00
refactor: logger
This commit is contained in:
@@ -2,22 +2,20 @@ import logging
|
||||
import sys
|
||||
from typing import Union
|
||||
|
||||
from app.common.signal_bus import signalBus
|
||||
|
||||
|
||||
class Logger:
|
||||
"""
|
||||
Logger class for logging
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, signalBus=None):
|
||||
"""
|
||||
:param logger_signal: Logger Box signal
|
||||
"""
|
||||
# Init logger box signal, logs and logger
|
||||
# logger box signal is used to output log to logger box
|
||||
self.logs = ""
|
||||
self.logger_signal = signalBus.loggerSignal
|
||||
self.logger_signal = signalBus.loggerSignal if signalBus else None
|
||||
self.logger = logging.getLogger("KAFFIO_Logger")
|
||||
formatter = logging.Formatter("%(levelname)s |%(category)s | %(message)s ")
|
||||
handler1 = logging.StreamHandler(stream=sys.stdout)
|
||||
@@ -29,11 +27,11 @@ class Logger:
|
||||
# Status Color: Blue, Red, Green, Orange
|
||||
self.statusColor = ['#2d8cf0', '#00c12b', '#ed3f14', '#f90', '#f90', '#f90', '#f90', '#f90']
|
||||
# Create a list with each status padded with spaces
|
||||
paddedStatus = [self.align(s) for s in self.status]
|
||||
self.paddedStatus = [self.align(s) for s in self.status]
|
||||
# Status HTML: <b style="color:$color">status</b>
|
||||
self.statusHtml = [
|
||||
f'<b style="color:{_color};">{status}</b>'
|
||||
for _color, status in zip(self.statusColor, paddedStatus)]
|
||||
for _color, status in zip(self.statusColor, self.paddedStatus)]
|
||||
|
||||
def __out__(self, category: str, message: str, level: int = 1, raw_print=False) -> None:
|
||||
"""
|
||||
@@ -53,8 +51,8 @@ class Logger:
|
||||
|
||||
# If logger box is not None, output log to logger box
|
||||
# else output log to console
|
||||
category = self.align(category)
|
||||
if self.logger_signal is not None:
|
||||
category = self.align(category)
|
||||
message = message.replace('\n', '<br>').replace(' ', ' ')
|
||||
adding = (f'''
|
||||
<div style="font-family: Consolas, monospace;color:{self.statusColor[level - 1]};">
|
||||
@@ -64,18 +62,18 @@ class Logger:
|
||||
self.logs += adding
|
||||
self.logger_signal.emit(adding)
|
||||
else:
|
||||
print(f'{self.statusHtml[level - 1]} | {category} | {message}')
|
||||
print(f'{self.paddedStatus[level - 1]} | {category} | {message}')
|
||||
|
||||
def align(self, string, maxLength=8):
|
||||
space = ' ' if self.logger_signal is not None else ' '
|
||||
space = ' '
|
||||
return f"{string}{space * (maxLength - len(string))}"
|
||||
|
||||
def colorize(self, adding):
|
||||
for i, s in enumerate(self.status):
|
||||
def colorize(self, adding: str):
|
||||
for i, s in enumerate(self.paddedStatus):
|
||||
if s in adding:
|
||||
adding = (f'''
|
||||
<div style="font-family: Consolas, monospace;color:{self.statusColor[i]};">
|
||||
{adding}
|
||||
{adding.replace(' ', ' ')}
|
||||
</div>
|
||||
''')
|
||||
self.logs += adding
|
||||
@@ -106,7 +104,7 @@ class Logger:
|
||||
"""
|
||||
self.__out__(category, message, 3)
|
||||
|
||||
def skipped(self, category: str, message: str) -> None:
|
||||
def warning(self, category: str, message: str) -> None:
|
||||
"""
|
||||
:param message: log message
|
||||
|
||||
@@ -114,7 +112,7 @@ class Logger:
|
||||
"""
|
||||
self.__out__(category, message, 4)
|
||||
|
||||
def warning(self, category: str, message: str) -> None:
|
||||
def skipped(self, category: str, message: str) -> None:
|
||||
"""
|
||||
:param message: log message
|
||||
|
||||
@@ -159,6 +157,3 @@ class Logger:
|
||||
'</div>', raw_print=True)
|
||||
else:
|
||||
print('--------------------------------------------------------------------')
|
||||
|
||||
|
||||
logger = Logger()
|
||||
|
||||
64
app/common/script_manager.py
Normal file
64
app/common/script_manager.py
Normal file
@@ -0,0 +1,64 @@
|
||||
from PySide6.QtCore import QThread, QProcess, Signal, QObject
|
||||
import os
|
||||
|
||||
class ScriptManager(QObject):
|
||||
def __init__(self, signalBus):
|
||||
super().__init__()
|
||||
self.signalBus = signalBus
|
||||
self.logger = signalBus.logger
|
||||
|
||||
self._process = None
|
||||
self._line = '--------------------------------------------------------------------'
|
||||
|
||||
self.__connectSignalToSlot()
|
||||
|
||||
def __connectSignalToSlot(self):
|
||||
self.signalBus.startSignal.connect(self.start)
|
||||
self.signalBus.stopSignal.connect(self.stop)
|
||||
|
||||
def start(self):
|
||||
if self._process is not None:
|
||||
self.stop()
|
||||
else:
|
||||
if os.path.exists("script.exe"):
|
||||
args = ["script.exe"]
|
||||
elif os.path.exists("script.py"):
|
||||
args = ["python", "script.py"]
|
||||
else:
|
||||
self.logger.error("No valid script found to execute.")
|
||||
return
|
||||
|
||||
self._process = QProcess(self)
|
||||
self._process.readyReadStandardOutput.connect(self.readOutput)
|
||||
self._process.readyReadStandardError.connect(self.readError)
|
||||
self._process.finished.connect(self.processFinished)
|
||||
|
||||
if len(args) > 1:
|
||||
self._process.start(args[0], args[1:])
|
||||
else:
|
||||
self._process.start(args[0])
|
||||
|
||||
def readOutput(self):
|
||||
if self._process is not None:
|
||||
while self._process.canReadLine():
|
||||
line = str(self._process.readLine(), encoding='utf-8').strip()
|
||||
if line == self._line:
|
||||
self.logger.line()
|
||||
else:
|
||||
self.logger.colorize(line)
|
||||
|
||||
def readError(self):
|
||||
if self._process is not None:
|
||||
while self._process.canReadLine():
|
||||
error_line = str(self._process.readLine(), encoding='utf-8').strip()
|
||||
self.logger.colorize(f"Error: {error_line}", color='red')
|
||||
|
||||
def processFinished(self):
|
||||
"""Slot called when the process finishes."""
|
||||
self.signalBus.stopSignal.emit()
|
||||
|
||||
def stop(self):
|
||||
if self._process is not None:
|
||||
self._process.terminate()
|
||||
self._process.waitForFinished()
|
||||
self._process = None
|
||||
@@ -1,7 +1,8 @@
|
||||
# coding: utf-8
|
||||
from PySide6.QtCore import QObject, Signal
|
||||
from qfluentwidgets import SettingCardGroup
|
||||
|
||||
from app.common.logger import Logger
|
||||
from app.common.script_manager import ScriptManager
|
||||
|
||||
class SignalBus(QObject):
|
||||
""" Signal bus """
|
||||
@@ -16,5 +17,10 @@ class SignalBus(QObject):
|
||||
stopSignal = Signal()
|
||||
loggerSignal = Signal(str)
|
||||
|
||||
def __init__(self, parent: QObject | None = None) -> None:
|
||||
super().__init__(parent)
|
||||
self.logger = Logger(self)
|
||||
self.scriptManager = ScriptManager(self)
|
||||
|
||||
|
||||
signalBus = SignalBus()
|
||||
@@ -1,45 +0,0 @@
|
||||
import os
|
||||
import subprocess
|
||||
import threading
|
||||
|
||||
from app.common.signal_bus import signalBus
|
||||
from app.common.logger import logger
|
||||
|
||||
|
||||
class ThreadManager:
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._script = None
|
||||
self._line = '--------------------------------------------------------------------'
|
||||
|
||||
def start(self):
|
||||
if self._script is not None:
|
||||
self.stop()
|
||||
else:
|
||||
args = []
|
||||
if os.path.exists("script.exe"):
|
||||
args = ["script.exe"]
|
||||
elif os.path.exists("script.py"):
|
||||
args = ["python", "script.py"]
|
||||
self._script = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
threading.Thread(target=self.readOutput).start()
|
||||
|
||||
def readOutput(self):
|
||||
while self._script is not None:
|
||||
line = self._script.stdout.readline().decode('utf-8')
|
||||
if not line:
|
||||
signalBus.stopSignal.emit()
|
||||
elif line == self._line:
|
||||
logger.line()
|
||||
else:
|
||||
logger.colorize(line)
|
||||
|
||||
def stop(self):
|
||||
if self._script is not None:
|
||||
self._script.terminate()
|
||||
self._script = None
|
||||
|
||||
|
||||
threadManager = ThreadManager()
|
||||
signalBus.startSignal.connect(threadManager.start)
|
||||
signalBus.stopSignal.connect(threadManager.stop)
|
||||
@@ -12,7 +12,6 @@ from .logger_interface import LoggerInterface
|
||||
from .setting_interface import SettingInterface
|
||||
from ..common.config import ZH_SUPPORT_URL, EN_SUPPORT_URL, cfg
|
||||
from ..common.signal_bus import signalBus
|
||||
from ..common.thread_manager import threadManager
|
||||
from ..common import resource
|
||||
from ..components.navigation_checkbox import NavigationCheckBox
|
||||
from ..components.navigation_action_buttons import NavigationActionButtons
|
||||
|
||||
@@ -2,7 +2,7 @@ import os
|
||||
import re as regex
|
||||
import codecs
|
||||
import shutil
|
||||
from app.common.logger import logger
|
||||
from util.logger import logger
|
||||
|
||||
class FilterConvertKKS:
|
||||
def __init__(self, config, file_manager):
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import os
|
||||
import codecs
|
||||
from app.common.logger import logger
|
||||
from util.logger import logger
|
||||
|
||||
class InstallChara:
|
||||
def __init__(self, config, file_manager):
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import os
|
||||
import codecs
|
||||
from app.common.logger import logger
|
||||
from util.logger import logger
|
||||
|
||||
|
||||
class RemoveChara:
|
||||
|
||||
@@ -5,7 +5,7 @@ try:
|
||||
pass
|
||||
|
||||
from util.config import Config
|
||||
from app.common.logger import logger
|
||||
from util.logger import logger
|
||||
from util.file_manager import FileManager
|
||||
from modules.install_chara import InstallChara
|
||||
from modules.remove_chara import RemoveChara
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
from app.common.logger import logger
|
||||
from util.logger import logger
|
||||
|
||||
class Config:
|
||||
def __init__(self, config_file):
|
||||
|
||||
@@ -5,7 +5,7 @@ import patoolib
|
||||
import customtkinter
|
||||
import subprocess
|
||||
import time
|
||||
from app.common.logger import logger
|
||||
from util.logger import logger
|
||||
|
||||
class FileManager:
|
||||
|
||||
|
||||
4
util/logger.py
Normal file
4
util/logger.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from app.common.logger import Logger
|
||||
|
||||
|
||||
logger = Logger()
|
||||
Reference in New Issue
Block a user