This repository has been archived by the owner on Jun 3, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2c2a072
commit 0e52c10
Showing
3 changed files
with
127 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}`; | ||
} | ||
}; | ||
} |