mirror of
https://github.com/vkaelin/LeagueStats.git
synced 2026-03-25 12:57:28 +00:00
feat: start summoner/basic endpoint
This commit is contained in:
parent
3266472568
commit
58b26d5838
6 changed files with 227 additions and 0 deletions
4
server-new/app/Controllers/Http/MatchesController.ts
Normal file
4
server-new/app/Controllers/Http/MatchesController.ts
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
// import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
|
||||||
|
|
||||||
|
export default class MatchesController {
|
||||||
|
}
|
||||||
79
server-new/app/Controllers/Http/SummonersController.ts
Normal file
79
server-new/app/Controllers/Http/SummonersController.ts
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
|
||||||
|
import mongodb from '@ioc:Mongodb/Database'
|
||||||
|
import Jax from 'App/Services/Jax'
|
||||||
|
import SummonerService from 'App/Services/SummonerService'
|
||||||
|
|
||||||
|
export default class SummonersController {
|
||||||
|
// private async getSeasons (puuid) {
|
||||||
|
// let seasons = await MatchRepository.seasons(puuid)
|
||||||
|
// return seasons.length ? seasons.map(s => s._id) : [10]
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST: get basic summoner data
|
||||||
|
*/
|
||||||
|
public async basic ({ request, response }: HttpContextContract) {
|
||||||
|
console.time('all')
|
||||||
|
const summoner = request.input('summoner')
|
||||||
|
const region = request.input('region')
|
||||||
|
console.log(summoner, region)
|
||||||
|
|
||||||
|
const regexSummonerName = new RegExp('^[0-9\\p{L} _\\.]+$', 'u')
|
||||||
|
if (!regexSummonerName.exec(summoner)) {
|
||||||
|
return response.json(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
const finalJSON:any = {}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const account = await SummonerService.getAccount(summoner, region)
|
||||||
|
// Check if the summoner is found
|
||||||
|
if (!account) {
|
||||||
|
return response.json(null)
|
||||||
|
}
|
||||||
|
account.region = region
|
||||||
|
finalJSON.account = account
|
||||||
|
|
||||||
|
// Summoner in DB
|
||||||
|
// const summonerDB = await Summoner.findOrCreate(
|
||||||
|
// { puuid: account.puuid },
|
||||||
|
// { puuid: account.puuid }
|
||||||
|
// )
|
||||||
|
|
||||||
|
const summonersCollection = await mongodb.connection().collection('summoners')
|
||||||
|
const summonerDB = await summonersCollection.findOne({ puuid: account.puuid })
|
||||||
|
if(!summonerDB) {
|
||||||
|
await summonersCollection.insertOne({ puuid: account.puuid })
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summoner names
|
||||||
|
finalJSON.account.names = SummonerService.getAllSummonerNames(account, summonerDB)
|
||||||
|
|
||||||
|
// MATCH LIST
|
||||||
|
await MatchService.updateMatchList(account, summonerDB)
|
||||||
|
finalJSON.matchList = summonerDB.matchList
|
||||||
|
|
||||||
|
// All seasons the summoner has played
|
||||||
|
finalJSON.seasons = await this.getSeasons(account.puuid)
|
||||||
|
|
||||||
|
// CURRENT GAME
|
||||||
|
const currentGame = await Jax.Spectator.summonerID(account.id, region)
|
||||||
|
finalJSON.playing = !!currentGame
|
||||||
|
finalJSON.current = currentGame
|
||||||
|
|
||||||
|
// RANKED STATS
|
||||||
|
finalJSON.ranked = await SummonerService.getRanked(account, region)
|
||||||
|
|
||||||
|
// SAVE IN DB
|
||||||
|
// await summonerDB.save()
|
||||||
|
await summonersCollection.updateOne({ puuid: account.puuid }, summonerDB)
|
||||||
|
} catch (error) {
|
||||||
|
console.log('username not found')
|
||||||
|
console.log(error)
|
||||||
|
return response.json(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.timeEnd('all')
|
||||||
|
return response.json(finalJSON)
|
||||||
|
}
|
||||||
|
}
|
||||||
79
server-new/app/Services/SummonerService.ts
Normal file
79
server-new/app/Services/SummonerService.ts
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
import Jax from './Jax'
|
||||||
|
import { SummonerDTO } from 'App/Services/Jax/src/Endpoints/SummonerEndpoint'
|
||||||
|
import { LeagueEntryDTO } from './Jax/src/Endpoints/LeagueEndpoint'
|
||||||
|
|
||||||
|
class SummonerService {
|
||||||
|
private uniqueLeagues = ['CHALLENGER', 'GRANDMASTER', 'MASTER']
|
||||||
|
private leaguesNumbers = { 'I': 1, 'II': 2, 'III': 3, 'IV': 4 }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper to transform League Data from the Riot API
|
||||||
|
* @param league raw data of the league from Riot API
|
||||||
|
*/
|
||||||
|
private getleagueData (league?: LeagueEntryDTO) {
|
||||||
|
if (!league) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const fullRank = this.uniqueLeagues.includes(league.tier) ? league.tier : `${league.tier} ${league.rank}`
|
||||||
|
const winrate = +(league.wins * 100 / (league.wins + league.losses)).toFixed(1) + '%'
|
||||||
|
const shortName = this.uniqueLeagues.includes(league.tier) ?
|
||||||
|
league.leaguePoints :
|
||||||
|
league.tier[0] + this.leaguesNumbers[league.rank]
|
||||||
|
|
||||||
|
return {
|
||||||
|
...league,
|
||||||
|
fullRank,
|
||||||
|
winrate,
|
||||||
|
shortName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get account infos for a searched summoner name
|
||||||
|
* @param summonerName
|
||||||
|
* @param region
|
||||||
|
*/
|
||||||
|
public async getAccount (summonerName: string, region: string) {
|
||||||
|
const name = summonerName.toLowerCase().replace(/ /g, '')
|
||||||
|
const account = await Jax.Summoner.summonerName(name, region)
|
||||||
|
return account
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the full list of old and actual summoner names
|
||||||
|
* @param account of the summoner
|
||||||
|
* @param summonerDB summoner in the database
|
||||||
|
*/
|
||||||
|
public getAllSummonerNames (account: SummonerDTO, summonerDB:any) {
|
||||||
|
const names = summonerDB.names ? summonerDB.names : []
|
||||||
|
|
||||||
|
if (!names.find((n: any) => n.name === account.name)) {
|
||||||
|
names.push({
|
||||||
|
name: account.name,
|
||||||
|
date: new Date(),
|
||||||
|
})
|
||||||
|
summonerDB.names = names
|
||||||
|
}
|
||||||
|
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ranked data for a specific Summoner
|
||||||
|
* @param account
|
||||||
|
* @param region
|
||||||
|
*/
|
||||||
|
public async getRanked (account: SummonerDTO, region: string) {
|
||||||
|
const ranked = await Jax.League.summonerID(account.id, region)
|
||||||
|
const result = {
|
||||||
|
soloQ: this.getleagueData(ranked.find(e => e.queueType === 'RANKED_SOLO_5x5')) || null,
|
||||||
|
flex5v5: this.getleagueData(ranked.find(e => e.queueType === 'RANKED_FLEX_SR')) || null,
|
||||||
|
flex3v3: this.getleagueData(ranked.find(e => e.queueType === 'RANKED_FLEX_TT')) || null,
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new SummonerService()
|
||||||
50
server-new/app/helpers.ts
Normal file
50
server-new/app/helpers.ts
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
* League of Legends queues with defined role for each summoner
|
||||||
|
*/
|
||||||
|
const queuesWithRole = [
|
||||||
|
0, // Custom
|
||||||
|
400, // Draft
|
||||||
|
420, // Solo/Duo
|
||||||
|
430, // Blind,
|
||||||
|
440, // Flex
|
||||||
|
700, // Clash
|
||||||
|
]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* League of Legends seasons timestamps
|
||||||
|
*/
|
||||||
|
const seasons = {
|
||||||
|
0: 9,
|
||||||
|
1578628800000: 10,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* League of Legends all support item ids
|
||||||
|
*/
|
||||||
|
const supportItems = [3850, 3851, 3853, 3854, 3855, 3857, 3858, 3859, 3860, 3862, 3863, 3864]
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
queuesWithRole,
|
||||||
|
seasons,
|
||||||
|
supportItems,
|
||||||
|
/**
|
||||||
|
* Get season number for a match
|
||||||
|
*/
|
||||||
|
getSeasonNumber (timestamp: number) {
|
||||||
|
const arrSeasons = Object.keys(seasons).map(k => Number(k))
|
||||||
|
arrSeasons.push(timestamp)
|
||||||
|
arrSeasons.sort()
|
||||||
|
const indexSeason = arrSeasons.indexOf(timestamp) - 1
|
||||||
|
return seasons[arrSeasons[indexSeason]]
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Sort array of Roles according to a specific order
|
||||||
|
* @param a first role
|
||||||
|
* @param b second role
|
||||||
|
*/
|
||||||
|
sortTeamByRole (a:any, b:any) {
|
||||||
|
const sortingArr = ['TOP', 'JUNGLE', 'MIDDLE', 'BOTTOM', 'SUPPORT']
|
||||||
|
return sortingArr.indexOf(a.role) - sortingArr.indexOf(b.role)
|
||||||
|
},
|
||||||
|
}
|
||||||
5
server-new/contracts/league.ts
Normal file
5
server-new/contracts/league.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
declare module '@ioc:Adonis/League' {
|
||||||
|
interface Account {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -35,3 +35,13 @@ Route.get('jax', async () => {
|
||||||
const summoner = await Jax.Summoner.summonerName('LeagueStats GG', 'euw1')
|
const summoner = await Jax.Summoner.summonerName('LeagueStats GG', 'euw1')
|
||||||
return { player: summoner }
|
return { player: summoner }
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Route.post('/summoner/basic', 'SummonersController.basic')
|
||||||
|
Route.post('/summoner/overview', 'SummonersController.overview')
|
||||||
|
Route.post('/summoner/champions', 'SummonersController.champions')
|
||||||
|
Route.post('/summoner/records', 'SummonersController.records')
|
||||||
|
Route.post('/summoner/live', 'SummonersController.liveMatchDetails')
|
||||||
|
|
||||||
|
Route.post('/match', 'MatchesController.index')
|
||||||
|
Route.post('/match/details', 'MatchesController.show')
|
||||||
|
Route.post('/match/details/ranks', 'MatchesController.showRanks')
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue