Skip to content

Commit 2d60f11

Browse files
committed
Make LibraryManagers and GameManagers actual classes
1 parent ffa5112 commit 2d60f11

File tree

31 files changed

+726
-784
lines changed

31 files changed

+726
-784
lines changed

src/backend/launcher.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,26 +53,23 @@ import shlex from 'shlex'
5353
import { isOnline } from './online_monitor'
5454
import { showDialogBoxModalAuto } from './dialog/dialog'
5555
import { legendarySetup } from './storeManagers/legendary/setup'
56-
import { gameManagerMap } from 'backend/storeManagers'
56+
import { gameManagerMap, libraryManagerMap } from 'backend/storeManagers'
5757
import * as VDF from '@node-steam/vdf'
5858
import { readFileSync, writeFileSync } from 'fs'
5959
import { LegendaryCommand } from './storeManagers/legendary/commands'
60-
import { commandToArgsArray } from './storeManagers/legendary/library'
6160
import { searchForExecutableOnPath } from './utils/os/path'
6261
import {
6362
createAbortController,
6463
deleteAbortController
6564
} from './utils/aborthandler/aborthandler'
6665
import { download, isInstalled } from './wine/runtimes/runtimes'
6766
import { storeMap } from 'common/utils'
68-
import { runWineCommandOnGame } from './storeManagers/legendary/games'
6967
import { getMainWindow } from './main_window'
7068
import { sendFrontendMessage } from './ipc'
7169
import { getUmuPath, isUmuSupported } from './utils/compatibility_layers'
7270
import { copyFile } from 'fs/promises'
7371
import { app, powerSaveBlocker } from 'electron'
7472
import gogPresence from './storeManagers/gog/presence'
75-
import { updateGOGPlaytime } from './storeManagers/gog/games'
7673
import { addRecentGame } from './recent_games/recent_games'
7774
import { tsStore } from './constants/key_value_stores'
7875
import {
@@ -265,7 +262,11 @@ const launchEventCallback: (args: LaunchParams) => StatusPromise = async ({
265262
const { disablePlaytimeSync } = GlobalConfig.get().getSettings()
266263
if (runner === 'gog') {
267264
if (!disablePlaytimeSync) {
268-
await updateGOGPlaytime(appName, startPlayingDate, finishedPlayingDate)
265+
await gameManagerMap['gog'].updateGOGPlaytime(
266+
appName,
267+
startPlayingDate,
268+
finishedPlayingDate
269+
)
269270
} else {
270271
logWarning(
271272
'Posting playtime session to server skipped - playtime sync disabled',
@@ -1002,7 +1003,9 @@ async function installFixes(appName: string, runner: Runner) {
10021003

10031004
for (const filePath of knownFixes.runInPrefix) {
10041005
const fullPath = join(gameInfo.install.install_path!, filePath)
1005-
await runWineCommandOnGame(appName, {
1006+
// FIXME: This doesn't seem right, shouldn't we use a generic function instead
1007+
// of the Legendary-specific one?
1008+
await gameManagerMap['legendary'].runWineCommandOnGame(appName, {
10061009
commandParts: [fullPath],
10071010
wait: true,
10081011
protonVerb: 'run'
@@ -1827,7 +1830,8 @@ function getRunnerCallWithoutCredentials(
18271830
env: Record<string, string> | NodeJS.ProcessEnv = {},
18281831
runnerPath: string
18291832
): string {
1830-
if (!Array.isArray(command)) command = commandToArgsArray(command)
1833+
if (!Array.isArray(command))
1834+
command = libraryManagerMap['legendary'].commandToArgsArray(command)
18311835

18321836
const modifiedCommand = [...command]
18331837
// Redact sensitive arguments (Authorization Code for Legendary, token for GOGDL)

src/backend/main.ts

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -95,28 +95,14 @@ import { getDefaultSavePath } from './save_sync'
9595
import { initTrayIcon } from './tray_icon/tray_icon'
9696
import { createMainWindow, getMainWindow, isFrameless } from './main_window'
9797

98-
import * as GOGLibraryManager from 'backend/storeManagers/gog/library'
99-
import {
100-
getCyberpunkMods,
101-
getBranchPassword,
102-
setBranchPassword,
103-
getGOGPlaytime,
104-
syncQueuedPlaytimeGOG
105-
} from 'backend/storeManagers/gog/games'
10698
import { playtimeSyncQueue } from './storeManagers/gog/electronStores'
107-
import * as LegendaryLibraryManager from 'backend/storeManagers/legendary/library'
10899
import {
109100
autoUpdate,
110101
gameManagerMap,
111102
initStoreManagers,
112103
libraryManagerMap
113104
} from './storeManagers'
114105
import { updateWineVersionInfos } from './wine/manager/utils'
115-
import { addNewApp } from './storeManagers/sideload/library'
116-
import {
117-
getGameOverride,
118-
getGameSdl
119-
} from 'backend/storeManagers/legendary/library'
120106
import { backendEvents } from './backend_events'
121107
import { configStore } from './constants/key_value_stores'
122108
import {
@@ -382,7 +368,7 @@ if (!gotTheLock) {
382368
// Make sure lock is not present when starting up
383369
playtimeSyncQueue.delete('lock')
384370
if (!settings.disablePlaytimeSync) {
385-
runOnceWhenOnline(syncQueuedPlaytimeGOG)
371+
runOnceWhenOnline(gameManagerMap['gog'].syncQueuedPlaytimeGOG)
386372
} else {
387373
logDebug('Skipping playtime sync queue upload - playtime sync disabled', {
388374
prefix: LogPrefix.Backend
@@ -665,8 +651,12 @@ addHandler('getMaxCpus', () => cpus().length)
665651

666652
addHandler('getHeroicVersion', app.getVersion)
667653
addHandler('isFullscreen', () => isSteamDeckGameMode || isCLIFullscreen)
668-
addHandler('getGameOverride', async () => getGameOverride())
669-
addHandler('getGameSdl', async (event, appName) => getGameSdl(appName))
654+
addHandler('getGameOverride', async () =>
655+
libraryManagerMap['legendary'].getGameOverride()
656+
)
657+
addHandler('getGameSdl', async (event, appName) =>
658+
libraryManagerMap['legendary'].getGameSdl(appName)
659+
)
670660

671661
addHandler('showUpdateSetting', () => !isFlatpak)
672662

@@ -714,7 +704,10 @@ addHandler('isGameAvailable', async (e, args) => {
714704

715705
addHandler('getGameInfo', async (event, appName, runner) => {
716706
// Fastpath since we sometimes have to request info for a GOG game as Legendary because we don't know it's a GOG game yet
717-
if (runner === 'legendary' && !LegendaryLibraryManager.hasGame(appName)) {
707+
if (
708+
runner === 'legendary' &&
709+
!libraryManagerMap['legendary'].hasGame(appName)
710+
) {
718711
return null
719712
}
720713
const tempGameInfo = gameManagerMap[runner].getGameInfo(appName)
@@ -729,7 +722,10 @@ addHandler('getGameInfo', async (event, appName, runner) => {
729722

730723
addHandler('getExtraInfo', async (event, appName, runner) => {
731724
// Fastpath since we sometimes have to request info for a GOG game as Legendary because we don't know it's a GOG game yet
732-
if (runner === 'legendary' && !LegendaryLibraryManager.hasGame(appName)) {
725+
if (
726+
runner === 'legendary' &&
727+
!libraryManagerMap['legendary'].hasGame(appName)
728+
) {
733729
return null
734730
}
735731
return gameManagerMap[runner].getExtraInfo(appName)
@@ -745,7 +741,7 @@ addHandler('getGameSettings', async (event, appName, runner) => {
745741
})
746742

747743
addHandler('getGOGLinuxInstallersLangs', async (event, appName) =>
748-
GOGLibraryManager.getLinuxInstallersLanguages(appName)
744+
libraryManagerMap['gog'].getLinuxInstallersLanguages(appName)
749745
)
750746

751747
addHandler(
@@ -807,7 +803,7 @@ addHandler('getAlternativeWine', async () =>
807803
addHandler('readConfig', async (event, configClass) => {
808804
if (configClass === 'library') {
809805
await libraryManagerMap['legendary'].refresh()
810-
return LegendaryLibraryManager.getListOfGames()
806+
return libraryManagerMap['legendary'].getListOfGames()
811807
}
812808
const userInfo = LegendaryUser.getUserInfo()
813809
return userInfo?.displayName ?? ''
@@ -864,7 +860,10 @@ if (existsSync(legendaryInstalled)) {
864860
// decode the JSON data. So instead of immediately calling LegendaryLibrary.get().refreshInstalled(), call it only after no writes happen
865861
// in a 500ms timespan
866862
if (watchTimeout) clearTimeout(watchTimeout)
867-
watchTimeout = setTimeout(LegendaryLibraryManager.refreshInstalled, 500)
863+
watchTimeout = setTimeout(
864+
libraryManagerMap['legendary'].refreshInstalled,
865+
500
866+
)
868867
})
869868
}
870869

@@ -1066,7 +1065,7 @@ addHandler('changeInstallPath', async (event, { appName, path, runner }) => {
10661065
})
10671066

10681067
addHandler('egsSync', async (event, args) => {
1069-
return LegendaryLibraryManager.toggleGamesSync(args)
1068+
return libraryManagerMap['legendary'].toggleGamesSync(args)
10701069
})
10711070

10721071
addHandler('syncGOGSaves', async (event, gogSaves, appName, arg) =>
@@ -1277,7 +1276,9 @@ addListener('setTitleBarOverlay', (e, args) => {
12771276
}
12781277
})
12791278

1280-
addListener('addNewApp', (e, args) => addNewApp(args))
1279+
addListener('addNewApp', (e, args) =>
1280+
libraryManagerMap['sideload'].addNewApp(args)
1281+
)
12811282

12821283
addHandler('isNative', (e, { appName, runner }) => {
12831284
return gameManagerMap[runner].isNative(appName)
@@ -1325,23 +1326,25 @@ addHandler(
13251326
return
13261327
}
13271328
if (runner === 'gog') {
1328-
return getGOGPlaytime(appName)
1329+
return gameManagerMap['gog'].getGOGPlaytime(appName)
13291330
}
13301331

13311332
return
13321333
}
13331334
)
13341335

13351336
addHandler('getPrivateBranchPassword', (e, appName) =>
1336-
getBranchPassword(appName)
1337+
gameManagerMap['gog'].getBranchPassword(appName)
13371338
)
13381339
addHandler('setPrivateBranchPassword', (e, appName, password) =>
1339-
setBranchPassword(appName, password)
1340+
gameManagerMap['gog'].setBranchPassword(appName, password)
13401341
)
13411342

1342-
addHandler('getAvailableCyberpunkMods', async () => getCyberpunkMods())
1343+
addHandler('getAvailableCyberpunkMods', async () =>
1344+
gameManagerMap['gog'].getCyberpunkMods()
1345+
)
13431346
addHandler('setCyberpunkModConfig', async (e, props) =>
1344-
GOGLibraryManager.setCyberpunkModConfig(props)
1347+
libraryManagerMap['gog'].setCyberpunkModConfig(props)
13451348
)
13461349

13471350
addListener('changeGameVersionPinnedStatus', (e, appName, runner, status) => {

src/backend/save_sync.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { InstalledInfo, Runner } from 'common/types'
22
import { GOGCloudSavesLocation, SaveFolderVariable } from 'common/types/gog'
33
import { getWinePath, setupWineEnvVars, verifyWinePrefix } from './launcher'
4-
import { runRunnerCommand as runLegendaryCommand } from 'backend/storeManagers/legendary/library'
5-
import { getSaveSyncLocation, readInfoFile } from './storeManagers/gog/library'
64
import { logDebug, LogPrefix, logInfo, logError, logWarning } from './logger'
75
import { getShellPath } from './utils'
86
import {
@@ -71,7 +69,7 @@ async function getDefaultLegendarySavePath(appName: string): Promise<string> {
7169
}
7270

7371
logInfo(['Computing default save path for', appName], LogPrefix.Legendary)
74-
await runLegendaryCommand(
72+
await libraryManagerMap['legendary'].runRunnerCommand(
7573
{
7674
subcommand: 'sync-saves',
7775
appName: LegendaryAppName.parse(appName),
@@ -113,7 +111,10 @@ async function getDefaultGogSavePaths(
113111
const gameSettings = await gameManagerMap['gog'].getSettings(appName)
114112
const installInfo = gameManagerMap['gog'].getGameInfo(appName)
115113
.install as InstalledInfo
116-
const gog_save_location = await getSaveSyncLocation(appName, installInfo)
114+
const gog_save_location = await libraryManagerMap['gog'].getSaveSyncLocation(
115+
appName,
116+
installInfo
117+
)
117118

118119
const { platform: installed_platform, install_path } = installInfo
119120
if (!gog_save_location || !install_path) {
@@ -128,7 +129,7 @@ async function getDefaultGogSavePaths(
128129

129130
// If no save locations are defined, assume the default
130131
if (!gog_save_location.length) {
131-
const clientId = readInfoFile(appName)?.clientId
132+
const clientId = libraryManagerMap['gog'].readInfoFile(appName)?.clientId
132133
gog_save_location.push({
133134
name: '__default',
134135
location:

src/backend/shortcuts/shortcuts/shortcuts.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { GameInfo } from 'common/types'
1818
import { getIcon } from '../utils'
1919
import { addNonSteamGame } from '../nonesteamgame/nonesteamgame'
2020
import sanitize from 'sanitize-filename'
21-
import * as GogLibraryManager from '../../storeManagers/gog/library'
21+
import { libraryManagerMap } from 'backend/storeManagers'
2222
import { isMac } from 'backend/constants/environment'
2323
import { userHome } from 'backend/constants/paths'
2424

@@ -79,7 +79,7 @@ Categories=Game;
7979
}
8080
let executable = gameInfo.install.executable
8181
if (gameInfo.runner === 'gog') {
82-
executable = GogLibraryManager.getExecutable(gameInfo.app_name)
82+
executable = libraryManagerMap['gog'].getExecutable(gameInfo.app_name)
8383
}
8484
if (executable) {
8585
let icon: string

src/backend/shortcuts/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'graceful-fs'
22
import { GameInfo } from 'common/types'
33
import { basename, dirname, extname, join } from 'path'
4-
import { getProductApi } from 'backend/storeManagers/gog/library'
4+
import { libraryManagerMap } from '../storeManagers'
55
import { downloadFile } from 'backend/utils'
66
import { createAbortController } from 'backend/utils/aborthandler/aborthandler'
77
import { heroicIconFolder as iconsFolder } from 'backend/constants/paths'
@@ -82,7 +82,7 @@ async function getIcon(appName: string, gameInfo: GameInfo) {
8282
} else if (existsSync(linuxNativePath)) {
8383
return linuxNativePath
8484
}
85-
const productApiData = await getProductApi(appName)
85+
const productApiData = await libraryManagerMap['gog'].getProductApi(appName)
8686
if (productApiData && productApiData.data.images?.icon) {
8787
image = 'https:' + productApiData.data.images?.icon
8888
icon = `${iconsFolder}/${appName}.png` // Allow transparency

0 commit comments

Comments
 (0)