LeagueStats/server-v2/app/Serializers/BasicMatchSerializer.ts

169 lines
5.2 KiB
TypeScript
Raw Normal View History

2021-09-13 20:00:04 +00:00
import { getSeasonNumber, sortTeamByRole } from 'App/helpers'
2021-09-12 20:55:46 +00:00
import Match from 'App/Models/Match'
import MatchPlayer from 'App/Models/MatchPlayer'
import { TeamPosition } from 'App/Parsers/ParsedType'
2021-09-13 22:06:12 +00:00
import CDragonService from 'App/Services/CDragonService'
2021-09-12 20:55:46 +00:00
import MatchSerializer from './MatchSerializer'
import {
SerializedMatch,
SerializedMatchChampion,
SerializedMatchItem,
SerializedMatchPerks,
SerializedMatchStats,
2021-09-13 22:44:12 +00:00
SerializedMatchSummonerSpell,
SerializedMatchTeamPlayer,
} from './SerializedTypes'
2021-09-12 20:55:46 +00:00
class BasicMatchSerializer extends MatchSerializer {
/**
* Get champion specific data
* @param id of the champion
*/
2021-09-15 14:22:19 +00:00
public getChampion(id: number): SerializedMatchChampion {
const originalChampionData = CDragonService.champions[id]
2021-09-12 20:55:46 +00:00
const icon =
CDragonService.BASE_URL +
originalChampionData.squarePortraitPath.split('/assets/')[1].toLowerCase()
2021-09-12 20:55:46 +00:00
return {
icon,
id: originalChampionData.id,
name: originalChampionData.name,
alias: originalChampionData.alias,
roles: originalChampionData.roles,
2021-09-12 20:55:46 +00:00
}
}
protected getPlayerSummary(player: MatchPlayer): SerializedMatchTeamPlayer {
return {
puuid: player.summonerPuuid,
champion: this.getChampion(player.championId),
name: player.summonerName,
role: TeamPosition[player.teamPosition],
}
}
protected getTeamSummary(players: MatchPlayer[]): SerializedMatchTeamPlayer[] {
2021-09-13 20:00:04 +00:00
return players.map((p) => this.getPlayerSummary(p)).sort(sortTeamByRole)
}
2021-09-13 22:44:12 +00:00
/**
* Get Summoner Spell Data from CDragon
* @param id of the summonerSpell
*/
public getSummonerSpell(id: number): SerializedMatchSummonerSpell | null {
const spell = CDragonService.summonerSpells[id]
if (id === 0 || !spell) {
2021-09-13 22:44:12 +00:00
return null
}
const spellName = spell.iconPath.split('/assets/')[1].toLowerCase()
return {
name: spell.name,
description: spell.description,
icon: `${CDragonService.BASE_URL}${spellName}`,
2021-09-13 22:44:12 +00:00
}
}
protected getItems(player: MatchPlayer): Array<SerializedMatchItem | null> {
const items: (SerializedMatchItem | null)[] = []
for (let i = 0; i < 6; i++) {
const id = player['item' + i]
if (id === 0) {
items.push(null)
continue
}
const item = CDragonService.items[id]
if (!item) {
items.push(null)
continue
}
const itemUrl = item.iconPath.split('/assets/')[1].toLowerCase()
items.push({
image: `${CDragonService.BASE_URL}${itemUrl}`,
name: item.name,
description: item.description,
price: item.priceTotal,
})
}
return items
}
protected getPerks(player: MatchPlayer): SerializedMatchPerks {
return {
primaryStyle: player.perksPrimaryStyle,
secondaryStyle: player.perksSecondaryStyle,
selected: player.perksSelected,
}
}
protected getStats(player: MatchPlayer): SerializedMatchStats {
return {
kills: player.kills,
deaths: player.deaths,
assists: player.assists,
minions: player.minions,
vision: player.visionScore,
gold: player.gold,
dmgChamp: player.damageDealtChampions,
dmgObj: player.damageDealtObjectives,
dmgTaken: player.damageTaken,
kp: player.kp,
kda: player.kills + player.assists !== 0 && player.deaths === 0 ? '∞' : player.kda,
realKda: player.kda,
criticalStrike: player.criticalStrike,
killingSpree: player.killingSpree,
doubleKills: player.doubleKills,
tripleKills: player.tripleKills,
quadraKills: player.quadraKills,
pentaKills: player.pentaKills,
heal: player.heal,
towers: player.turretKills,
longestLiving: player.timeSpentLiving,
}
}
2021-09-12 20:55:46 +00:00
public serializeOneMatch(match: Match, puuid: string, newMatch = false): SerializedMatch {
2021-09-13 20:00:04 +00:00
const identity = match.players.find((p) => p.summonerPuuid === puuid)!
const allyTeam = match.teams.find((t) => t.color === identity.team)!
const allyPlayers: MatchPlayer[] = []
const enemyPlayers: MatchPlayer[] = []
2021-09-13 20:00:04 +00:00
for (const p of match.players) {
2021-09-13 22:06:12 +00:00
p.team === identity.team ? allyPlayers.push(p) : enemyPlayers.push(p)
}
2021-09-12 20:55:46 +00:00
return {
allyTeam: this.getTeamSummary(allyPlayers),
2021-09-12 20:55:46 +00:00
champion: this.getChampion(identity.championId),
date: match.date,
enemyTeam: this.getTeamSummary(enemyPlayers),
2021-09-12 20:55:46 +00:00
matchId: match.id,
gamemode: match.gamemode,
items: this.getItems(identity),
2021-09-12 20:55:46 +00:00
level: identity.champLevel,
map: match.map,
name: identity.summonerName,
newMatch,
perks: this.getPerks(identity),
2021-09-12 20:55:46 +00:00
region: match.region,
2021-09-13 21:04:52 +00:00
result: allyTeam.result,
role: TeamPosition[identity.teamPosition],
2021-09-12 20:55:46 +00:00
season: getSeasonNumber(match.date),
stats: this.getStats(identity),
2021-09-12 20:55:46 +00:00
summonerId: identity.summonerId,
2021-09-13 22:44:12 +00:00
summonerSpell1: this.getSummonerSpell(identity.summoner1Id),
summonerSpell2: this.getSummonerSpell(identity.summoner2Id),
2021-09-12 20:55:46 +00:00
summonerPuuid: puuid,
time: match.gameDuration,
}
}
public serialize(matches: Match[], puuid: string, newMatches = false): SerializedMatch[] {
return matches.map((match) => this.serializeOneMatch(match, puuid, newMatches))
2021-09-12 20:55:46 +00:00
}
}
export default new BasicMatchSerializer()