transit-im
Version:
express-like framework for AIM bots creation (ICQ as well)
171 lines (151 loc) • 4.76 kB
JavaScript
// Generated by CoffeeScript 1.6.3
(function() {
var Aliases, EventEmitter, GLOBAL, memLoad, memSave, parser, _,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
parser = require('../command_parser/parser');
_ = require('underscore');
EventEmitter = require('events').EventEmitter;
Aliases = (function(_super) {
__extends(Aliases, _super);
function Aliases(aliases, options) {
if (aliases == null) {
aliases = [];
}
this.options = options != null ? options : {
define: "alias",
autohelp: "registers alias of the existent command"
};
this.aliases = aliases.map(this._compile);
}
Aliases.prototype.define = function(pattern, replacement, autohelp) {
var alias;
this.aliases = _.reject(this.aliases, function(a) {
return a.pattern === pattern;
});
alias = {
pattern: pattern,
replacement: replacement
};
if (autohelp) {
alias.autohelp = autohelp;
}
if (replacement) {
this.aliases.push(this._compile(alias));
}
return this.emit("change", this.aliases.map(function(a) {
return _.omit(a, "parsedPattern");
}));
};
Aliases.prototype._compile = function(aliasDef) {
aliasDef.parsedPattern = parser.parsePattern(aliasDef.pattern);
return aliasDef;
};
Aliases.prototype._handler = function() {
throw new Error("Alias handler shall never be called");
};
Aliases.prototype.addToHandlers = function(request) {
var aliases, self,
_this = this;
aliases = this.aliases.map(function(a) {
return {
pattern: a.pattern,
autohelp: a.autohelp,
handler: function() {
return this._handler;
}
};
});
self = [
{
pattern: "alias {newCommand} {existentCommand} {description}",
autohelp: this.options.autohelp,
handler: this._handler
}
];
return request.attr("handlers", request.handlers.slice().concat(self).concat(aliases));
};
Aliases.prototype.process = function(request) {
this.processCommand(request);
return this.addToHandlers(request);
};
Aliases.prototype.processCommand = function(request) {
var parsedCommand;
if (!request.data) {
return;
}
parsedCommand = parser.parseCommand(request.data);
if (parsedCommand.cmd === this.options.define) {
this.define.apply(this, parsedCommand.args);
request.attr("data", null);
return request.attr("command", "alias-defined");
} else {
return this.replace(request, parsedCommand);
}
};
Aliases.prototype.replace = function(request, _arg) {
var args, cmd,
_this = this;
cmd = _arg.cmd, args = _arg.args;
return this.aliases.forEach(function(a) {
var matched, newCmd;
matched = a.parsedPattern.match(cmd, args);
if (matched) {
newCmd = parser.processArgs(a.replacement, function(arg) {
_.each(matched.args, function(value, name) {
return arg = arg.replace(new RegExp("\\{" + name + "\\}", "gi"), value);
});
return arg;
});
request.attr("data", newCmd);
return _this.processCommand(request);
}
});
};
return Aliases;
})(EventEmitter);
memLoad = function() {
return [];
};
memSave = function() {};
GLOBAL = "global";
module.exports = function(load, save) {
var getAliases, global, oldLoad;
if (load == null) {
load = memLoad;
}
if (save == null) {
save = memSave;
}
global = null;
if (load.length <= 1) {
oldLoad = load;
load = function(name, cb) {
return cb(oldLoad(name));
};
}
getAliases = function(req, cb) {
var aliasesId;
if (global) {
return cb(global);
}
aliasesId = GLOBAL;
return load(aliasesId, function(aliases) {
global = new Aliases(aliases);
global.on("change", function(aliases) {
return save(aliasesId, aliases);
});
return cb(global);
});
};
return function(req, res, next) {
if (!req.data) {
return next();
}
getAliases(req, function(aliases) {
return aliases.process(req);
});
return next();
};
};
}).call(this);