Skip to content
This repository has been archived by the owner on Jun 3, 2020. It is now read-only.

Commit

Permalink
moved translator to own class
Browse files Browse the repository at this point in the history
  • Loading branch information
jaebradley committed May 15, 2016
1 parent 2c2a072 commit 0e52c10
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 110 deletions.
2 changes: 1 addition & 1 deletion src/cli/commands/GamesCommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default class GamesCommand {
};

default:
let customDateTime = new Date(time);
let customDateTime = new Date(timeRangeOption);
if (moment(customDateTime).isValid()) {
return {
startDate: moment(customDateTime).tz(this.userTimezone).startOf("day"),
Expand Down
6 changes: 4 additions & 2 deletions src/data/NbaDataClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ const Q = require('q');

const PlayByPlayClient = require('./clients/PlayByPlayClient.js');
const BoxScoreClient = require('./clients/BoxScoreClient.js');
const ScoreboardDataTranslator = require('../translators/data/ScoreboardDataTranslator.js');
import ScoreboardDataTranslator from '../translators/data/ScoreboardDataTranslator';
const ScoreboardFilter = require("../filters/data/ScoreboardFilter.js");
const Constants = require('../constants/Constants.js');

const scoreboardTranslator = new ScoreboardDataTranslator();

function generatScoreboardUrl(formattedDate) {
return Constants.BASE_NBA_DATA_SCOREBOARD_URL.concat(formattedDate, "/games.json");
}
Expand Down Expand Up @@ -60,7 +62,7 @@ function fetchScoreboardData(scoreboardUrl, unixMillisecondsStartTime, unixMilli
var filteredGameData = {};
rp( { uri: scoreboardUrl, json: true } )
.then(function (scoreboardData) {
const translatedData = ScoreboardDataTranslator.translateGameData(scoreboardData);
const translatedData = scoreboardTranslator.translateScoreboardData(scoreboardData);
filteredGameData = ScoreboardFilter.filterScoreboardData(translatedData, unixMillisecondsStartTime, unixMillisecondsEndTime); })
.then(function () {
return fetchPlayByPlayData(filteredGameData); })
Expand Down
229 changes: 122 additions & 107 deletions src/translators/data/ScoreboardDataTranslator.js
Original file line number Diff line number Diff line change
@@ -1,125 +1,140 @@
const moment = require("moment-timezone");
const jstz = require("jstimezonedetect");
import moment from 'moment-timezone';
import jstz from 'jstimezonedetect';

const HtmlEscaper = require("../../utils/HtmlEscaper.js");
const Constants = require("../../constants/Constants.js");
import HtmlEscaper from '../../utils/HtmlEscaper';
import Constants from '../../constants/Constants';

const USER_TIMEZONE = jstz.determine().name();

function getBroadcasts(data) {
const broadcasts = [];
data.tv.broadcaster.forEach(function(broadcast) {
broadcasts.push(broadcast.display_name);
});
return broadcasts;
}
export default class ScoreboardDataTranslator {
constructor() {
this.userTimezone = jstz.determine().name();
}

getLocalizedDateStartTime(dateStartTime) {
return ScoreboardDataTranslator
.getDefaultDateStartTime(dateStartTime)
.clone().tz(this.userTimezone)
.format(Constants.TRANSLATED_DATE_FORMAT);
}

translateGameData(gameData) {
const startDate = gameData.date;
const dateStartTime = startDate.concat(gameData.time);

const previewAvailable = gameData.previewAvailable;
const recapAvailable = gameData.recapAvailable;

const periodStatus = HtmlEscaper.escapeHtml(gameData.period_time.period_status);
const periodValue = HtmlEscaper.escapeHtml(gameData.period_time.period_value);
const gameStatus = gameData.period_time.game_status;
const gameClock = HtmlEscaper.escapeHtml(gameData.period_time.game_clock);
const gameUrl = gameData.gameUrl;
const arena = HtmlEscaper.escapeHtml(gameData.arena);
const city = HtmlEscaper.escapeHtml(gameData.city);
const state = HtmlEscaper.escapeHtml(gameData.state);

const visitorAbbreviation = HtmlEscaper.escapeHtml(gameData.visitor.abbreviation);
const visitorCity = HtmlEscaper.escapeHtml(gameData.visitor.city);
const visitorNickname = HtmlEscaper.escapeHtml(gameData.visitor.nickname);
const visitorScore = parseInt(gameData.visitor.score);

const homeAbbreviation = HtmlEscaper.escapeHtml(gameData.home.abbreviation);
const homeCity = HtmlEscaper.escapeHtml(gameData.home.city);
const homeNickname = HtmlEscaper.escapeHtml(gameData.home.nickname);
const homeScore = parseInt(gameData.home.score);

return {
status: ScoreboardDataTranslator.getGameStatus(periodStatus, gameStatus),
url: gameUrl,
nbaFormatStartDate: startDate,
unixMillisecondsStartTime: ScoreboardDataTranslator.getUnixMillisecondsStartTime(dateStartTime),
arena: arena,
city: city,
state: state,
formattedLocalizedStartDate: this.getLocalizedDateStartTime(dateStartTime),
isPreviewAvailable: ScoreboardDataTranslator.isPreviewAvailable(previewAvailable),
isRecapAvailable: ScoreboardDataTranslator.isRecapAvailable(recapAvailable),
periodValue: periodValue,
periodStatus: periodStatus,
gameClock: gameClock,
broadcasts: ScoreboardDataTranslator.getBroadcasts(gameData.broadcasters),
visitorAbbreviation: visitorAbbreviation,
visitorName: ScoreboardDataTranslator.generateTeamName(visitorCity, visitorNickname),
visitorScore: visitorScore,
visitorLinescores: ScoreboardDataTranslator.getTeamLinescores(gameData.visitor),
homeAbbreviation: homeAbbreviation,
homeName: ScoreboardDataTranslator.generateTeamName(homeCity, homeNickname),
homeScore: homeScore,
homeLinescores: ScoreboardDataTranslator.getTeamLinescores(gameData.home)
};
}

translateScoreboardData(scoreboardData) {
const translatedData = {};
scoreboardData.sports_content.games.game.map(gameData => (translatedData[gameData.id] = this.translateGameData(gameData)));
return translatedData;
}

static getBroadcasts(scoreboardData) {
return scoreboardData.tv.broadcaster.map(broadcast => broadcast.display_name);
}

static hasOnlyOneLinescorePeriod(periodData) {
return 'period_name' in periodData && 'score' in periodData;
}

function getTeamLinescores(data) {
const linescores = [];
if ('period_name' in data.period && 'score' in data.period) {
linescores.push(
{
period: data.period.period_name,
score: parseInt(data.period.score)
}
);
} else {
data.period.forEach(function(period) {
static getTeamLinescores(teamData) {
const linescores = [];
if (!('linescores' in teamData)) {
return linescores;
}

const linescoresData = teamData.linescores;
if (ScoreboardDataTranslator.hasOnlyOneLinescorePeriod(linescoresData.period)) {
linescores.push(
{
period: period.period_name,
score: parseInt(period.score)
period: linescoresData.period.period_name,
score: parseInt(linescoresData.period.score)
}
);
});
} else {
linescoresData.period.forEach(function(period) {
linescores.push(
{
period: period.period_name,
score: parseInt(period.score)
}
);
});
}
return linescores;
}
return linescores;
}

function getUnixMillisecondsStartTime(dateStartTime) {
return getDefaultDateStartTime(dateStartTime).clone()
.tz("UTC")
.valueOf();
}
static getDefaultDateStartTime(dateStartTime) {
return moment(dateStartTime, Constants.TRANSLATED_NBA_DATE_TIME_FORMAT).tz(Constants.DEFAULT_TIMEZONE);
}

function getUtcDateStartTime(dateStartTime) {
return getDefaultDateStartTime(dateStartTime).clone()
.tz("UTC")
.format(Constants.TRANSLATED_DATE_FORMAT);
}
static getUnixMillisecondsStartTime(dateStartTime) {
return ScoreboardDataTranslator.getDefaultDateStartTime(dateStartTime).clone().tz("UTC").valueOf();
}

function getDefaultDateStartTime(dateStartTime) {
return moment(dateStartTime, Constants.TRANSLATED_NBA_DATE_TIME_FORMAT).tz(Constants.DEFAULT_TIMEZONE);
}
static getGameStatus(periodStatus, gameStatus) {
if (periodStatus != "Halftime") {
return Constants.TRANSLATED_GAME_STATUS_MAP[gameStatus];
}

function getLocalizedDateStartTime(dateStartTime) {
return getDefaultDateStartTime(dateStartTime).clone()
.tz(USER_TIMEZONE)
.format(Constants.TRANSLATED_DATE_FORMAT);
}
return periodStatus;
}

function getGameStatus(periodStatus, gameStatus) {
if (periodStatus != "Halftime") {
return Constants.TRANSLATED_GAME_STATUS_MAP[gameStatus];
static isPreviewAvailable(isAvailable) {
return isAvailable == 1;
}

return periodStatus;
}
static isRecapAvailable(isAvailable) {
return isAvailable == 1;
}

module.exports = {

translateGameData: function(data) {
const games = {};
data.sports_content.games.game.forEach(function(game) {
var isPreviewAvailable = false;
if (game.previewAvailable == 1) {
isPreviewAvailable = true;
}

var isRecapAvailable = false;
if (game.recapAvailable == 1) {
isRecapAvailable = true;
}

var visitorLinescores = [];
if ("linescores" in game.visitor) {
visitorLinescores = getTeamLinescores(game.visitor.linescores);
}

var homeLinescores = [];
if ("linescores" in game.home) {
homeLinescores = getTeamLinescores(game.home.linescores);
}

const dateStartTime = game.date.concat(game.time);

games[game.id] = {
status: getGameStatus(game.period_time.period_status, game.period_time.game_status),
url: game.game_url,
nbaFormatStartDate: game.date,
unixMillisecondsStartTime: getUnixMillisecondsStartTime(dateStartTime),
formattedUtcDateStartTime: getUtcDateStartTime(dateStartTime),
arena: HtmlEscaper.escapeHtml(game.arena),
city: HtmlEscaper.escapeHtml(game.city),
state: HtmlEscaper.escapeHtml(game.state),
formattedLocalizedStartDate: getLocalizedDateStartTime(dateStartTime),
isPreviewAvailable: isPreviewAvailable,
isRecapAvailable: isRecapAvailable,
periodValue: HtmlEscaper.escapeHtml(game.period_time.period_value),
periodStatus: HtmlEscaper.escapeHtml(game.period_time.period_status),
gameClock: HtmlEscaper.escapeHtml(game.period_time.game_clock),
broadcasts: getBroadcasts(game.broadcasters),
visitorAbbreviation: HtmlEscaper.escapeHtml(game.visitor.abbreviation),
visitorName: HtmlEscaper.escapeHtml(game.visitor.city) + " " + HtmlEscaper.escapeHtml(game.visitor.nickname),
visitorScore: parseInt(game.visitor.score),
visitorLinescores: visitorLinescores,
homeAbbreviation: HtmlEscaper.escapeHtml(game.home.abbreviation),
homeName: HtmlEscaper.escapeHtml(game.home.city) + " " + HtmlEscaper.escapeHtml(game.home.nickname),
homeScore: parseInt(game.home.score),
homeLinescores: homeLinescores
};
});

return games;
static generateTeamName(city, nickname) {
return `${city} ${nickname}`;
}
};
}

0 comments on commit 0e52c10

Please sign in to comment.