hotfix injector for ptb/canary/dev (#330)

This commit is contained in:
megumin 2022-12-14 22:35:02 +00:00 committed by GitHub
parent a67db11dc2
commit fea8c60a40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 124 additions and 5 deletions

@ -21,6 +21,20 @@ const readline = require("readline");
const fs = require("fs"); const fs = require("fs");
const menu = require("console-menu"); const menu = require("console-menu");
function pathToBranch(dir) {
dir = dir.toLowerCase();
if (dir.endsWith("development")) {
return "development";
}
if (dir.endsWith("canary")) {
return "canary";
}
if (dir.endsWith("ptb")) {
return "ptb";
}
return "stable";
}
const BRANCH_NAMES = [ const BRANCH_NAMES = [
"Discord", "Discord",
"DiscordPTB", "DiscordPTB",
@ -329,6 +343,7 @@ function getLinuxDirs() {
} }
module.exports = { module.exports = {
pathToBranch,
BRANCH_NAMES, BRANCH_NAMES,
MACOS_DISCORD_DIRS, MACOS_DISCORD_DIRS,
LINUX_DISCORD_DIRS, LINUX_DISCORD_DIRS,

@ -39,7 +39,8 @@ const {
getDarwinDirs, getDarwinDirs,
getLinuxDirs, getLinuxDirs,
ENTRYPOINT, ENTRYPOINT,
question question,
pathToBranch
} = require("./common"); } = require("./common");
switch (process.platform) { switch (process.platform) {
@ -104,19 +105,84 @@ async function install(installations) {
} }
} }
const useNewMethod = pathToBranch(selected.branch) !== "stable";
for (const version of selected.versions) { for (const version of selected.versions) {
const dir = version.path;
const dir = useNewMethod ? path.join(version.path, "..") : version.path;
// Check if we have write perms to the install directory... // Check if we have write perms to the install directory...
try { try {
fs.accessSync(selected.location, fs.constants.W_OK); fs.accessSync(selected.location, fs.constants.W_OK);
} catch (e) { } catch (e) {
console.error("No write access to", selected.location); console.error("No write access to", selected.location);
console.error( console.error(
"Try running this script as an administrator:", "Make sure Discord isn't running. If that doesn't work,",
"try running this script as an administrator:",
"sudo pnpm inject" "sudo pnpm inject"
); );
process.exit(1); process.exit(1);
} }
if (useNewMethod) {
const appAsar = path.join(dir, "app.asar");
const _appAsar = path.join(dir, "_app.asar");
if (fs.existsSync(_appAsar) && fs.existsSync(appAsar)) {
console.log("This copy of Discord already seems to be patched...");
console.log("Try running `pnpm uninject` first.");
process.exit(1);
}
try {
fs.renameSync(appAsar, _appAsar);
} catch (err) {
if (err.code === "EBUSY") {
console.error(selected.branch, "is still running. Make sure you fully close it before running this script.");
process.exit(1);
}
console.error("Failed to rename app.asar to _app.asar");
throw err;
}
try {
fs.mkdirSync(appAsar);
} catch (err) {
if (err.code === "EBUSY") {
console.error(selected.branch, "is still running. Make sure you fully close it before running this script.");
process.exit(1);
}
console.error("Failed to create app.asar folder");
throw err;
}
fs.writeFileSync(
path.join(appAsar, "index.js"),
`require("${ENTRYPOINT}");`
);
fs.writeFileSync(
path.join(appAsar, "package.json"),
JSON.stringify({
name: "discord",
main: "index.js",
})
);
const requiredFiles = ["index.js", "package.json"];
if (requiredFiles.every(f => fs.existsSync(path.join(appAsar, f)))) {
console.log(
"Successfully patched",
version.name
? `${selected.branch} ${version.name}`
: selected.branch
);
} else {
console.log("Failed to patch", dir);
console.log("Files in directory:", fs.readdirSync(appAsar));
}
return;
}
if (fs.existsSync(dir) && fs.lstatSync(dir).isDirectory()) { if (fs.existsSync(dir) && fs.lstatSync(dir).isDirectory()) {
fs.rmSync(dir, { recursive: true }); fs.rmSync(dir, { recursive: true });
} }

@ -32,6 +32,7 @@ const {
getWindowsDirs, getWindowsDirs,
getDarwinDirs, getDarwinDirs,
getLinuxDirs, getLinuxDirs,
pathToBranch,
} = require("./common"); } = require("./common");
switch (process.platform) { switch (process.platform) {
@ -52,19 +53,56 @@ switch (process.platform) {
async function uninstall(installations) { async function uninstall(installations) {
const selected = await getMenuItem(installations); const selected = await getMenuItem(installations);
const useNewMethod = pathToBranch(selected.branch) !== "stable";
for (const version of selected.versions) { for (const version of selected.versions) {
const dir = version.path; const dir = useNewMethod ? path.join(version.path, "..") : version.path;
// Check if we have write perms to the install directory... // Check if we have write perms to the install directory...
try { try {
fs.accessSync(selected.location, fs.constants.W_OK); fs.accessSync(selected.location, fs.constants.W_OK);
} catch (e) { } catch (e) {
console.error("No write access to", selected.location); console.error("No write access to", selected.location);
console.error( console.error(
"Try running this script as an administrator:", "Make sure Discord isn't running. If that doesn't work,",
"try running this script as an administrator:",
"sudo pnpm uninject" "sudo pnpm uninject"
); );
process.exit(1); process.exit(1);
} }
if (useNewMethod) {
if (!fs.existsSync(path.join(dir, "_app.asar"))) {
console.error(
"Original app.asar (_app.asar) doesn't exist.",
"Is your Discord installation corrupt? Try reinstalling Discord."
);
process.exit(1);
}
if (fs.existsSync(path.join(dir, "app.asar"))) {
try {
fs.rmSync(path.join(dir, "app.asar"), { force: true, recursive: true });
} catch (err) {
console.error("Failed to delete app.asar folder");
throw err;
}
}
try {
fs.renameSync(
path.join(dir, "_app.asar"),
path.join(dir, "app.asar")
);
} catch (err) {
console.error("Failed to rename _app.asar to app.asar");
throw err;
}
console.log(
"Successfully unpatched",
version.name
? `${selected.branch} ${version.name}`
: selected.branch
);
return;
}
if (fs.existsSync(dir)) { if (fs.existsSync(dir)) {
fs.rmSync(dir, { recursive: true }); fs.rmSync(dir, { recursive: true });
} }