import { objectKeys, objectLoop, objectMap } from '@dzeio/object-util' import express from 'express' import Serie from './V2/Components/Serie' import Set from './V2/Components/Set' import de from '../generated/de/stats.json' import en from '../generated/en/stats.json' import es from '../generated/es/stats.json' import fr from '../generated/fr/stats.json' import id from '../generated/id/stats.json' import it from '../generated/it/stats.json' import ja from '../generated/ja/stats.json' import ko from '../generated/ko/stats.json' import nl from '../generated/nl/stats.json' import pl from '../generated/pl/stats.json' // import ptbr from '../generated/pt-br/stats.json' import ptpt from '../generated/pt-pt/stats.json' import pt from '../generated/pt/stats.json' import ru from '../generated/ru/stats.json' import th from '../generated/th/stats.json' import zhcn from '../generated/zh-cn/stats.json' import zhtw from '../generated/zh-tw/stats.json' const langs = { 'zh-cn': zhcn, 'zh-tw': zhtw, 'nl': nl, 'en': en, 'fr': fr, 'de': de, 'id': id, 'it': it, 'ja': ja, 'ko': ko, 'pl': pl, 'pt': pt, // 'pt-br': ptbr, 'pt-pt': ptpt, 'ru': ru, 'es': es, 'th': th, } as const const langsToName = { 'zh-cn': 'Chinese (simplified)', 'zh-tw': 'Chinese (traditionnal)', 'nl': 'Dutch', 'en': 'English', 'fr': 'French', 'de': 'German', 'id': 'Indonesian', 'it': 'Italian', 'ja': 'Japanese', 'ko': 'Korean', 'pl': 'Polish', 'pt': 'Portuguese (Brazil)', // 'pt-br': 'Portuguese (brazil)', 'pt-pt': 'Portuguese (Portugal)', 'ru': 'Russian', 'es': 'Spanish', 'th': 'Thai', } as const /** * This file is meant to contains the TCGdex Project status page. */ /** * Simple calculation of maximum and current count globally */ const totalStats = { count: objectMap(langs, (it) => it.count).reduce((p, c) => p + c, 0), total: objectMap(langs, (it) => it.total).reduce((p, c) => p + c, 0), images: objectMap(langs, (it) => it.images).reduce((p, c) => p + c, 0), } const asiaLangs = [ 'ja', 'ko', 'zh-tw', 'id', 'th', 'zh-cn', ] const totalInter = { count: objectMap(langs, (it, key) => asiaLangs.includes(key) ? 0 : it.count).reduce((p, c) => p + c, 0), total: objectMap(langs, (it, key) => asiaLangs.includes(key) ? 0 : it.total).reduce((p, c) => p + c, 0), images: objectMap(langs, (it, key) => asiaLangs.includes(key) ? 0 : it.images).reduce((p, c) => p + c, 0), } const totalAsia = { count: objectMap(langs, (it, key) => asiaLangs.includes(key) ? it.count : 0).reduce((p, c) => p + c, 0), total: objectMap(langs, (it, key) => asiaLangs.includes(key) ? it.total : 0).reduce((p, c) => p + c, 0), images: objectMap(langs, (it, key) => asiaLangs.includes(key) ? it.images : 0).reduce((p, c) => p + c, 0), } /** * Array containing data for sets, it also allow to display non english available sets * Serie * Set * Array of langs */ const setsData: Record>> = {} function preProcessSets(t: any, lang: keyof typeof langsToName) { objectLoop(t.sets, (sets, serieId: string) => { if (!(serieId in setsData)) { setsData[serieId] = {} } objectLoop(sets, (_, set: string) => { if (!(set in setsData[serieId])) { setsData[serieId][set] = [] } setsData[serieId][set].push(lang) }) }) } objectLoop(langs, (stats, key) => preProcessSets(stats, key)) // ${enStats.count} of ${enStats.total} ${(100 * enStats.count / enStats.total).toFixed(2)}% // Yes this is ugly export default express.Router() .get('/github.svg', (_, res): void => { res.setHeader('Content-Type', 'image/svg+xml') res.send(` Dutch English French German Italian Polish Portuguese (Brazil) Portuguese (Portugal) Russian Spanish Total Inter Cards Progress ${langs['nl'].count} of ${langs['nl'].total} (${(100 * langs['nl'].count / langs['nl'].total).toFixed(2)}%) ${langs['en'].count} of ${langs['en'].total} (${(100 * langs['en'].count / langs['en'].total).toFixed(2)}%) ${langs['fr'].count} of ${langs['fr'].total} (${(100 * langs['fr'].count / langs['fr'].total).toFixed(2)}%) ${langs['de'].count} of ${langs['de'].total} (${(100 * langs['de'].count / langs['de'].total).toFixed(2)}%) ${langs['it'].count} of ${langs['it'].total} (${(100 * langs['it'].count / langs['it'].total).toFixed(2)}%) ${langs['pl'].count} of ${langs['pl'].total} (${(100 * langs['pl'].count / langs['pl'].total).toFixed(2)}%) ${langs['pt'].count} of ${langs['pt'].total} (${(100 * langs['pt'].count / langs['pt'].total).toFixed(2)}%) ${langs['pt-pt'].count} of ${langs['pt-pt'].total} (${(100 * langs['pt-pt'].count / langs['pt-pt'].total).toFixed(2)}%) ${langs['ru'].count} of ${langs['ru'].total} (${(100 * langs['ru'].count / langs['ru'].total).toFixed(2)}%) ${langs['es'].count} of ${langs['es'].total} (${(100 * langs['es'].count / langs['es'].total).toFixed(2)}%) ${totalInter.count} of ${totalInter.total} (${(100 * totalInter.count / totalInter.total).toFixed(2)}%) Images Progress ${langs['nl'].images} of ${langs['nl'].total} (${(100 * langs['nl'].images / langs['nl'].total).toFixed(2)}%) ${langs['en'].images} of ${langs['en'].total} (${(100 * langs['en'].images / langs['en'].total).toFixed(2)}%) ${langs['fr'].images} of ${langs['fr'].total} (${(100 * langs['fr'].images / langs['fr'].total).toFixed(2)}%) ${langs['de'].images} of ${langs['de'].total} (${(100 * langs['de'].images / langs['de'].total).toFixed(2)}%) ${langs['it'].images} of ${langs['it'].total} (${(100 * langs['it'].images / langs['it'].total).toFixed(2)}%) ${langs['pl'].images} of ${langs['pl'].total} (${(100 * langs['pl'].images / langs['pl'].total).toFixed(2)}%) ${langs['pt'].images} of ${langs['pt'].total} (${(100 * langs['pt'].images / langs['pt'].total).toFixed(2)}%) ${langs['pt-pt'].images} of ${langs['pt-pt'].total} (${(100 * langs['pt-pt'].images / langs['pt-pt'].total).toFixed(2)}%) ${langs['ru'].images} of ${langs['ru'].total} (${(100 * langs['ru'].images / langs['ru'].total).toFixed(2)}%) ${langs['es'].images} of ${langs['es'].total} (${(100 * langs['es'].images / langs['es'].total).toFixed(2)}%) ${totalInter.images} of ${totalInter.total} (${(100 * totalInter.images / totalInter.total).toFixed(2)}%) Total Progress ${langs['nl'].count + langs['nl'].images} of ${langs['nl'].total * 2} (${(100 * (langs['nl'].count + langs['nl'].images) / (langs['nl'].total * 2)).toFixed(2)}%) ${langs['en'].count + langs['en'].images} of ${langs['en'].total * 2} (${(100 * (langs['en'].count + langs['en'].images) / (langs['en'].total * 2)).toFixed(2)}%) ${langs['fr'].count + langs['fr'].images} of ${langs['fr'].total * 2} (${(100 * (langs['fr'].count + langs['fr'].images) / (langs['fr'].total * 2)).toFixed(2)}%) ${langs['de'].count + langs['de'].images} of ${langs['de'].total * 2} (${(100 * (langs['de'].count + langs['de'].images) / (langs['de'].total * 2)).toFixed(2)}%) ${langs['it'].count + langs['it'].images} of ${langs['it'].total * 2} (${(100 * (langs['it'].count + langs['it'].images) / (langs['it'].total * 2)).toFixed(2)}%) ${langs['pl'].count + langs['pl'].images} of ${langs['pl'].total * 2} (${(100 * (langs['pl'].count + langs['pl'].images) / (langs['pl'].total * 2)).toFixed(2)}%) ${langs['pt'].count + langs['pt'].images} of ${langs['pt'].total * 2} (${(100 * (langs['pt'].count + langs['pt'].images) / (langs['pt'].total * 2)).toFixed(2)}%) ${langs['pt-pt'].count + langs['pt-pt'].images} of ${langs['pt-pt'].total * 2} (${(100 * (langs['pt-pt'].count + langs['pt-pt'].images) / (langs['pt-pt'].total * 2)).toFixed(2)}%) ${langs['ru'].count + langs['ru'].images} of ${langs['ru'].total * 2} (${(100 * (langs['ru'].count + langs['ru'].images) / (langs['ru'].total * 2)).toFixed(2)}%) ${langs['es'].count + langs['es'].images} of ${langs['es'].total * 2} (${(100 * (langs['es'].count + langs['es'].images) / (langs['es'].total * 2)).toFixed(2)}%) ${totalInter.images + totalInter.count} of ${totalInter.total * 2} (${(100 * (totalInter.count + totalInter.images) / (totalInter.total * 2)).toFixed(2)}%) Chinese (Traditionnal) Chinese (Simplified) Indonesian Japanese Korean Thai Total Asia Cards Progress ${langs['zh-tw'].count} of ${langs['zh-tw'].total} (${(100 * langs['zh-tw'].count / langs['zh-tw'].total).toFixed(2)}%) ${langs['zh-cn'].count} of ${langs['zh-cn'].total} (${(100 * langs['zh-cn'].count / langs['zh-cn'].total).toFixed(2)}%) ${langs['id'].count} of ${langs['id'].total} (${(100 * langs['id'].count / langs['id'].total).toFixed(2)}%) ${langs['ja'].count} of ${langs['ja'].total} (${(100 * langs['ja'].count / langs['ja'].total).toFixed(2)}%) ${langs['ko'].count} of ${langs['ko'].total} (${(100 * langs['ko'].count / langs['ko'].total).toFixed(2)}%) ${langs['th'].count} of ${langs['th'].total} (${(100 * langs['th'].count / langs['th'].total).toFixed(2)}%) ${totalAsia.count} of ${totalAsia.total} (${(100 * totalAsia.count / totalAsia.total).toFixed(2)}%) Images Progress ${langs['zh-tw'].images} of ${langs['zh-tw'].total} (${(100 * langs['zh-tw'].images / langs['zh-tw'].total).toFixed(2)}%) ${langs['zh-cn'].images} of ${langs['zh-cn'].total} (${(100 * langs['zh-cn'].images / langs['zh-cn'].total).toFixed(2)}%) ${langs['id'].images} of ${langs['id'].total} (${(100 * langs['id'].images / langs['id'].total).toFixed(2)}%) ${langs['ja'].images} of ${langs['ja'].total} (${(100 * langs['ja'].images / langs['ja'].total).toFixed(2)}%) ${langs['ko'].images} of ${langs['ko'].total} (${(100 * langs['ko'].images / langs['ko'].total).toFixed(2)}%) ${langs['th'].images} of ${langs['th'].total} (${(100 * langs['th'].images / langs['th'].total).toFixed(2)}%) ${totalAsia.images} of ${totalAsia.total} (${(100 * totalAsia.images / totalAsia.total).toFixed(2)}%) Total Progress ${langs['zh-tw'].count + langs['zh-tw'].images} of ${langs['zh-tw'].total * 2} (${(100 * (langs['zh-tw'].count + langs['zh-tw'].images) / (langs['zh-tw'].total * 2)).toFixed(2)}%) ${langs['zh-cn'].count + langs['zh-cn'].images} of ${langs['zh-cn'].total * 2} (${(100 * (langs['zh-cn'].count + langs['zh-cn'].images) / (langs['zh-cn'].total * 2)).toFixed(2)}%) ${langs['id'].count + langs['id'].images} of ${langs['id'].total * 2} (${(100 * (langs['id'].count + langs['id'].images) / (langs['id'].total * 2)).toFixed(2)}%) ${langs['ja'].count + langs['ja'].images} of ${langs['ja'].total * 2} (${(100 * (langs['ja'].count + langs['ja'].images) / (langs['ja'].total * 2)).toFixed(2)}%) ${langs['ko'].count + langs['ko'].images} of ${langs['ko'].total * 2} (${(100 * (langs['ko'].count + langs['ko'].images) / (langs['ko'].total * 2)).toFixed(2)}%) ${langs['th'].count + langs['th'].images} of ${langs['th'].total * 2} (${(100 * (langs['th'].count + langs['th'].images) / (langs['th'].total * 2)).toFixed(2)}%) ${totalAsia.count + totalAsia.images} of ${totalAsia.total * 2} (${(100 * (totalAsia.count + totalAsia.images) / (totalAsia.total * 2)).toFixed(2)}%) `) }) .get('/', (_, res): void => { res.send(` TCGdex Project status

