UNPKG

transit-im

Version:

express-like framework for AIM bots creation (ICQ as well)

171 lines (151 loc) 4.76 kB
// 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);