diff --git a/debut_saison.ts b/debut_saison.ts new file mode 100644 index 0000000..2322e40 --- /dev/null +++ b/debut_saison.ts @@ -0,0 +1,171 @@ +const URL = "https://ballephenix.com"; +const USERNAME = "XXXXXX"; +const PASSWORD = "XXXXXX"; + +type PreGame = { + date: string; + time: string; + home: string; + away: string; +}; + +class WeekDay { + readonly year: number; + readonly month: number; + readonly day: number; + + constructor(iso: string) { + const [y, m, d] = iso.split("-").map(Number); + this.year = y; + this.month = m; + this.day = d; + } + + next(): WeekDay { + const d = new Date(this.year, this.month - 1, this.day + 7); + return new WeekDay( + `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`, + ); + } + + saturday(): WeekDay { + const d = new Date(this.year, this.month - 1, this.day + 2); + return new WeekDay( + `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`, + ); + } + + toString(): string { + return `${this.year}-${String(this.month).padStart(2, "0")}-${String(this.day).padStart(2, "0")}`; + } +} + +const w1 = new WeekDay("2026-05-14"); +const w2 = w1.next(); +const w3 = w2.next(); +const w4 = w3.next(); +// skip Saint-Jean +const w5 = w4.next().next(); +const w6 = w5.next(); +const w7 = w6.next(); +const w8 = w7.next(); +const w9 = w8.next(); +const w10 = w9.next(); +const w11 = w10.next(); +const w12 = w11.next(); +// const tournament = w12.saturday(); +const w13 = w12.next(); +const w14 = w13.next(); + +const games: PreGame[] = [ + { date: `${w1}`, time: "18:45", home: "gris", away: "bleu" }, + { date: `${w1}`, time: "20:15", home: "mauve", away: "jaune" }, + + { date: `${w2}`, time: "18:45", home: "jaune", away: "gris" }, + { date: `${w2}`, time: "20:15", home: "bleu", away: "mauve" }, + + { date: `${w3}`, time: "18:45", home: "gris", away: "mauve" }, + { date: `${w3}`, time: "20:15", home: "jaune", away: "bleu" }, + + { date: `${w4}`, time: "18:45", home: "mauve", away: "bleu" }, + { date: `${w4}`, time: "20:15", home: "gris", away: "jaune" }, + + { date: `${w5}`, time: "18:45", home: "bleu", away: "jaune" }, + { date: `${w5}`, time: "20:15", home: "mauve", away: "gris" }, + + { date: `${w6}`, time: "18:45", home: "jaune", away: "mauve" }, + { date: `${w6}`, time: "20:15", home: "bleu", away: "gris" }, + + { date: `${w7}`, time: "18:45", home: "gris", away: "bleu" }, + { date: `${w7}`, time: "20:15", home: "mauve", away: "jaune" }, + + { date: `${w8}`, time: "18:45", home: "jaune", away: "gris" }, + { date: `${w8}`, time: "20:15", home: "bleu", away: "mauve" }, + + { date: `${w9}`, time: "18:45", home: "gris", away: "mauve" }, + { date: `${w9}`, time: "20:15", home: "jaune", away: "bleu" }, + + { date: `${w10}`, time: "18:45", home: "mauve", away: "bleu" }, + { date: `${w10}`, time: "20:15", home: "gris", away: "jaune" }, + { date: `${w10}`, time: "21:35", home: "jaune", away: "gris" }, + + { date: `${w11}`, time: "18:45", home: "bleu", away: "jaune" }, + { date: `${w11}`, time: "20:15", home: "mauve", away: "gris" }, + + { date: `${w12}`, time: "18:45", home: "jaune", away: "mauve" }, + { date: `${w12}`, time: "20:15", home: "bleu", away: "gris" }, + + // { date: `${tournament}`, time: "09:00", home: "gris", away: "bleu" }, + // { date: `${tournament}`, time: "10:30", home: "mauve", away: "jaune" }, + // { date: `${tournament}`, time: "15:30", home: "bleu", away: "mauve" }, + + { date: `${w13}`, time: "18:45", home: "gris", away: "mauve" }, + { date: `${w13}`, time: "20:15", home: "jaune", away: "bleu" }, + + { date: `${w14}`, time: "18:45", home: "gris", away: "bleu" }, + { date: `${w14}`, time: "20:15", home: "mauve", away: "jaune" }, +]; + +function extractCookies(headers: Headers): string { + const cookies: string[] = []; + for (const value of headers.getSetCookie()) { + cookies.push(value.split(";")[0]); + } + return cookies.join("; "); +} + +async function login(): Promise { + const res = await fetch( + `${URL}/login?username=${encodeURIComponent(USERNAME)}&password=${encodeURIComponent(PASSWORD)}`, + { redirect: "manual" }, + ); + if (res.status !== 302) { + throw new Error(`Login failed with status ${res.status}`); + } + return extractCookies(res.headers); +} + +async function createGame(cookie: string, game: PreGame): Promise { + const body = new URLSearchParams({ + "game-date": game.date, + "game-time": game.time, + "home-team": game.home, + "away-team": game.away, + }); + + const res = await fetch(`${URL}/membre/new-game`, { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Cookie: cookie, + }, + body: body.toString(), + redirect: "manual", + }); + + if (res.status >= 400) { + const text = await res.text(); + throw new Error( + `Failed to create ${game.date} ${game.time} ${game.home} vs ${game.away}: ${text}`, + ); + } + + await res.body?.cancel(); +} + +async function main() { + console.log("Logging in..."); + const cookie = await login(); + console.log("Logged in.\n"); + + for (const game of games) { + console.log( + `Creating: ${game.date} ${game.time} ${game.home} vs ${game.away}`, + ); + await createGame(cookie, game); + } + + console.log(`\nDone. ${games.length} games created.`); +} + +main();