Compare commits

...

9 Commits

Author SHA1 Message Date
mio
a2dcda6be0 fix: empty records may fail (#26) 2023-05-12 12:46:21 +08:00
mio
dcaad1d544 fix: missing region in saved JSON 2023-05-11 21:01:29 +08:00
mio
69042728da feat: using built-in gachaType 2023-05-11 20:31:24 +08:00
0103a0fb4b fix: rename gacha type (#24)
修改卡池名称
`群星跃迁` -> `常驻跃迁`
`始发跃迁` -> `新手跃迁`

Fixes: #22
2023-05-11 19:55:06 +08:00
mio
1052a4bffb upgrade version 2023-05-06 12:55:25 +08:00
mio
2fd8730cdd fix: use Player.log instead of Player-prev (#18) 2023-05-06 10:11:38 +08:00
mio
bbc52af184 fix: the pity value in excel is incorrect (#15) 2023-05-05 14:04:08 +08:00
mio
38ed348865 fix: i18n(zh-cn) 光錐 -> 光锥 2023-05-05 09:56:06 +08:00
mio
29548310c5 docs: update picture 2023-05-04 16:49:44 +08:00
16 changed files with 319 additions and 30 deletions

View File

@ -15,7 +15,9 @@
## 使用说明
1. 下载工具后解压 - 下载地址: [Github](https://github.com/biuuu/star-rail-warp-export/releases/latest/download/StarRailWarpExport.zip) / [蓝奏云](https://wwvt.lanzoum.com/b022mikwh) 密码:f1iy
2. 打开游戏的跃迁历史记录
2. 打开游戏的跃迁详情页面
![详情页面](/docs/wish-history.png)
3. 点击工具的“加载数据”按钮

View File

@ -17,7 +17,9 @@ If you feel that the existing translation is inappropriate, you can send a pull
## Usage
1. Unzip after downloading the tool - [Download](https://github.com/biuuu/star-rail-warp-export/releases/latest/download/StarRailWarpExport.zip)
2. Open the warp history of the game
2. Open the warp details page of the game
![warp details](/docs/wish-history-en.png)
3. Click the tool's "Load data" button

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

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

275
src/gachaType.json Normal file
View File

@ -0,0 +1,275 @@
[
[
"de-de",
[
{
"key": "11",
"name": "Figuren-Aktionswarp"
},
{
"key": "12",
"name": "Lichtkegel-Aktionswarp"
},
{
"key": "1",
"name": "Standardwarp"
},
{
"key": "2",
"name": "Einsteigerwarp"
}
]
],
[
"ru-ru",
[
{
"key": "11",
"name": "Прыжок события: Персонаж"
},
{
"key": "12",
"name": "Прыжок события: Световой конус"
},
{
"key": "1",
"name": "Стандартный прыжок"
},
{
"key": "2",
"name": "Прыжок новичка"
}
]
],
[
"th-th",
[
{
"key": "11",
"name": "กิจกรรมวาร์ปตัวละคร"
},
{
"key": "12",
"name": "กิจกรรมวาร์ป Light Cone"
},
{
"key": "1",
"name": "วาร์ปถาวร"
},
{
"key": "2",
"name": "วาร์ปสำหรับมือใหม่"
}
]
],
[
"zh-cn",
[
{
"key": "11",
"name": "角色活动跃迁"
},
{
"key": "12",
"name": "光锥活动跃迁"
},
{
"key": "1",
"name": "常驻跃迁"
},
{
"key": "2",
"name": "新手跃迁"
}
]
],
[
"zh-tw",
[
{
"key": "11",
"name": "角色活動躍遷"
},
{
"key": "12",
"name": "光錐活動躍遷"
},
{
"key": "1",
"name": "常駐躍遷"
},
{
"key": "2",
"name": "新手躍遷"
}
]
],
[
"en-us",
[
{
"key": "11",
"name": "Character Event Warp"
},
{
"key": "12",
"name": "Light Cone Event Warp"
},
{
"key": "1",
"name": "Regular Warp"
},
{
"key": "2",
"name": "Starter Warp"
}
]
],
[
"es-es",
[
{
"key": "11",
"name": "Salto de evento de personaje"
},
{
"key": "12",
"name": "Salto de evento de cono de luz"
},
{
"key": "1",
"name": "Salto normal"
},
{
"key": "2",
"name": "Salto de principiante"
}
]
],
[
"fr-fr",
[
{
"key": "11",
"name": "Saut hyperespace événement de personnage"
},
{
"key": "12",
"name": "Saut hyperespace événement de cônes de lumière"
},
{
"key": "1",
"name": "Saut hyperespace classique"
},
{
"key": "2",
"name": "Saut hyperespace de départ"
}
]
],
[
"id-id",
[
{
"key": "11",
"name": "Event Warp Karakter"
},
{
"key": "12",
"name": "Event Warp Light Cone"
},
{
"key": "1",
"name": "Warp Reguler"
},
{
"key": "2",
"name": "Warp Pemula"
}
]
],
[
"ja-jp",
[
{
"key": "11",
"name": "イベント跳躍・キャラクター"
},
{
"key": "12",
"name": "イベント跳躍・光円錐"
},
{
"key": "1",
"name": "恒常跳躍"
},
{
"key": "2",
"name": "初心者跳躍"
}
]
],
[
"ko-kr",
[
{
"key": "11",
"name": "캐릭터 이벤트 워프"
},
{
"key": "12",
"name": "광추 이벤트 워프"
},
{
"key": "1",
"name": "상시 워프"
},
{
"key": "2",
"name": "초보자 워프"
}
]
],
[
"pt-pt",
[
{
"key": "11",
"name": "Salto Hiperespacial de Evento de Personagem"
},
{
"key": "12",
"name": "Salto Hiperespacial de Evento de Cone de Luz"
},
{
"key": "1",
"name": "Salto Hiperespacial Permanente"
},
{
"key": "2",
"name": "Salto Hiperespacial Inicial"
}
]
],
[
"vi-vn",
[
{
"key": "11",
"name": "Bước Nhảy Sự Kiện Nhân Vật"
},
{
"key": "12",
"name": "Bước Nhảy Sự Kiện Nón Ánh Sáng"
},
{
"key": "1",
"name": "Bước Nhảy Vĩnh Viễn"
},
{
"key": "2",
"name": "Bước Nhảy Tân Thủ"
}
]
]
]

View File

@ -42,7 +42,7 @@
"ui.setting.seaServer": "Global server",
"ui.setting.logTypeHint": "Choose which server generated logs to be used first when acquiring URL from game logs",
"ui.setting.autoUpdate": "Auto update",
"ui.setting.hideNovice": "Hide Departure Warp",
"ui.setting.hideNovice": "Hide Starter Warp",
"ui.setting.proxyMode": "Proxy mode",
"ui.setting.proxyModeHint": "When we fail to get the URL from system logs, use the system proxy",
"ui.setting.fetchFullHistory": "Get complete data",

View File

@ -22,7 +22,7 @@
"ui.data.sum": "已累计",
"ui.data.no5star": "抽未出5星",
"ui.data.character": "角色",
"ui.data.weapon": "光",
"ui.data.weapon": "光",
"ui.data.star5": "5星",
"ui.data.star4": "4星",
"ui.data.star3": "3星",
@ -30,9 +30,9 @@
"ui.data.average": "5星平均出货次数为",
"ui.data.chara5": "5星角色",
"ui.data.chara4": "4星角色",
"ui.data.weapon5": "5星光",
"ui.data.weapon4": "4星光",
"ui.data.weapon3": "3星光",
"ui.data.weapon5": "5星光",
"ui.data.weapon4": "4星光",
"ui.data.weapon3": "3星光",
"ui.setting.title": "设置",
"ui.setting.language": "语言",
"ui.setting.languageHint": "缺少翻译时,会默认显示简体中文",
@ -42,7 +42,7 @@
"ui.setting.seaServer": "外服",
"ui.setting.logTypeHint": "使用游戏日志获取URL时优先选择哪种服务器生成的日志文件。",
"ui.setting.autoUpdate": "自动更新",
"ui.setting.hideNovice": "隐藏始发跃迁",
"ui.setting.hideNovice": "隐藏新手跃迁",
"ui.setting.proxyMode": "代理模式",
"ui.setting.proxyModeHint": "通过设置系统代理来获取URL无法从日志中获取到有效的URL时才会启动代理服务器。",
"ui.setting.fetchFullHistory": "获取完整数据",

View File

@ -42,7 +42,7 @@
"ui.setting.seaServer": "國際服",
"ui.setting.logTypeHint": "使用遊戲記錄取得 URL 時,優先選擇哪種伺服器產生的記錄檔案。",
"ui.setting.autoUpdate": "自動更新",
"ui.setting.hideNovice": "隱藏始發躍遷",
"ui.setting.hideNovice": "隱藏新手躍遷",
"ui.setting.proxyMode": "Proxy 模式",
"ui.setting.proxyModeHint": "透過設定系統 Proxy 以取得 URL將會在從系統記錄中取得 URL 失敗時啟動。",
"ui.setting.fetchFullHistory": "取得完整資料",

View File

@ -4,7 +4,6 @@ const { app, ipcMain, dialog } = require('electron')
const fs = require('fs-extra')
const path = require('path')
const i18n = require('./i18n')
const cloneDeep = require('lodash-es/cloneDeep').default
function pad(num) {
return `${num}`.padStart(2, "0");
@ -87,7 +86,7 @@ const start = async () => {
arr.push(total)
arr.push(pity)
temp.push(arr)
if (log.rank_type === 5) {
if (log.rank_type === '5') {
pity = 0
}
// if (key === '301') {

View File

@ -9,6 +9,7 @@ const i18n = require('./i18n')
const { enableProxy, disableProxy } = require('./module/system-proxy')
const mitmproxy = require('./module/node-mitmproxy')
const { mergeData } = require('./utils/mergeData')
const gachaTypeRaw = require('../gachaType.json')
const dataMap = new Map()
const order = ['11', '12', '1', '2']
@ -17,7 +18,6 @@ let apiDomain = 'https://api-takumi.mihoyo.com'
const saveData = async (data, url) => {
const obj = Object.assign({}, data)
obj.result = [...obj.result]
obj.typeMap = [...obj.typeMap]
await config.save()
await saveJSON(`gacha-list-${data.uid}.json`, obj)
}
@ -25,8 +25,8 @@ const saveData = async (data, url) => {
const defaultTypeMap = new Map([
['11', '角色活动跃迁'],
['12', '光锥活动跃迁'],
['1', '群星跃迁'],
['2', '始发跃迁']
['1', '常驻跃迁'],
['2', '新手跃迁']
])
const findDataFiles = async (dataPath, fileMap) => {
@ -83,7 +83,7 @@ const detectGameLocale = async (userPath) => {
const arr = ['/miHoYo/崩坏:星穹铁道/', '/Cognosphere/Star Rail/']
arr.forEach(str => {
try {
const pathname = path.join(userPath, '/AppData/LocalLow/', str, 'Player-prev.log')
const pathname = path.join(userPath, '/AppData/LocalLow/', str, 'Player.log')
fs.accessSync(pathname, fs.constants.F_OK)
list.push(pathname)
} catch (e) {}
@ -163,7 +163,7 @@ const getGachaLog = async ({ key, page, name, retryCount, url, endId }) => {
const text = i18n.log
try {
const res = await request(`${url}&gacha_type=${key}&page=${page}&size=${20}${endId ? '&end_id=' + endId : ''}`)
return res.data.list
return res?.data
} catch (e) {
if (retryCount) {
sendMsg(i18n.parse(text.fetch.retry, { name, page, count: 6 - retryCount }))
@ -181,7 +181,8 @@ const getGachaLogs = async ({ name, key }, queryString) => {
const text = i18n.log
let page = 1
let list = []
let res = []
let res = null
let logs = []
let uid = ''
let region = ''
let region_time_zone = ''
@ -195,8 +196,9 @@ const getGachaLogs = async ({ name, key }, queryString) => {
sendMsg(i18n.parse(text.fetch.current, { name, page }))
res = await getGachaLog({ key, page, name, url, endId, retryCount: 5 })
await sleep(0.3)
if (!uid && res.length) {
uid = res[0].uid
logs = res?.list || []
if (!uid && logs.length) {
uid = logs[0].uid
}
if (!region) {
region = res.region
@ -204,14 +206,14 @@ const getGachaLogs = async ({ name, key }, queryString) => {
if (!region_time_zone) {
region_time_zone = res.region_time_zone
}
list.push(...res)
list.push(...logs)
page += 1
if (res.length) {
endId = res[res.length - 1].id
if (logs.length) {
endId = logs[logs.length - 1].id
}
if (!config.fetchFullHistory && res.length && uid && dataMap.has(uid)) {
if (!config.fetchFullHistory && logs.length && uid && dataMap.has(uid)) {
const result = dataMap.get(uid).result
if (result.has(key)) {
const arr = result.get(key)
@ -219,7 +221,7 @@ const getGachaLogs = async ({ name, key }, queryString) => {
const localLatestId = arr[arr.length - 1].id
if (localLatestId) {
let shouldBreak = false
res.forEach(item => {
logs.forEach(item => {
if (item.id === localLatestId) {
shouldBreak = true
}
@ -231,7 +233,7 @@ const getGachaLogs = async ({ name, key }, queryString) => {
}
}
}
} while (res.length > 0)
} while (logs.length > 0)
return { list, uid, region, region_time_zone }
}
@ -263,7 +265,7 @@ const tryGetUid = async (queryString) => {
return config.current
}
const gachaTypeMap = new Map(JSON.parse('[["de-de",[{"key":"11","name":"Figuren-Aktionswarp"},{"key":"12","name":"Lichtkegel-Aktionswarp"},{"key":"1","name":"Stellarwarp"},{"key":"2","name":"Startwarp"}]],["ru-ru",[{"key":"11","name":"Прыжок события: Персонаж"},{"key":"12","name":"Прыжок события: Световой конус"},{"key":"1","name":"Звёздный Прыжок"},{"key":"2","name":"Отправной Прыжок"}]],["th-th",[{"key":"11","name":"กิจกรรมวาร์ปตัวละคร"},{"key":"12","name":"กิจกรรมวาร์ป Light Cone"},{"key":"1","name":"วาร์ปสู่ดวงดาว"},{"key":"2","name":"ก้าวแรกแห่งการวาร์ป"}]],["zh-cn",[{"key":"11","name":"角色活动跃迁"},{"key":"12","name":"光锥活动跃迁"},{"key":"1","name":"群星跃迁"},{"key":"2","name":"始发跃迁"}]],["zh-tw",[{"key":"11","name":"角色活動躍遷"},{"key":"12","name":"光錐活動躍遷"},{"key":"1","name":"群星躍遷"},{"key":"2","name":"始發躍遷"}]],["en-us",[{"key":"11","name":"Character Event Warp"},{"key":"12","name":"Light Cone Event Warp"},{"key":"1","name":"Stellar Warp"},{"key":"2","name":"Departure Warp"}]],["es-es",[{"key":"11","name":"Salto de evento de personaje"},{"key":"12","name":"Salto de evento de cono de luz"},{"key":"1","name":"Salto estelar"},{"key":"2","name":"Salto de partida"}]],["fr-fr",[{"key":"11","name":"Saut hyperespace événement de personnage"},{"key":"12","name":"Saut hyperespace événement de cônes de lumière"},{"key":"1","name":"Saut stellaire"},{"key":"2","name":"Saut hyperespace de départ"}]],["id-id",[{"key":"11","name":"Event Warp Karakter"},{"key":"12","name":"Event Warp Light Cone"},{"key":"1","name":"Warp Bintang-Bintang"},{"key":"2","name":"Warp Keberangkatan"}]],["ja-jp",[{"key":"11","name":"イベント跳躍・キャラクター"},{"key":"12","name":"イベント跳躍・光円錐"},{"key":"1","name":"群星跳躍"},{"key":"2","name":"始発跳躍"}]],["ko-kr",[{"key":"11","name":"캐릭터 이벤트 워프"},{"key":"12","name":"광추 이벤트 워프"},{"key":"1","name":"뭇별의 워프"},{"key":"2","name":"초행길 워프"}]],["pt-pt",[{"key":"11","name":"Salto Hiperespacial de Evento de Personagem"},{"key":"12","name":"Salto Hiperespacial de Evento de Cone de Luz"},{"key":"1","name":"Salto Hiperespacial Estelar"},{"key":"2","name":"Salto Hiperespacial de Novatos"}]],["vi-vn",[{"key":"11","name":"Bước Nhảy Sự Kiện Nhân Vật"},{"key":"12","name":"Bước Nhảy Sự Kiện Nón Ánh Sáng"},{"key":"1","name":"Bước Nhảy Chòm Sao"},{"key":"2","name":"Bước Nhảy Đầu Tiên"}]]]'))
const gachaTypeMap = new Map(gachaTypeRaw)
const getGachaType = (lang) => {
const locale = detectLocale(lang)
return gachaTypeMap.get(locale || lang)
@ -426,7 +428,7 @@ const fetchData = async (urlOverride) => {
originTimeZone = region_time_zone
}
}
const data = { result, time: Date.now(), typeMap, uid: originUid, lang, region: originRegion, region_time_zone: originTimeZone }
const data = { result, typeMap, time: Date.now(), uid: originUid, lang, region: originRegion, region_time_zone: originTimeZone }
const localData = dataMap.get(originUid)
const mergedResult = mergeData(localData, data)
data.result = mergedResult

View File

@ -79,6 +79,7 @@ import GachaDetail from './components/GachaDetail.vue'
import Setting from './components/Setting.vue'
import gachaDetail from './gachaDetail'
import { version } from '../../package.json'
import gachaType from '../gachaType.json'
const state = reactive({
status: 'init',
@ -158,11 +159,19 @@ const detail = computed(() => {
})
const typeMap = computed(() => {
const data = state.dataMap.get(state.current)
return data.typeMap
const gachaTypeMap = new Map(gachaType)
const type = gachaTypeMap.get(state.config.lang)
const result = new Map()
if (type) {
for (let { key, name } of type) {
result.set(key, name)
}
}
return result
})
const fetchData = async (url) => {
state.log = ''
state.status = 'loading'
const data = await ipcRenderer.invoke('FETCH_DATA', url)
if (data) {