feat: start basic-match serializer

This commit is contained in:
Kalane 2021-09-12 22:55:46 +02:00
parent 2b73d29f6a
commit 505bbd739d
4 changed files with 187 additions and 1 deletions

View file

@ -0,0 +1,67 @@
import { getSeasonNumber } from 'App/helpers'
import Match from 'App/Models/Match'
import MatchPlayer from 'App/Models/MatchPlayer'
import MatchSerializer from './MatchSerializer'
import { SerializedMatch, SerializedMatchChampion } from './SerializedTypes'
class BasicMatchSerializer extends MatchSerializer {
/**
* Get champion specific data
* @param id of the champion
*/
protected getChampion(id: number): SerializedMatchChampion {
const originalChampionData = this.champions.find((c) => c.id === id)
const icon =
'https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/' +
originalChampionData!.squarePortraitPath.split('/assets/')[1].toLowerCase()
return {
icon,
id: originalChampionData!.id,
name: originalChampionData!.name,
alias: originalChampionData!.alias,
roles: originalChampionData!.roles,
}
}
public async serializeOneMatch(match: Match, puuid: string) {
// : Promise<SerializedMatch>
const players = await match.related('players').query()
const identity = players.find((p) => p.summonerPuuid === puuid)!
// TODO: keep going here
return {
allyTeam: null,
champion: this.getChampion(identity.championId),
date: match.date,
enemyTeam: null,
firstSum: identity.summoner1Id,
matchId: match.id,
gamemode: match.gamemode,
items: null,
level: identity.champLevel,
map: match.map,
name: identity.summonerName,
perks: null,
region: match.region,
result: null,
role: identity.teamPosition,
season: getSeasonNumber(match.date),
secondSum: identity.summoner2Id,
stats: null,
summonerId: identity.summonerId,
summonerPuuid: puuid,
time: match.gameDuration,
}
}
public async serialize(matches: Match[], puuid: string) {
// : Promise<SerializedMatch[]>
await super.getContext()
return matches.map((match) => this.serializeOneMatch(match, puuid))
}
}
export default new BasicMatchSerializer()

View file

@ -0,0 +1,39 @@
import Jax from 'App/Services/Jax'
import {
ChampionDTO,
ItemDTO,
PerkDTO,
PerkStyleDTO,
SummonerSpellDTO,
} from 'App/Services/Jax/src/Endpoints/CDragonEndpoint'
import RoleIdentificationService, {
ChampionsPlayRate,
} from 'App/Services/RoleIdentificationService'
export default abstract class MatchSerializer {
protected champions: ChampionDTO[]
protected items: ItemDTO[]
protected perks: PerkDTO[]
protected perkstyles: PerkStyleDTO[]
protected summonerSpells: SummonerSpellDTO[]
protected championRoles: ChampionsPlayRate
/**
* Get global Context with CDragon Data
*/
public async getContext() {
const items = await Jax.CDragon.items()
const champions = await Jax.CDragon.champions()
const perks = await Jax.CDragon.perks()
const perkstyles = await Jax.CDragon.perkstyles()
const summonerSpells = await Jax.CDragon.summonerSpells()
const championRoles = await RoleIdentificationService.pullData().catch(() => {})
this.champions = champions
this.items = items
this.perks = perks
this.perkstyles = perkstyles.styles
this.summonerSpells = summonerSpells
this.championRoles = championRoles as ChampionsPlayRate
}
}

View file

@ -0,0 +1,75 @@
export interface SerializedMatch {
allyTeam: SerializedMatchTeamPlayer[]
champion: SerializedMatchChampion
date: number
enemyTeam: SerializedMatchTeamPlayer[]
firstSum: number
matchId: string
gamemode: number
items: SerializedMatchItem[]
level: number
map: number
name: string
perks: SerializedMatchPerks
region: string
result: string
role: string
season: number
secondSum: number
stats: SerializedMatchStats
summonerId: string
summonerPuuid: string
time: number
}
export interface SerializedMatchTeamPlayer {
puuid: string
champion: SerializedMatchChampion
name: string
role: string
}
export interface SerializedMatchChampion {
alias: string
icon: string
id: number
name: string
roles: string[]
}
export interface SerializedMatchItem {
description: string
image: string
name: string
price: number
}
export interface SerializedMatchPerks {
primaryStyle: number
secondaryStyle: number
selected: number[]
}
export interface SerializedMatchStats {
assists: number
criticalStrike: number
deaths: number
dmgChamp: number
dmgObj: number
dmgTaken: number
doubleKills: number
gold: number
heal: number
kda: number
killingSpree: number
kills: number
kp: number
longestLiving: number
minions: number
pentaKills: number
quadraKills: number
realKda: number
towers: number
tripleKills: number
vision: number
}

View file

@ -5,6 +5,7 @@ import Summoner from 'App/Models/Summoner'
import Database from '@ioc:Adonis/Lucid/Database'
import SummonerMatchlist from 'App/Models/SummonerMatchlist'
import MatchParser from 'App/Parsers/MatchParser'
import BasicMatchSerializer from 'App/Serializers/BasicMatchSerializer'
class MatchService {
/**
@ -102,9 +103,13 @@ class MatchService {
/* If we have to store some matches in the db */
if (matchesFromApi.length !== 0) {
// Transform raw matches data
const parsedMatches = await MatchParser.parse(matchesFromApi)
const parsedMatches: any = await MatchParser.parse(matchesFromApi)
// TODO: Serialize match from DB + put it in Redis + push it in "matches"
const serializedMatches = await BasicMatchSerializer.serialize(
parsedMatches,
summonerDB.puuid
)
}
// Todo: Sort and return "matches"