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