3 Commits

Author SHA1 Message Date
calli
499cb40d3a cache planets for one minute so we dont spam ESI 2025-11-09 22:54:56 +02:00
calli
470935fe9d update official instance url 2025-08-01 09:45:25 +03:00
calli
7ce238c9c7 increase batch from 5 to 50 2025-05-17 20:28:01 +03:00
3 changed files with 53 additions and 3 deletions

View File

@@ -4,7 +4,7 @@ Simple tool to track your PI planet extractors. Login with your characters and e
Any questions, feedback or suggestions are welcome at [EVE PI Discord](https://discord.gg/bCdXzU8PHK)
## [Avanto hosted PI tool](https://pi.avanto.tk)
## [Hosted PI tool](https://pi.calli.fi)
![Screenshot of PI tool](https://github.com/calli-eve/eve-pi/blob/main/images/eve-pi.png)
![3D render of a planet](https://github.com/calli-eve/eve-pi/blob/main/images/3dplanet.png)

View File

@@ -78,7 +78,7 @@ const Home = () => {
};
const refreshSession = async (characters: AccessToken[]) => {
return processInBatches(characters, 5, async (c) => {
return processInBatches(characters, 50, async (c) => {
try {
return await refreshToken(c);
} catch {
@@ -120,7 +120,7 @@ const Home = () => {
const initializeCharacterPlanets = (
characters: AccessToken[],
): Promise<AccessToken[]> =>
processInBatches(characters, 3, async (c) => {
processInBatches(characters, 50, async (c) => {
if (c.needsLogin || c.character === undefined)
return { ...c, planets: [] };
const planets = await getPlanets(c);

View File

@@ -22,10 +22,51 @@ export const getPlanets = async (character: AccessToken): Promise<Planet[]> => {
return planets;
};
interface CachedPlanetData {
data: PlanetInfo;
timestamp: number;
}
const CACHE_DURATION_MS = 60_000; // 1 minute
const CACHE_STORAGE_KEY = "planet_cache";
const loadCacheFromStorage = (): Map<string, CachedPlanetData> => {
try {
const stored = localStorage.getItem(CACHE_STORAGE_KEY);
if (stored) {
const parsed = JSON.parse(stored);
return new Map(Object.entries(parsed));
}
} catch (error) {
console.error("Failed to load planet cache from localStorage:", error);
}
return new Map();
};
const saveCacheToStorage = (cache: Map<string, CachedPlanetData>) => {
try {
const obj = Object.fromEntries(cache);
localStorage.setItem(CACHE_STORAGE_KEY, JSON.stringify(obj));
} catch (error) {
console.error("Failed to save planet cache to localStorage:", error);
}
};
const planetCache = loadCacheFromStorage();
export const getPlanet = async (
character: AccessToken,
planet: Planet,
): Promise<PlanetInfo> => {
const cacheKey = `${character.character.characterId}-${planet.planet_id}`;
const cached = planetCache.get(cacheKey);
if (cached && Date.now() - cached.timestamp < CACHE_DURATION_MS) {
console.log(`[Cache HIT] Planet ${planet.planet_id} for character ${character.character.characterId}`);
return cached.data;
}
console.log(`[Cache MISS] Fetching planet ${planet.planet_id} for character ${character.character.characterId}`);
const api = new Api();
const planetInfo = (
await api.v3.getCharactersCharacterIdPlanetsPlanetId(
@@ -36,6 +77,15 @@ export const getPlanet = async (
},
)
).data;
planetCache.set(cacheKey, {
data: planetInfo,
timestamp: Date.now(),
});
// Persist to localStorage
saveCacheToStorage(planetCache);
return planetInfo;
};