From 3d8306b225f10ee08b9ecf41a68f46afe0092dc6 Mon Sep 17 00:00:00 2001 From: Kfir Dayan Date: Sat, 21 Sep 2024 13:25:42 +0300 Subject: [PATCH] changing source of games --- dist/GameSource.js | 140 +++++++++++++++------------------ dist/index.js | 3 +- src/GameSource.ts | 192 +++++++++++++++++++++------------------------ src/index.ts | 4 +- 4 files changed, 158 insertions(+), 181 deletions(-) diff --git a/dist/GameSource.js b/dist/GameSource.js index c6deb32..9362c36 100644 --- a/dist/GameSource.js +++ b/dist/GameSource.js @@ -5,62 +5,81 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); require("dotenv").config(); const axios_1 = __importDefault(require("axios")); -const node_html_parser_1 = require("node-html-parser"); -const moment_1 = __importDefault(require("moment")); // require -// This calss will be the game source. -// search for upcomming games +const moment_1 = __importDefault(require("moment")); class GameSource { async getGamesFromHaifa(logger) { - const sourceUrl = `https://mhaifafc.com/games?lang=en`; - console.log('Trying to get games from Haifa...'); + console.log("Trying to get games from Haifa..."); try { - const result = await axios_1.default.get(sourceUrl, { - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', - 'Accept-Language': 'en-US,en;q=0.9', - 'Accept-Encoding': 'gzip, deflate, br', - 'DNT': '1', - 'Connection': 'keep-alive', - 'Upgrade-Insecure-Requests': '1', - } + // Get the current date and time in the required format + const currentDate = (0, moment_1.default)().format("DD/MM/YYYY HH:mm"); + // Construct the filters object with the current date + const filters = { + date: { + startDate: currentDate, + endDate: "", + }, + league: "", + session: "", + gamesDirection: "1", + }; + // Encode the filters for the URL + const filtersParam = encodeURIComponent(JSON.stringify(filters)); + // Construct the API URL with the encoded filters + const sourceUrl = `https://api.mhaifafc.com/api/content/games-lobby?filters=${filtersParam}&start=0&limit=20&sortDirection=ASC&app=web&lang=he`; + // Get the authorization token from environment variables + const authorizationToken = process.env.HAIFA_API_AUTH_TOKEN; + // Set up the request headers + const headers = { + Accept: "*/*", + "Accept-Language": "en-US,en;q=0.7", + Authorization: `Bearer ${authorizationToken}`, + "User-Agent": "Mozilla/5.0", + Origin: "https://www.mhaifafc.com", + Referer: "https://www.mhaifafc.com/", + }; + // Make the API request + const response = await axios_1.default.get(sourceUrl, { + headers, + responseType: "json", + responseEncoding: "utf8", // Ensure UTF-8 encoding }); - const parsedResult = (0, node_html_parser_1.parse)(result.data.toString()); - const gameBoxs = parsedResult.querySelectorAll(".game-box"); + // Extract the games data from the response + const gamesData = response.data.games.items; const games = []; - for (let gameBox of gameBoxs) { - const teamsPlaying = gameBox - .querySelectorAll(".team-name") - .map((team) => team.text); - const regex = /[\r\n\s]+/g; - const gameHeader = gameBox - .querySelector(".game-header") - .text.replace(regex, " ") - .trim(); - const headerSplit = gameHeader.split(","); - // In data, if there is no time, it means it's the last game for the calender - const lastGameForCalender = headerSplit.length < 4; - const location = headerSplit[headerSplit.length - 1].trim(); - const gameDate = this.findDate(headerSplit); - const gameTime = this.findTime(headerSplit); - if (location === 'נדחה') + // Loop through each game and construct the GoogleCalendarEvent objects + for (const game of gamesData) { + const gameDetails = game.gameDetails; + const gameTime = gameDetails.gameTime; // ISO string + const isFinalGameDate = gameDetails.isFinalGameDate; + const gameLocation = gameDetails.gameLocation; + // Skip games without a game time + if (!gameTime) continue; - if (lastGameForCalender && gameDate !== '') - break; - const start = (0, moment_1.default)(gameDate + gameTime, "DD/MM/YYYYHH:mm").toISOString(); - const end = (0, moment_1.default)(gameDate + gameTime, "DD/MM/YYYYHH:mm") - .add(2, "hours") - .toISOString(); + const hostTeam = game.hostTeam; + const guestTeam = game.guestTeam; + // Get team names + const hostTeamName = hostTeam.teamName; + const guestTeamName = guestTeam.teamName; + const summary = `${hostTeamName} vs. ${guestTeamName}`; + // Include a note if the game date is not final + let description = `${hostTeamName} vs. ${guestTeamName}`; + if (!isFinalGameDate) { + description += " (Date and time are subject to change)"; + } + // Calculate start and end times + const startDateTime = (0, moment_1.default)(gameTime).toISOString(); + const endDateTime = (0, moment_1.default)(gameTime).add(2, "hours").toISOString(); + // Add the event to the games array games.push({ - summary: `${teamsPlaying[0]} vs. ${teamsPlaying[1]}`, - location: headerSplit[headerSplit.length - 1].trim(), - description: `${teamsPlaying[0]} vs. ${teamsPlaying[1]}`, + summary: summary, + location: gameLocation, + description: description, start: { - dateTime: start, + dateTime: startDateTime, timeZone: "Asia/Jerusalem", }, end: { - dateTime: end, + dateTime: endDateTime, timeZone: "Asia/Jerusalem", }, }); @@ -69,36 +88,7 @@ class GameSource { } catch (error) { console.error(error); - } - } - findTime(headerSplit) { - let time = ''; - headerSplit.forEach((item) => { - if (/\d{2}:\d{2}/.test(item)) { - time = item; - return; - } - }); - return time.trim(); - } - findDate(headerSplit) { - // if it's a date format, return it like: 19/08/2023 - let date = ''; - headerSplit.forEach((item) => { - if (/\d{2}\/\d{2}\/\d{4}/.test(item)) { - date = item; - return; - } - }); - // console.log("Cheking date: ", date, "By split: ", headerSplit) - return date.trim(); - } - getOpponentIndexByStadium(stadium) { - if (stadium === "Sammy Ofer Stadium") { - return 1; - } - else { - return 0; + return []; } } } diff --git a/dist/index.js b/dist/index.js index 9baf05c..a32576d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -15,8 +15,7 @@ class App { this.googleCalendar = new GoogleCalendar_1.default(); } async startCronJob() { - this.writeLog('START CRON JOB'); // Log when the cron job starts - console.log("START Haifa Reminder"); + this.writeLog('START Haifa Reminder'); // Log when the cron job starts const newGamesAdded = []; await this.googleCalendar.init(); try { diff --git a/src/GameSource.ts b/src/GameSource.ts index bcc0602..1f89755 100644 --- a/src/GameSource.ts +++ b/src/GameSource.ts @@ -1,116 +1,106 @@ require("dotenv").config(); import axios from "axios"; import { GoogleCalendarEvent } from "./types"; -import { parse } from "node-html-parser"; -import moment from "moment"; // require -import fs from 'fs'; // Importing fs for logging - -// This calss will be the game source. -// search for upcomming games +import moment from "moment"; export default class GameSource { async getGamesFromHaifa(logger: Function): Promise { - const sourceUrl = `https://mhaifafc.com/games?lang=en`; - console.log('Trying to get games from Haifa...'); + console.log("Trying to get games from Haifa..."); + try { - const result = await axios.get(sourceUrl, - { - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', - 'Accept-Language': 'en-US,en;q=0.9', - 'Accept-Encoding': 'gzip, deflate, br', - 'DNT': '1', - 'Connection': 'keep-alive', - 'Upgrade-Insecure-Requests': '1', - } - }); + // Get the current date and time in the required format + const currentDate = moment().format("DD/MM/YYYY HH:mm"); - const parsedResult = parse(result.data.toString()); - const gameBoxs = parsedResult.querySelectorAll(".game-box"); - - const games: GoogleCalendarEvent[] = []; - - for (let gameBox of gameBoxs) { - - const teamsPlaying = gameBox - .querySelectorAll(".team-name") - .map((team: any) => team.text); - const regex = /[\r\n\s]+/g; - const gameHeader = gameBox - .querySelector(".game-header") - .text.replace(regex, " ") - .trim(); - const headerSplit = gameHeader.split(","); - - // In data, if there is no time, it means it's the last game for the calender - const lastGameForCalender = headerSplit.length < 4; - const location = headerSplit[headerSplit.length - 1].trim(); - - const gameDate = this.findDate(headerSplit); - const gameTime = this.findTime(headerSplit); - - if (location === 'נדחה') continue; - if (lastGameForCalender && gameDate !== '') break; - - const start = moment( - gameDate + gameTime, - "DD/MM/YYYYHH:mm" - ).toISOString(); - const end = moment(gameDate + gameTime, "DD/MM/YYYYHH:mm") - .add(2, "hours") - .toISOString(); - - games.push({ - summary: `${teamsPlaying[0]} vs. ${teamsPlaying[1]}`, - location: headerSplit[headerSplit.length - 1].trim(), - description: `${teamsPlaying[0]} vs. ${teamsPlaying[1]}`, - start: { - dateTime: start, - timeZone: "Asia/Jerusalem", - }, - end: { - dateTime: end, - timeZone: "Asia/Jerusalem", + // Construct the filters object with the current date + const filters = { + date: { + startDate: currentDate, + endDate: "", }, + league: "", + session: "", + gamesDirection: "1", + }; + + // Encode the filters for the URL + const filtersParam = encodeURIComponent(JSON.stringify(filters)); + + // Construct the API URL with the encoded filters + const sourceUrl = `https://api.mhaifafc.com/api/content/games-lobby?filters=${filtersParam}&start=0&limit=20&sortDirection=ASC&app=web&lang=he`; + + // Get the authorization token from environment variables + const authorizationToken = process.env.HAIFA_API_AUTH_TOKEN; + + // Set up the request headers + const headers = { + Accept: "*/*", + "Accept-Language": "en-US,en;q=0.7", + Authorization: `Bearer ${authorizationToken}`, + "User-Agent": "Mozilla/5.0", + Origin: "https://www.mhaifafc.com", + Referer: "https://www.mhaifafc.com/", + }; + + // Make the API request + const response = await axios.get(sourceUrl, { + headers, + responseType: "json", // Ensure the response is parsed as JSON + responseEncoding: "utf8", // Ensure UTF-8 encoding }); - } - return games; - } - catch (error) { - console.error(error); - } - } - private findTime(headerSplit: string[]) { - let time = ''; - headerSplit.forEach((item) => { - if (/\d{2}:\d{2}/.test(item)) { - time = item; - return + // Extract the games data from the response + const gamesData = response.data.games.items; + + const games: GoogleCalendarEvent[] = []; + + // Loop through each game and construct the GoogleCalendarEvent objects + for (const game of gamesData) { + const gameDetails = game.gameDetails; + const gameTime = gameDetails.gameTime; // ISO string + const isFinalGameDate = gameDetails.isFinalGameDate; + const gameLocation = gameDetails.gameLocation; + + // Skip games without a game time + if (!gameTime) continue; + + const hostTeam = game.hostTeam; + const guestTeam = game.guestTeam; + + // Get team names + const hostTeamName = hostTeam.teamName; + const guestTeamName = guestTeam.teamName; + + const summary = `${hostTeamName} vs. ${guestTeamName}`; + + // Include a note if the game date is not final + let description = `${hostTeamName} vs. ${guestTeamName}`; + if (!isFinalGameDate) { + description += " (Date and time are subject to change)"; + } + + // Calculate start and end times + const startDateTime = moment(gameTime).toISOString(); + const endDateTime = moment(gameTime).add(2, "hours").toISOString(); + + // Add the event to the games array + games.push({ + summary: summary, + location: gameLocation, + description: description, + start: { + dateTime: startDateTime, + timeZone: "Asia/Jerusalem", + }, + end: { + dateTime: endDateTime, + timeZone: "Asia/Jerusalem", + }, + }); } - }); - return time.trim(); - } - private findDate(headerSplit: string[]) { - // if it's a date format, return it like: 19/08/2023 - let date = ''; - headerSplit.forEach((item) => { - if(/\d{2}\/\d{2}\/\d{4}/.test(item)) { - date = item; - return; - } - }) - - // console.log("Cheking date: ", date, "By split: ", headerSplit) - return date.trim(); - } - - getOpponentIndexByStadium(stadium: string) { - if (stadium === "Sammy Ofer Stadium") { - return 1; - } else { - return 0; + return games; + } catch (error) { + console.error(error); + return []; } } } diff --git a/src/index.ts b/src/index.ts index 0b70064..393dbc4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,13 +17,11 @@ class App { } async startCronJob() { - this.writeLog('START CRON JOB'); // Log when the cron job starts - console.log("START Haifa Reminder"); + this.writeLog('START Haifa Reminder'); // Log when the cron job starts const newGamesAdded = []; await this.googleCalendar.init(); try { const games = await this.gameSource.getGamesFromHaifa(this.writeLog); - for (const game of games) { const isDuplicateEvent = await this.googleCalendar.isDuplicateEvent( game.start.dateTime,