"use strict"; var fs = require("fs") , crypto = require("crypto") , path = require("path") , AdmZip = require('adm-zip') , async = require("async") , log = console.log /** * Small Utilities */ var cleanText = module.exports.cleanText = function (str) { return str.replace(/[\s\-\_\.]+/, '') } , isArray = module.exports.isArray = function (blob) { return Object.prototype.toString.call(blob) === '[object Array]' } , isString = module.exports.isString = function (blob) { return typeof blob === "string" } module.exports.extend = function extend (origin, add) { // Don't do anything if add isn't an object if (!add || typeof add !== 'object') return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; } /** * Find mod info */ module.exports.find_mod_info = function find_mod_info (file, cb) { var zip = new AdmZip(file); zip.readAsTextAsync("mcmod.info", function (info) { // if (!! err) return cb(err); if (!info || info.length == 0) { // try with the darn pack.mcmeta info = zip.readAsText("pack.mcmeta"); } try { info = JSON.parse(info); } catch(e) { info = ''; } if (info.length == 0) { var basename = path.basename(file) , name = path.basename(file).replace(path.extname(file), '').replace(/[\s\[\]\.]+/g, '') console.log("Mod %s does not have an mcmod.info", path.basename(file)) console.log("falling back to name: %s", name) return cb(null, cleanText(name), name); } if (isArray(info)) info = info[0]; if (!! info["modlist"]) info = info["modlist"][0]; if (!! info["name"]) return cb(null, cleanText(info["modid"] || info["name"]), info["name"]); if (!! info["pack"]) return cb(null, cleanText(info["pack"]["description"]), info["pack"]["description"]); }); } /** * Zip a directory inside a zip file */ module.exports.zipDir = function zipDir(cwd, filename, target_dir) { var prev_cwd = process.cwd(); process.chdir(cwd); var zip = new AdmZip(); zip.addLocalFolder(target_dir, target_dir); zip.writeZip(filename); process.chdir(prev_cwd); } /** * MD5 sum of files */ module.exports.md5sum = function md5sum(file, cb) { var hasher = crypto.createHash('md5'); var s = fs.ReadStream(file); s.on('data', function(d) { hasher.update(d); }); s.on('end', function() { var d = hasher.digest('hex'); cb(null, d); }); s.on('error', function(err){ cb(err); }); } /** * Iterate each file in directory * * WARN! ASYNC operation. use a queue to process the files */ module.exports.eachFile = function eachFile (dir, cb){ log("eachFile: " + dir) fs.readdir(dir, function (err, files) { if (!! err) throw err; files = files.filter(function(el) { return (/\.(zip|jar)$/i).test(el) && !(/^idfix.*/i).test(el) }) async.each(files, function (file, next) { log("loking for "+ dir + '/' + file); fs.stat( dir + '/' + file, function (err, f) { if (!! err) return next(err); log("sending: "+ file) if (! f.isDirectory()) { log("sending: "+ file) cb(err, file); return next(); } }) }) }) };