dbot/modules-stock/minify/minify.js

123 lines
4.2 KiB
JavaScript
Raw Permalink Normal View History

/**
* Name: Minify
* Description: Provides url minifier functionality via one of a number of URL Minifier services
*/
var request = require('request'),
_ = require('underscore')._;
var minify = function(dbot) {
// This is where you provide support for new minifiers
// callback(miniURL, error);
// this.config contains only the configuration options for the given minifier
// example: if your minifier is "bitly" then this.config.myvalue = config.json entry "minifiers-bitly-myvalue"
this.minifiers = {
'bitly': function(url, callback) {
request({
'url': this.config.url,
'qs': {
'access_token': this.config.access_token,
'longUrl': encodeURI(url)
},
'json': true
}, function(error, response, body) {
if(!error && response.statusCode == 200) {
if (body.status_code == 200) {
callback(body.data.url);
} else {
var emsg = function() {
switch(body.status_txt) {
case "INVALID_URI": return "Invalid URL was supplied";
default: return body.status_txt;
}
}
callback(false, emsg);
}
} else {
callback(false, error);
}
});
}
};
// API
// minify(url, minifier, callback(miniUrl, error))
// calls 'callback' with a minified url string, or false. if 'false' the error parameter may be populated.
// if minifier is undefined then the default minifier is used
this.api = {
'minify': function(url, minifier, callback) {
if (typeof minifier === "function") {
callback = minifier;
minifier = this.config.defaultMinifier;
}
if (!minifier) minifier = this.config.defaultMinifier;
var mf = this.minifiers[minifier.trim()];
if (!mf) {
// specified minifier does not exist
callback(false, "minifier_not_found");
return;
}
mf(url, callback)
}
};
// Commands
// ~minify URL
// returns a minified URL using the default minifier
// ex: "~minify http://google.com"
// ~minify minifier URL
// returns a minified URL using the specified minifier
// ex: "~minify goo.gl http://google.com"
// ex: "~minify bit.ly http://google.com"
this.commands = {
'~minify': function(event) {
this.api.minify(event.input[2].trim(), event.input[1], function(mUrl, error) {
if (mUrl) {
event.reply(dbot.t('success', { 'miniurl': mUrl }));
} else {
if(error == "minifier_not_found") {
event.reply(dbot.t('fail-bad-minimizer'));
} else {
event.reply(dbot.t('fail', { 'reason': error }));
}
}
});
}
};
this.commands['~minify'].regex = [/^minify ([\d\w-]+[\d\w\s-]*[ ])?(.+)$/, 3];
this.onLoad = function() {
this.minifiers = _.mapObject(this.minifiers, function(m, mName) {
var minifierConfig = _.pick(this.config, function(v,k) { return k.startsWith("minifier-" + mName + "-"); });
minifierConfig = _.reduce(minifierConfig, function(r,v,k) {
var tlk = "minifier-" + mName + "-";
var tlkl = tlk.length;
var nk = k.slice(tlkl);
r[nk] = v;
return r;
}, { });
var minifier = {
name: mName,
config: minifierConfig
}
return m.bind(minifier);
}.bind(this));
}.bind(this);
}
exports.fetch = function(dbot) {
return new minify(dbot);
};