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}