Skip to content

Commit

Permalink
feat: support thunderstore ror2mm protocol for installing mods
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan200101 committed Aug 4, 2024
1 parent 09b7d16 commit 56f2cb8
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const mods = require("./modules/mods");
const update = require("./modules/update");
const version = require("./modules/version");
const settings = require("./modules/settings");
const protocol = require("./modules/protocol");

// loads `ipcMain` events that dont fit in any of the modules directly
require("./modules/ipc");
Expand Down Expand Up @@ -88,6 +89,7 @@ function start() {

// load list of mods on initial load
win.webContents.on("dom-ready", () => {
protocol();
send("mods", mods.list());
})

Expand All @@ -103,6 +105,7 @@ function start() {
}
}


// starts the GUI or CLI
if (cli.hasArgs()) {
if (cli.hasParam("update-viper")) {
Expand All @@ -112,9 +115,10 @@ if (cli.hasArgs()) {
cli.init();
}
} else {
app.setAsDefaultProtocolClient("ror2mm");

// start the window/GUI
app.on("ready", () => {

start();
})
}
2 changes: 2 additions & 0 deletions src/modules/packages.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ var packages = {};

// lets renderer install packages
ipcMain.on("install-from-url", (event, url, author, package_name, version) => {
console.log(url);
packages.install(url, author, package_name, version);
})

Expand Down Expand Up @@ -194,6 +195,7 @@ packages.install = async (url, author, package_name, version) => {
return false;
}


let name = packages.format_name(author, package_name, version);

// removes zip's and folders
Expand Down
66 changes: 66 additions & 0 deletions src/modules/protocol.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
const { app, ipcMain } = require("electron");

const requests = require("./requests");
const version = require("./version");

async function install_mod(domain, author, package_name, version) {
let package_data = JSON.parse(await requests.get(
domain, `/api/experimental/package/${author}/${package_name}/${version}/`
));

for (const dep of package_data.dependencies) {
let fragments = dep.split("-");
if (fragments.length != 3) {
console.error("bad dep")
return;
}

if (fragments[0] != "northstar")
await install_mod(domain, ...fragments);
}

let result = ipcMain.emit("install-from-url", null, package_data.download_url, author, package_name, version);
if (!result) {
console.error("no install-from-url handler")
}
}

module.exports = async () => {
if (version.northstar() == "unknown")
return;

const args = process.argv.slice(app.isPackaged ? 1 : 2);

for (const key of args) {
if (key.startsWith("ror2mm://")) {
let fragments = key.slice(9).split("/");

if (fragments.length < 6)
return;

const ver = fragments[0];
const term = fragments[1];
const domain = fragments[2];
const author = fragments[3];
const mod = fragments[4];
const version = fragments[5];

// There is only v1
if (ver != "v1")
continue;

// No support for custom thunderstore instances
if (domain != "thunderstore.io")
continue;

try {
if (term == "install") {
await install_mod(domain, author, mod, version);
}
}catch(err) {
console.error(err);
continue;
}
}
}
}

0 comments on commit 56f2cb8

Please sign in to comment.