steam.handlers.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { ipcMain, BrowserWindow } from 'electron'
  2. import * as fs from 'fs'
  3. import { IpcChannels } from '@shared/ipc-channels'
  4. import * as steam from '../services/steam.service'
  5. import * as library from '../services/library.service'
  6. import * as backup from '../services/backup.service'
  7. function startDownloadPoll(win: BrowserWindow, itemId: string): void {
  8. const idBig = BigInt(itemId)
  9. const pollInterval = setInterval(() => {
  10. if (win.isDestroyed()) {
  11. clearInterval(pollInterval)
  12. return
  13. }
  14. const info = steam.getDownloadInfo(idBig)
  15. if (info) {
  16. win.webContents.send(IpcChannels.EVENT_DOWNLOAD_PROGRESS, info)
  17. return
  18. }
  19. if (steam.isItemDownloading(idBig)) return // queued/pending, no progress numbers yet
  20. clearInterval(pollInterval)
  21. library.importWallpaperById(itemId).then((meta) => {
  22. if (win.isDestroyed()) return
  23. const success = !!meta && !meta.downloading && !meta.downloadFailed
  24. win.webContents.send(IpcChannels.EVENT_DOWNLOAD_PROGRESS, {
  25. itemId,
  26. bytesDownloaded: 0,
  27. bytesTotal: 0,
  28. percentage: success ? 100 : 0,
  29. status: success ? 'completed' : 'error'
  30. })
  31. })
  32. }, 1000)
  33. }
  34. export function registerSteamHandlers(win: BrowserWindow): void {
  35. ipcMain.handle(IpcChannels.STEAM_IS_RUNNING, () => {
  36. return steam.isSteamRunning()
  37. })
  38. ipcMain.handle(IpcChannels.STEAM_SUBSCRIBE, async (_e, itemId: string) => {
  39. await steam.subscribeToItem(BigInt(itemId))
  40. startDownloadPoll(win, itemId)
  41. return { ok: true }
  42. })
  43. ipcMain.handle(IpcChannels.STEAM_UNSUBSCRIBE, async (_e, itemId: string) => {
  44. const wallpaper = library.getWallpaper(itemId)
  45. await steam.unsubscribeFromItem(BigInt(itemId))
  46. if (wallpaper?.localPath) {
  47. try { fs.rmSync(wallpaper.localPath, { recursive: true, force: true }) } catch { /* ignore */ }
  48. }
  49. if (wallpaper?.backedUp && backup.isBackedUp(itemId)) {
  50. library.updateWallpaper(itemId, {
  51. source: 'backup',
  52. localPath: backup.getBackupDir(itemId),
  53. subscribed: false
  54. })
  55. } else {
  56. library.deleteWallpaper(itemId)
  57. }
  58. return { ok: true }
  59. })
  60. ipcMain.handle(IpcChannels.STEAM_REDOWNLOAD, async (_e, itemId: string) => {
  61. const wallpaper = library.getWallpaper(itemId)
  62. await steam.unsubscribeFromItem(BigInt(itemId))
  63. if (wallpaper?.localPath) {
  64. try { fs.rmSync(wallpaper.localPath, { recursive: true, force: true }) } catch { /* ignore */ }
  65. }
  66. if (wallpaper) {
  67. library.updateWallpaper(itemId, { downloading: true, downloadFailed: false })
  68. }
  69. await steam.subscribeToItem(BigInt(itemId))
  70. startDownloadPoll(win, itemId)
  71. return { ok: true }
  72. })
  73. ipcMain.handle(IpcChannels.STEAM_VOTE, (_e, itemId: string, voteUp: boolean) => {
  74. steam.voteOnItem(BigInt(itemId), voteUp)
  75. return { ok: true }
  76. })
  77. ipcMain.handle(IpcChannels.STEAM_OPEN_WORKSHOP, (_e, itemId: string) => {
  78. steam.openWorkshopItemOverlay(BigInt(itemId))
  79. return { ok: true }
  80. })
  81. ipcMain.handle(IpcChannels.STEAM_GET_VOTED_IDS, async () => {
  82. return steam.getVotedUpItemIds()
  83. })
  84. ipcMain.handle(IpcChannels.STEAM_GET_SUBSCRIBED, () => {
  85. return steam.getSubscribedItems()
  86. })
  87. ipcMain.handle(IpcChannels.STEAM_DOWNLOAD_INFO, (_e, itemId: string) => {
  88. return steam.getDownloadInfo(BigInt(itemId))
  89. })
  90. ipcMain.handle(IpcChannels.STEAM_ITEM_STATE, (_e, itemId: string) => {
  91. return steam.getItemState(BigInt(itemId))
  92. })
  93. ipcMain.handle(IpcChannels.STEAM_INSTALL_INFO, (_e, itemId: string) => {
  94. return steam.getInstallInfo(BigInt(itemId))
  95. })
  96. ipcMain.handle(IpcChannels.STEAM_GET_AUTHOR_INFO, (_e, steamId: string) => {
  97. return steam.getAuthorInfo(steamId)
  98. })
  99. }