+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