feat: match parsing is working

This commit is contained in:
Lazar 2021-09-13 22:06:12 +02:00
parent 49f16c287b
commit 7fd4dd3a70
2 changed files with 76 additions and 57 deletions

View file

@ -1,12 +1,10 @@
import Database from '@ioc:Adonis/Lucid/Database'
import { MatchDto } from 'App/Services/Jax/src/Endpoints/MatchEndpoint' import { MatchDto } from 'App/Services/Jax/src/Endpoints/MatchEndpoint'
import Match from 'App/Models/Match' import Match from 'App/Models/Match'
import MatchPlayer from 'App/Models/MatchPlayer'
import { getSeasonNumber } from 'App/helpers' import { getSeasonNumber } from 'App/helpers'
class MatchParser { class MatchParser {
public async parseOneMatch(match: MatchDto) { public async parseOneMatch(match: MatchDto) {
// TODO: parse + store in database // Parse + store in database
// From the MatchDto, we need these Models in the DB:
// - 1x Match // - 1x Match
const parsedMatch = await Match.create({ const parsedMatch = await Match.create({
id: match.metadata.matchId, id: match.metadata.matchId,
@ -15,7 +13,7 @@ class MatchParser {
gamemode: match.info.queueId, gamemode: match.info.queueId,
date: match.info.gameCreation, date: match.info.gameCreation,
region: match.info.platformId.toLowerCase(), region: match.info.platformId.toLowerCase(),
result: 0, // TODO result: match.info.teams[0].win ? match.info.teams[0].teamId : match.info.teams[1].teamId,
season: getSeasonNumber(match.info.gameCreation), season: getSeasonNumber(match.info.gameCreation),
gameDuration: match.info.gameDuration, gameDuration: match.info.gameDuration,
}) })
@ -40,60 +38,81 @@ class MatchParser {
}) })
} }
// - 10x MatchPlayer // TODO // - 10x MatchPlayer
const matchPlayers: any[] = []
for (const player of match.info.participants) {
const kda: number =
player.kills + player.assists !== 0 && player.deaths === 0
? Infinity
: +(player.deaths === 0 ? 0 : (player.kills + player.assists) / player.deaths).toFixed(2)
const matchPlayers = match.info.participants.map( const teamKills =
(p) => <MatchPlayer>(<unknown>{ match.info.teams[0].teamId === player.teamId
matchId: match.metadata.matchId, ? match.info.teams[0].objectives.champion.kills
participantId: p.participantId, : match.info.teams[1].objectives.champion.kills
summonerId: p.summonerId,
summonerPuuid: p.puuid, const kp: number =
summonerName: p.summonerName, teamKills === 0 ? 0 : +(((player.kills + player.assists) * 100) / teamKills).toFixed(1)
team: p.teamId,
teamPosition: p.teamPosition, const primaryStyle = player.perks.styles.find((s) => s.description === 'primaryStyle')
kills: p.kills, const secondaryStyle = player.perks.styles.find((s) => s.description === 'subStyle')
deaths: p.deaths,
assists: p.assists, const perksSelected: number[] = []
kda: 100, for (const styles of player.perks.styles) {
kp: 100, for (const perk of styles.selections) {
champLevel: p.champLevel, perksSelected.push(perk.perk)
championId: p.championId, }
championRole1: 1, }
championRole2: 2,
doubleKills: p.doubleKills, matchPlayers.push({
tripleKills: p.tripleKills, match_id: match.metadata.matchId,
quadraKills: p.quadraKills, participant_id: player.participantId,
pentaKills: p.pentaKills, summoner_id: player.summonerId,
baronKills: p.baronKills, summoner_puuid: player.puuid,
dragonKills: p.dragonKills, summoner_name: player.summonerName,
turretKills: p.turretKills, team: player.teamId,
visionScore: p.visionScore, team_position: player.teamPosition,
gold: p.goldEarned, kills: player.kills,
summoner1Id: p.summoner1Id, deaths: player.deaths,
summoner2Id: p.summoner2Id, assists: player.assists,
item0: p.item0, kda: kda,
item1: p.item1, kp: kp,
item2: p.item2, champ_level: player.champLevel,
item3: p.item3, champion_id: player.championId,
item4: p.item4, champion_role1: 0, // TODO
item5: p.item5, champion_role2: 0, // TODO
item6: p.item6, double_kills: player.doubleKills,
damageDealtObjectives: p.damageDealtToObjectives, triple_kills: player.tripleKills,
damageDealtChampions: p.totalDamageDealtToChampions, quadra_kills: player.quadraKills,
damageTaken: p.totalDamageTaken, penta_kills: player.pentaKills,
heal: p.totalHeal, baron_kills: player.baronKills,
minions: p.totalMinionsKilled, dragon_kills: player.dragonKills,
criticalStrike: p.largestCriticalStrike, turret_kills: player.turretKills,
killingSpree: p.killingSprees, vision_score: player.visionScore,
timeSpentLiving: p.longestTimeSpentLiving, gold: player.goldEarned,
perksPrimaryStyle: 100, summoner1_id: player.summoner1Id,
perksSecondaryStyle: 100, summoner2_id: player.summoner2Id,
perksSelected: [1, 2, 3], item0: player.item0,
item1: player.item1,
item2: player.item2,
item3: player.item3,
item4: player.item4,
item5: player.item5,
item6: player.item6,
damage_dealt_objectives: player.damageDealtToObjectives,
damage_dealt_champions: player.totalDamageDealtToChampions,
damage_taken: player.totalDamageTaken,
heal: player.totalHeal,
minions: player.totalMinionsKilled,
critical_strike: player.largestCriticalStrike,
killing_spree: player.killingSprees,
time_spent_living: player.longestTimeSpentLiving,
perks_primary_style: primaryStyle!.style,
perks_secondary_style: secondaryStyle!.style,
perks_selected: perksSelected,
}) })
) }
await Database.table('match_players').multiInsert(matchPlayers)
parsedMatch.related('players').createMany(matchPlayers)
return parsedMatch return parsedMatch
} }

View file

@ -9,7 +9,7 @@ export default class MatchPlayers extends BaseSchema {
table.string('match_id', 15).notNullable() table.string('match_id', 15).notNullable()
table.integer('participant_id').notNullable() table.integer('participant_id').notNullable()
table.string('summoner_id', 78).notNullable() // check length table.string('summoner_id', 63).notNullable()
table.string('summoner_puuid', 78).notNullable() table.string('summoner_puuid', 78).notNullable()
table.string('summoner_name', 16).notNullable() table.string('summoner_name', 16).notNullable()