UNPKG

hockeybar

Version:

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

119 lines (110 loc) 4.66 kB
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;