diff --git a/OlivOS/bootAPI.py b/OlivOS/bootAPI.py index ae465357..5e9481ff 100644 --- a/OlivOS/bootAPI.py +++ b/OlivOS/bootAPI.py @@ -132,7 +132,9 @@ def start(self): if 'auto' == tmp_proc_mode_raw: tmp_proc_mode = 'threading' if basic_conf_models_this['enable']: - if basic_conf_models_this['type'] == 'logger': + if basic_conf_models_this['type'] == 'sleep': + time.sleep(10) + elif basic_conf_models_this['type'] == 'logger': Proc_dict[basic_conf_models_this['name']] = OlivOS.diagnoseAPI.logger( Proc_name=basic_conf_models_this['name'], scan_interval=basic_conf_models_this['interval'], @@ -510,35 +512,18 @@ def start(self): logger_proc=Proc_dict[basic_conf_models_this['logger_proc']] ) elif basic_conf_models_this['type'] == 'gocqhttp_lib_exe_model': - if platform.system() == 'Windows': - for bot_info_key in plugin_bot_info_dict: - if plugin_bot_info_dict[bot_info_key].platform['model'] in [ - 'gocqhttp', - 'gocqhttp_hide', - 'gocqhttp_show', - 'gocqhttp_show_Android_Phone', - 'gocqhttp_show_Android_Watch', - 'gocqhttp_show_iMac', - 'gocqhttp_show_iPad', - 'gocqhttp_show_Android_Pad', - 'gocqhttp_show_old' - ]: - tmp_Proc_name = basic_conf_models_this['name'] + '=' + bot_info_key - tmp_queue_name = basic_conf_models_this['rx_queue'] + '=' + bot_info_key - multiprocessing_dict[tmp_queue_name] = multiprocessing.Queue() - Proc_dict[tmp_Proc_name] = OlivOS.libEXEModelAPI.server( - Proc_name=tmp_Proc_name, - scan_interval=basic_conf_models_this['interval'], - dead_interval=basic_conf_models_this['dead_interval'], - rx_queue=multiprocessing_dict[tmp_queue_name], - tx_queue=multiprocessing_dict[basic_conf_models_this['tx_queue']], - control_queue=multiprocessing_dict[basic_conf_models_this['control_queue']], - logger_proc=Proc_dict[basic_conf_models_this['logger_proc']], - bot_info_dict=plugin_bot_info_dict[bot_info_key], - target_proc=basic_conf_models[basic_conf_models_this['target_proc']], - debug_mode=False - ) - Proc_Proc_dict[tmp_Proc_name] = Proc_dict[tmp_Proc_name].start_unity(tmp_proc_mode) + threading.Thread( + target = OlivOS.libEXEModelAPI.startGoCqhttpLibExeModel, + kwargs = { + 'plugin_bot_info_dict': plugin_bot_info_dict, + 'basic_conf_models_this': basic_conf_models_this, + 'multiprocessing_dict': multiprocessing_dict, + 'Proc_dict': Proc_dict, + 'Proc_Proc_dict': Proc_Proc_dict, + 'basic_conf_models': basic_conf_models, + 'tmp_proc_mode': tmp_proc_mode + } + ).start() elif basic_conf_models_this['type'] == 'update_get': threading.Thread(target=update_get_func, args=(Proc_dict, basic_conf_models, basic_conf_models_this)).start() diff --git a/OlivOS/bootDataAPI.py b/OlivOS/bootDataAPI.py index 3e04ce24..6b61ee40 100644 --- a/OlivOS/bootDataAPI.py +++ b/OlivOS/bootDataAPI.py @@ -28,6 +28,7 @@ "OlivOS_account_fix", "OlivOS_account_config_save", "OlivOS_account_config", + "OlivOS_nativeWinUIAPI", "OlivOS_gocqhttp_lib_exe_model", "OlivOS_account_config_safe", "OlivOS_plugin", @@ -40,8 +41,7 @@ "OlivOS_fanbook_poll", "OlivOS_kaiheila_link", "OlivOS_dodo_link", - "OlivOS_biliLive_link", - "OlivOS_nativeWinUIAPI" + "OlivOS_biliLive_link" ], "control_queue": "OlivOS_control_queue", "interval": 0.2, @@ -59,6 +59,12 @@ "OlivOS_biliLive_queue" ], "models": { + "OlivOS_sleep": { + "enable": True, + "name": "OlivOS_sleep", + "type": "sleep", + "logger_proc": "OlivOS_logger" + }, "OlivOS_multiLoginUI": { "enable": True, "name": "OlivOS_multiLoginUI", diff --git a/OlivOS/infoAPI.py b/OlivOS/infoAPI.py index 5e1e99e6..14c2a6eb 100644 --- a/OlivOS/infoAPI.py +++ b/OlivOS/infoAPI.py @@ -17,8 +17,8 @@ import OlivOS -OlivOS_Version = '0.11.2' -OlivOS_SVN = 122 +OlivOS_Version = '0.11.3' +OlivOS_SVN = 123 # Compatible <= Plugin[compatible_svn] : Compatible # OldCompatible <= Plugin[compatible_svn] < Compatible : OldCompatible Warn diff --git a/OlivOS/libEXEModelAPI.py b/OlivOS/libEXEModelAPI.py index 27e8096c..9203fb36 100644 --- a/OlivOS/libEXEModelAPI.py +++ b/OlivOS/libEXEModelAPI.py @@ -25,10 +25,140 @@ import random import uuid import hashlib +import platform +import shutil import OlivOS +def startGoCqhttpLibExeModel( + plugin_bot_info_dict, + basic_conf_models_this, + multiprocessing_dict, + Proc_dict, + Proc_Proc_dict, + basic_conf_models, + tmp_proc_mode +): + checkGoCqHttpExeLib(Proc_dict[basic_conf_models_this['logger_proc']]) + if platform.system() == 'Windows': + for bot_info_key in plugin_bot_info_dict: + if plugin_bot_info_dict[bot_info_key].platform['model'] in [ + 'gocqhttp', + 'gocqhttp_hide', + 'gocqhttp_show', + 'gocqhttp_show_Android_Phone', + 'gocqhttp_show_Android_Watch', + 'gocqhttp_show_iMac', + 'gocqhttp_show_iPad', + 'gocqhttp_show_Android_Pad', + 'gocqhttp_show_old' + ]: + tmp_Proc_name = basic_conf_models_this['name'] + '=' + bot_info_key + tmp_queue_name = basic_conf_models_this['rx_queue'] + '=' + bot_info_key + multiprocessing_dict[tmp_queue_name] = multiprocessing.Queue() + Proc_dict[tmp_Proc_name] = OlivOS.libEXEModelAPI.server( + Proc_name=tmp_Proc_name, + scan_interval=basic_conf_models_this['interval'], + dead_interval=basic_conf_models_this['dead_interval'], + rx_queue=multiprocessing_dict[tmp_queue_name], + tx_queue=multiprocessing_dict[basic_conf_models_this['tx_queue']], + control_queue=multiprocessing_dict[basic_conf_models_this['control_queue']], + logger_proc=Proc_dict[basic_conf_models_this['logger_proc']], + bot_info_dict=plugin_bot_info_dict[bot_info_key], + target_proc=basic_conf_models[basic_conf_models_this['target_proc']], + debug_mode=False + ) + Proc_Proc_dict[tmp_Proc_name] = Proc_dict[tmp_Proc_name].start_unity(tmp_proc_mode) + +def checkGoCqHttpExeLib(logger_proc:OlivOS.diagnoseAPI.logger): + logger = loggerGen(logger_proc) + filePath = './lib/go-cqhttp.exe' + filePathUpdate = './lib/go-cqhttp.exe.tmp' + filePathFORCESKIP = './lib/FORCESKIP' + sleepTime = 2 + architecture_num = platform.architecture()[0] + + logger(2, 'will check go-cqhttp lib after %ds ...' % (sleepTime)) + time.sleep(sleepTime) + + for i in range(1): + fMD5 = None + fMD5Update = None + flagFORCESKIP = False + flagAlreadyLatest = False + releaseDir('./lib') + fMD5 = checkFileMD5(filePath) + logger(2, 'check go-cqhttp lib [%s] md5: [%s]' % ( + filePath, + str(fMD5) + ) + ) + + flagFORCESKIP = os.path.exists(filePathFORCESKIP) + + if not flagFORCESKIP: + apiJsonData = OlivOS.updateAPI.GETHttpJson2Dict('https://api.oliva.icu/olivosver/gocqhttp/') + fMD5UpdateTarget = None + fMD5UpdateUrl = None + try: + fMD5UpdateTarget = apiJsonData['version']['go-cqhttp'][architecture_num]['md5'] + fMD5UpdateUrl = apiJsonData['version']['go-cqhttp'][architecture_num]['path'] + except: + fMD5UpdateTarget = None + if apiJsonData != None \ + and fMD5UpdateTarget != None \ + and fMD5UpdateUrl != None: + logger(2, 'check go-cqhttp lib patch target md5: [%s]' % (str(fMD5UpdateTarget))) + if fMD5UpdateTarget != fMD5: + logger(2, 'download new go-cqhttp lib ...') + if OlivOS.updateAPI.GETHttpFile(fMD5UpdateUrl, filePathUpdate): + logger(2, 'download new go-cqhttp lib done') + fMD5Update = checkFileMD5(filePathUpdate) + logger(2, 'check go-cqhttp lib patch [%s] md5: [%s]' % (filePathUpdate, str(fMD5Update))) + else: + fMD5Update = None + logger(4, 'download new go-cqhttp lib FAILED! md5 check FAILED!') + else: + flagAlreadyLatest = True + else: + logger(4, 'check go-cqhttp lib patch api FAILED! try later please!') + fMD5Update = None + + if flagAlreadyLatest: + logger(2, 'go-cqhttp lib already latest!') + elif fMD5UpdateTarget != None and fMD5Update != fMD5UpdateTarget: + logger(4, 'download go-cqhttp lib patch FAILED! try later please!') + elif fMD5Update != None and fMD5 != fMD5Update: + logger(3, 'update go-cqhttp lib patch [%s] -> [%s]' % (filePathUpdate, filePath)) + shutil.copyfile(src = filePathUpdate, dst = filePath) + os.remove(filePathUpdate) + logger(2, 'update go-cqhttp lib patch done!') + else: + logger(2, 'go-cqhttp lib already latest!') + else: + logger(3, 'go-cqhttp lib update FORCESKIP!') + + break + +def checkFileMD5(filePath): + res = None + if os.path.exists(filePath): + with open(filePath, 'rb') as fp: + fObj = fp.read() + res = hashlib.md5(fObj).hexdigest() + return res + +def loggerGen(logger_proc:'OlivOS.diagnoseAPI.logger|None'): + def logF(log_level, log_message, log_segment=None): + if type(logger_proc) is OlivOS.diagnoseAPI.logger: + logger_proc.log( + log_level=log_level, + log_message=log_message, + log_segment=log_segment + ) + return logF + class server(OlivOS.API.Proc_templet): def __init__(self, Proc_name, scan_interval=0.001, dead_interval=1, rx_queue=None, tx_queue=None, control_queue=None, logger_proc=None, target_proc=None, debug_mode=False, bot_info_dict=None): diff --git a/OlivOS/nativeWinUIAPI.py b/OlivOS/nativeWinUIAPI.py index e22380c9..922229f9 100644 --- a/OlivOS/nativeWinUIAPI.py +++ b/OlivOS/nativeWinUIAPI.py @@ -115,6 +115,7 @@ def run(self): self.UIObject['main_tk'] = tkinter.Tk() self.UIObject['main_tk'].withdraw() self.UIObject['main_tk'].iconbitmap('./resource/tmp_favoricon.ico') + self.startShallowSend() self.process_msg() self.UIObject['main_tk'].mainloop() @@ -293,7 +294,7 @@ def resFunc(): return resFunc def startGoCqhttpTerminalUISend(self, hash): - self.sendControlEventSend('send', { + self.sendRxEvent('send', { 'target': { 'type': 'nativeWinUI' }, @@ -328,7 +329,7 @@ def resFunc(): return resFunc def startVirtualTerminalUISend(self, hash): - self.sendControlEventSend('send', { + self.sendRxEvent('send', { 'target': { 'type': 'nativeWinUI' }, @@ -357,7 +358,7 @@ def startVirtualTerminalUI(self, hash): self.UIObject['root_virtual_terminal_terminal'][hash].start() def startOlivOSTerminalUISend(self): - self.sendControlEventSend('send', { + self.sendRxEvent('send', { 'target': { 'type': 'nativeWinUI' }, @@ -408,7 +409,7 @@ def setVirtualModelSend(self, hash, data): ) def startPluginEditSend(self): - self.sendControlEventSend('send', { + self.sendRxEvent('send', { 'target': { 'type': 'nativeWinUI' }, @@ -418,6 +419,16 @@ def startPluginEditSend(self): } ) + def sendRxEvent(self, action, data): + if self.Proc_info.rx_queue is not None: + self.Proc_info.rx_queue.put( + OlivOS.API.Control.packet( + action, + data + ), + block=False + ) + def startPluginEdit(self): count_str = str(self.UIObject['root_plugin_edit_count']) # self.UIObject['root_plugin_edit_count'] += 1 @@ -506,6 +517,16 @@ def sendOlivOSUpdateGet(self): block=False ) + def startShallowSend(self): + self.sendRxEvent('send', { + 'target': { + 'type': 'nativeWinUI' + }, + 'data': { + 'action': 'start_shallow' + } + }) + def startShallow(self): releaseBase64Data('./resource', 'tmp_favoricon.ico', OlivOS.data.favoricon) if self.UIObject['root_shallow'] is None: diff --git a/OlivOS/pluginAPI.py b/OlivOS/pluginAPI.py index 6dda46c7..a175cdb8 100644 --- a/OlivOS/pluginAPI.py +++ b/OlivOS/pluginAPI.py @@ -109,6 +109,7 @@ def __update_GUI(self): self.run_plugin(rx_packet_data) def run(self): + self.sendPluginList() releaseDir('./plugin') releaseDir('./plugin/app') releaseDir('./plugin/conf') @@ -119,7 +120,6 @@ def run(self): releaseDir('./lib/DLLs') threading.Thread(target=self.__init_GUI).start() # self.set_check_update() - self.sendPluginList() time.sleep(1) # 此处延迟用于在终端第一次启动时等待终端初始化,避免日志丢失,后续需要用异步(控制包流程)方案替代 self.load_plugin_list() self.run_plugin_func(None, 'init_after')