MSE-MC/packgen.js

175 lines
6.2 KiB
JavaScript
Raw Normal View History

2024-04-21 02:59:22 +12:00
#!/usr/bin/env node
const MSE = require("mse-translator");
const https = require("https");
const fs = require("fs");
const archiver = require("archiver");
var argv = require("yargs/yargs")(process.argv.slice(2))
.usage("\nMSE Minecraft language-pack generator \n\nUsage: $0 [options]")
.help("help")
.alias("help", "h")
.version("version", "1.0.1")
.alias("version", "V")
.options({
descriptivefile: {
alias: "f",
description: 'descriptive output E.g. "en_gb-v1.19.1-en_MSE"',
requiresArg: false,
required: false,
type: "boolean",
},
lang: {
alias: "l",
description: "<language> base language for pack generation",
requiresArg: true,
required: false,
type: "string",
},
// TODO: version: {
// alias: "v",
// description: "<version> base version for pack generation",
// requiresArg: true,
// required: false,
// type: "string",
// },
manifest: {
alias: "m",
description: "<url> custom manifest endpoint",
requiresArg: true,
required: false,
type: "string",
},
resources: {
alias: "r",
description: "<url> custom resources endpoint",
requiresArg: true,
required: false,
type: "string",
},
})
.parse();
2024-04-01 20:48:59 +13:00
2024-04-16 21:11:55 +12:00
const urlReq = function (reqUrl, options, cb) {
2024-04-21 02:59:22 +12:00
if (typeof options === "function") {
2024-04-19 21:46:39 +12:00
cb = options;
options = {};
} // incase no options passed in
https
.get(reqUrl, (res) => {
2024-04-21 02:59:22 +12:00
let body = "";
res.on("data", (chunk) => {
2024-04-19 21:46:39 +12:00
body += chunk;
});
2024-04-21 02:59:22 +12:00
res.on("end", () => {
2024-04-19 21:46:39 +12:00
try {
cb(body, res);
} catch (error) {
console.error(error.message);
}
});
})
2024-04-21 02:59:22 +12:00
.on("error", (error) => {
2024-04-19 21:46:39 +12:00
console.error(error.message);
});
2024-04-16 21:11:55 +12:00
};
2024-04-01 20:48:59 +13:00
2024-04-21 02:59:22 +12:00
let piston =
argv.manifest ||
"https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
2024-04-01 20:48:59 +13:00
2024-04-16 21:11:55 +12:00
urlReq(piston, function (body, res) {
2024-04-19 21:46:39 +12:00
json = JSON.parse(body);
let version = json.versions[0].id; // latest version
2024-04-21 02:59:22 +12:00
let resources =
argv.resources || "https://resources.download.minecraft.net/";
let baselang = argv.lang || "en_gb";
let filename =
(argv.descriptivefile && `${baselang}-v${version}-en_MSE`) || // descriptive file name
"Maoist-Standard-English"; // default
2024-04-19 21:46:39 +12:00
let mcmeta_template = [
{
text: `§cen_MSE§r\n`,
},
{
text: `§8(§f${baselang}§8)-<§f${version}§8>`,
},
];
2024-04-19 21:41:02 +12:00
2024-04-19 21:46:39 +12:00
console.log(`Using base language "${baselang}" from version (${version})`);
2024-04-19 21:41:02 +12:00
2024-04-19 21:46:39 +12:00
urlReq(json.versions[1].url, function (body, res) {
json = JSON.parse(body);
urlReq(json.assetIndex.url, function (body, res) {
json = JSON.parse(body);
hash = json.objects[`minecraft/lang/${baselang}.json`].hash;
urlReq(
resources + `${hash.substring(0, 2)}/${hash}`,
function (body, res) {
pack = JSON.parse(body);
var totals = {
total: Object.keys(pack).length,
translated: 0,
};
console.log(`Translating ${totals.total} strings`);
Object.keys(pack).forEach(function (key) {
var translated = MSE.translate(
pack[key]
2024-04-21 02:59:22 +12:00
.replace(/\%s/gi, "%_") //mc patch
.replace(/\$s/gi, "$_"),
2024-04-19 21:46:39 +12:00
)
2024-04-21 02:59:22 +12:00
.replace(/\%_/gi, "%s") //mc patch back
.replace(/\$_/gi, "$s");
2024-04-19 21:46:39 +12:00
if (translated != pack[key]) {
totals.translated = totals.translated + 1;
}
pack[key] = translated;
});
console.log(
`Translated ${totals.translated} out of ${totals.total} strings`,
);
2024-04-19 21:41:02 +12:00
2024-04-21 02:59:22 +12:00
var mcmeta = __dirname + "/template/pack.mcmeta";
2024-04-19 21:46:39 +12:00
var mcmeta_data = JSON.parse(fs.readFileSync(mcmeta));
mcmeta_data.pack.description = mcmeta_template;
2024-04-01 20:48:59 +13:00
2024-04-19 21:46:39 +12:00
fs.writeFileSync(mcmeta, JSON.stringify(mcmeta_data));
fs.writeFile(
__dirname +
2024-04-21 02:59:22 +12:00
"/template/assets/minecraft/lang/en_mse.json",
2024-04-19 21:46:39 +12:00
JSON.stringify(pack, null, 4),
2024-04-21 02:59:22 +12:00
"utf8",
2024-04-19 21:46:39 +12:00
function (err) {
if (err) throw err;
console.log(
2024-04-21 02:59:22 +12:00
"en_mse.json generated, creating pack and compressing.",
2024-04-19 21:46:39 +12:00
);
const output = fs.createWriteStream(
__dirname + `/${filename}.zip`,
);
2024-04-21 02:59:22 +12:00
const archive = archiver("zip", {
2024-04-19 21:46:39 +12:00
zlib: { level: 9 }, // Sets the compression level.
});
2024-04-21 02:59:22 +12:00
archive.on("error", function (err) {
2024-04-19 21:46:39 +12:00
throw err;
});
2024-04-21 02:59:22 +12:00
output.on("close", function () {
2024-04-19 21:46:39 +12:00
console.log(
2024-04-21 02:59:22 +12:00
"language-pack archive generated with a filesize of " +
2024-04-19 21:46:39 +12:00
archive.pointer() +
2024-04-21 02:59:22 +12:00
" bytes" +
2024-04-19 21:46:39 +12:00
`\n(./${filename}.zip)`,
);
});
archive.pipe(output);
2024-04-21 02:59:22 +12:00
archive.directory("template/", false);
2024-04-19 21:46:39 +12:00
archive.finalize();
},
);
},
);
});
2024-04-01 20:48:59 +13:00
});
});