diff --git a/src-python/config.py b/src-python/config.py index 8fab754e..d74afb5e 100644 --- a/src-python/config.py +++ b/src-python/config.py @@ -3,7 +3,7 @@ import inspect from os import path as os_path, makedirs as os_makedirs from json import load as json_load from json import dump as json_dump - +import threading from device_manager import device_manager from models.transcription.transcription_languages import transcription_lang from utils import isUniqueStrings @@ -15,15 +15,11 @@ def json_serializable(var_name): return func return decorator -def saveJson(path, key, value): - with open(path, "r", encoding="utf-8") as fp: - json_data = json_load(fp) - json_data[key] = value - with open(path, "w", encoding="utf-8") as fp: - json_dump(json_data, fp, indent=4, ensure_ascii=False) - class Config: _instance = None + config_data = {} + timer = None + debounce_time = 2 def __new__(cls): if cls._instance is None: @@ -32,6 +28,19 @@ class Config: cls._instance.load_config() return cls._instance + def saveConfigToFile(self): + with open(self.PATH_CONFIG, "w", encoding="utf-8") as fp: + json_dump(self.config_data, fp, indent=4, ensure_ascii=False) + + def saveConfig(self, key, value): + self.config_data[key] = value + + if isinstance(self.timer, threading.Timer) and self.timer.is_alive(): + self.timer.cancel() + timer = threading.Timer(self.debounce_time, self.saveConfigToFile) + timer.daemon = True + timer.start() + # Read Only @property def VERSION(self): @@ -224,7 +233,7 @@ class Config: def SELECTED_TAB_NO(self, value): if isinstance(value, str): self._SELECTED_TAB_NO = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TRANSLATION_ENGINES') @@ -235,7 +244,7 @@ class Config: def SELECTED_TRANSLATION_ENGINES(self, value): if isinstance(value, dict): self._SELECTED_TRANSLATION_ENGINES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_YOUR_LANGUAGES') @@ -256,7 +265,7 @@ class Config: self._SELECTED_YOUR_LANGUAGES = value except Exception: pass - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TARGET_LANGUAGES') @@ -277,7 +286,7 @@ class Config: self._SELECTED_TARGET_LANGUAGES = value except Exception: pass - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TRANSCRIPTION_ENGINE') @@ -288,7 +297,7 @@ class Config: def SELECTED_TRANSCRIPTION_ENGINE(self, value): if isinstance(value, str): self._SELECTED_TRANSCRIPTION_ENGINE = value - # saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + # self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MULTI_LANGUAGE_TRANSLATION') @@ -299,7 +308,7 @@ class Config: def MULTI_LANGUAGE_TRANSLATION(self, value): if isinstance(value, bool): self._MULTI_LANGUAGE_TRANSLATION = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('CONVERT_MESSAGE_TO_ROMAJI') @@ -310,7 +319,7 @@ class Config: def CONVERT_MESSAGE_TO_ROMAJI(self, value): if isinstance(value, bool): self._CONVERT_MESSAGE_TO_ROMAJI = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('CONVERT_MESSAGE_TO_HIRAGANA') @@ -321,7 +330,7 @@ class Config: def CONVERT_MESSAGE_TO_HIRAGANA(self, value): if isinstance(value, bool): self._CONVERT_MESSAGE_TO_HIRAGANA = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MAIN_WINDOW_SIDEBAR_COMPACT_MODE') @@ -332,7 +341,7 @@ class Config: def MAIN_WINDOW_SIDEBAR_COMPACT_MODE(self, value): if isinstance(value, bool): self._MAIN_WINDOW_SIDEBAR_COMPACT_MODE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) ## Config Window @property @@ -344,7 +353,7 @@ class Config: def TRANSPARENCY(self, value): if isinstance(value, int): self._TRANSPARENCY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('APPEARANCE_THEME') @@ -355,7 +364,7 @@ class Config: def APPEARANCE_THEME(self, value): if value in self.APPEARANCE_THEME_LIST: self._APPEARANCE_THEME = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('UI_SCALING') @@ -366,7 +375,7 @@ class Config: def UI_SCALING(self, value): if isinstance(value, int): self._UI_SCALING = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('TEXTBOX_UI_SCALING') @@ -377,7 +386,7 @@ class Config: def TEXTBOX_UI_SCALING(self, value): if isinstance(value, int): self._TEXTBOX_UI_SCALING = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MESSAGE_BOX_RATIO') @@ -388,7 +397,7 @@ class Config: def MESSAGE_BOX_RATIO(self, value): if isinstance(value, (int, float)): self._MESSAGE_BOX_RATIO = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('FONT_FAMILY') @@ -399,7 +408,7 @@ class Config: def FONT_FAMILY(self, value): if isinstance(value, str): self._FONT_FAMILY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('UI_LANGUAGE') @@ -410,7 +419,7 @@ class Config: def UI_LANGUAGE(self, value): if isinstance(value, str): self._UI_LANGUAGE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('RESTORE_MAIN_WINDOW_GEOMETRY') @@ -421,7 +430,7 @@ class Config: def RESTORE_MAIN_WINDOW_GEOMETRY(self, value): if isinstance(value, bool): self._RESTORE_MAIN_WINDOW_GEOMETRY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MAIN_WINDOW_GEOMETRY') @@ -434,7 +443,7 @@ class Config: for key, value in value.items(): if isinstance(value, int): self._MAIN_WINDOW_GEOMETRY[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.MAIN_WINDOW_GEOMETRY) + self.saveConfig(inspect.currentframe().f_code.co_name, self.MAIN_WINDOW_GEOMETRY) @property @json_serializable('AUTO_MIC_SELECT') @@ -445,7 +454,7 @@ class Config: def AUTO_MIC_SELECT(self, value): if isinstance(value, bool): self._AUTO_MIC_SELECT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_MIC_HOST') @@ -456,7 +465,7 @@ class Config: def SELECTED_MIC_HOST(self, value): if value in [host for host in device_manager.getMicDevices().keys()]: self._SELECTED_MIC_HOST = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_MIC_DEVICE') @@ -467,7 +476,7 @@ class Config: def SELECTED_MIC_DEVICE(self, value): if value in [device["name"] for device in device_manager.getMicDevices()[self.SELECTED_MIC_HOST]]: self._SELECTED_MIC_DEVICE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_THRESHOLD') @@ -478,7 +487,7 @@ class Config: def MIC_THRESHOLD(self, value): if isinstance(value, int): self._MIC_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_AUTOMATIC_THRESHOLD') @@ -489,7 +498,7 @@ class Config: def MIC_AUTOMATIC_THRESHOLD(self, value): if isinstance(value, bool): self._MIC_AUTOMATIC_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_RECORD_TIMEOUT') @@ -500,7 +509,7 @@ class Config: def MIC_RECORD_TIMEOUT(self, value): if isinstance(value, int): self._MIC_RECORD_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_PHRASE_TIMEOUT') @@ -511,7 +520,7 @@ class Config: def MIC_PHRASE_TIMEOUT(self, value): if isinstance(value, int): self._MIC_PHRASE_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_MAX_PHRASES') @@ -522,7 +531,7 @@ class Config: def MIC_MAX_PHRASES(self, value): if isinstance(value, int): self._MIC_MAX_PHRASES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_WORD_FILTER') @@ -533,7 +542,7 @@ class Config: def MIC_WORD_FILTER(self, value): if isinstance(value, list): self._MIC_WORD_FILTER = sorted(set(value), key=value.index) - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_AVG_LOGPROB') @@ -544,7 +553,7 @@ class Config: def MIC_AVG_LOGPROB(self, value): if isinstance(value, (int, float)): self._MIC_AVG_LOGPROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('MIC_NO_SPEECH_PROB') @@ -555,7 +564,7 @@ class Config: def MIC_NO_SPEECH_PROB(self, value): if isinstance(value, (int, float)): self._MIC_NO_SPEECH_PROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('AUTO_SPEAKER_SELECT') @@ -566,7 +575,7 @@ class Config: def AUTO_SPEAKER_SELECT(self, value): if isinstance(value, bool): self._AUTO_SPEAKER_SELECT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_SPEAKER_DEVICE') @@ -577,7 +586,7 @@ class Config: def SELECTED_SPEAKER_DEVICE(self, value): if value in [device["name"] for device in device_manager.getSpeakerDevices()]: self._SELECTED_SPEAKER_DEVICE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_THRESHOLD') @@ -588,7 +597,7 @@ class Config: def SPEAKER_THRESHOLD(self, value): if isinstance(value, int): self._SPEAKER_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_AUTOMATIC_THRESHOLD') @@ -599,7 +608,7 @@ class Config: def SPEAKER_AUTOMATIC_THRESHOLD(self, value): if isinstance(value, bool): self._SPEAKER_AUTOMATIC_THRESHOLD = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_RECORD_TIMEOUT') @@ -610,7 +619,7 @@ class Config: def SPEAKER_RECORD_TIMEOUT(self, value): if isinstance(value, int): self._SPEAKER_RECORD_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_PHRASE_TIMEOUT') @@ -621,7 +630,7 @@ class Config: def SPEAKER_PHRASE_TIMEOUT(self, value): if isinstance(value, int): self._SPEAKER_PHRASE_TIMEOUT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_MAX_PHRASES') @@ -632,7 +641,7 @@ class Config: def SPEAKER_MAX_PHRASES(self, value): if isinstance(value, int): self._SPEAKER_MAX_PHRASES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_AVG_LOGPROB') @@ -643,7 +652,7 @@ class Config: def SPEAKER_AVG_LOGPROB(self, value): if isinstance(value, (int, float)): self._SPEAKER_AVG_LOGPROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SPEAKER_NO_SPEECH_PROB') @@ -654,7 +663,7 @@ class Config: def SPEAKER_NO_SPEECH_PROB(self, value): if isinstance(value, (int, float)): self._SPEAKER_NO_SPEECH_PROB = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('OSC_IP_ADDRESS') @@ -665,7 +674,7 @@ class Config: def OSC_IP_ADDRESS(self, value): if isinstance(value, str): self._OSC_IP_ADDRESS = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('OSC_PORT') @@ -676,7 +685,7 @@ class Config: def OSC_PORT(self, value): if isinstance(value, int): self._OSC_PORT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('AUTH_KEYS') @@ -689,7 +698,7 @@ class Config: for key, value in value.items(): if isinstance(value, str): self._AUTH_KEYS[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.AUTH_KEYS) + self.saveConfig(inspect.currentframe().f_code.co_name, self.AUTH_KEYS) @property @json_serializable('USE_EXCLUDE_WORDS') @@ -700,7 +709,7 @@ class Config: def USE_EXCLUDE_WORDS(self, value): if isinstance(value, bool): self._USE_EXCLUDE_WORDS = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('USE_TRANSLATION_FEATURE') @@ -711,7 +720,7 @@ class Config: def USE_TRANSLATION_FEATURE(self, value): if isinstance(value, bool): self._USE_TRANSLATION_FEATURE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('USE_WHISPER_FEATURE') @@ -722,7 +731,7 @@ class Config: def USE_WHISPER_FEATURE(self, value): if isinstance(value, bool): self._USE_WHISPER_FEATURE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TRANSLATION_COMPUTE_DEVICE') @@ -733,7 +742,7 @@ class Config: def SELECTED_TRANSLATION_COMPUTE_DEVICE(self, value): if isinstance(value, dict): self._SELECTED_TRANSLATION_COMPUTE_DEVICE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TRANSCRIPTION_COMPUTE_DEVICE') @@ -744,7 +753,7 @@ class Config: def SELECTED_TRANSCRIPTION_COMPUTE_DEVICE(self, value): if isinstance(value, dict): self._SELECTED_TRANSCRIPTION_COMPUTE_DEVICE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('CTRANSLATE2_WEIGHT_TYPE') @@ -756,7 +765,7 @@ class Config: # if isinstance(value, str) and value in self.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_LIST: if isinstance(value, str): self._CTRANSLATE2_WEIGHT_TYPE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('WHISPER_WEIGHT_TYPE') @@ -767,7 +776,7 @@ class Config: def WHISPER_WEIGHT_TYPE(self, value): if isinstance(value, str): self._WHISPER_WEIGHT_TYPE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('AUTO_CLEAR_MESSAGE_BOX') @@ -778,7 +787,7 @@ class Config: def AUTO_CLEAR_MESSAGE_BOX(self, value): if isinstance(value, bool): self._AUTO_CLEAR_MESSAGE_BOX = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SEND_ONLY_TRANSLATED_MESSAGES') @@ -789,7 +798,7 @@ class Config: def SEND_ONLY_TRANSLATED_MESSAGES(self, value): if isinstance(value, bool): self._SEND_ONLY_TRANSLATED_MESSAGES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SEND_MESSAGE_BUTTON_TYPE') @@ -800,7 +809,7 @@ class Config: def SEND_MESSAGE_BUTTON_TYPE(self, value): if isinstance(value, str): self._SEND_MESSAGE_BUTTON_TYPE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('OVERLAY_SETTINGS') @@ -813,7 +822,7 @@ class Config: for key, value in value.items(): if isinstance(value, (int, float)): self._OVERLAY_SETTINGS[key] = float(value) - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.OVERLAY_SETTINGS) + self.saveConfig(inspect.currentframe().f_code.co_name, self.OVERLAY_SETTINGS) @property @json_serializable('OVERLAY_SMALL_LOG') @@ -824,7 +833,7 @@ class Config: def OVERLAY_SMALL_LOG(self, value): if isinstance(value, bool): self._OVERLAY_SMALL_LOG = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('OVERLAY_SMALL_LOG_SETTINGS') @@ -842,7 +851,7 @@ class Config: case "display_duration" | "fadeout_duration": if isinstance(value, int): self._OVERLAY_SMALL_LOG_SETTINGS[key] = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.OVERLAY_SMALL_LOG_SETTINGS) + self.saveConfig(inspect.currentframe().f_code.co_name, self.OVERLAY_SMALL_LOG_SETTINGS) @property @json_serializable('OVERLAY_UI_TYPE') @@ -853,7 +862,7 @@ class Config: def OVERLAY_UI_TYPE(self, value): if isinstance(value, str): self._OVERLAY_UI_TYPE = value - # saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + # self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SEND_MESSAGE_TO_VRC') @@ -864,7 +873,7 @@ class Config: def SEND_MESSAGE_TO_VRC(self, value): if isinstance(value, bool): self._SEND_MESSAGE_TO_VRC = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SEND_MESSAGE_FORMAT') @@ -877,7 +886,7 @@ class Config: if isUniqueStrings(["[message]"], value) is False: value = "[message]" self._SEND_MESSAGE_FORMAT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SEND_MESSAGE_FORMAT_WITH_T') @@ -890,7 +899,7 @@ class Config: if isUniqueStrings(["[message]", "[translation]"], value) is False: value = "[message]([translation])" self._SEND_MESSAGE_FORMAT_WITH_T = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('RECEIVED_MESSAGE_FORMAT') @@ -903,7 +912,7 @@ class Config: if isUniqueStrings(["[message]"], value) is False: value = "[message]" self._RECEIVED_MESSAGE_FORMAT = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('RECEIVED_MESSAGE_FORMAT_WITH_T') @@ -916,7 +925,7 @@ class Config: if isUniqueStrings(["[message]", "[translation]"], value) is False: value = "[message]([translation])" self._RECEIVED_MESSAGE_FORMAT_WITH_T = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('SEND_RECEIVED_MESSAGE_TO_VRC') @@ -927,7 +936,7 @@ class Config: def SEND_RECEIVED_MESSAGE_TO_VRC(self, value): if isinstance(value, bool): self._SEND_RECEIVED_MESSAGE_TO_VRC = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('LOGGER_FEATURE') @@ -938,7 +947,7 @@ class Config: def LOGGER_FEATURE(self, value): if isinstance(value, bool): self._LOGGER_FEATURE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) @property @json_serializable('VRC_MIC_MUTE_SYNC') @@ -949,7 +958,7 @@ class Config: def VRC_MIC_MUTE_SYNC(self, value): if isinstance(value, bool): self._VRC_MIC_MUTE_SYNC = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + self.saveConfig(inspect.currentframe().f_code.co_name, value) def init_config(self): # Read Only @@ -1161,15 +1170,16 @@ class Config: def load_config(self): if os_path.isfile(self.PATH_CONFIG) is not False: with open(self.PATH_CONFIG, 'r', encoding="utf-8") as fp: - config = json_load(fp) + if fp.readable() and fp.seek(0, 2) > 0: + fp.seek(0) + self.config_data = json_load(fp) - for key in config.keys(): - setattr(self, key, config[key]) + for key, value in self.config_data.items(): + setattr(self, key, value) with open(self.PATH_CONFIG, 'w', encoding="utf-8") as fp: - config = {} for var_name, var_func in json_serializable_vars.items(): - config[var_name] = var_func(self) - json_dump(config, fp, indent=4, ensure_ascii=False) + self.config_data[var_name] = var_func(self) + json_dump(self.config_data, fp, indent=4, ensure_ascii=False) config = Config() \ No newline at end of file