UNPKG

hockeybar

Version:

A bot used to automate the updating of hockey league subreddit markdown

160 lines (135 loc) 6.64 kB
const request = require("request"); const jsdom = require("jsdom"); const { JSDOM } = jsdom; const cheerio = require('cheerio'); const teams = require('../teams'); var ScheduleBuilder = class ScheduleBuilder { constructor(team, includePreaseason) { this.team = team; this.includePreaseason = includePreaseason; } parse(days) { return new Promise((resolve, reject) => { this.days = days; var self = this; var schedule = []; request({ uri: `http://www.foxsports.com/nhl/${this.team.uri}-team-schedule?season=2017&seasonType=${this.includePreaseason === true ? 3 : 1}&month=-1` }, function (error, response, body) { if (error && response.statusCode !== 200) { reject('Error when contacting server'); } var virtualConsole = new jsdom.VirtualConsole(); var dom = new JSDOM(body, virtualConsole); self.parseTeamSchedule(dom.serialize(), schedule); if (self.includePreaseason === true) { request({ uri: `http://www.foxsports.com/nhl/${self.team.uri}-team-schedule?season=2017&seasonType=1&month=-1` }, function (error, response, body) { if (error && response.statusCode !== 200) { reject('Error when contacting server'); } var virtualConsole = new jsdom.VirtualConsole(); var dom = new JSDOM(body, virtualConsole); self.parseTeamSchedule(dom.serialize(), schedule); resolve(schedule); }); } else { resolve(schedule); } }); }); } buildTeamScheduleMarkdown(teamSchedule) { return new Promise((resolve, reject) => { var eventMarkdown = ''; for (var i = 0; i < teamSchedule.length; i++) { eventMarkdown = eventMarkdown + this.buildEventMarkdown(teamSchedule[i]); } resolve(eventMarkdown); }); } buildEventMarkdown(event) { var markdown = `\n* | [${!event.isHome ? event.teamScore : event.opponentScore}](#CURRSCORE) | ${event.isHome ? '[Home](#HOMEGAME)' : '[Away](#AWAYGAME)'} | [${event.isHome ? event.teamScore : event.opponentScore}](#CURRSCORE) | |:-:|:-:|:-:| |${event.date}|@|${event.time}| |Network|:|${event.network}| |[${!event.isHome ? this.team.abv : event.opponent.abv}](/r/${!event.isHome ? this.team.subreddit : event.opponent.subreddit})|vs.|[${event.isHome ? this.team.abv : event.opponent.abv}](/r/${event.isHome ? this.team.subreddit : event.opponent.subreddit})| `; return markdown; } parseTeamSchedule(data, scheduledEvents) { var $ = cheerio.load(data); var scheduleTable = $('.wisbb_teamScheduleRow'); var currentDate = new Date(); var comparisonMonth = currentDate.getMonth() + 1; var comparisonDay = currentDate.getDate(); var comparisonDateString = `${comparisonMonth}/${comparisonDay}`; for (var i = 0; i < scheduleTable.length; i++) { var event = { type: 'event', network: 'TBD' }; event.date = $(scheduleTable[i]).find('.wisbb_scheduleTitleElement')[0].children[1].children[1].children[0].data; var eventMonth = event.date.split("/")[0]; var eventDay = event.date.split("/")[1]; if(parseInt(eventMonth) === comparisonMonth && parseInt(eventDay) < comparisonDay - this.days) { continue; } if (scheduledEvents.length === this.days) { break; } var opponent = {}; var opponentNode = $(scheduleTable[i]).find('.wisbb_team'); var teamKey = opponentNode[0].children[1].children[1].attribs.href.split("/nhl/")[1]; teamKey = teamKey.substr(0, teamKey.length - 5); opponent = teams[teamKey]; opponent.record = opponentNode[0].children[1].children[1].children[7].children[0].data; var eventInfoNode = $(scheduleTable[i]).find('.wisbb_gameInfo')[0].children[1]; event.boxScoreUrl = eventInfoNode.attribs.href; var resultOrInfo = eventInfoNode.children[1]; if (resultOrInfo.attribs.class !== undefined && resultOrInfo.attribs.class === 'wisbb_result') { event.time = 'FINAL'; event.status = 'FINAL'; event.network = 'FINAL'; event.teamScore = resultOrInfo.childNodes[3].children[0].data; event.opponentScore = resultOrInfo.childNodes[7].children[0].data; } else if (resultOrInfo.attribs.class !== undefined && resultOrInfo.attribs.class === 'wisbb_live') { event.teamScore = 0; event.opponentScore = 0; event.status = eventInfoNode.children[1].children[1].children[0].data; event.time = 'LIVE'; event.network = eventInfoNode.children[1].children[3].children[0].data; } else { event.teamScore = 0; event.opponentScore = 0; event.status = ''; event.time = 'TBD'; event.network = 'TBD'; if (eventInfoNode.children[1].children.length > 0) { event.status = eventInfoNode.children[1].children[0].data; } if (eventInfoNode.children[3].children.length > 0) { event.time = eventInfoNode.children[3].children[0].data; } if (eventInfoNode.children[5].children.length > 0) { event.network = eventInfoNode.children[5].children[0].data; } } var eventDetailsNode = $(scheduleTable[i]).find('.wisbb_details'); event.arena = eventDetailsNode[0].children[1].children[0].data; event.arena = event.arena.split("\n").join(""); event.arena = event.arena.split("\t").join(""); event.arena = event.arena.split(" ").join(""); event.arena = event.arena.toUpperCase(); event.isHome = event.arena === this.team.arenaabv; event.opponent = opponent; scheduledEvents.push(event); } return scheduledEvents; } } module.exports = ScheduleBuilder;