From f68fd0ac3a2fd709807f8677533897403c9ab481 Mon Sep 17 00:00:00 2001 From: GabiZar Date: Sat, 7 Feb 2026 22:58:00 +0100 Subject: [PATCH] the latest mods from nexus is now on the online mods page --- main.js | 36 +++++++++++++++++++++++++++--- preload.js | 4 +++- renderer/index.html | 14 +++++++----- renderer/renderer.js | 53 +++++++++++++++++++++++++++++++++++++++----- 4 files changed, 93 insertions(+), 14 deletions(-) diff --git a/main.js b/main.js index f3a4423..01e7a2b 100644 --- a/main.js +++ b/main.js @@ -27,8 +27,10 @@ const bepinexFiles = [ let bepinexVersion let bepinexBackupVersion +let mainWindow + const createWindow = () => { - const win = new BrowserWindow({ + mainWindow = new BrowserWindow({ width: 1280, height: 720, webPreferences: { @@ -36,7 +38,7 @@ const createWindow = () => { } }) - win.loadFile('renderer/index.html') + mainWindow.loadFile('renderer/index.html') } app.whenReady().then(() => { @@ -329,4 +331,32 @@ async function verifyNexusAPI() { if (await nexus.getValidationResult()) { return true } -} \ No newline at end of file +} + +ipcMain.handle('get-latest-mods', async () => { + if (nexus == undefined) { + return + } + + mods = await nexus.getLatestAdded() + return mods +}) + +ipcMain.handle('download-mod', async (event, link) => { + if (nexus == undefined) { + return + } + + const nexusWindow = new BrowserWindow({ + width: 1080, + height: 720, + modal: true, + parent: mainWindow, + webPreferences: { + nodeIntegration: false, + contextIsolation: true + } + }) + + nexusWindow.loadURL(link) +}) \ No newline at end of file diff --git a/preload.js b/preload.js index aed2913..bc5af0f 100644 --- a/preload.js +++ b/preload.js @@ -34,5 +34,7 @@ contextBridge.exposeInMainWorld('bepinex', { }) contextBridge.exposeInMainWorld('nexus', { - verifyAPI: () => ipcRenderer.invoke('verify-nexus-api') + verifyAPI: () => ipcRenderer.invoke('verify-nexus-api'), + getLatestMods: () => ipcRenderer.invoke('get-latest-mods'), + download: (link) => ipcRenderer.invoke('download-mod', link) }) \ No newline at end of file diff --git a/renderer/index.html b/renderer/index.html index cd37c4a..70094fc 100644 --- a/renderer/index.html +++ b/renderer/index.html @@ -81,17 +81,21 @@ diff --git a/renderer/renderer.js b/renderer/renderer.js index 215cd9c..1e2b41c 100644 --- a/renderer/renderer.js +++ b/renderer/renderer.js @@ -46,16 +46,62 @@ async function navigate(page) { const ModsContainer = onlineModsTemplateCopy.getElementById("mods-container") view.appendChild(onlineModsTemplateCopy) - for(let i = 0; i <= 10; i++) { + mods = await nexus.getLatestMods() + if (mods == undefined) { + break; + } + for(const mod of mods) { + if (mod.name == undefined) { + continue + } const modTemplateCopy = modTemplate.content.cloneNode(true) + if (mod.name) { + const modTitleText = modTemplateCopy.getElementById("mod-title") + modTitleText.innerText = mod.name + } + if (mod.author) { + const modAuthorText = modTemplateCopy.getElementById("mod-author") + modAuthorText.innerText = `by ${mod.author}` + } + if (mod.endorsement_count) { + const modEndorsementsNumber = modTemplateCopy.getElementById("mod-endorsements-number") + if (mod.endorsement_count > 1) { + modEndorsementsNumber.innerText = `${mod.endorsement_count} likes` + } + else { + modEndorsementsNumber.innerText = `${mod.endorsement_count} like` + } + } + if (mod.summary) { + const modDescriptionText = modTemplateCopy.getElementById("mod-description") + modDescriptionText.innerText = mod.summary + } + if (mod.picture_url) { + const modPicture = modTemplateCopy.getElementById("mod-icon") + modPicture.src = mod.picture_url + } + if (mod.version && mod.updated_timestamp) { + const modVersionText = modTemplateCopy.getElementById("mod-version") + modVersionText.innerText = `V${mod.version} last updated on ${mod.updated_time.slice(0, 10)}` + } + + const modUrl = `https://www.nexusmods.com/hollowknightsilksong/mods/${mod.mod_id}` const modLinkButton = modTemplateCopy.getElementById("external-link") + modLinkButton.href = modUrl modLinkButton.addEventListener('click', function(event) { event.preventDefault() const modLink = modLinkButton.href electronAPI.openExternalLink(modLink) }) + modDownloadButton = modTemplateCopy.getElementById("download-mod-button") + modDownloadButton.addEventListener('click', function(event) { + event.preventDefault() + const modDownloadLink = `${modUrl}?tab=files` + nexus.download(modDownloadLink) + }) + ModsContainer.appendChild(modTemplateCopy) } break; @@ -81,6 +127,7 @@ async function navigate(page) { view.appendChild(settingsTemplateCopy) setBepinexVersion() verifyNexusAPI() + break; } } @@ -123,10 +170,6 @@ async function importData() { document.getElementById("silksong-path-input").value = await files.loadSilksongPath() } -async function downloadMod() { - console.log("WIP") -} - async function installBepinex() { await bepinex.install() setBepinexVersion()