Skip to content
This repository has been archived by the owner on Jan 14, 2024. It is now read-only.

Commit

Permalink
[0.1.2] 接入UIGF API并支持自动更新
Browse files Browse the repository at this point in the history
AuroraZiling committed May 17, 2023
1 parent b2c421f commit ae2ffa1
Showing 14 changed files with 297 additions and 95 deletions.
2 changes: 1 addition & 1 deletion src/assets/configs/application.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"application_version": "0.1.0",
"application_version": "0.1.2",
"ui_version": "0.8.7"
}
17 changes: 2 additions & 15 deletions src/asta.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# coding:utf-8
import logging
import os
import sys
import ctypes
import time
@@ -85,6 +84,8 @@ def __init__(self):

file_verification.create_directory(f"{utils.workingDir}/logs")

self.initMetaData()

self.setTitleBar(CustomTitleBar(self))
self.setWindowFlags(Qt.WindowType.WindowMinimizeButtonHint | Qt.WindowType.MSWindowsFixedSizeDialogHint)

@@ -108,33 +109,19 @@ def __init__(self):
self.mainStackWidget.addWidget(self.mainSettingInterface)
self.mainStackWidget.addWidget(self.mainAboutInterface)

self.initMetaData()

self.initLayout()
self.initNavigation()
self.initWindow()
startUp()
log.infoWrite("[Main] UI Initialized")

def initMetaData(self):
if not metadata_utils.readMetaData("character"):
characterData = character_list.categoryCharacterInStar()
metadata_utils.updateMetaData("character", characterData)
log.infoWrite("[MetaData] 角色元数据列表已更新")
InfoBar.success("成功", "角色元数据列表已更新", position=InfoBarPosition.BOTTOM_RIGHT, parent=self)

if not metadata_utils.readMetaData("permanent"):
characterData = character_list.getPermanentCharacter()
metadata_utils.updateMetaData("permanent", characterData)
log.infoWrite("[MetaData] 常驻角色元数据列表已更新")
InfoBar.success("成功", "常驻角色元数据列表已更新", position=InfoBarPosition.BOTTOM_RIGHT, parent=self)

if not metadata_utils.readMetaData("weapon"):
weaponData = weapon_list.categoryWeaponInStar()
metadata_utils.updateMetaData("weapon", weaponData)
log.infoWrite("[MetaData] 光锥元数据列表已更新")
InfoBar.success("成功", "光锥元数据列表已更新", position=InfoBarPosition.BOTTOM_RIGHT, parent=self)

def initLayout(self):
self.mainHBoxLayout.setSpacing(0)
self.mainHBoxLayout.setContentsMargins(0, self.titleBar.height(), 0, 0)
44 changes: 22 additions & 22 deletions src/modules/Core/GachaReport/Analysis/analysis.py
Original file line number Diff line number Diff line change
@@ -19,12 +19,12 @@ def __init__(self, data):
self.star_3_amount = 0
return

self.total_amount = int(self.data[0][0])
self.star_5 = [f"[{unit[0]}]{unit[2]}" for unit in self.data if unit[7] == "5"]
self.total_amount = int(self.data[0]["order"])
self.star_5 = [f"[{unit['order']}]{unit['name']}" for unit in self.data if unit['rank_type'] == "5"]
self.star_5_amount = len(self.star_5)
self.star_4 = [f"[{unit[0]}]{unit[2]}" for unit in self.data if unit[7] == "4"]
self.star_4 = [f"[{unit['order']}]{unit['name']}" for unit in self.data if unit['rank_type'] == "4"]
self.star_4_amount = len(self.star_4)
self.star_3_amount = len([unit for unit in self.data if unit[7] == "3"])
self.star_3_amount = len([unit for unit in self.data if unit['rank_type'] == "3"])

self.chart = QChart()
self.chartSeries = QPieSeries()
@@ -68,33 +68,33 @@ def get_star_4_percent_to_string(self):

