mirror of
https://github.com/vkaelin/LeagueStats.git
synced 2026-03-25 12:57:28 +00:00
200 lines
5.1 KiB
JavaScript
200 lines
5.1 KiB
JavaScript
'use strict'
|
|
|
|
const Jax = use('Jax')
|
|
const MatchHelper = use('App/Helpers/MatchHelper')
|
|
const Summoner = use('App/Models/Summoner')
|
|
const Match = use('App/Models/Match')
|
|
|
|
class SummonerController {
|
|
/**
|
|
* POST Endpoint : get summoner data
|
|
*/
|
|
async api({ request, response }) {
|
|
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 = {}
|
|
Jax.regionName = region
|
|
|
|
try {
|
|
const account = await Jax.Summoner.summonerName(summoner)
|
|
// 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 }
|
|
)
|
|
|
|
// CURRENT GAME
|
|
const currentGame = await Jax.Spectator.summonerID(account.id)
|
|
finalJSON.playing = !!currentGame
|
|
|
|
// RANKED STATS
|
|
const ranked = await Jax.League.summonerID(account.id)
|
|
finalJSON.ranked = {
|
|
soloQ: ranked.find(e => e.queueType === 'RANKED_SOLO_5x5') || null,
|
|
flex5v5: ranked.find(e => e.queueType === 'RANKED_FLEX_SR') || null,
|
|
flex3v3: ranked.find(e => e.queueType === 'RANKED_FLEX_TT') || null
|
|
}
|
|
|
|
// MATCH LIST
|
|
await MatchHelper.updateMatchList(account, summonerDB)
|
|
const matchList = summonerDB.matchList
|
|
finalJSON.allMatches = matchList
|
|
|
|
// MATCHES DETAILS
|
|
const gameIds = matchList.slice(0, 10).map(({ gameId }) => gameId)
|
|
finalJSON.matchesDetails = await MatchHelper.getMatches(account, gameIds, summonerDB)
|
|
|
|
// MATES
|
|
finalJSON.mates = summonerDB.mates.filter(m => m.wins + m.losses > 1)
|
|
|
|
// PATCH VERSION
|
|
finalJSON.version = Jax.DDragon.Version
|
|
|
|
// STATS
|
|
console.time('STATS')
|
|
const gamemodeStats = await Match.query().aggregate([
|
|
{
|
|
$match: {
|
|
summoner_puuid: account.puuid
|
|
}
|
|
},
|
|
{
|
|
$group: {
|
|
_id: "$gamemode",
|
|
count: { $sum: 1 },
|
|
wins: {
|
|
$sum: {
|
|
$cond: [
|
|
{ $eq: ["$result", "Win"] }, 1, 0
|
|
]
|
|
}
|
|
},
|
|
losses: {
|
|
$sum: {
|
|
$cond: [
|
|
{ $eq: ["$result", "Fail"] }, 1, 0
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
])
|
|
|
|
const roleStats = await Match.query().aggregate([
|
|
{
|
|
$match: {
|
|
summoner_puuid: account.puuid,
|
|
role: { $not: { $eq: 'NONE' } }
|
|
}
|
|
},
|
|
{
|
|
$group: {
|
|
_id: "$role",
|
|
count: { $sum: 1 },
|
|
wins: {
|
|
$sum: {
|
|
$cond: [
|
|
{ $eq: ["$result", "Win"] }, 1, 0
|
|
]
|
|
}
|
|
},
|
|
losses: {
|
|
$sum: {
|
|
$cond: [
|
|
{ $eq: ["$result", "Fail"] }, 1, 0
|
|
]
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
$project: {
|
|
role: "$_id",
|
|
count: "$count",
|
|
wins: "$wins",
|
|
losses: "$losses",
|
|
}
|
|
}
|
|
])
|
|
|
|
// Check if all roles are in the array
|
|
const roles = ['TOP', 'JUNGLE', 'MIDDLE', 'BOTTOM', 'SUPPORT']
|
|
for (const role of roles) {
|
|
if (!roleStats.find(r => r.role === role)) {
|
|
roleStats.push({
|
|
count: 0,
|
|
losses: 0,
|
|
role,
|
|
wins: 0
|
|
})
|
|
}
|
|
}
|
|
|
|
const globalStats = await Match.query().aggregate([
|
|
{
|
|
$match: {
|
|
summoner_puuid: account.puuid
|
|
}
|
|
},
|
|
{
|
|
$group: {
|
|
_id: null,
|
|
count: { $sum: 1 },
|
|
time: { $sum: "$time" },
|
|
wins: {
|
|
$sum: {
|
|
$cond: [
|
|
{ $eq: ["$result", "Win"] }, 1, 0
|
|
]
|
|
}
|
|
},
|
|
losses: {
|
|
$sum: {
|
|
$cond: [
|
|
{ $eq: ["$result", "Fail"] }, 1, 0
|
|
]
|
|
}
|
|
},
|
|
kills: { $sum: "$stats.kills" },
|
|
deaths: { $sum: "$stats.deaths" },
|
|
assists: { $sum: "$stats.assists" },
|
|
minions: { $sum: "$stats.minions" },
|
|
vision: { $sum: "$stats.vision" },
|
|
kp: { $avg: "$stats.kp" },
|
|
}
|
|
}
|
|
])
|
|
finalJSON.stats = {
|
|
global: globalStats[0],
|
|
league: gamemodeStats,
|
|
role: roleStats.sort(MatchHelper.sortTeamByRole),
|
|
}
|
|
console.timeEnd('STATS')
|
|
|
|
// SAVE IN DB
|
|
await summonerDB.save()
|
|
} catch (error) {
|
|
console.log('username not found')
|
|
console.log(error)
|
|
return response.json(null)
|
|
}
|
|
|
|
console.timeEnd('all')
|
|
return response.json(finalJSON)
|
|
}
|
|
}
|
|
|
|
module.exports = SummonerController
|