mirror of
https://github.com/vkaelin/LeagueStats.git
synced 2026-03-25 12:57:28 +00:00
refactor(server): start slowly the migration to v5
This commit is contained in:
parent
73e8eec291
commit
41d363b981
13 changed files with 25696 additions and 5659 deletions
21512
client/package-lock.json
generated
21512
client/package-lock.json
generated
File diff suppressed because it is too large
Load diff
1
server/.gitignore
vendored
1
server/.gitignore
vendored
|
|
@ -5,3 +5,4 @@ coverage
|
|||
.DS_STORE
|
||||
.env
|
||||
tmp
|
||||
*.rdb
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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[]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
9037
server/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in a new issue