Skip to content

Commit

Permalink
版本推进至 0.11.3
Browse files Browse the repository at this point in the history
+ 优化组件加载逻辑,现nativeGUI能更快的响应启动
+ 新增lib资源文件的自动更新
  • Loading branch information
lunzhiPenxil committed Mar 9, 2023
1 parent 2303e5f commit 26b59ae
Show file tree
Hide file tree
Showing 6 changed files with 181 additions and 39 deletions.
45 changes: 15 additions & 30 deletions OlivOS/bootAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'],
Expand Down Expand Up @@ -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()
Expand Down
10 changes: 8 additions & 2 deletions OlivOS/bootDataAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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,
Expand All @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions OlivOS/infoAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
130 changes: 130 additions & 0 deletions OlivOS/libEXEModelAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
29 changes: 25 additions & 4 deletions OlivOS/nativeWinUIAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down Expand Up @@ -293,7 +294,7 @@ def resFunc():
return resFunc

def startGoCqhttpTerminalUISend(self, hash):
self.sendControlEventSend('send', {
self.sendRxEvent('send', {
'target': {
'type': 'nativeWinUI'
},
Expand Down Expand Up @@ -328,7 +329,7 @@ def resFunc():
return resFunc

def startVirtualTerminalUISend(self, hash):
self.sendControlEventSend('send', {
self.sendRxEvent('send', {
'target': {
'type': 'nativeWinUI'
},
Expand Down Expand Up @@ -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'
},
Expand Down Expand Up @@ -408,7 +409,7 @@ def setVirtualModelSend(self, hash, data):
)

def startPluginEditSend(self):
self.sendControlEventSend('send', {
self.sendRxEvent('send', {
'target': {
'type': 'nativeWinUI'
},
Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion OlivOS/pluginAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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')
Expand Down

0 comments on commit 26b59ae

Please sign in to comment.