Frontend updates: caching basic data (json) from CDragon
Implement caching in the patch_detector, consume the cache from API routes in frontend
This commit is contained in:
@@ -1,18 +1,66 @@
|
||||
import { MongoClient } from 'mongodb'
|
||||
import { writeFile, mkdir } from 'fs/promises'
|
||||
import { existsSync } from 'fs'
|
||||
import { join } from 'path'
|
||||
|
||||
// CDragon base URL for specific patch
|
||||
const CDRAGON_BASE = 'https://raw.communitydragon.org/'
|
||||
|
||||
// Assets to cache for each patch
|
||||
const CDRAGON_ASSETS = [
|
||||
{
|
||||
name: 'items.json',
|
||||
path: 'plugins/rcp-be-lol-game-data/global/default/v1/items.json'
|
||||
},
|
||||
{
|
||||
name: 'perks.json',
|
||||
path: 'plugins/rcp-be-lol-game-data/global/default/v1/perks.json'
|
||||
},
|
||||
{
|
||||
name: 'perkstyles.json',
|
||||
path: 'plugins/rcp-be-lol-game-data/global/default/v1/perkstyles.json'
|
||||
},
|
||||
{
|
||||
name: 'summoner-spells.json',
|
||||
path: 'plugins/rcp-be-lol-game-data/global/default/v1/summoner-spells.json'
|
||||
},
|
||||
{
|
||||
name: 'champion-summary.json',
|
||||
path: 'plugins/rcp-be-lol-game-data/global/default/v1/champion-summary.json'
|
||||
}
|
||||
]
|
||||
|
||||
main()
|
||||
|
||||
async function main() {
|
||||
const client = await connectToDatabase()
|
||||
const newPatch = await fetchLatestPatch()
|
||||
// In dev mode, get patch from database (the one we have match data for)
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.log('Development mode: downloading cache for database patch')
|
||||
const client = await connectToDatabase()
|
||||
const dbPatch = await getLatestPatchFromDatabase(client)
|
||||
await client.close()
|
||||
|
||||
console.log('Latest patch is: ' + newPatch)
|
||||
|
||||
const newDate = new Date()
|
||||
if (!(await compareLatestSavedPatch(client, newPatch, newDate))) {
|
||||
downloadAssets()
|
||||
if (dbPatch) {
|
||||
console.log('Latest patch in database: ' + dbPatch)
|
||||
await downloadAssets(dbPatch)
|
||||
} else {
|
||||
console.log('No patch found in database, fetching latest from game...')
|
||||
const latestPatch = await fetchLatestPatch()
|
||||
console.log('Latest game patch: ' + latestPatch)
|
||||
await downloadAssets(latestPatch)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Production mode: check database and update if new patch
|
||||
const newPatch = await fetchLatestPatch()
|
||||
console.log('Latest patch is: ' + newPatch)
|
||||
|
||||
const client = await connectToDatabase()
|
||||
const newDate = new Date()
|
||||
if (!(await compareLatestSavedPatch(client, newPatch, newDate))) {
|
||||
await downloadAssets(newPatch)
|
||||
}
|
||||
await client.close()
|
||||
}
|
||||
|
||||
@@ -58,4 +106,66 @@ async function compareLatestSavedPatch(client: MongoClient, newPatch: string, ne
|
||||
return true
|
||||
}
|
||||
|
||||
async function downloadAssets() {}
|
||||
async function getLatestPatchFromDatabase(client: MongoClient): Promise<string | null> {
|
||||
const database = client.db('patches')
|
||||
const patches = database.collection('patches')
|
||||
const latestPatch = await patches.find().limit(1).sort({ date: -1 }).next()
|
||||
|
||||
if (latestPatch == null) {
|
||||
return null
|
||||
}
|
||||
|
||||
return latestPatch.patch
|
||||
}
|
||||
|
||||
async function downloadAssets(patch: string) {
|
||||
// Convert patch format for CDragon: "16.4.1" -> "16.4"
|
||||
// CDragon uses patch format without the last minor version
|
||||
const cdragonPatch = patch.split('.').slice(0, 2).join('.')
|
||||
console.log(`Downloading CDragon assets for patch ${cdragonPatch} (from ${patch})...`)
|
||||
|
||||
// Get cache directory from environment or use default
|
||||
const cacheDir = process.env.CDRAGON_CACHE_DIR || '/cdragon'
|
||||
const patchDir = join(cacheDir, cdragonPatch)
|
||||
|
||||
// Create patch directory if it doesn't exist
|
||||
if (!existsSync(patchDir)) {
|
||||
await mkdir(patchDir, { recursive: true })
|
||||
console.log(`Created directory: ${patchDir}`)
|
||||
}
|
||||
|
||||
// Download each asset
|
||||
for (const asset of CDRAGON_ASSETS) {
|
||||
const url = `${CDRAGON_BASE}${cdragonPatch}/${asset.path}`
|
||||
const filePath = join(patchDir, asset.name)
|
||||
|
||||
try {
|
||||
console.log(`Downloading ${asset.name}...`)
|
||||
const response = await fetch(url)
|
||||
|
||||
if (!response.ok) {
|
||||
console.error(`Failed to download ${asset.name}: ${response.status} ${response.statusText}`)
|
||||
continue
|
||||
}
|
||||
|
||||
const data = await response.json()
|
||||
await writeFile(filePath, JSON.stringify(data, null, 2))
|
||||
console.log(`Saved ${asset.name} to ${filePath}`)
|
||||
} catch (error) {
|
||||
console.error(`Error downloading ${asset.name}:`, error)
|
||||
}
|
||||
}
|
||||
|
||||
// Create a symlink or copy to 'latest' directory for easy access
|
||||
const latestDir = join(cacheDir, 'latest')
|
||||
const latestFile = join(latestDir, 'patch.txt')
|
||||
|
||||
if (!existsSync(latestDir)) {
|
||||
await mkdir(latestDir, { recursive: true })
|
||||
}
|
||||
|
||||
await writeFile(latestFile, patch)
|
||||
console.log(`Updated latest patch reference to ${patch}`)
|
||||
|
||||
console.log('CDragon assets download complete!')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user