Spaces:
Running
Running
{ | |
"version": 3, | |
"sources": ["../../../tools/set-import/importer.ts"], | |
"sourcesContent": ["import * as http from 'http';\nimport * as https from 'https';\nimport * as url from 'url';\nimport * as util from 'util';\n\nimport * as smogon from 'smogon';\n\nimport { Streams } from '../../lib';\nimport { Dex, toID } from '../../sim/dex';\nimport { TeamValidator } from '../../sim/team-validator';\nDex.includeModData();\n\ntype DeepPartial<T> = {\n\t[P in keyof T]?: T[P] extends (infer I)[]\n\t\t? (DeepPartial<I>)[]\n\t\t: DeepPartial<T[P]>;\n};\n\ninterface PokemonSets {\n\t[speciesid: string]: {\n\t\t[name: string]: DeepPartial<PokemonSet>,\n\t};\n}\n\ninterface IncomingMessage extends NodeJS.ReadableStream {\n\tstatusCode: number;\n\theaders: { location?: string };\n}\n\n// eg. 'gen1.json'\ninterface GenerationData {\n\t[formatid: string]: FormatData;\n}\n\n// eg. 'gen7balancedhackmons.json'\ninterface FormatData {\n\t[source: string]: PokemonSets;\n}\n\ntype GenerationNum = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\n// The tiers we support, ie. ones that we have data sources for.\nexport const TIERS = new Set([\n\t'ubers', 'ou', 'uu', 'ru', 'nu', 'pu', 'zu', 'lc', 'cap', 'nationaldex',\n\t'doublesou', 'battlespotsingles', 'battlespotdoubles', 'battlestadiumsingles',\n\t// UGH\n\t'battlestadiumsinglesseries2', 'battlestadiumsinglesregulationc',\n\t//\n\t'vgc2016', 'vgc2017', 'vgc2018', 'vgc2019ultraseries', 'vgc2020', 'vgc2023regulatione', 'vgc', '1v1',\n\t'anythinggoes', 'nationaldexag', 'almostanyability', 'balancedhackmons',\n\t'letsgoou', 'monotype', 'purehackmons', 'nationaldexmonotype',\n]);\nconst FORMATS = new Map<ID, { gen: GenerationNum, format: Format }>();\nconst VALIDATORS = new Map<ID, TeamValidator>();\nfor (let gen = 1; gen <= 9; gen++) {\n\tfor (const tier of TIERS) {\n\t\tconst format = Dex.formats.get(`gen${gen}${tier}`);\n\t\tif (format.effectType === 'Format') {\n\t\t\tFORMATS.set(format.id, { gen: gen as GenerationNum, format });\n\t\t\tVALIDATORS.set(format.id, new TeamValidator(format));\n\t\t}\n\t}\n}\n\nexport async function importAll() {\n\tconst index = await request(smogon.Statistics.URL);\n\n\tconst imports = [];\n\tfor (let gen = 1; gen <= 9; gen++) {\n\t\timports.push(importGen(gen as GenerationNum, index));\n\t}\n\n\treturn Promise.all(imports);\n}\n\nasync function importGen(gen: GenerationNum, index: string) {\n\tconst data: GenerationData = {};\n\n\tconst smogonSetsByFormat: { [formatid: string]: PokemonSets } = {};\n\tconst thirdPartySetsByFormat: { [source: string]: { [formatid: string]: PokemonSets } } = {};\n\n\tconst numByFormat: { [formatid: string]: number } = {};\n\tconst imports = [];\n\tconst dex = Dex.forFormat(`gen${gen}ou`);\n\tfor (const id in dex.data.Pokedex) {\n\t\tif (!eligible(dex, id as ID)) continue;\n\t\tconst species = dex.species.get(id);\n\t\tif (species.battleOnly) continue;// Smogon collapses these into their out of battle species\n\t\timports.push(importSmogonSets(dex.species.get(id).name, gen, smogonSetsByFormat, numByFormat));\n\t}\n\tawait Promise.all(imports);\n\n\tfor (const { format, gen: g } of FORMATS.values()) {\n\t\tif (g !== gen) continue;\n\n\t\tif (smogonSetsByFormat[format.id] && Object.keys(smogonSetsByFormat[format.id]).length) {\n\t\t\tdata[format.id] = {};\n\t\t\tdata[format.id]['dex'] = smogonSetsByFormat[format.id];\n\t\t\treport(format, numByFormat[format.id], 'dex');\n\t\t}\n\n\t\tfor (const source in thirdPartySetsByFormat) {\n\t\t\tif (thirdPartySetsByFormat[source][format.id] && Object.keys(thirdPartySetsByFormat[source][format.id]).length) {\n\t\t\t\tdata[format.id] = data[format.id] || {};\n\t\t\t\tdata[format.id][source] = thirdPartySetsByFormat[source][format.id];\n\t\t\t}\n\t\t}\n\n\t\tconst stats = await getStatisticsURL(index, format);\n\t\tif (!stats) continue;\n\t\ttry {\n\t\t\tconst statistics = smogon.Statistics.process(await request(stats.url));\n\t\t\tconst sets = importUsageBasedSets(gen, format, statistics, stats.count);\n\t\t\tif (Object.keys(sets).length) {\n\t\t\t\tdata[format.id] = data[format.id] || {};\n\t\t\t\tdata[format.id]['stats'] = sets;\n\t\t\t}\n\t\t\tdata[format.id] = data[format.id] || {};\n\t\t} catch (err) {\n\t\t\terror(`${stats.url} = ${err}`);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nfunction eligible(dex: ModdedDex, id: ID) {\n\tconst gen = toGen(dex, id);\n\tif (!gen || gen > dex.gen) return false;\n\n\tconst species = dex.species.get(id);\n\tif (['Mega', 'Primal', 'Ultra'].some(f => species.forme.startsWith(f))) return true;\n\n\t// Species with formes distinct enough to merit inclusion\n\tconst unique = ['darmanitan', 'meloetta', 'greninja', 'zygarde'];\n\t// Too similar to their base forme/species to matter\n\tconst similar = ['pichu', 'pikachu', 'genesect', 'basculin', 'magearna', 'keldeo', 'vivillon'];\n\n\tif (species.battleOnly && !unique.some(f => id.startsWith(f))) return false;\n\n\t// Most of these don't have analyses\n\tconst capNFE = species.isNonstandard === 'CAP' && species.nfe;\n\n\treturn !id.endsWith('totem') && !capNFE && !similar.some(f => id.startsWith(f) && id !== f);\n}\n\n// TODO: Fix dex data such that CAP mons have a correct gen set\nfunction toGen(dex: ModdedDex, name: string): GenerationNum | undefined {\n\tconst pokemon = dex.species.get(name);\n\tif (pokemon.isNonstandard === 'LGPE') return 7;\n\tif (!pokemon.exists || (pokemon.isNonstandard && pokemon.isNonstandard !== 'CAP')) return undefined;\n\t// CAP mons should have a gen property\n\tif (pokemon.gen) return pokemon.gen as GenerationNum;\n\n\tconst n = pokemon.num;\n\tif (n > 905) return 9;\n\tif (n > 810) return 8;\n\tif (n > 721) return 7;\n\tif (n > 649) return 6;\n\tif (n > 493) return 5;\n\tif (n > 386) return 4;\n\tif (n > 251) return 3;\n\tif (n > 151) return 2;\n\tif (n > 0) return 1;\n}\n\nasync function importSmogonSets(\n\tpokemon: string,\n\tgen: GenerationNum,\n\tsetsByFormat: { [format: string]: PokemonSets },\n\tnumByFormat: { [format: string]: number }\n) {\n\tconst analysesByFormat = await getAnalysesByFormat(pokemon, gen);\n\tif (!analysesByFormat) return;\n\n\tfor (const [format, analyses] of analysesByFormat.entries()) {\n\t\tconst dex = Dex.forFormat(format);\n\t\tlet setsForPokemon = setsByFormat[format.id];\n\t\tif (!setsForPokemon) {\n\t\t\tsetsForPokemon = {};\n\t\t\tsetsByFormat[format.id] = setsForPokemon;\n\t\t}\n\n\t\tlet baseSpecies = dex.species.get(pokemon);\n\t\tif (baseSpecies.baseSpecies !== baseSpecies.name) baseSpecies = dex.species.get(baseSpecies.baseSpecies);\n\t\tconst battleOnlyFormes: Species[] = [];\n\t\tif (baseSpecies.otherFormes) {\n\t\t\tfor (const forme of baseSpecies.otherFormes) {\n\t\t\t\tconst formeSpecies = dex.species.get(forme);\n\t\t\t\tif (formeSpecies.battleOnly && eligible(dex, toID(formeSpecies))) {\n\t\t\t\t\tbattleOnlyFormes.push(formeSpecies);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const analysis of analyses) {\n\t\t\tfor (const moveset of analysis.movesets) {\n\t\t\t\tconst set = movesetToPokemonSet(dex, format, pokemon, moveset);\n\t\t\t\tconst name = cleanName(moveset.name);\n\t\t\t\taddSmogonSet(dex, format, pokemon, name, set, setsForPokemon, numByFormat);\n\t\t\t\tfor (const battleOnlyForme of battleOnlyFormes) {\n\t\t\t\t\t// Note: this is just a shallow copy which is fine because we're just modifying the ability\n\t\t\t\t\tconst s = { ...set };\n\t\t\t\t\tif (!format.id.includes('balancedhackmons')) s.ability = battleOnlyForme.abilities[0];\n\t\t\t\t\tif (typeof battleOnlyForme.battleOnly !== 'string') {\n\t\t\t\t\t\tif (!battleOnlyForme.battleOnly!.includes(pokemon)) continue;\n\t\t\t\t\t\tconst species = dex.species.get(pokemon);\n\t\t\t\t\t\tconst disambiguated = `${name} - ${species.baseForme || species.forme}`;\n\t\t\t\t\t\taddSmogonSet(dex, format, battleOnlyForme.name, disambiguated, s, setsForPokemon, numByFormat, pokemon);\n\t\t\t\t\t} else if (battleOnlyForme.battleOnly === pokemon) {\n\t\t\t\t\t\taddSmogonSet(dex, format, battleOnlyForme.name, name, s, setsForPokemon, numByFormat);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction addSmogonSet(\n\tdex: ModdedDex,\n\tformat: Format,\n\tpokemon: string,\n\tname: string,\n\tset: DeepPartial<PokemonSet>,\n\tsetsForPokemon: PokemonSets,\n\tnumByFormat: { [format: string]: number },\n\toutOfBattleSpeciesName?: string\n) {\n\tif (validSet('dex', dex, format, pokemon, name, set, outOfBattleSpeciesName)) {\n\t\tsetsForPokemon[pokemon] = setsForPokemon[pokemon] || {};\n\t\tsetsForPokemon[pokemon][name] = set;\n\t\tnumByFormat[format.id] = (numByFormat[format.id] || 0) + 1;\n\t}\n}\n\nfunction cleanName(name: string) {\n\treturn name.replace(/\"/g, `'`);\n}\n\nfunction movesetToPokemonSet(dex: ModdedDex, format: Format, pokemon: string, set: smogon.Moveset) {\n\tconst level = getLevel(format, set.levels[0]);\n\treturn {\n\t\tlevel: level === 100 ? undefined : level,\n\t\tmoves: set.moveslots.map(ms => ms[0]).map(s => s.type ? `${s.move} ${s.type}` : s.move),\n\t\tability: fixedAbility(dex, pokemon, set.abilities[0]),\n\t\titem: set.items[0] === 'No Item' ? undefined : set.items[0],\n\t\tnature: set.natures[0],\n\t\tteraType: set.teratypes ? set.teratypes[0] : undefined,\n\t\tivs: toStatsTable(set.ivconfigs[0], 31),\n\t\tevs: toStatsTable(set.evconfigs[0]),\n\t};\n}\n\nfunction toStatsTable(stats?: StatsTable, elide = 0) {\n\tif (!stats) return undefined;\n\n\tconst s: Partial<StatsTable> = {};\n\tlet stat: keyof StatsTable;\n\tfor (stat in stats) {\n\t\tconst val = stats[stat];\n\t\tif (val !== elide) s[stat] = val;\n\t}\n\treturn s;\n}\n\nfunction fixedAbility(dex: ModdedDex, pokemon: string, ability?: string) {\n\tif (dex.gen <= 2) return undefined;\n\tconst species = dex.species.get(pokemon);\n\tif (ability && !['Mega', 'Primal', 'Ultra'].some(f => species.forme.startsWith(f))) return ability;\n\treturn species.abilities[0];\n}\n\nfunction validSet(\n\tsource: string,\n\tdex: ModdedDex,\n\tformat: Format,\n\tpokemon: string,\n\tname: string,\n\tset: DeepPartial<PokemonSet>,\n\toutOfBattleSpeciesName?: string\n) {\n\tif (skip(dex, format, pokemon, set)) return false;\n\n\tconst pset = toPokemonSet(dex, format, pokemon, set, outOfBattleSpeciesName);\n\tlet invalid = VALIDATORS.get(format.id)!.validateSet(pset, {});\n\tif (!invalid) return true;\n\t// Correct invalidations where set is required to be shiny due to an event\n\tif (invalid.length === 1 && invalid[0].includes('must be shiny')) {\n\t\tset.shiny = true;\n\t\tpset.shiny = true;\n\t\tinvalid = VALIDATORS.get(format.id)!.validateSet(pset, {});\n\t\tif (!invalid) return true;\n\t}\n\t// Allow Gen 4 Arceus sets because they're occasionally useful for tournaments\n\tif (format.id === 'gen4ubers' && invalid.includes(`${pokemon} is banned.`)) return true;\n\tconst title = `${format.name}: ${pokemon} (${name})'`;\n\tconst details = `${JSON.stringify(set)} = ${invalid.join(', ')}`;\n\t// console.error(`${color(source, 94)} Invalid set ${color(title, 91)}: ${color(details, 90)}`);\n\tconsole.error(color(`${source} Invalid set ${title}: ${details}`, 90));\n\n\treturn false;\n}\n\nfunction skip(dex: ModdedDex, format: Format, pokemon: string, set: DeepPartial<PokemonSet>) {\n\tconst { gen } = FORMATS.get(format.id)!;\n\tconst hasMove = (m: string) => set.moves?.includes(m);\n\tconst bh = format.id.includes('balancedhackmons');\n\n\tif (pokemon === 'Groudon-Primal' && set.item !== 'Red Orb') return true;\n\tif (pokemon === 'Kyogre-Primal' && set.item !== 'Blue Orb' && !(bh && gen === 7)) return true;\n\tif (bh) return false; // Everying else is legal or will get stripped by the team validator anyway\n\n\tif (dex.species.get(pokemon).forme.startsWith('Mega')) {\n\t\tif (pokemon === 'Rayquaza-Mega') {\n\t\t\treturn format.id.includes('ubers') || !hasMove('Dragon Ascent');\n\t\t} else {\n\t\t\treturn dex.items.get(set.item).megaStone !== pokemon;\n\t\t}\n\t}\n\tif (pokemon === 'Necrozma-Ultra' && set.item !== 'Ultranecrozium Z') return true;\n\tif (pokemon === 'Greninja-Ash' && set.ability !== 'Battle Bond') return true;\n\tif (pokemon === 'Zygarde-Complete' && set.ability !== 'Power Construct') return true;\n\tif (pokemon === 'Darmanitan-Zen' && set.ability !== 'Zen Mode') return true;\n\tif (pokemon === 'Meloetta-Pirouette' && !hasMove('Relic Song')) return true;\n\n\treturn false;\n}\n\nfunction toPokemonSet(\n\tdex: ModdedDex,\n\tformat: Format,\n\tpokemon: string,\n\tset: DeepPartial<PokemonSet>,\n\toutOfBattleSpeciesName?: string\n): PokemonSet {\n\t// To simplify things, during validation we mutate the input set to correct for HP mismatches\n\tconst hp = set.moves?.find(m => m.startsWith('Hidden Power'));\n\tlet fill = dex.gen === 2 ? 30 : 31;\n\tif (hp) {\n\t\tconst type = hp.slice(13);\n\t\tif (type && dex.getHiddenPower(fillStats(set.ivs, fill)).type !== type) {\n\t\t\tif (!set.ivs || (dex.gen >= 7 && (!set.level || set.level === 100))) {\n\t\t\t\tset.hpType = type;\n\t\t\t\tfill = 31;\n\t\t\t} else if (dex.gen === 2) {\n\t\t\t\tconst dvs = { ...dex.types.get(type).HPdvs };\n\t\t\t\tlet stat: StatID;\n\t\t\t\tfor (stat in dvs) {\n\t\t\t\t\tdvs[stat]! *= 2;\n\t\t\t\t}\n\t\t\t\tset.ivs = { ...dvs, ...set.ivs };\n\t\t\t\tset.ivs.hp = expectedHP(set.ivs);\n\t\t\t} else {\n\t\t\t\tset.ivs = { ...dex.types.get(type).HPivs, ...set.ivs };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst copy = { species: pokemon, ...set } as PokemonSet;\n\tcopy.ivs = fillStats(set.ivs, fill);\n\t// The validator expects us to have at least 1 EV set to prove it is intentional\n\tif (!set.evs && dex.gen >= 3 && format.id !== 'gen7letsgoou') set.evs = { spe: 1 };\n\tcopy.evs = fillStats(set.evs, dex.gen <= 2 ? 252 : 0);\n\t// The validator wants an ability even when Gen < 3\n\tcopy.ability = copy.ability || 'None';\n\n\tconst species = dex.species.get(pokemon);\n\tif (species.battleOnly && !format.id.includes('balancedhackmons')) {\n\t\tif (outOfBattleSpeciesName) {\n\t\t\tcopy.species = outOfBattleSpeciesName;\n\t\t} else if (typeof species.battleOnly === 'string') {\n\t\t\tcopy.species = species.battleOnly;\n\t\t} else {\n\t\t\tthrow new Error(`Unable to disambiguate out of battle species for ${species.name} in ${format.id}`);\n\t\t}\n\t\tcopy.ability = dex.species.get(copy.species).abilities[0];\n\t}\n\treturn copy;\n}\n\nfunction expectedHP(ivs: Partial<StatsTable>) {\n\tivs = fillStats(ivs, 31);\n\tconst atkDV = Math.floor(ivs.atk! / 2);\n\tconst defDV = Math.floor(ivs.def! / 2);\n\tconst speDV = Math.floor(ivs.spe! / 2);\n\tconst spcDV = Math.floor(ivs.spa! / 2);\n\treturn 2 * ((atkDV % 2) * 8 + (defDV % 2) * 4 + (speDV % 2) * 2 + (spcDV % 2));\n}\n\nfunction fillStats(stats?: Partial<StatsTable>, fill = 0) {\n\treturn TeamValidator.fillStats(stats || null, fill);\n}\n\nconst SMOGON = {\n\tuber: 'ubers',\n\tdoubles: 'doublesou',\n\tlgpeou: 'letsgoou',\n\tag: 'anythinggoes',\n\tbh: 'balancedhackmons',\n\tvgc16: 'vgc2016',\n\tvgc17: 'vgc2017',\n\tvgc18: 'vgc2018',\n\tvgc19: 'vgc2019ultraseries',\n\tvgc24regulatione: 'vgc2023regulatione',\n\t// bssseries1: 'battlestadiumsinglesseries1', // ?\n\tbssseries2: 'battlestadiumsinglesseries2',\n} as unknown as { [id: string]: ID };\n\nconst getAnalysis = retrying(async (u: string) => {\n\ttry {\n\t\treturn smogon.Analyses.process(await request(u));\n\t} catch (err: any) {\n\t\t// Don't try HTTP errors that we've already retried\n\t\tif (err.message.startsWith('HTTP')) {\n\t\t\treturn Promise.reject(err);\n\t\t} else {\n\t\t\treturn Promise.reject(new RetryableError(err.message));\n\t\t}\n\t}\n}, 3, 50);\n\nasync function getAnalysesByFormat(pokemon: string, gen: GenerationNum) {\n\tconst u = smogon.Analyses.url(pokemon === 'Meowstic' ? 'Meowstic-M' : pokemon, gen);\n\ttry {\n\t\tconst analysesByTier = await getAnalysis(u);\n\t\tif (!analysesByTier) {\n\t\t\terror(`Unable to process analysis for ${pokemon} in generation ${gen}`);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst analysesByFormat = new Map<Format, smogon.Analysis[]>();\n\t\tfor (const [tier, analyses] of analysesByTier.entries()) {\n\t\t\tlet t = toID(tier);\n\t\t\t// Dumb hack, need to talk to BSS people\n\t\t\tif (gen === 9 && t === 'battlestadiumsingles') {\n\t\t\t\tt = 'battlestadiumsinglesregulationc' as ID;\n\t\t\t}\n\t\t\tconst f = FORMATS.get(`gen${gen}${SMOGON[t] || t}` as ID);\n\t\t\tif (f) analysesByFormat.set(f.format, analyses);\n\t\t}\n\n\t\treturn analysesByFormat;\n\t} catch {\n\t\terror(`Unable to process analysis for ${pokemon} in generation ${gen}`);\n\t\treturn undefined;\n\t}\n}\n\nfunction getLevel(format: Format, level = 0) {\n\tconst ruleTable = Dex.formats.getRuleTable(format);\n\tif (ruleTable.adjustLevel) return ruleTable.adjustLevel;\n\tconst maxLevel = ruleTable.maxLevel;\n\tconst adjustLevelDown = ruleTable.adjustLevelDown || maxLevel;\n\tif (!level) level = ruleTable.defaultLevel;\n\treturn level > adjustLevelDown ? adjustLevelDown : level;\n}\n\nexport async function getStatisticsURL(\n\tindex: string,\n\tformat: Format\n): Promise<{ url: string, count: number } | undefined> {\n\tconst current = index.includes(format.id);\n\tconst latest = await smogon.Statistics.latestDate(format.id, !current);\n\tif (!latest) return undefined;\n\treturn { url: smogon.Statistics.url(latest.date, format.id, current || 1500), count: latest.count };\n}\n\n// TODO: Use bigram matrix, bucketed spreads and generative validation logic for more realistic sets\nfunction importUsageBasedSets(gen: GenerationNum, format: Format, statistics: smogon.UsageStatistics, count: number) {\n\tconst sets: PokemonSets = {};\n\tconst dex = Dex.forFormat(format);\n\tconst threshold = getUsageThreshold(format, count);\n\tlet num = 0;\n\tfor (const pokemon in statistics.data) {\n\t\tconst stats = statistics.data[pokemon];\n\t\tif (eligible(dex, toID(pokemon)) && stats.usage >= threshold) {\n\t\t\tconst set: DeepPartial<PokemonSet> = {\n\t\t\t\tlevel: getLevel(format),\n\t\t\t\tmoves: (top(stats.Moves, 4) as string[]).map(m => dex.moves.get(m).name).filter(m => m),\n\t\t\t};\n\t\t\tif (gen >= 2 && format.id !== 'gen7letsgoou') {\n\t\t\t\tconst id = top(stats.Items) as string;\n\t\t\t\tset.item = dex.items.get(id).name;\n\t\t\t\tif (set.item === 'nothing') set.item = undefined;\n\t\t\t}\n\t\t\tif (gen >= 3) {\n\t\t\t\tconst id = top(stats.Abilities) as string;\n\t\t\t\tset.ability = fixedAbility(dex, pokemon, dex.abilities.get(id).name);\n\t\t\t\tconst { nature, evs } = fromSpread(top(stats.Spreads) as string);\n\t\t\t\tset.nature = nature;\n\t\t\t\tif (format.id !== 'gen7letsgoou') {\n\t\t\t\t\tif (!evs || !Object.keys(evs).length) continue;\n\t\t\t\t\tset.evs = evs;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst name = 'Showdown Usage';\n\t\t\tif (validSet('stats', dex, format, pokemon, name, set)) {\n\t\t\t\tsets[pokemon] = {};\n\t\t\t\tsets[pokemon][name] = set;\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t}\n\treport(format, num, 'stats');\n\treturn sets;\n}\n\nfunction getUsageThreshold(format: Format, count: number) {\n\t// For old metagames with extremely low total battle counts we adjust the thresholds\n\tif (count < 100) return Infinity;\n\tif (count < 400) return 0.05;\n\t// These formats are deemed to have playerbases of lower quality than normal\n\treturn /uber|anythinggoes|doublesou/.test(format.id) ? 0.03 : 0.01;\n}\n\nconst STATS = Dex.stats.ids();\n\nfunction fromSpread(spread: string) {\n\tconst [nature, revs] = spread.split(':');\n\tconst evs: Partial<StatsTable> = {};\n\tfor (const [i, rev] of revs.split('/').entries()) {\n\t\tconst ev = Number(rev);\n\t\tif (ev) evs[STATS[i]] = ev;\n\t}\n\treturn { nature, evs };\n}\n\nfunction top(weighted: { [key: string]: number }, n = 1): string | string[] | undefined {\n\tif (n === 0) return undefined;\n\t// Optimize the more common case with an linear algorithm instead of log-linear\n\tif (n === 1) {\n\t\tlet max;\n\t\tfor (const key in weighted) {\n\t\t\tif (!max || weighted[max] < weighted[key]) max = key;\n\t\t}\n\t\treturn max;\n\t}\n\treturn Object.entries(weighted)\n\t\t.sort((a, b) => b[1] - a[1])\n\t\t.slice(0, n)\n\t\t.map(x => x[0]);\n}\n\nclass RetryableError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper(message);\n\t\t// restore prototype chain\n\t\tObject.setPrototypeOf(this, new.target.prototype);\n\t}\n}\n\n// We throttle to 20 QPS by only issuing one request every 50ms at most. This\n// is importantly different than using the more obvious 20 and 1000ms here,\n// as it results in more spaced out requests which won't cause as many gettaddrinfo\n// ENOTFOUND (nodejs/node-v0.x-archive#5488). Similarly, the evenly spaced\n// requests makes us signficantly less likely to encounter ECONNRESET errors\n// on macOS (though these are still pretty frequent, Linux is recommended for running\n// this tool). Retry up to 5 times with a 20ms backoff increment.\nconst request = retrying(throttling(fetch, 1, 50), 5, 20);\n\nexport function fetch(u: string) {\n\tconst client = u.startsWith('http:') ? http : https;\n\treturn new Promise<string>((resolve, reject) => {\n\t\t// @ts-expect-error Typescript bug - thinks the second argument should be RequestOptions, not a callback\n\t\tconst req = client.get(u, (res: IncomingMessage) => {\n\t\t\tif (res.statusCode !== 200) {\n\t\t\t\tif (res.statusCode >= 500 && res.statusCode < 600) {\n\t\t\t\t\treturn reject(new RetryableError(`HTTP ${res.statusCode}`));\n\t\t\t\t} else if (res.statusCode >= 300 && res.statusCode <= 400 && res.headers.location) {\n\t\t\t\t\tresolve(fetch(url.resolve(u, res.headers.location)));\n\t\t\t\t} else {\n\t\t\t\t\treturn reject(new Error(`HTTP ${res.statusCode}`));\n\t\t\t\t}\n\t\t\t}\n\t\t\tStreams.readAll(res).then(resolve, reject);\n\t\t});\n\t\treq.on('error', reject);\n\t\treq.end();\n\t});\n}\n\nfunction retrying<I, O>(fn: (args: I) => Promise<O>, retries: number, wait: number): (args: I) => Promise<O> {\n\tconst retry = async (args: I, attempt = 0): Promise<O> => {\n\t\ttry {\n\t\t\treturn await fn(args);\n\t\t} catch (err) {\n\t\t\tif (err instanceof RetryableError) {\n\t\t\t\tattempt++;\n\t\t\t\tif (attempt > retries) return Promise.reject(err);\n\t\t\t\tconst timeout = Math.round(attempt * wait * (1 + Math.random() / 2));\n\t\t\t\twarn(`Retrying ${args} in ${timeout}ms (${attempt}):`, err);\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tresolve(retry(args, attempt++));\n\t\t\t\t\t}, timeout);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn Promise.reject(err);\n\t\t\t}\n\t\t}\n\t};\n\treturn retry;\n}\n\nfunction throttling<I, O>(fn: (args: I) => Promise<O>, limit: number, interval: number): (args: I) => Promise<O> {\n\tconst queue = new Map();\n\tlet currentTick = 0;\n\tlet activeCount = 0;\n\n\tconst throttled = (args: I) => {\n\t\tlet timeout: NodeJS.Timeout;\n\t\treturn new Promise<O>((resolve, reject) => {\n\t\t\tconst execute = () => {\n\t\t\t\tresolve(fn(args));\n\t\t\t\tqueue.delete(timeout);\n\t\t\t};\n\n\t\t\tconst now = Date.now();\n\n\t\t\tif (now - currentTick > interval) {\n\t\t\t\tactiveCount = 1;\n\t\t\t\tcurrentTick = now;\n\t\t\t} else if (activeCount < limit) {\n\t\t\t\tactiveCount++;\n\t\t\t} else {\n\t\t\t\tcurrentTick += interval;\n\t\t\t\tactiveCount = 1;\n\t\t\t}\n\n\t\t\ttimeout = setTimeout(execute, currentTick - now);\n\t\t\tqueue.set(timeout, reject);\n\t\t});\n\t};\n\n\treturn throttled;\n}\n\nfunction color(s: any, code: number) {\n\treturn util.format(`\\x1b[${code}m%s\\x1b[0m`, s);\n}\n\nfunction report(format: Format, num: number, source: string) {\n\tconsole.info(`${format.name}: ${color(num, 33)} ${color(`(${source})`, 90)}`);\n}\n\nfunction warn(s: string, err: Error) {\n\tconsole.warn(`${color(s, 33)} ${color(err.message, 90)}`);\n}\n\nfunction error(s: string) {\n\tconsole.error(color(s, 91));\n}\n"], | |
"mappings": "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", | |
"names": [] | |
} | |