LeagueStats/server/app/Services/Jax/src/Endpoints/MatchEndpoint.ts

434 lines
11 KiB
TypeScript
Raw Normal View History

// 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
* ===============================================
*
*/
2020-10-07 17:08:16 +00:00
export interface MatchDto {
metadata: MetadataDto;
info: InfoDto;
2020-10-07 17:08:16 +00:00
}
export interface MetadataDto {
dataVersion: string;
matchId: string;
participants: string[];
2020-10-07 17:08:16 +00:00
}
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;
2020-10-07 17:08:16 +00:00
}
export interface ParticipantDto {
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;
2020-10-07 17:08:16 +00:00
}
export enum ChampionTransformDto {
None,
Slayer,
Assasin
2020-10-07 17:08:16 +00:00
}
export type LaneDto = 'TOP' | 'JUNGLE' |'MIDDLE' | 'BOTTOM'
export interface PerksDto {
statPerks: StatPerksDto;
styles: StyleDto[];
2020-10-07 17:08:16 +00:00
}
export interface StatPerksDto {
defense: number;
flex: number;
offense: 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;
2020-10-07 17:08:16 +00:00
}
export interface BanDto {
championId: number;
pickTurn: number;
2020-10-07 17:08:16 +00:00
}
export interface ObjectivesDto {
baron: ObjectiveDto;
champion: ObjectiveDto;
dragon: ObjectiveDto;
inhibitor: ObjectiveDto;
riftHerald: ObjectiveDto;
tower: ObjectiveDto;
2020-10-07 17:08:16 +00:00
}
export interface ObjectiveDto {
first: boolean;
kills: number;
2020-10-07 17:08:16 +00:00
}
export default class MatchEndpoint {
private config: JaxConfig
private limiter: RiotRateLimiter
constructor (config: JaxConfig, limiter: RiotRateLimiter) {
this.config = config
this.limiter = limiter
this.get = this.get.bind(this)
}
public get (matchID: string, region: string): Promise<MatchDto> {
return new JaxRequest(
getV5Region(region),
this.config,
`match/v5/matches/${matchID}`,
this.limiter,
1500
).execute()
}
}