refactor(server): start slowly the migration to v5

This commit is contained in:
Kalane 2021-08-07 22:52:54 +02:00
parent 73e8eec291
commit 41d363b981
13 changed files with 25696 additions and 5659 deletions

21512
client/package-lock.json generated

File diff suppressed because it is too large Load diff

1
server/.gitignore vendored
View file

@ -5,3 +5,4 @@ coverage
.DS_STORE
.env
tmp
*.rdb

View file

@ -93,11 +93,10 @@ export default class SummonersController {
// MATCHES BASIC
const gameIds = summonerDB.matchList!.slice(0)
.filter(m => {
return season ? m.seasonMatch === season : true
})
// .filter(m => {
// return season ? m.seasonMatch === season : true // TODO: filter by season
// })
.slice(0, 10)
.map(({ gameId }) => gameId)
finalJSON.matchesDetails = await MatchService.getMatches(puuid, accountId, region, gameIds, summonerDB)
// STATS

View file

@ -14,6 +14,9 @@ export interface MatchModel extends ParticipantDetails {
season: number,
time: number,
newMatch?: boolean,
// V5
matchId: string,
}
export interface ParticipantDetails {
@ -131,4 +134,7 @@ export default class Match extends Model implements MatchModel {
public firstSum: number
public secondSum: number
public stats: Stats
// V5
public matchId: string
}

View file

@ -1,9 +1,9 @@
import { Model } from '@ioc:Mongodb/Model'
import { MatchReferenceDto } from 'App/Services/Jax/src/Endpoints/MatchlistEndpoint'
import { MatchlistDto } from 'App/Services/Jax/src/Endpoints/MatchlistEndpoint'
export interface SummonerModel {
puuid: string,
matchList?: MatchReferenceDto[],
matchList?: MatchlistDto,
names?: SummonerNames[]
}
@ -16,6 +16,6 @@ export default class Summoner extends Model implements SummonerModel {
public static collectionName = 'summoners'
public puuid: string
public matchList?: MatchReferenceDto[]
public matchList?: MatchlistDto
public names?: SummonerNames[]
}

View file

@ -1,213 +1,413 @@
// import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter'
import { getV5Region } from 'App/helpers'
import RiotRateLimiter from 'riot-ratelimiter'
import { JaxConfig } from '../../JaxConfig'
import JaxRequest from '../JaxRequest'
// export interface MatchDto {
// gameId: number,
// participantIdentities: ParticipantIdentityDto[],
// queueId: number,
// gameType: string,
// gameDuration: number,
// teams: TeamStatsDto[],
// platformId: string
// gameCreation: number,
// seasonId: number,
// gameVersion: string,
// mapId: number,
// gameMode: string,
// participants: ParticipantDto[],
// }
// export interface ParticipantIdentityDto {
// participantId: number,
// player: PlayerDto
// }
// export interface PlayerDto {
// profileIcon: number,
// accountId: string,
// matchHistoryUri: string,
// currentAccountId: string,
// currentPlatformId: string,
// summonerName: string,
// summonerId: string,
// platformId: string,
// }
// export interface TeamStatsDto {
// towerKills: number,
// riftHeraldKills: number,
// firstBlood: boolean,
// inhibitorKills: number,
// bans: TeamBansDto[],
// firstBaron: boolean,
// firstDragon: boolean,
// dominionVictoryScore: number,
// dragonKills: number,
// baronKills: number,
// firstInhibitor: boolean
// firstTower: boolean
// vilemawKills: number,
// firstRiftHerald: boolean
// teamId: number, // 100 for blue side. 200 for red side.
// win: string
// }
// export interface TeamBansDto {
// championId: number,
// pickTurn: number,
// }
// export interface ParticipantDto {
// participantId: number,
// championId: number,
// runes: RuneDto[],
// stats: ParticipantStatsDto,
// teamId: number,
// timeline: ParticipantTimelineDto,
// spell1Id: number,
// spell2Id: number,
// highestAchievedSeasonTier?:
// 'CHALLENGER' | 'MASTER' | 'DIAMOND' | 'PLATINUM' | 'GOLD' | 'SILVER' | 'BRONZE' | 'UNRANKED',
// masteries: MasteryDto[]
// }
// export interface RuneDto {
// runeId: number,
// rank: number,
// }
// export interface ParticipantStatsDto {
// item0: number,
// item2: number,
// totalUnitsHealed: number,
// item1: number,
// largestMultiKill: number,
// goldEarned: number,
// firstInhibitorKill: boolean,
// physicalDamageTaken: number,
// nodeNeutralizeAssist: number,
// totalPlayerScore: number,
// champLevel: number,
// damageDealtToObjectives: number,
// totalDamageTaken: number,
// neutralMinionsKilled: number,
// deaths: number,
// tripleKills: number,
// magicDamageDealtToChampions: number,
// wardsKilled: number,
// pentaKills: number,
// damageSelfMitigated: number,
// largestCriticalStrike: number,
// nodeNeutralize: number,
// totalTimeCrowdControlDealt: number,
// firstTowerKill: boolean
// magicDamageDealt: number,
// totalScoreRank: number,
// nodeCapture: number,
// wardsPlaced: number,
// totalDamageDealt: number,
// timeCCingOthers: number,
// magicalDamageTaken: number,
// largestKillingSpree: number,
// totalDamageDealtToChampions: number,
// physicalDamageDealtToChampions: number,
// neutralMinionsKilledTeamJungle: number,
// totalMinionsKilled: number,
// firstInhibitorAssist: boolean
// visionWardsBoughtInGame: number,
// objectivePlayerScore: number,
// kills: number,
// firstTowerAssist: boolean
// combatPlayerScore: number,
// inhibitorKills: number,
// turretKills: number,
// participantId: number,
// trueDamageTaken: number,
// firstBloodAssist: boolean
// nodeCaptureAssist: number,
// assists: number,
// teamObjective: number,
// altarsNeutralized: number,
// goldSpent: number,
// damageDealtToTurrets: number,
// altarsCaptured: number,
// win: boolean,
// totalHeal: number,
// unrealKills: number,
// visionScore: number,
// physicalDamageDealt: number,
// firstBloodKill: boolean,
// longestTimeSpentLiving: number,
// killingSprees: number,
// sightWardsBoughtInGame: number,
// trueDamageDealtToChampions: number,
// neutralMinionsKilledEnemyJungle: number,
// doubleKills: number,
// trueDamageDealt: number,
// quadraKills: number,
// item4: number,
// item3: number,
// item6: number,
// item5: number,
// playerScore0: number,
// playerScore1: number,
// playerScore2: number,
// playerScore3: number,
// playerScore4: number,
// playerScore5: number,
// playerScore6: number,
// playerScore7: number,
// playerScore8: number,
// playerScore9: number,
// perk0: number,
// perk0Var1: number,
// perk0Var2: number,
// perk0Var3: number,
// perk1: number,
// perk1Var1: number,
// perk1Var2: number,
// perk1Var3: number,
// perk2: number,
// perk2Var1: number,
// perk2Var2: number,
// perk2Var3: number,
// perk3: number,
// perk3Var1: number,
// perk3Var2: number,
// perk3Var3: number,
// perk4: number,
// perk4Var1: number,
// perk4Var2: number,
// perk4Var3: number,
// perk5: number,
// perk5Var1: number,
// perk5Var2: number,
// perk5Var3: number,
// perkPrimaryStyle: number,
// perkSubStyle: number,
// statPerk0: number,
// statPerk1: number,
// statPerk2: number,
// }
// export interface ParticipantTimelineDto {
// participantId: number,
// csDiffPerMinDeltas: { [index: string]: number },
// damageTakenPerMinDeltas: { [index: string]: number },
// role: 'DUO' | 'NONE' | 'SOLO' | 'DUO_CARRY' | 'DUO_SUPPORT',
// damageTakenDiffPerMinDeltas: { [index: string]: number },
// xpPerMinDeltas: { [index: string]: number },
// xpDiffPerMinDeltas: { [index: string]: number },
// lane: 'MID' | 'MIDDLE' | 'TOP' | 'JUNGLE' | 'BOT' | 'BOTTOM',
// creepsPerMinDeltas: { [index: string]: number },
// goldPerMinDeltas: { [index: string]: number },
// }
// export interface MasteryDto {
// rank: number,
// masteryId: number,
// }
/**
*
* ===============================================
* V5
* ===============================================
*
*/
export interface MatchDto {
gameId: number,
participantIdentities: ParticipantIdentityDto[],
queueId: number,
gameType: string,
gameDuration: number,
teams: TeamStatsDto[],
platformId: string
gameCreation: number,
seasonId: number,
gameVersion: string,
mapId: number,
gameMode: string,
participants: ParticipantDto[],
metadata: MetadataDto;
info: InfoDto;
}
export interface ParticipantIdentityDto {
participantId: number,
player: PlayerDto
export interface MetadataDto {
dataVersion: string;
matchId: string;
participants: string[];
}
export interface PlayerDto {
profileIcon: number,
accountId: string,
matchHistoryUri: string,
currentAccountId: string,
currentPlatformId: string,
summonerName: string,
summonerId: string,
platformId: string,
}
export interface TeamStatsDto {
towerKills: number,
riftHeraldKills: number,
firstBlood: boolean,
inhibitorKills: number,
bans: TeamBansDto[],
firstBaron: boolean,
firstDragon: boolean,
dominionVictoryScore: number,
dragonKills: number,
baronKills: number,
firstInhibitor: boolean
firstTower: boolean
vilemawKills: number,
firstRiftHerald: boolean
teamId: number, // 100 for blue side. 200 for red side.
win: string
}
export interface TeamBansDto {
championId: number,
pickTurn: number,
export interface InfoDto {
gameCreation: number;
gameDuration: number;
gameId: number;
gameMode: string;
gameName: string;
gameStartTimestamp: number;
gameType: string;
gameVersion: string;
mapId: number;
participants: ParticipantDto[];
platformId: string;
queueId: number;
teams: TeamDto[];
tournamentCode?: string;
}
export interface ParticipantDto {
participantId: number,
championId: number,
runes: RuneDto[],
stats: ParticipantStatsDto,
teamId: number,
timeline: ParticipantTimelineDto,
spell1Id: number,
spell2Id: number,
highestAchievedSeasonTier?:
'CHALLENGER' | 'MASTER' | 'DIAMOND' | 'PLATINUM' | 'GOLD' | 'SILVER' | 'BRONZE' | 'UNRANKED',
masteries: MasteryDto[]
assists: number;
baronKills: number;
bountyLevel: number;
champExperience: number;
champLevel: number;
championId: number;
championName: string;
championTransform: ChampionTransformDto;
consumablesPurchased: number;
damageDealtToObjectives: number;
damageDealtToTurrets: number;
damageSelfMitigated: number;
deaths: number;
detectorWardsPlaced: number;
doubleKills: number;
dragonKills: number;
firstBloodAssist: boolean;
firstBloodKill: boolean;
firstTowerAssist: boolean;
firstTowerKill: boolean;
gameEndedInEarlySurrender: boolean;
gameEndedInSurrender: boolean;
goldEarned: number;
goldSpent: number;
individualPosition: 'Invalid' | TeamPositionDto; // TODO
inhibitorKills: number;
item0: number;
item1: number;
item2: number;
item3: number;
item4: number;
item5: number;
item6: number;
itemsPurchased: number;
killingSprees: number;
kills: number;
lane: LaneDto; // TODO
largestCriticalStrike: number;
largestKillingSpree: number;
largestMultiKill: number;
longestTimeSpentLiving: number;
magicDamageDealt: number;
magicDamageDealtToChampions: number;
magicDamageTaken: number;
neutralMinionsKilled: number;
nexusKills: number;
objectivesStolen: number;
objectivesStolenAssists: number;
participantId: number;
pentaKills: number;
perks: PerksDto; // TODO
physicalDamageDealt: number;
physicalDamageDealtToChampions: number;
physicalDamageTaken: number;
profileIcon: number;
puuid: string;
quadraKills: number;
riotIdName: string;
riotIdTagline: string;
role: RoleDto; // TODO
sightWardsBoughtInGame: number;
spell1Casts: number;
spell2Casts: number;
spell3Casts: number;
spell4Casts: number;
summoner1Casts: number;
summoner1Id: number;
summoner2Casts: number;
summoner2Id: number;
summonerId: string;
summonerLevel: number;
summonerName: string;
teamEarlySurrendered: boolean;
teamId: number;
teamPosition: TeamPositionDto; // TODO
timeCCingOthers: number;
timePlayed: number;
totalDamageDealt: number;
totalDamageDealtToChampions: number;
totalDamageShieldedOnTeammates: number;
totalDamageTaken: number;
totalHeal: number;
totalHealsOnTeammates: number;
totalMinionsKilled: number;
totalTimeCCDealt: number;
totalTimeSpentDead: number;
totalUnitsHealed: number;
tripleKills: number;
trueDamageDealt: number;
trueDamageDealtToChampions: number;
trueDamageTaken: number;
turretKills: number;
unrealKills: number;
visionScore: number;
visionWardsBoughtInGame: number;
wardsKilled: number;
wardsPlaced: number;
win: boolean;
}
export interface RuneDto {
runeId: number,
rank: number,
export enum ChampionTransformDto {
None,
Slayer,
Assasin
}
export interface ParticipantStatsDto {
item0: number,
item2: number,
totalUnitsHealed: number,
item1: number,
largestMultiKill: number,
goldEarned: number,
firstInhibitorKill: boolean,
physicalDamageTaken: number,
nodeNeutralizeAssist: number,
totalPlayerScore: number,
champLevel: number,
damageDealtToObjectives: number,
totalDamageTaken: number,
neutralMinionsKilled: number,
deaths: number,
tripleKills: number,
magicDamageDealtToChampions: number,
wardsKilled: number,
pentaKills: number,
damageSelfMitigated: number,
largestCriticalStrike: number,
nodeNeutralize: number,
totalTimeCrowdControlDealt: number,
firstTowerKill: boolean
magicDamageDealt: number,
totalScoreRank: number,
nodeCapture: number,
wardsPlaced: number,
totalDamageDealt: number,
timeCCingOthers: number,
magicalDamageTaken: number,
largestKillingSpree: number,
totalDamageDealtToChampions: number,
physicalDamageDealtToChampions: number,
neutralMinionsKilledTeamJungle: number,
totalMinionsKilled: number,
firstInhibitorAssist: boolean
visionWardsBoughtInGame: number,
objectivePlayerScore: number,
kills: number,
firstTowerAssist: boolean
combatPlayerScore: number,
inhibitorKills: number,
turretKills: number,
participantId: number,
trueDamageTaken: number,
firstBloodAssist: boolean
nodeCaptureAssist: number,
assists: number,
teamObjective: number,
altarsNeutralized: number,
goldSpent: number,
damageDealtToTurrets: number,
altarsCaptured: number,
win: boolean,
totalHeal: number,
unrealKills: number,
visionScore: number,
physicalDamageDealt: number,
firstBloodKill: boolean,
longestTimeSpentLiving: number,
killingSprees: number,
sightWardsBoughtInGame: number,
trueDamageDealtToChampions: number,
neutralMinionsKilledEnemyJungle: number,
doubleKills: number,
trueDamageDealt: number,
quadraKills: number,
item4: number,
item3: number,
item6: number,
item5: number,
playerScore0: number,
playerScore1: number,
playerScore2: number,
playerScore3: number,
playerScore4: number,
playerScore5: number,
playerScore6: number,
playerScore7: number,
playerScore8: number,
playerScore9: number,
perk0: number,
perk0Var1: number,
perk0Var2: number,
perk0Var3: number,
perk1: number,
perk1Var1: number,
perk1Var2: number,
perk1Var3: number,
perk2: number,
perk2Var1: number,
perk2Var2: number,
perk2Var3: number,
perk3: number,
perk3Var1: number,
perk3Var2: number,
perk3Var3: number,
perk4: number,
perk4Var1: number,
perk4Var2: number,
perk4Var3: number,
perk5: number,
perk5Var1: number,
perk5Var2: number,
perk5Var3: number,
perkPrimaryStyle: number,
perkSubStyle: number,
statPerk0: number,
statPerk1: number,
statPerk2: number,
export type LaneDto = 'TOP' | 'JUNGLE' |'MIDDLE' | 'BOTTOM'
export interface PerksDto {
statPerks: StatPerksDto;
styles: StyleDto[];
}
export interface ParticipantTimelineDto {
participantId: number,
csDiffPerMinDeltas: { [index: string]: number },
damageTakenPerMinDeltas: { [index: string]: number },
role: 'DUO' | 'NONE' | 'SOLO' | 'DUO_CARRY' | 'DUO_SUPPORT',
damageTakenDiffPerMinDeltas: { [index: string]: number },
xpPerMinDeltas: { [index: string]: number },
xpDiffPerMinDeltas: { [index: string]: number },
lane: 'MID' | 'MIDDLE' | 'TOP' | 'JUNGLE' | 'BOT' | 'BOTTOM',
creepsPerMinDeltas: { [index: string]: number },
goldPerMinDeltas: { [index: string]: number },
export interface StatPerksDto {
defense: number;
flex: number;
offense: number;
}
export interface MasteryDto {
rank: number,
masteryId: number,
export interface StyleDto {
description: 'primaryStyle' | 'subStyle';
selections: SelectionDto[];
style: number;
}
export interface SelectionDto {
perk: number;
var1: number;
var2: number;
var3: number;
}
export type RoleDto = 'NONE' | 'DUO' |'SOLO' | 'CARRY' | 'SUPPORT'
export type TeamPositionDto = 'TOP' | 'JUNGLE' |'MIDDLE' | 'BOTTOM' | 'UTILITY'
export interface TeamDto {
bans: BanDto[];
objectives: ObjectivesDto;
teamId: number;
win: boolean;
}
export interface BanDto {
championId: number;
pickTurn: number;
}
export interface ObjectivesDto {
baron: ObjectiveDto;
champion: ObjectiveDto;
dragon: ObjectiveDto;
inhibitor: ObjectiveDto;
riftHerald: ObjectiveDto;
tower: ObjectiveDto;
}
export interface ObjectiveDto {
first: boolean;
kills: number;
}
export default class MatchEndpoint {
@ -221,11 +421,11 @@ export default class MatchEndpoint {
this.get = this.get.bind(this)
}
public get (matchID: number, region: string): Promise<MatchDto> {
public get (matchID: string, region: string): Promise<MatchDto> {
return new JaxRequest(
region,
getV5Region(region),
this.config,
`match/v4/matches/${matchID}`,
`match/v5/matches/${matchID}`,
this.limiter,
1500
).execute()

View file

@ -1,26 +1,37 @@
// import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter'
import { getV5Region } from 'App/helpers'
import RiotRateLimiter from 'riot-ratelimiter'
import { JaxConfig } from '../../JaxConfig'
import JaxRequest from '../JaxRequest'
export interface MatchlistDto {
startIndex: number,
totalGames: number,
endIndex: number,
matches: MatchReferenceDto[]
}
// export interface MatchlistDto {
// startIndex: number,
// totalGames: number,
// endIndex: number,
// matches: MatchReferenceDto[]
// }
export interface MatchReferenceDto {
gameId: number,
role: string,
season: number,
platformId: string,
champion: number,
queue: number,
lane: string,
timestamp: number,
seasonMatch?: number
}
// export interface MatchReferenceDto {
// gameId: number,
// role: string,
// season: number,
// platformId: string,
// champion: number,
// queue: number,
// lane: string,
// timestamp: number,
// seasonMatch?: number
// }
/**
*
* ===============================================
* V5
* ===============================================
*
*/
export type MatchlistDto = string[]
export default class MatchlistEndpoint {
private config: JaxConfig
@ -31,11 +42,11 @@ export default class MatchlistEndpoint {
this.limiter = limiter
}
public accountID (accountID: string, region: string, beginIndex = 0): Promise<MatchlistDto> {
public puuid (puuid: string, region: string, beginIndex = 0, count = 100): Promise<MatchlistDto> {
return new JaxRequest(
region,
getV5Region(region),
this.config,
`match/v4/matchlists/by-account/${accountID}?beginIndex=${beginIndex}`,
`match/v5/matches/by-puuid/${puuid}/ids?start=${beginIndex}&count=${count}`,
this.limiter,
0
).execute()

View file

@ -37,15 +37,6 @@ export default class JaxRequest {
}
try {
// const resp = await this.limiter.execute({
// url,
// options: {
// headers: {
// 'X-Riot-Token': this.config.key,
// },
// },
// })
const resp:any = await this.limiter.executing({
url,
token: this.config.key,

View file

@ -1,7 +1,6 @@
import Jax from './Jax'
import Logger from '@ioc:Adonis/Core/Logger'
import { getSeasonNumber } from 'App/helpers'
import { MatchReferenceDto } from './Jax/src/Endpoints/MatchlistEndpoint'
import { MatchlistDto } from './Jax/src/Endpoints/MatchlistEndpoint'
import { SummonerDTO } from './Jax/src/Endpoints/SummonerEndpoint'
import { SummonerModel } from 'App/Models/Summoner'
import Match, { MatchModel } from 'App/Models/Match'
@ -14,41 +13,41 @@ class MatchService {
* @param stopFetching condition to stop fetching the MatchList
*/
private async _fetchMatchListUntil (account: SummonerDTO, stopFetching: any) {
let matchList: MatchReferenceDto[] = []
let matchList: MatchlistDto = []
let alreadyIn = false
let index = 0
do {
let newMatchList = await Jax.Matchlist.accountID(account.accountId, account.region as string, index)
let newMatchList = await Jax.Matchlist.puuid(account.puuid, account.region as string, index)
// Error while fetching Riot API
if (!newMatchList) {
matchList = matchList.map(m => {
m.seasonMatch = getSeasonNumber(m.timestamp)
return m
})
// matchList = matchList.map(m => {
// m.season = getSeasonNumber(m.timestamp)
// return m
// })
return matchList
}
matchList = [...matchList, ...newMatchList.matches]
alreadyIn = newMatchList.matches.length === 0 || stopFetching(newMatchList.matches)
matchList = [...matchList, ...newMatchList]
alreadyIn = newMatchList.length === 0 || stopFetching(newMatchList)
// If the match is made in another region : we stop fetching
if (matchList[matchList.length - 1].platformId.toLowerCase() !== account.region) {
alreadyIn = true
}
// if (matchList[matchList.length - 1].platformId.toLowerCase() !== account.region) { // TODO: check this...
// alreadyIn = true
// }
index += 100
} while (!alreadyIn)
// Remove matches from MatchList made in another region and tutorial games
const tutorialModes = [2000, 2010, 2020]
matchList = matchList
.filter(m => {
const sameRegion = m.platformId.toLowerCase() === account.region
const notATutorialGame = !tutorialModes.includes(m.queue)
// const tutorialModes = [2000, 2010, 2020]
// matchList = matchList
// .filter(m => {
// const sameRegion = m.platformId.toLowerCase() === account.region
// const notATutorialGame = !tutorialModes.includes(m.queue)
return sameRegion && notATutorialGame
})
.map(m => {
m.seasonMatch = getSeasonNumber(m.timestamp)
return m
})
// return sameRegion && notATutorialGame
// })
// .map(m => {
// m.seasonMatch = getSeasonNumber(m.timestamp)
// return m
// })
return matchList
}
@ -63,20 +62,21 @@ class MatchService {
// Summoner has already been searched : we already have a MatchList and we need to update it
if (summonerDB.matchList) {
// Get MatchList
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchReferenceDto[]) => {
return summonerDB.matchList!.some(m => m.gameId === newMatchList[newMatchList.length - 1].gameId)
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchlistDto) => {
return summonerDB.matchList!.some(m => m === newMatchList[newMatchList.length - 1])
})
// Update Summoner's MatchList
for (const match of matchList.reverse()) {
if (!summonerDB.matchList.some(m => m.gameId === match.gameId)) {
if (!summonerDB.matchList.some(m => m === match)) {
summonerDB.matchList.unshift(match)
}
}
} else { // First search of the Summoner
const today = Date.now()
// const today = Date.now()
// Get MatchList
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchReferenceDto[]) => {
return (newMatchList.length !== 100 || today - newMatchList[newMatchList.length - 1].timestamp > 10368000000)
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchlistDto) => {
// return (newMatchList.length !== 100 || today - newMatchList[newMatchList.length - 1].timestamp > 10368000000)
return newMatchList.length === 0 // TODO: useless
})
// Create Summoner's MatchList in Database
summonerDB.matchList = matchList
@ -92,20 +92,20 @@ class MatchService {
* @param gameIds
* @param summonerDB
*/
public async getMatches (puuid: string, accountId: string, region: string, gameIds: number[], summonerDB: SummonerModel) {
public async getMatches (puuid: string, accountId: string, region: string, matchIds: string[], summonerDB: SummonerModel) {
console.time('getMatches')
let matchesDetails: MatchModel[] = []
const matchesToGetFromRiot: number[] = []
for (let i = 0; i < gameIds.length; ++i) {
const matchesToGetFromRiot: string[] = []
for (let i = 0; i < matchIds.length; ++i) {
const matchSaved = await Match.findOne({
summoner_puuid: puuid,
gameId: gameIds[i],
matchId: matchIds[i],
})
if (matchSaved) {
matchesDetails.push(matchSaved)
} else {
matchesToGetFromRiot.push(gameIds[i])
matchesToGetFromRiot.push(matchIds[i])
}
}
@ -122,14 +122,16 @@ class MatchService {
})
// Transform raw matches data
const transformedMatches = await BasicMatchTransformer.transform(matchesFromApi, { puuid, accountId })
// const transformedMatches = await BasicMatchTransformer.transform(matchesFromApi, { puuid, accountId })
/* Save all matches from Riot Api in db */
for (const match of transformedMatches) {
await Match.create(match)
match.newMatch = true
}
matchesDetails = [...matchesDetails, ...transformedMatches]
// for (const match of transformedMatches) {
// // await Match.create(match)
// match.newMatch = true
// }
// matchesDetails = [...matchesDetails, ...transformedMatches]
matchesDetails = [...matchesDetails, ...matchesFromApi as unknown as MatchModel[]]
}
/* Sort matches */

View file

@ -7,8 +7,6 @@ import { TeamStats } from 'App/Models/DetailedMatch'
import {
MatchDto,
ParticipantDto,
ParticipantStatsDto,
ParticipantTimelineDto,
} from 'App/Services/Jax/src/Endpoints/MatchEndpoint'
export interface PlayerRole {
@ -68,12 +66,12 @@ export default abstract class MatchTransformer {
*/
public getGameInfos (match: MatchDto) {
return {
map: match.mapId,
gamemode: match.queueId,
date: match.gameCreation,
region: match.platformId.toLowerCase(),
season: getSeasonNumber(match.gameCreation),
time: match.gameDuration,
map: match.info.mapId,
gamemode: match.info.queueId,
date: match.info.gameCreation,
region: match.info.platformId.toLowerCase(),
season: getSeasonNumber(match.info.gameCreation),
time: match.info.gameDuration,
}
}
@ -179,8 +177,8 @@ export default abstract class MatchTransformer {
})
}
const firstSum = player.spell1Id
const secondSum = player.spell2Id
const firstSum = player.summoner1Id
const secondSum = player.summoner2Id
const playerData: ParticipantDetails = {
name,
@ -313,7 +311,7 @@ export default abstract class MatchTransformer {
allyTeamId = 100,
playerData?: ParticipantDetails
) {
if (!this.championRoles || !queuesWithRole.includes(match.queueId)) {
if (!this.championRoles || !queuesWithRole.includes(match.info.queueId)) {
return
}

View file

@ -1,5 +1,39 @@
import { ParticipantBasic, ParticipantDetails } from './Models/Match'
/**
* All League of Legends regions used in Riot API
*/
export type Region = 'br1' | 'eun1' | 'euw1' | 'jp1' | 'kr' | 'la1' | 'la2' | 'na1' | 'oc1' | 'tr1' | 'ru'
/**
* New regions used in Riot API >= v5
*/
export type V5Region = 'americas' | 'asia' | 'europe'
/**
* Map old Riot API regions to new ones
* @param region : old region
* @returns new region name
*/
export function getV5Region (region: string): V5Region {
switch (region as Region) { // TODO: remove cast when region is typed to "Region" everywhere instead of string
case 'na1':
case 'br1':
case 'la1':
case 'la2':
case 'oc1':
return 'americas'
case 'kr':
case 'jp1':
return 'asia'
case 'eun1':
case 'euw1':
case 'tr1':
case 'ru':
return 'europe'
}
}
/**
* League of Legends queues with defined role for each summoner
*/

9037
server/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -4,13 +4,15 @@
"private": true,
"scripts": {
"build": "node ace build",
"dev": "npm run start",
"dev": "cross-env MONGO_DIR=./tmp concurrently \"npx mongoz\" \"redis-server\" \"npm run start\"",
"start": "node ace serve --watch",
"lint": "eslint . --ext=.ts"
},
"devDependencies": {
"@adonisjs/assembler": "^5.3.0",
"adonis-preset-ts": "^2.1.0",
"concurrently": "^6.2.0",
"cross-env": "^7.0.3",
"eslint": "^7.27.0",
"eslint-plugin-adonis": "^1.3.1",
"pino-pretty": "^4.8.0",