Skip to content
Open
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
2a0f8c5
tech: add steam runner wip
flavioislima Jun 25, 2025
6cbcb8d
tech: types and edge cases
flavioislima Jun 25, 2025
6cdab3b
tech: frontend implementation
flavioislima Jun 25, 2025
91e8f3f
ui: add steam logo
flavioislima Jun 25, 2025
8170bed
ui: add steam filter
flavioislima Jun 25, 2025
f8b77ff
tech: install and play from gamecard and gamepage
flavioislima Jun 25, 2025
fa2c242
fix: show steam on all filters
flavioislima Jun 25, 2025
3ce9513
chore: logs and install from card
flavioislima Jun 25, 2025
440b2cd
ui: add fallback images for Steam game art
flavioislima Jun 26, 2025
534a81e
fix: prevent adding shortcuts for Steam games and DLCs
flavioislima Jul 1, 2025
32d6c80
fix: update GamePage to conditionally show settings button and action…
flavioislima Jul 1, 2025
d3eefa3
fix: update GamePage to conditionally display game information based …
flavioislima Jul 23, 2025
5fdcdf5
Merge branch 'main' of github.com:HyperPlay-Gaming/hyperplay-desktop-…
flavioislima Jul 23, 2025
25640cf
tech: use callRunner to launch steam
flavioislima Jul 25, 2025
8d2eb9b
fix: skip non-installed owned games on macOS
flavioislima Jul 25, 2025
38e08f5
feat: add Enable Steam Integration setting and update config handling
flavioislima Jul 25, 2025
333644a
feat: conditionally display Steam tab based on integration setting
flavioislima Jul 25, 2025
b527c2d
fix: remove macOS warning from getOwnedGames function
flavioislima Jul 25, 2025
d2d1cac
feat: add Steam game information and enable Steam integration setting
flavioislima Jul 25, 2025
b57c6ce
feat: add Steam integration requirements dialog and update types for …
flavioislima Jul 25, 2025
8791224
fix: windows launch command
flavioislima Jul 29, 2025
aba09d0
fix: types
flavioislima Jul 29, 2025
585295e
feat: add Steam installation dialog and integrate with game launch pr…
flavioislima Aug 13, 2025
51ac49b
Merge branch 'main' of github.com:HyperPlay-Gaming/hyperplay-desktop-…
flavioislima Aug 13, 2025
6bfe3dc
fix: update @hyperplay/quests-ui and @hyperplay/utils dependencies
flavioislima Aug 18, 2025
2624e37
fix: types
flavioislima Aug 18, 2025
e337a3c
feat: add TODO for future user enablement settings in refresh function
flavioislima Aug 18, 2025
eafea20
fix: tests
flavioislima Aug 18, 2025
8d1dd33
Merge branch 'main' of github.com:HyperPlay-Gaming/hyperplay-desktop-…
flavioislima Sep 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@
"@fortawesome/react-fontawesome": "^0.2.2",
"@hyperplay/chains": "^0.6.1",
"@hyperplay/check-disk-space": "^3.5.2",
"@hyperplay/quests-ui": "^0.4.0",
"@hyperplay/quests-ui": "^0.4.4",
"@hyperplay/ui": "^1.32.1",
"@hyperplay/utils": "^0.3.14",
"@hyperplay/utils": "^0.3.19",
"@mantine/carousel": "^7.12.0",
"@mantine/core": "^7.12.0",
"@mantine/dropzone": "^7.12.0",
Expand Down
55 changes: 36 additions & 19 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions public/locales/en/gamepage.json
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@
"installedPlatform": "Installed Platform",
"path": "Install Path",
"size": "Size",
"steam-game": "This is a Steam game, for more information check the game page on the Steam App.",
"syncsaves": "Sync Saves",
"version": "Version",
"web3-supported": "Has Web3 features"
Expand Down
22 changes: 22 additions & 0 deletions public/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -950,6 +950,7 @@
"download-no-https": "Download games without HTTPS (useful for CDNs e.g. LanCache)",
"dxvkfpslimit": "Limit FPS (DX9, 10 and 11)",
"egs-sync": "Sync with Installed Epic Games",
"enable-steam-integration": "Enable Steam Integration (experimental)",
"enableFSRHack": "Enable FSR Hack (Wine version needs to support it)",
"eosOverlay": {
"cancelInstall": "Cancel",
Expand Down Expand Up @@ -1128,6 +1129,27 @@
"logging": "Logging In...",
"processing": "Processing files, please wait"
},
"steam": {
"install": {
"later": "Install Later",
"launch": "Launch Steam",
"message": "Please install this game from Steam and refresh the library afterwards to play on HyperPlay.",
"title": "Install from Steam"
},
"integration": {
"requirements": {
"part1": "To ensure this integration works properly and HyperPlay can access your games, you must have",
"part2": "Steam installed",
"part3": "and be",
"part4": "Logged into",
"part5": "your account.",
"part6": "Additionally, your profile and game details should be set to ",
"part7": "Public",
"part8": "Steam > Profile > Edit Profile > Privacy Settings",
"title": "Steam Integration Requirements"
}
}
},
"Steam Installation": "",
"steam-install": {
"compatibility-layer-not-available": "Compatibility layer not available. Please install one from \"Settings > Wine Manager\" first.",
Expand Down
12 changes: 7 additions & 5 deletions src/backend/cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Store from 'electron-store'
export default class CacheStore<ValueType, KeyType extends string = string> {
private readonly store: Store
private in_memory_store: Map<string, ValueType>
private using_in_memory: boolean
private using_in_memory: number
private current_store: Store | Map<string, ValueType>
private readonly lifespan: number | null

Expand All @@ -20,7 +20,7 @@ export default class CacheStore<ValueType, KeyType extends string = string> {
clearInvalidConfig: true
})
this.in_memory_store = new Map<string, ValueType>()
this.using_in_memory = false
this.using_in_memory = 0
this.current_store = this.store
this.lifespan = max_value_lifespan
}
Expand All @@ -31,7 +31,7 @@ export default class CacheStore<ValueType, KeyType extends string = string> {
*/
public use_in_memory() {
// Mirror store to memory map
this.using_in_memory = true
this.using_in_memory += 1
this.in_memory_store = new Map(this.store) as Map<string, ValueType>
this.current_store = this.in_memory_store
}
Expand Down Expand Up @@ -85,8 +85,10 @@ export default class CacheStore<ValueType, KeyType extends string = string> {
public commit() {
if (this.using_in_memory) {
this.store.store = Object.fromEntries(this.in_memory_store)
this.using_in_memory = false
this.current_store = this.store
this.using_in_memory -= 1
if (this.using_in_memory === 0) {
this.current_store = this.store
}
}
}
}
3 changes: 2 additions & 1 deletion src/backend/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,8 @@ class GlobalConfigV0 extends GlobalConfig {
ldUser: {
kind: 'user',
key: uuid()
}
},
enableSteamIntegration: false
} as AppSettings
}

