Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
142 lines (122 loc) · 5.58 KB
/
Copy pathindex.js
File metadata and controls
142 lines (122 loc) · 5.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import { allLoaders, loaders } from "./loader"
import { formatNameString } from "./util"
import { getFromModrinth } from "./version"
export const releaseVersions = [], snapshotVersions = []
const data = {}, failedText = '<span style="color:red">No Available Version</span>'
let customMods, selectedLoader
export function getOrCreateVersionData(key) {
if (!data[key]) data[key] = {}
return data[key]
}
window.onload = async _ => {
createCard(document.getElementById('loaders'), 'img/forge.webp', 'Forge', 'forge', false)
createCard(document.getElementById('loaders'), 'img/fabric.webp', 'Fabric', 'fabric', false)
createCard(document.getElementById('loaders'), 'img/neoforge.webp', 'NeoForge', 'neoforge', false)
let versions = await fetch('https://launchermeta.mojang.com/mc/game/version_manifest_v2.json').then(res => res.json()).catch(err => console.log(err))
for (let { id, type } of versions.versions)
if (type === 'release') releaseVersions.push(id)
else if (type === 'snapshot') snapshotVersions.push(id)
let mcVersion = document.getElementById('mcVersion')
mcVersion.innerHTML = ''
releaseVersions.forEach(x => mcVersion.innerHTML += `<option value=${x}>${x}</option>`)
mcVersion.value = window.localStorage.getItem('mcVersion') ?? versions.latest.release
customMods = JSON.parse(window.localStorage.getItem('customMods') ?? '[]')
await Promise.all(customMods.map(initializeCard))
await Promise.all([...loaders, ...customMods.map(getFromModrinth)].map(fn => Promise.resolve().then(fn)))
console.log(data)
if (import.meta.env.MODE !== 'production') {
window.data = data
window.customMods = customMods
}
}
window.addNewVersion = async _ => {
let slug = document.getElementById('slug').value
if (customMods.indexOf(slug) >= 0) return alert('This project has been added!')
let meta = await fetch(`https://api.modrinth.com/v2/project/${slug}`).then(res => res.json()).catch(_ => alert('cannot find such project'))
if (meta) {
customMods.push(slug)
window.localStorage.setItem('customMods', JSON.stringify(customMods))
createCard(document.getElementById('mods'), meta.icon_url, meta.title, slug, true)
getFromModrinth(slug)
hideForm()
}
}
window.hideForm = _ => {
document.getElementById('addNew').hidden = true
document.getElementById('slug').value = ''
}
window.updateAll = _ => {
selectedLoader = null
allLoaders.forEach(x => selectedLoader = document.getElementById('loader-' + x).checked ? x : selectedLoader)
allLoaders.forEach(x => document.getElementById('item-' + x).hidden = selectedLoader != null && selectedLoader != x);
[...allLoaders, ...customMods].forEach(updateVersion)
window.localStorage.setItem('mcVersion', document.getElementById('mcVersion').value)
}
const initializeCard = async slug => {
createCard(document.getElementById('mods'), 'img/unknown.webp', slug, slug, true)
let meta = await fetch(`https://api.modrinth.com/v2/project/${slug}`).then(res => res.json()).catch(_ => alert('cannot find such project'))
if (meta) {
document.getElementById('logo-' + slug).src = meta.icon_url
document.getElementById('title-' + slug).innerText = meta.title
} else {
customMods.remove(slug)
window.localStorage.setItem('customMods', JSON.stringify(customMods))
}
}
export function updateVersion(slug) {
document.getElementById('verions-' + slug).innerHTML = calculateVerionText(slug, document.getElementById('mcVersion').value)
}
const calculateVerionText = (slug, mcVersion) => {
let d = data[mcVersion]
if (!d) return failedText
switch (slug) {
case 'forge': return `${mcVersion}-${d.forge ?? failedText}`
case 'fabric': return `Loader: ${d.fabric ?? failedText}<br>Yarn: ${d.yarn?.name ?? failedText}`
case 'neoforge': return d.neoforge ?? failedText
default:
if (d[slug])
if (selectedLoader)
return d[slug][selectedLoader] ? `${d[slug][selectedLoader].version} (${d[slug][selectedLoader].id})` : failedText
else
return Object.keys(d[slug]).map(x => `${formatNameString(x)}: ${d[slug][x].version} (${d[slug][x].id})`).join('<br>')
else return failedText
}
}
const createCard = (container, imgSrc, title, slug, canDelete) => {
let item = document.createElement('div')
item.id = 'item-' + slug
item.className = 'item'
item.style.position = 'relative'
container.appendChild(item)
if (canDelete) {
let closeBtn = document.createElement('button')
closeBtn.innerHTML = '×'
closeBtn.className = 'close-btn'
closeBtn.addEventListener('click', () => {
item.remove()
customMods.remove(slug)
window.localStorage.setItem('customMods', JSON.stringify(customMods))
})
item.appendChild(closeBtn)
}
let mainFlex = document.createElement('div')
mainFlex.style.display = 'flex'
let img = document.createElement('img')
img.id = 'logo-' + slug
img.className = 'logo-img'
img.src = imgSrc
img.style.margin = '10px'
mainFlex.appendChild(img)
let nameH1 = document.createElement('h2')
nameH1.id = 'title-' + slug
nameH1.innerText = title
nameH1.style.margin = '10px'
nameH1.style.textAlign = 'center'
mainFlex.appendChild(nameH1)
item.append(mainFlex)
let version = document.createElement('div')
version.id = 'verions-' + slug
version.innerHTML = 'Loading...'
version.className = 'version'
item.append(version)
}