UNPKG

hockeybar

Version:

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

115 lines (97 loc) 3.85 kB
const request = require("request"); const jsdom = require("jsdom"); const { JSDOM } = jsdom; const cheerio = require('cheerio'); const teams = require('../teams'); var TeamStatsBuilder = class TeamStatsBuilder { constructor(team) { this.team = team; var currentDate = new Date(); var comparisonMonth = currentDate.getMonth() + 1; var comparisonDay = currentDate.getDate(); var comparisonYear = currentDate.getFullYear(); this.isPreSeason = true; if(comparisonMonth === 10 && comparisonDay === 4 && comparisonYear === 2017){ this.isPreSeason = false; } } parseStandingsStats(data, grouping) { var divisionMapping = { "PACIFIC": 15 } var conferenceMapping = { "EAST": this.isPreSeason === true ? 7 : 3, "WEST": this.isPreSeason === true ? 3 : 7 } var statsIndex = 0; switch (grouping) { case 1: statsIndex = divisionMapping[this.team.division]; break; case 2: statsIndex = conferenceMapping[this.team.conference]; break; } var teamStats = []; var $ = cheerio.load(data); var statsTable = $('.wisbb_standardTable'); var desiredStatsTable = statsTable[0].children[statsIndex]; var rank = 1; for (var i = 0; i < desiredStatsTable.children.length; i++) { if (i % 2 != 0) { var teamStatsRow = desiredStatsTable.children[i]; var teamHref = teamStatsRow.children[1].children[1].attribs.href.split("/nhl/")[1]; var teamKey = teamHref.substr(0, teamHref.length - 5); var team = teams[teamKey]; team.type = 'team'; team.rank = rank; team.w = teamStatsRow.children[3].children[0].data team.l = teamStatsRow.children[5].children[0].data team.otl = teamStatsRow.children[7].children[0].data team.pts = teamStatsRow.children[9].children[0].data team.gp = teamStatsRow.children[11].children[0].data teamStats.push(team); rank++; } } return teamStats; } parse(grouping = 1) { return new Promise((resolve, reject) => { this.getStats(grouping).then((data) => { let stats = this.parseStandingsStats(data, grouping); resolve(stats); }); }); } getStats(grouping) { return new Promise((resolve, reject) => { request({ uri: `http://www.foxsports.com/nhl/standings?season=2017&seasonType=${this.isPreSeason === true ? 3 : 1}&grouping=${grouping}` }, function (error, response, body) { if (error && response.statusCode !== 200) { console.log('Error when contacting server') } var virtualConsole = new jsdom.VirtualConsole(); var dom = new JSDOM(body, virtualConsole); resolve(dom.serialize()); }); }); } buildStats(stats) { return new Promise((resolve, reject) => { var statsMarkdown = '| # | Team | GP | W | L | OTL | PTS |\n|---|------|--------|----|---|---|---|\n'; for (var i = 0; i < stats.length; i++) { statsMarkdown = statsMarkdown + this.buildTeamStatsMarkdown(stats[i]); } resolve(statsMarkdown); }); } buildTeamStatsMarkdown(team) { var markdown = `|${team.rank}|[](/r/${team.subreddit})|${team.gp}|${team.w}|${team.l}|${team.otl}|${team.pts}|\n`; return markdown; } } module.exports = TeamStatsBuilder;