A photo manager for VRChat.
1import { invoke } from "@tauri-apps/api/core"; 2import { WorldCache } from "../Structs/WorldCache"; 3import { listen } from "@tauri-apps/api/event"; 4 5export class WorldCacheManager{ 6 private _worldCache: WorldCache[] = []; 7 private _resolveWorld: ( world: WorldCache | null ) => void = () => {}; 8 9 constructor(){ 10 invoke('get_config_value_string', { key: 'worldcache' }) 11 .then((data: any) => { 12 if(data)this._worldCache = JSON.parse(data); 13 }) 14 15 listen('world_data', ( event: any ) => { 16 let worldData = { 17 expiresOn: Date.now() + 1.2096E+09, 18 worldData: { 19 id: event.payload.id, 20 name: event.payload.name, 21 author: event.payload.author, 22 authorId: event.payload.authorId, 23 desc: event.payload.desc, 24 img: event.payload.img, 25 maxUsers: event.payload.maxUsers, 26 visits: event.payload.visits, 27 favourites: event.payload.favourites, 28 tags: event.payload.tags, 29 from: event.payload.from, 30 fromSite: event.payload.fromSite, 31 found: event.payload.found 32 } 33 } 34 35 this._worldCache.push(worldData); 36 invoke('set_config_value_string', { key: 'worldcache', value: JSON.stringify(this._worldCache) }); 37 38 this._resolveWorld(worldData); 39 }) 40 } 41 42 getWorldById( id: string ): Promise<WorldCache | null>{ 43 let promise = new Promise<WorldCache | null>(( res ) => { this._resolveWorld = res }); 44 let worldData = this._worldCache.find(x => x.worldData.id === id); 45 46 if(!worldData){ 47 console.log('Fetching new world data'); 48 49 invoke('find_world_by_id', { worldId: id }); 50 } else if(worldData.expiresOn < Date.now()){ 51 console.log('Fetching new world data since cache has expired'); 52 53 this._worldCache = this._worldCache.filter(x => x.worldData.id !== id); 54 invoke('find_world_by_id', { worldId: id }); 55 } else{ 56 this._resolveWorld(worldData); 57 } 58 59 return promise; 60 } 61}