fantasy-manager/store/Euro2024/index.ts

206 lines
6.8 KiB
TypeScript

import { forecast, position } from "#/types/database";
import dataGetter, { clubs, players } from "#type/data";
import { Status as GameStatus, Item as GameItem } from "./typeClubs";
import { CurrentMatchDay } from "./typeMatchday";
import { PStatus } from "./typePlayers";
import { ResultClubs, ResultMatchday, ResultPlayers } from "./types";
const headers = {
"User-Agent":
// This adds a valid user agent
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
};
const Main: dataGetter = async function () {
const nowTime = Math.floor(Date.now() / 1000);
// Gets the data for the league
const data: ResultPlayers = await fetch(
"https://gaming.uefa.com/en/eurofantasy/services/feeds/players/players_2_en_1.json",
{
headers,
},
).then(async (e) => {
return e.json();
});
const playerList = data.data.value.playerList;
const positions: position[] = ["gk", "gk", "def", "mid", "att"];
let transferOpen = true;
let countdown = 0;
const matchdays: { club: ResultClubs; matchday: CurrentMatchDay }[] =
await fetch(
"https://gaming.uefa.com/en/uclpredictor/api/v1/competition/3/season/current/predictor/match_days",
{
headers,
},
).then(async (e) => {
const json_data: ResultMatchday = await e.json();
return await Promise.all(
json_data.data.items.map(async (matchday) => {
return {
club: await fetch(
`https://gaming.uefa.com/en/uclpredictor/api/v1/competition/3/season/current/predictor/matches/${matchday.id}`,
{
headers,
},
).then((e) => e.json()),
matchday,
};
}),
);
});
let game_data;
const future_games: { club: ResultClubs; matchday: CurrentMatchDay }[] = [];
for (const matchday of matchdays) {
// Before the matchday
if (matchday.matchday.start_at > nowTime) {
if (!game_data) {
game_data = matchday.club;
} else {
future_games.push(matchday);
}
}
// During the matchday
else if (matchday.matchday.end_at > nowTime) {
game_data = matchday.club;
// Checks if the first game has started
transferOpen = game_data.data.items.every((game: GameItem) => {
return game.status === GameStatus.NotStarted;
});
if (!transferOpen) {
countdown = matchday.matchday.end_at - nowTime;
}
}
}
// If game_data is undefined it means that all the matchdays are over
if (!game_data) {
game_data = matchdays[matchdays.length - 1].club;
transferOpen = false;
}
const clubs = [];
const clubList: string[] = [];
for (const game of game_data.data.items) {
const gameStart = Date.parse(game.start_at) / 1000;
let gameEnd = gameStart + 60 * 60 * 2.5;
if (game.status !== GameStatus.Finished) {
gameEnd = gameStart + 60 * 60 * 3;
// Makes sure the game will still take 5 minutes to end
if (gameEnd <= nowTime + 300) {
gameEnd = nowTime + 300;
}
}
// Updates the countdown if no game has started yet to be the time to the first game
if (game.status === GameStatus.NotStarted && transferOpen) {
const temp_countdown = gameStart - nowTime;
if (temp_countdown < countdown || countdown === 0) {
countdown = temp_countdown;
}
}
clubList.push(game.home_team.name_short);
clubList.push(game.away_team.name_short);
clubs.push({
club: game.home_team.name_short,
fullName: game.home_team.name,
test: 12,
gameStart,
gameEnd,
opponent: game.away_team.name_short,
teamScore: game.home_team_score + game.home_team_pen_score,
opponentScore: game.away_team_score + game.away_team_pen_score,
league: "Euro2024",
home: true,
future_games: future_games
.map((e) => {
const home = e.club.data.items.filter(
(e) => e.home_team.name_short == game.home_team.name_short,
);
if (home.length > 0) {
return {
gameStart: Date.parse(home[0].start_at) / 1000,
opponent: home[0].away_team.name_short,
home: true,
};
}
const away = e.club.data.items.filter(
(e) => e.away_team.name_short == game.home_team.name_short,
);
if (away.length > 0) {
return {
gameStart: Date.parse(away[0].start_at) / 1000,
opponent: away[0].home_team.name_short,
home: false,
};
}
return {};
})
.filter((e) => Object.keys(e).length > 0),
});
clubs.push({
club: game.away_team.name_short,
fullName: game.away_team.name,
gameStart,
gameEnd,
opponent: game.home_team.name_short,
teamScore: game.away_team_score + game.away_team_pen_score,
opponentScore: game.home_team_score + game.home_team_pen_score,
league: "Euro2024",
home: false,
future_games: future_games
.map((e) => {
const home = e.club.data.items.filter(
(e) => e.home_team.name_short == game.away_team.name_short,
);
if (home.length > 0) {
return {
gameStart: Date.parse(home[0].start_at) / 1000,
opponent: home[0].away_team.name_short,
home: true,
};
}
const away = e.club.data.items.filter(
(e) => e.away_team.name_short == game.away_team.name_short,
);
if (away.length > 0) {
return {
gameStart: Date.parse(away[0].start_at) / 1000,
opponent: away[0].home_team.name_short,
home: false,
};
}
return {};
})
.filter((e) => Object.keys(e).length > 0),
});
}
if (countdown < 0) {
countdown = 0;
}
const players: players[] = playerList.map((player) => {
let forecast: forecast = "a";
if (player.pStatus === PStatus.D) {
forecast = "u";
} else if (player.pStatus === PStatus.I || player.pStatus === PStatus.S) {
forecast = "m";
}
return {
uid: player.id,
name: player.pFName,
club: player.cCode,
pictureUrl: `https://img.uefa.com/imgml/TP/players/3/2024/324x324/${player.id}.jpg`,
height: 324,
width: 324,
value: player.value * 1000000,
position:
player.skill >= positions.length ? "gk" : positions[player.skill],
forecast,
total_points: player.totPts,
average_points: player.avgPlayerPts,
exists: clubList.includes(player.cCode) && player.pStatus !== PStatus.Nis,
};
});
return [
transferOpen,
countdown,
players,
clubs as clubs[],
{ update_points_after_game_end: true },
];
};
export default Main;