return listeners[command.toUpperCase()](args, irc_connection, callback);\r
};\r
\r
+ClientCommands.prototype.addRpcEvents = function(client, rpc) {\r
+ // Called for each RPC call\r
+ // addRpcMethod() below prepends the incoming RPC call with the method name and\r
+ // the listener that handles this call, and passes that argument list to moduleEventWrap().\r
+ // This gives us the chance to wrap all calls with connection_id checks and passing\r
+ // them off to the module system.\r
+\r
+ var moduleEventWrap = function(rpc_method, the_fn, callback, connection_id) {\r
+ var connection, rpc_args, fn_args;\r
+\r
+ // Make sure we have a connection_id specified\r
+ if (!connection_id && connection_id !== 0) {\r
+ return callback('server not specified');\r
+\r
+ } else if (!client.state.irc_connections[connection_id]) {\r
+ return callback('not connected to server');\r
+ }\r
+\r
+ // The server this command is directed to\r
+ connection = client.state.irc_connections[connection_id];\r
+\r
+ // Get the arguments for the RPC call only (starts at 4)\r
+ rpc_args = Array.prototype.slice.call(arguments, 4);\r
+\r
+ global.modules.emit('rpc ' + rpc_method, {\r
+ arguments: rpc_args,\r
+ client: client,\r
+ connection: connection\r
+ })\r
+ .then(function() {\r
+ // Listeners expect arguments in a (connection, callback, args..n) format, so preppend\r
+ // the connection + callback\r
+ fn_args = rpc_args.slice(0);\r
+ fn_args.unshift(connection, callback);\r
+\r
+ the_fn.apply(client, fn_args);\r
+ }, function() {\r
+ // The RPC call was prevented from running by a module\r
+ });\r
+ };\r
+\r
+ // Quick + easier way to call the above function\r
+ var addRpcMethod = function(rpc_method, fn) {\r
+ rpc.on(rpc_method, _.partial(moduleEventWrap, rpc_method, fn));\r
+ };\r
+\r
+ addRpcMethod('irc.privmsg', listeners.privmsg);\r
+ addRpcMethod('irc.ctcp', listeners.ctcp);\r
+ addRpcMethod('irc.raw', listeners.raw);\r
+ addRpcMethod('irc.join', listeners.join);\r
+ addRpcMethod('irc.channel_info', listeners.channel_info);\r
+ addRpcMethod('irc.part', listeners.part);\r
+ addRpcMethod('irc.topic', listeners.topic);\r
+ addRpcMethod('irc.kick', listeners.kick);\r
+ addRpcMethod('irc.quit', listeners.quit);\r
+ addRpcMethod('irc.notice', listeners.notice);\r
+ addRpcMethod('irc.mode', listeners.mode);\r
+ addRpcMethod('irc.nick', listeners.nick);\r
+ addRpcMethod('irc.kiwi', listeners.kiwi);\r
+ addRpcMethod('irc.encoding', listeners.encoding);\r
+};\r
+\r
\r
\r
\r
\r
\r
var listeners = {\r
- PRIVMSG: function (args, irc_connection, callback) {\r
+ privmsg: function (irc_connection, callback, args) {\r
// Maximum length of target + message we can send to the IRC server is 500 characters\r
// but we need to leave extra room for the sender prefix so the entire message can\r
// be sent from the IRCd to the target without being truncated.\r
-\r
var blocks = truncateString(args.msg, 350);\r
+\r
blocks.forEach(function (block, idx) {\r
// Apply the callback on the last message only\r
var cb = (idx === blocks.length - 1) ?\r
irc_connection.write('PRIVMSG ' + args.target + ' :' + block, cb);\r
});\r
},\r
- \r
\r
- CTCP: function (args, irc_connection, callback) {\r
+\r
+ ctcp: function (irc_connection, callback, args) {\r
if ((args.target) && (args.type)) {\r
- if (args.request) {\r
+ if (args.is_request) {\r
irc_connection.write('PRIVMSG ' + args.target + ' :' + String.fromCharCode(1) + args.type.toUpperCase() + ' ' + args.params + String.fromCharCode(1), callback);\r
} else {\r
irc_connection.write('NOTICE ' + args.target + ' :' + String.fromCharCode(1) + args.type.toUpperCase() + ' ' + args.params + String.fromCharCode(1), callback);\r
},\r
\r
\r
- RAW: function (args, irc_connection, callback) {\r
+ raw: function (irc_connection, callback, args) {\r
irc_connection.write(args.data, callback);\r
},\r
\r
\r
- JOIN: function (args, irc_connection, callback) {\r
+ join: function (irc_connection, callback, args) {\r
+ var channels, keys;\r
if (args.channel) {\r
channels = args.channel.split(",");\r
keys = (args.key) ? args.key.split(",") : [];\r
},\r
\r
\r
- PART: function (args, irc_connection, callback) {\r
+ channel_info: function (irc_connection, callback, args) {\r
+ if (args.channel) {\r
+ irc_connection.write('MODE ' + args.channel, callback);\r
+ }\r
+ },\r
+\r
+\r
+ part: function (irc_connection, callback, args) {\r
if (args.channel) {\r
_.each(args.channel.split(","), function (chan) {\r
- irc_connection.write('PART ' + chan, callback);\r
+ irc_connection.write('PART ' + chan + (args.message ? ' :' + args.message : ''), callback);\r
});\r
}\r
},\r
\r
\r
- TOPIC: function (args, irc_connection, callback) {\r
+ topic: function (irc_connection, callback, args) {\r
if (args.channel) {\r
if (args.topic) {\r
irc_connection.write('TOPIC ' + args.channel + ' :' + args.topic, callback);\r
},\r
\r
\r
- KICK: function (args, irc_connection, callback) {\r
+ kick: function (irc_connection, callback, args) {\r
if ((args.channel) && (args.nick)) {\r
irc_connection.write('KICK ' + args.channel + ' ' + args.nick + ' :' + args.reason, callback);\r
}\r
},\r
\r
\r
- QUIT: function (args, irc_connection, callback) {\r
- websocket.ircConnection.end('QUIT :' + args.message + '\r\n');\r
- websocket.sentQUIT = true;\r
- websocket.ircConnection.destroySoon();\r
- websocket.disconnect();\r
+ quit: function (irc_connection, callback, args) {\r
+ irc_connection.end('QUIT :' + (args.message||''));\r
},\r
\r
\r
- NOTICE: function (args, irc_connection, callback) {\r
+ notice: function (irc_connection, callback, args) {\r
// Maximum length of target + message we can send to the IRC server is 500 characters\r
// but we need to leave extra room for the sender prefix so the entire message can\r
// be sent from the IRCd to the target without being truncated.\r
},\r
\r
\r
- MODE: function (args, irc_connection, callback) {\r
+ mode: function (irc_connection, callback, args) {\r
if ((args.target) && (args.mode)) {\r
irc_connection.write('MODE ' + args.target + ' ' + args.mode + ' ' + args.params, callback);\r
}\r
},\r
\r
\r
- NICK: function (args, irc_connection, callback) {\r
+ nick: function (irc_connection, callback, args) {\r
if (args.nick) {\r
irc_connection.write('NICK ' + args.nick, callback);\r
}\r
},\r
\r
\r
- KIWI: function (args, irc_connection, callback) {\r
+ kiwi: function (irc_connection, callback, args) {\r
if ((args.target) && (args.data)) {\r
irc_connection.write('PRIVMSG ' + args.target + ': ' + String.fromCharCode(1) + 'KIWI ' + args.data + String.fromCharCode(1), callback);\r
}\r
},\r
\r
- ENCODING: function (args, irc_connection, callback) {\r
+ encoding: function (irc_connection, callback, args) {\r
if (args.encoding) {\r
- if (irc_connection.setEncoding(args.encoding)) {\r
- return callback('Encoding modified to '+args.encoding);\r
- } else {\r
- return callback(args.encoding+' is not a valid encoding');\r
- }\r
+ return callback(irc_connection.setEncoding(args.encoding));\r
}\r
}\r
};\r