def get_guarantee(self, data_type):
guarantee_text = ""
nearest_5_star = []
nearest_5_star = {}
additional_fix = 80 if data_type == "光锥活动跃迁" else 90
is_permanent_pool = True if data_type == "群星跃迁" else False
for unit in self.data:
if unit[2] in self.characterList["5"] or unit[2] in self.weaponList["5"]:
if unit['rank_type'] == "5":
nearest_5_star = unit
break
if nearest_5_star and not is_permanent_pool:
if nearest_5_star[2] in self.permanentList:
if nearest_5_star['name'] in self.permanentList:
guarantee_text += "情况: 小保底歪了/直接进入大保底"
guarantee_text += f"\n最近一次在第{nearest_5_star[0]}抽得到{nearest_5_star[2]}"
guarantee_text += f"\n将在第{int(nearest_5_star[0]) + additional_fix}抽之前必出当期UP"
guarantee_text += f"\n当前已经{self.total_amount}/{int(nearest_5_star[0]) + additional_fix}抽, 还差{int(nearest_5_star[0]) + additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star[0]) + additional_fix - self.total_amount}张星轨专票, 约等于{(int(nearest_5_star[0]) + additional_fix - self.total_amount) * 160}星琼"
elif nearest_5_star[2] not in self.permanentList:
guarantee_text += f"\n最近一次在第{nearest_5_star['order']}抽得到{nearest_5_star['name']}"
guarantee_text += f"\n将在第{int(nearest_5_star['order']) + additional_fix}抽之前必出当期UP"
guarantee_text += f"\n当前已经{self.total_amount}/{int(nearest_5_star['order']) + additional_fix}抽, 还差{int(nearest_5_star['order']) + additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star['order']) + additional_fix - self.total_amount}张星轨专票, 约等于{(int(nearest_5_star['order']) + additional_fix - self.total_amount) * 160}星琼"
elif nearest_5_star['name'] not in self.permanentList:
guarantee_text += "情况: 保底重置/等待小保底"
guarantee_text += f"\n最近一次在第{nearest_5_star[0]}抽得到{nearest_5_star[2]}"
guarantee_text += f"\n(第{int(nearest_5_star[0]) + additional_fix}抽之前有50%的概率出当期UP,在第{int(nearest_5_star[0]) + 2 * additional_fix}抽之前必出当期UP)"
guarantee_text += f"\n小保底: 当前已经{self.total_amount}/{int(nearest_5_star[0]) + additional_fix}抽, 还差{int(nearest_5_star[0]) + additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star[0]) + additional_fix - self.total_amount}张星轨专票, 约等于{(int(nearest_5_star[0]) + additional_fix - self.total_amount) * 160}星琼"
guarantee_text += f"\n大保底: 当前已经{self.total_amount}/{int(nearest_5_star[0]) + 2 * additional_fix}抽, 还差{int(nearest_5_star[0]) + 2 * additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star[0]) + 2 * additional_fix - self.total_amount}张星轨专票, 约等于{(int(nearest_5_star[0]) + 2 * additional_fix - self.total_amount) * 160}星琼"
guarantee_text += f"\n最近一次在第{nearest_5_star['order']}抽得到{nearest_5_star['name']}"
guarantee_text += f"\n(第{int(nearest_5_star['order']) + additional_fix}抽之前有50%的概率出当期UP,在第{int(nearest_5_star['order']) + 2 * additional_fix}抽之前必出当期UP)"
guarantee_text += f"\n小保底: 当前已经{self.total_amount}/{int(nearest_5_star['order']) + additional_fix}抽, 还差{int(nearest_5_star['order']) + additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star['order']) + additional_fix - self.total_amount}张星轨专票, 约等于{(int(nearest_5_star['order']) + additional_fix - self.total_amount) * 160}星琼"
guarantee_text += f"\n大保底: 当前已经{self.total_amount}/{int(nearest_5_star['order']) + 2 * additional_fix}抽, 还差{int(nearest_5_star['order']) + 2 * additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star['order']) + 2 * additional_fix - self.total_amount}张星轨专票, 约等于{(int(nearest_5_star['order']) + 2 * additional_fix - self.total_amount) * 160}星琼"
elif is_permanent_pool:
guarantee_text += f"最近一次在第{nearest_5_star[0]}抽得到{nearest_5_star[2]}"
guarantee_text += f"\n将在第{int(nearest_5_star[0]) + 90}抽之前必出五星"
guarantee_text += f"\n当前已经{self.total_amount}/{int(nearest_5_star[0]) + additional_fix}抽, 还差{int(nearest_5_star[0]) + additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star[0]) + additional_fix - self.total_amount}张星轨通票, 约等于{(int(nearest_5_star[0]) + additional_fix - self.total_amount) * 160}星琼"
guarantee_text += f"最近一次在第{nearest_5_star['order']}抽得到{nearest_5_star['name']}"
guarantee_text += f"\n将在第{int(nearest_5_star['order']) + 90}抽之前必出五星"
guarantee_text += f"\n当前已经{self.total_amount}/{int(nearest_5_star['order']) + additional_fix}抽, 还差{int(nearest_5_star['order']) + additional_fix - self.total_amount}抽"
guarantee_text += f"\n预计最多需要{int(nearest_5_star['order']) + additional_fix - self.total_amount}张星轨通票, 约等于{(int(nearest_5_star['order']) + additional_fix - self.total_amount) * 160}星琼"
elif not nearest_5_star:
guarantee_text = "暂无数据"
return guarantee_text
56 changes: 19 additions & 37 deletions src/modules/Core/GachaReport/Analysis/table_completion.py
Original file line number Diff line number Diff line change
@@ -2,53 +2,35 @@
from ....constant import COLOR_MAPPING


