Skip to content

Commit 4e95557

Browse files
committed
Make LibraryManagers and GameManagers actual classes
1 parent d285456 commit 4e95557

File tree

30 files changed

+5264
-5232
lines changed

30 files changed

+5264
-5232
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',
@@ -1007,7 +1008,9 @@ async function installFixes(appName: string, runner: Runner) {
10071008

10081009
for (const filePath of knownFixes.runInPrefix) {
10091010
const fullPath = join(gameInfo.install.install_path!, filePath)
1010-
await runWineCommandOnGame(appName, {
1011+
// FIXME: This doesn't seem right, shouldn't we use a generic function instead
1012+
// of the Legendary-specific one?
1013+
await gameManagerMap['legendary'].runWineCommandOnGame(appName, {
10111014
commandParts: [fullPath],
10121015
wait: true,
10131016
protonVerb: 'run'
@@ -1828,7 +1831,8 @@ function getRunnerCallWithoutCredentials(
18281831
env: Record<string, string> | NodeJS.ProcessEnv = {},
18291832
runnerPath: string
18301833
): string {
1831-
if (!Array.isArray(command)) command = commandToArgsArray(command)
1834+
if (!Array.isArray(command))
1835+
command = libraryManagerMap['legendary'].commandToArgsArray(command)
18321836

18331837
const modifiedCommand = [...command]
18341838
// 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
@@ -94,28 +94,14 @@ import { getDefaultSavePath } from './save_sync'
9494
import { initTrayIcon } from './tray_icon/tray_icon'
9595
import { createMainWindow, getMainWindow, isFrameless } from './main_window'
9696

97-
import * as GOGLibraryManager from 'backend/storeManagers/gog/library'
98-
import {
99-
getCyberpunkMods,
100-
getBranchPassword,
101-
setBranchPassword,
102-
getGOGPlaytime,
103-
syncQueuedPlaytimeGOG
104-
} from 'backend/storeManagers/gog/games'
10597
import { playtimeSyncQueue } from './storeManagers/gog/electronStores'
106-
import * as LegendaryLibraryManager from 'backend/storeManagers/legendary/library'
10798
import {
10899
autoUpdate,
109100
gameManagerMap,
110101
initStoreManagers,
111102
libraryManagerMap
112103
} from './storeManagers'
113104
import { updateWineVersionInfos } from './wine/manager/utils'
114-
import { addNewApp } from './storeManagers/sideload/library'
115-
import {
116-
getGameOverride,
117-
getGameSdl
118-
} from 'backend/storeManagers/legendary/library'
119105
import { backendEvents } from './backend_events'
120106
import { configStore } from './constants/key_value_stores'
121107
import {
@@ -381,7 +367,7 @@ if (!gotTheLock) {
381367
// Make sure lock is not present when starting up
382368
playtimeSyncQueue.delete('lock')
383369
if (!settings.disablePlaytimeSync) {
384-
runOnceWhenOnline(syncQueuedPlaytimeGOG)
370+
runOnceWhenOnline(gameManagerMap['gog'].syncQueuedPlaytimeGOG)
385371
} else {
386372
logDebug('Skipping playtime sync queue upload - playtime sync disabled', {
387373
prefix: LogPrefix.Backend
@@ -664,8 +650,12 @@ addHandler('getMaxCpus', () => cpus().length)
664650

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

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

@@ -713,7 +703,10 @@ addHandler('isGameAvailable', async (e, args) => {
713703

714704
addHandler('getGameInfo', async (event, appName, runner) => {
715705
// 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
716-
if (runner === 'legendary' && !LegendaryLibraryManager.hasGame(appName)) {
706+
if (
707+
runner === 'legendary' &&
708+
!libraryManagerMap['legendary'].hasGame(appName)
709+
) {
717710
return null
718711
}
719712
const tempGameInfo = gameManagerMap[runner].getGameInfo(appName)
@@ -728,7 +721,10 @@ addHandler('getGameInfo', async (event, appName, runner) => {
728721

729722
addHandler('getExtraInfo', async (event, appName, runner) => {
730723
// 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
731-
if (runner === 'legendary' && !LegendaryLibraryManager.hasGame(appName)) {
724+
if (
725+
runner === 'legendary' &&
726+
!libraryManagerMap['legendary'].hasGame(appName)
727+
) {
732728
return null
733729
}
734730
return gameManagerMap[runner].getExtraInfo(appName)
@@ -744,7 +740,7 @@ addHandler('getGameSettings', async (event, appName, runner) => {
744740
})
745741

746742
addHandler('getGOGLinuxInstallersLangs', async (event, appName) =>
747-
GOGLibraryManager.getLinuxInstallersLanguages(appName)
743+
libraryManagerMap['gog'].getLinuxInstallersLanguages(appName)
748744
)
749745

750746
addHandler(
@@ -796,7 +792,7 @@ addHandler('getAlternativeWine', async () =>
796792
addHandler('readConfig', async (event, configClass) => {
797793
if (configClass === 'library') {
798794
await libraryManagerMap['legendary'].refresh()
799-
return LegendaryLibraryManager.getListOfGames()
795+
return libraryManagerMap['legendary'].getListOfGames()
800796
}
801797
const userInfo = LegendaryUser.getUserInfo()
802798
return userInfo?.displayName ?? ''
@@ -853,7 +849,10 @@ if (existsSync(legendaryInstalled)) {
853849
// decode the JSON data. So instead of immediately calling LegendaryLibrary.get().refreshInstalled(), call it only after no writes happen
854850
// in a 500ms timespan
855851
if (watchTimeout) clearTimeout(watchTimeout)
856-
watchTimeout = setTimeout(LegendaryLibraryManager.refreshInstalled, 500)
852+
watchTimeout = setTimeout(
853+
libraryManagerMap['legendary'].refreshInstalled,
854+
500
855+
)
857856
})
858857
}
859858

@@ -1055,7 +1054,7 @@ addHandler('changeInstallPath', async (event, { appName, path, runner }) => {
10551054
})
10561055

10571056
addHandler('egsSync', async (event, args) => {
1058-
return LegendaryLibraryManager.toggleGamesSync(args)
1057+
return libraryManagerMap['legendary'].toggleGamesSync(args)
10591058
})
10601059

10611060
addHandler('syncGOGSaves', async (event, gogSaves, appName, arg) =>
@@ -1266,7 +1265,9 @@ addListener('setTitleBarOverlay', (e, args) => {
12661265
}
12671266
})
12681267

1269-
addListener('addNewApp', (e, args) => addNewApp(args))
1268+
addListener('addNewApp', (e, args) =>
1269+
libraryManagerMap['sideload'].addNewApp(args)
1270+
)
12701271

12711272
addHandler('isNative', (e, { appName, runner }) => {
12721273
return gameManagerMap[runner].isNative(appName)
@@ -1314,23 +1315,25 @@ addHandler(
13141315
return
13151316
}
13161317
if (runner === 'gog') {
1317-
return getGOGPlaytime(appName)
1318+
return gameManagerMap['gog'].getGOGPlaytime(appName)
13181319
}
13191320

13201321
return
13211322
}
13221323
)
13231324

13241325
addHandler('getPrivateBranchPassword', (e, appName) =>
1325-
getBranchPassword(appName)
1326+
gameManagerMap['gog'].getBranchPassword(appName)
13261327
)
13271328
addHandler('setPrivateBranchPassword', (e, appName, password) =>
1328-
setBranchPassword(appName, password)
1329+
gameManagerMap['gog'].setBranchPassword(appName, password)
13291330
)
13301331

1331-
addHandler('getAvailableCyberpunkMods', async () => getCyberpunkMods())
1332+
addHandler('getAvailableCyberpunkMods', async () =>
1333+
gameManagerMap['gog'].getCyberpunkMods()
1334+
)
13321335
addHandler('setCyberpunkModConfig', async (e, props) =>
1333-
GOGLibraryManager.setCyberpunkModConfig(props)
1336+
libraryManagerMap['gog'].setCyberpunkModConfig(props)
13341337
)
13351338

13361339
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 {
@@ -69,7 +67,7 @@ async function getDefaultLegendarySavePath(appName: string): Promise<string> {
6967
}
7068

7169
logInfo(['Computing default save path for', appName], LogPrefix.Legendary)
72-
await runLegendaryCommand(
70+
await libraryManagerMap['legendary'].runRunnerCommand(
7371
{
7472
subcommand: 'sync-saves',
7573
appName: LegendaryAppName.parse(appName),
@@ -111,7 +109,10 @@ async function getDefaultGogSavePaths(
111109
const gameSettings = await gameManagerMap['gog'].getSettings(appName)
112110
const installInfo = gameManagerMap['gog'].getGameInfo(appName)
113111
.install as InstalledInfo
114-
const gog_save_location = await getSaveSyncLocation(appName, installInfo)
112+
const gog_save_location = await libraryManagerMap['gog'].getSaveSyncLocation(
113+
appName,
114+
installInfo
115+
)
115116

116117
const { platform: installed_platform, install_path } = installInfo
117118
if (!gog_save_location || !install_path) {
@@ -126,7 +127,7 @@ async function getDefaultGogSavePaths(
126127

127128
// If no save locations are defined, assume the default
128129
if (!gog_save_location.length) {
129-
const clientId = readInfoFile(appName)?.clientId
130+
const clientId = libraryManagerMap['gog'].readInfoFile(appName)?.clientId
130131
gog_save_location.push({
131132
name: '__default',
132133
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)