TCGdex Progress

${objectMap(langsToName, (name) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')} ${objectMap(langs, (it) => ``).join('')}
${name}Total
Card Progress
Cards${it.count} of ${it.total}${totalStats.count} of ${totalStats.total}
Percentage${(100 * it.count / it.total).toFixed(2)}%${(100 * totalStats.count / totalStats.total).toFixed(2)}%
Remaining${it.total - it.count}${totalStats.total - totalStats.count}
Images Progress
Cards${it.images} of ${it.total}${totalStats.images} of ${totalStats.total}
Percentage${(100 * it.images / it.total).toFixed(2)}%${(100 * totalStats.images / totalStats.total).toFixed(2)}%
Remaining${it.total - it.images}${totalStats.total - totalStats.images}
Total Progress
Cards${it.images + it.count} of ${it.total * 2}${totalStats.images + totalStats.count} of ${totalStats.total * 2}
Percentage${(100 * (it.images + it.count) / (it.total * 2)).toFixed(2)}%${(100 * (totalStats.images + totalStats.count) / (totalStats.total * 2)).toFixed(2)}%
Remaining${it.total * 2 - (it.images + it.count)}${totalStats.total * 2 - (totalStats.images + totalStats.count)}

Status

${objectMap(setsData, (serie, serieId) => { // Loop through every series and name them const name = Serie.findOne('en', { id: serieId })?.name ?? Serie.findOne('ja' as any, { id: serieId })?.name return ` ${objectMap(langsToName, (name) => ``).join('')} ${objectMap(langsToName, () => ``).join('')} ${objectMap(serie, (data, setId) => { // loop through every sets // find the set in the first available language (Should be English globally) const setTotal = Set.findOne(data[0] as 'en', { id: setId }) let str = '' + `` // let str = '' + `` // Loop through every languages const l = objectKeys(langs) l.map((it) => { // Change the stats file depending on the language let stats: any = langs[it] // Get the stats we want const item = stats.sets[serieId]?.[setId] as {count: number, images: number} | undefined // if item dont exist for the language skip it if (!item) { str += `` }) // finish Row return str + '' }).join('')} `}).join('')}

${name} (${serieId})

Set Name${name}
CardsImages
${setTotal?.name} (${setId})
${setTotal?.cardCount.total ?? 1} cards
${setId})` return } // Calculate percentages and status const percent = 100 * item.count / (setTotal?.cardCount.total ?? 1) const imgPercent = 100 * item.images / (setTotal?.cardCount.total ?? 1) // const percent = 100 //100 * item.count / (setTotal?.cardCount.total ?? 1) // const imgPercent = 100 //100 * item.images / (setTotal?.cardCount.total ?? 1) // append to string :D str +=`${percent.toFixed(2)}%
(${item.count})
${imgPercent.toFixed(2)}%
(${item.images})
`) })