mirror of
https://github.com/RedDeadDepresso/KKAFIO.git
synced 2025-12-22 17:30:01 +00:00
refactor: logger
This commit is contained in:
@@ -2,22 +2,20 @@ import logging
|
|||||||
import sys
|
import sys
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
from app.common.signal_bus import signalBus
|
|
||||||
|
|
||||||
|
|
||||||
class Logger:
|
class Logger:
|
||||||
"""
|
"""
|
||||||
Logger class for logging
|
Logger class for logging
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, signalBus=None):
|
||||||
"""
|
"""
|
||||||
:param logger_signal: Logger Box signal
|
:param logger_signal: Logger Box signal
|
||||||
"""
|
"""
|
||||||
# Init logger box signal, logs and logger
|
# Init logger box signal, logs and logger
|
||||||
# logger box signal is used to output log to logger box
|
# logger box signal is used to output log to logger box
|
||||||
self.logs = ""
|
self.logs = ""
|
||||||
self.logger_signal = signalBus.loggerSignal
|
self.logger_signal = signalBus.loggerSignal if signalBus else None
|
||||||
self.logger = logging.getLogger("KAFFIO_Logger")
|
self.logger = logging.getLogger("KAFFIO_Logger")
|
||||||
formatter = logging.Formatter("%(levelname)s |%(category)s | %(message)s ")
|
formatter = logging.Formatter("%(levelname)s |%(category)s | %(message)s ")
|
||||||
handler1 = logging.StreamHandler(stream=sys.stdout)
|
handler1 = logging.StreamHandler(stream=sys.stdout)
|
||||||
@@ -29,11 +27,11 @@ class Logger:
|
|||||||
# Status Color: Blue, Red, Green, Orange
|
# Status Color: Blue, Red, Green, Orange
|
||||||
self.statusColor = ['#2d8cf0', '#00c12b', '#ed3f14', '#f90', '#f90', '#f90', '#f90', '#f90']
|
self.statusColor = ['#2d8cf0', '#00c12b', '#ed3f14', '#f90', '#f90', '#f90', '#f90', '#f90']
|
||||||
# Create a list with each status padded with spaces
|
# 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>
|
# Status HTML: <b style="color:$color">status</b>
|
||||||
self.statusHtml = [
|
self.statusHtml = [
|
||||||
f'<b style="color:{_color};">{status}</b>'
|
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:
|
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
|
# If logger box is not None, output log to logger box
|
||||||
# else output log to console
|
# else output log to console
|
||||||
if self.logger_signal is not None:
|
|
||||||
category = self.align(category)
|
category = self.align(category)
|
||||||
|
if self.logger_signal is not None:
|
||||||
message = message.replace('\n', '<br>').replace(' ', ' ')
|
message = message.replace('\n', '<br>').replace(' ', ' ')
|
||||||
adding = (f'''
|
adding = (f'''
|
||||||
<div style="font-family: Consolas, monospace;color:{self.statusColor[level - 1]};">
|
<div style="font-family: Consolas, monospace;color:{self.statusColor[level - 1]};">
|
||||||
@@ -64,18 +62,18 @@ class Logger:
|
|||||||
self.logs += adding
|
self.logs += adding
|
||||||
self.logger_signal.emit(adding)
|
self.logger_signal.emit(adding)
|
||||||
else:
|
else:
|
||||||
print(f'{self.statusHtml[level - 1]} | {category} | {message}')
|
print(f'{self.paddedStatus[level - 1]} | {category} | {message}')
|
||||||
|
|
||||||
def align(self, string, maxLength=8):
|
def align(self, string, maxLength=8):
|
||||||
space = ' ' if self.logger_signal is not None else ' '
|
space = ' '
|
||||||
return f"{string}{space * (maxLength - len(string))}"
|
return f"{string}{space * (maxLength - len(string))}"
|
||||||
|
|
||||||
def colorize(self, adding):
|
def colorize(self, adding: str):
|
||||||
for i, s in enumerate(self.status):
|
for i, s in enumerate(self.paddedStatus):
|
||||||
if s in adding:
|
if s in adding:
|
||||||
adding = (f'''
|
adding = (f'''
|
||||||
<div style="font-family: Consolas, monospace;color:{self.statusColor[i]};">
|
<div style="font-family: Consolas, monospace;color:{self.statusColor[i]};">
|
||||||
{adding}
|
{adding.replace(' ', ' ')}
|
||||||
</div>
|
</div>
|
||||||
''')
|
''')
|
||||||
self.logs += adding
|
self.logs += adding
|
||||||
@@ -106,7 +104,7 @@ class Logger:
|
|||||||
"""
|
"""
|
||||||
self.__out__(category, message, 3)
|
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
|
:param message: log message
|
||||||
|
|
||||||
@@ -114,7 +112,7 @@ class Logger:
|
|||||||
"""
|
"""
|
||||||
self.__out__(category, message, 4)
|
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
|
:param message: log message
|
||||||
|
|
||||||
@@ -159,6 +157,3 @@ class Logger:
|
|||||||
'</div>', raw_print=True)
|
'</div>', raw_print=True)
|
||||||
else:
|
else:
|
||||||
print('--------------------------------------------------------------------')
|
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
|
# coding: utf-8
|
||||||
from PySide6.QtCore import QObject, Signal
|
from PySide6.QtCore import QObject, Signal
|
||||||
from qfluentwidgets import SettingCardGroup
|
from qfluentwidgets import SettingCardGroup
|
||||||
|
from app.common.logger import Logger
|
||||||
|
from app.common.script_manager import ScriptManager
|
||||||
|
|
||||||
class SignalBus(QObject):
|
class SignalBus(QObject):
|
||||||
""" Signal bus """
|
""" Signal bus """
|
||||||
@@ -16,5 +17,10 @@ class SignalBus(QObject):
|
|||||||
stopSignal = Signal()
|
stopSignal = Signal()
|
||||||
loggerSignal = Signal(str)
|
loggerSignal = Signal(str)
|
||||||
|
|
||||||
|
def __init__(self, parent: QObject | None = None) -> None:
|
||||||
|
super().__init__(parent)
|
||||||
|
self.logger = Logger(self)
|
||||||
|
self.scriptManager = ScriptManager(self)
|
||||||
|
|
||||||
|
|
||||||
signalBus = SignalBus()
|
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 .setting_interface import SettingInterface
|
||||||
from ..common.config import ZH_SUPPORT_URL, EN_SUPPORT_URL, cfg
|
from ..common.config import ZH_SUPPORT_URL, EN_SUPPORT_URL, cfg
|
||||||
from ..common.signal_bus import signalBus
|
from ..common.signal_bus import signalBus
|
||||||
from ..common.thread_manager import threadManager
|
|
||||||
from ..common import resource
|
from ..common import resource
|
||||||
from ..components.navigation_checkbox import NavigationCheckBox
|
from ..components.navigation_checkbox import NavigationCheckBox
|
||||||
from ..components.navigation_action_buttons import NavigationActionButtons
|
from ..components.navigation_action_buttons import NavigationActionButtons
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import os
|
|||||||
import re as regex
|
import re as regex
|
||||||
import codecs
|
import codecs
|
||||||
import shutil
|
import shutil
|
||||||
from app.common.logger import logger
|
from util.logger import logger
|
||||||
|
|
||||||
class FilterConvertKKS:
|
class FilterConvertKKS:
|
||||||
def __init__(self, config, file_manager):
|
def __init__(self, config, file_manager):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import codecs
|
import codecs
|
||||||
from app.common.logger import logger
|
from util.logger import logger
|
||||||
|
|
||||||
class InstallChara:
|
class InstallChara:
|
||||||
def __init__(self, config, file_manager):
|
def __init__(self, config, file_manager):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import codecs
|
import codecs
|
||||||
from app.common.logger import logger
|
from util.logger import logger
|
||||||
|
|
||||||
|
|
||||||
class RemoveChara:
|
class RemoveChara:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ try:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
from util.config import Config
|
from util.config import Config
|
||||||
from app.common.logger import logger
|
from util.logger import logger
|
||||||
from util.file_manager import FileManager
|
from util.file_manager import FileManager
|
||||||
from modules.install_chara import InstallChara
|
from modules.install_chara import InstallChara
|
||||||
from modules.remove_chara import RemoveChara
|
from modules.remove_chara import RemoveChara
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from app.common.logger import logger
|
from util.logger import logger
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
def __init__(self, config_file):
|
def __init__(self, config_file):
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import patoolib
|
|||||||
import customtkinter
|
import customtkinter
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
from app.common.logger import logger
|
from util.logger import logger
|
||||||
|
|
||||||
class FileManager:
|
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