From 505bbd739d07a29226c3dd032459dfb2ae3652a2 Mon Sep 17 00:00:00 2001 From: Kalane Date: Sun, 12 Sep 2021 22:55:46 +0200 Subject: [PATCH] feat: start basic-match serializer --- .../app/Serializers/BasicMatchSerializer.ts | 67 +++++++++++++++++ server-v2/app/Serializers/MatchSerializer.ts | 39 ++++++++++ server-v2/app/Serializers/SerializedTypes.ts | 75 +++++++++++++++++++ server-v2/app/Services/MatchService.ts | 7 +- 4 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 server-v2/app/Serializers/BasicMatchSerializer.ts create mode 100644 server-v2/app/Serializers/MatchSerializer.ts create mode 100644 server-v2/app/Serializers/SerializedTypes.ts diff --git a/server-v2/app/Serializers/BasicMatchSerializer.ts b/server-v2/app/Serializers/BasicMatchSerializer.ts new file mode 100644 index 0000000..f50f74c --- /dev/null +++ b/server-v2/app/Serializers/BasicMatchSerializer.ts @@ -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 + + 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 + + await super.getContext() + + return matches.map((match) => this.serializeOneMatch(match, puuid)) + } +} + +export default new BasicMatchSerializer() diff --git a/server-v2/app/Serializers/MatchSerializer.ts b/server-v2/app/Serializers/MatchSerializer.ts new file mode 100644 index 0000000..71e7052 --- /dev/null +++ b/server-v2/app/Serializers/MatchSerializer.ts @@ -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 + } +} diff --git a/server-v2/app/Serializers/SerializedTypes.ts b/server-v2/app/Serializers/SerializedTypes.ts new file mode 100644 index 0000000..e5df77c --- /dev/null +++ b/server-v2/app/Serializers/SerializedTypes.ts @@ -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 +} diff --git a/server-v2/app/Services/MatchService.ts b/server-v2/app/Services/MatchService.ts index b54302c..8b733bb 100644 --- a/server-v2/app/Services/MatchService.ts +++ b/server-v2/app/Services/MatchService.ts @@ -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"