hockeybar
Version:
A bot used to automate the updating of hockey league subreddit markdown
119 lines (110 loc) • 4.66 kB
JavaScript
const request = require("request");
const jsdom = require("jsdom");
const {
JSDOM
} = jsdom;
const cheerio = require('cheerio');
const teams = require('../teams');
var PlayerStatsBuilder = class PlayerStatsBuilder {
constructor(team) {
this.team = team;
}
parseTeamStats(data, count, goalie) {
var teamStats = [];
var $ = cheerio.load(data);
var statsTable = $('.wisbb_fvStand');
statsTable.splice(0, 3);
for (var i = 0; i < count; i++) {
if (statsTable[i] !== undefined) {
var playerRow = statsTable[i];
var playerStat = {};
playerStat.name = playerRow.children[1].children[1].children[3].children[3].children[0].data;
playerStat.position = playerRow.children[1].children[1].children[5].children[1].children[0].data;
if (goalie === true) {
playerStat.type = 'goalie';
playerStat.gpi = playerRow.children[3].children[0].data;
playerStat.sv = playerRow.children[19].children[0].data;
playerStat.gaa = playerRow.children[21].children[0].data;
} else {
playerStat.type = 'skater';
playerStat.gp = playerRow.children[3].children[0].data;
playerStat.g = playerRow.children[5].children[0].data;
playerStat.a = playerRow.children[7].children[0].data;
}
teamStats.push(playerStat);
}
}
return teamStats;
}
parse(count, playerType = 1) {
return new Promise((resolve, reject) => {
switch (playerType) {
case 1:
this.getTeamStats(count).then((data) => {
let stats = this.parseTeamStats(data, count, false);
resolve(stats);
});
break;
case 2:
this.getGoalieStats(count).then((data) => {
let stats = this.parseTeamStats(data, count, true);
resolve(stats);
});
break;
}
});
}
getTeamStats(count) {
return new Promise((resolve, reject) => {
var self = this;
request({
uri: `http://www.foxsports.com/nhl/${this.team.uri}-team-stats?season=2017&category=SCORING&group=1&sort=3&time=0&pos=0&team=0&qual=0&sortOrder=0`
}, 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());
});
});
}
getGoalieStats(count) {
return new Promise((resolve, reject) => {
var self = this;
request({
uri: `http://www.foxsports.com/nhl/${this.team.uri}-team-stats?season=2017&category=GOALTENDING&group=1&time=0`
}, 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());
});
});
}
buildSkaterStats(stats) {
return new Promise((resolve, reject) => {
var statsMarkdown = '| # | Pos. | Player | GP | G | A |\n|---|------|--------|----|---|---|\n';
for (var i = 0; i < stats.length; i++) {
statsMarkdown = statsMarkdown + this.buildStatsMarkdown(stats[i]);
}
resolve(statsMarkdown);
});
}
buildGoalieStats(stats) {
return new Promise((resolve, reject) => {
var statsMarkdown = '| # | Pos. | Player | GPI | SV% | GAA |\n|---|------|--------|----|---|---|\n';
for (var i = 0; i < stats.length; i++) {
statsMarkdown = statsMarkdown + this.buildStatsMarkdown(stats[i]);
}
resolve(statsMarkdown);
});
}
buildStatsMarkdown(stat) {
var markdown = `|${''}|${stat.position}|${stat.name}|${stat.gp || stat.gpi}|${stat.g || stat.sv}|${stat.a || stat.gaa}|\n`;
return markdown;
}
}
module.exports = PlayerStatsBuilder;