User:Habst/getWaMedalTable.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
window.data ??= {};
window.cache ??= {};
medals = {};
nations = new Set();
athletes = new Set();
(async () => {
for (const day of [1,2,4,5])
window.data[day]??=await (await fetch("https://wpgiegzkbrhj5mlsdxnipboepm.appsync-api.eu-west-1.amazonaws.com/graphql", {
  "headers": {
    "x-api-key": "da2-juounigq4vhkvg5ac47mezxqge" // note API key is intentionally public
  },
  "body": JSON.stringify({
  "operationName": "getCalendarCompetitionResults",
  "variables": {
    "competitionId": 7200585,
    "day": day,
    "eventId": null
  },
  "query": `query getCalendarCompetitionResults($competitionId: Int, $day: Int, $eventId: Int) {
  getCalendarCompetitionResults(competitionId: $competitionId, day: $day, eventId: $eventId) {
    competition {
      dateRange
      endDate
      name
      rankingCategory
      startDate
      venue
      __typename
    }
    eventTitles {
      rankingCategory
      eventTitle
      events {
        event
        eventId
        gender
        isRelay
        perResultWind
        withWind
        summary {
          competitor {
            teamMembers {
              id
              name
              iaafId
              urlSlug
              __typename
            }
            id
            name
            iaafId
            urlSlug
            birthDate
            __typename
          }
          mark
          nationality
          placeInRace
          placeInRound
          points
          raceNumber
          records
          wind
          __typename
        }
        races {
          date
          day
          race
          raceId
          raceNumber
          results {
            competitor {
              teamMembers {
                id
                name
                iaafId
                urlSlug
                __typename
              }
              id
              name
              iaafId
              urlSlug
              birthDate
              hasProfile
              __typename
            }
            mark
            nationality
            place
            points
            qualified
            records
            wind
            remark
            details {
              event
              eventId
              raceNumber
              mark
              wind
              placeInRound
              placeInRace
              points
              overallPoints
              placeInRoundByPoints
              overallPlaceByPoints
              __typename
            }
            __typename
          }
          startList {
            competitor {
              birthDate
              country
              id
              name
              urlSlug
              __typename
            }
            order
            pb
            sb
            bib
            __typename
          }
          wind
          __typename
        }
        __typename
      }
      __typename
    }
    options {
      days {
        date
        day
        __typename
      }
      events {
        gender
        id
        name
        combined
        __typename
      }
      __typename
    }
    parameters {
      competitionId
      day
      eventId
      __typename
    }
    __typename
  }
}`
}),
  "method": "POST",
})).json();
mark2secs=(mark, isField = false)=>{
  const parts = mark.split(':');
  let ret;
  if (parts.length === 1) ret = +mark;
  else if (parts.length === 2) ret = +parts[0] * 60 + +parts[1];
  else ret = +parts[0] * 60 * 60 + +parts[1] * 60 + +parts[2];
  if (Number.isNaN(ret)) return isField ? -Infinity : Infinity;
  return ret;
}
const combinedData = Object.values(data).reduce((acc, dayData) => {
  for (let eventTitle of dayData.data.getCalendarCompetitionResults.eventTitles) {
    eventTitle = structuredClone(eventTitle);
    const foundEventTitle = acc.data.getCalendarCompetitionResults.eventTitles.find(et => et.eventTitle === eventTitle.eventTitle);
    if (foundEventTitle) {
      const oldEvts = [...eventTitle.events];
      for (const evt of oldEvts) {
        const foundEvt = foundEventTitle.events.find(e2 => e2.event === evt.event);
        if (foundEvt) foundEvt.races.push(...evt.races);
        else foundEventTitle.events.push(evt);
      }
    }
    else acc.data.getCalendarCompetitionResults.eventTitles.push(eventTitle);
  }
  return acc;
}, { data: { getCalendarCompetitionResults: { eventTitles: [] } } });
for (const eventTitle of combinedData.data.getCalendarCompetitionResults.eventTitles) {
  if (!['World Athletics Indoor Tour', 'Indoor Meeting', 'Diamond Discipline', 'Promotional Events', 'National Events', 'U18 Events', 'Regional Races', null].includes(eventTitle.eventTitle)) continue;
for (const evt of eventTitle.events) {
  let etHasEvents = true;
  const isField = ['jump', 'throw', 'vault', 'discus', 'put'].some(s => evt.event.toLowerCase().includes(s));
  const stages = Object.values(evt.races.reduce((acc, r) => {
    acc[r.race] ??= [];
    acc[r.race].push(r);
    return acc;
  }, {}));
  for (const stage of stages) {
    const isLastStage = stages.indexOf(stage) === stages.length - 1;
    const isFinal = stage[0].race === 'Final';
    const isMulti = stage.length > 1;
    const results = stage.flatMap(race => race.results.map(res => ({...res, raceNumber: race.raceNumber, wind: res.wind ?? race.wind})))//.sort((a, b) => isField ? mark2secs(b.mark, true) - mark2secs(a.mark, true) : mark2secs(a.mark) - mark2secs(b.mark));
    for (const result of results) {
      nations.add(result.nationality);
      const id = +result.competitor.urlSlug?.split('-').at(-1).replace(/^0/, '');
      if (id) athletes.add(id);
      else {
        for (const tm of result.competitor.teamMembers) athletes.add(+tm.id);
      }
      const pl = ['DNS', 'DNF', 'DQ', 'NM'].includes(result.mark) ? '' : +result.place.replace('.', '')//results.indexOf(result) + 1;
      if (isFinal) {
      const medal = pl === 1 ? 'gold' : pl === 2 ? 'silver' : pl === 3 ? 'bronze' : null;
        if (medal) {
          medals[result.nationality] ??= { gold: 0, silver: 0, bronze: 0 };
          medals[result.nationality][medal]++;
        }
      }
    }
  }
}
}
const out = `{{Medals table
 | host           = 
 | flag_template  = 
 | event          = 
 | team           = 
${Object.entries(medals).map(([nat, meds]) => ` | gold_${nat} = ${meds.gold} | silver_${nat} = ${meds.silver} | bronze_${nat} = ${meds.bronze}`).join('\n')}
}}`
console.log(nations, athletes, out);
return out;
})();