Merge branch 'development'
[KiwiIRC.git] / server / clientcommands.js
index d87e13c55a4d615b6f055b33a2d6367e0c87f58d..11375ea6369e32af19b2b9ffa1059078e19a79c4 100644 (file)
@@ -17,6 +17,68 @@ ClientCommands.prototype.run = function (command, args, irc_connection, callback
     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
@@ -40,12 +102,12 @@ function truncateString(str, block_size) {
 \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
@@ -57,9 +119,9 @@ var listeners = {
     },\r
 \r
 \r
-    CTCP: function (args, irc_connection, callback) {\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
@@ -68,12 +130,13 @@ var listeners = {
     },\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
@@ -84,23 +147,23 @@ var listeners = {
     },\r
 \r
 \r
-    CHANNEL_INFO: 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 (args, irc_connection, callback) {\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
@@ -111,22 +174,19 @@ var listeners = {
     },\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
@@ -143,27 +203,27 @@ var listeners = {
     },\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
             return callback(irc_connection.setEncoding(args.encoding));\r
         }\r