summaryrefslogtreecommitdiff
path: root/frontend/src/components/modals/filepicker/patches/library.ts
blob: c9c7d53c7fb0c69efec78ccdc728b01b675da9ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { Patch, findModuleChild, replacePatch } from 'decky-frontend-lib';

declare global {
  interface Window {
    SteamClient: any;
    appDetailsStore: any;
  }
}

let patch: Patch;

function rePatch() {
  // If you patch anything on SteamClient within the first few seconds of the client having loaded it will get redefined for some reason, so repatch any of these changes that occur within the first 20s of the last patch
  patch = replacePatch(window.SteamClient.Apps, 'PromptToChangeShortcut', async ([appid]: number[]) => {
    try {
      const details = window.appDetailsStore.GetAppDetails(appid);
      console.log(details);
      // strShortcutStartDir
      const file = await window.DeckyPluginLoader.openFilePicker(details.strShortcutStartDir.replaceAll('"', ''));
      console.log('user selected', file);
      window.SteamClient.Apps.SetShortcutExe(appid, JSON.stringify(file.path));
      const pathArr = file.path.split('/');
      pathArr.pop();
      const folder = pathArr.join('/');
      window.SteamClient.Apps.SetShortcutStartDir(appid, JSON.stringify(folder));
    } catch (e) {
      console.error(e);
    }
  });
}

// TODO type and add to frontend-lib
const History = findModuleChild((m) => {
  if (typeof m !== 'object') return undefined;
  for (let prop in m) {
    if (m[prop]?.m_history) return m[prop].m_history;
  }
});

export default async function libraryPatch() {
  try {
    rePatch();
    const unlisten = History.listen(() => {
      if (window.SteamClient.Apps.PromptToChangeShortcut !== patch.patchedFunction) {
        rePatch();
      }
    });

    return () => {
      patch.unpatch();
      unlisten();
    };
  } catch (e) {
    console.error('Error patching library file picker', e);
  }
  return () => {};
}