def findUnitStar(data, unit):
if unit in data["5"]:
return "5"
elif unit in data["4"]:
return "4"
elif unit in data["3"]:
return "3"
return "X"


def originalTableDataToComplete(data):
characterList = readMetaData("character")
weaponList = readMetaData("weapon")
permanentList = readMetaData("permanent")
for eachData in ["1", "11", "12"]:
currentData = data[eachData]
guaranteeCounter = 0
for index, unit in enumerate(data[eachData]):
unit.insert(0, str(len(data[eachData])-index))
unit.append("单抽")
unit.append("0")
unit.append("#FF0000")
unit.append("X")
time_tmp = [i[3] for i in data[eachData]]
for index, unit in enumerate(currentData):
currentData[index].update({"order": str(len(currentData) - index)})
currentData[index].update({"gacha_mode": "单抽"})
currentData[index].update({"color": "#FF0000"})
currentData[index].update({"guarantee": "0"})
time_tmp = [i["time"] for i in currentData]
pos = 0
while pos < len(time_tmp) - 9:
if time_tmp[pos] == time_tmp[pos + 1]:
for i in range(pos, pos + 10):
data[eachData][i][4] = f"十连-{10 - i + pos}"
for index in range(pos, pos + 10):
currentData[index].update({"gacha_mode": f"十连-{10 - index + pos}"})
pos += 9
pos += 1
for index in range(len(data[eachData])-1, -1, -1):
eachUnitType = data[eachData][index][1]
eachUnitName = data[eachData][index][2]
for index in range(len(currentData) - 1, -1, -1):
eachUnitName = currentData[index]["name"]
eachUnitRank = currentData[index]["rank_type"]
guaranteeCounter += 1
data[eachData][index][5] = str(guaranteeCounter)
if eachUnitName in characterList["5"] and eachUnitName not in permanentList and not eachData == "12":
guaranteeCounter = 0
elif eachUnitName in weaponList["5"] and eachData == "12":
currentData[index]["guarantee"] = str(guaranteeCounter)
if eachUnitRank == "5" and eachUnitName not in permanentList:
guaranteeCounter = 0
if eachUnitName not in permanentList:
if eachUnitType == "光锥":
data[eachData][index][6] = COLOR_MAPPING[findUnitStar(weaponList, eachUnitName)]
data[eachData][index][7] = findUnitStar(weaponList, eachUnitName)
elif eachUnitType == "角色":
data[eachData][index][6] = COLOR_MAPPING[findUnitStar(characterList, eachUnitName)]
data[eachData][index][7] = findUnitStar(characterList, eachUnitName)
currentData[index]["color"] = COLOR_MAPPING[eachUnitRank]
currentData[index]["rank_type"] = eachUnitRank
elif eachUnitName in permanentList:
data[eachData][index][6] = COLOR_MAPPING["5"]
data[eachData][index][7] = "5"
return data
currentData[index]["color"] = COLOR_MAPPING["5"]
currentData[index]["rank_type"] = "5"
return data
13 changes: 10 additions & 3 deletions src/modules/Core/GachaReport/gacha_report_read.py
Original file line number Diff line number Diff line change
@@ -19,15 +19,22 @@ def getDataFromUID(uid):


def sortDataByTime(data):
return [i[:-1] for i in sorted(data, key=lambda unit: unit[-1])][::-1]
return [i for i in sorted(data, key=lambda unit: unit["timestamp"])][::-1]


