// Removed useless files, to speed up build process and make it clearer. const path = require("path"); const fs = require("fs"); const readline = require("readline"); // cmdid current version const read_cmdid = "cmdid.csv"; const read_cmdid_output = "cmdid.json"; const read_cmdid_output_gc = "cmdid_gc.json"; const read_cmdid_output_gc_update = "cmdid_gc_update.json"; const read_cmdid_output_gc_nofound = "cmdid_gc_nofound.json"; const write_op = "PacketOpcodes.java"; console.log(process.cwd()); //(TODO: add input file) // folder gc auto-generated proto const folder_proto_gc_gen = "../Grasscutter-Yuuki/src/generated/main/java/emu/grasscutter/net/proto/"; // file PacketOpcodes currently in use const read_cmdid_gc = "../Grasscutter-Yuuki/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java"; //const read_cmdid = fs.readFileSync("cmdid.csv"); //const read_packetopcodes = fs.readFileSync("PacketOpcodes.java"); var data = []; var data_gc = []; var index_file_gen = 0; var index_file_cmdid = 0; var index_cmdid_gc = 0; var index_cmdid_gc_out = 0; function check_gen() { fs.readdir(folder_proto_gc_gen, function (err, files) { //handling error if (err) { return console.log("Unable to scan directory: " + err); } files.forEach(function (file) { index_file_gen++; }); console.log("file proto gen: " + index_file_gen); }); } // gen json file cmdid function get_cmdid_json() { const inputStreamcmdid = fs.createReadStream(read_cmdid); var lineReadercmdid = readline.createInterface({ input: inputStreamcmdid, terminal: false, }); lineReadercmdid.on("line", function (line) { var config = line.split(","); var subdata = new Object(); subdata["name"] = config[0]; subdata["id"] = parseInt(config[1]); data.push(subdata); index_file_cmdid++; }); lineReadercmdid.on("close", function () { console.log("found cmd id " + index_file_cmdid); save_json(data, read_cmdid_output); }); } // create cmdid from gc which comes from PacketOpcodes function get_cmdid_gc() { const inputStreamcmdid = fs.createReadStream(read_cmdid_gc); var lineReadercmdid = readline.createInterface({ input: inputStreamcmdid, terminal: false, }); lineReadercmdid.on("line", function (line) { var config = line.split(" = "); var name = config[0]; var id = parseInt(config[1]); if (name.includes("public static final int")) { name = name.replace("\tpublic static final int ", ""); // skip 0 ? if (id == 0) { return; } var subdata = new Object(); subdata["name"] = name; subdata["id"] = id; data_gc.push(subdata); //console.log(name); index_cmdid_gc++; } else { index_cmdid_gc_out++; } }); lineReadercmdid.on("close", function () { console.log( "found cmd id " + index_cmdid_gc + " | no need " + index_cmdid_gc_out ); save_json(data_gc, read_cmdid_output_gc); }); } var found_cmdid_new = 0; var nofound_cmdid_new = 0; var rename_name_cmdid = 0; var noneed_rename_name_cmdid = 0; var data_gc_cmdid_nofound = []; var check_dunp_id = []; function update_cmdid_gc() { const cmd_last = fs.readFileSync(read_cmdid_output); const cmd_old = fs.readFileSync(read_cmdid_output_gc); const json_cmdid_last = JSON.parse(cmd_last); const json_cmdid_old = JSON.parse(cmd_old); json_cmdid_old.forEach(function (s, index) { var id = s.id; var name = s.name; var found_id = json_cmdid_last.find((j) => j.id == id); if (found_id) { found_cmdid_new++; if (name == found_id.name) { noneed_rename_name_cmdid++; } else { rename_name_cmdid++; //console.log("Wow rename -> ID: "+id+" | Name: "+name+" > "+found_id.name); // rename json_cmdid_old s.name = found_id.name; } } else { console.log("Wow nofound -> ID: " + id + " | Name: " + name); data_gc_cmdid_nofound.push(s); nofound_cmdid_new++; } // find dump by id var found_id = check_dunp_id.find((j) => j.id == id); if (found_id) { console.log( "Wow dup -> ID: " + id + " (ADD " + found_id.id + ") | Name Remove: " + name + " (ADD " + found_id.name + ")" ); // remove bad json_cmdid_old.splice(index, 1); } else { check_dunp_id.push(s); } }); // I don't know why this happened but make sure to check again json_cmdid_old.forEach(function (s, index) { var id = s.id; var name = s.name; // maybe need || j.name == name var found_id = json_cmdid_last.find((j) => j.id == id); if (found_id) { if (name != found_id.name) { console.log( "Wow why? -> ID: " + id + " | Name: " + name + " > " + found_id.name ); s.name = found_id.name; } } }); console.log( "found " + found_cmdid_new + " | no found " + nofound_cmdid_new + " | rename " + rename_name_cmdid + " | noneed rename " + noneed_rename_name_cmdid ); save_json(json_cmdid_old, read_cmdid_output_gc_update); save_json(data_gc_cmdid_nofound, read_cmdid_output_gc_nofound); } // save json function save_json(raw, file) { var j = JSON.stringify(raw, null, 4); save(j, file); } function save(raw, file) { fs.writeFile(file, raw, "utf8", function (err) { if (err) { console.log("An error occured while writing to File."); return console.log(err); } console.log("File has been saved."); }); } function cmdid_to_op() { let melon = "\ package emu.grasscutter.net.packet;\ \n\ \npublic class PacketOpcodes {\ \n// Empty\ \npublic static final int NONE = 0;\ \n\ \n// Opcodes\ "; const cmdidfix_raw = fs.readFileSync(read_cmdid_output_gc_update); const json_cmdidfix_raw = JSON.parse(cmdidfix_raw); json_cmdidfix_raw.forEach(function (s) { melon += "\npublic static final int " + s.name + " = " + s.id + ";"; }); melon += "\n}"; save(melon, write_op); // use "npx prettier --write PacketOpcodes.java" for better Formatter } function isBlank(str) { return !!!str || /^\s*$/.test(str); } cmdid_to_op(); //update_cmdid_gc(); //get_cmdid_gc(); //get_cmdid_json(); //check_gen();