hockeybar
Version:
A bot used to automate the updating of hockey league subreddit markdown
115 lines (97 loc) • 3.85 kB
JavaScript
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;