def convertDataToTable(data):
categories = {"1": [], "11": [], "12": []}
copied_categories = {"1": [], "11": [], "12": []}
for unit in data["list"]:
categories[unit["uigf_gacha_type"]].append([unit["item_type"], unit["name"], unit["time"]])
copied_categories[unit["uigf_gacha_type"]].append([unit["item_type"], unit["name"], unit["time"], time.mktime(time.strptime(unit["time"], "%Y-%m-%d %H:%M:%S"))])
eachUnit = {
"item_type": unit["item_type"],
"name": unit["name"],
"time": unit["time"],
"rank_type": unit["rank_type"]
}
categories[unit["uigf_gacha_type"]].append(eachUnit)
eachUnit.update({"timestamp": time.mktime(time.strptime(unit["time"], "%Y-%m-%d %H:%M:%S"))})
copied_categories[unit["uigf_gacha_type"]].append(eachUnit)
categories["1"] = sortDataByTime(copied_categories["1"])
categories["11"] = sortDataByTime(copied_categories["11"])
categories["12"] = sortDataByTime(copied_categories["12"])
37 changes: 37 additions & 0 deletions src/modules/Metadata/UIGF_API.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import hashlib
import os
from functools import partial

import requests
import json

from ..constant import UIGF_ITEM_ID_URL, UIGF_MD5_URL
from ..Scripts.Utils.tools import Tools

utils = Tools()


def updateUIGFItemIdList(language, localPath):
if not os.path.exists(f"{utils.getConfigPath()}/metadata/"):
os.mkdir(f"{utils.getConfigPath()}/metadata/")
if not os.path.exists(localPath):
with open(localPath, 'wb') as f:
text = json.dumps(getUIGFItemIdList(language), indent=4, ensure_ascii=False).replace('\r\n', '\n')
f.write(text.encode('utf-8'))
return True
with open(localPath, 'rb') as f:
d = hashlib.md5()
for buf in iter(partial(f.read, 1024), b''):
d.update(buf)
local_md5 = d.hexdigest()
api_md5 = requests.get(UIGF_MD5_URL).json()["chs"]
if not local_md5 == api_md5:
with open(localPath, 'wb') as f:
text = json.dumps(getUIGFItemIdList(language), indent=4, ensure_ascii=False).replace('\r\n', '\n')
f.write(text.encode('utf-8'))
return True
return False


def getUIGFItemIdList(language):
return requests.get(UIGF_ITEM_ID_URL.format(lang=language)).json()
9 changes: 0 additions & 9 deletions src/modules/Scripts/Utils/network.py

This file was deleted.

57 changes: 57 additions & 0 deletions src/modules/Scripts/Utils/updater.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import os
import shutil
import subprocess

import requests
from PySide6.QtWidgets import QApplication

from ...constant import GITHUB_RELEASE_URL, UPDATE_SCRIPT_MODEL
from ..Utils.tools import Tools

utils = Tools()


def cleanUpdateZip():
if os.path.exists(f"{utils.workingDir}/temp"):
shutil.rmtree(f"{utils.workingDir}/temp")
os.mkdir(f"{utils.workingDir}/temp")


def installUpdate():
if not os.listdir(f"{utils.workingDir}/temp"):
return
if os.path.exists(f"{utils.workingDir}/asta.py"):
return
with open('temp/update.bat', 'w') as f:
f.write(UPDATE_SCRIPT_MODEL.format(filename=os.listdir(f"{utils.workingDir}/temp")[0]))

subprocess.Popen(
[
"start",
"update.bat"
],
cwd='temp',
stdout=subprocess.PIPE,
shell=True
)
QApplication.quit()


def findLatestVersion():
try:
return requests.get(GITHUB_RELEASE_URL).json()
except ValueError:
return None


def isNeedUpdate(appVersion):
tag = findLatestVersion()
try:
if not appVersion == tag["tag_name"]:
return tag
except KeyError:
error = requests.get(GITHUB_RELEASE_URL)
if error.json()["message"] == "Not Found":
return None
return "limit", error.headers
return None
11 changes: 11 additions & 0 deletions src/modules/Views/ViewFunctions/metadataFunctions.py
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

