diff options
| author | Pinapelz <yukais@pinapelz.com> | 2025-12-21 01:26:05 -0800 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2025-12-21 01:26:05 -0800 |
| commit | cbacc1cd7924c558c27c89ab0b6723dc73d0db08 (patch) | |
| tree | 1daea8aee6e5f221c457459abb5f8e6f365635d3 | |
| parent | 579056de198595979ae2cf692a32d0456353764f (diff) | |
remove old tachi_to_tachi userscripts (use universal)
| -rw-r--r-- | chuni/tachi/README.md | 24 | ||||
| -rw-r--r-- | chuni/tachi/tachi_to_tachi_pb.js | 127 | ||||
| -rw-r--r-- | chuni/tachi/tachi_to_tachi_session.js | 111 | ||||
| -rw-r--r-- | mai2/tachi/README.md | 19 | ||||
| -rw-r--r-- | mai2/tachi/tachi_to_tachi_session.js | 104 | ||||
| -rw-r--r-- | ongeki/tachi/README.md | 1 | ||||
| -rw-r--r-- | ongeki/tachi/tachi_to_tachi_pb.js | 91 | ||||
| -rw-r--r-- | ongeki/tachi/tachi_to_tachi_session.js | 108 | ||||
| -rw-r--r-- | wacca/tachi/README.md | 1 | ||||
| -rw-r--r-- | wacca/tachi/tachi_to_tachi_pb.js | 76 | ||||
| -rw-r--r-- | wacca/tachi/tachi_to_tachi_session.js | 0 |
11 files changed, 0 insertions, 662 deletions
diff --git a/chuni/tachi/README.md b/chuni/tachi/README.md deleted file mode 100644 index c11178b..0000000 --- a/chuni/tachi/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Not Maintained. Use the universal script for sessions - -# CHUNITHM Tachi to Tachi - -This is a bookmarklet that will allow you to download data shown in the Web UI of Tachi into a `Batch-Manual` compatible form again. - -This can be handy if you want to download/save data from the MYT network if you are already in a Tachi instance that has integrations with it. - -# Scripts - -## `tachi_to_tachi_pb.js` -Takes data from your profile page which only shows your PB for each song -Page: `https://my-tachi-instance.com/u/USERNAME/games/chunithm/Single/scores` - -## `tachi_to_tachi_session.js` -For a singular session. Choose the session to export and go to the `All Scores` tab -Page: `https://my-tachi-instance.com/u/USERNAME/games/chunithm/Single/sessions/SESSION_ID` - -# Usage - -1. Copy the contents of the script you want to use -2. Create a new bookmark and paste the full contents of the script into the URL section -3. Navigate to the relevant score page as shown in the previous section -4. Show as many scores as possible on a singular view, if you exceed the largest limit then repeat the steps above for the next page(s) diff --git a/chuni/tachi/tachi_to_tachi_pb.js b/chuni/tachi/tachi_to_tachi_pb.js deleted file mode 100644 index 43355ee..0000000 --- a/chuni/tachi/tachi_to_tachi_pb.js +++ /dev/null @@ -1,127 +0,0 @@ -javascript:void(function () { - function parseChunithmTable() { - const rows = document.querySelectorAll("table.table tbody tr"); - const difficultyMap = { - E: "Expert", - A: "Advanced", - B: "Basic", - M: "Master" - }; - const results = { - meta: { - game: "chunithm", - playtype: "Single", - service: "Tachi to Tachi PB Export", - }, - scores: [] - }; - - for (let i = 0; i < rows.length; i += 3) { - const row = rows[i]; - if (!row) continue; - - const cells = row.querySelectorAll("td"); - if (cells.length < 11) continue; - - let difficulty = cells[1].innerText.trim().replace(/\n/, " ").split(" ")[0]; - if (difficulty.length === 1) { - difficulty = difficultyMap[difficulty] || difficulty; - } - - const songAnchor = cells[3].querySelector("a"); - const title = songAnchor?.childNodes[0]?.textContent.trim() || ""; - const artist = songAnchor?.querySelector("small")?.textContent.trim() || ""; - - const scoreRank = cells[5].querySelector("strong")?.innerText.trim() || ""; - const scoreValue = parseInt( - cells[5].innerText.replace(scoreRank, "").trim().replace(/,/g, "") - ); - - const judgementText = cells[6].innerText.trim(); - const parts = judgementText.split("-").map((x) => parseInt(x.trim())); - const [jcrit, justice, attack, miss] = parts; - - const fastSlowMatch = judgementText.match(/\(F:(\d+)\s+S:(\d+)\)/); - const fast = fastSlowMatch ? parseInt(fastSlowMatch[1]) : undefined; - const slow = fastSlowMatch ? parseInt(fastSlowMatch[2]) : undefined; - - const lamp = cells[7].innerText.trim(); - let clearLamp = "FAILED"; - let noteLamp = "NONE"; - - if (lamp.includes("FULL COMBO")) { - noteLamp = "FULL COMBO"; - clearLamp = "CLEAR"; - } - if (lamp.includes("CLEAR")) { - clearLamp = "CLEAR"; - } - if (lamp.includes("ALL JUSTICE")) { - noteLamp = "ALL JUSTICE"; - clearLamp = "CLEAR"; - } - if (lamp.includes("ALL JUSTICE CRITICAL")) { - noteLamp = "ALL JUSTICE CRITICAL"; - clearLamp = "CLEAR"; - } - if (lamp.includes("HARD")) { - clearLamp = "HARD"; - } - if (lamp.includes("BRAVE")) { - clearLamp = "BRAVE"; - } - if (lamp.includes("ABSOLUTE")) { - clearLamp = "ABSOLUTE"; - } - if (lamp.includes("CATASTROPHY")) { - clearLamp = "CATASTROPHY"; - } - const rating = parseFloat(cells[8].innerText.trim()); - - const timestampText = cells[10].innerText.trim().split("\n"); - const timestampString = timestampText[1]?.trim() || ""; - const timeAchieved = timestampString ? new Date(timestampString).getTime() : 0; - - const score = { - score: scoreValue, - clearLamp, - noteLamp, - matchType: "songTitle", - difficulty, - identifier: title, - artist, - judgements: { - jcrit, - justice, - attack, - miss, - }, - timeAchieved - }; - - if (fast !== undefined && slow !== undefined) { - score.judgements.fast = fast; - score.judgements.slow = slow; - } - - results.scores.push(score); - } - - return results; - } - - function downloadJSON(data) { - const blob = new Blob([JSON.stringify(data, null, 2)], { - type: "application/json", - }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = "chunithm_table.json"; - a.click(); - URL.revokeObjectURL(url); - } - - const data = parseChunithmTable(); - downloadJSON(data); -})(); diff --git a/chuni/tachi/tachi_to_tachi_session.js b/chuni/tachi/tachi_to_tachi_session.js deleted file mode 100644 index e360e8a..0000000 --- a/chuni/tachi/tachi_to_tachi_session.js +++ /dev/null @@ -1,111 +0,0 @@ -javascript: void (function () { - function parseChunithmTable() { - const rows = document.querySelectorAll("table.table tbody tr"); - const results = { - meta: { - game: "chunithm", - playtype: "Single", - service: "Tachi to Tachi Export", - }, - scores: [], - }; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - const cells = row.querySelectorAll("td"); - if ( - cells.length < 9 || - row.classList.contains("expandable-pseudo-row") || - row.classList.contains("fake-row") - ) - continue; - let difficultyCell = cells[0]; - let difficultyText = difficultyCell.innerText.trim(); - let difficultyMatch = difficultyText.match( - /(MASTER|EXPERT|ADVANCED|BASIC|M|E|A|B)/i, - ); - let difficulty = difficultyMatch - ? difficultyMatch[0].toUpperCase() - : "UNKNOWN"; - const difficultyMap = { - M: "Master", - E: "Expert", - A: "Advanced", - B: "Basic", - }; - if (difficulty.length === 1) - difficulty = difficultyMap[difficulty] || difficulty; - const songAnchor = cells[2].querySelector("a"); - const title = songAnchor?.childNodes[0]?.textContent.trim() || ""; - const artist = - songAnchor?.querySelector("small")?.textContent.trim() || ""; - const scoreRank = - cells[3].querySelector("strong")?.innerText.trim() || ""; - const scoreValue = parseInt( - cells[3].innerText.replace(scoreRank, "").trim().replace(/,/g, ""), - ); - const judgementText = cells[4].innerText.trim(); - const parts = judgementText.split("-").map((x) => parseInt(x.trim())); - const [jcrit, justice, attack, miss] = parts; - const lamp = cells[5].innerText.trim(); - let clearLamp = "FAILED"; - let noteLamp = "NONE"; - - if (lamp.includes("FULL COMBO")) { - noteLamp = "FULL COMBO"; - clearLamp = "CLEAR"; - } - if (lamp.includes("CLEAR")) { - clearLamp = "CLEAR"; - } - if (lamp.includes("ALL JUSTICE")) { - noteLamp = "ALL JUSTICE"; - clearLamp = "CLEAR"; - } - if (lamp.includes("ALL JUSTICE CRITICAL")) { - noteLamp = "ALL JUSTICE CRITICAL"; - clearLamp = "CLEAR"; - } - if (lamp.includes("HARD")) { - clearLamp = "HARD"; - } - if (lamp.includes("BRAVE")) { - clearLamp = "BRAVE"; - } - if (lamp.includes("ABSOLUTE")) { - clearLamp = "ABSOLUTE"; - } - if (lamp.includes("CATASTROPHY")) { - clearLamp = "CATASTROPHY"; - } - const timestampCellLines = cells[7].innerText.trim().split("\n"); - const dateString = - timestampCellLines.find((line) => /\w+ \d+, \d+/.test(line)) || ""; - const timeAchieved = dateString ? new Date(dateString).getTime() : 0; - results.scores.push({ - score: scoreValue, - clearLamp, - noteLamp, - matchType: "songTitle", - difficulty, - identifier: title, - artist, - judgements: { jcrit, justice, attack, miss }, - timeAchieved, - }); - } - return results; - } - function downloadJSON(data) { - const blob = new Blob([JSON.stringify(data, null, 2)], { - type: "application/json", - }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = "chunithm_table.json"; - a.click(); - URL.revokeObjectURL(url); - } - const data = parseChunithmTable(); - downloadJSON(data); -})(); diff --git a/mai2/tachi/README.md b/mai2/tachi/README.md deleted file mode 100644 index ac01b10..0000000 --- a/mai2/tachi/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Not Maintained. Use the universal script for sessions -# maimai DX Tachi to Tachi - -This is a bookmarklet that will allow you to download data shown in the Web UI of Tachi into a `Batch-Manual` compatible form again. - -This can be handy if you want to download/save data from the MYT network if you are already in a Tachi instance that has integrations with it. - -# Scripts - -## `tachi_to_tachi_session.js` -For a singular session. Choose the session to export and go to the `All Scores` tab -Page: `https://my-tachi-instance.com/u/USERNAME/games/chunithm/Single/sessions/SESSION_ID` - -# Usage - -1. Copy the contents of the script you want to use -2. Create a new bookmark and paste the full contents of the script into the URL section -3. Navigate to the relevant score page as shown in the previous section -4. Show as many scores as possible on a singular view, if you exceed the largest limit then repeat the steps above for the next page(s) diff --git a/mai2/tachi/tachi_to_tachi_session.js b/mai2/tachi/tachi_to_tachi_session.js deleted file mode 100644 index f9befa5..0000000 --- a/mai2/tachi/tachi_to_tachi_session.js +++ /dev/null @@ -1,104 +0,0 @@ -javascript:void(async function () { - function waitForRows() { - return new Promise((resolve) => { - const check = () => { - const rows = document.querySelectorAll("table tbody tr"); - if (rows.length > 0) resolve(rows); - else setTimeout(check, 500); - }; - check(); - }); - } - - const difficultyMap = { - "DX Basic": "DX Basic", - "DX Advanced": "DX Advanced", - "DX Expert": "DX Expert", - "DX Master": "DX Master", - "DX Re:Master": "DX Re:Master" - }; - - const lampMap = { - "FAILED": "FAILED", - "CLEAR": "CLEAR", - "FULL COMBO": "FULL COMBO", - "FULL COMBO+": "FULL COMBO+", - "ALL PERFECT": "ALL PERFECT", - "ALL PERFECT+": "ALL PERFECT+" - }; - - const gradeList = ["D", "C", "B", "BB", "BBB", "A", "AA", "AAA", "S", "S+", "SS", "SS+", "SSS", "SSS+"]; - - const rows = await waitForRows(); - - const results = { - meta: { - game: "maimaidx", - playtype: "Single", - service: "Tachi to Tachi PB Export" - }, - scores: [] - }; - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - if (row.classList.contains("expandable-pseudo-row") || row.classList.contains("fake-row")) continue; - - const cells = row.querySelectorAll("td"); - if (cells.length < 9) continue; - - const difficultyText = cells[0].innerText.split("\n")[0].trim(); - const difficulty = Object.keys(difficultyMap).find(d => difficultyText.includes(d)) || difficultyText; - - const titleAnchor = cells[2].querySelector("a"); - const title = titleAnchor?.childNodes[0]?.textContent.trim() || ""; - const artist = titleAnchor?.querySelector("small")?.textContent.trim() || ""; - - const percentText = cells[3].innerText.trim(); - const percent = parseFloat(percentText.match(/([\d.]+)%/)?.[1]) || 0; - const grade = gradeList.find(g => percentText.includes(g)) || "D"; - - const judgmentSpans = cells[4].querySelectorAll("span"); - const [pcrit, perfect, great, good, miss] = Array.from(judgmentSpans).map(span => parseInt(span.textContent.trim())); - - const lampText = cells[5].innerText.trim(); - const lamp = lampMap[lampText] || "FAILED"; - - const timeText = cells[7].querySelector("small")?.textContent?.trim(); - let timeAchieved = null; - if (timeText) { - const parsed = new Date(timeText); - if (!isNaN(parsed)) { - timeAchieved = parsed.getTime(); - } - } - - const score = { - identifier: title, - artist, - difficulty, - percent, - lamp, - judgements: { - pcrit, - perfect, - great, - good, - miss - }, - matchType: "songTitle", - timeAchieved: timeAchieved - }; - - results.scores.push(score); - } - - const blob = new Blob([JSON.stringify(results, null, 2)], { type: "application/json" }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = "maimaidx_session_scores.json"; - document.body.appendChild(a); - a.click(); - URL.revokeObjectURL(url); -})(); diff --git a/ongeki/tachi/README.md b/ongeki/tachi/README.md deleted file mode 100644 index bc1c4c2..0000000 --- a/ongeki/tachi/README.md +++ /dev/null @@ -1 +0,0 @@ -# Not Maintained. Use the universal script for sessions diff --git a/ongeki/tachi/tachi_to_tachi_pb.js b/ongeki/tachi/tachi_to_tachi_pb.js deleted file mode 100644 index 97c707e..0000000 --- a/ongeki/tachi/tachi_to_tachi_pb.js +++ /dev/null @@ -1,91 +0,0 @@ -javascript:(function() { - function toUnixMillis(s) { - try { return new Date(s).getTime(); } - catch { return null; } - } - - const rows = document.querySelectorAll("table tbody tr"); - const scores = []; - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - const cells = row.querySelectorAll("td"); - if (cells.length < 11) continue; - - let chart = cells[0].innerText.trim().split(/\s+/)[0].toUpperCase(); - if (chart === "EXP") chart = "EXPERT"; - if (!["BASIC", "ADVANCED", "EXPERT", "MASTER", "LUNATIC"].includes(chart)) continue; - - const anchor = cells[2].querySelector("a"); - if (!anchor) continue; - - const parts = anchor.innerHTML.split("<br>"); - const temp = document.createElement("div"); - temp.innerHTML = parts[0]; - const title = temp.textContent.trim(); - temp.innerHTML = parts[1] || ""; - const artist = temp.textContent.trim(); - - const scoreText = cells[4].innerText.trim().split("\n").pop().replace(/,/g, ""); - const score = parseInt(scoreText, 10); - if (isNaN(score)) continue; - - const noteLamp = (cells[7].innerText.trim() || "UNKNOWN").toUpperCase(); - - const small = cells[10].querySelector("small"); - const dateText = small?.textContent.trim(); - const timeAchieved = dateText ? toUnixMillis(dateText) : null; - - const judgementDiv = cells[6].querySelector("div"); - let cbreak = 0, breaks = 0, hit = 0, miss = 0, bellCount = 0, totalBellCount = 0, damage = 0; - - if (judgementDiv) { - const spans = judgementDiv.parentElement.querySelectorAll("span"); - if (spans.length >= 4) { - cbreak = parseInt(spans[0].textContent) || 0; - breaks = parseInt(spans[1].textContent) || 0; - hit = parseInt(spans[2].textContent) || 0; - miss = parseInt(spans[3].textContent) || 0; - } - const bellDamageSpans = judgementDiv.parentElement.parentElement.querySelectorAll("span"); - if (bellDamageSpans.length >= 6) { - const bellMatch = bellDamageSpans[4].textContent.match(/(\d+)\/(\d+)/); - if (bellMatch) { - bellCount = parseInt(bellMatch[1]); - totalBellCount = parseInt(bellMatch[2]); - } - damage = parseInt(bellDamageSpans[5].textContent) || 0; - } - } - - scores.push({ - score, - noteLamp, - bellLamp: "NONE", - matchType: "songTitle", - identifier: title, - artist, - difficulty: chart, - timeAchieved, - judgements: { cbreak, break: breaks, hit, miss }, - optional: { bellCount, totalBellCount, damage } - }); - } - - const result = { - meta: { - game: "ongeki", - playtype: "Single", - service: "bookmarkelt" - }, - scores - }; - - const blob = new Blob([JSON.stringify(result, null, 2)], { type: "application/json" }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = "ongeki_batch_manual.json"; - a.click(); - URL.revokeObjectURL(url); -})(); diff --git a/ongeki/tachi/tachi_to_tachi_session.js b/ongeki/tachi/tachi_to_tachi_session.js deleted file mode 100644 index aed6d59..0000000 --- a/ongeki/tachi/tachi_to_tachi_session.js +++ /dev/null @@ -1,108 +0,0 @@ -javascript:(function () { - function toUnixMillis(s) { - try { return new Date(s).getTime(); } - catch { return null; } - } - - const rows = document.querySelectorAll("table tbody tr"); - const scores = []; - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - if (!row || row.classList.contains("expandable-pseudo-row") || row.classList.contains("fake-row")) continue; - - const cells = row.querySelectorAll("td"); - if (cells.length < 10) continue; - - let chartText = cells[0].querySelector("div.d-none.d-lg-block")?.textContent.trim() || - cells[0].querySelector("div.d-lg-none")?.textContent.trim() || ""; - let chart = chartText.split(/\s+/)[0].toUpperCase(); - if (chart === "EXP") chart = "EXPERT"; - if (!["BASIC", "ADVANCED", "EXPERT", "MASTER", "LUNATIC"].includes(chart)) continue; - - const anchor = cells[2].querySelector("a"); - if (!anchor) continue; - - const [titleHtml, artistHtml] = anchor.innerHTML.split("<br>"); - const temp = document.createElement("div"); - temp.innerHTML = titleHtml; - const title = temp.textContent.trim(); - temp.innerHTML = artistHtml || ""; - const artist = temp.textContent.trim(); - - const scoreText = cells[3].innerText.trim().split("\n").pop().replace(/,/g, ""); - const score = parseInt(scoreText, 10); - if (isNaN(score)) continue; - - let platinumScore = 0; - const platinumText = cells[4].innerText.trim(); - const platinumMatch = platinumText.match(/\[(\d+)\/(\d+)\]/); - if (platinumMatch) { - platinumScore = parseInt(platinumMatch[1], 10); - } - - let cbreak = 0, breaks = 0, hit = 0, miss = 0, bellCount = 0, totalBellCount = 0; - const judgementDiv = cells[5].querySelector("strong > div"); - if (judgementDiv) { - const judgementSpans = judgementDiv.querySelectorAll("span"); - if (judgementSpans.length >= 4) { - cbreak = parseInt(judgementSpans[0].textContent) || 0; - breaks = parseInt(judgementSpans[1].textContent) || 0; - hit = parseInt(judgementSpans[2].textContent) || 0; - miss = parseInt(judgementSpans[3].textContent) || 0; - } - - const bellDiv = judgementDiv.nextElementSibling; - if (bellDiv) { - const bellMatch = bellDiv.textContent.match(/(\d+)\/(\d+)/); - if (bellMatch) { - bellCount = parseInt(bellMatch[1]); - totalBellCount = parseInt(bellMatch[2]); - } - } - } - - let damage = 0; - const damageText = cells[6].innerText.trim(); - damage = parseInt(damageText, 10) || 0; - - const noteLamp = (cells[7].innerText.trim() || "UNKNOWN").toUpperCase(); - - let timeAchieved = null; - const smallTags = cells[9].querySelectorAll("small"); - if (smallTags.length > 0) { - timeAchieved = toUnixMillis(smallTags[0].textContent.trim()); - } - - scores.push({ - score, - platinumScore, - noteLamp, - bellLamp: "NONE", - matchType: "songTitle", - identifier: title, - artist, - difficulty: chart, - timeAchieved, - judgements: { cbreak, break: breaks, hit, miss }, - optional: { bellCount, totalBellCount, damage } - }); - } - - const result = { - meta: { - game: "ongeki", - playtype: "Single", - service: "bookmarklet Tachi to Tachi" - }, - scores - }; - - const blob = new Blob([JSON.stringify(result, null, 2)], { type: "application/json" }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = "ongeki_batch_manual.json"; - a.click(); - URL.revokeObjectURL(url); -})(); diff --git a/wacca/tachi/README.md b/wacca/tachi/README.md deleted file mode 100644 index bc1c4c2..0000000 --- a/wacca/tachi/README.md +++ /dev/null @@ -1 +0,0 @@ -# Not Maintained. Use the universal script for sessions diff --git a/wacca/tachi/tachi_to_tachi_pb.js b/wacca/tachi/tachi_to_tachi_pb.js deleted file mode 100644 index 286bbfe..0000000 --- a/wacca/tachi/tachi_to_tachi_pb.js +++ /dev/null @@ -1,76 +0,0 @@ -javascript:(function(){ - var rows = document.querySelectorAll("table tbody tr"), - songs = []; - rows.forEach(function(row) { - var songAnchor = row.querySelector("td:nth-child(4) a"); - if (!songAnchor) return; - var cells = row.cells; - var chartDiv = cells[1].querySelector("div.d-none.d-lg-block"), - chart = chartDiv ? chartDiv.textContent.trim() : cells[1].textContent.trim(); - var songTitle = "", artist = ""; - if (songAnchor) { - var parts = songAnchor.innerHTML.split("<br>"); - if (parts.length >= 2) { - var temp = document.createElement("div"); - temp.innerHTML = parts[0]; - songTitle = temp.textContent.trim(); - temp.innerHTML = parts[1]; - artist = temp.textContent.trim(); - } else { - songTitle = songAnchor.textContent.trim(); - } - } - - var scoreCell = cells[5], - scoreText = scoreCell.textContent.replace((scoreCell.querySelector("strong") || {}).textContent.trim() || "", "").trim(), - scorePoints = parseInt(scoreText.replace(/,/g, "")); - - var judgementText = cells[6].textContent.trim(), - judgements = judgementText.split("-").map(function(item) { - return parseInt(item.trim()); - }); - - var lamp = cells[7].textContent.trim(); - - var timeCell = cells[10]; - var timeString = timeCell ? timeCell.querySelector("small")?.textContent?.trim() : null; - var timeUnix = timeString ? new Date(timeString).getTime() : null; - - songs.push({ - difficulty: chart.split(" ")[0], - matchType: "songTitle", - identifier: songTitle, - artist: artist, - score: scorePoints, - judgements: { - marvelous: judgements[0], - great: judgements[1], - good: judgements[2], - miss: judgements[3] - }, - lamp: lamp, - timeAchieved: timeUnix - }); - }); - - const results = { - meta: { - game: "wacca", - playtype: "Single", - service: "Tachi to Tachi PB Export" - }, - scores: songs - }; - - var json = JSON.stringify(results, null, 2), - blob = new Blob([json], { type: "application/json" }), - url = URL.createObjectURL(blob), - a = document.createElement("a"); - a.setAttribute("download", "songs.json"); - a.setAttribute("href", url); - a.style.display = "none"; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); -})(); diff --git a/wacca/tachi/tachi_to_tachi_session.js b/wacca/tachi/tachi_to_tachi_session.js deleted file mode 100644 index e69de29..0000000 --- a/wacca/tachi/tachi_to_tachi_session.js +++ /dev/null |
