Compare commits

..

12 Commits

Author SHA1 Message Date
mio
3617599d32 fix: failed to get the correct wrap type 2023-05-04 16:07:17 +08:00
mio
c724727886 fix: add background color in the browser window 2023-05-04 12:41:44 +08:00
mio
d324aee160 fix: ignore case when reading game paths from logs 2023-05-04 11:34:02 +08:00
5a5a7c1327 Update 繁體中文.json (#9)
* Update 繁體中文.json

* fix: 原神 -> 崩壞:星穹鐵道
2023-05-04 11:12:14 +08:00
mio
77a1d611be fix: weapon -> light cone 2023-05-04 11:00:21 +08:00
mio
3dbb746a38 feat: save data in the current folder 2023-05-03 21:22:37 +08:00
mio
b88b57ae62 fix: the error message for authkey timeout is not displayed 2023-05-03 13:26:51 +08:00
mio
677ab3750d fix: possible interruption caused by failure to read cache file 2023-05-02 09:07:37 +08:00
mio
f95470504d fix: the manually specified installation path may not match (#4) 2023-05-02 09:04:06 +08:00
mio
8d45af5089 fix: wrong character type names (#3) 2023-05-02 08:57:19 +08:00
mio
8a9c7a3b56 fix: global server game path is '\Games\' 2023-05-01 19:27:22 +08:00
mio
2a670c7023 fix: i18n show empty string 2023-05-01 19:15:40 +08:00
12 changed files with 113 additions and 69 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "star-rail-warp-export", "name": "star-rail-warp-export",
"version": "0.0.5", "version": "0.0.11",
"main": "./dist/electron/main/main.js", "main": "./dist/electron/main/main.js",
"author": "biuuu <https://github.com/biuuu>", "author": "biuuu <https://github.com/biuuu>",
"license": "MIT", "license": "MIT",

View File

@ -30,9 +30,9 @@
"ui.data.average": "5 star on average", "ui.data.average": "5 star on average",
"ui.data.chara5": "5 star character", "ui.data.chara5": "5 star character",
"ui.data.chara4": "4 star character", "ui.data.chara4": "4 star character",
"ui.data.weapon5": "5 star light cone", "ui.data.weapon5": "5 star Light Cone",
"ui.data.weapon4": "4 star light cone", "ui.data.weapon4": "4 star Light Cone",
"ui.data.weapon3": "3 star light cone", "ui.data.weapon3": "3 star Light Cone",
"ui.setting.title": "Settings", "ui.setting.title": "Settings",
"ui.setting.language": "Language", "ui.setting.language": "Language",
"ui.setting.languageHint": "When the translation is missing, English will be displayed by default.", "ui.setting.languageHint": "When the translation is missing, English will be displayed by default.",
@ -84,5 +84,5 @@
"excel.filePrefix": "Star Rail Warp logger", "excel.filePrefix": "Star Rail Warp logger",
"excel.fileType": "Excel file", "excel.fileType": "Excel file",
"ui.extra.cacheClean": "1. Confirm whether the warp history in the game has been opened, and if the error \"User authentication expired\" still appears, try the following steps \n2. Close the game window of Star Rail \n3. Click the \"Open Web Cache Folder\" button above to open the \"Cache\" folder \n4. Delete the \"Cache_ Data\" folder \n5. Start the Star Rail game and open the warp history page in the game \n6. Close this dialog and click the \"Update Data\" button", "ui.extra.cacheClean": "1. Confirm whether the warp history in the game has been opened, and if the error \"User authentication expired\" still appears, try the following steps \n2. Close the game window of Star Rail \n3. Click the \"Open Web Cache Folder\" button above to open the \"Cache\" folder \n4. Delete the \"Cache_ Data\" folder \n5. Start the Star Rail game and open the warp history page in the game \n6. Close this dialog and click the \"Update Data\" button",
"ui.extra.findCacheFolder": "If the \"Open cache folder\" button does not respond, you can manually find the game's web cache folder. The directory is \"Your game installation path/Star Rail/Game/StarRail_Data/webCaches/Cache/\"" "ui.extra.findCacheFolder": "If the \"Open cache folder\" button does not respond, you can manually find the game's web cache folder. The directory is \"Your game installation path/Star Rail/Games/StarRail_Data/webCaches/Cache/\""
} }

View File

@ -18,7 +18,7 @@
"ui.data.sum": "合計", "ui.data.sum": "合計",
"ui.data.no5star": "連星5取得しません", "ui.data.no5star": "連星5取得しません",
"ui.data.character": "キャラ", "ui.data.character": "キャラ",
"ui.data.weapon": "武器", "ui.data.weapon": "光円錐",
"ui.data.star5": "星5", "ui.data.star5": "星5",
"ui.data.star4": "星4", "ui.data.star4": "星4",
"ui.data.star3": "星3", "ui.data.star3": "星3",
@ -26,9 +26,9 @@
"ui.data.average": "星5取得平均回数", "ui.data.average": "星5取得平均回数",
"ui.data.chara5": "星5キャラ", "ui.data.chara5": "星5キャラ",
"ui.data.chara4": "星4キャラ", "ui.data.chara4": "星4キャラ",
"ui.data.weapon5": "星5武器", "ui.data.weapon5": "星5光円錐",
"ui.data.weapon4": "星4武器", "ui.data.weapon4": "星4光円錐",
"ui.data.weapon3": "星3武器", "ui.data.weapon3": "星3光円錐",
"ui.setting.title": "設定", "ui.setting.title": "設定",
"ui.setting.language": "言語", "ui.setting.language": "言語",
"ui.setting.languageHint": "翻訳されていない場合は、デフォルトで英語が表示されます。", "ui.setting.languageHint": "翻訳されていない場合は、デフォルトで英語が表示されます。",

View File

@ -22,7 +22,7 @@
"ui.data.sum": "已累计", "ui.data.sum": "已累计",
"ui.data.no5star": "抽未出5星", "ui.data.no5star": "抽未出5星",
"ui.data.character": "角色", "ui.data.character": "角色",
"ui.data.weapon": "武器", "ui.data.weapon": "光錐",
"ui.data.star5": "5星", "ui.data.star5": "5星",
"ui.data.star4": "4星", "ui.data.star4": "4星",
"ui.data.star3": "3星", "ui.data.star3": "3星",
@ -30,9 +30,9 @@
"ui.data.average": "5星平均出货次数为", "ui.data.average": "5星平均出货次数为",
"ui.data.chara5": "5星角色", "ui.data.chara5": "5星角色",
"ui.data.chara4": "4星角色", "ui.data.chara4": "4星角色",
"ui.data.weapon5": "5星武器", "ui.data.weapon5": "5星光錐",
"ui.data.weapon4": "4星武器", "ui.data.weapon4": "4星光錐",
"ui.data.weapon3": "3星武器", "ui.data.weapon3": "3星光錐",
"ui.setting.title": "设置", "ui.setting.title": "设置",
"ui.setting.language": "语言", "ui.setting.language": "语言",
"ui.setting.languageHint": "缺少翻译时,会默认显示简体中文", "ui.setting.languageHint": "缺少翻译时,会默认显示简体中文",

View File

@ -8,7 +8,7 @@
"ui.button.setting": "設定", "ui.button.setting": "設定",
"ui.button.option": "選項", "ui.button.option": "選項",
"ui.button.startProxy": "Proxy 模式", "ui.button.startProxy": "Proxy 模式",
"ui.button.solution": "解決方", "ui.button.solution": "解決方",
"ui.button.cacheFolder": "開啟快取資料夾", "ui.button.cacheFolder": "開啟快取資料夾",
"ui.select.newAccount": "新帳號", "ui.select.newAccount": "新帳號",
"ui.hint.newAccount": "從其他帳號匯出資料", "ui.hint.newAccount": "從其他帳號匯出資料",
@ -16,13 +16,13 @@
"ui.hint.lastUpdate": "上次資料更新時間為", "ui.hint.lastUpdate": "上次資料更新時間為",
"ui.hint.relaunchHint": "更新已完成,按下按鈕重新啟動工具後生效", "ui.hint.relaunchHint": "更新已完成,按下按鈕重新啟動工具後生效",
"ui.hint.failed": "作業失敗", "ui.hint.failed": "作業失敗",
"ui.win.title": "", "ui.win.title": "崩壞:星穹鐵道 躍遷記錄匯出工具",
"ui.data.total": "總計", "ui.data.total": "總計",
"ui.data.times": "抽", "ui.data.times": "抽",
"ui.data.sum": "已累計", "ui.data.sum": "已累計",
"ui.data.no5star": "抽未出5星", "ui.data.no5star": "抽未出5星",
"ui.data.character": "角色", "ui.data.character": "角色",
"ui.data.weapon": "武器", "ui.data.weapon": "光錐",
"ui.data.star5": "5星", "ui.data.star5": "5星",
"ui.data.star4": "4星", "ui.data.star4": "4星",
"ui.data.star3": "3星", "ui.data.star3": "3星",
@ -30,9 +30,9 @@
"ui.data.average": "5星平均出貨次數為", "ui.data.average": "5星平均出貨次數為",
"ui.data.chara5": "5星角色", "ui.data.chara5": "5星角色",
"ui.data.chara4": "4星角色", "ui.data.chara4": "4星角色",
"ui.data.weapon5": "5星武器", "ui.data.weapon5": "5星光錐",
"ui.data.weapon4": "4星武器", "ui.data.weapon4": "4星光錐",
"ui.data.weapon3": "3星武器", "ui.data.weapon3": "3星光錐",
"ui.setting.title": "設定", "ui.setting.title": "設定",
"ui.setting.language": "語言", "ui.setting.language": "語言",
"ui.setting.languageHint": "缺少翻譯時,預設會顯示簡體中文。", "ui.setting.languageHint": "缺少翻譯時,預設會顯示簡體中文。",
@ -42,7 +42,7 @@
"ui.setting.seaServer": "國際服", "ui.setting.seaServer": "國際服",
"ui.setting.logTypeHint": "使用遊戲記錄取得 URL 時,優先選擇哪種伺服器產生的記錄檔案。", "ui.setting.logTypeHint": "使用遊戲記錄取得 URL 時,優先選擇哪種伺服器產生的記錄檔案。",
"ui.setting.autoUpdate": "自動更新", "ui.setting.autoUpdate": "自動更新",
"ui.setting.hideNovice": "", "ui.setting.hideNovice": "隱藏始發躍遷",
"ui.setting.proxyMode": "Proxy 模式", "ui.setting.proxyMode": "Proxy 模式",
"ui.setting.proxyModeHint": "透過設定系統 Proxy 以取得 URL將會在從系統記錄中取得 URL 失敗時啟動。", "ui.setting.proxyModeHint": "透過設定系統 Proxy 以取得 URL將會在從系統記錄中取得 URL 失敗時啟動。",
"ui.setting.fetchFullHistory": "取得完整資料", "ui.setting.fetchFullHistory": "取得完整資料",
@ -81,8 +81,8 @@
"excel.header.remark": "備註", "excel.header.remark": "備註",
"excel.wish2": "躍遷-2", "excel.wish2": "躍遷-2",
"excel.customFont": "微軟正黑體", "excel.customFont": "微軟正黑體",
"excel.filePrefix": "", "excel.filePrefix": "星穹鐵道躍遷紀錄",
"excel.fileType": "Excel 檔案", "excel.fileType": "Excel 檔案",
"ui.extra.cacheClean": "1. 確認是否已經開啟遊戲內的躍遷歷史紀錄,如果仍然出現「身分驗證已過期」的錯誤,再嘗試下面的步驟\n2. 關閉原神的遊戲視窗\n3. 按一下上方的「開啟快取資料夾」按鈕開啟「Cache」資料夾\n4. 刪除「Cache_Data」資料夾\n5. 啟動原神遊戲,開啟遊戲內躍遷歷史紀錄頁面\n6. 關閉這個對話方塊,再按下「更新資料」按鈕", "ui.extra.cacheClean": "1. 確認是否已經開啟遊戲內的躍遷歷史紀錄,如果仍然出現「身分驗證已過期」的錯誤,再嘗試下面的步驟\n2. 關閉「崩壞:星穹鐵道」的遊戲視窗\n3. 按一下上方的「開啟快取資料夾」按鈕開啟「Cache」資料夾\n4. 刪除「Cache_Data」資料夾\n5. 啟動「崩壞:星穹鐵道」遊戲,開啟遊戲內躍遷歷史紀錄頁面\n6. 關閉這個對話方塊,再按下「更新資料」按鈕",
"ui.extra.findCacheFolder": "如果按下「開啟快取資料夾」按鈕沒有回應,可以手動找到遊戲的網頁快取資料夾,目錄為「您的遊戲安裝路徑/Star Rail/Game/StarRail_Data/webCaches/Cache/」" "ui.extra.findCacheFolder": "如果按下「開啟快取資料夾」按鈕沒有回應,可以手動找到遊戲的網頁快取資料夾,目錄為「您的遊戲安裝路徑/Star Rail/Games/StarRail_Data/webCaches/Cache/」"
} }

