LeagueStats/server/app/Services/SummonerService.ts

106 lines
3.2 KiB
TypeScript
Raw Normal View History

2020-10-04 20:05:44 +00:00
import Jax from './Jax'
import { SummonerDTO } from 'App/Services/Jax/src/Endpoints/SummonerEndpoint'
import { LeagueEntryDTO } from './Jax/src/Endpoints/LeagueEndpoint'
import Summoner from 'App/Models/Summoner'
import { PlayerRankParsed } from 'App/Parsers/ParsedType'
import MatchPlayerRank from 'App/Models/MatchPlayerRank'
2020-10-04 20:05:44 +00:00
export interface LeagueEntriesByQueue {
soloQ?: LeagueEntryByQueue
flex5v5?: LeagueEntryByQueue
}
export interface LeagueEntryByQueue extends LeagueEntryDTO {
fullRank: string
winrate: string
shortName: string | number
}
2020-10-04 20:05:44 +00:00
class SummonerService {
private readonly uniqueLeagues = ['CHALLENGER', 'GRANDMASTER', 'MASTER']
public readonly leaguesNumbers = { I: 1, II: 2, III: 3, IV: 4 }
public getRankedShortName(rank: PlayerRankParsed | MatchPlayerRank) {
return this.uniqueLeagues.includes(rank.tier) ? rank.lp : rank.tier[0] + rank.rank
}
public getWinrate(wins: number, losses: number) {
return +((wins * 100) / (wins + losses)).toFixed(1) + '%'
}
2020-10-04 20:05:44 +00:00
/**
* Helper to transform League Data from the Riot API
* @param league raw data of the league from Riot API
*/
private getleagueData(league?: LeagueEntryDTO): LeagueEntryByQueue | null {
2020-10-04 20:05:44 +00:00
if (!league) {
return null
}
const fullRank = this.uniqueLeagues.includes(league.tier)
? league.tier
: `${league.tier} ${league.rank}`
const winrate = this.getWinrate(league.wins, league.losses)
const shortName = this.uniqueLeagues.includes(league.tier)
? league.leaguePoints
: league.tier[0] + this.leaguesNumbers[league.rank]
2020-10-04 20:05:44 +00:00
return {
...league,
fullRank,
winrate,
shortName,
}
}
/**
* Get account infos for a searched summoner name
* @param summonerName
* @param region
2020-10-04 20:05:44 +00:00
*/
public async getAccount(summonerName: string, region: string) {
const name = summonerName.toLowerCase()
2020-10-04 20:05:44 +00:00
const account = await Jax.Summoner.summonerName(name, region)
return account
}
public async getRiotAccountByName(name: string, tagline: string, region: string) {
return await Jax.Summoner.puuidFromRiotTag(name, tagline, region)
}
public async getSummonerByPuuid(puuid: string, region: string) {
return await Jax.Summoner.summonerPuuid(puuid, region)
}
2020-10-04 20:05:44 +00:00
/**
* Return the full list of old and actual summoner names
* @param account of the summoner
* @param summonerDB summoner in the database
*/
public async getAllSummonerNames(account: SummonerDTO, summonerDB: Summoner) {
await summonerDB.related('names').firstOrCreate({
name: account.name,
})
return summonerDB.related('names').query().select('name', 'created_at')
2020-10-04 20:05:44 +00:00
}
/**
* Get ranked data for a specific Summoner
* @param account
* @param region
2020-10-04 20:05:44 +00:00
*/
public async getRanked(summonerId: string, region: string): Promise<LeagueEntriesByQueue> {
const ranked = await Jax.League.summonerID(summonerId, region)
const result: LeagueEntriesByQueue = {}
if (ranked && ranked.length) {
result.soloQ =
this.getleagueData(ranked.find((e) => e.queueType === 'RANKED_SOLO_5x5')) || undefined
result.flex5v5 =
this.getleagueData(ranked.find((e) => e.queueType === 'RANKED_FLEX_SR')) || undefined
2020-10-04 20:05:44 +00:00
}
return result
}
}
export default new SummonerService()