from ...Scripts.Utils import metadata_utils
from ...Scripts.Utils.config_utils import ConfigUtils
from ...Metadata.UIGF_API import updateUIGFItemIdList

utils = ConfigUtils()

@@ -17,3 +18,13 @@ def run(self):
metadata_utils.updateMetaData("weapon")
metadata_utils.updateMetaData("permanent")
self.trigger.emit(True)

class MetadataUIGFUpdateThread(QThread):
trigger = Signal(bool)

def __init__(self, parent=None):
super(MetadataUIGFUpdateThread, self).__init__(parent)

def run(self):
result = updateUIGFItemIdList("chs", f"{utils.configPath}/metadata/uigf_dict.json")
self.trigger.emit(result)
37 changes: 37 additions & 0 deletions src/modules/Views/ViewFunctions/settingsFunctions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import os

import requests
from PySide6.QtCore import Signal, QThread

from ...constant import GITHUB_RELEASE_URL


class UpdateThread(QThread):
trigger = Signal(int, str)

def __init__(self, info, parent=None):
super(UpdateThread, self).__init__(parent)
self.info = info

def run(self):
self.trigger.emit(0, "正在从 Github Release 获取更新")
try:
compressed_url = self.info['assets'][0]['browser_download_url']
file_name = self.info['assets'][0]['name']
except ConnectionError:
self.trigger.emit(1, "更新失败")
return
except requests.exceptions.SSLError:
self.trigger.emit(1, "更新失败")
return
url = compressed_url
if not os.path.exists('temp'):
os.mkdir('temp')
resp = requests.get(url, stream=True)
count = resp.headers.get('content-length')
with open(f'temp/{file_name}', 'wb') as f:
for chunk in resp.iter_content(chunk_size=2048):
if chunk:
f.write(chunk)
self.trigger.emit(0, f"正在下载: {f.tell()} 字节/{count} 字节")
self.trigger.emit(2, "更新下载完毕")
6 changes: 4 additions & 2 deletions src/modules/Views/gacha_report_frame.py
Original file line number Diff line number Diff line change
@@ -249,10 +249,12 @@ def tableUpdateData(self, currentData):
rowColorMapping = {}
for index, each in enumerate(currentData):
for eachColumn in range(0, 6):
columnModel = [each["order"], each["item_type"], each["name"], each["time"], each["gacha_mode"],
each["guarantee"], each["color"]]
self.bottomLeftGachaTable.setItem(index, eachColumn, QTableWidgetItem())
self.bottomLeftGachaTable.setRowHeight(index, 40)
self.bottomLeftGachaTable.item(index, eachColumn).setText(each[eachColumn])
rowColorMapping.update({index: QColor(each[6])})
self.bottomLeftGachaTable.item(index, eachColumn).setText(columnModel[eachColumn])
rowColorMapping.update({index: QColor(columnModel[6])})
self.bottomLeftGachaTable.setItemDelegate(CustomTableItemDelegate(self.bottomLeftGachaTable))
log.infoWrite(f"[GachaReport] Gacha table updated")

35 changes: 34 additions & 1 deletion src/modules/Views/metadata_frame.py
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
from qfluentwidgets import FluentIcon

from .ViewConfigs.config import cfg
from .ViewFunctions.metadataFunctions import MetadataUpdateThread
from .ViewFunctions.metadataFunctions import MetadataUpdateThread, MetadataUIGFUpdateThread
from ..Scripts.Utils import config_utils, log_recorder as log
from ..Scripts.UI.style_sheet import StyleSheet

@@ -43,13 +43,25 @@ def __init__(self, parent=None):

self.metaDataUpdateProgressBar = IndeterminateProgressBar(self)

self.metaDataUIGFUpdateCard = PushSettingCard(
"更新",
FluentIcon.UPDATE,
"更新UIGF API数据",
"",
parent=self
)

self.metaDataUIGFUpdateProgressBar = IndeterminateProgressBar(self)

self.baseVBox.addWidget(self.metaDataTitleLabel)
self.baseVBox.addWidget(self.metaDataSubTitleLabel)
self.baseVBox.addWidget(self.metaDataAutoUpdateLabel)
self.baseVBox.addWidget(self.metaDataAutoUpdateCard)
self.baseVBox.addWidget(self.metaDataCharacterWeaponUpdateLabel)
self.baseVBox.addWidget(self.metaDataUpdateCard)
self.baseVBox.addWidget(self.metaDataUpdateProgressBar)
self.baseVBox.addWidget(self.metaDataUIGFUpdateCard)
self.baseVBox.addWidget(self.metaDataUIGFUpdateProgressBar)
self.baseVBox.addStretch(1)

self.setObjectName("MetaDataWidget")
@@ -72,12 +84,33 @@ def __metaDataUpdateCardClicked(self):
self.metaDataUpdateThread.start()
self.metaDataUpdateThread.trigger.connect(self.__metaDataUpdateCardSignal)

def __metaDataUIGFUpdateCardSignal(self, status):
message = "UIGF API 数据已更新" if status else "UIGF API 数据无需更新"
self.metaDataUIGFUpdateCard.setEnabled(True)
self.metaDataUIGFUpdateProgressBar.setVisible(False)
InfoBar.success("成功", message, position=InfoBarPosition.TOP_RIGHT, parent=self)
log.infoWrite(f"[Metadata] UIGF metadata updated")

def __metaDataUIGFUpdateCardClicked(self):
self.metaDataUIGFUpdateCard.setEnabled(False)
self.metaDataUIGFUpdateProgressBar.setVisible(True)
self.metaDataUIGFUpdateThread = MetadataUIGFUpdateThread()
self.metaDataUIGFUpdateThread.start()
self.metaDataUIGFUpdateThread.trigger.connect(self.__metaDataUIGFUpdateCardSignal)

def initFrame(self):
self.metaDataTitleLabel.setObjectName("metaDataTitleLabel")
self.metaDataSubTitleLabel.setObjectName("metaDataSubTitleLabel")
self.metaDataAutoUpdateLabel.setFont(utils.getFont(18))
self.metaDataCharacterWeaponUpdateLabel.setFont(utils.getFont(18))

self.metaDataUpdateProgressBar.setVisible(False)
self.metaDataUIGFUpdateProgressBar.setVisible(False)

self.metaDataUpdateCard.clicked.connect(self.__metaDataUpdateCardClicked)

self.metaDataUIGFUpdateCard.clicked.connect(self.__metaDataUIGFUpdateCardClicked)

if cfg.metaDataUpdateAtStartUp.value:
self.__metaDataUpdateCardClicked()
self.__metaDataUIGFUpdateCardClicked()
50 changes: 46 additions & 4 deletions src/modules/Views/settings_frame.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
# coding:utf-8
import webbrowser
import time

from PySide6 import QtGui
from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QWidget, QLabel, QFileDialog

from qfluentwidgets import (SettingCardGroup, PushSettingCard, ScrollArea, ExpandLayout, isDarkTheme, Dialog,
OptionsSettingCard,
SwitchSettingCard, setTheme, InfoBar, MessageBox)
SwitchSettingCard, setTheme, InfoBar, MessageBox, StateToolTip)
from qfluentwidgets import FluentIcon, InfoBarPosition, qconfig

from .ViewConfigs.config import cfg
from .ViewFunctions.settingsFunctions import UpdateThread
from ..Core.GachaReport import gacha_report_read
from ..Core.GachaReport.gacha_report_utils import getDefaultGameDataPath
from ..Scripts.UI import custom_icon, custom_dialog
from ..Scripts.UI.style_sheet import StyleSheet
from ..Scripts.Utils import config_utils, log_recorder as log
from ..Scripts.Utils import config_utils, log_recorder as log, updater
from ..Scripts.Utils.updater import installUpdate, cleanUpdateZip

utils = config_utils.ConfigUtils()

@@ -30,6 +32,8 @@ def __init__(self, parent):
self.settingLabel = QLabel("设置", self)

self.configPath = utils.configPath
self.updateThread = None
self.updateThreadStateTooltip = None

# Game

@@ -249,9 +253,44 @@ def __defaultCacheSizeUpdate(self):
self.defaultCacheDeleteCard.titleLabel.setText(
f"清空缓存文件 (约 {utils.getDirSize(utils.workingDir + '/cache')} MB)")

def __updateThreadStateTooltipClosed(self):
self.updateThread.exit(0)
self.updateCheckCard.setEnabled(True)
self.updateThreadStatusChanged(1, "Operation cancelled")
InfoBar.warning("操作终止", "更新已停止",
position=InfoBarPosition.BOTTOM, parent=self)

