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
|
.DS_STORE
|
||||||
.env
|
.env
|
||||||
tmp
|
tmp
|
||||||
|
*.rdb
|
||||||
|
|
|
||||||
|
|
@ -93,11 +93,10 @@ export default class SummonersController {
|
||||||
|
|
||||||
// MATCHES BASIC
|
// MATCHES BASIC
|
||||||
const gameIds = summonerDB.matchList!.slice(0)
|
const gameIds = summonerDB.matchList!.slice(0)
|
||||||
.filter(m => {
|
// .filter(m => {
|
||||||
return season ? m.seasonMatch === season : true
|
// return season ? m.seasonMatch === season : true // TODO: filter by season
|
||||||
})
|
// })
|
||||||
.slice(0, 10)
|
.slice(0, 10)
|
||||||
.map(({ gameId }) => gameId)
|
|
||||||
finalJSON.matchesDetails = await MatchService.getMatches(puuid, accountId, region, gameIds, summonerDB)
|
finalJSON.matchesDetails = await MatchService.getMatches(puuid, accountId, region, gameIds, summonerDB)
|
||||||
|
|
||||||
// STATS
|
// STATS
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,9 @@ export interface MatchModel extends ParticipantDetails {
|
||||||
season: number,
|
season: number,
|
||||||
time: number,
|
time: number,
|
||||||
newMatch?: boolean,
|
newMatch?: boolean,
|
||||||
|
|
||||||
|
// V5
|
||||||
|
matchId: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ParticipantDetails {
|
export interface ParticipantDetails {
|
||||||
|
|
@ -131,4 +134,7 @@ export default class Match extends Model implements MatchModel {
|
||||||
public firstSum: number
|
public firstSum: number
|
||||||
public secondSum: number
|
public secondSum: number
|
||||||
public stats: Stats
|
public stats: Stats
|
||||||
|
|
||||||
|
// V5
|
||||||
|
public matchId: string
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { Model } from '@ioc:Mongodb/Model'
|
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 {
|
export interface SummonerModel {
|
||||||
puuid: string,
|
puuid: string,
|
||||||
matchList?: MatchReferenceDto[],
|
matchList?: MatchlistDto,
|
||||||
names?: SummonerNames[]
|
names?: SummonerNames[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -16,6 +16,6 @@ export default class Summoner extends Model implements SummonerModel {
|
||||||
public static collectionName = 'summoners'
|
public static collectionName = 'summoners'
|
||||||
|
|
||||||
public puuid: string
|
public puuid: string
|
||||||
public matchList?: MatchReferenceDto[]
|
public matchList?: MatchlistDto
|
||||||
public names?: SummonerNames[]
|
public names?: SummonerNames[]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,213 +1,413 @@
|
||||||
// import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter'
|
// import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter'
|
||||||
|
import { getV5Region } from 'App/helpers'
|
||||||
import RiotRateLimiter from 'riot-ratelimiter'
|
import RiotRateLimiter from 'riot-ratelimiter'
|
||||||
import { JaxConfig } from '../../JaxConfig'
|
import { JaxConfig } from '../../JaxConfig'
|
||||||
import JaxRequest from '../JaxRequest'
|
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 {
|
export interface MatchDto {
|
||||||
gameId: number,
|
metadata: MetadataDto;
|
||||||
participantIdentities: ParticipantIdentityDto[],
|
info: InfoDto;
|
||||||
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 {
|
export interface MetadataDto {
|
||||||
participantId: number,
|
dataVersion: string;
|
||||||
player: PlayerDto
|
matchId: string;
|
||||||
|
participants: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PlayerDto {
|
export interface InfoDto {
|
||||||
profileIcon: number,
|
gameCreation: number;
|
||||||
accountId: string,
|
gameDuration: number;
|
||||||
matchHistoryUri: string,
|
gameId: number;
|
||||||
currentAccountId: string,
|
gameMode: string;
|
||||||
currentPlatformId: string,
|
gameName: string;
|
||||||
summonerName: string,
|
gameStartTimestamp: number;
|
||||||
summonerId: string,
|
gameType: string;
|
||||||
platformId: string,
|
gameVersion: string;
|
||||||
}
|
mapId: number;
|
||||||
|
participants: ParticipantDto[];
|
||||||
export interface TeamStatsDto {
|
platformId: string;
|
||||||
towerKills: number,
|
queueId: number;
|
||||||
riftHeraldKills: number,
|
teams: TeamDto[];
|
||||||
firstBlood: boolean,
|
tournamentCode?: string;
|
||||||
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 {
|
export interface ParticipantDto {
|
||||||
participantId: number,
|
assists: number;
|
||||||
championId: number,
|
baronKills: number;
|
||||||
runes: RuneDto[],
|
bountyLevel: number;
|
||||||
stats: ParticipantStatsDto,
|
champExperience: number;
|
||||||
teamId: number,
|
champLevel: number;
|
||||||
timeline: ParticipantTimelineDto,
|
championId: number;
|
||||||
spell1Id: number,
|
championName: string;
|
||||||
spell2Id: number,
|
championTransform: ChampionTransformDto;
|
||||||
highestAchievedSeasonTier?:
|
consumablesPurchased: number;
|
||||||
'CHALLENGER' | 'MASTER' | 'DIAMOND' | 'PLATINUM' | 'GOLD' | 'SILVER' | 'BRONZE' | 'UNRANKED',
|
damageDealtToObjectives: number;
|
||||||
masteries: MasteryDto[]
|
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 {
|
export enum ChampionTransformDto {
|
||||||
runeId: number,
|
None,
|
||||||
rank: number,
|
Slayer,
|
||||||
|
Assasin
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ParticipantStatsDto {
|
export type LaneDto = 'TOP' | 'JUNGLE' |'MIDDLE' | 'BOTTOM'
|
||||||
item0: number,
|
|
||||||
item2: number,
|
export interface PerksDto {
|
||||||
totalUnitsHealed: number,
|
statPerks: StatPerksDto;
|
||||||
item1: number,
|
styles: StyleDto[];
|
||||||
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 {
|
export interface StatPerksDto {
|
||||||
participantId: number,
|
defense: number;
|
||||||
csDiffPerMinDeltas: { [index: string]: number },
|
flex: number;
|
||||||
damageTakenPerMinDeltas: { [index: string]: number },
|
offense: 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 {
|
export interface StyleDto {
|
||||||
rank: number,
|
description: 'primaryStyle' | 'subStyle';
|
||||||
masteryId: number,
|
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 {
|
export default class MatchEndpoint {
|
||||||
|
|
@ -221,11 +421,11 @@ export default class MatchEndpoint {
|
||||||
this.get = this.get.bind(this)
|
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(
|
return new JaxRequest(
|
||||||
region,
|
getV5Region(region),
|
||||||
this.config,
|
this.config,
|
||||||
`match/v4/matches/${matchID}`,
|
`match/v5/matches/${matchID}`,
|
||||||
this.limiter,
|
this.limiter,
|
||||||
1500
|
1500
|
||||||
).execute()
|
).execute()
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,37 @@
|
||||||
// import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter'
|
// import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter'
|
||||||
|
import { getV5Region } from 'App/helpers'
|
||||||
import RiotRateLimiter from 'riot-ratelimiter'
|
import RiotRateLimiter from 'riot-ratelimiter'
|
||||||
import { JaxConfig } from '../../JaxConfig'
|
import { JaxConfig } from '../../JaxConfig'
|
||||||
import JaxRequest from '../JaxRequest'
|
import JaxRequest from '../JaxRequest'
|
||||||
|
|
||||||
export interface MatchlistDto {
|
// export interface MatchlistDto {
|
||||||
startIndex: number,
|
// startIndex: number,
|
||||||
totalGames: number,
|
// totalGames: number,
|
||||||
endIndex: number,
|
// endIndex: number,
|
||||||
matches: MatchReferenceDto[]
|
// matches: MatchReferenceDto[]
|
||||||
}
|
// }
|
||||||
|
|
||||||
export interface MatchReferenceDto {
|
// export interface MatchReferenceDto {
|
||||||
gameId: number,
|
// gameId: number,
|
||||||
role: string,
|
// role: string,
|
||||||
season: number,
|
// season: number,
|
||||||
platformId: string,
|
// platformId: string,
|
||||||
champion: number,
|
// champion: number,
|
||||||
queue: number,
|
// queue: number,
|
||||||
lane: string,
|
// lane: string,
|
||||||
timestamp: number,
|
// timestamp: number,
|
||||||
seasonMatch?: number
|
// seasonMatch?: number
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* ===============================================
|
||||||
|
* V5
|
||||||
|
* ===============================================
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type MatchlistDto = string[]
|
||||||
|
|
||||||
export default class MatchlistEndpoint {
|
export default class MatchlistEndpoint {
|
||||||
private config: JaxConfig
|
private config: JaxConfig
|
||||||
|
|
@ -31,11 +42,11 @@ export default class MatchlistEndpoint {
|
||||||
this.limiter = limiter
|
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(
|
return new JaxRequest(
|
||||||
region,
|
getV5Region(region),
|
||||||
this.config,
|
this.config,
|
||||||
`match/v4/matchlists/by-account/${accountID}?beginIndex=${beginIndex}`,
|
`match/v5/matches/by-puuid/${puuid}/ids?start=${beginIndex}&count=${count}`,
|
||||||
this.limiter,
|
this.limiter,
|
||||||
0
|
0
|
||||||
).execute()
|
).execute()
|
||||||
|
|
|
||||||
|
|
@ -37,15 +37,6 @@ export default class JaxRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// const resp = await this.limiter.execute({
|
|
||||||
// url,
|
|
||||||
// options: {
|
|
||||||
// headers: {
|
|
||||||
// 'X-Riot-Token': this.config.key,
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
|
|
||||||
const resp:any = await this.limiter.executing({
|
const resp:any = await this.limiter.executing({
|
||||||
url,
|
url,
|
||||||
token: this.config.key,
|
token: this.config.key,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import Jax from './Jax'
|
import Jax from './Jax'
|
||||||
import Logger from '@ioc:Adonis/Core/Logger'
|
import Logger from '@ioc:Adonis/Core/Logger'
|
||||||
import { getSeasonNumber } from 'App/helpers'
|
import { MatchlistDto } from './Jax/src/Endpoints/MatchlistEndpoint'
|
||||||
import { MatchReferenceDto } from './Jax/src/Endpoints/MatchlistEndpoint'
|
|
||||||
import { SummonerDTO } from './Jax/src/Endpoints/SummonerEndpoint'
|
import { SummonerDTO } from './Jax/src/Endpoints/SummonerEndpoint'
|
||||||
import { SummonerModel } from 'App/Models/Summoner'
|
import { SummonerModel } from 'App/Models/Summoner'
|
||||||
import Match, { MatchModel } from 'App/Models/Match'
|
import Match, { MatchModel } from 'App/Models/Match'
|
||||||
|
|
@ -14,41 +13,41 @@ class MatchService {
|
||||||
* @param stopFetching condition to stop fetching the MatchList
|
* @param stopFetching condition to stop fetching the MatchList
|
||||||
*/
|
*/
|
||||||
private async _fetchMatchListUntil (account: SummonerDTO, stopFetching: any) {
|
private async _fetchMatchListUntil (account: SummonerDTO, stopFetching: any) {
|
||||||
let matchList: MatchReferenceDto[] = []
|
let matchList: MatchlistDto = []
|
||||||
let alreadyIn = false
|
let alreadyIn = false
|
||||||
let index = 0
|
let index = 0
|
||||||
do {
|
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
|
// Error while fetching Riot API
|
||||||
if (!newMatchList) {
|
if (!newMatchList) {
|
||||||
matchList = matchList.map(m => {
|
// matchList = matchList.map(m => {
|
||||||
m.seasonMatch = getSeasonNumber(m.timestamp)
|
// m.season = getSeasonNumber(m.timestamp)
|
||||||
return m
|
// return m
|
||||||
})
|
// })
|
||||||
return matchList
|
return matchList
|
||||||
}
|
}
|
||||||
matchList = [...matchList, ...newMatchList.matches]
|
matchList = [...matchList, ...newMatchList]
|
||||||
alreadyIn = newMatchList.matches.length === 0 || stopFetching(newMatchList.matches)
|
alreadyIn = newMatchList.length === 0 || stopFetching(newMatchList)
|
||||||
// If the match is made in another region : we stop fetching
|
// If the match is made in another region : we stop fetching
|
||||||
if (matchList[matchList.length - 1].platformId.toLowerCase() !== account.region) {
|
// if (matchList[matchList.length - 1].platformId.toLowerCase() !== account.region) { // TODO: check this...
|
||||||
alreadyIn = true
|
// alreadyIn = true
|
||||||
}
|
// }
|
||||||
index += 100
|
index += 100
|
||||||
} while (!alreadyIn)
|
} while (!alreadyIn)
|
||||||
|
|
||||||
// Remove matches from MatchList made in another region and tutorial games
|
// Remove matches from MatchList made in another region and tutorial games
|
||||||
const tutorialModes = [2000, 2010, 2020]
|
// const tutorialModes = [2000, 2010, 2020]
|
||||||
matchList = matchList
|
// matchList = matchList
|
||||||
.filter(m => {
|
// .filter(m => {
|
||||||
const sameRegion = m.platformId.toLowerCase() === account.region
|
// const sameRegion = m.platformId.toLowerCase() === account.region
|
||||||
const notATutorialGame = !tutorialModes.includes(m.queue)
|
// const notATutorialGame = !tutorialModes.includes(m.queue)
|
||||||
|
|
||||||
return sameRegion && notATutorialGame
|
// return sameRegion && notATutorialGame
|
||||||
})
|
// })
|
||||||
.map(m => {
|
// .map(m => {
|
||||||
m.seasonMatch = getSeasonNumber(m.timestamp)
|
// m.seasonMatch = getSeasonNumber(m.timestamp)
|
||||||
return m
|
// return m
|
||||||
})
|
// })
|
||||||
|
|
||||||
return matchList
|
return matchList
|
||||||
}
|
}
|
||||||
|
|
@ -63,20 +62,21 @@ class MatchService {
|
||||||
// Summoner has already been searched : we already have a MatchList and we need to update it
|
// Summoner has already been searched : we already have a MatchList and we need to update it
|
||||||
if (summonerDB.matchList) {
|
if (summonerDB.matchList) {
|
||||||
// Get MatchList
|
// Get MatchList
|
||||||
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchReferenceDto[]) => {
|
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchlistDto) => {
|
||||||
return summonerDB.matchList!.some(m => m.gameId === newMatchList[newMatchList.length - 1].gameId)
|
return summonerDB.matchList!.some(m => m === newMatchList[newMatchList.length - 1])
|
||||||
})
|
})
|
||||||
// Update Summoner's MatchList
|
// Update Summoner's MatchList
|
||||||
for (const match of matchList.reverse()) {
|
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)
|
summonerDB.matchList.unshift(match)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { // First search of the Summoner
|
} else { // First search of the Summoner
|
||||||
const today = Date.now()
|
// const today = Date.now()
|
||||||
// Get MatchList
|
// Get MatchList
|
||||||
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchReferenceDto[]) => {
|
const matchList = await this._fetchMatchListUntil(account, (newMatchList: MatchlistDto) => {
|
||||||
return (newMatchList.length !== 100 || today - newMatchList[newMatchList.length - 1].timestamp > 10368000000)
|
// return (newMatchList.length !== 100 || today - newMatchList[newMatchList.length - 1].timestamp > 10368000000)
|
||||||
|
return newMatchList.length === 0 // TODO: useless
|
||||||
})
|
})
|
||||||
// Create Summoner's MatchList in Database
|
// Create Summoner's MatchList in Database
|
||||||
summonerDB.matchList = matchList
|
summonerDB.matchList = matchList
|
||||||
|
|
@ -92,20 +92,20 @@ class MatchService {
|
||||||
* @param gameIds
|
* @param gameIds
|
||||||
* @param summonerDB
|
* @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')
|
console.time('getMatches')
|
||||||
|
|
||||||
let matchesDetails: MatchModel[] = []
|
let matchesDetails: MatchModel[] = []
|
||||||
const matchesToGetFromRiot: number[] = []
|
const matchesToGetFromRiot: string[] = []
|
||||||
for (let i = 0; i < gameIds.length; ++i) {
|
for (let i = 0; i < matchIds.length; ++i) {
|
||||||
const matchSaved = await Match.findOne({
|
const matchSaved = await Match.findOne({
|
||||||
summoner_puuid: puuid,
|
summoner_puuid: puuid,
|
||||||
gameId: gameIds[i],
|
matchId: matchIds[i],
|
||||||
})
|
})
|
||||||
if (matchSaved) {
|
if (matchSaved) {
|
||||||
matchesDetails.push(matchSaved)
|
matchesDetails.push(matchSaved)
|
||||||
} else {
|
} else {
|
||||||
matchesToGetFromRiot.push(gameIds[i])
|
matchesToGetFromRiot.push(matchIds[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -122,14 +122,16 @@ class MatchService {
|
||||||
})
|
})
|
||||||
|
|
||||||
// Transform raw matches data
|
// 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 */
|
/* Save all matches from Riot Api in db */
|
||||||
for (const match of transformedMatches) {
|
// for (const match of transformedMatches) {
|
||||||
await Match.create(match)
|
// // await Match.create(match)
|
||||||
match.newMatch = true
|
// match.newMatch = true
|
||||||
}
|
// }
|
||||||
matchesDetails = [...matchesDetails, ...transformedMatches]
|
// matchesDetails = [...matchesDetails, ...transformedMatches]
|
||||||
|
|
||||||
|
matchesDetails = [...matchesDetails, ...matchesFromApi as unknown as MatchModel[]]
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sort matches */
|
/* Sort matches */
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,6 @@ import { TeamStats } from 'App/Models/DetailedMatch'
|
||||||
import {
|
import {
|
||||||
MatchDto,
|
MatchDto,
|
||||||
ParticipantDto,
|
ParticipantDto,
|
||||||
ParticipantStatsDto,
|
|
||||||
ParticipantTimelineDto,
|
|
||||||
} from 'App/Services/Jax/src/Endpoints/MatchEndpoint'
|
} from 'App/Services/Jax/src/Endpoints/MatchEndpoint'
|
||||||
|
|
||||||
export interface PlayerRole {
|
export interface PlayerRole {
|
||||||
|
|
@ -68,12 +66,12 @@ export default abstract class MatchTransformer {
|
||||||
*/
|
*/
|
||||||
public getGameInfos (match: MatchDto) {
|
public getGameInfos (match: MatchDto) {
|
||||||
return {
|
return {
|
||||||
map: match.mapId,
|
map: match.info.mapId,
|
||||||
gamemode: match.queueId,
|
gamemode: match.info.queueId,
|
||||||
date: match.gameCreation,
|
date: match.info.gameCreation,
|
||||||
region: match.platformId.toLowerCase(),
|
region: match.info.platformId.toLowerCase(),
|
||||||
season: getSeasonNumber(match.gameCreation),
|
season: getSeasonNumber(match.info.gameCreation),
|
||||||
time: match.gameDuration,
|
time: match.info.gameDuration,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -179,8 +177,8 @@ export default abstract class MatchTransformer {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const firstSum = player.spell1Id
|
const firstSum = player.summoner1Id
|
||||||
const secondSum = player.spell2Id
|
const secondSum = player.summoner2Id
|
||||||
|
|
||||||
const playerData: ParticipantDetails = {
|
const playerData: ParticipantDetails = {
|
||||||
name,
|
name,
|
||||||
|
|
@ -313,7 +311,7 @@ export default abstract class MatchTransformer {
|
||||||
allyTeamId = 100,
|
allyTeamId = 100,
|
||||||
playerData?: ParticipantDetails
|
playerData?: ParticipantDetails
|
||||||
) {
|
) {
|
||||||
if (!this.championRoles || !queuesWithRole.includes(match.queueId)) {
|
if (!this.championRoles || !queuesWithRole.includes(match.info.queueId)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,39 @@
|
||||||
import { ParticipantBasic, ParticipantDetails } from './Models/Match'
|
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
|
* 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,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node ace build",
|
"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",
|
"start": "node ace serve --watch",
|
||||||
"lint": "eslint . --ext=.ts"
|
"lint": "eslint . --ext=.ts"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@adonisjs/assembler": "^5.3.0",
|
"@adonisjs/assembler": "^5.3.0",
|
||||||
"adonis-preset-ts": "^2.1.0",
|
"adonis-preset-ts": "^2.1.0",
|
||||||
|
"concurrently": "^6.2.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
"eslint": "^7.27.0",
|
"eslint": "^7.27.0",
|
||||||
"eslint-plugin-adonis": "^1.3.1",
|
"eslint-plugin-adonis": "^1.3.1",
|
||||||
"pino-pretty": "^4.8.0",
|
"pino-pretty": "^4.8.0",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue