Removing `wallops` as a network function; Whitespace cleanup
[KiwiIRC.git] / client / src / models / gateway.js
CommitLineData
eaaf73b0 1_kiwi.model.Gateway = function () {\r
696a66f8
D
2\r
3 // Set to a reference to this object within initialize()\r
4 var that = null;\r
5\r
696a66f8
D
6 this.initialize = function () {\r
7 that = this;\r
09c26937 8\r
696a66f8
D
9 // For ease of access. The socket.io object\r
10 this.socket = this.get('socket');\r
6228b635 11\r
09c26937
D
12 // Used to check if a disconnection was unplanned\r
13 this.disconnect_requested = false;\r
6228b635
D
14 };\r
15\r
16\r
6228b635 17\r
09c26937 18 this.reconnect = function (callback) {\r
d6eec6ed
D
19 var that = this,\r
20 transport_path;\r
21\r
09c26937 22 this.disconnect_requested = true;\r
d99e7823
D
23 this.socket.close();\r
24\r
33432128 25 this.socket = null;\r
c6a65334 26 this.connect(callback);\r
09c26937
D
27 };\r
28\r
29\r
30\r
696a66f8
D
31 /**\r
32 * Connects to the server\r
696a66f8
D
33 * @param {Function} callback A callback function to be invoked once Kiwi's server has connected to the IRC server\r
34 */\r
f2bb5380 35 this.connect = function (callback) {\r
8cc59dbe
D
36 this.connect_callback = callback;\r
37\r
e5baa247
D
38 // Keep note of the server we are connecting to\r
39 this.set('kiwi_server', _kiwi.app.kiwi_server);\r
40\r
33432128 41 this.socket = new EngineioTools.ReconnectingSocket(this.get('kiwi_server'), {\r
9af18c41 42 transports: _kiwi.app.server_settings.transports || ['websocket', 'polling'],\r
d99e7823 43 path: _kiwi.app.get('base_path') + '/transport',\r
d99e7823
D
44 reconnect_max_attempts: 5,\r
45 reconnect_delay: 2000\r
46 });\r
8b0eb787 47\r
33432128 48 this.rpc = new EngineioTools.Rpc(this.socket);\r
f2bb5380 49\r
696a66f8 50 this.socket.on('connect_failed', function (reason) {\r
696a66f8
D
51 this.socket.disconnect();\r
52 this.trigger("connect_fail", {reason: reason});\r
53 });\r
54\r
55 this.socket.on('error', function (e) {\r
eaaf73b0 56 console.log("_kiwi.gateway.socket.on('error')", {reason: e});\r
28b4b095
D
57 if (that.connect_callback) {\r
58 that.connect_callback(e);\r
59 delete that.connect_callback;\r
60 }\r
61\r
696a66f8
D
62 that.trigger("connect_fail", {reason: e});\r
63 });\r
64\r
65 this.socket.on('connecting', function (transport_type) {\r
eaaf73b0 66 console.log("_kiwi.gateway.socket.on('connecting')");\r
696a66f8
D
67 that.trigger("connecting");\r
68 });\r
69\r
70 /**\r
71 * Once connected to the kiwi server send the IRC connect command along\r
72 * with the IRC server details.\r
73 * A `connect` event is sent from the kiwi server once connected to the\r
74 * IRCD and the nick has been accepted.\r
75 */\r
d99e7823 76 this.socket.on('open', function () {\r
09c26937
D
77 // Reset the disconnect_requested flag\r
78 that.disconnect_requested = false;\r
79\r
28635406 80 console.log("_kiwi.gateway.socket.on('open')");\r
696a66f8
D
81 });\r
82\r
d99e7823 83 this.rpc.on('too_many_connections', function () {\r
696a66f8
D
84 that.trigger("connect_fail", {reason: 'too_many_connections'});\r
85 });\r
86\r
d99e7823 87 this.rpc.on('irc', function (response, data) {\r
696a66f8
D
88 that.parse(data.command, data.data);\r
89 });\r
90\r
d99e7823 91 this.rpc.on('kiwi', function (response, data) {\r
d2d91c10
D
92 that.parseKiwi(data.command, data.data);\r
93 });\r
94\r
696a66f8 95 this.socket.on('close', function () {\r
d99e7823 96 that.trigger("disconnect", {});\r
eaaf73b0 97 console.log("_kiwi.gateway.socket.on('close')");\r
696a66f8
D
98 });\r
99\r
d99e7823 100 this.socket.on('reconnecting', function (status) {\r
eaaf73b0 101 console.log("_kiwi.gateway.socket.on('reconnecting')");\r
d99e7823 102 that.trigger("reconnecting", {delay: status.delay, attempts: status.attempts});\r
696a66f8
D
103 });\r
104\r
d99e7823 105 this.socket.on('reconnecting_failed', function () {\r
eaaf73b0 106 console.log("_kiwi.gateway.socket.on('reconnect_failed')");\r
696a66f8
D
107 });\r
108 };\r
109\r
110\r
d6eec6ed
D
111 /**\r
112 * Return a new network object with the new connection details\r
113 */\r
2a27c998 114 this.newConnection = function(connection_info, callback_fn) {\r
d6eec6ed 115 var that = this;\r
2a27c998 116\r
28b4b095
D
117 // If not connected, connect first then re-call this function\r
118 if (!this.isConnected()) {\r
119 this.connect(function(err) {\r
120 if (err) {\r
121 callback_fn(err);\r
122 return;\r
123 }\r
124\r
125 that.newConnection(connection_info, callback_fn);\r
126 });\r
127\r
128 return;\r
129 }\r
130\r
d6eec6ed 131 this.makeIrcConnection(connection_info, function(err, server_num) {\r
c966123a
D
132 var connection;\r
133\r
2a27c998 134 if (!err) {\r
f2bb5380 135 if (!_kiwi.app.connections.getByConnectionId(server_num)){\r
d6eec6ed
D
136 var inf = {\r
137 connection_id: server_num,\r
138 nick: connection_info.nick,\r
139 address: connection_info.host,\r
140 port: connection_info.port,\r
141 ssl: connection_info.ssl,\r
142 password: connection_info.password\r
143 };\r
144 connection = new _kiwi.model.Network(inf);\r
c966123a 145 _kiwi.app.connections.add(connection);\r
2a27c998
D
146 }\r
147\r
d6eec6ed 148 console.log("_kiwi.gateway.socket.on('connect')", connection);\r
c966123a 149 callback_fn && callback_fn(err, connection);\r
09c26937 150\r
2a27c998
D
151 } else {\r
152 console.log("_kiwi.gateway.socket.on('error')", {reason: err});\r
153 callback_fn && callback_fn(err);\r
154 }\r
155 });\r
156 };\r
157\r
d6eec6ed
D
158\r
159 /**\r
160 * Make a new IRC connection and return its connection ID\r
161 */\r
162 this.makeIrcConnection = function(connection_info, callback_fn) {\r
163 var server_info = {\r
d6eec6ed
D
164 nick: connection_info.nick,\r
165 hostname: connection_info.host,\r
166 port: connection_info.port,\r
167 ssl: connection_info.ssl,\r
168 password: connection_info.password\r
169 };\r
170\r
c6a65334
D
171 connection_info.options = connection_info.options || {};\r
172\r
cc54c0a1
D
173 // A few optional parameters\r
174 if (connection_info.options.encoding)\r
175 server_info.encoding = connection_info.options.encoding;\r
176\r
aae35fd3 177 this.rpc.call('kiwi.connect_irc', server_info, function (err, server_num) {\r
d6eec6ed
D
178 if (!err) {\r
179 callback_fn && callback_fn(err, server_num);\r
180\r
181 } else {\r
182 callback_fn && callback_fn(err);\r
183 }\r
184 });\r
185 };\r
186\r
187\r
696a66f8 188 this.isConnected = function () {\r
d99e7823
D
189 // TODO: Check this. Might want to use .readyState\r
190 return this.socket;\r
696a66f8
D
191 };\r
192\r
193\r
d2d91c10
D
194\r
195 this.parseKiwi = function (command, data) {\r
ac102e9d 196 var args;\r
9b95f5f1 197\r
a1629e09
D
198 this.trigger('kiwi:' + command, data);\r
199 this.trigger('kiwi', data);\r
8cc59dbe
D
200\r
201 switch (command) {\r
202 case 'connected':\r
9b95f5f1 203 // Send some info on this client to the server\r
ac102e9d 204 args = {\r
9b95f5f1
D
205 build_version: _kiwi.global.build_version\r
206 };\r
ac102e9d 207 this.rpc.call('kiwi.client_info', args);\r
9b95f5f1 208\r
8cc59dbe
D
209 this.connect_callback && this.connect_callback();\r
210 delete this.connect_callback;\r
9b95f5f1 211\r
8cc59dbe
D
212 break;\r
213 }\r
d2d91c10 214 };\r
ac102e9d 215\r
696a66f8
D
216 /**\r
217 * Parses the response from the server\r
218 */\r
219 this.parse = function (command, data) {\r
ce13508b 220\r
7aa19933 221 // Trigger the connection specific events (used by Network objects)\r
cbdab563
D
222 if (typeof data.connection_id !== 'undefined') {\r
223 that.trigger('connection:' + data.connection_id.toString(), {\r
ce13508b
D
224 event_name: command,\r
225 event_data: data\r
226 });\r
227 }\r
fc9b83de 228\r
7aa19933
D
229 // Trigger the global events\r
230 that.trigger(command, data);\r
696a66f8
D
231 };\r
232\r
ac102e9d
D
233 this.rpcCall = function(method, connection_id) {\r
234 var args = Array.prototype.slice.call(arguments, 0);\r
e7d65587 235\r
ac102e9d
D
236 if (typeof args[1] === 'undefined' || args[1] === null)\r
237 args[1] = _kiwi.app.connections.active_connection.get('connection_id');\r
238\r
239 return this.rpc.call.apply(this.rpc, args);\r
696a66f8
D
240 };\r
241\r
242 /**\r
243 * Sends a PRIVMSG message\r
244 * @param {String} target The target of the message (e.g. a channel or nick)\r
245 * @param {String} msg The message to send\r
246 * @param {Function} callback A callback function\r
247 */\r
e7d65587 248 this.privmsg = function (connection_id, target, msg, callback) {\r
ac102e9d
D
249 var args = {\r
250 target: target,\r
251 msg: msg\r
696a66f8
D
252 };\r
253\r
ac102e9d 254 this.rpcCall('irc.privmsg', connection_id, args, callback);\r
696a66f8
D
255 };\r
256\r
257 /**\r
258 * Sends a NOTICE message\r
259 * @param {String} target The target of the message (e.g. a channel or nick)\r
260 * @param {String} msg The message to send\r
261 * @param {Function} callback A callback function\r
262 */\r
e7d65587 263 this.notice = function (connection_id, target, msg, callback) {\r
ac102e9d
D
264 var args = {\r
265 target: target,\r
266 msg: msg\r
696a66f8
D
267 };\r
268\r
ac102e9d 269 this.rpcCall('irc.notice', connection_id, args, callback);\r
696a66f8
D
270 };\r
271\r
272 /**\r
273 * Sends a CTCP message\r
274 * @param {Boolean} request Indicates whether this is a CTCP request (true) or reply (false)\r
275 * @param {String} type The type of CTCP message, e.g. 'VERSION', 'TIME', 'PING' etc.\r
276 * @param {String} target The target of the message, e.g a channel or nick\r
277 * @param {String} params Additional paramaters\r
278 * @param {Function} callback A callback function\r
279 */\r
d07c8435 280 this.ctcp = function (connection_id, is_request, type, target, params, callback) {\r
ac102e9d 281 var args = {\r
d07c8435 282 is_request: is_request,\r
ac102e9d
D
283 type: type,\r
284 target: target,\r
285 params: params\r
696a66f8
D
286 };\r
287\r
ac102e9d 288 this.rpcCall('irc.ctcp', connection_id, args, callback);\r
696a66f8
D
289 };\r
290\r
d07c8435
D
291 this.ctcpRequest = function (connection_id, type, target, params, callback) {\r
292 this.ctcp(connection_id, true, type, target, params, callback);\r
293 };\r
294 this.ctcpResponse = function (connection_id, type, target, params, callback) {\r
295 this.ctcp(connection_id, false, type, target, params, callback);\r
296 };\r
297\r
696a66f8
D
298 /**\r
299 * @param {String} target The target of the message (e.g. a channel or nick)\r
300 * @param {String} msg The message to send\r
301 * @param {Function} callback A callback function\r
302 */\r
e7d65587 303 this.action = function (connection_id, target, msg, callback) {\r
11177392 304 this.ctcp(connection_id, true, 'ACTION', target, msg, callback);\r
696a66f8
D
305 };\r
306\r
307 /**\r
308 * Joins a channel\r
309 * @param {String} channel The channel to join\r
310 * @param {String} key The key to the channel\r
311 * @param {Function} callback A callback function\r
312 */\r
e7d65587 313 this.join = function (connection_id, channel, key, callback) {\r
ac102e9d
D
314 var args = {\r
315 channel: channel,\r
316 key: key\r
696a66f8
D
317 };\r
318\r
ac102e9d 319 this.rpcCall('irc.join', connection_id, args, callback);\r
696a66f8
D
320 };\r
321\r
72db27e4
D
322 /**\r
323 * Retrieves channel information\r
324 */\r
325 this.channelInfo = function (connection_id, channel, callback) {\r
ac102e9d
D
326 var args = {\r
327 channel: channel\r
72db27e4
D
328 };\r
329\r
ac102e9d 330 this.rpcCall('irc.channel_info', connection_id, args, callback);\r
72db27e4
D
331 };\r
332\r
696a66f8
D
333 /**\r
334 * Leaves a channel\r
335 * @param {String} channel The channel to part\r
336 * @param {Function} callback A callback function\r
337 */\r
e7d65587 338 this.part = function (connection_id, channel, callback) {\r
ac102e9d
D
339 var args = {\r
340 channel: channel\r
696a66f8
D
341 };\r
342\r
ac102e9d 343 this.rpcCall('irc.part', connection_id, args, callback);\r
696a66f8
D
344 };\r
345\r
346 /**\r
347 * Queries or modifies a channell topic\r
348 * @param {String} channel The channel to query or modify\r
349 * @param {String} new_topic The new topic to set\r
350 * @param {Function} callback A callback function\r
351 */\r
e7d65587 352 this.topic = function (connection_id, channel, new_topic, callback) {\r
ac102e9d
D
353 var args = {\r
354 channel: channel,\r
355 topic: new_topic\r
696a66f8
D
356 };\r
357\r
ac102e9d 358 this.rpcCall('irc.topic', connection_id, args, callback);\r
696a66f8
D
359 };\r
360\r
361 /**\r
362 * Kicks a user from a channel\r
363 * @param {String} channel The channel to kick the user from\r
364 * @param {String} nick The nick of the user to kick\r
365 * @param {String} reason The reason for kicking the user\r
366 * @param {Function} callback A callback function\r
367 */\r
e7d65587 368 this.kick = function (connection_id, channel, nick, reason, callback) {\r
ac102e9d
D
369 var args = {\r
370 channel: channel,\r
371 nick: nick,\r
372 reason: reason\r
696a66f8
D
373 };\r
374\r
ac102e9d 375 this.rpcCall('irc.kick', connection_id, args, callback);\r
696a66f8
D
376 };\r
377\r
378 /**\r
379 * Disconnects us from the server\r
380 * @param {String} msg The quit message to send to the IRC server\r
381 * @param {Function} callback A callback function\r
382 */\r
e7d65587 383 this.quit = function (connection_id, msg, callback) {\r
696a66f8 384 msg = msg || "";\r
ac102e9d
D
385\r
386 var args = {\r
387 message: msg\r
696a66f8
D
388 };\r
389\r
ac102e9d 390 this.rpcCall('irc.quit', connection_id, args, callback);\r
696a66f8
D
391 };\r
392\r
393 /**\r
394 * Sends a string unmodified to the IRC server\r
395 * @param {String} data The data to send to the IRC server\r
396 * @param {Function} callback A callback function\r
397 */\r
e7d65587 398 this.raw = function (connection_id, data, callback) {\r
ac102e9d
D
399 var args = {\r
400 data: data\r
696a66f8
D
401 };\r
402\r
ac102e9d 403 this.rpcCall('irc.raw', connection_id, args, callback);\r
696a66f8
D
404 };\r
405\r
406 /**\r
407 * Changes our nickname\r
408 * @param {String} new_nick Our new nickname\r
409 * @param {Function} callback A callback function\r
410 */\r
e7d65587 411 this.changeNick = function (connection_id, new_nick, callback) {\r
ac102e9d
D
412 var args = {\r
413 nick: new_nick\r
696a66f8
D
414 };\r
415\r
ac102e9d 416 this.rpcCall('irc.nick', connection_id, args, callback);\r
696a66f8
D
417 };\r
418\r
72db27e4
D
419 /**\r
420 * Sets a mode for a target\r
421 */\r
422 this.mode = function (connection_id, target, mode_string, callback) {\r
ac102e9d
D
423 var args = {\r
424 data: 'MODE ' + target + ' ' + mode_string\r
72db27e4
D
425 };\r
426\r
ac102e9d 427 this.rpcCall('irc.raw', connection_id, args, callback);\r
72db27e4
D
428 };\r
429\r
d1b3e8b3
VDF
430 /**\r
431 * Sends ENCODING change request to server.\r
432 * @param {String} new_encoding The new proposed encode\r
433 * @param {Fucntion} callback A callback function\r
434 */\r
435 this.setEncoding = function (connection_id, new_encoding, callback) {\r
ac102e9d
D
436 var args = {\r
437 encoding: new_encoding\r
696a66f8
D
438 };\r
439\r
ac102e9d 440 this.rpcCall('irc.encoding', connection_id, args, callback);\r
696a66f8 441 };\r
5bede446 442\r
f3091277 443\r
696a66f8 444 return new (Backbone.Model.extend(this))(arguments);\r
d1b3e8b3 445};\r