def updateThreadStatusChanged(self, status, content):
if self.updateThreadStateTooltip:
self.updateThreadStateTooltip.setContent(content)
if status:
self.updateCheckCard.setEnabled(True)
self.updateThreadStateTooltip.setState(True)
if status == 2:
installUpdate()
self.updateThreadStateTooltip = None

def __updateCheckCardClicked(self):
cleanUpdateZip()
newVersion = updater.isNeedUpdate(utils.appVersion)
if newVersion is None:
InfoBar.success("提示", "Asta 无需更新", InfoBarPosition.TOP_RIGHT, parent=self.window())
return
elif isinstance(newVersion, tuple):
InfoBar.error("错误", f"Asta 更新请求超过限额\n请于{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(newVersion[1]['X-RateLimit-Reset'])))}之后再试", InfoBarPosition.TOP_RIGHT, parent=self.window())
return
w = MessageBox("更新", f"发现新版本: {newVersion['tag_name']}\n是否更新?", self)
if w.exec():
self.updateCheckCard.setEnabled(False)
self.updateThread = UpdateThread(newVersion)
self.updateThreadStateTooltip = StateToolTip("正在更新", "下载更新中...", self)
self.updateThreadStateTooltip.closedSignal.connect(self.__updateThreadStateTooltipClosed)
self.updateThreadStateTooltip.move(5, 5)
self.updateThreadStateTooltip.show()
self.updateThread.start()
self.updateThread.trigger.connect(self.updateThreadStatusChanged)

def __connectSignalToSlot(self):
""" connect signal to slot """
cfg.appRestartSig.connect(lambda: InfoBar.warning("警告", self.tr(
"更改将在应用重启后更新"), parent=self.window(), position=InfoBarPosition.TOP_RIGHT))
cfg.themeChanged.connect(setTheme)
@@ -270,3 +309,6 @@ def __connectSignalToSlot(self):
self.defaultUIDDeleteCard.clicked.connect(self.__defaultUIDDeleteCardClicked)
self.defaultLogDeleteCard.clicked.connect(self.__defaultLogDeleteCardClicked)
self.defaultCacheDeleteCard.clicked.connect(self.__defaultCacheDeleteCardClicked)

# Updater
self.updateCheckCard.clicked.connect(self.__updateCheckCardClicked)
18 changes: 17 additions & 1 deletion src/modules/constant.py
Original file line number Diff line number Diff line change
@@ -8,8 +8,24 @@
CHARACTER_URL = "https://wiki.biligame.com/sr/%E8%A7%92%E8%89%B2%E7%AD%9B%E9%80%89"
PERMANENT_CHARACTER_URL = "https://raw.staticdn.net/AuroraZiling/asta.Metadata/main/metadata.json"
WEAPON_URL = "https://wiki.biligame.com/sr/%E5%85%89%E9%94%A5%E4%B8%80%E8%A7%88"
UIGF_ITEM_ID_URL = "https://api.uigf.org/dict/starrail/{lang}.json"
UIGF_MD5_URL = "https://api.uigf.org/dict/starrail/md5.json"

COLOR_MAPPING = {"3": "#1E90FF", "4": "#7B68EE", "5": "#FFA500", "X": "#FF0000"}

FONT_MAPPING = ["StarRailNeue-Sans-Regular.otf", "StarRailNeue-Serif-Regular.otf"]
FONT_NAME_MAPPING = ["Star Rail Neue Sans-", "Star Rail Neue Serif-"]
FONT_NAME_MAPPING = ["Star Rail Neue Sans-", "Star Rail Neue Serif-"]

GITHUB_RELEASE_URL = "https://api.github.com/repos/AuroraZiling/star-rail-asta/releases/latest"

UPDATE_SCRIPT_MODEL = """
echo "DON'T CLOSE THIS WINDOW"
powershell -command \"Start-Sleep -s 3\"
powershell -command \"Get-childitem -Path .. -exclude *.json,*.zip,*.bat,temp -Recurse | Remove-Item -Force -Recurse\"
powershell -command \"Expand-Archive -Path .\\{filename} -DestinationPath ..\\ -Force\"
powershell -command \"Remove-Item -Path .\\{filename}\"
cd ../.
start .\\"Asta.exe\"
powershell -command \"Remove-Item -Path .\\temp\\update.bat\"
exit
"""

0 comments on commit ae2ffa1

Please sign in to comment.