Expand Down
10 changes: 8 additions & 2 deletions src/backend/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,13 @@ const cachedUbisoftInstallerPath = join(
const ipdtPatcher = join(toolsPath, 'ipdt')
const ipdtManifestsPath = join(appConfigFolder, 'manifests')

const { currentLogFile, lastLogFile, legendaryLogFile, gogdlLogFile } =
createNewLogFileAndClearOldOnes()
const {
currentLogFile,
lastLogFile,
legendaryLogFile,
gogdlLogFile,
steamLogFile
} = createNewLogFileAndClearOldOnes()

const gogdlAuthConfig = join(app.getPath('userData'), 'gog_store', 'auth.json')
const iconDark = fixAsarPath(join(publicDir, 'trayIconDark24x24.png'))
Expand Down Expand Up @@ -251,6 +256,7 @@ export {
lastLogFile,
legendaryLogFile,
gogdlLogFile,
steamLogFile,
discordLink,
twitterLink,
execOptions,
Expand Down
2 changes: 1 addition & 1 deletion src/backend/launcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,7 @@ async function callRunner(
shouldUsePowerShell = isWindows && powershellExists
}

if (shouldUsePowerShell && runner.name !== 'gog') {
if (shouldUsePowerShell && !['gog', 'steam'].includes(runner.name)) {
const argsAsString = commandParts
.map((part) => part.replaceAll('\\', '\\\\'))
.map((part) => `"\`"${part}\`""`)
Expand Down
10 changes: 8 additions & 2 deletions src/backend/logger/logfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ interface createLogFileReturn {
lastLogFile: string
legendaryLogFile: string
gogdlLogFile: string
steamLogFile: string
}

let longestPrefix = 0
Expand Down Expand Up @@ -47,10 +48,12 @@ export function createNewLogFileAndClearOldOnes(): createLogFileReturn {
const newLogFile = join(logDir, `hyperplay-${fmtDate}.log`)
const newLegendaryLogFile = join(logDir, `legendary-${fmtDate}.log`)
const newGogdlLogFile = join(logDir, `gogdl-${fmtDate}.log`)
const newSteamLogFile = join(logDir, `steam-${fmtDate}.log`)

createLogFile(newLogFile)
createLogFile(newLegendaryLogFile)
createLogFile(newGogdlLogFile)
createLogFile(newSteamLogFile)

// Clean out logs that are more than a month old
if (existsSync(logDir)) {
Expand Down Expand Up @@ -88,7 +91,8 @@ export function createNewLogFileAndClearOldOnes(): createLogFileReturn {
currentLogFile: '',
lastLogFile: '',
legendaryLogFile: '',
gogdlLogFile: ''
gogdlLogFile: '',
steamLogFile: ''
})

if (!isNewInstance) {
Expand All @@ -99,6 +103,7 @@ export function createNewLogFileAndClearOldOnes(): createLogFileReturn {
logs.currentLogFile = newLogFile
logs.legendaryLogFile = newLegendaryLogFile
logs.gogdlLogFile = newGogdlLogFile
logs.steamLogFile = newSteamLogFile
configStore.set('general-logs', logs)

// get longest prefix to log lines in a kind of table
Expand All @@ -121,7 +126,8 @@ export function getLogFile(appNameOrRunner: string): string {
currentLogFile: '',
lastLogFile: '',
legendaryLogFile: '',
gogdlLogFile: ''
gogdlLogFile: '',
steamLogFile: ''
})

switch (appNameOrRunner) {
Expand Down
6 changes: 4 additions & 2 deletions src/backend/logger/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,16 @@ export enum LogPrefix {
Sideload = 'Sideload',
Achievements = 'Achievements',
Auth = 'Auth',
AutoUpdater = 'AutoUpdater'
AutoUpdater = 'AutoUpdater',
Steam = 'Steam'
}

export const RunnerToLogPrefixMap = {
legendary: LogPrefix.Legendary,
gog: LogPrefix.Gog,
hyperplay: LogPrefix.HyperPlay,
sideload: LogPrefix.Sideload
sideload: LogPrefix.Sideload,
steam: LogPrefix.Steam
}

type LogInputType = unknown[] | unknown
Expand Down
22 changes: 12 additions & 10 deletions src/backend/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -891,16 +891,18 @@ ipcMain.on('clearCache', (event, showDialog, fromVersionChange = false) => {
clearCache(undefined, fromVersionChange)
sendFrontendMessage('refreshLibrary')

showDialogBoxModalAuto({
event,
title: i18next.t('box.cache-cleared.title', 'Cache Cleared'),
message: i18next.t(
'box.cache-cleared.message',
'HyperPlay Cache Was Cleared!'
),
type: 'MESSAGE',
buttons: [{ text: i18next.t('box.ok', 'Ok') }]
})
if (showDialog) {
showDialogBoxModalAuto({
event,
title: i18next.t('box.cache-cleared.title', 'Cache Cleared'),
message: i18next.t(
'box.cache-cleared.message',
'HyperPlay Cache Was Cleared!'
),
type: 'MESSAGE',
buttons: [{ text: i18next.t('box.ok', 'Ok') }]
})
}
})

ipcMain.on('resetApp', async () => {
Expand Down
Loading
Loading