View File

@ -1,4 +1,4 @@
const { readJSON, saveJSON, decipherAes, cipherAes, detectLocale } = require('./utils') const { readJSON, saveJSON, decipherAes, cipherAes, detectLocale, userDataPath, globalUserDataPath } = require('./utils')
const config = { const config = {
urls: [], urls: [],
@ -13,7 +13,10 @@ const config = {
} }
const getLocalConfig = async () => { const getLocalConfig = async () => {
const localConfig = await readJSON('config.json') let localConfig = await readJSON(userDataPath, 'config.json')
if (!localConfig) {
localConfig = await readJSON(globalUserDataPath, 'config.json')
}
if (!localConfig) return if (!localConfig) return
const configTemp = {} const configTemp = {}
for (let key in localConfig) { for (let key in localConfig) {

View File

@ -3,7 +3,7 @@ const util = require('util')
const path = require('path') const path = require('path')
const { URL } = require('url') const { URL } = require('url')
const { app, ipcMain, shell } = require('electron') const { app, ipcMain, shell } = require('electron')
const { sleep, request, sendMsg, readJSON, saveJSON, detectLocale, userDataPath, userPath, localIp, langMap } = require('./utils') const { sleep, request, sendMsg, readJSON, saveJSON, detectLocale, userDataPath, userPath, localIp, langMap, globalUserDataPath } = require('./utils')
const config = require('./config') const config = require('./config')
const i18n = require('./i18n') const i18n = require('./i18n')
const { enableProxy, disableProxy } = require('./module/system-proxy') const { enableProxy, disableProxy } = require('./module/system-proxy')
@ -29,25 +29,42 @@ const defaultTypeMap = new Map([
['2', '始发跃迁'] ['2', '始发跃迁']
]) ])
const findDataFiles = async (dataPath, fileMap) => {
const files = await readdir(dataPath)
if (files?.length) {
for (let name of files) {
if (/^gacha-list-\d+\.json$/.test(name) && !fileMap.has(name)) {
fileMap.set(name, dataPath)
}
}
}
}
const collectDataFiles = async () => {
await fs.ensureDir(userDataPath)
await fs.ensureDir(globalUserDataPath)
const fileMap = new Map()
await findDataFiles(userDataPath, fileMap)
await findDataFiles(globalUserDataPath, fileMap)
return fileMap
}
let localDataReaded = false let localDataReaded = false
const readdir = util.promisify(fs.readdir) const readdir = util.promisify(fs.readdir)
const readData = async () => { const readData = async () => {
if (localDataReaded) return if (localDataReaded) return
localDataReaded = true localDataReaded = true
await fs.ensureDir(userDataPath) const fileMap = await collectDataFiles()
const files = await readdir(userDataPath) for (let [name, dataPath] of fileMap) {
for (let name of files) { try {
if (/^gacha-list-\d+\.json$/.test(name)) { const data = await readJSON(dataPath, name)
try { data.typeMap = new Map(data.typeMap) || defaultTypeMap
const data = await readJSON(name) data.result = new Map(data.result)
data.typeMap = new Map(data.typeMap) || defaultTypeMap if (data.uid) {
data.result = new Map(data.result) dataMap.set(data.uid, data)
if (data.uid) {
dataMap.set(data.uid, data)
}
} catch (e) {
sendMsg(e, 'ERROR')
} }
} catch (e) {
sendMsg(e, 'ERROR')
} }
} }
if ((!config.current && dataMap.size) || (config.current && dataMap.size && !dataMap.has(config.current))) { if ((!config.current && dataMap.size) || (config.current && dataMap.size && !dataMap.has(config.current))) {
@ -115,9 +132,12 @@ const readLog = async () => {
} }
const promises = logPaths.map(async logpath => { const promises = logPaths.map(async logpath => {
const logText = await fs.readFile(logpath, 'utf8') const logText = await fs.readFile(logpath, 'utf8')
const gamePathMch = logText.match(/\w:\/.*?(Star\sRail\/Game\/StarRail_Data)/) const gamePathMch = logText.match(/\w:\/.*?\/StarRail_Data\//i)
if (gamePathMch) { if (gamePathMch) {
const cacheText = await fs.readFile(path.join(gamePathMch[0], '/webCaches/Cache/Cache_Data/data_2'), 'utf8') let cacheText = ''
try {
cacheText = await fs.readFile(path.join(gamePathMch[0], '/webCaches/Cache/Cache_Data/data_2'), 'utf8')
} catch (e) {}
const urlMch = cacheText.match(/https.+?&auth_appid=webview_gacha&.+?authkey=.+?&game_biz=hkrpg_.+?&plat_type=pc/g) const urlMch = cacheText.match(/https.+?&auth_appid=webview_gacha&.+?authkey=.+?&game_biz=hkrpg_.+?&plat_type=pc/g)
if (urlMch) { if (urlMch) {
cacheFolder = path.join(gamePathMch[0], '/webCaches/Cache/') cacheFolder = path.join(gamePathMch[0], '/webCaches/Cache/')
@ -235,7 +255,6 @@ const tryGetUid = async (queryString) => {
try { try {
for (let [key] of defaultTypeMap) { for (let [key] of defaultTypeMap) {
const res = await request(`${url}&gacha_type=${key}&page=1&size=6`) const res = await request(`${url}&gacha_type=${key}&page=1&size=6`)
checkResStatus(res)
if (res.data.list && res.data.list.length) { if (res.data.list && res.data.list.length) {
return res.data.list[0].uid return res.data.list[0].uid
} }
@ -333,10 +352,7 @@ const tryRequest = async (url, retry = false) => {
const gachaTypeUrl = `${apiDomain}/common/gacha_record/api/getGachaLog?${queryString}&page=1&size=5&gacha_type=1&end_id=0` const gachaTypeUrl = `${apiDomain}/common/gacha_record/api/getGachaLog?${queryString}&page=1&size=5&gacha_type=1&end_id=0`
try { try {
const res = await request(gachaTypeUrl) const res = await request(gachaTypeUrl)
if (res.retcode !== 0) { checkResStatus(res)
return false
}
return true
} catch (e) { } catch (e) {
if (e.code === 'ERR_PROXY_CONNECTION_FAILED' && !retry) { if (e.code === 'ERR_PROXY_CONNECTION_FAILED' && !retry) {
await disableProxy() await disableProxy()
@ -351,11 +367,6 @@ const getUrl = async () => {
let url = await readLog() let url = await readLog()
if (!url && config.proxyMode) { if (!url && config.proxyMode) {
url = await useProxy() url = await useProxy()
} else if (url) {
const result = await tryRequest(url)
if (!result && config.proxyMode) {
url = await useProxy()
}
} }
return url return url
} }
@ -372,6 +383,9 @@ const fetchData = async (urlOverride) => {
sendMsg(message) sendMsg(message)
throw new Error(message) throw new Error(message)
} }
await tryRequest(url)
const searchParams = getQuerystring(url) const searchParams = getQuerystring(url)
if (!searchParams) { if (!searchParams) {
const message = text.url.incorrect const message = text.url.incorrect

View File

@ -42,14 +42,24 @@ const parseData = (data) => {
return result return result
} }
const assignData = (objA, objB) => {
const temp = { ...objA }
for (let key in objB) {
if (objB[key]) {
temp[key] = objB[key]
}
}
return temp
}
const i18nMap = new Map() const i18nMap = new Map()
const prepareData = () => { const prepareData = () => {
for (let key in raw) { for (let key in raw) {
let temp = {} let temp = {}
if (key === 'zh-tw') { if (key === 'zh-tw') {
Object.assign(temp, raw['zh-cn'], raw[key]) temp = assignData(raw['zh-cn'], raw[key])
} else { } else {
Object.assign(temp, raw['zh-cn'], raw['en-us'], raw[key]) temp = assignData(raw['zh-cn'], assignData(raw['en-us'], raw[key]))
} }
i18nMap.set(key, parseData(temp)) i18nMap.set(key, parseData(temp))
} }

View File

@ -6,13 +6,13 @@ const crypto = require('crypto')
const unhandled = require('electron-unhandled') const unhandled = require('electron-unhandled')
const windowStateKeeper = require('electron-window-state') const windowStateKeeper = require('electron-window-state')
const debounce = require('lodash/debounce') const debounce = require('lodash/debounce')
const Registry = require('winreg')
const isDev = !app.isPackaged const isDev = !app.isPackaged
const userPath = app.getPath('userData') const userPath = app.getPath('userData')
const appRoot = isDev ? path.resolve(__dirname, '..', '..') : userPath const appRoot = isDev ? path.resolve(__dirname, '..', '..') : path.resolve(app.getAppPath(), '..', '..')
const userDataPath = path.resolve(appRoot, 'userData') const userDataPath = path.resolve(appRoot, 'userData')
const globalUserDataPath = path.resolve(userPath, 'userData')
let win = null let win = null
const initWindow = () => { const initWindow = () => {
@ -25,6 +25,7 @@ const initWindow = () => {
y: mainWindowState.y, y: mainWindowState.y,
width: mainWindowState.width, width: mainWindowState.width,
height: mainWindowState.height, height: mainWindowState.height,
backgroundColor: '#fff',
webPreferences: { webPreferences: {
contextIsolation:false, contextIsolation:false,
nodeIntegration: true nodeIntegration: true
@ -56,7 +57,7 @@ const saveLog = () => {
const text = item[2] const text = item[2]
return `[${type}][${time}]${text}` return `[${type}][${time}]${text}`
}).join('\r\n') }).join('\r\n')
fs.outputFileSync(path.join(userDataPath, 'log.txt'), text) fs.outputFile(path.join(userDataPath, 'log.txt'), text)
} }
const authkeyMask = (text = '') => { const authkeyMask = (text = '') => {
@ -134,7 +135,7 @@ const detectLocale = (value) => {
const locale = value || app.getLocale() const locale = value || app.getLocale()
let result = 'zh-cn' let result = 'zh-cn'
for (let [key, list] of localeMap) { for (let [key, list] of localeMap) {
if (list.includes(locale)) { if (locale === key || list.includes(locale)) {
result = key result = key
break break
} }
@ -144,19 +145,20 @@ const detectLocale = (value) => {
const saveJSON = async (name, data) => { const saveJSON = async (name, data) => {
try { try {
await fs.outputJSON(path.join(userDataPath, name), data, { await fs.outputJSON(path.join(userDataPath, name), data)
spaces: 2 if (!isDev) {
}) await fs.outputJSON(path.join(globalUserDataPath, name), data)
}
} catch (e) { } catch (e) {
sendMsg(e, 'ERROR') sendMsg(e, 'ERROR')
await sleep(3) await sleep(3)
} }
} }
const readJSON = async (name) => { const readJSON = async (dataPath, name) => {
let data = null let data = null
try { try {
data = await fs.readJSON(path.join(userDataPath, name)) data = await fs.readJSON(path.join(dataPath, name))
} catch (e) {} } catch (e) {}
return data return data
} }
@ -203,5 +205,5 @@ const localIp = () => {
module.exports = { module.exports = {
sleep, request, hash, cipherAes, decipherAes, saveLog, sleep, request, hash, cipherAes, decipherAes, saveLog,
sendMsg, readJSON, saveJSON, initWindow, getWin, localIp, userPath, detectLocale, langMap, sendMsg, readJSON, saveJSON, initWindow, getWin, localIp, userPath, detectLocale, langMap,
appRoot, userDataPath appRoot, userDataPath, globalUserDataPath
} }

View File

@ -55,10 +55,12 @@
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="ui.button.solution" v-model="state.showCacheCleanDlg" width="90%" custom-class="max-w-md"> <el-dialog :title="ui.button.solution" v-model="state.showCacheCleanDlg" width="90%" custom-class="max-w-md cache-clean-dialog">
<el-button plain icon="folder" type="primary" @click="openCacheFolder">{{ui.button.cacheFolder}}</el-button> <el-button plain icon="folder" type="success" @click="openCacheFolder">{{ui.button.cacheFolder}}</el-button>
<p class="my-4 leading-2 text-gray-600 text-sm whitespace-pre-line">{{ui.extra.cacheClean}}</p> <p class="my-2 flex flex-col text-teal-800 text-[13px]">
<p class="my-2 text-gray-400 text-xs">{{ui.extra.findCacheFolder}}</p> <span class="my-1" v-for="txt of cacheCleanTextList">{{ txt }}</span>
</p>
<p class="my-2 text-gray-500 text-xs">{{ui.extra.findCacheFolder}}</p>
<template #footer> <template #footer>
<div class="dialog-footer text-center"> <div class="dialog-footer text-center">
<el-button type="primary" @click="state.showCacheCleanDlg = false" class="focus:outline-none">{{ui.common.ok}}</el-button> <el-button type="primary" @click="state.showCacheCleanDlg = false" class="focus:outline-none">{{ui.common.ok}}</el-button>
@ -99,6 +101,13 @@ const ui = computed(() => {
} }
}) })
const cacheCleanTextList = computed(() => {
if (ui.value) {
return ui.value.extra?.cacheClean?.split('\n')
}
return []
})
const gachaData = computed(() => { const gachaData = computed(() => {
return state.dataMap.get(state.current) return state.dataMap.get(state.current)
}) })

View File

@ -14,3 +14,9 @@
@apply rounded-full bg-gray-300; @apply rounded-full bg-gray-300;
} }
} }
@layer utilities {
.cache-clean-dialog .el-dialog__body {
padding: 0 20px;
}
}

View File

@ -1,11 +1,11 @@
import * as IconComponents from '@element-plus/icons-vue' import * as IconComponents from '@element-plus/icons-vue'
const weaponTypeNames = new Set([ const weaponTypeNames = new Set([
'光锥', 'Light Cone', '光錐', 'Lichtkegel', 'Conos de luz', 'cônes de lumière', '光円錐', '광추', 'Cones de Luz', 'Световые конусы', 'Nón Ánh Sáng' '光锥', '光錐', 'Lichtkegel', 'Light Cone', 'Conos de luz', 'cônes de lumière', '光円錐', '광추', 'Cones de Luz', 'Световые конусы', 'Nón Ánh Sáng'
]) ])
const characterTypeNames = new Set([ const characterTypeNames = new Set([
'角色', 'Character', '캐릭터', 'キャラクター', 'Personaje', 'Personnage', 'Персонажи', 'ตัวละคร', 'Nhân Vật', 'Figur', 'Karakter', 'Personagem' '角色', 'Figur', 'Character', 'Personajes', 'Personnages', 'Karakter', 'キャラクター', '캐릭터', 'Personagens', 'Персонажи', 'ตัวละคร', 'Nhân Vật'
]) ])
const isCharacter = (name) => characterTypeNames.has(name) const isCharacter = (name) => characterTypeNames.has(name)