From 08eb8365fe1e7499c9673ee08f4252b0f85e49cf Mon Sep 17 00:00:00 2001 From: mderouet Date: Fri, 16 Jan 2026 20:10:55 +0100 Subject: [PATCH 1/5] feat: add multi-account management, persistent caching, and enhanced stats display New Features: - Multi-account management: save/switch between accounts (Tab/Shift+Tab) - Persistent caching: per-account cache in ~/.lol-cli/ for matches, ranks, masteries - Ranked info display: Solo/Duo and Flex ranks with LP, tier, win rate - Champion mastery display: top 5 champions with levels and points - Champion stats panel: recent game performance by champion with win rate/KDA - Queue type detection: auto-detects Ranked/Flex/ARAM/Normal/Arena - Region auto-detection: detects region from Riot ID tagline (e.g., #NA1) - Last search persistence: remembers last searched account Bug Fixes: - Add retry with exponential backoff for rate-limited API calls (429) - Fix API error handling to preserve original error information - Handle 404 gracefully for live game endpoint (not in game) - Fix rank calculation for edge cases (score <= 0) - Fix .env path detection for binary builds Code Improvements: - Refactored API functions to use consistent retryWithBackoff() wrapper - Multi-panel results layout with collapsible sections - Generic readCacheFile() helper with validation - PUUID validation to prevent directory traversal - Dynamic footer hints based on context - Progress bar message-only updates --- .gitignore | 3 + src/api.js | 123 +++++++----- src/index.js | 230 +++++++++++++++++++--- src/loadingTui.js | 7 +- src/resultsTui.js | 489 ++++++++++++++++++++++++++++++++++++++-------- src/tui.js | 57 +++++- src/ui.js | 108 ++++++++-- src/utils.js | 254 ++++++++++++++++++++++++ 8 files changed, 1098 insertions(+), 173 deletions(-) diff --git a/.gitignore b/.gitignore index 4ba5a74..759e39e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ node_modules .env .DS_Store lol-cli +lol-cli-macos-arm64 +lol-cli-win-x64.exe +.last_search.json diff --git a/src/api.js b/src/api.js index 9e8b82a..8c41660 100644 --- a/src/api.js +++ b/src/api.js @@ -14,9 +14,34 @@ api.interceptors.request.use((config) => { return config; }); +const retryWithBackoff = async (fn, maxRetries = 5, baseDelay = 1000) => { + let lastError; + for (let attempt = 0; attempt < maxRetries; attempt++) { + try { + return await fn(); + } catch (error) { + lastError = error; + // Only retry on rate limit (429) + if (error.response?.status !== 429) { + handleApiError(error); // Transform and re-throw non-429 errors + } + // Use Retry-After header if present, otherwise exponential backoff + const retryAfter = error.response?.headers?.['retry-after']; + const delay = retryAfter + ? parseInt(retryAfter, 10) * 1000 + : baseDelay * Math.pow(2, attempt); + await new Promise(res => setTimeout(res, delay)); + } + } + throw lastError || new Error('Max retries exceeded'); +}; + const handleApiError = (error) => { if (error.response) { const { status, data } = error.response; + if (status === 429) { + throw error; // Re-throw original error for retry logic + } if (status === 403) { throw new Error('Forbidden: Invalid API Key or insufficient permissions.'); } @@ -24,9 +49,9 @@ const handleApiError = (error) => { throw new Error('Not Found: The requested resource was not found.'); } throw new Error(data.status ? data.status.message : 'An API error occurred.'); - } else { - throw new Error('An unexpected error occurred.'); } + // Re-throw network errors (no response) to preserve original error info + throw error; }; const getRegionalPlatform = (region) => { @@ -43,14 +68,12 @@ const getRegionalPlatform = (region) => { }; const getSummonerByPuuid = async (region, puuid) => { - try { + return retryWithBackoff(async () => { const response = await api.get( `https://${region}.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/${puuid}` ); return response.data; - } catch (error) { - handleApiError(error); - } + }); }; const getSummonerDataByRiotId = async (region, riotId) => { @@ -64,15 +87,12 @@ const getSummonerDataByRiotId = async (region, riotId) => { const accountRegion = getRegionalPlatform(region); const accountApiUrl = `https://${accountRegion}.api.riotgames.com`; - let puuid; - try { - const response = await api.get( + const response = await retryWithBackoff(async () => { + return api.get( `${accountApiUrl}/riot/account/v1/accounts/by-riot-id/${encodeURIComponent(gameName)}/${tagLine}` ); - puuid = response.data.puuid; - } catch (error) { - handleApiError(error); - } + }); + const puuid = response.data.puuid; if (!puuid) { throw new Error('Could not retrieve PUUID for the given Riot ID.'); @@ -84,72 +104,74 @@ const getSummonerDataByRiotId = async (region, riotId) => { const getMatchHistory = async (region, puuid) => { - try { + return retryWithBackoff(async () => { const response = await api.get( `https://${getRegionalPlatform(region)}.api.riotgames.com/lol/match/v5/matches/by-puuid/${puuid}/ids?start=0&count=10` ); return response.data; - } catch (error) { - handleApiError(error); - } + }); }; const getMatchDetails = async (region, matchId) => { - try { + return retryWithBackoff(async () => { const response = await api.get( `https://${getRegionalPlatform(region)}.api.riotgames.com/lol/match/v5/matches/${matchId}` ); return response.data; - } catch (error) { - handleApiError(error); - } + }); }; const getMatchTimeline = async (region, matchId) => { - try { + return retryWithBackoff(async () => { const response = await api.get( `https://${getRegionalPlatform(region)}.api.riotgames.com/lol/match/v5/matches/${matchId}/timeline` ); return response.data; - } catch (error) { - handleApiError(error); - } + }); }; const getRankedData = async (region, puuid) => { - try { - const response = await api.get( - `https://${region}.api.riotgames.com/lol/league/v4/entries/by-puuid/${puuid}` - ); - return response.data; - } catch (error) { - handleApiError(error); - } + return retryWithBackoff(async () => { + const response = await api.get( + `https://${region}.api.riotgames.com/lol/league/v4/entries/by-puuid/${puuid}` + ); + return response.data; + }); }; const getChampionMastery = async (region, puuid, championId) => { - try { - const response = await api.get( - `https://${region}.api.riotgames.com/lol/champion-mastery/v4/champion-masteries/by-puuid/${puuid}/by-champion/${championId}` - ); - return response.data; - } catch (error) { - handleApiError(error); - } + return retryWithBackoff(async () => { + const response = await api.get( + `https://${region}.api.riotgames.com/lol/champion-mastery/v4/champion-masteries/by-puuid/${puuid}/by-champion/${championId}` + ); + return response.data; + }); +}; + +const getTopChampionMasteries = async (region, puuid, count = 5) => { + return retryWithBackoff(async () => { + const response = await api.get( + `https://${region}.api.riotgames.com/lol/champion-mastery/v4/champion-masteries/by-puuid/${puuid}/top?count=${count}` + ); + return response.data; + }); }; const getLiveGame = async (region, encryptedPUUID) => { + return retryWithBackoff(async () => { try { - const response = await api.get( - `https://${region}.api.riotgames.com/lol/spectator/v5/active-games/by-summoner/${encryptedPUUID}` - ); - return response.data; + const response = await api.get( + `https://${region}.api.riotgames.com/lol/spectator/v5/active-games/by-summoner/${encryptedPUUID}` + ); + return response.data; } catch (error) { - if (error.response && error.response.status === 404) { - return null; // Not in a game, return null instead of throwing - } - handleApiError(error); // For all other errors, use the handler + // 404 means no active game - return null instead of throwing + if (error.response?.status === 404) { + return null; + } + throw error; // Let retryWithBackoff handle other errors } + }); }; module.exports = { @@ -159,5 +181,6 @@ module.exports = { getMatchTimeline, getRankedData, getChampionMastery, + getTopChampionMasteries, getLiveGame, -}; \ No newline at end of file +}; diff --git a/src/index.js b/src/index.js index 569bbc6..f88530c 100755 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,14 @@ #!/usr/bin/env node const path = require('path'); -require('dotenv').config({ path: path.resolve(path.dirname(process.execPath), '.env') }); +const envPath = process.pkg + ? path.resolve(path.dirname(process.execPath), '.env') + : path.resolve(__dirname, '..', '.env'); +require('dotenv').config({ path: envPath }); const { Command } = require('commander'); const blessed = require('blessed'); -const { getSummonerDataByRiotId, getMatchHistory, getMatchDetails, getMatchTimeline } = require('./api'); +const { getSummonerDataByRiotId, getMatchHistory, getMatchDetails, getMatchTimeline, getRankedData, getTopChampionMasteries } = require('./api'); const { createSearchScreen } = require('./tui'); +const { getLastSearch, saveLastSearch, getMatchCache, saveMatchCache, getMonitoredAccounts, addMonitoredAccount, removeMonitoredAccount, setActiveAccountIndex, getAccountDataCache, saveAccountDataCache } = require('./utils'); const { createResultsScreen } = require('./resultsTui'); const { createLoadingScreen } = require('./loadingTui'); @@ -21,24 +25,197 @@ program.parse(process.argv); const options = program.opts(); if (!program.args.length) { + // Helper function to load account data from cache (for instant switching) + const loadAccountDataFromCache = (puuid) => { + const accountCache = getAccountDataCache(puuid); + if (!accountCache) return null; + + const matchCache = getMatchCache(puuid); + const matches = matchCache.matches.map(m => ({ + details: m.details, + timeline: m.timeline, + })); + + return { + summoner: accountCache.summoner, + matches, + rankedData: accountCache.rankedData || [], + topMasteries: accountCache.topMasteries || [], + }; + }; + + // Helper function to load account data (full API fetch) + const loadAccountData = async (region, riotId, screen, loading) => { + loading.update(5, 'Fetching summoner data...'); + const summoner = await getSummonerDataByRiotId(region, riotId); + + loading.update(10, 'Fetching player data...'); + const [rankedData, topMasteries, matchHistory] = await Promise.all([ + getRankedData(region, summoner.puuid).catch(() => []), + getTopChampionMasteries(region, summoner.puuid, 5).catch(() => []), + getMatchHistory(region, summoner.puuid), + ]); + + const matchCache = getMatchCache(summoner.puuid); + const cachedMatchIds = new Set(matchCache.matches.map(m => m.matchId)); + const newMatchIds = matchHistory.filter(id => !cachedMatchIds.has(id)); + const totalNewMatches = newMatchIds.length; + + const newMatches = []; + if (totalNewMatches === 0) { + loading.update(100, 'All matches cached, loading from disk...'); + } else { + loading.update(15, `Found ${totalNewMatches} new match(es) to fetch...`); + for (let i = 0; i < totalNewMatches; i++) { + const matchId = newMatchIds[i]; + loading.update(null, `Fetching new match ${i + 1}/${totalNewMatches}...`); + + const [matchDetails, matchTimeline] = await Promise.all([ + getMatchDetails(region, matchId), + getMatchTimeline(region, matchId), + ]); + newMatches.push({ + matchId, + gameCreation: matchDetails.info.gameCreation, + details: matchDetails, + timeline: matchTimeline + }); + + const progress = 15 + (((i + 1) / totalNewMatches) * 85); + loading.update(progress); + } + } + + const allCachedMatches = [...newMatches, ...matchCache.matches]; + allCachedMatches.sort((a, b) => b.gameCreation - a.gameCreation); + + matchCache.matches = allCachedMatches; + matchCache.region = region; + saveMatchCache(summoner.puuid, matchCache); + + const matches = allCachedMatches.map(m => ({ + details: m.details, + timeline: m.timeline, + })); + + // Save account data to cache for instant switching + saveAccountDataCache(summoner.puuid, { summoner, rankedData, topMasteries }); + + loading.update(100, 'All data loaded.'); + + return { summoner, matches, rankedData, topMasteries }; + }; + + // Helper to handle results from createResultsScreen + const handleScreenResult = (result) => { + if (!result) { + return { action: 'EXIT' }; + } + if (result === 'BACK') { + return { action: 'BACK' }; + } + if (result.action === 'SWITCH_ACCOUNT') { + const updatedMonitored = setActiveAccountIndex(result.accountIndex); + const account = updatedMonitored.accounts[result.accountIndex]; + if (!account) { + return { action: 'BACK' }; + } + return { + action: 'SWITCH', + accountIndex: result.accountIndex, + region: account.region, + riotId: account.riotId, + puuid: account.puuid, + }; + } + if (result.action === 'REMOVE_ACCOUNT') { + const updatedMonitored = removeMonitoredAccount(result.puuid); + if (updatedMonitored.accounts.length === 0) { + return { action: 'BACK' }; + } + const account = updatedMonitored.accounts[updatedMonitored.activeIndex]; + return { + action: 'SWITCH', + accountIndex: updatedMonitored.activeIndex, + region: account.region, + riotId: account.riotId, + puuid: account.puuid, + }; + } + return { action: 'EXIT' }; + }; + const main = async () => { let region, riotId; let cliOptions = { ...options }; + let skipSearch = false; + let currentAccountIndex = 0; + let switchToPuuid = null; // Track puuid when switching for cache-first loading + + // Check for monitored accounts on startup (skip search if available and no CLI args) + const initialMonitored = getMonitoredAccounts(); + if (!cliOptions.region && !cliOptions.riotId && initialMonitored.accounts.length > 0) { + skipSearch = true; + currentAccountIndex = initialMonitored.activeIndex; + const account = initialMonitored.accounts[currentAccountIndex]; + region = account.region; + riotId = account.riotId; + switchToPuuid = account.puuid; + } while (true) { - if (!cliOptions.region || !cliOptions.riotId) { - const searchData = await createSearchScreen(); + // Determine if we need to show search screen + if (!skipSearch && !cliOptions.region && !cliOptions.riotId) { + const lastSearch = getLastSearch(); + const monitoredAccounts = getMonitoredAccounts(); + const searchData = await createSearchScreen(lastSearch || {}, { accountCount: monitoredAccounts.accounts.length }); if (!searchData || searchData === 'EXIT' || !searchData.riotId) { console.log('Exiting.'); break; } region = searchData.region; riotId = searchData.riotId; - } else { + saveLastSearch(riotId, region); + } else if (cliOptions.region && cliOptions.riotId) { region = cliOptions.region; riotId = cliOptions.riotId; cliOptions = {}; } + // else: skipSearch is true, region/riotId already set + + skipSearch = false; // Reset for next iteration + + // Try cache-first loading when switching accounts + if (switchToPuuid) { + const cachedData = loadAccountDataFromCache(switchToPuuid); + if (cachedData && cachedData.matches.length > 0) { + // Use cached data - instant switch, no loading screen + const monitoredData = getMonitoredAccounts(); + currentAccountIndex = monitoredData.activeIndex; + + const result = await createResultsScreen(cachedData.summoner, cachedData.matches, region, cachedData.rankedData, cachedData.topMasteries, { + monitoredAccounts: monitoredData, + currentAccountIndex, + }); + + const handled = handleScreenResult(result); + if (handled.action === 'EXIT') { + break; + } else if (handled.action === 'BACK') { + switchToPuuid = null; + continue; + } else if (handled.action === 'SWITCH') { + currentAccountIndex = handled.accountIndex; + region = handled.region; + riotId = handled.riotId; + switchToPuuid = handled.puuid; + skipSearch = true; + continue; + } + } + // No cache or empty matches - fall through to full load + switchToPuuid = null; + } const screen = blessed.screen({ smartCSR: true, @@ -49,31 +226,32 @@ if (!program.args.length) { screen.render(); try { - loading.update(10, 'Fetching summoner data...'); - const summoner = await getSummonerDataByRiotId(region, riotId); - - loading.update(30, 'Fetching match history...'); - const matchHistory = await getMatchHistory(region, summoner.puuid); - - const matches = []; - for (let i = 0; i < matchHistory.length; i++) { - const matchId = matchHistory[i]; - const progress = 30 + (i / matchHistory.length) * 60; - loading.update(progress, `Fetching details for match ${i + 1}/${matchHistory.length}...`); - - const matchDetails = await getMatchDetails(region, matchId); - const matchTimeline = await getMatchTimeline(region, matchId); - matches.push({ details: matchDetails, timeline: matchTimeline }); - } + const { summoner, matches, rankedData, topMasteries } = await loadAccountData(region, riotId, screen, loading); + + // Auto-save to monitored accounts + const monitoredData = addMonitoredAccount(summoner, region, riotId); + currentAccountIndex = monitoredData.activeIndex; - loading.update(100, 'All data loaded.'); loading.destroy(); - - screen.destroy(); // Destroy the screen used for loading + screen.destroy(); + + const result = await createResultsScreen(summoner, matches, region, rankedData, topMasteries, { + monitoredAccounts: monitoredData, + currentAccountIndex, + }); - const result = await createResultsScreen(summoner, matches, region); - if (result !== 'BACK') { + const handled = handleScreenResult(result); + if (handled.action === 'EXIT') { break; + } else if (handled.action === 'BACK') { + continue; + } else if (handled.action === 'SWITCH') { + currentAccountIndex = handled.accountIndex; + region = handled.region; + riotId = handled.riotId; + switchToPuuid = handled.puuid; + skipSearch = true; + continue; } } catch (error) { screen.destroy(); diff --git a/src/loadingTui.js b/src/loadingTui.js index 1f17774..2da1e5b 100644 --- a/src/loadingTui.js +++ b/src/loadingTui.js @@ -80,8 +80,13 @@ const createLoadingScreen = (screen) => { }); return { + // Update progress bar and/or message. + // - progress: number (0-100) to set progress, or null/undefined to skip progress update + // - msg: optional string to update the loading message update: (progress, msg) => { - progressBar.setProgress(progress); + if (progress !== null && progress !== undefined) { + progressBar.setProgress(progress); + } if (msg) { message.setContent(msg); } diff --git a/src/resultsTui.js b/src/resultsTui.js index bfb604c..fde19a9 100644 --- a/src/resultsTui.js +++ b/src/resultsTui.js @@ -1,7 +1,7 @@ const blessed = require('blessed'); const { getRankedData, getChampionMastery, getLiveGame } = require('./api'); -const { formatSummary, formatMatchDetails } = require('./ui'); -const { getItemData, getChampionData, getSummonerSpellData, getRuneData, getQueueData } = require('./utils'); +const { formatSummary, formatMatchDetails, formatRankedInfo, formatChampionStats, formatMasteryDisplay, colorizeRank } = require('./ui'); +const { getItemData, getChampionData, getSummonerSpellData, getRuneData, getQueueData, getParticipantRankCache, saveParticipantRankCache } = require('./utils'); const { createMasteryScreen } = require('./masteryTui'); const { createTimelineScreen } = require('./timelineTui'); @@ -27,7 +27,7 @@ const rankToScore = (rank) => { }; const scoreToRank = (score) => { - if (score === 0) return 'Unranked'; + if (score <= 0) return 'Unranked'; const tiers = ['IRON', 'BRONZE', 'SILVER', 'GOLD', 'PLATINUM', 'EMERALD', 'DIAMOND', 'MASTER', 'GRANDMASTER', 'CHALLENGER']; const divisions = ['IV', 'III', 'II', 'I']; const tierIndex = Math.floor(score / 4); @@ -38,33 +38,18 @@ const scoreToRank = (score) => { return `${tier} ${division}`; }; -const colorizeRank = (rank) => { - if (!rank) return `{white-fg}Unranked{/white-fg}`; - const tier = rank.split(' ')[0]; - const rankColors = { - 'CHALLENGER': colors.yellow, - 'GRANDMASTER': colors.red, - 'MASTER': colors.pink, - 'DIAMOND': colors.cyan, - 'EMERALD': colors.green, - 'PLATINUM': '#8be9fd', - 'GOLD': colors.yellow, - 'SILVER': colors.fg, - 'BRONZE': '#cd7f32', - 'IRON': '#a9a9a9', - 'Unranked': colors.fg, - }; - const color = rankColors[tier] || colors.fg; - return `{${color}-fg}${rank}{/${color}-fg}`; -}; - -const createResultsScreen = async (summoner, matches, region) => { +const createResultsScreen = async (summoner, matches, region, rankedData, topMasteries, options = {}) => { + const { monitoredAccounts = null, currentAccountIndex = 0 } = options; + const totalAccounts = monitoredAccounts?.accounts?.length || 1; + const hasMultipleAccounts = totalAccounts > 1; const itemData = await getItemData(); const spellData = await getSummonerSpellData(); const runeData = await getRuneData(); const queueData = await getQueueData(); + const championData = await getChampionData(); const itemMap = itemData.data; const spellMap = new Map(Object.values(spellData.data).map(s => [s.key, s.name])); + const championMap = new Map(Object.values(championData.data).map(c => [c.key, c.name])); const runeMap = new Map(); runeData.forEach(tree => { runeMap.set(tree.id, tree.name); @@ -76,10 +61,127 @@ const createResultsScreen = async (summoner, matches, region) => { }); const queueMap = new Map(queueData.map(q => [q.queueId, q.description])); + const getShortQueueName = (desc, queueId) => { + if (queueId === 1700) return 'Arena'; + if (desc.includes('Ranked Solo')) return 'Ranked'; + if (desc.includes('Ranked Flex')) return 'Flex'; + if (desc.includes('ARAM')) return 'ARAM'; + if (desc.includes('Draft')) return 'Normal'; + if (desc.includes('Blind')) return 'Blind'; + return 'Other'; + }; + + // Load participant rank cache from disk + const diskRankCache = getParticipantRankCache(summoner.puuid); + const RANK_TTL = 60 * 60 * 1000; // 1 hour in milliseconds + + const playerRankCache = {}; // Cache by PUUID (persists across matches) + const matchRankCache = {}; // Cache computed match averages + + // Pre-populate playerRankCache from disk cache + Object.entries(diskRankCache.ranks).forEach(([puuid, data]) => { + playerRankCache[puuid] = data.rank; + }); - const rankCache = {}; // Cache for player ranks and average rank + // Helper to compute match average from cached ranks + const computeMatchAverage = (matchIndex) => { + const participants = matches[matchIndex].details.info.participants; + const ranks = {}; + let totalScore = 0; + let rankedCount = 0; + let allCached = true; + + for (const p of participants) { + if (playerRankCache[p.puuid] !== undefined) { + ranks[p.puuid] = playerRankCache[p.puuid]; + if (ranks[p.puuid] !== 'N/A') { + totalScore += rankToScore(ranks[p.puuid]); + rankedCount++; + } + } else { + allCached = false; + } + } + + if (allCached) { + matchRankCache[matchIndex] = { + players: ranks, + average: rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : 'N/A', + }; + return true; + } + return false; + }; + + // Pre-compute match averages from cached data + for (let i = 0; i < matches.length; i++) { + computeMatchAverage(i); + } + + const fetchMatchRanks = async (matchIndex, skipDelay = false) => { + if (matchRankCache[matchIndex]) return; // Already fully cached + + const ranks = {}; + let totalScore = 0; + let rankedCount = 0; + const participants = matches[matchIndex].details.info.participants; + const delay = ms => new Promise(res => setTimeout(res, ms)); + + for (const p of participants) { + // Check PUUID cache first + if (playerRankCache[p.puuid] !== undefined) { + ranks[p.puuid] = playerRankCache[p.puuid]; + if (ranks[p.puuid] !== 'N/A') { + totalScore += rankToScore(ranks[p.puuid]); + rankedCount++; + } + continue; + } + + try { + const rankData = await getRankedData(region, p.puuid); + const soloQueue = rankData.find(q => q.queueType === 'RANKED_SOLO_5x5'); + const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; + ranks[p.puuid] = rankString; + playerRankCache[p.puuid] = rankString; // Cache by PUUID + // Update disk cache + diskRankCache.ranks[p.puuid] = { rank: rankString, fetchedAt: new Date().toISOString() }; + totalScore += rankToScore(rankString); + rankedCount++; + } catch (error) { + ranks[p.puuid] = 'N/A'; + playerRankCache[p.puuid] = 'N/A'; // Cache failures too + diskRankCache.ranks[p.puuid] = { rank: 'N/A', fetchedAt: new Date().toISOString() }; + } + if (!skipDelay) await delay(100); + } + + matchRankCache[matchIndex] = { + players: ranks, + average: rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : 'N/A', + }; + }; + + // Find stale ranks (older than TTL) that need refresh + const getStalePlayerPuuids = () => { + const now = Date.now(); + const stalePuuids = new Set(); + + for (const match of matches) { + for (const p of match.details.info.participants) { + const cached = diskRankCache.ranks[p.puuid]; + const fetchTime = cached ? new Date(cached.fetchedAt).getTime() : NaN; + if (!cached || isNaN(fetchTime) || (now - fetchTime > RANK_TTL)) { + stalePuuids.add(p.puuid); + } + } + } + return Array.from(stalePuuids); + }; return new Promise((resolve) => { + let isScreenDestroyed = false; + const screen = blessed.screen({ smartCSR: true, title: `Stats for ${summoner.name} [${region}]`, @@ -98,22 +200,52 @@ const createResultsScreen = async (summoner, matches, region) => { blessed.text({ parent: layout, - top: 1, + top: 0, left: 'center', - content: `Summoner: {bold}${summoner.name}{/bold} | Region: {bold}${region}{/bold}`, + content: `Summoner: {bold}${summoner.name}{/bold} [Lvl ${summoner.summonerLevel}] | Region: {bold}${region}{/bold}`, tags: true, style: { fg: colors.cyan, }, }); - const summaryBox = blessed.box({ + // Account list indicator (row 1, right-aligned) + // Format: Accounts: > Name1 (R1) | Name2 (R2) | Name3 (R3) + const formatAccountList = () => { + if (!hasMultipleAccounts) return ''; + const accounts = monitoredAccounts.accounts; + const parts = accounts.map((acc, idx) => { + // Truncate name to 12 chars + let name = acc.riotId.split('#')[0]; + if (name.length > 12) name = name.substring(0, 11) + '~'; + // Shorten region display + const regionShort = acc.region.replace(/1$/, ''); + const marker = idx === currentAccountIndex ? '>' : ' '; + return `${marker}${name} (${regionShort})`; + }); + return `Accounts: ${parts.join(' | ')}`; + }; + + const accountIndicator = blessed.text({ parent: layout, - width: '100%', + top: 1, + right: 1, + content: formatAccountList(), + tags: true, + style: { + fg: colors.yellow, + }, + }); + + // Row 1: Ranked Info (left) | Live Game (right) + const rankedBox = blessed.box({ + parent: layout, + width: '50%', height: 9, - top: 3, + top: 2, left: 0, - content: formatSummary(summoner, matches), + label: ' Ranked ', + content: formatRankedInfo(rankedData), tags: true, border: { type: 'line', @@ -126,9 +258,9 @@ const createResultsScreen = async (summoner, matches, region) => { const liveGameBox = blessed.box({ parent: layout, - width: '30%', + width: '50%', height: 9, - top: 3, + top: 2, right: 0, label: ' Live Game ', tags: true, @@ -141,13 +273,67 @@ const createResultsScreen = async (summoner, matches, region) => { } }); + // Row 2: Summary (left) | Top Masteries (right) + const summaryBox = blessed.box({ + parent: layout, + width: '50%', + height: 9, + top: 11, + left: 0, + label: ` Last ${matches.length} Games `, + content: formatSummary(summoner, matches), + tags: true, + border: { + type: 'line', + fg: colors.purple, + }, + style: { + border: { fg: colors.purple } + } + }); + + const masteryBox = blessed.box({ + parent: layout, + width: '50%', + height: 9, + top: 11, + right: 0, + label: ' Top Champion Masteries ', + content: formatMasteryDisplay(topMasteries, championMap), + tags: true, + border: { + type: 'line', + fg: colors.purple, + }, + style: { + border: { fg: colors.purple } + } + }); + + // Row 3: Champion Stats (full width) + const championStatsBox = blessed.box({ + parent: layout, + width: '100%', + height: 9, + top: 20, + left: 0, + label: ' Champion Stats (Recent Games) ', + content: formatChampionStats(matches, summoner.puuid), + tags: true, + border: { + type: 'line', + fg: colors.purple, + }, + style: { + border: { fg: colors.purple } + } + }); + const checkLiveGame = async () => { const liveGameData = await getLiveGame(region, summoner.puuid); if (liveGameData) { const participant = liveGameData.participants.find(p => p.puuid === summoner.puuid); if (participant) { - const championData = await getChampionData(); - const championMap = new Map(Object.values(championData.data).map(c => [c.key, c.name])); const championName = championMap.get(String(participant.championId)) || 'Unknown'; const spell1 = spellMap.get(String(participant.spell1Id)) || 'N/A'; @@ -198,14 +384,14 @@ const createResultsScreen = async (summoner, matches, region) => { const matchList = blessed.list({ parent: layout, width: '100%', - top: 12, + top: 29, bottom: 1, items: [], border: { type: 'line', fg: colors.purple, }, - label: ' Match History (Select to expand) ', + label: ` Match History - ${matches.length} Games (Select to expand) `, mouse: true, keys: true, vi: true, @@ -217,13 +403,26 @@ const createResultsScreen = async (summoner, matches, region) => { }, }); + const getFooterContent = (isExpanded) => { + let content = ''; + if (hasMultipleAccounts) { + content += 'Tab: Switch | '; + } + content += 'd: Remove | Backspace: Back | m: Mastery'; + if (isExpanded) { + content += ' | t: Timeline'; + } + content += ' | q: Quit'; + return content; + }; + const footer = blessed.box({ parent: layout, width: '100%', height: 1, bottom: 0, left: 'center', - content: 'b: Back | m: Mastery | t: Timeline | q: Quit', + content: getFooterContent(false), tags: true, style: { fg: colors.orange, @@ -233,16 +432,29 @@ const createResultsScreen = async (summoner, matches, region) => { const expanded = {}; let listIndexMap = []; + const setPanelVisibility = (visible) => { + rankedBox.hidden = !visible; + liveGameBox.hidden = !visible; + summaryBox.hidden = !visible; + masteryBox.hidden = !visible; + championStatsBox.hidden = !visible; + matchList.top = visible ? 29 : 2; + matchList.height = visible ? 12 : '90%'; + }; + const updateList = () => { const items = []; listIndexMap = []; let isAnyExpanded = false; matches.forEach((match, index) => { const participant = match.details.info.participants.find(p => p.puuid === summoner.puuid); - const role = (match.details.info.queueId === 1700 - ? 'Arena' + const queueId = match.details.info.queueId; + const queueDesc = queueMap.get(queueId) || ''; + const queueLabel = getShortQueueName(queueDesc, queueId).padEnd(10); + const role = (queueId === 1700 + ? 'Arena' : (participant.teamPosition || participant.individualPosition || '')).padEnd(10); - const avgRank = rankCache[index] ? `Avg Rank: ${colorizeRank(rankCache[index].average)}`.padEnd(40) : ''.padEnd(40); + const avgRank = matchRankCache[index] ? `Avg Rank: ${colorizeRank(matchRankCache[index].average)}`.padEnd(40) : ''.padEnd(40); const gameDate = new Date(match.details.info.gameCreation).toLocaleDateString().padEnd(12); let resultText; if (!participant.win && match.details.info.gameDuration < 300) { @@ -261,13 +473,13 @@ const createResultsScreen = async (summoner, matches, region) => { } else { coloredResult = `{grey-fg}${paddedResult}{/grey-fg}`; } - const summary = `${gameDate}${coloredResult} - ${championName}${role}${kda} ${avgRank}`; + const summary = `${gameDate}${coloredResult} - ${championName}${queueLabel}${role}${kda} ${avgRank}`; items.push(summary); listIndexMap.push(index); if (expanded[index]) { isAnyExpanded = true; - const details = formatMatchDetails(match, summoner, itemMap, spellMap, runeMap, screen.width, rankCache[index].players); + const details = formatMatchDetails(match, summoner, itemMap, spellMap, runeMap, screen.width, matchRankCache[index]?.players); details.split('\n').forEach(line => { items.push(line); listIndexMap.push(null); @@ -276,11 +488,10 @@ const createResultsScreen = async (summoner, matches, region) => { }); matchList.setItems(items); - if (isAnyExpanded) { - footer.setContent('b: Back | m: Mastery | t: Timeline | q: Quit'); - } else { - footer.setContent('b: Back | m: Mastery | q: Quit'); - } + // Hide/show panels based on expansion state + setPanelVisibility(!isAnyExpanded); + + footer.setContent(getFooterContent(isAnyExpanded)); screen.render(); }; @@ -290,13 +501,14 @@ const createResultsScreen = async (summoner, matches, region) => { const currentlySelected = matchList.selected; expanded[matchIndex] = !expanded[matchIndex]; - if (expanded[matchIndex] && !rankCache[matchIndex]) { - const loading = blessed.box({ - parent: screen, - top: 'center', - left: 'center', - height: 1, - width: 20, + if (expanded[matchIndex] && !matchRankCache[matchIndex]) { + // Only show loading if not already preloaded + const loading = blessed.box({ + parent: screen, + top: 'center', + left: 'center', + height: 1, + width: 20, content: 'Loading ranks...', style: { bg: colors.bg, @@ -305,24 +517,11 @@ const createResultsScreen = async (summoner, matches, region) => { }); screen.render(); - const ranks = {}; - let totalScore = 0; - const participants = matches[matchIndex].details.info.participants; - const delay = ms => new Promise(res => setTimeout(res, ms)); - - for (const p of participants) { - const rankData = await getRankedData(region, p.puuid); - const soloQueue = rankData.find(q => q.queueType === 'RANKED_SOLO_5x5'); - const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; - ranks[p.puuid] = rankString; - totalScore += rankToScore(rankString); - await delay(100); + try { + await fetchMatchRanks(matchIndex); + } finally { + loading.destroy(); } - rankCache[matchIndex] = { - players: ranks, - average: scoreToRank(totalScore / participants.length), - }; - loading.destroy(); } updateList(); @@ -393,20 +592,156 @@ const createResultsScreen = async (summoner, matches, region) => { - screen.key(['escape', 'q', 'C-c'], () => { + // Save rank cache before exit + const saveCacheAndExit = (result) => { + isScreenDestroyed = true; + saveParticipantRankCache(summoner.puuid, diskRankCache); screen.destroy(); - resolve(); + resolve(result); + }; + + screen.key(['escape', 'q', 'C-c'], () => { + saveCacheAndExit(); + }); + + screen.key(['b', 'backspace', 'delete'], () => { + if (modalOpen) return; + + // Check if any match is expanded + const isAnyExpanded = Object.values(expanded).some(v => v); + + if (isAnyExpanded) { + // Collapse all expanded matches first + Object.keys(expanded).forEach(key => { + expanded[key] = false; + }); + updateList(); + screen.render(); + } else { + // No match expanded, go back to Search screen + saveCacheAndExit('BACK'); + } + }); + + // Tab: Switch to next account + screen.key('tab', () => { + if (modalOpen || !hasMultipleAccounts) return; + const nextIndex = (currentAccountIndex + 1) % totalAccounts; + saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: nextIndex }); + }); + + // Shift+Tab: Switch to previous account + screen.key('S-tab', () => { + if (modalOpen || !hasMultipleAccounts) return; + const prevIndex = (currentAccountIndex - 1 + totalAccounts) % totalAccounts; + saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: prevIndex }); }); - screen.key('b', () => { + // d: Remove current account from monitored list + screen.key('d', () => { if (modalOpen) return; - screen.destroy(); - resolve('BACK'); + + // Show confirmation dialog + const confirmBox = blessed.box({ + parent: screen, + top: 'center', + left: 'center', + width: 50, + height: 7, + border: { type: 'line', fg: colors.red }, + style: { bg: colors.bg, fg: colors.fg }, + label: ' Remove Account ', + tags: true, + }); + + blessed.text({ + parent: confirmBox, + top: 1, + left: 'center', + content: `Remove {bold}${summoner.name}{/bold} from monitored accounts?`, + tags: true, + style: { fg: colors.fg }, + }); + + blessed.text({ + parent: confirmBox, + top: 3, + left: 'center', + content: '{green-fg}y{/green-fg}: Yes | {red-fg}n{/red-fg}: No', + tags: true, + style: { fg: colors.fg }, + }); + + screen.render(); + + const confirmHandler = (ch, key) => { + if (key.name === 'y') { + screen.unkey(['y', 'n', 'escape'], confirmHandler); + confirmBox.destroy(); + screen.render(); + matchList.focus(); + saveCacheAndExit({ action: 'REMOVE_ACCOUNT', puuid: summoner.puuid }); + } else if (key.name === 'n' || key.name === 'escape') { + screen.unkey(['y', 'n', 'escape'], confirmHandler); + confirmBox.destroy(); + screen.render(); + matchList.focus(); + } + }; + + screen.key(['y', 'n', 'escape'], confirmHandler); }); updateList(); matchList.focus(); screen.render(); + + // Background rank refresh for stale data + const refreshStaleRanks = async () => { + const stalePuuids = getStalePlayerPuuids(); + if (stalePuuids.length === 0) return; + + const delay = ms => new Promise(res => setTimeout(res, ms)); + + for (const puuid of stalePuuids) { + if (isScreenDestroyed) return; + + try { + const rankData = await getRankedData(region, puuid); + const soloQueue = rankData.find(q => q.queueType === 'RANKED_SOLO_5x5'); + const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; + playerRankCache[puuid] = rankString; + diskRankCache.ranks[puuid] = { rank: rankString, fetchedAt: new Date().toISOString() }; + } catch (error) { + // On rate limit (429), stop background refresh entirely + if (error.response?.status === 429) { + break; + } + // For other errors, mark as N/A and continue + playerRankCache[puuid] = 'N/A'; + diskRankCache.ranks[puuid] = { rank: 'N/A', fetchedAt: new Date().toISOString() }; + } + + if (isScreenDestroyed) return; + + // After each fetch, try to compute any newly-completable match averages + let anyNewComputed = false; + for (let i = 0; i < matches.length; i++) { + if (!matchRankCache[i] && computeMatchAverage(i)) { + anyNewComputed = true; + } + } + if (anyNewComputed) { + updateList(); + screen.render(); + } + + await delay(200); // 200ms between requests (less aggressive than 100ms) + } + }; + + // Start background refresh after initial render (fire and forget) + refreshStaleRanks().catch(() => {}); }); }; diff --git a/src/tui.js b/src/tui.js index fd9081b..6236b12 100644 --- a/src/tui.js +++ b/src/tui.js @@ -1,6 +1,11 @@ const blessed = require('blessed'); +const { detectRegionFromRiotId } = require('./utils'); + +const REGIONS = ['NA1', 'KR', 'EUW1', 'EUN1', 'JP1', 'BR1', 'LA1', 'LA2', 'OC1', 'RU', 'TR1']; + +const createSearchScreen = (defaults = {}, options = {}) => { + const { accountCount = 0 } = options; -const createSearchScreen = () => { return new Promise((resolve) => { const screen = blessed.screen({ smartCSR: true, @@ -43,6 +48,19 @@ const createSearchScreen = () => { }, }); + // Account indicator (if monitored accounts exist) + if (accountCount > 0) { + blessed.text({ + parent: layout, + top: 1, + right: 1, + content: `${accountCount} account${accountCount > 1 ? 's' : ''} saved`, + style: { + fg: colors.yellow, + }, + }); + } + const form = blessed.form({ parent: layout, width: '80%', @@ -109,7 +127,7 @@ const createSearchScreen = () => { height: 3, top: 4, left: 15, - items: ['NA1', 'KR', 'EUW1', 'EUN1', 'JP1', 'BR1', 'LA1', 'LA2', 'OC1', 'RU', 'TR1'], + items: REGIONS, mouse: true, keys: true, lockKeys: true, @@ -177,6 +195,18 @@ const createSearchScreen = () => { }, }); + // Auto-detect status message + const autoDetectStatus = blessed.text({ + parent: form, + top: 4, + right: 3, + content: '', + tags: true, + style: { + fg: colors.green, + }, + }); + // Footer with key hints blessed.text({ parent: layout, @@ -188,9 +218,32 @@ const createSearchScreen = () => { }, }); + if (defaults.riotId) { + riotIdInput.setValue(defaults.riotId); + } + if (defaults.region) { + const regionIndex = REGIONS.indexOf(defaults.region); + if (regionIndex !== -1) { + regionList.select(regionIndex); + } + } + riotIdInput.focus(); riotIdInput.key('enter', () => { + const riotId = riotIdInput.getValue(); + const detectedRegion = detectRegionFromRiotId(riotId); + if (detectedRegion) { + const regionIndex = REGIONS.indexOf(detectedRegion); + if (regionIndex !== -1) { + regionList.select(regionIndex); + autoDetectStatus.setContent(`(Auto: ${detectedRegion})`); + screen.render(); + } + } else { + autoDetectStatus.setContent(''); + screen.render(); + } regionList.focus(); }); diff --git a/src/ui.js b/src/ui.js index bd2e3c2..56cfed0 100644 --- a/src/ui.js +++ b/src/ui.js @@ -37,31 +37,30 @@ const formatSummary = (summoner, matches) => { const labels = ["Win Rate:", "Overall KDA:", "Most Played:", "Time Played:"]; const longestLabel = Math.max(...labels.map(l => l.length)); - return `{bold}{green-fg}Last ${matches.length} Games Summary:{/green-fg}{/bold}\n` + - `${labels[0].padEnd(longestLabel)} {bold}${winRate}%{/bold}\n` + + return `${labels[0].padEnd(longestLabel)} {bold}${winRate}%{/bold}\n` + `${labels[1].padEnd(longestLabel)} {bold}${overallKda}{/bold}\n` + `${labels[2].padEnd(longestLabel)} {bold}${mostPlayed}{/bold}\n` + `${labels[3].padEnd(longestLabel)} {bold}${timePlayed}{/bold}`; }; const colorizeRank = (rank) => { - if (!rank) return 'Unranked'; + if (!rank) return '{white-fg}Unranked{/white-fg}'; const tier = rank.split(' ')[0]; const colors = { - 'CHALLENGER': 'yellow-fg', - 'GRANDMASTER': 'red-fg', - 'MASTER': 'magenta-fg', - 'DIAMOND': 'cyan-fg', - 'EMERALD': 'green-fg', - 'PLATINUM': 'blue-fg', - 'GOLD': 'yellow-fg', - 'SILVER': 'white-fg', - 'BRONZE': '#CD7F32-fg', - 'IRON': 'grey-fg', - 'Unranked': 'white-fg' + 'CHALLENGER': '#f1fa8c', + 'GRANDMASTER': '#ff5555', + 'MASTER': '#ff79c6', + 'DIAMOND': '#8be9fd', + 'EMERALD': '#50fa7b', + 'PLATINUM': '#8be9fd', + 'GOLD': '#f1fa8c', + 'SILVER': '#f8f8f2', + 'BRONZE': '#cd7f32', + 'IRON': '#a9a9a9', + 'Unranked': '#f8f8f2' }; - const color = colors[tier] || 'white-fg'; - return `{${color}}${rank}{/${color}}`; + const color = colors[tier] || '#f8f8f2'; + return `{${color}-fg}${rank}{/${color}-fg}`; }; const padStringWithTags = (str, length) => { @@ -199,7 +198,82 @@ const createXAxis = (durationMinutes, width) => { }; +const formatRankedInfo = (rankedData) => { + const soloQueue = rankedData?.find(q => q.queueType === 'RANKED_SOLO_5x5'); + const flexQueue = rankedData?.find(q => q.queueType === 'RANKED_FLEX_SR'); + + const formatQueue = (queue, name) => { + if (!queue) { + return `{bold}${name}:{/bold} Unranked`; + } + const division = ['MASTER', 'GRANDMASTER', 'CHALLENGER'].includes(queue.tier) ? '' : ` ${queue.rank}`; + const colorizedRank = colorizeRank(`${queue.tier}${division}`); + const lp = `${queue.leaguePoints} LP`; + const wins = queue.wins; + const losses = queue.losses; + const winRate = (wins + losses) > 0 ? ((wins / (wins + losses)) * 100).toFixed(0) : '0'; + return `{bold}${name}:{/bold} ${colorizedRank} - ${lp}\n${wins}W ${losses}L (${winRate}%)`; + }; + + return formatQueue(soloQueue, 'Solo/Duo') + '\n\n' + formatQueue(flexQueue, 'Flex'); +}; + +const formatChampionStats = (matches, puuid) => { + const champStats = {}; + + matches.forEach(match => { + const participant = match.details.info.participants.find(p => p.puuid === puuid); + if (participant) { + const name = participant.championName; + if (!champStats[name]) { + champStats[name] = { games: 0, wins: 0, kills: 0, deaths: 0, assists: 0 }; + } + champStats[name].games++; + if (participant.win) champStats[name].wins++; + champStats[name].kills += participant.kills; + champStats[name].deaths += participant.deaths; + champStats[name].assists += participant.assists; + } + }); + + const sorted = Object.entries(champStats) + .sort((a, b) => b[1].games - a[1].games) + .slice(0, 5); + + if (sorted.length === 0) return 'No champion data available'; + + const header = 'Champion'.padEnd(14) + 'Games'.padEnd(7) + 'Win%'.padEnd(7) + 'KDA'; + const lines = sorted.map(([name, stats]) => { + const games = stats.games || 1; // Defensive check for division by zero + const winRate = ((stats.wins / games) * 100).toFixed(0) + '%'; + const avgK = (stats.kills / games).toFixed(1); + const avgD = (stats.deaths / games).toFixed(1); + const avgA = (stats.assists / games).toFixed(1); + const winColor = stats.wins / games >= 0.5 ? 'green' : 'red'; + return `${name.padEnd(14)}${String(stats.games).padEnd(7)}{${winColor}-fg}${winRate.padEnd(7)}{/${winColor}-fg}${avgK}/${avgD}/${avgA}`; + }); + + return `{bold}${header}{/bold}\n${lines.join('\n')}`; +}; + +const formatMasteryDisplay = (masteries, championMap) => { + if (!masteries || masteries.length === 0) return 'No mastery data available'; + + const lines = masteries.map((m, index) => { + const champName = championMap?.get(String(m.championId)) || `Champion ${m.championId}`; + const level = `Lvl ${m.championLevel}`; + const points = m.championPoints.toLocaleString() + ' pts'; + return `${(index + 1)}. ${champName.padEnd(14)} ${level.padEnd(6)} ${points}`; + }); + + return lines.join('\n'); +}; + module.exports = { formatSummary, formatMatchDetails, -}; \ No newline at end of file + formatRankedInfo, + formatChampionStats, + formatMasteryDisplay, + colorizeRank, +}; diff --git a/src/utils.js b/src/utils.js index a908d87..c10ffd1 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,12 +1,34 @@ const axios = require('axios'); const fs = require('fs'); const path = require('path'); +const os = require('os'); + +// Generic cache file reader with validation +const readCacheFile = (filePath, defaultValue, validator = () => true) => { + try { + if (fs.existsSync(filePath)) { + const data = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + if (validator(data)) return data; + } + } catch (e) { + // Corrupted cache, return default + } + return typeof defaultValue === 'function' ? defaultValue() : defaultValue; +}; const CACHE_FILE = path.resolve(__dirname, '../.item_cache.json'); + +// Per-account cache directories +const LOL_CLI_DIR = path.join(os.homedir(), '.lol-cli'); +const ACCOUNTS_DIR = path.join(LOL_CLI_DIR, 'accounts'); +const MONITORED_ACCOUNTS_FILE = path.join(LOL_CLI_DIR, 'monitored_accounts.json'); const CHAMPION_CACHE_FILE = path.resolve(__dirname, '../.champion_cache.json'); const SPELL_CACHE_FILE = path.resolve(__dirname, '../.spell_cache.json'); const RUNE_CACHE_FILE = path.resolve(__dirname, '../.rune_cache.json'); const QUEUE_CACHE_FILE = path.resolve(__dirname, '../.queue_cache.json'); +const LAST_SEARCH_FILE = process.pkg + ? path.resolve(path.dirname(process.execPath), '.last_search.json') + : path.resolve(__dirname, '../.last_search.json'); const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours const getLatestVersion = async () => { @@ -84,10 +106,242 @@ const getItemData = async () => { return itemData; }; +const getLastSearch = () => { + try { + if (fs.existsSync(LAST_SEARCH_FILE)) { + return JSON.parse(fs.readFileSync(LAST_SEARCH_FILE, 'utf-8')); + } + } catch (error) { + return null; + } + return null; +}; + +const saveLastSearch = (riotId, region) => { + try { + fs.writeFileSync(LAST_SEARCH_FILE, JSON.stringify({ riotId, region })); + } catch (error) { + // Intentionally silent: saving search history is non-critical functionality. + // Failure should not interrupt the user's workflow. + } +}; + +const detectRegionFromRiotId = (riotId) => { + if (!riotId || !riotId.includes('#')) return null; + + const tagline = riotId.split('#')[1]?.toUpperCase(); + if (!tagline) return null; + + const taglineToRegion = { + 'NA': 'NA1', 'NA1': 'NA1', + 'EUW': 'EUW1', 'EUW1': 'EUW1', + 'EUNE': 'EUN1', 'EUN1': 'EUN1', + 'KR': 'KR', + 'JP': 'JP1', 'JP1': 'JP1', + 'BR': 'BR1', 'BR1': 'BR1', + 'LAN': 'LA1', 'LA1': 'LA1', + 'LAS': 'LA2', 'LA2': 'LA2', + 'OCE': 'OC1', 'OC1': 'OC1', + 'RU': 'RU', + 'TR': 'TR1', 'TR1': 'TR1', + }; + + return taglineToRegion[tagline] || null; +}; + +// Per-account cache functions +const ensureCacheDir = (puuid) => { + // Validate puuid to prevent directory traversal + if (!puuid || typeof puuid !== 'string' || /[\/\\]/.test(puuid)) { + throw new Error('Invalid puuid'); + } + const accountDir = path.join(ACCOUNTS_DIR, puuid); + if (!fs.existsSync(accountDir)) { + fs.mkdirSync(accountDir, { recursive: true }); + } + return accountDir; +}; + +const getMatchCache = (puuid) => { + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'matches.json'); + return readCacheFile( + cacheFile, + () => ({ version: 1, puuid, region: null, lastUpdated: null, matches: [] }), + (data) => data.version === 1 && data.puuid === puuid + ); +}; + +const saveMatchCache = (puuid, data) => { + try { + ensureCacheDir(puuid); + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'matches.json'); + data.version = 1; + data.puuid = puuid; + data.lastUpdated = new Date().toISOString(); + fs.writeFileSync(cacheFile, JSON.stringify(data, null, 2)); + } catch (error) { + // Silent fail - caching is non-critical + } +}; + +const getParticipantRankCache = (puuid) => { + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'participant_ranks.json'); + return readCacheFile( + cacheFile, + { version: 1, ranks: {} }, + (data) => data.version === 1 + ); +}; + +const saveParticipantRankCache = (puuid, data) => { + try { + ensureCacheDir(puuid); + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'participant_ranks.json'); + data.version = 1; + fs.writeFileSync(cacheFile, JSON.stringify(data, null, 2)); + } catch (error) { + // Silent fail - caching is non-critical + } +}; + +// Account data cache (summoner, ranked, masteries) for instant switching +const getAccountDataCache = (puuid) => { + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'account_data.json'); + return readCacheFile( + cacheFile, + null, + (data) => data.version === 1 && data.summoner + ); +}; + +const saveAccountDataCache = (puuid, data) => { + try { + ensureCacheDir(puuid); + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'account_data.json'); + const cacheData = { + version: 1, + summoner: data.summoner, + rankedData: data.rankedData, + topMasteries: data.topMasteries, + lastFetched: new Date().toISOString(), + }; + fs.writeFileSync(cacheFile, JSON.stringify(cacheData, null, 2)); + } catch (error) { + // Silent fail - caching is non-critical + } +}; + +// Monitored accounts functions +const ensureLolCliDir = () => { + if (!fs.existsSync(LOL_CLI_DIR)) { + fs.mkdirSync(LOL_CLI_DIR, { recursive: true }); + } +}; + +const getMonitoredAccounts = () => { + return readCacheFile( + MONITORED_ACCOUNTS_FILE, + { version: 1, activeIndex: 0, accounts: [] }, + (data) => data.version === 1 && Array.isArray(data.accounts) + ); +}; + +const saveMonitoredAccounts = (data) => { + try { + ensureLolCliDir(); + data.version = 1; + fs.writeFileSync(MONITORED_ACCOUNTS_FILE, JSON.stringify(data, null, 2)); + } catch (error) { + // Silent fail - non-critical + } +}; + +const addMonitoredAccount = (summoner, region, riotId) => { + const data = getMonitoredAccounts(); + const existingIndex = data.accounts.findIndex(a => a.puuid === summoner.puuid); + + const accountEntry = { + puuid: summoner.puuid, + riotId: riotId, + region: region, + summonerLevel: summoner.summonerLevel, + name: summoner.name, + addedAt: existingIndex >= 0 ? data.accounts[existingIndex].addedAt : new Date().toISOString(), + lastViewed: new Date().toISOString(), + }; + + if (existingIndex >= 0) { + // Update existing account + data.accounts[existingIndex] = accountEntry; + data.activeIndex = existingIndex; + } else { + // Add new account + data.accounts.push(accountEntry); + data.activeIndex = data.accounts.length - 1; + } + + saveMonitoredAccounts(data); + return data; +}; + +const removeMonitoredAccount = (puuid) => { + const data = getMonitoredAccounts(); + const index = data.accounts.findIndex(a => a.puuid === puuid); + + if (index >= 0) { + data.accounts.splice(index, 1); + // Adjust activeIndex if needed + if (data.accounts.length === 0) { + data.activeIndex = 0; + } else if (data.activeIndex >= data.accounts.length) { + data.activeIndex = data.accounts.length - 1; + } else if (data.activeIndex > index) { + data.activeIndex--; + } + saveMonitoredAccounts(data); + + // Clean up orphaned cache files for this account + try { + const accountDir = path.join(ACCOUNTS_DIR, puuid); + if (fs.existsSync(accountDir)) { + fs.rmSync(accountDir, { recursive: true }); + } + } catch (e) { + // Silent fail - cleanup is non-critical + } + } + + return data; +}; + +const setActiveAccountIndex = (index) => { + const data = getMonitoredAccounts(); + if (index >= 0 && index < data.accounts.length) { + data.activeIndex = index; + data.accounts[index].lastViewed = new Date().toISOString(); + saveMonitoredAccounts(data); + } + return data; +}; + module.exports = { getItemData, getChampionData, getSummonerSpellData, getRuneData, getQueueData, + getLastSearch, + saveLastSearch, + detectRegionFromRiotId, + getMatchCache, + saveMatchCache, + getParticipantRankCache, + saveParticipantRankCache, + getAccountDataCache, + saveAccountDataCache, + getMonitoredAccounts, + saveMonitoredAccounts, + addMonitoredAccount, + removeMonitoredAccount, + setActiveAccountIndex, }; From f8605ba854c33bac62662e815f2d82c43c82d931 Mon Sep 17 00:00:00 2001 From: mderouet Date: Fri, 16 Jan 2026 22:17:31 +0100 Subject: [PATCH 2/5] feat(ui): highlight selected account in cyan for better visibility The account list now uses cyan color for the selected account instead of just a > marker, making it easier to identify the active account. --- src/resultsTui.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/resultsTui.js b/src/resultsTui.js index fde19a9..b6a050b 100644 --- a/src/resultsTui.js +++ b/src/resultsTui.js @@ -220,8 +220,11 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas if (name.length > 12) name = name.substring(0, 11) + '~'; // Shorten region display const regionShort = acc.region.replace(/1$/, ''); - const marker = idx === currentAccountIndex ? '>' : ' '; - return `${marker}${name} (${regionShort})`; + const display = `${name} (${regionShort})`; + if (idx === currentAccountIndex) { + return `{cyan-fg}>${display}{/cyan-fg}`; // Selected: cyan with > + } + return ` ${display}`; // Unselected: default yellow, space padding }); return `Accounts: ${parts.join(' | ')}`; }; From e1ad6d7b23a5c2fdd6a5aa430bb524d0700fd785 Mon Sep 17 00:00:00 2001 From: mderouet Date: Sun, 18 Jan 2026 11:57:31 +0100 Subject: [PATCH 3/5] fix(ui): border color now updates when toggling ranked-only mode Added clearPos() call to force blessed to redraw the match list border when switching between normal and ranked-only filter modes. --- src/resultsTui.js | 161 +++++++++++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 45 deletions(-) diff --git a/src/resultsTui.js b/src/resultsTui.js index b6a050b..68bebce 100644 --- a/src/resultsTui.js +++ b/src/resultsTui.js @@ -71,6 +71,13 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas return 'Other'; }; + // Ranked filter constants and helpers + const RANKED_QUEUE_IDS = [420, 440]; // Solo/Duo, Flex + + const isMatchRanked = (match) => { + return RANKED_QUEUE_IDS.includes(match.details.info.queueId); + }; + // Load participant rank cache from disk const diskRankCache = getParticipantRankCache(summoner.puuid); const RANK_TTL = 60 * 60 * 1000; // 1 hour in milliseconds @@ -406,12 +413,18 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas }, }); + let rankedOnly = false; // Filter state for ranked mode + const getFooterContent = (isExpanded) => { let content = ''; if (hasMultipleAccounts) { content += 'Tab: Switch | '; } - content += 'd: Remove | Backspace: Back | m: Mastery'; + // Filter indicator - highlight current state + content += rankedOnly + ? '{yellow-fg}r: All{/yellow-fg}' + : 'r: Ranked'; + content += ' | d: Remove | c: Connect | m: Mastery'; if (isExpanded) { content += ' | t: Timeline'; } @@ -435,6 +448,11 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas const expanded = {}; let listIndexMap = []; + const getFilteredMatches = () => { + if (!rankedOnly) return matches; + return matches.filter(isMatchRanked); + }; + const setPanelVisibility = (visible) => { rankedBox.hidden = !visible; liveGameBox.hidden = !visible; @@ -445,50 +463,79 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas matchList.height = visible ? 12 : '90%'; }; + const updatePanels = (filteredMatches) => { + summaryBox.setContent(formatSummary(summoner, filteredMatches)); + summaryBox.setLabel(` Last ${filteredMatches.length} Games `); + championStatsBox.setContent(formatChampionStats(filteredMatches, summoner.puuid)); + }; + const updateList = () => { const items = []; listIndexMap = []; let isAnyExpanded = false; - matches.forEach((match, index) => { - const participant = match.details.info.participants.find(p => p.puuid === summoner.puuid); - const queueId = match.details.info.queueId; - const queueDesc = queueMap.get(queueId) || ''; - const queueLabel = getShortQueueName(queueDesc, queueId).padEnd(10); - const role = (queueId === 1700 - ? 'Arena' - : (participant.teamPosition || participant.individualPosition || '')).padEnd(10); - const avgRank = matchRankCache[index] ? `Avg Rank: ${colorizeRank(matchRankCache[index].average)}`.padEnd(40) : ''.padEnd(40); - const gameDate = new Date(match.details.info.gameCreation).toLocaleDateString().padEnd(12); - let resultText; - if (!participant.win && match.details.info.gameDuration < 300) { - resultText = 'Remake'; - } else { - resultText = participant.win ? 'Win' : 'Loss'; - } - const paddedResult = resultText.padEnd(7); - const championName = participant.championName.padEnd(16); - const kda = `KDA: ${participant.kills}/${participant.deaths}/${participant.assists}`; - let coloredResult; - if (resultText === 'Win') { - coloredResult = `{green-fg}${paddedResult}{/green-fg}`; - } else if (resultText === 'Loss') { - coloredResult = `{red-fg}${paddedResult}{/red-fg}`; - } else { - coloredResult = `{grey-fg}${paddedResult}{/grey-fg}`; - } - const summary = `${gameDate}${coloredResult} - ${championName}${queueLabel}${role}${kda} ${avgRank}`; - items.push(summary); - listIndexMap.push(index); - - if (expanded[index]) { - isAnyExpanded = true; - const details = formatMatchDetails(match, summoner, itemMap, spellMap, runeMap, screen.width, matchRankCache[index]?.players); - details.split('\n').forEach(line => { - items.push(line); - listIndexMap.push(null); - }); - } - }); + + const displayMatches = getFilteredMatches(); + + // Handle empty state + if (displayMatches.length === 0) { + items.push('{gray-fg}No ranked games in last 10 matches{/gray-fg}'); + listIndexMap.push(null); + } else { + displayMatches.forEach((match) => { + const realIndex = matches.indexOf(match); // Map back to original index + const participant = match.details.info.participants.find(p => p.puuid === summoner.puuid); + const queueId = match.details.info.queueId; + const queueDesc = queueMap.get(queueId) || ''; + const queueLabel = getShortQueueName(queueDesc, queueId).padEnd(10); + const role = (queueId === 1700 + ? 'Arena' + : (participant.teamPosition || participant.individualPosition || '')).padEnd(10); + const avgRank = matchRankCache[realIndex] ? `Avg Rank: ${colorizeRank(matchRankCache[realIndex].average)}`.padEnd(40) : ''.padEnd(40); + const gameDate = new Date(match.details.info.gameCreation).toLocaleDateString().padEnd(12); + let resultText; + if (!participant.win && match.details.info.gameDuration < 300) { + resultText = 'Remake'; + } else { + resultText = participant.win ? 'Win' : 'Loss'; + } + const paddedResult = resultText.padEnd(7); + const championName = participant.championName.padEnd(16); + const kda = `KDA: ${participant.kills}/${participant.deaths}/${participant.assists}`; + let coloredResult; + if (resultText === 'Win') { + coloredResult = `{green-fg}${paddedResult}{/green-fg}`; + } else if (resultText === 'Loss') { + coloredResult = `{red-fg}${paddedResult}{/red-fg}`; + } else { + coloredResult = `{grey-fg}${paddedResult}{/grey-fg}`; + } + const summary = `${gameDate}${coloredResult} - ${championName}${queueLabel}${role}${kda} ${avgRank}`; + items.push(summary); + listIndexMap.push(realIndex); + + if (expanded[realIndex]) { + isAnyExpanded = true; + const details = formatMatchDetails(match, summoner, itemMap, spellMap, runeMap, screen.width, matchRankCache[realIndex]?.players); + details.split('\n').forEach(line => { + items.push(line); + listIndexMap.push(null); + }); + } + }); + } + + // Update label to show filter status + const count = displayMatches.length; + const total = matches.length; + const label = rankedOnly + ? ` Ranked Only - ${count}/${total} Games ` + : ` Match History - ${total} Games `; + matchList.setLabel(label); + + // Update border color to indicate filter state + matchList.style.border.fg = rankedOnly ? colors.yellow : colors.purple; + matchList.clearPos(); // Force blessed to redraw the entire element region + matchList.setItems(items); // Hide/show panels based on expansion state @@ -593,7 +640,27 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } }); + // r: Toggle ranked filter + screen.key('r', () => { + if (modalOpen) return; + // Toggle filter + rankedOnly = !rankedOnly; + + // Collapse any expanded matches (clean state) + Object.keys(expanded).forEach(key => { + expanded[key] = false; + }); + + // Update all UI components with filtered data + const filteredMatches = getFilteredMatches(); + updatePanels(filteredMatches); + updateList(); + + // Reset selection to top + matchList.select(0); + matchList.focus(); + }); // Save rank cache before exit const saveCacheAndExit = (result) => { @@ -614,16 +681,14 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas const isAnyExpanded = Object.values(expanded).some(v => v); if (isAnyExpanded) { - // Collapse all expanded matches first + // Collapse all expanded matches Object.keys(expanded).forEach(key => { expanded[key] = false; }); updateList(); screen.render(); - } else { - // No match expanded, go back to Search screen - saveCacheAndExit('BACK'); } + // No-op when nothing is expanded }); // Tab: Switch to next account @@ -640,6 +705,12 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: prevIndex }); }); + // c: Connect/add another account (go to search screen) + screen.key('c', () => { + if (modalOpen) return; + saveCacheAndExit('BACK'); + }); + // d: Remove current account from monitored list screen.key('d', () => { if (modalOpen) return; From ff7c375622db9a1c2a156a620182ca9fefeecaf0 Mon Sep 17 00:00:00 2001 From: mderouet Date: Wed, 21 Jan 2026 19:07:23 +0100 Subject: [PATCH 4/5] refactor: code cleanup and deduplication Code quality improvements following multi-account management feature: - Extract delay utility to utils.js (removes 3 duplicate definitions) - Remove unused refreshAllAccounts function (~35 lines of dead code) - Add fetchAndCacheRank helper to reduce duplication across rank fetching - Remove unused rankSuffix variable from ui.js - Add DEBUG guards to console.error statements for cleaner output --- src/index.js | 186 +++++++- src/resultsTui.js | 1102 ++++++++++++++++++++++++++++++++++++++++----- src/ui.js | 325 ++++++++++++- src/utils.js | 489 ++++++++++++++++++-- 4 files changed, 1925 insertions(+), 177 deletions(-) diff --git a/src/index.js b/src/index.js index f88530c..e3125c6 100755 --- a/src/index.js +++ b/src/index.js @@ -8,7 +8,7 @@ const { Command } = require('commander'); const blessed = require('blessed'); const { getSummonerDataByRiotId, getMatchHistory, getMatchDetails, getMatchTimeline, getRankedData, getTopChampionMasteries } = require('./api'); const { createSearchScreen } = require('./tui'); -const { getLastSearch, saveLastSearch, getMatchCache, saveMatchCache, getMonitoredAccounts, addMonitoredAccount, removeMonitoredAccount, setActiveAccountIndex, getAccountDataCache, saveAccountDataCache } = require('./utils'); +const { getLastSearch, saveLastSearch, getMatchCache, saveMatchCache, getMonitoredAccounts, addMonitoredAccount, removeMonitoredAccount, setActiveAccountIndex, getAccountDataCache, saveAccountDataCache, loadCachedAccountByRiotId, addRankSnapshot } = require('./utils'); const { createResultsScreen } = require('./resultsTui'); const { createLoadingScreen } = require('./loadingTui'); @@ -32,6 +32,8 @@ if (!program.args.length) { const matchCache = getMatchCache(puuid); const matches = matchCache.matches.map(m => ({ + matchId: m.matchId, + gameCreation: m.gameCreation, details: m.details, timeline: m.timeline, })); @@ -44,6 +46,87 @@ if (!program.args.length) { }; }; + // Lightweight refresh for background updates + // Fetches fresh mutable data + checks for new matches (additive) + const refreshAccountData = async (region, puuid) => { + // 1. Fetch fresh mutable data in parallel + // Use [] as fallback for array data to maintain consistent downstream handling + const [rankedData, topMasteries, matchHistory] = await Promise.all([ + getRankedData(region, puuid).catch(() => []), + getTopChampionMasteries(region, puuid, 5).catch(() => []), + getMatchHistory(region, puuid).catch(() => []), + ]); + + // 2. Check for new matches (additive) + let newMatches = []; + if (matchHistory) { + const matchCache = getMatchCache(puuid); + const cachedMatchIds = new Set(matchCache.matches.map(m => m.matchId)); + const newMatchIds = matchHistory.filter(id => !cachedMatchIds.has(id)); + + // Fetch details only for NEW matches (immutable data we don't have yet) + for (const matchId of newMatchIds) { + try { + const [matchDetails, matchTimeline] = await Promise.all([ + getMatchDetails(region, matchId), + getMatchTimeline(region, matchId).catch(() => null), // Timeline is optional + ]); + // Validate match data structure before adding + if (!matchDetails?.info?.gameCreation) { + continue; // Skip malformed match data + } + newMatches.push({ + matchId, + gameCreation: matchDetails.info.gameCreation, + details: matchDetails, + timeline: matchTimeline || null, // Fallback to null if timeline unavailable + }); + } catch (e) { + // Skip failed fetches - one match failure shouldn't break the refresh + if (process.env.DEBUG) { + console.error(`[DEBUG] Failed to fetch match ${matchId}:`, e.message); + } + } + } + + // 3. Add new matches to cache (preserving all existing cached matches) + if (newMatches.length > 0) { + const allMatches = [...newMatches, ...matchCache.matches]; + allMatches.sort((a, b) => b.gameCreation - a.gameCreation); + matchCache.matches = allMatches; + matchCache.region = region; + saveMatchCache(puuid, matchCache); + } + } + + // 4. Update account data cache with fresh mutable data + // Only update cache if we got actual data (not empty fallback from API failure) + const hasRankedData = rankedData.length > 0; + const hasMasteryData = topMasteries.length > 0; + if (hasRankedData || hasMasteryData) { + const accountCache = getAccountDataCache(puuid); + if (accountCache) { + saveAccountDataCache(puuid, { + summoner: accountCache.summoner, + rankedData: hasRankedData ? rankedData : accountCache.rankedData, + topMasteries: hasMasteryData ? topMasteries : accountCache.topMasteries, + }); + } + } + + // 5. Capture rank snapshot for historical tracking + if (hasRankedData) { + addRankSnapshot(puuid, rankedData); + } + + return { + rankedData, + topMasteries, + newMatches, + hasUpdates: hasRankedData || newMatches.length > 0, + }; + }; + // Helper function to load account data (full API fetch) const loadAccountData = async (region, riotId, screen, loading) => { loading.update(5, 'Fetching summoner data...'); @@ -53,7 +136,7 @@ if (!program.args.length) { const [rankedData, topMasteries, matchHistory] = await Promise.all([ getRankedData(region, summoner.puuid).catch(() => []), getTopChampionMasteries(region, summoner.puuid, 5).catch(() => []), - getMatchHistory(region, summoner.puuid), + getMatchHistory(region, summoner.puuid).catch(() => []), ]); const matchCache = getMatchCache(summoner.puuid); @@ -70,16 +153,25 @@ if (!program.args.length) { const matchId = newMatchIds[i]; loading.update(null, `Fetching new match ${i + 1}/${totalNewMatches}...`); - const [matchDetails, matchTimeline] = await Promise.all([ - getMatchDetails(region, matchId), - getMatchTimeline(region, matchId), - ]); - newMatches.push({ - matchId, - gameCreation: matchDetails.info.gameCreation, - details: matchDetails, - timeline: matchTimeline - }); + try { + const [matchDetails, matchTimeline] = await Promise.all([ + getMatchDetails(region, matchId), + getMatchTimeline(region, matchId).catch(() => null), // Timeline is optional + ]); + // Validate match data structure before adding + if (!matchDetails?.info?.gameCreation) { + continue; // Skip malformed match data + } + newMatches.push({ + matchId, + gameCreation: matchDetails.info.gameCreation, + details: matchDetails, + timeline: matchTimeline || null, // Fallback to null if timeline unavailable + }); + } catch (e) { + // Skip failed match fetches, continue with remaining matches + continue; + } const progress = 15 + (((i + 1) / totalNewMatches) * 85); loading.update(progress); @@ -94,6 +186,8 @@ if (!program.args.length) { saveMatchCache(summoner.puuid, matchCache); const matches = allCachedMatches.map(m => ({ + matchId: m.matchId, + gameCreation: m.gameCreation, details: m.details, timeline: m.timeline, })); @@ -101,6 +195,9 @@ if (!program.args.length) { // Save account data to cache for instant switching saveAccountDataCache(summoner.puuid, { summoner, rankedData, topMasteries }); + // Capture rank snapshot for historical tracking + addRankSnapshot(summoner.puuid, rankedData); + loading.update(100, 'All data loaded.'); return { summoner, matches, rankedData, topMasteries }; @@ -190,12 +287,16 @@ if (!program.args.length) { const cachedData = loadAccountDataFromCache(switchToPuuid); if (cachedData && cachedData.matches.length > 0) { // Use cached data - instant switch, no loading screen + // Note: currentAccountIndex is already set correctly from handleScreenResult or initial startup const monitoredData = getMonitoredAccounts(); - currentAccountIndex = monitoredData.activeIndex; + // Create closure to capture current puuid for refresh callback + const puuidForRefresh = switchToPuuid; const result = await createResultsScreen(cachedData.summoner, cachedData.matches, region, cachedData.rankedData, cachedData.topMasteries, { monitoredAccounts: monitoredData, currentAccountIndex, + refreshCallback: () => refreshAccountData(region, puuidForRefresh), + refreshAccountCallback: refreshAccountData, }); const handled = handleScreenResult(result); @@ -235,9 +336,13 @@ if (!program.args.length) { loading.destroy(); screen.destroy(); + // Create closure to capture puuid for refresh callbacks + const puuidForRefresh = summoner.puuid; const result = await createResultsScreen(summoner, matches, region, rankedData, topMasteries, { monitoredAccounts: monitoredData, currentAccountIndex, + refreshCallback: () => refreshAccountData(region, puuidForRefresh), + refreshAccountCallback: refreshAccountData, }); const handled = handleScreenResult(result); @@ -254,9 +359,58 @@ if (!program.args.length) { continue; } } catch (error) { - screen.destroy(); - console.error('\nError:', error.message); - break; + // Try to load from cache if API failed (offline mode) + const cachedData = loadCachedAccountByRiotId(riotId, region); + if (cachedData) { + loading.destroy(); + screen.destroy(); + + // Use cached data in offline mode + // Note: Don't overwrite currentAccountIndex - it's already set correctly + // from the previous iteration or initial startup + const monitoredData = getMonitoredAccounts(); + + // Find the puuid for this account for refresh callbacks + const offlineAccount = monitoredData.accounts.find( + a => a.riotId.toLowerCase() === riotId.toLowerCase() && a.region === region + ); + const offlinePuuid = offlineAccount?.puuid; + + const result = await createResultsScreen( + cachedData.summoner, + cachedData.matches, + region, + cachedData.rankedData, + cachedData.topMasteries, + { + monitoredAccounts: monitoredData, + currentAccountIndex, + // Pass refresh callbacks to allow recovery when connectivity returns + refreshCallback: offlinePuuid ? () => refreshAccountData(region, offlinePuuid) : null, + refreshAccountCallback: refreshAccountData, + isOffline: true, + } + ); + + const handled = handleScreenResult(result); + if (handled.action === 'EXIT') { + break; + } else if (handled.action === 'BACK') { + continue; + } else if (handled.action === 'SWITCH') { + currentAccountIndex = handled.accountIndex; + region = handled.region; + riotId = handled.riotId; + switchToPuuid = handled.puuid; + skipSearch = true; + continue; + } + } else { + // No cache available, show error + screen.destroy(); + console.error('\nError:', error.message); + break; + } } } }; diff --git a/src/resultsTui.js b/src/resultsTui.js index 68bebce..68a53db 100644 --- a/src/resultsTui.js +++ b/src/resultsTui.js @@ -1,10 +1,30 @@ const blessed = require('blessed'); -const { getRankedData, getChampionMastery, getLiveGame } = require('./api'); -const { formatSummary, formatMatchDetails, formatRankedInfo, formatChampionStats, formatMasteryDisplay, colorizeRank } = require('./ui'); -const { getItemData, getChampionData, getSummonerSpellData, getRuneData, getQueueData, getParticipantRankCache, saveParticipantRankCache } = require('./utils'); +const stringWidth = require('string-width'); +const { getRankedData, getChampionMastery, getLiveGame, getApiStats } = require('./api'); +const { formatSummary, formatMatchDetails, formatRankedInfo, formatChampionStats, formatMasteryDisplay, formatRankPreview, colorizeRank, formatLPGraph } = require('./ui'); +const { delay, getItemData, getChampionData, getSummonerSpellData, getRuneData, getQueueData, getParticipantRankCache, saveParticipantRankCache, getRankedOnlyPreference, setRankedOnlyPreference, getTimeScopePreference, setTimeScopePreference, cycleTimeScope, launchSpectate, getMonitoredAccounts, setActiveAccountIndex, getRankAtTime, getRankHistory } = require('./utils'); const { createMasteryScreen } = require('./masteryTui'); const { createTimelineScreen } = require('./timelineTui'); +// Pad string to target display width (handles full-width characters correctly) +const padEndByWidth = (str, targetWidth) => { + const currentWidth = stringWidth(str); + if (currentWidth >= targetWidth) return str; + return str + ' '.repeat(targetWidth - currentWidth); +}; + +// Truncate string by display width (handles CJK characters correctly) +const truncateByWidth = (str, maxWidth) => { + let width = 0; + let i = 0; + for (; i < str.length; i++) { + const charWidth = stringWidth(str[i]); + if (width + charWidth > maxWidth) break; + width += charWidth; + } + return i < str.length ? str.substring(0, i) + '~' : str; +}; + // Color scheme for consistency const colors = { bg: '#282a36', @@ -18,6 +38,10 @@ const colors = { yellow: '#f1fa8c', }; +// Track live game state for all monitored accounts (puuid -> { inGame: boolean }) +// Module-level to persist across account switches +const accountLiveGameState = new Map(); + const rankToScore = (rank) => { const tiers = { 'IRON': 0, 'BRONZE': 1, 'SILVER': 2, 'GOLD': 3, 'PLATINUM': 4, 'EMERALD': 5, 'DIAMOND': 6, 'MASTER': 7, 'GRANDMASTER': 8, 'CHALLENGER': 9 }; const divisions = { 'IV': 0, 'III': 1, 'II': 2, 'I': 3 }; @@ -39,7 +63,15 @@ const scoreToRank = (score) => { }; const createResultsScreen = async (summoner, matches, region, rankedData, topMasteries, options = {}) => { - const { monitoredAccounts = null, currentAccountIndex = 0 } = options; + const { monitoredAccounts = null, currentAccountIndex = 0, refreshCallback = null, refreshAccountCallback = null, isOffline: initialOffline = false } = options; + + // Track offline state - can change when connectivity recovers + let isOffline = initialOffline; + + // Make these mutable so background refresh can update them + let currentRankedData = rankedData; + let currentTopMasteries = topMasteries; + let currentMatches = matches; const totalAccounts = monitoredAccounts?.accounts?.length || 1; const hasMultipleAccounts = totalAccounts > 1; const itemData = await getItemData(); @@ -78,21 +110,103 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas return RANKED_QUEUE_IDS.includes(match.details.info.queueId); }; + // Time scope filter helpers + const isMatchInTimeScope = (match, scope) => { + if (scope === 'all' || scope === 'last10') return true; + const now = Date.now(); + const gameTime = match.details.info.gameCreation; + if (scope === 'daily') { + const startOfToday = new Date(); + startOfToday.setHours(0, 0, 0, 0); + return gameTime >= startOfToday.getTime(); + } + if (scope === 'weekly') return (now - gameTime) <= 7 * 24 * 60 * 60 * 1000; + return true; + }; + + // Filter LP snapshots by time scope (mirrors match filtering logic) + const filterSnapshotsByTimeScope = (snapshots, scope, matches) => { + if (!snapshots || snapshots.length === 0) return snapshots; + if (scope === 'all') return snapshots; + + if (scope === 'daily') { + const startOfToday = new Date(); + startOfToday.setHours(0, 0, 0, 0); + const startMs = startOfToday.getTime(); + return snapshots.filter(s => new Date(s.timestamp).getTime() >= startMs); + } + + if (scope === 'weekly') { + const weekAgo = Date.now() - (7 * 24 * 60 * 60 * 1000); + return snapshots.filter(s => new Date(s.timestamp).getTime() >= weekAgo); + } + + if (scope === 'last10') { + // Get oldest timestamp from last 10 ranked games + const rankedMatches = matches + .filter(m => [420, 440].includes(m.details?.info?.queueId)) + .slice(0, 10); + if (rankedMatches.length === 0) return []; + const oldestMatchTime = rankedMatches[rankedMatches.length - 1].details.info.gameCreation; + return snapshots.filter(s => new Date(s.timestamp).getTime() >= oldestMatchTime); + } + + return snapshots; + }; + + const getLPGraphLabel = (scope) => { + if (scope === 'daily') return ' LP Progression (Today) '; + if (scope === 'weekly') return ' LP Progression (7 Days) '; + if (scope === 'last10') return ' LP Progression (Last 10) '; + return ' LP Progression (Solo/Duo) '; + }; + + const getTimeScopeLabel = (scope, count) => { + if (scope === 'last10') return `Last ${Math.min(count, 10)} Games`; + if (scope === 'daily') return `Today - ${count} Games`; + if (scope === 'weekly') return `Last 7 Days - ${count} Games`; + return `${count} Games`; + }; + // Load participant rank cache from disk const diskRankCache = getParticipantRankCache(summoner.puuid); + // Ensure ranks object exists for later mutations + if (!diskRankCache.ranks) { + diskRankCache.ranks = {}; + } const RANK_TTL = 60 * 60 * 1000; // 1 hour in milliseconds const playerRankCache = {}; // Cache by PUUID (persists across matches) const matchRankCache = {}; // Cache computed match averages // Pre-populate playerRankCache from disk cache - Object.entries(diskRankCache.ranks).forEach(([puuid, data]) => { + const ranks = diskRankCache.ranks || {}; + Object.entries(ranks).forEach(([puuid, data]) => { playerRankCache[puuid] = data.rank; }); + // Pre-populate current user's rank from rankedData (used by Ranked box) + // This ensures Match Ranks panel shows same rank as Ranked box + if (rankedData && rankedData.length > 0) { + const soloQueue = rankedData.find(q => q.queueType === 'RANKED_SOLO_5x5'); + const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; + playerRankCache[summoner.puuid] = rankString; + diskRankCache.ranks[summoner.puuid] = { rank: rankString, fetchedAt: new Date().toISOString() }; + } + + // Helper to fetch and cache a player's rank (reduces duplication across fetch functions) + const fetchAndCacheRank = async (puuid) => { + const rankData = await getRankedData(region, puuid); + const soloQueue = rankData.find(q => q.queueType === 'RANKED_SOLO_5x5'); + const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; + playerRankCache[puuid] = rankString; + diskRankCache.ranks[puuid] = { rank: rankString, fetchedAt: new Date().toISOString() }; + return rankString; + }; + // Helper to compute match average from cached ranks const computeMatchAverage = (matchIndex) => { - const participants = matches[matchIndex].details.info.participants; + const participants = currentMatches[matchIndex].details.info.participants; const ranks = {}; let totalScore = 0; let rankedCount = 0; @@ -101,7 +215,7 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas for (const p of participants) { if (playerRankCache[p.puuid] !== undefined) { ranks[p.puuid] = playerRankCache[p.puuid]; - if (ranks[p.puuid] !== 'N/A') { + if (ranks[p.puuid] !== 'N/A' && ranks[p.puuid] !== 'Unranked') { totalScore += rankToScore(ranks[p.puuid]); rankedCount++; } @@ -110,35 +224,38 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } } - if (allCached) { + // Always store the computed average, even if partial + // This ensures UI shows something while waiting for fresh fetches + if (Object.keys(ranks).length > 0) { matchRankCache[matchIndex] = { players: ranks, - average: rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : 'N/A', + average: rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : '...', + complete: allCached, // Track if all ranks are fetched }; - return true; } - return false; + return allCached; }; // Pre-compute match averages from cached data - for (let i = 0; i < matches.length; i++) { + for (let i = 0; i < currentMatches.length; i++) { computeMatchAverage(i); } const fetchMatchRanks = async (matchIndex, skipDelay = false) => { - if (matchRankCache[matchIndex]) return; // Already fully cached + // Only skip if we have a complete cache + if (matchRankCache[matchIndex]?.complete) return; const ranks = {}; let totalScore = 0; let rankedCount = 0; - const participants = matches[matchIndex].details.info.participants; - const delay = ms => new Promise(res => setTimeout(res, ms)); + let hasFailures = false; + const participants = currentMatches[matchIndex].details.info.participants; for (const p of participants) { // Check PUUID cache first if (playerRankCache[p.puuid] !== undefined) { ranks[p.puuid] = playerRankCache[p.puuid]; - if (ranks[p.puuid] !== 'N/A') { + if (ranks[p.puuid] !== 'N/A' && ranks[p.puuid] !== 'Unranked') { totalScore += rankToScore(ranks[p.puuid]); rankedCount++; } @@ -146,26 +263,26 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } try { - const rankData = await getRankedData(region, p.puuid); - const soloQueue = rankData.find(q => q.queueType === 'RANKED_SOLO_5x5'); - const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; + const rankString = await fetchAndCacheRank(p.puuid); ranks[p.puuid] = rankString; - playerRankCache[p.puuid] = rankString; // Cache by PUUID - // Update disk cache - diskRankCache.ranks[p.puuid] = { rank: rankString, fetchedAt: new Date().toISOString() }; - totalScore += rankToScore(rankString); - rankedCount++; + if (rankString !== 'Unranked') { + totalScore += rankToScore(rankString); + rankedCount++; + } } catch (error) { - ranks[p.puuid] = 'N/A'; - playerRankCache[p.puuid] = 'N/A'; // Cache failures too - diskRankCache.ranks[p.puuid] = { rank: 'N/A', fetchedAt: new Date().toISOString() }; + if (process.env.DEBUG) { + console.error(`[FetchMatch] Failed to fetch rank for ${p.riotIdGameName || p.puuid.substring(0, 20)}:`, error.message || error); + } + ranks[p.puuid] = '...'; + hasFailures = true; } - if (!skipDelay) await delay(100); + if (!skipDelay) await delay(50); } matchRankCache[matchIndex] = { players: ranks, - average: rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : 'N/A', + average: rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : '...', + complete: !hasFailures, }; }; @@ -188,6 +305,10 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas return new Promise((resolve) => { let isScreenDestroyed = false; + let isRefreshing = false; + let refreshPromise = null; // Promise-based lock for background refresh + let liveGameTimer = null; // Timer for live game time updates + let currentLiveGameData = null; // Store for spectate functionality const screen = blessed.screen({ smartCSR: true, @@ -195,6 +316,10 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas fullUnicode: true, }); + // Warn if terminal is too small for optimal display + const MIN_HEIGHT = 45; + const isTerminalSmall = screen.height < MIN_HEIGHT; + const layout = blessed.box({ parent: screen, width: '100%', @@ -222,9 +347,9 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas if (!hasMultipleAccounts) return ''; const accounts = monitoredAccounts.accounts; const parts = accounts.map((acc, idx) => { - // Truncate name to 12 chars + // Truncate name to 12 display columns (handles CJK characters) let name = acc.riotId.split('#')[0]; - if (name.length > 12) name = name.substring(0, 11) + '~'; + if (stringWidth(name) > 12) name = truncateByWidth(name, 11); // Shorten region display const regionShort = acc.region.replace(/1$/, ''); const display = `${name} (${regionShort})`; @@ -247,7 +372,54 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas }, }); - // Row 1: Ranked Info (left) | Live Game (right) + // Refresh status indicator (left side, below header) + // Also shows terminal size warning if too small + const getInitialStatusContent = () => { + if (isTerminalSmall) return `{yellow-fg}Terminal too small (${screen.height} rows, need ${MIN_HEIGHT}){/yellow-fg}`; + if (isOffline) return '{yellow-fg}Offline Mode{/yellow-fg}'; + return ''; + }; + const refreshIndicator = blessed.text({ + parent: layout, + top: 1, + left: 1, + content: getInitialStatusContent(), + tags: true, + style: { + fg: colors.yellow, + }, + }); + + // API stats indicator (shows request count and rate limits) + const apiStatsIndicator = blessed.text({ + parent: layout, + top: 1, + left: 20, + content: '', + tags: true, + style: { + fg: colors.fg, + }, + }); + + // Update API stats display + const updateApiStatsDisplay = () => { + if (isScreenDestroyed) return; + const stats = getApiStats(); + let content = stats.pending > 0 ? `${stats.pending} pending` : ''; + apiStatsIndicator.setContent(content); + }; + + // Initial update and periodic refresh of API stats (every 2 seconds) + updateApiStatsDisplay(); + const apiStatsTimer = setInterval(() => { + if (!isScreenDestroyed) { + updateApiStatsDisplay(); + screen.render(); + } + }, 2000); + + // Row 1: Ranked Info (left) | LP Graph (right, when not in live game) const rankedBox = blessed.box({ parent: layout, width: '50%', @@ -266,14 +438,64 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } }); - const liveGameBox = blessed.box({ + // Load filter preferences early (needed for LP graph initial render) + let rankedOnly = getRankedOnlyPreference(); + let timeScope = getTimeScopePreference(); + + // LP Progression Graph (top right, visible when NOT in live game) + const rankHistory = getRankHistory(summoner.puuid); + const filteredSnapshots = filterSnapshotsByTimeScope( + rankHistory.snapshots, timeScope, currentMatches + ); + const lpGraphBox = blessed.box({ parent: layout, width: '50%', height: 9, top: 2, right: 0, + label: getLPGraphLabel(timeScope), + content: formatLPGraph(filteredSnapshots, 50, 7), + tags: true, + border: { + type: 'line', + fg: colors.purple, + }, + style: { + border: { fg: colors.purple } + } + }); + + // Live Game and Live Ranks panels - positioned at bottom, side by side + const liveGameBox = blessed.box({ + parent: layout, + width: '50%', + height: 15, + bottom: 1, // Above footer + left: 0, label: ' Live Game ', tags: true, + hidden: true, // Start hidden, show only when in game + border: { + type: 'line', + fg: colors.purple, + }, + style: { + border: { fg: colors.purple } + } + }); + + const liveRanksBox = blessed.box({ + parent: layout, + width: '50%', + height: 15, // 13 lines content + 2 for borders + bottom: 1, // Above footer + right: 0, + label: ' Live Ranks ', + tags: true, + hidden: true, // Start hidden, show only when in game + scrollable: true, + keys: true, + vi: true, border: { type: 'line', fg: colors.purple, @@ -290,8 +512,8 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas height: 9, top: 11, left: 0, - label: ` Last ${matches.length} Games `, - content: formatSummary(summoner, matches), + label: ` Last ${currentMatches.length} Games `, + content: formatSummary(summoner, currentMatches), tags: true, border: { type: 'line', @@ -328,7 +550,7 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas top: 20, left: 0, label: ' Champion Stats (Recent Games) ', - content: formatChampionStats(matches, summoner.puuid), + content: formatChampionStats(currentMatches, summoner.puuid), tags: true, border: { type: 'line', @@ -339,69 +561,313 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } }); + // Fetch ranks for all live game participants (uses cache when available) + const fetchLiveGameRanks = async (participants) => { + const ranks = {}; + for (const p of participants) { + // Check cache first + if (playerRankCache[p.puuid] !== undefined) { + ranks[p.puuid] = playerRankCache[p.puuid]; + continue; + } + try { + const rankString = await fetchAndCacheRank(p.puuid); + ranks[p.puuid] = rankString; + } catch (error) { + ranks[p.puuid] = '...'; + } + await delay(100); // Rate limit: 100ms between requests + } + return ranks; + }; + + // Format live game ranks display with team separation + const formatLiveRanks = (participants, ranks, currentPuuid, queueId) => { + const formatPlayer = (p) => { + // Get player name from riotId (format: "name#tag") + const rawName = p.riotId?.split('#')[0] || '???'; + const name = padEndByWidth(truncateByWidth(rawName, 10), 11); + + // Get champion name + const champName = padEndByWidth(truncateByWidth(championMap.get(String(p.championId)) || 'Unknown', 10), 11); + + // Get rank + const rank = ranks[p.puuid] || '...'; + + // Highlight current user + const prefix = p.puuid === currentPuuid ? '{cyan-fg}>{/cyan-fg}' : ' '; + + return `${prefix}${name} ${champName} ${colorizeRank(rank)}`; + }; + + // Handle Arena mode (8 solo players with teamId 1-8) + if (queueId === 1700) { + let content = '{purple-fg}Arena Players{/purple-fg}\n'; + content += participants.map(formatPlayer).join('\n'); + return content; + } + + // Standard 5v5 mode + const blueTeam = participants.filter(p => p.teamId === 100); + const redTeam = participants.filter(p => p.teamId === 200); + + let content = '{cyan-fg}Blue Team{/cyan-fg}\n'; + content += blueTeam.map(formatPlayer).join('\n'); + content += '\n{red-fg}Red Team{/red-fg}\n'; + content += redTeam.map(formatPlayer).join('\n'); + return content; + }; + + // Track if we've already fetched ranks for the current live game + let liveGameRanksFetched = false; + let currentLiveGameId = null; + let liveGameAvgRank = null; // Store computed average rank for live game + const checkLiveGame = async () => { - const liveGameData = await getLiveGame(region, summoner.puuid); + // Guard: Don't run if screen is destroyed + if (isScreenDestroyed) return; + + // Clear any existing live game timer before potentially creating a new one + if (liveGameTimer) { + clearInterval(liveGameTimer); + liveGameTimer = null; + } + + let liveGameData = null; + try { + liveGameData = await getLiveGame(region, summoner.puuid); + } catch (error) { + // API failed - hide live game panels gracefully + liveGameBox.hidden = true; + liveRanksBox.hidden = true; + // Restore match list height (15 is the correct height when no live game) + matchList.height = 15; + rankPreviewBox.height = 15; + // Show appropriate error message based on error type + if (error.code === 'ECONNREFUSED' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') { + refreshIndicator.setContent('{yellow-fg}Network error{/}'); + } else if (error.response?.status === 502 || error.response?.status === 503) { + refreshIndicator.setContent('{yellow-fg}API unavailable{/}'); + } else if (error.message?.toLowerCase().includes('apikey') || + error.message?.toLowerCase().includes('api key') || + error.response?.status === 403) { + refreshIndicator.setContent('{red-fg}API key invalid{/}'); + } + screen.render(); + return; // Exit gracefully + } + + // Guard: Check again after async operation + if (isScreenDestroyed) return; + + // Store for spectate functionality + currentLiveGameData = liveGameData; + if (liveGameData) { + liveGameBox.hidden = false; + liveRanksBox.hidden = false; + // Reduce match list height to make room for live panels at bottom + matchList.height = Math.max(6, screen.height - 29 - 16); + rankPreviewBox.height = Math.max(6, screen.height - 29 - 16); + const participant = liveGameData.participants.find(p => p.puuid === summoner.puuid); if (participant) { const championName = championMap.get(String(participant.championId)) || 'Unknown'; - + const spell1 = spellMap.get(String(participant.spell1Id)) || 'N/A'; const spell2 = spellMap.get(String(participant.spell2Id)) || 'N/A'; const keystone = runeMap.get(participant.perks.perkIds[0]) || 'N/A'; const secondaryTree = runeMap.get(participant.perks.perkSubStyle) || 'N/A'; - + const queueName = queueMap.get(liveGameData.gameQueueConfigId) || 'Unknown Queue'; - const role = liveGameData.gameQueueConfigId === 1700 - ? 'Arena' + const role = liveGameData.gameQueueConfigId === 1700 + ? 'Arena' : participant.teamPosition || participant.individualPosition || 'N/A'; const updateGameTime = () => { + // Guard: Don't update if screen is destroyed + if (isScreenDestroyed) return; + const startTime = new Date(liveGameData.gameStartTime); const now = new Date(); const diff = now - startTime; const minutes = Math.floor(diff / 60000); const seconds = Math.floor((diff % 60000) / 1000); const formattedTime = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; - + + const avgRankDisplay = liveGameAvgRank ? colorizeRank(liveGameAvgRank) : '...'; const content = ` Queue: ${queueName}\n` + ` Champion: ${championName}\n` + ` Role: ${role}\n` + ` Time: ${formattedTime}\n` + ` Spells: ${spell1}, ${spell2}\n` + ` Keystone: ${keystone}\n` + - ` Secondary: ${secondaryTree}`; + ` Secondary: ${secondaryTree}\n` + + ` Avg Rank: ${avgRankDisplay}`; liveGameBox.setContent(content); screen.render(); }; updateGameTime(); - const timer = setInterval(updateGameTime, 1000); + // Store timer reference for cleanup - no screen.on('destroy') here + liveGameTimer = setInterval(updateGameTime, 1000); + } + + // Fetch and display ranks for live game participants (only once per game) + if (currentLiveGameId !== liveGameData.gameId) { + currentLiveGameId = liveGameData.gameId; + liveGameRanksFetched = false; + liveGameAvgRank = null; // Reset average for new game + liveRanksBox.setContent(' Loading ranks...'); + screen.render(); + } + + if (!liveGameRanksFetched) { + liveGameRanksFetched = true; + const gameIdAtFetch = liveGameData.gameId; + const queueIdAtFetch = liveGameData.gameQueueConfigId; + // Fetch ranks in background (non-blocking) + fetchLiveGameRanks(liveGameData.participants).then((ranks) => { + // Guard against stale data: only update if still viewing same game + if (isScreenDestroyed || currentLiveGameId !== gameIdAtFetch) return; + + // Compute average rank (excluding Unranked and N/A) + let totalScore = 0; + let rankedCount = 0; + Object.values(ranks).forEach(rank => { + if (rank !== 'N/A' && rank !== 'Unranked') { + totalScore += rankToScore(rank); + rankedCount++; + } + }); + liveGameAvgRank = rankedCount > 0 ? scoreToRank(totalScore / rankedCount) : null; - screen.on('destroy', () => { - clearInterval(timer); + const content = formatLiveRanks(liveGameData.participants, ranks, summoner.puuid, queueIdAtFetch); + liveRanksBox.setContent(content); + screen.render(); + }).catch(() => { + if (isScreenDestroyed || currentLiveGameId !== gameIdAtFetch) return; + liveRanksBox.setContent(' Failed to load ranks'); + screen.render(); }); } + } else { + liveGameBox.hidden = true; + liveGameBox.setContent(''); + liveRanksBox.hidden = true; + liveRanksBox.setContent(''); + // Restore match list height when no live game + matchList.height = 15; + rankPreviewBox.height = 15; + // Reset live game tracking + currentLiveGameId = null; + liveGameRanksFetched = false; + liveGameAvgRank = null; + } + + // Track state for current account's game-end detection + const wasInGame = accountLiveGameState.get(summoner.puuid)?.inGame || false; + const isInGame = !!liveGameData; + accountLiveGameState.set(summoner.puuid, { inGame: isInGame }); + + // Current account's game just ended - trigger UI refresh + if (wasInGame && !isInGame && !modalOpen && !isRefreshing) { + // Don't await - let it run in background + runBackgroundRefresh().catch(() => {}); + } + + if (!isScreenDestroyed) { + // Update footer to show/hide spectate option + const isAnyExpanded = Object.values(expanded).some(v => v); + footer.setContent(getFooterContent(isAnyExpanded)); + screen.render(); + } + }; + + // Only check live game if not in offline mode + if (!isOffline) { + checkLiveGame(); + } + + // Check live game status for OTHER monitored accounts (not current) + // Detects when any OTHER account finishes a game and refreshes their cache + // Current account is handled by checkLiveGame() with state tracking + const checkAllAccountsLiveGame = async () => { + if (isScreenDestroyed || !refreshAccountCallback) return; + + const monitoredData = getMonitoredAccounts(); + const otherAccounts = monitoredData.accounts.filter(a => a.puuid !== summoner.puuid); + + // Check all accounts in parallel for faster response + const results = await Promise.allSettled( + otherAccounts.map(async (account) => { + const liveGame = await getLiveGame(account.region, account.puuid); + return { account, liveGame }; + }) + ); + + if (isScreenDestroyed) return; + + // Process results and trigger refreshes for accounts whose games ended + for (const result of results) { + if (result.status !== 'fulfilled') continue; + + const { account, liveGame } = result.value; + const wasInGame = accountLiveGameState.get(account.puuid)?.inGame || false; + const isInGame = !!liveGame; + + // Update state + accountLiveGameState.set(account.puuid, { inGame: isInGame }); + + // Game just ended for this OTHER account - refresh its cache silently + if (wasInGame && !isInGame) { + // Fire and forget - don't await to avoid blocking + refreshAccountCallback(account.region, account.puuid).catch(() => {}); + } } - screen.render(); }; - checkLiveGame(); + // Periodic live game check every 30 seconds (with guard) + // Checks ALL monitored accounts and detects game endings + // Skip in offline mode + const liveGameCheckInterval = isOffline ? null : setInterval(async () => { + if (!isScreenDestroyed) { + try { + // Check current account's live game for UI display + await checkLiveGame(); + // Check all accounts for game end detection + await checkAllAccountsLiveGame(); + } catch (error) { + // Rate limit or API error - hide panels to avoid stale data + currentLiveGameData = null; + liveGameBox.hidden = true; + liveGameBox.setContent(''); + liveRanksBox.hidden = true; + liveRanksBox.setContent(''); + // Show error hint to user + if (error.message?.includes('apikey') || error.message?.includes('API key')) { + refreshIndicator.setContent('{red-fg}API key invalid{/red-fg}'); + } + screen.render(); + } + } + }, 30000); const matchList = blessed.list({ parent: layout, - width: '100%', + width: '60%', top: 29, - bottom: 1, + height: 15, + left: 0, items: [], border: { type: 'line', fg: colors.purple, }, - label: ` Match History - ${matches.length} Games (Select to expand) `, + label: ` Match History - ${currentMatches.length} Games (Select to expand) `, mouse: true, keys: true, vi: true, @@ -413,20 +879,50 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas }, }); - let rankedOnly = false; // Filter state for ranked mode + // Rank preview panel (right side, 40% width) + const rankPreviewBox = blessed.box({ + parent: layout, + width: '40%', + top: 29, + height: 15, + right: 0, + label: ' Match Ranks ', + tags: true, + border: { + type: 'line', + fg: colors.purple, + }, + style: { + border: { fg: colors.purple }, + }, + }); + + // Preview panel update function + let updatePreviewPanel = null; // Will be defined after listIndexMap is created const getFooterContent = (isExpanded) => { let content = ''; if (hasMultipleAccounts) { content += 'Tab: Switch | '; } - // Filter indicator - highlight current state + // Ranked filter indicator - show current state content += rankedOnly - ? '{yellow-fg}r: All{/yellow-fg}' - : 'r: Ranked'; + ? '{yellow-fg}r: Ranked{/yellow-fg}' + : 'r: All'; + // Time scope indicator - show current state + if (!isExpanded) { + const currentLabels = { 'all': 'All', 'last10': 'Last 10', 'daily': 'Today', 'weekly': 'Week' }; + const isActive = timeScope !== 'all'; + content += isActive + ? ` | {yellow-fg}t: ${currentLabels[timeScope]}{/yellow-fg}` + : ` | t: ${currentLabels[timeScope]}`; + } content += ' | d: Remove | c: Connect | m: Mastery'; + if (currentLiveGameData && !isOffline) { + content += ' | {green-fg}s: Spectate{/green-fg}'; + } if (isExpanded) { - content += ' | t: Timeline'; + content += ' | b/backspace: Back | t: Timeline'; } content += ' | q: Quit'; return content; @@ -448,25 +944,141 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas const expanded = {}; let listIndexMap = []; + // Define updatePreviewPanel now that listIndexMap exists + updatePreviewPanel = () => { + const listIndex = matchList.selected; + let matchIndex = null; + + // Find actual match index (handle detail lines) + for (let i = listIndex; i >= 0; i--) { + if (listIndexMap[i] !== null && listIndexMap[i] !== undefined) { + matchIndex = listIndexMap[i]; + break; + } + } + + if (matchIndex === null) { + rankPreviewBox.setContent(''); + return; + } + + const match = currentMatches[matchIndex]; + const rankData = matchRankCache[matchIndex]?.players; + // Build map of historical ranks for all monitored accounts in this match + const historicalRanks = {}; + const monitoredPuuids = new Set(monitoredAccounts?.accounts?.map(a => a.puuid) || []); + if (match?.details?.info?.participants) { + for (const p of match.details.info.participants) { + if (monitoredPuuids.has(p.puuid)) { + const snapshot = getRankAtTime(p.puuid, match.details.info.gameCreation); + if (snapshot) { + historicalRanks[p.puuid] = snapshot; + } + } + } + } + + rankPreviewBox.setContent(formatRankPreview(match, rankData, summoner, historicalRanks)); + screen.render(); + }; + + // Hook navigation events for preview updates + matchList.key(['up', 'down', 'j', 'k', 'pageup', 'pagedown', 'home', 'end'], () => { + process.nextTick(updatePreviewPanel); + }); + + matchList.on('element click', () => { + process.nextTick(updatePreviewPanel); + }); + const getFilteredMatches = () => { - if (!rankedOnly) return matches; - return matches.filter(isMatchRanked); + let matches = currentMatches; + if (rankedOnly) matches = matches.filter(isMatchRanked); + if (timeScope === 'last10') { + matches = matches.slice(0, 10); + } else if (timeScope !== 'all') { + matches = matches.filter(m => isMatchInTimeScope(m, timeScope)); + } + return matches; }; const setPanelVisibility = (visible) => { rankedBox.hidden = !visible; - liveGameBox.hidden = !visible; summaryBox.hidden = !visible; - masteryBox.hidden = !visible; + masteryBox.hidden = !visible; // Mastery always follows panel visibility championStatsBox.hidden = !visible; + rankPreviewBox.hidden = !visible; matchList.top = visible ? 29 : 2; - matchList.height = visible ? 12 : '90%'; + matchList.width = visible ? '60%' : '100%'; // Full width when expanded + + // Handle live game panels, LP graph, and match list height + const isLiveGame = !!currentLiveGameData; + if (!visible) { + // When expanded, hide all top-right panels and use full height + liveGameBox.hidden = true; + liveRanksBox.hidden = true; + lpGraphBox.hidden = true; + matchList.height = '90%'; + } else { + // When collapsed, show LP graph always (top-right) and live panels when in game (bottom) + liveGameBox.hidden = !isLiveGame; + liveRanksBox.hidden = !isLiveGame; + lpGraphBox.hidden = false; // LP graph always visible (no layout conflict with live panels) + matchList.height = isLiveGame ? Math.max(6, screen.height - 29 - 16) : 15; + rankPreviewBox.height = isLiveGame ? Math.max(6, screen.height - 29 - 16) : 15; + } }; const updatePanels = (filteredMatches) => { summaryBox.setContent(formatSummary(summoner, filteredMatches)); - summaryBox.setLabel(` Last ${filteredMatches.length} Games `); championStatsBox.setContent(formatChampionStats(filteredMatches, summoner.puuid)); + + // Build filter label: combine ranked and time scope indicators + const count = filteredMatches.length; + let summaryLabel, statsLabel; + + if (rankedOnly && timeScope !== 'all') { + // Both filters active + const timePart = timeScope === 'last10' ? `Last ${Math.min(count, 10)}` : + timeScope === 'daily' ? 'Today' : 'Week'; + summaryLabel = ` Ranked + ${timePart} - ${count} Games `; + statsLabel = ` Ranked + ${timePart} Stats (${count} Games) `; + } else if (rankedOnly) { + summaryLabel = ` Ranked Only - ${count} Games `; + statsLabel = ` Ranked Stats (${count} Games) `; + } else if (timeScope !== 'all') { + summaryLabel = ` ${getTimeScopeLabel(timeScope, count)} `; + statsLabel = ` ${getTimeScopeLabel(timeScope, count)} Stats `; + } else { + summaryLabel = ` Last ${count} Games `; + statsLabel = ' Champion Stats (Recent Games) '; + } + + summaryBox.setLabel(summaryLabel); + championStatsBox.setLabel(statsLabel); + }; + + // Centralized border color update for filter states (ranked or time scope) + const updateAllBorderColors = () => { + if (isScreenDestroyed) return; + // Yellow border indicates ranked-only filter is active + const borderColor = rankedOnly ? colors.yellow : colors.purple; + + // Update all panel borders + rankedBox.style.border.fg = borderColor; + lpGraphBox.style.border.fg = borderColor; + liveGameBox.style.border.fg = borderColor; + liveRanksBox.style.border.fg = borderColor; + summaryBox.style.border.fg = borderColor; + masteryBox.style.border.fg = borderColor; + championStatsBox.style.border.fg = borderColor; + rankPreviewBox.style.border.fg = borderColor; + matchList.style.border.fg = borderColor; + + // Force full screen redraw - use alloc() to batch the redraw + // instead of calling clearPos() 9 times which causes flicker + screen.alloc(); + screen.render(); }; const updateList = () => { @@ -482,15 +1094,18 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas listIndexMap.push(null); } else { displayMatches.forEach((match) => { - const realIndex = matches.indexOf(match); // Map back to original index + const realIndex = currentMatches.indexOf(match); // Map back to current index const participant = match.details.info.participants.find(p => p.puuid === summoner.puuid); + if (!participant) return; // Skip malformed match data const queueId = match.details.info.queueId; const queueDesc = queueMap.get(queueId) || ''; const queueLabel = getShortQueueName(queueDesc, queueId).padEnd(10); - const role = (queueId === 1700 - ? 'Arena' - : (participant.teamPosition || participant.individualPosition || '')).padEnd(10); - const avgRank = matchRankCache[realIndex] ? `Avg Rank: ${colorizeRank(matchRankCache[realIndex].average)}`.padEnd(40) : ''.padEnd(40); + const roleMap = { TOP: 'TOP', JUNGLE: 'JGL', MIDDLE: 'MID', BOTTOM: 'BOT', UTILITY: 'SUP' }; + const rawRole = queueId === 1700 ? 'Arena' : (participant.teamPosition || participant.individualPosition || ''); + const role = (roleMap[rawRole] || rawRole).padEnd(6); + const avgRank = matchRankCache[realIndex] + ? `Avg: ${colorizeRank(matchRankCache[realIndex].average.padEnd(12))}` + : ''; const gameDate = new Date(match.details.info.gameCreation).toLocaleDateString().padEnd(12); let resultText; if (!participant.win && match.details.info.gameDuration < 300) { @@ -500,7 +1115,17 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } const paddedResult = resultText.padEnd(7); const championName = participant.championName.padEnd(16); - const kda = `KDA: ${participant.kills}/${participant.deaths}/${participant.assists}`; + const kdaValue = `${participant.kills}/${participant.deaths}/${participant.assists}`.padEnd(8); + const kdaRatio = (participant.kills + participant.assists) / Math.max(participant.deaths, 1); + let coloredKda; + if (kdaRatio >= 4.0) { + coloredKda = `{green-fg}${kdaValue}{/green-fg}`; + } else if (kdaRatio <= 1.5) { + coloredKda = `{red-fg}${kdaValue}{/red-fg}`; + } else { + coloredKda = kdaValue; + } + const kda = `KDA: ${coloredKda}`; let coloredResult; if (resultText === 'Win') { coloredResult = `{green-fg}${paddedResult}{/green-fg}`; @@ -509,7 +1134,8 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } else { coloredResult = `{grey-fg}${paddedResult}{/grey-fg}`; } - const summary = `${gameDate}${coloredResult} - ${championName}${queueLabel}${role}${kda} ${avgRank}`; + const rankDisplay = avgRank; + const summary = `${gameDate}${coloredResult} - ${championName}${queueLabel}${role}${kda} ${rankDisplay}`; items.push(summary); listIndexMap.push(realIndex); @@ -526,16 +1152,21 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas // Update label to show filter status const count = displayMatches.length; - const total = matches.length; - const label = rankedOnly - ? ` Ranked Only - ${count}/${total} Games ` - : ` Match History - ${total} Games `; + const total = currentMatches.length; + let label; + if (rankedOnly && timeScope !== 'all') { + const timePart = timeScope === 'last10' ? `Last ${Math.min(count, 10)}` : + timeScope === 'daily' ? 'Today' : 'Week'; + label = ` Ranked + ${timePart} - ${count}/${total} Games `; + } else if (rankedOnly) { + label = ` Ranked Only - ${count}/${total} Games `; + } else if (timeScope !== 'all') { + label = ` ${getTimeScopeLabel(timeScope, count)} (${count}/${total}) `; + } else { + label = ` Match History - ${total} Games `; + } matchList.setLabel(label); - // Update border color to indicate filter state - matchList.style.border.fg = rankedOnly ? colors.yellow : colors.purple; - matchList.clearPos(); // Force blessed to redraw the entire element region - matchList.setItems(items); // Hide/show panels based on expansion state @@ -551,8 +1182,8 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas const currentlySelected = matchList.selected; expanded[matchIndex] = !expanded[matchIndex]; - if (expanded[matchIndex] && !matchRankCache[matchIndex]) { - // Only show loading if not already preloaded + if (expanded[matchIndex] && !matchRankCache[matchIndex]?.complete) { + // Show ephemeral loading label const loading = blessed.box({ parent: screen, top: 'center', @@ -567,11 +1198,29 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas }); screen.render(); - try { - await fetchMatchRanks(matchIndex); - } finally { - loading.destroy(); - } + // Helper to destroy loading box safely + const destroyLoading = () => { + if (!isScreenDestroyed && !loading.destroyed) { + loading.destroy(); + screen.render(); + } + }; + + // Fallback timeout (2 seconds) in case fetch hangs + const loadingTimeout = setTimeout(destroyLoading, 2000); + + // Fetch ranks in background (don't await - non-blocking) + fetchMatchRanks(matchIndex).then(() => { + clearTimeout(loadingTimeout); + destroyLoading(); + if (isScreenDestroyed) return; + updateList(); + updatePreviewPanel(); + screen.render(); + }).catch(() => { + clearTimeout(loadingTimeout); + destroyLoading(); + }); } updateList(); @@ -592,7 +1241,7 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } if (matchIndex !== null) { - const match = matches[matchIndex]; + const match = currentMatches[matchIndex]; const participant = match.details.info.participants.find(p => p.puuid === summoner.puuid); const loading = blessed.box({ @@ -631,12 +1280,40 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas } if (matchIndex !== null && expanded[matchIndex]) { - const match = matches[matchIndex]; + // Match is expanded - show timeline + const match = currentMatches[matchIndex]; modalOpen = true; await createTimelineScreen(screen, match); modalOpen = false; screen.render(); matchList.focus(); + } else { + // No match expanded - toggle time scope filter + timeScope = cycleTimeScope(timeScope); + setTimeScopePreference(timeScope); + + // Collapse any expanded matches (clean state) + Object.keys(expanded).forEach(key => { + expanded[key] = false; + }); + + // Update LP graph with filtered snapshots + const updatedHistory = getRankHistory(summoner.puuid); + const filteredSnapshots = filterSnapshotsByTimeScope( + updatedHistory.snapshots, timeScope, currentMatches + ); + lpGraphBox.setLabel(getLPGraphLabel(timeScope)); + lpGraphBox.setContent(formatLPGraph(filteredSnapshots, 50, 7)); + + // Update all UI components with filtered data + const filteredMatches = getFilteredMatches(); + updatePanels(filteredMatches); + updateList(); + updateAllBorderColors(); + + // Reset selection to top + matchList.select(0); + matchList.focus(); } }); @@ -644,8 +1321,9 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas screen.key('r', () => { if (modalOpen) return; - // Toggle filter + // Toggle filter and persist to disk rankedOnly = !rankedOnly; + setRankedOnlyPreference(rankedOnly); // Collapse any expanded matches (clean state) Object.keys(expanded).forEach(key => { @@ -656,15 +1334,40 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas const filteredMatches = getFilteredMatches(); updatePanels(filteredMatches); updateList(); + updateAllBorderColors(); // Reset selection to top matchList.select(0); matchList.focus(); }); + // s: Launch spectate mode + screen.key('s', () => { + if (modalOpen) return; + if (!currentLiveGameData) return; // No live game to spectate + + const { gameId, observers } = currentLiveGameData; + if (!observers?.encryptionKey) return; + + launchSpectate(gameId, observers.encryptionKey, region); + }); + // Save rank cache before exit const saveCacheAndExit = (result) => { isScreenDestroyed = true; + + // Clear all timers to prevent race conditions + if (liveGameTimer) { + clearInterval(liveGameTimer); + liveGameTimer = null; + } + if (liveGameCheckInterval) { + clearInterval(liveGameCheckInterval); + } + if (apiStatsTimer) { + clearInterval(apiStatsTimer); + } + saveParticipantRankCache(summoner.puuid, diskRankCache); screen.destroy(); resolve(result); @@ -695,14 +1398,24 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas screen.key('tab', () => { if (modalOpen || !hasMultipleAccounts) return; const nextIndex = (currentAccountIndex + 1) % totalAccounts; - saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: nextIndex }); + // Use try-finally to ensure screen is destroyed even if setActiveAccountIndex fails + try { + setActiveAccountIndex(nextIndex); + } finally { + saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: nextIndex }); + } }); // Shift+Tab: Switch to previous account screen.key('S-tab', () => { if (modalOpen || !hasMultipleAccounts) return; const prevIndex = (currentAccountIndex - 1 + totalAccounts) % totalAccounts; - saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: prevIndex }); + // Use try-finally to ensure screen is destroyed even if setActiveAccountIndex fails + try { + setActiveAccountIndex(prevIndex); + } finally { + saveCacheAndExit({ action: 'SWITCH_ACCOUNT', accountIndex: prevIndex }); + } }); // c: Connect/add another account (go to search screen) @@ -754,6 +1467,7 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas confirmBox.destroy(); screen.render(); matchList.focus(); + accountLiveGameState.delete(summoner.puuid); // Clean up Map entry saveCacheAndExit({ action: 'REMOVE_ACCOUNT', puuid: summoner.puuid }); } else if (key.name === 'n' || key.name === 'escape') { screen.unkey(['y', 'n', 'escape'], confirmHandler); @@ -766,51 +1480,229 @@ const createResultsScreen = async (summoner, matches, region, rankedData, topMas screen.key(['y', 'n', 'escape'], confirmHandler); }); + // Background account data refresh function with async lock + const runBackgroundRefresh = async () => { + // Return existing promise if refresh already in progress (async lock) + if (refreshPromise) return refreshPromise; + if (!refreshCallback || isScreenDestroyed) return; + + isRefreshing = true; + refreshPromise = (async () => { + refreshIndicator.setContent('{yellow-fg}Refreshing...{/yellow-fg}'); + screen.render(); + + try { + const freshData = await refreshCallback(); + if (isScreenDestroyed) return; + + if (freshData.hasUpdates) { + // Update ranked box with fresh data + if (freshData.rankedData) { + currentRankedData = freshData.rankedData; + rankedBox.setContent(formatRankedInfo(currentRankedData)); + // Refresh LP graph with updated rank history (respecting current timeScope) + const updatedHistory = getRankHistory(summoner.puuid); + const filteredSnapshots = filterSnapshotsByTimeScope( + updatedHistory.snapshots, timeScope, currentMatches + ); + lpGraphBox.setLabel(getLPGraphLabel(timeScope)); + lpGraphBox.setContent(formatLPGraph(filteredSnapshots, 50, 7)); + } + + // Update masteries with fresh data + if (freshData.topMasteries) { + currentTopMasteries = freshData.topMasteries; + masteryBox.setContent(formatMasteryDisplay(currentTopMasteries, championMap)); + } + + // Add new matches to display (prepend to existing) + if (freshData.newMatches?.length > 0) { + const newMatchObjects = freshData.newMatches.map(m => ({ + details: m.details, + timeline: m.timeline, + })); + + // Shift indices in matchRankCache and expanded to account for prepended matches + const shiftAmount = newMatchObjects.length; + + // Shift matchRankCache indices + const shiftedRankCache = {}; + for (const [key, value] of Object.entries(matchRankCache)) { + shiftedRankCache[parseInt(key) + shiftAmount] = value; + } + for (const key of Object.keys(matchRankCache)) { + delete matchRankCache[key]; + } + Object.assign(matchRankCache, shiftedRankCache); + + // Shift expanded indices + const shiftedExpanded = {}; + for (const [key, value] of Object.entries(expanded)) { + shiftedExpanded[parseInt(key) + shiftAmount] = value; + } + for (const key of Object.keys(expanded)) { + delete expanded[key]; + } + Object.assign(expanded, shiftedExpanded); + + // Remember current selection to adjust after prepending + const currentSelection = matchList.selected; + + currentMatches = [...newMatchObjects, ...currentMatches]; + + // Recompute summary and champion stats with new matches + const filteredMatches = getFilteredMatches(); + updatePanels(filteredMatches); + updateList(); + + // Adjust selection to maintain user's view of the same match + // Account for new entries being prepended to the list + // Clamp to valid range to prevent out-of-bounds selection + if (currentSelection >= 0 && matchList.items.length > 0) { + const newIndex = Math.min(currentSelection + shiftAmount, matchList.items.length - 1); + matchList.select(Math.max(0, newIndex)); + } + + // Fetch ranks for new matches (indices 0 to shiftAmount-1) + let anyComputed = false; + for (let i = 0; i < shiftAmount; i++) { + // First try to compute from existing cache + if (computeMatchAverage(i)) { + anyComputed = true; + } else { + // If not all players cached, fetch ranks asynchronously + fetchMatchRanks(i, true).then(() => { + if (isScreenDestroyed) return; + updateList(); + updatePreviewPanel(); + screen.render(); + }).catch(() => {}); + } + } + // Refresh UI if any averages were computed from cache + if (anyComputed) { + updateList(); + updatePreviewPanel(); + screen.render(); + } + } + + // Also refresh live game state during background refresh + await checkLiveGame(); + + // Handle offline recovery - show special message when coming back online + if (isOffline) { + isOffline = false; + refreshIndicator.setContent('{green-fg}Back online!{/green-fg}'); + } else { + refreshIndicator.setContent('{green-fg}Updated!{/green-fg}'); + } + setTimeout(() => { + if (!isScreenDestroyed) { + refreshIndicator.setContent(''); + screen.render(); + } + }, 2000); + } else { + // Even without content updates, recover from offline mode if refresh succeeded + if (isOffline) { + isOffline = false; + refreshIndicator.setContent('{green-fg}Back online!{/green-fg}'); + setTimeout(() => { + if (!isScreenDestroyed) { + refreshIndicator.setContent(''); + screen.render(); + } + }, 2000); + } else { + refreshIndicator.setContent(''); + } + } + screen.render(); + } catch (error) { + // Clear live game state on refresh failure to avoid stale data + currentLiveGameData = null; + liveGameBox.hidden = true; + liveGameBox.setContent(''); + + if (!isScreenDestroyed) { + refreshIndicator.setContent('{red-fg}Refresh failed{/red-fg}'); + setTimeout(() => { + if (!isScreenDestroyed) { + refreshIndicator.setContent(''); + screen.render(); + } + }, 2000); + } + } finally { + isRefreshing = false; + refreshPromise = null; + } + })(); + + return refreshPromise; + }; + updateList(); + + // Apply filter states on initial load (ranked or time scope) + if (rankedOnly || timeScope !== 'all') { + const filteredMatches = getFilteredMatches(); + updatePanels(filteredMatches); + updateAllBorderColors(); + } + matchList.focus(); + process.nextTick(updatePreviewPanel); screen.render(); + // Auto-trigger account data refresh if callback provided (for cached account loading) + if (refreshCallback) { + setTimeout(runBackgroundRefresh, 300); + } + // Background rank refresh for stale data const refreshStaleRanks = async () => { const stalePuuids = getStalePlayerPuuids(); if (stalePuuids.length === 0) return; - const delay = ms => new Promise(res => setTimeout(res, ms)); - - for (const puuid of stalePuuids) { + for (let idx = 0; idx < stalePuuids.length; idx++) { + const puuid = stalePuuids[idx]; if (isScreenDestroyed) return; try { - const rankData = await getRankedData(region, puuid); - const soloQueue = rankData.find(q => q.queueType === 'RANKED_SOLO_5x5'); - const rankString = soloQueue ? `${soloQueue.tier} ${soloQueue.rank}` : 'Unranked'; - playerRankCache[puuid] = rankString; - diskRankCache.ranks[puuid] = { rank: rankString, fetchedAt: new Date().toISOString() }; + await fetchAndCacheRank(puuid); } catch (error) { - // On rate limit (429), stop background refresh entirely + if (process.env.DEBUG) { + console.error(`[BG Refresh] Failed to fetch rank for ${puuid.substring(0, 20)}:`, error.message || error); + } + // On rate limit (429), wait for reset and retry this puuid if (error.response?.status === 429) { - break; + const retryAfter = error.response?.headers?.['retry-after']; + const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : 30000; + await delay(Math.min(waitTime, 60000)); // Cap at 60s + idx--; // Retry this puuid + continue; } - // For other errors, mark as N/A and continue - playerRankCache[puuid] = 'N/A'; - diskRankCache.ranks[puuid] = { rank: 'N/A', fetchedAt: new Date().toISOString() }; } if (isScreenDestroyed) return; // After each fetch, try to compute any newly-completable match averages let anyNewComputed = false; - for (let i = 0; i < matches.length; i++) { - if (!matchRankCache[i] && computeMatchAverage(i)) { + for (let i = 0; i < currentMatches.length; i++) { + if (!matchRankCache[i] || !matchRankCache[i].complete) { + computeMatchAverage(i); anyNewComputed = true; } } if (anyNewComputed) { updateList(); + updatePreviewPanel(); screen.render(); } - await delay(200); // 200ms between requests (less aggressive than 100ms) + await delay(100); // 100ms between requests (10/second, safe margin for other API calls) } }; diff --git a/src/ui.js b/src/ui.js index 56cfed0..f68e778 100644 --- a/src/ui.js +++ b/src/ui.js @@ -1,5 +1,48 @@ const asciichart = require('asciichart'); +// Get display width of a string (CJK chars = 2 columns) +const getDisplayWidth = (str) => { + let width = 0; + for (const char of str) { + const code = char.charCodeAt(0); + // CJK characters and full-width forms take 2 columns + if ((code >= 0x4E00 && code <= 0x9FFF) || // CJK Unified Ideographs + (code >= 0xAC00 && code <= 0xD7AF) || // Hangul Syllables + (code >= 0xFF00 && code <= 0xFFEF) || // Full-width forms + (code >= 0x3000 && code <= 0x303F) || // CJK Punctuation + (code >= 0x3040 && code <= 0x309F) || // Hiragana + (code >= 0x30A0 && code <= 0x30FF)) { // Katakana + width += 2; + } else { + width += 1; + } + } + return width; +}; + +// Truncate string to fit within maxWidth display columns +const truncateToWidth = (str, maxWidth) => { + let width = 0; + let result = ''; + for (const char of str) { + const charWidth = getDisplayWidth(char); + if (width + charWidth > maxWidth) break; + result += char; + width += charWidth; + } + return result; +}; + +// Pad string to targetWidth display columns +const padToWidth = (str, targetWidth) => { + const currentWidth = getDisplayWidth(str); + const padding = Math.max(0, targetWidth - currentWidth); + return str + ' '.repeat(padding); +}; + +// Calculate KDA ratio for a participant +const calculateKdaRatio = (p) => (p.kills + p.assists) / Math.max(p.deaths, 1); + const formatSummary = (summoner, matches) => { if (matches.length === 0) { return `{bold}{green-fg}No recent games found.{/green-fg}{/bold}`; @@ -10,11 +53,17 @@ const formatSummary = (summoner, matches) => { let totalDeaths = 0; let totalAssists = 0; let totalDuration = 0; + let validGames = 0; const championCounts = {}; matches.forEach(match => { const participant = match.details.info.participants.find(p => p.puuid === summoner.puuid); if (participant) { + // Skip remakes - games under 5 minutes where player lost + const isRemake = !participant.win && match.details.info.gameDuration < 300; + if (isRemake) return; + + validGames++; if (participant.win) totalWins++; totalKills += participant.kills; totalDeaths += participant.deaths; @@ -24,23 +73,24 @@ const formatSummary = (summoner, matches) => { } }); - const winRate = ((totalWins / matches.length) * 100).toFixed(2); + const winRate = validGames > 0 ? ((totalWins / validGames) * 100).toFixed(2) : '0.00'; const overallKda = totalDeaths > 0 ? ((totalKills + totalAssists) / totalDeaths).toFixed(2) : 'Perfect'; const sortedChampions = Object.entries(championCounts).sort((a, b) => b[1] - a[1]); const mostPlayed = sortedChampions.slice(0, 3).map(([name, count]) => `${name} (${count})`).join(', '); - const hours = Math.floor(totalDuration / 3600); - const minutes = Math.floor((totalDuration % 3600) / 60); - const timePlayed = `${hours}h ${minutes}m`; + const avgDuration = validGames > 0 ? Math.floor(totalDuration / validGames) : 0; + const avgMinutes = Math.floor(avgDuration / 60); + const avgSeconds = avgDuration % 60; + const avgGameTime = `${avgMinutes}m ${avgSeconds}s`; - const labels = ["Win Rate:", "Overall KDA:", "Most Played:", "Time Played:"]; + const labels = ["Win Rate:", "Overall KDA:", "Most Played:", "Avg Game Time:"]; const longestLabel = Math.max(...labels.map(l => l.length)); return `${labels[0].padEnd(longestLabel)} {bold}${winRate}%{/bold}\n` + `${labels[1].padEnd(longestLabel)} {bold}${overallKda}{/bold}\n` + `${labels[2].padEnd(longestLabel)} {bold}${mostPlayed}{/bold}\n` + - `${labels[3].padEnd(longestLabel)} {bold}${timePlayed}{/bold}`; + `${labels[3].padEnd(longestLabel)} {bold}${avgGameTime}{/bold}`; }; const colorizeRank = (rank) => { @@ -148,19 +198,34 @@ const formatMatchDetails = (match, summoner, itemMap, spellMap, runeMap, termina let rankText = ''; if (rankData) { rankText = `{bold}Players:{/bold}\n`; - const team1 = match.details.info.participants.slice(0, 5); - const team2 = match.details.info.participants.slice(5, 10); + const allParticipants = match.details.info.participants; + const team1 = allParticipants.slice(0, 5); + const team2 = allParticipants.slice(5, 10); + + // Absolute thresholds for KDA highlighting + const greenThreshold = 4.0; + const redThreshold = 1.5; // Calculate the longest name for dynamic padding - const longestName = Math.max(...match.details.info.participants.map(p => `${p.riotIdGameName}#${p.riotIdTagline}`.length)); + const longestName = Math.max(...allParticipants.map(p => `${p.riotIdGameName}#${p.riotIdTagline}`.length)); const formatTeam = (team) => { return team.map(p => { - const rank = rankData[p.puuid] || 'Unranked'; + const rank = rankData[p.puuid] || '...'; const fullRiotId = `${p.riotIdGameName}#${p.riotIdTagline}`.padEnd(longestName + 2); const champion = p.championName.padEnd(16); - const kda = `${p.kills}/${p.deaths}/${p.assists}`.padEnd(12); - return `${fullRiotId} ${champion} ${kda} ${colorizeRank(rank)}`; + const kdaStr = `${p.kills}/${p.deaths}/${p.assists}`; + const playerKda = calculateKdaRatio(p); + // Color-code KDA: green for good performance, red for poor performance + let coloredKda; + if (playerKda >= greenThreshold) { + coloredKda = `{green-fg}${kdaStr.padEnd(12)}{/green-fg}`; + } else if (playerKda <= redThreshold) { + coloredKda = `{red-fg}${kdaStr.padEnd(12)}{/red-fg}`; + } else { + coloredKda = kdaStr.padEnd(12); + } + return `${fullRiotId} ${champion} ${coloredKda} ${colorizeRank(rank)}`; }).join('\n'); }; rankText += `{cyan-fg}Blue Team:{/cyan-fg}\n${formatTeam(team1)}\n`; @@ -224,6 +289,10 @@ const formatChampionStats = (matches, puuid) => { matches.forEach(match => { const participant = match.details.info.participants.find(p => p.puuid === puuid); if (participant) { + // Skip remakes - games under 5 minutes where player lost + const isRemake = !participant.win && match.details.info.gameDuration < 300; + if (isRemake) return; + const name = participant.championName; if (!champStats[name]) { champStats[name] = { games: 0, wins: 0, kills: 0, deaths: 0, assists: 0 }; @@ -269,11 +338,243 @@ const formatMasteryDisplay = (masteries, championMap) => { return lines.join('\n'); }; +const formatRankPreview = (match, rankData, summoner, historicalRanks = {}) => { + if (!match) return ''; + + const participants = match.details.info.participants; + const queueId = match.details.info.queueId; + const team1 = participants.filter(p => p.teamId === 100); + const team2 = participants.filter(p => p.teamId === 200); + + // Absolute thresholds for KDA highlighting + const greenThreshold = 4.0; + const redThreshold = 1.5; + + const roleMap = { TOP: 'TOP', JUNGLE: 'JGL', MIDDLE: 'MID', BOTTOM: 'BOT', UTILITY: 'SUP', ARENA: '---' }; + const formatPlayer = (p) => { + const isCurrentUser = p.puuid === summoner.puuid; + // Use historical rank for monitored accounts if available, otherwise use current rank + const playerHistoricalRank = historicalRanks[p.puuid]; + let rank; + if (playerHistoricalRank) { + rank = `${playerHistoricalRank.tier} ${playerHistoricalRank.rank}`; + } else { + rank = rankData?.[p.puuid] || '...'; + } + const rawName = p.riotIdGameName || p.summonerName || '???'; + const name = padToWidth(truncateToWidth(rawName, 10), 11); // 10 cols max, pad to 11 + const champ = padToWidth(truncateToWidth(p.championName, 8), 9); + const kdaStr = `${p.kills}/${p.deaths}/${p.assists}`; + const playerKda = calculateKdaRatio(p); + // Color-code KDA: green for good performance, red for poor performance + let coloredKda; + if (playerKda >= greenThreshold) { + coloredKda = `{green-fg}${kdaStr.padEnd(7)}{/green-fg}`; + } else if (playerKda <= redThreshold) { + coloredKda = `{red-fg}${kdaStr.padEnd(7)}{/red-fg}`; + } else { + coloredKda = kdaStr.padEnd(7); + } + const rawRole = queueId === 1700 ? 'ARENA' : (p.teamPosition || p.individualPosition || ''); + const role = roleMap[rawRole] || rawRole.substring(0, 3); + const prefix = isCurrentUser ? '>' : ' '; + const coloredRank = colorizeRank(rank); + return `${prefix}${name} ${role.padEnd(4)} ${champ} ${coloredKda} ${coloredRank}`; + }; + + let content = '{cyan-fg}Blue Team{/cyan-fg}\n'; + content += team1.map(formatPlayer).join('\n'); + content += '\n\n{red-fg}Red Team{/red-fg}\n'; + content += team2.map(formatPlayer).join('\n'); + + return content; +}; + +// Convert rank to absolute LP score for graph visualization +// IRON IV 0 LP = 0, SILVER I 50 LP = 1350, GOLD IV 0 LP = 1600 +const rankToAbsoluteLP = (tier, rank, lp) => { + const tiers = { 'IRON': 0, 'BRONZE': 1, 'SILVER': 2, 'GOLD': 3, 'PLATINUM': 4, 'EMERALD': 5, 'DIAMOND': 6, 'MASTER': 7, 'GRANDMASTER': 8, 'CHALLENGER': 9 }; + const divisions = { 'IV': 0, 'III': 1, 'II': 2, 'I': 3 }; + const tierScore = (tiers[tier] || 0) * 400; + const divisionScore = (divisions[rank] || 0) * 100; + return tierScore + divisionScore + (lp || 0); +}; + +// Convert absolute LP back to rank abbreviation (e.g., 1250 -> "G4 50") +const absoluteLPToRankAbbr = (absoluteLP) => { + const tiers = ['I', 'B', 'S', 'G', 'P', 'E', 'D', 'M', 'GM', 'C']; + const divisions = ['4', '3', '2', '1']; + + // Clamp to valid range + absoluteLP = Math.max(0, absoluteLP); + + const tierIndex = Math.min(Math.floor(absoluteLP / 400), 9); + const tierAbbr = tiers[tierIndex]; + + // Master+ tiers have no divisions - show tier + total LP + if (tierIndex >= 7) { + const lpInTier = absoluteLP - (tierIndex * 400); + return `${tierAbbr}${lpInTier}`; + } + + const lpInTier = absoluteLP % 400; + const divisionIndex = Math.min(Math.floor(lpInTier / 100), 3); + const divisionNum = divisions[divisionIndex]; + const lpInDivision = lpInTier % 100; + + return `${tierAbbr}${divisionNum} ${lpInDivision}`; +}; + +// Format LP progression graph from rank history snapshots +const formatLPGraph = (snapshots, width, height, queueType = 'RANKED_SOLO_5x5') => { + if (!snapshots || snapshots.length === 0) { + return 'No LP changes in this period'; + } + + // Filter for the specified queue type and sort by timestamp + const filtered = snapshots + .filter(s => s.queueType === queueType) + .sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp)); + + if (filtered.length === 0) { + return 'No ranked games found'; + } + + if (filtered.length === 1) { + const s = filtered[0]; + return `Current: ${s.tier} ${s.rank} ${s.leaguePoints} LP\n(Play more ranked games to see progression)`; + } + + // Convert snapshots to absolute LP values + const lpValues = filtered.map(s => rankToAbsoluteLP(s.tier, s.rank, s.leaguePoints)); + + // Resample data if we have more points than width allows + const graphWidth = Math.min(width - 10, 40); // Leave room for Y-axis labels + const data = lpValues.length > graphWidth ? resampleData(lpValues, graphWidth) : lpValues; + + // Generate the chart with empty Y-axis labels + const chartHeight = Math.min(height - 2, 5); // Leave room for W/L markers + const chart = asciichart.plot(data, { + height: chartHeight, + format: () => ' ' // 6 spaces to maintain alignment + }); + + // Get first and last rank labels + const firstLP = data[0]; + const lastLP = data[data.length - 1]; + const firstRankLabel = absoluteLPToRankAbbr(firstLP).padStart(6); + const lastRankLabel = ' ' + absoluteLPToRankAbbr(lastLP); + + // Parse chart lines and add inline rank labels + const chartLines = chart.split('\n'); + + // Find which row has the first data point (leftmost chart character after y-axis) + // and which row has the last data point (rightmost chart character) + let firstPointRow = -1; + let lastPointRow = -1; + const yAxisWidth = 7; // 6 chars for label + 1 separator space + + // Characters that mark actual data points (exclude │ which is just a connector) + // asciichart uses: ┐ ┘ ┌ └ ─ │ ╮ ╯ ╭ ╰ but │ only connects points vertically + const dataPointChars = /[┐┘┌└╮╯╭╰┼┤├─]/; + + // Determine trend direction to know where first data point should be + const isUpwardTrend = data[0] < data[data.length - 1]; + + // Find row with first data point (leftmost column, exclude vertical connectors) + if (isUpwardTrend) { + // First point is at bottom, iterate from bottom to top + for (let i = chartLines.length - 1; i >= 0; i--) { + const line = chartLines[i]; + if (line.length > yAxisWidth) { + const firstChar = line[yAxisWidth]; + if (firstChar && dataPointChars.test(firstChar)) { + firstPointRow = i; + break; + } + } + } + } else { + // First point is at top or same level, iterate from top to bottom + for (let i = 0; i < chartLines.length; i++) { + const line = chartLines[i]; + if (line.length > yAxisWidth) { + const firstChar = line[yAxisWidth]; + if (firstChar && dataPointChars.test(firstChar)) { + firstPointRow = i; + break; + } + } + } + } + + // Find row with last data point (rightmost column, exclude vertical connectors) + let maxCol = 0; + for (let i = 0; i < chartLines.length; i++) { + const line = chartLines[i]; + for (let j = line.length - 1; j >= yAxisWidth; j--) { + if (dataPointChars.test(line[j])) { + if (j > maxCol) { + maxCol = j; + lastPointRow = i; + } + break; + } + } + } + + // Add labels to the appropriate rows + const modifiedLines = chartLines.map((line, i) => { + let newLine = line; + if (i === firstPointRow) { + // Replace empty y-axis label with first rank + newLine = firstRankLabel + line.slice(6); + } + if (i === lastPointRow) { + // Append last rank label to the end + newLine = newLine + lastRankLabel; + } + return newLine; + }); + + const modifiedChart = modifiedLines.join('\n'); + + // Build win/loss markers line using blessed tags + // We need to align markers with the data points in the chart + let markers = ''; + const chartWidth = data.length; + + for (let i = 1; i < filtered.length && i < chartWidth; i++) { + const prev = filtered[i - 1]; + const curr = filtered[i]; + const prevLP = rankToAbsoluteLP(prev.tier, prev.rank, prev.leaguePoints); + const currLP = rankToAbsoluteLP(curr.tier, curr.rank, curr.leaguePoints); + + if (currLP > prevLP) { + markers += '{green-fg}W{/green-fg}'; + } else if (currLP < prevLP) { + markers += '{red-fg}L{/red-fg}'; + } else { + markers += '-'; + } + } + + // Add colored markers below the chart (aligned with data points) + // The chart has a Y-axis label taking ~8 chars, so we pad accordingly + const markerPadding = ' '.repeat(8); + const markerLine = markerPadding + markers; + + return modifiedChart + '\n' + markerLine; +}; + module.exports = { formatSummary, formatMatchDetails, formatRankedInfo, formatChampionStats, formatMasteryDisplay, + formatRankPreview, colorizeRank, + rankToAbsoluteLP, + formatLPGraph, }; diff --git a/src/utils.js b/src/utils.js index c10ffd1..e44b51c 100644 --- a/src/utils.js +++ b/src/utils.js @@ -3,6 +3,22 @@ const fs = require('fs'); const path = require('path'); const os = require('os'); +// Promise-based delay utility +const delay = ms => new Promise(res => setTimeout(res, ms)); + +// Atomic file write: write to temp file, then rename to target +// Uses unique temp filename to prevent race conditions between concurrent processes +const atomicWriteFileSync = (filePath, content) => { + const tempFile = `${filePath}.${process.pid}.${Date.now()}.tmp`; + try { + fs.writeFileSync(tempFile, content); + fs.renameSync(tempFile, filePath); + } finally { + // Clean up temp file if rename failed (file may or may not exist) + try { fs.unlinkSync(tempFile); } catch (e) { /* ignore - file may have been renamed successfully */ } + } +}; + // Generic cache file reader with validation const readCacheFile = (filePath, defaultValue, validator = () => true) => { try { @@ -30,80 +46,227 @@ const LAST_SEARCH_FILE = process.pkg ? path.resolve(path.dirname(process.execPath), '.last_search.json') : path.resolve(__dirname, '../.last_search.json'); const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours +const MAX_CACHED_MATCHES = 100; // Limit matches per account to prevent unbounded growth +const MAX_RANK_SNAPSHOTS = 500; // Limit rank history snapshots per account + +let cachedVersion = null; +let versionFetchedAt = 0; +const VERSION_TTL = 3600000; // 1 hour const getLatestVersion = async () => { + if (cachedVersion && Date.now() - versionFetchedAt < VERSION_TTL) { + return cachedVersion; + } const versionsResponse = await axios.get('https://ddragon.leagueoflegends.com/api/versions.json'); - return versionsResponse.data[0]; + cachedVersion = versionsResponse.data[0]; + versionFetchedAt = Date.now(); + return cachedVersion; }; const getChampionData = async () => { + // Check mtime BEFORE parsing JSON to avoid wasted CPU on stale cache + let cacheExists = false; + let cacheIsFresh = false; if (fs.existsSync(CHAMPION_CACHE_FILE)) { - const stats = fs.statSync(CHAMPION_CACHE_FILE); - if (new Date() - new Date(stats.mtime) < CACHE_DURATION) { + cacheExists = true; + try { + const stats = fs.statSync(CHAMPION_CACHE_FILE); + cacheIsFresh = (new Date() - stats.mtime) < CACHE_DURATION; + } catch (e) { + // Stat failed, treat as stale + } + } + + // If cache is fresh, parse and return + if (cacheIsFresh) { + try { return JSON.parse(fs.readFileSync(CHAMPION_CACHE_FILE, 'utf-8')); + } catch (e) { + // Parse failed, fetch fresh data + } + } + + // Try to fetch fresh data + try { + const latestVersion = await getLatestVersion(); + const response = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/champion.json`); + atomicWriteFileSync(CHAMPION_CACHE_FILE, JSON.stringify(response.data)); + return response.data; + } catch (error) { + // If fetch fails but we have cache (stale), parse and return as fallback + if (cacheExists) { + try { + return JSON.parse(fs.readFileSync(CHAMPION_CACHE_FILE, 'utf-8')); + } catch (e) { + // Both fetch and cache parse failed + } } + throw error; } - const latestVersion = await getLatestVersion(); - const response = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/champion.json`); - fs.writeFileSync(CHAMPION_CACHE_FILE, JSON.stringify(response.data)); - return response.data; }; const getSummonerSpellData = async () => { + // Check mtime BEFORE parsing JSON to avoid wasted CPU on stale cache + let cacheExists = false; + let cacheIsFresh = false; if (fs.existsSync(SPELL_CACHE_FILE)) { - const stats = fs.statSync(SPELL_CACHE_FILE); - if (new Date() - new Date(stats.mtime) < CACHE_DURATION) { + cacheExists = true; + try { + const stats = fs.statSync(SPELL_CACHE_FILE); + cacheIsFresh = (new Date() - stats.mtime) < CACHE_DURATION; + } catch (e) { + // Stat failed, treat as stale + } + } + + // If cache is fresh, parse and return + if (cacheIsFresh) { + try { return JSON.parse(fs.readFileSync(SPELL_CACHE_FILE, 'utf-8')); + } catch (e) { + // Parse failed, fetch fresh data } } - const latestVersion = await getLatestVersion(); - const response = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/summoner.json`); - fs.writeFileSync(SPELL_CACHE_FILE, JSON.stringify(response.data)); - return response.data; + + try { + const latestVersion = await getLatestVersion(); + const response = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/summoner.json`); + atomicWriteFileSync(SPELL_CACHE_FILE, JSON.stringify(response.data)); + return response.data; + } catch (error) { + // If fetch fails but we have cache (stale), parse and return as fallback + if (cacheExists) { + try { + return JSON.parse(fs.readFileSync(SPELL_CACHE_FILE, 'utf-8')); + } catch (e) { + // Both fetch and cache parse failed + } + } + throw error; + } }; const getRuneData = async () => { + // Check mtime BEFORE parsing JSON to avoid wasted CPU on stale cache + let cacheExists = false; + let cacheIsFresh = false; if (fs.existsSync(RUNE_CACHE_FILE)) { - const stats = fs.statSync(RUNE_CACHE_FILE); - if (new Date() - new Date(stats.mtime) < CACHE_DURATION) { + cacheExists = true; + try { + const stats = fs.statSync(RUNE_CACHE_FILE); + cacheIsFresh = (new Date() - stats.mtime) < CACHE_DURATION; + } catch (e) { + // Stat failed, treat as stale + } + } + + // If cache is fresh, parse and return + if (cacheIsFresh) { + try { return JSON.parse(fs.readFileSync(RUNE_CACHE_FILE, 'utf-8')); + } catch (e) { + // Parse failed, fetch fresh data } } - const latestVersion = await getLatestVersion(); - const response = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/runesReforged.json`); - fs.writeFileSync(RUNE_CACHE_FILE, JSON.stringify(response.data)); - return response.data; + + try { + const latestVersion = await getLatestVersion(); + const response = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/runesReforged.json`); + atomicWriteFileSync(RUNE_CACHE_FILE, JSON.stringify(response.data)); + return response.data; + } catch (error) { + // If fetch fails but we have cache (stale), parse and return as fallback + if (cacheExists) { + try { + return JSON.parse(fs.readFileSync(RUNE_CACHE_FILE, 'utf-8')); + } catch (e) { + // Both fetch and cache parse failed + } + } + throw error; + } }; const getQueueData = async () => { + // Check mtime BEFORE parsing JSON to avoid wasted CPU on stale cache + let cacheExists = false; + let cacheIsFresh = false; if (fs.existsSync(QUEUE_CACHE_FILE)) { - const stats = fs.statSync(QUEUE_CACHE_FILE); - if (new Date() - new Date(stats.mtime) < CACHE_DURATION) { + cacheExists = true; + try { + const stats = fs.statSync(QUEUE_CACHE_FILE); + cacheIsFresh = (new Date() - stats.mtime) < CACHE_DURATION; + } catch (e) { + // Stat failed, treat as stale + } + } + + // If cache is fresh, parse and return + if (cacheIsFresh) { + try { return JSON.parse(fs.readFileSync(QUEUE_CACHE_FILE, 'utf-8')); + } catch (e) { + // Parse failed, fetch fresh data } } - const response = await axios.get('https://static.developer.riotgames.com/docs/lol/queues.json'); - fs.writeFileSync(QUEUE_CACHE_FILE, JSON.stringify(response.data)); - return response.data; + + try { + const response = await axios.get('https://static.developer.riotgames.com/docs/lol/queues.json'); + atomicWriteFileSync(QUEUE_CACHE_FILE, JSON.stringify(response.data)); + return response.data; + } catch (error) { + // If fetch fails but we have cache (stale), parse and return as fallback + if (cacheExists) { + try { + return JSON.parse(fs.readFileSync(QUEUE_CACHE_FILE, 'utf-8')); + } catch (e) { + // Both fetch and cache parse failed + } + } + throw error; + } }; const getItemData = async () => { + // Check mtime BEFORE parsing JSON to avoid wasted CPU on stale cache + let cacheExists = false; + let cacheIsFresh = false; if (fs.existsSync(CACHE_FILE)) { - const stats = fs.statSync(CACHE_FILE); - const lastModified = new Date(stats.mtime); - if (new Date() - lastModified < CACHE_DURATION) { - const data = fs.readFileSync(CACHE_FILE, 'utf-8'); - return JSON.parse(data); + cacheExists = true; + try { + const stats = fs.statSync(CACHE_FILE); + cacheIsFresh = (new Date() - stats.mtime) < CACHE_DURATION; + } catch (e) { + // Stat failed, treat as stale } } - const latestVersion = await getLatestVersion(); - const itemResponse = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/item.json`); - const itemData = itemResponse.data; - - fs.writeFileSync(CACHE_FILE, JSON.stringify(itemData)); + // If cache is fresh, parse and return + if (cacheIsFresh) { + try { + return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8')); + } catch (e) { + // Parse failed, fetch fresh data + } + } - return itemData; + try { + const latestVersion = await getLatestVersion(); + const itemResponse = await axios.get(`https://ddragon.leagueoflegends.com/cdn/${latestVersion}/data/en_US/item.json`); + const itemData = itemResponse.data; + atomicWriteFileSync(CACHE_FILE, JSON.stringify(itemData)); + return itemData; + } catch (error) { + // If fetch fails but we have cache (stale), parse and return as fallback + if (cacheExists) { + try { + return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8')); + } catch (e) { + // Both fetch and cache parse failed + } + } + throw error; + } }; const getLastSearch = () => { @@ -119,7 +282,7 @@ const getLastSearch = () => { const saveLastSearch = (riotId, region) => { try { - fs.writeFileSync(LAST_SEARCH_FILE, JSON.stringify({ riotId, region })); + atomicWriteFileSync(LAST_SEARCH_FILE, JSON.stringify({ riotId, region })); } catch (error) { // Intentionally silent: saving search history is non-critical functionality. // Failure should not interrupt the user's workflow. @@ -167,7 +330,7 @@ const getMatchCache = (puuid) => { return readCacheFile( cacheFile, () => ({ version: 1, puuid, region: null, lastUpdated: null, matches: [] }), - (data) => data.version === 1 && data.puuid === puuid + (data) => data.version === 1 && data.puuid === puuid && Array.isArray(data.matches) ); }; @@ -178,7 +341,11 @@ const saveMatchCache = (puuid, data) => { data.version = 1; data.puuid = puuid; data.lastUpdated = new Date().toISOString(); - fs.writeFileSync(cacheFile, JSON.stringify(data, null, 2)); + // Limit cache size to prevent unbounded growth + if (data.matches && data.matches.length > MAX_CACHED_MATCHES) { + data.matches = data.matches.slice(0, MAX_CACHED_MATCHES); + } + atomicWriteFileSync(cacheFile, JSON.stringify(data, null, 2)); } catch (error) { // Silent fail - caching is non-critical } @@ -189,7 +356,7 @@ const getParticipantRankCache = (puuid) => { return readCacheFile( cacheFile, { version: 1, ranks: {} }, - (data) => data.version === 1 + (data) => data.version === 1 && data.ranks && typeof data.ranks === 'object' ); }; @@ -198,7 +365,7 @@ const saveParticipantRankCache = (puuid, data) => { ensureCacheDir(puuid); const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'participant_ranks.json'); data.version = 1; - fs.writeFileSync(cacheFile, JSON.stringify(data, null, 2)); + atomicWriteFileSync(cacheFile, JSON.stringify(data, null, 2)); } catch (error) { // Silent fail - caching is non-critical } @@ -225,7 +392,7 @@ const saveAccountDataCache = (puuid, data) => { topMasteries: data.topMasteries, lastFetched: new Date().toISOString(), }; - fs.writeFileSync(cacheFile, JSON.stringify(cacheData, null, 2)); + atomicWriteFileSync(cacheFile, JSON.stringify(cacheData, null, 2)); } catch (error) { // Silent fail - caching is non-critical } @@ -239,18 +406,32 @@ const ensureLolCliDir = () => { }; const getMonitoredAccounts = () => { - return readCacheFile( + const data = readCacheFile( MONITORED_ACCOUNTS_FILE, { version: 1, activeIndex: 0, accounts: [] }, - (data) => data.version === 1 && Array.isArray(data.accounts) + (d) => d.version === 1 && Array.isArray(d.accounts) ); + // Clamp activeIndex to valid range (handles manual editing or account removal) + const originalIndex = data.activeIndex; + if (data.accounts.length === 0) { + data.activeIndex = 0; + } else if (data.activeIndex >= data.accounts.length) { + data.activeIndex = data.accounts.length - 1; + } else if (data.activeIndex < 0) { + data.activeIndex = 0; + } + // Persist corrected index to disk if it was clamped + if (data.activeIndex !== originalIndex) { + saveMonitoredAccounts(data); + } + return data; }; const saveMonitoredAccounts = (data) => { try { ensureLolCliDir(); data.version = 1; - fs.writeFileSync(MONITORED_ACCOUNTS_FILE, JSON.stringify(data, null, 2)); + atomicWriteFileSync(MONITORED_ACCOUNTS_FILE, JSON.stringify(data, null, 2)); } catch (error) { // Silent fail - non-critical } @@ -324,7 +505,216 @@ const setActiveAccountIndex = (index) => { return data; }; +// Get the rankedOnly preference (global setting) +const getRankedOnlyPreference = () => { + const data = getMonitoredAccounts(); + return data.rankedOnly || false; +}; + +// Save the rankedOnly preference +const setRankedOnlyPreference = (value) => { + const data = getMonitoredAccounts(); + data.rankedOnly = value; + saveMonitoredAccounts(data); +}; + +// Time scope filter constants and helpers +const TIME_SCOPES = ['all', 'last10', 'daily', 'weekly']; + +const getTimeScopePreference = () => { + const data = getMonitoredAccounts(); + return TIME_SCOPES.includes(data.timeScope) ? data.timeScope : 'all'; +}; + +const setTimeScopePreference = (value) => { + const data = getMonitoredAccounts(); + data.timeScope = TIME_SCOPES.includes(value) ? value : 'all'; + saveMonitoredAccounts(data); +}; + +const cycleTimeScope = (current) => { + const idx = TIME_SCOPES.indexOf(current); + return TIME_SCOPES[(idx + 1) % TIME_SCOPES.length]; +}; + +// Load cached account data by riotId (for offline mode) +const loadCachedAccountByRiotId = (riotId, region) => { + const monitored = getMonitoredAccounts(); + const account = monitored.accounts.find( + a => a.riotId.toLowerCase() === riotId.toLowerCase() && a.region === region + ); + if (!account) return null; + + const accountData = getAccountDataCache(account.puuid); + // Account data is required for offline mode (contains summoner info) + if (!accountData) { + return null; + } + + // Match cache is optional - we can still show account info without matches + const matchCache = getMatchCache(account.puuid); + const matches = matchCache?.matches || []; + + return { + summoner: accountData.summoner, + matches: matches, + rankedData: accountData.rankedData, + topMasteries: accountData.topMasteries, + isOffline: true + }; +}; + +// Rank history functions for LP progress tracking +const getRankHistory = (puuid) => { + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'rank_history.json'); + return readCacheFile( + cacheFile, + { version: 1, puuid, snapshots: [] }, + (data) => data.version === 1 && data.puuid === puuid && Array.isArray(data.snapshots) + ); +}; + +const saveRankHistory = (puuid, data) => { + try { + ensureCacheDir(puuid); + const cacheFile = path.join(ACCOUNTS_DIR, puuid, 'rank_history.json'); + data.version = 1; + data.puuid = puuid; + atomicWriteFileSync(cacheFile, JSON.stringify(data, null, 2)); + } catch (error) { + // Silent fail - caching is non-critical + } +}; + +const addRankSnapshot = (puuid, rankedData) => { + if (!rankedData || !Array.isArray(rankedData)) return; + + const history = getRankHistory(puuid); + const now = new Date().toISOString(); + + for (const queue of rankedData) { + if (!queue.queueType || !queue.tier) continue; + + // Find the most recent snapshot for this queue type + const lastSnapshot = history.snapshots + .filter(s => s.queueType === queue.queueType) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))[0]; + + // Only add snapshot if rank changed (tier, rank, or LP) + // Also prevent duplicate snapshots within 60 seconds (handles concurrent calls) + const recentThreshold = 60 * 1000; // 60 seconds + const isRecent = lastSnapshot && + (new Date(now).getTime() - new Date(lastSnapshot.timestamp).getTime()) < recentThreshold; + + const hasChanged = !lastSnapshot || + lastSnapshot.tier !== queue.tier || + lastSnapshot.rank !== queue.rank || + lastSnapshot.leaguePoints !== queue.leaguePoints; + + // Skip if identical data was added recently (deduplication for concurrent calls) + if (isRecent && !hasChanged) { + continue; + } + + if (hasChanged) { + history.snapshots.push({ + timestamp: now, + queueType: queue.queueType, + tier: queue.tier, + rank: queue.rank, + leaguePoints: queue.leaguePoints, + wins: queue.wins, + losses: queue.losses, + }); + } + } + + // Limit snapshot history to prevent unbounded growth + if (history.snapshots.length > MAX_RANK_SNAPSHOTS) { + // Sort by timestamp (oldest first) and keep only the most recent + history.snapshots.sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp)); + history.snapshots = history.snapshots.slice(-MAX_RANK_SNAPSHOTS); + } + + saveRankHistory(puuid, history); +}; + +const getRankAtTime = (puuid, timestamp, queueType = 'RANKED_SOLO_5x5') => { + const history = getRankHistory(puuid); + if (!history.snapshots || history.snapshots.length === 0) return null; + + // Filter snapshots for the specified queue type + const queueSnapshots = history.snapshots + .filter(s => s.queueType === queueType) + .sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp)); + + if (queueSnapshots.length === 0) return null; + + // Find the closest snapshot at or before the given timestamp + const targetTime = new Date(timestamp).getTime(); + let closestSnapshot = null; + + for (const snapshot of queueSnapshots) { + const snapshotTime = new Date(snapshot.timestamp).getTime(); + if (snapshotTime <= targetTime) { + closestSnapshot = snapshot; + } else { + break; + } + } + + // If no snapshot before this time, return the earliest snapshot + // (represents their rank before we started tracking) + if (!closestSnapshot && queueSnapshots.length > 0) { + closestSnapshot = queueSnapshots[0]; + } + + return closestSnapshot; +}; + +// Launch League of Legends spectator mode +const launchSpectate = (gameId, encryptionKey, region) => { + // Validate inputs to prevent shell injection + // gameId should be numeric (can be large, so use string pattern) + if (!/^\d+$/.test(String(gameId))) { + throw new Error('Invalid gameId: must be numeric'); + } + // encryptionKey should be alphanumeric with possible special chars used by Riot + if (!/^[a-zA-Z0-9/+=]+$/.test(encryptionKey)) { + throw new Error('Invalid encryptionKey: contains invalid characters'); + } + // region should match known LoL regions + const validRegions = ['NA1', 'EUW1', 'EUN1', 'KR', 'JP1', 'BR1', 'LA1', 'LA2', 'OC1', 'RU', 'TR1']; + if (!validRegions.includes(region.toUpperCase())) { + throw new Error('Invalid region'); + } + + const server = `spectator.${region.toLowerCase()}.lol.pvp.net:8080`; + + if (process.platform === 'darwin') { + // macOS - use the OP.GG command structure + const cmd = `if test -d /Applications/League\\ of\\ Legends.app/Contents/LoL/Game/ ; then ` + + `cd /Applications/League\\ of\\ Legends.app/Contents/LoL/Game/ && ` + + `chmod +x ./LeagueofLegends.app/Contents/MacOS/LeagueofLegends ; else ` + + `cd /Applications/League\\ of\\ Legends.app/Contents/LoL/RADS/solutions/lol_game_client_sln/releases/ && ` + + `cd $(ls -1vr -d */ | head -1) && cd deploy && ` + + `chmod +x ./LeagueofLegends.app/Contents/MacOS/LeagueofLegends ; fi && ` + + `riot_launched=true ./LeagueofLegends.app/Contents/MacOS/LeagueofLegends ` + + `"spectator ${server} ${encryptionKey} ${gameId} ${region}" "-UseRads" "-GameBaseDir=.."`; + + require('child_process').exec(cmd, (error) => { + if (error) console.error('Failed to launch spectate:', error.message); + }); + } else if (process.platform === 'win32') { + // Windows + const cmd = `"C:\\Riot Games\\League of Legends\\Game\\League of Legends.exe" ` + + `"spectator ${server} ${encryptionKey} ${gameId} ${region}"`; + require('child_process').exec(cmd); + } +}; + module.exports = { + delay, getItemData, getChampionData, getSummonerSpellData, @@ -344,4 +734,15 @@ module.exports = { addMonitoredAccount, removeMonitoredAccount, setActiveAccountIndex, + getRankedOnlyPreference, + setRankedOnlyPreference, + getTimeScopePreference, + setTimeScopePreference, + cycleTimeScope, + loadCachedAccountByRiotId, + launchSpectate, + getRankHistory, + saveRankHistory, + addRankSnapshot, + getRankAtTime, }; From b41d443126044471dc26fcacd7ce34b60739de91 Mon Sep 17 00:00:00 2001 From: mderouet Date: Wed, 21 Jan 2026 19:40:47 +0100 Subject: [PATCH 5/5] docs: add application screenshot --- docs/screenshot.png | Bin 0 -> 393585 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/screenshot.png diff --git a/docs/screenshot.png b/docs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a034129c85b0ee1959253c38a3a79107e2245a63 GIT binary patch literal 393585 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

BRd2v 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

  • @n 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

  • 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