tennu
Version:
Tennu - Modular IRC Bot Framework for Node.js
78 lines (63 loc) • 2.83 kB
JavaScript
const format = require("util").format;
const inspect = require("util").inspect;
const EventEmitter = require("after-events");
const Message = require("../lib/message");
const Promise = require("bluebird");
const Response = require("../lib/response");
module.exports = {
init: function (client, deps) {
const emitter = Object.create(EventEmitter());
var isupport;
const parse = function (raw) {
const message = new Message(raw, isupport);
if (message === null) {
client.error("Raw message given was not a valid IRC message!", raw);
return null;
}
client.debug("MessageHandler", format("Emitting '%s'.", message.command.toLowerCase()));
emitter.emit(message.command.toLowerCase(), message);
if (message.replyname) {
client.debug("MessageHandler", format("Emitting '%s'.", message.replyname.toLowerCase()));
emitter.emit(message.replyname.toLowerCase(), message);
}
client.debug("MessageHandler", "Emitting '*'");
emitter.emit("*", message);
return message;
};
emitter.after(function (err, res, type, message) {
// Intent := "say" | "act" | "ctcp" | "notice" | "none"
// Target: NickName | ChannelName
// ReturnResponse := {message: String | [CtcpType, CtcpBody], intent: Intent, target: Target, query: Boolean}
// Result = undefined | string | [string] | ReturnResponse
// err := Error
// res := Result | Promise<Result>
// type := string
// message := Message
if (err) {
client.error("MessageHandler", "Error thrown in message handler!");
client.error("MessageHandler", err.stack);
return;
}
if (message.channel !== undefined) {
Promise.resolve(res)
.then(function (into_response) { return Response.create(into_response, message); })
.then(function (response) { Response.send(response, client); })
.catch(function (_error) {
client.error("MessageHandler", format("MessageHandler for '%s' returned invalid response `%s`.", message.message, inspect(res)));
});
}
});
client._socket.on("data", parse);
return {
subscribe: {
prefix: deps.subscriber.defaultPrefix,
emitter: emitter
},
exports: {
isupport: function (isupportObj) { isupport = isupportObj; },
afterEmit: emitter.after.bind(emitter)
}
};
},
requires: ["subscriber", "action"]
}