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