Initial commit

This commit is contained in:
2024-11-21 19:39:22 +01:00
commit 56d1075459
32 changed files with 10966 additions and 0 deletions

View File

@@ -0,0 +1,105 @@
function sameArrays(array1, array2) {
if(array1.length != array2.length) return false;
for(let e of array1) {
if(!array2.includes(e)) return false;
}
return true;
}
async function championInfos(client, patch, championId) {
const database = client.db("matches");
const matches = database.collection(patch)
const allMatches = matches.find()
let winningMatches = 0;
let losingMatches = 0;
let totalMatches = 0;
const runes = [];
for await (let match of allMatches) {
totalMatches += 1;
for(let participant of match.info.participants) {
if(participant.championId != championId) continue;
if(participant.win)
winningMatches += 1;
else
losingMatches += 1;
const primaryStyle = participant.perks.styles[0].style
const secondaryStyle = participant.perks.styles[1].style
const selections = []
for(let style of participant.perks.styles) {
for(let perk of style.selections) {
selections.push(perk.perk)
}
}
const gameRunes = {count:1, primaryStyle: primaryStyle, secondaryStyle: secondaryStyle, selections: selections};
let addRunes = true;
for(let rune of runes) {
if(rune.primaryStyle == gameRunes.primaryStyle
&& rune.secondaryStyle == gameRunes.secondaryStyle
&& sameArrays(rune.selections, gameRunes.selections)) {
rune.count++; addRunes = false; break;
}
}
if(addRunes) runes.push(gameRunes)
break;
}
}
// Filter runes to keep 3 most played
const maxes = [0, 0, 0] // 24, 2, 1 -> 18 > 1 -> 24, 2, 2 -> 18 > 2 -> 24, 24, 2
const maxRunes = [null, null, null]
for(let rune of runes) {
let maxcount = 2;
if(rune.count <= maxes[maxcount]) continue;
while(maxcount > 0 && rune.count > maxes[maxcount]) {
maxes[maxcount] = maxes[maxcount - 1];
maxRunes[maxcount] = maxRunes[maxcount - 1];
maxcount--;
}
rune.pickrate = rune.count / (winningMatches + losingMatches)
if(rune.count <= maxes[maxcount]) maxcount++;
maxes[maxcount] = rune.count
maxRunes[maxcount] = rune
}
return {id: championId,
winrate:winningMatches / (winningMatches + losingMatches),
gameCount:(winningMatches + losingMatches),
pickrate:(winningMatches + losingMatches)/totalMatches,
runes: maxRunes.filter((x) => x != null)
};
}
async function makeChampionStat(client, patch, championId) {
const championInfo = await championInfos(client, patch, championId)
const database = client.db("champions")
const collection = database.collection(patch)
await collection.updateOne({id: championInfo.id}, {$set: championInfo}, { upsert: true })
}
async function championList() {
const response = await fetch("https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/champion-summary.json");
const list = await response.json()
return list.slice(1)
}
async function makeChampionsStats(client, patch) {
const list = await championList()
console.log("Generating stats for " + list.length + " champions")
let i = 0;
for(let champion of list) {
console.log("Entry " + i + "/" + list.length + " ...")
await makeChampionStat(client, patch, champion.id)
i += 1
}
const database = client.db("champions")
const collection = database.collection(patch)
await collection.createIndex({id:1})
}
module.exports = {makeChampionsStats}