Verifying reverse DNS lookups
[KiwiIRC.git] / client / src / models / application.js
CommitLineData
eaaf73b0 1_kiwi.model.Application = function () {\r
696a66f8
D
2 // Set to a reference to this object within initialize()\r
3 var that = null;\r
4\r
696a66f8
D
5\r
6 var model = function () {\r
eaaf73b0 7 /** _kiwi.view.Application */\r
696a66f8
D
8 this.view = null;\r
9\r
eaaf73b0 10 /** _kiwi.view.StatusMessage */\r
696a66f8
D
11 this.message = null;\r
12\r
13 /* Address for the kiwi server */\r
14 this.kiwi_server = null;\r
15\r
16 this.initialize = function (options) {\r
17 that = this;\r
18\r
19 if (options[0].container) {\r
20 this.set('container', options[0].container);\r
21 }\r
22\r
23 // The base url to the kiwi server\r
8b0eb787 24 this.set('base_path', options[0].base_path ? options[0].base_path : '/kiwi');\r
696a66f8 25\r
bceb5db6
D
26 // Path for the settings.json file\r
27 this.set('settings_path', options[0].settings_path ?\r
28 options[0].settings_path :\r
29 this.get('base_path') + '/assets/settings.json'\r
30 );\r
31\r
93e84f75
D
32 // Any options sent down from the server\r
33 this.server_settings = options[0].server_settings || {};\r
0fa2ca42 34 this.translations = options[0].translations || {};\r
93e84f75 35\r
696a66f8
D
36 // Best guess at where the kiwi server is\r
37 this.detectKiwiServer();\r
ce13508b 38\r
4966ba53
D
39 // Set any default settings before anything else is applied\r
40 if (this.server_settings && this.server_settings.client && this.server_settings.client.settings) {\r
41 this.applyDefaultClientSettings(this.server_settings.client.settings);\r
42 }\r
696a66f8 43 };\r
2ffd1291 44\r
696a66f8
D
45\r
46 this.start = function () {\r
696a66f8 47 // Set the gateway up\r
eaaf73b0
D
48 _kiwi.gateway = new _kiwi.model.Gateway();\r
49 this.bindGatewayCommands(_kiwi.gateway);\r
696a66f8
D
50\r
51 this.initializeClient();\r
52 this.initializeGlobals();\r
53\r
54 this.view.barsHide(true);\r
55\r
f2bb5380 56 this.showIntialConenctionDialog();\r
696a66f8
D
57 };\r
58\r
59\r
696a66f8
D
60 this.detectKiwiServer = function () {\r
61 // If running from file, default to localhost:7777 by default\r
62 if (window.location.protocol === 'file:') {\r
63 this.kiwi_server = 'http://localhost:7778';\r
64 } else {\r
65 // Assume the kiwi server is on the same server\r
66 this.kiwi_server = window.location.protocol + '//' + window.location.host;\r
67 }\r
68 };\r
69\r
70\r
f2bb5380
D
71 this.showIntialConenctionDialog = function() {\r
72 var connection_dialog = new _kiwi.model.NewConnection();\r
73 this.populateDefaultServerSettings(connection_dialog);\r
74\r
4047ee2b
D
75 connection_dialog.view.$el.addClass('initial');\r
76 this.view.$el.find('.panel_container:first').append(connection_dialog.view.$el);\r
f2bb5380 77\r
0935901c 78 var $info = $($('#tmpl_new_connection_info').html().trim());\r
21e3d147 79\r
cdb6781d 80 if ($info.html()) {\r
21e3d147
D
81 connection_dialog.view.infoBoxSet($info);\r
82 connection_dialog.view.infoBoxShow();\r
83 }\r
84\r
f2bb5380
D
85 // TODO: Shouldn't really be here but it's not working in the view.. :/\r
86 // Hack for firefox browers: Focus is not given on this event loop iteration\r
87 setTimeout(function(){\r
88 connection_dialog.view.$el.find('.nick').select();\r
89 }, 0);\r
90\r
91 // Once connected, close this dialog and remove its own event\r
92 var fn = function() {\r
4047ee2b 93 connection_dialog.view.$el.slideUp(function() {\r
4047ee2b
D
94 connection_dialog.view.dispose();\r
95 connection_dialog = null;\r
96\r
f2bb5380
D
97 _kiwi.gateway.off('onconnect', fn);\r
98 });\r
99\r
100 };\r
101 _kiwi.gateway.on('onconnect', fn);\r
102 };\r
103\r
104\r
696a66f8 105 this.initializeClient = function () {\r
eaaf73b0 106 this.view = new _kiwi.view.Application({model: this, el: this.get('container')});\r
c966123a 107\r
d199cacf
D
108 // Takes instances of model_network\r
109 this.connections = new _kiwi.model.NetworkPanelList();\r
110\r
f2bb5380 111 // Applets panel list\r
c966123a
D
112 this.applet_panels = new _kiwi.model.PanelList();\r
113 this.applet_panels.view.$el.addClass('panellist applets');\r
de214968 114 this.view.$el.find('.tabs').append(this.applet_panels.view.$el);\r
c966123a 115\r
ce13508b
D
116 /**\r
117 * Set the UI components up\r
118 */\r
1e85105e 119 this.controlbox = new _kiwi.view.ControlBox({el: $('#kiwi .controlbox')[0]});\r
696a66f8
D
120 this.bindControllboxCommands(this.controlbox);\r
121\r
de214968 122 this.topicbar = new _kiwi.view.TopicBar({el: this.view.$el.find('.topic')[0]});\r
696a66f8 123\r
4f99a29b 124 new _kiwi.view.AppToolbar({el: _kiwi.app.view.$el.find('.toolbar .app_tools')[0]});\r
7de3dd03 125\r
707593d2 126 this.message = new _kiwi.view.StatusMessage({el: this.view.$el.find('.status_message')[0]});\r
696a66f8 127\r
30f9f42a 128 this.resize_handle = new _kiwi.view.ResizeHandler({el: this.view.$el.find('.memberlists_resize_handle')[0]});\r
696a66f8
D
129\r
130 // Rejigg the UI sizes\r
131 this.view.doLayout();\r
696a66f8
D
132 };\r
133\r
134\r
135 this.initializeGlobals = function () {\r
6d5faa6e 136 _kiwi.global.connections = this.connections;\r
a9bc007f
D
137\r
138 _kiwi.global.panels = this.panels;\r
139 _kiwi.global.panels.applets = this.applet_panels;\r
140\r
6228b635
D
141 _kiwi.global.components.Applet = _kiwi.model.Applet;\r
142 _kiwi.global.components.Panel =_kiwi.model.Panel;\r
696a66f8
D
143 };\r
144\r
145\r
1cfc4800
JA
146 this.applyDefaultClientSettings = function (settings) {\r
147 _.each(settings, function (value, setting) {\r
148 if (typeof _kiwi.global.settings.get(setting) === 'undefined') {\r
149 _kiwi.global.settings.set(setting, value);\r
150 }\r
151 });\r
1cfc4800
JA
152 };\r
153\r
154\r
f2bb5380 155 this.populateDefaultServerSettings = function (new_connection_dialog) {\r
696a66f8
D
156 var parts;\r
157 var defaults = {\r
5e84a85a 158 nick: '',\r
46f41dfb 159 server: '',\r
696a66f8
D
160 port: 6667,\r
161 ssl: false,\r
5e84a85a 162 channel: '#chat',\r
2f54e55e 163 channel_key: ''\r
696a66f8 164 };\r
2f54e55e 165 var uricheck;\r
696a66f8 166\r
76391784
D
167\r
168 /**\r
169 * Get any settings set by the server\r
5e84a85a 170 * These settings may be changed in the server selection dialog or via URL parameters\r
76391784
D
171 */\r
172 if (this.server_settings.client) {\r
173 if (this.server_settings.client.nick)\r
174 defaults.nick = this.server_settings.client.nick;\r
175\r
176 if (this.server_settings.client.server)\r
177 defaults.server = this.server_settings.client.server;\r
178\r
179 if (this.server_settings.client.port)\r
180 defaults.port = this.server_settings.client.port;\r
181\r
182 if (this.server_settings.client.ssl)\r
183 defaults.ssl = this.server_settings.client.ssl;\r
184\r
185 if (this.server_settings.client.channel)\r
186 defaults.channel = this.server_settings.client.channel;\r
6d86afeb
JA
187\r
188 if (this.server_settings.client.channel_key)\r
189 defaults.channel_key = this.server_settings.client.channel_key;\r
76391784
D
190 }\r
191\r
192\r
193\r
194 /**\r
195 * Get any settings passed in the URL\r
196 * These settings may be changed in the server selection dialog\r
197 */\r
198\r
5e84a85a
D
199 // Any query parameters first\r
200 if (getQueryVariable('nick'))\r
201 defaults.nick = getQueryVariable('nick');\r
202\r
203 if (window.location.hash)\r
204 defaults.channel = window.location.hash;\r
205\r
206\r
696a66f8
D
207 // Process the URL part by part, extracting as we go\r
208 parts = window.location.pathname.toString().replace(this.get('base_path'), '').split('/');\r
209\r
210 if (parts.length > 0) {\r
211 parts.shift();\r
212\r
213 if (parts.length > 0 && parts[0]) {\r
4f8da37d 214 // Check to see if we're dealing with an irc: uri, or whether we need to extract the server/channel info from the HTTP URL path.\r
2f54e55e
JA
215 uricheck = parts[0].substr(0, 7).toLowerCase();\r
216 if ((uricheck === 'ircs%3a') || (uricheck.substr(0,6) === 'irc%3a')) {\r
217 parts[0] = decodeURIComponent(parts[0]);\r
2f54e55e
JA
218 // irc[s]://<host>[:<port>]/[<channel>[?<password>]]\r
219 uricheck = /^irc(s)?:(?:\/\/?)?([^:\/]+)(?::([0-9]+))?(?:(?:\/)([^\?]*)(?:(?:\?)(.*))?)?$/.exec(parts[0]);\r
4f8da37d
JA
220 /*\r
221 uricheck[1] = ssl (optional)\r
222 uricheck[2] = host\r
223 uricheck[3] = port (optional)\r
224 uricheck[4] = channel (optional)\r
225 uricheck[5] = channel key (optional, channel must also be set)\r
226 */\r
2f54e55e 227 if (uricheck) {\r
4f8da37d 228 if (typeof uricheck[1] !== 'undefined') {\r
2f54e55e
JA
229 defaults.ssl = true;\r
230 if (defaults.port === 6667) {\r
231 defaults.port = 6697;\r
232 }\r
233 }\r
234 defaults.server = uricheck[2];\r
4f8da37d 235 if (typeof uricheck[3] !== 'undefined') {\r
2f54e55e
JA
236 defaults.port = uricheck[3];\r
237 }\r
4f8da37d 238 if (typeof uricheck[4] !== 'undefined') {\r
2f54e55e 239 defaults.channel = '#' + uricheck[4];\r
4f8da37d 240 if (typeof uricheck[5] !== 'undefined') {\r
2f54e55e
JA
241 defaults.channel_key = uricheck[5];\r
242 }\r
243 }\r
244 }\r
2f54e55e
JA
245 parts = [];\r
246 } else {\r
247 // Extract the port+ssl if we find one\r
248 if (parts[0].search(/:/) > 0) {\r
249 defaults.port = parts[0].substring(parts[0].search(/:/) + 1);\r
250 defaults.server = parts[0].substring(0, parts[0].search(/:/));\r
251 if (defaults.port[0] === '+') {\r
252 defaults.port = parseInt(defaults.port.substring(1), 10);\r
253 defaults.ssl = true;\r
254 } else {\r
255 defaults.ssl = false;\r
256 }\r
257\r
696a66f8 258 } else {\r
2f54e55e 259 defaults.server = parts[0];\r
696a66f8
D
260 }\r
261\r
2f54e55e 262 parts.shift();\r
696a66f8 263 }\r
696a66f8
D
264 }\r
265\r
266 if (parts.length > 0 && parts[0]) {\r
267 defaults.channel = '#' + parts[0];\r
268 parts.shift();\r
269 }\r
270 }\r
271\r
93e84f75 272 // If any settings have been given by the server.. override any auto detected settings\r
76391784
D
273 /**\r
274 * Get any server restrictions as set in the server config\r
46f41dfb 275 * These settings can not be changed in the server selection dialog\r
76391784 276 */\r
93e84f75
D
277 if (this.server_settings && this.server_settings.connection) {\r
278 if (this.server_settings.connection.server) {\r
279 defaults.server = this.server_settings.connection.server;\r
280 }\r
281\r
282 if (this.server_settings.connection.port) {\r
283 defaults.port = this.server_settings.connection.port;\r
284 }\r
285\r
286 if (this.server_settings.connection.ssl) {\r
287 defaults.ssl = this.server_settings.connection.ssl;\r
288 }\r
289\r
290 if (this.server_settings.connection.channel) {\r
291 defaults.channel = this.server_settings.connection.channel;\r
292 }\r
293\r
6d86afeb
JA
294 if (this.server_settings.connection.channel_key) {\r
295 defaults.channel_key = this.server_settings.connection.channel_key;\r
296 }\r
297\r
93e84f75
D
298 if (this.server_settings.connection.nick) {\r
299 defaults.nick = this.server_settings.connection.nick;\r
300 }\r
301 }\r
93e84f75 302\r
696a66f8
D
303 // Set any random numbers if needed\r
304 defaults.nick = defaults.nick.replace('?', Math.floor(Math.random() * 100000).toString());\r
305\r
cc54c0a1
D
306 if (getQueryVariable('encoding'))\r
307 defaults.encoding = getQueryVariable('encoding');\r
308\r
696a66f8 309 // Populate the server select box with defaults\r
f2bb5380 310 new_connection_dialog.view.populateFields(defaults);\r
696a66f8
D
311 };\r
312\r
313\r
6d5faa6e 314 this.panels = (function() {\r
c966123a
D
315 var fn = function(panel_type) {\r
316 var panels;\r
317\r
318 // Default panel type\r
319 panel_type = panel_type || 'connections';\r
320\r
321 switch (panel_type) {\r
322 case 'connections':\r
323 panels = this.connections.panels();\r
324 break;\r
325 case 'applets':\r
326 panels = this.applet_panels.models;\r
327 break;\r
328 }\r
6d5faa6e
D
329\r
330 // Active panels / server\r
331 panels.active = this.connections.active_panel;\r
a9bc007f
D
332 panels.server = this.connections.active_connection ?\r
333 this.connections.active_connection.panels.server :\r
334 null;\r
6d5faa6e
D
335\r
336 return panels;\r
337 };\r
338\r
339 _.extend(fn, Backbone.Events);\r
340\r
341 return fn;\r
342 })();\r
e4de4648
D
343\r
344\r
696a66f8 345 this.bindGatewayCommands = function (gw) {\r
645fe41b
JA
346 var that = this;\r
347\r
696a66f8
D
348 gw.on('onconnect', function (event) {\r
349 that.view.barsShow();\r
696a66f8
D
350 });\r
351\r
352\r
24d27c8c
D
353 /**\r
354 * Handle the reconnections to the kiwi server\r
355 */\r
696a66f8 356 (function () {\r
d6eec6ed 357 // 0 = non-reconnecting state. 1 = reconnecting state.\r
696a66f8 358 var gw_stat = 0;\r
d6eec6ed
D
359\r
360 // If the current or upcoming disconnect was planned\r
09c26937 361 var unplanned_disconnect = false;\r
696a66f8
D
362\r
363 gw.on('disconnect', function (event) {\r
09c26937
D
364 unplanned_disconnect = !gw.disconnect_requested;\r
365\r
366 if (unplanned_disconnect) {\r
367 var msg = _kiwi.global.i18n.translate('client_models_application_reconnecting').fetch() + '...';\r
368 that.message.text(msg, {timeout: 10000});\r
369 }\r
696a66f8 370\r
343cd967
PV
371 that.view.$el.removeClass('connected');\r
372\r
696a66f8 373 // Mention the disconnection on every channel\r
24d27c8c
D
374 _kiwi.app.connections.forEach(function(connection) {\r
375 connection.panels.server.addMsg('', msg, 'action quit');\r
376\r
377 connection.panels.forEach(function(panel) {\r
378 if (!panel.isChannel())\r
379 return;\r
380\r
381 panel.addMsg('', msg, 'action quit');\r
382 });\r
696a66f8 383 });\r
696a66f8
D
384\r
385 gw_stat = 1;\r
386 });\r
24d27c8c
D
387\r
388\r
696a66f8 389 gw.on('reconnecting', function (event) {\r
247dd7ac 390 var msg = _kiwi.global.i18n.translate('client_models_application_reconnect_in_x_seconds').fetch(event.delay/1000) + '...';\r
24d27c8c
D
391\r
392 // Only need to mention the repeating re-connection messages on server panels\r
393 _kiwi.app.connections.forEach(function(connection) {\r
394 connection.panels.server.addMsg('', msg, 'action quit');\r
395 });\r
696a66f8 396 });\r
24d27c8c
D
397\r
398\r
343cd967
PV
399 gw.on('onconnect', function (event) {\r
400 that.view.$el.addClass('connected');\r
696a66f8
D
401 if (gw_stat !== 1) return;\r
402\r
09c26937
D
403 if (unplanned_disconnect) {\r
404 var msg = _kiwi.global.i18n.translate('client_models_application_reconnect_successfully').fetch() + ':)';\r
405 that.message.text(msg, {timeout: 5000});\r
406 }\r
696a66f8 407\r
d6eec6ed 408 // Mention the re-connection on every channel\r
24d27c8c
D
409 _kiwi.app.connections.forEach(function(connection) {\r
410 connection.panels.server.addMsg('', msg, 'action join');\r
411\r
412 connection.panels.forEach(function(panel) {\r
413 if (!panel.isChannel())\r
414 return;\r
415\r
416 panel.addMsg('', msg, 'action join');\r
417 });\r
696a66f8 418 });\r
696a66f8
D
419\r
420 gw_stat = 0;\r
421 });\r
422 })();\r
423\r
09c26937 424\r
645fe41b 425 gw.on('kiwi:reconfig', function () {\r
bceb5db6 426 $.getJSON(that.get('settings_path'), function (data) {\r
645fe41b
JA
427 that.server_settings = data.server_settings || {};\r
428 that.translations = data.translations || {};\r
429 });\r
430 });\r
09c26937
D
431\r
432\r
433 gw.on('kiwi:jumpserver', function (data) {\r
d6eec6ed
D
434 var serv;\r
435 // No server set? Then nowhere to jump to.\r
436 if (typeof data.kiwi_server === 'undefined')\r
437 return;\r
438\r
439 serv = data.kiwi_server;\r
440\r
441 // Strip any trailing slash from the end\r
442 if (serv[serv.length-1] === '/')\r
443 serv = serv.substring(0, serv.length-1);\r
444\r
445 _kiwi.app.kiwi_server = serv;\r
09c26937
D
446\r
447 // Force the jumpserver now?\r
448 if (data.force) {\r
bf169745
D
449 // Get an interval between 5 and 6 minutes so everyone doesn't reconnect it all at once\r
450 var jump_server_interval = Math.random() * (360 - 300) + 300;\r
09c26937 451\r
bf169745 452 // Tell the user we are going to disconnect, wait 5 minutes then do the actual reconnect\r
a749d105 453 var msg = _kiwi.global.i18n.translate('client_models_application_jumpserver_prepare').fetch();\r
09c26937
D
454 that.message.text(msg, {timeout: 10000});\r
455\r
456 setTimeout(function forcedReconnect() {\r
a749d105 457 var msg = _kiwi.global.i18n.translate('client_models_application_jumpserver_reconnect').fetch();\r
09c26937
D
458 that.message.text(msg, {timeout: 8000});\r
459\r
460 setTimeout(function forcedReconnectPartTwo() {\r
d6eec6ed
D
461 _kiwi.gateway.reconnect(function() {\r
462 // Reconnect all the IRC connections\r
463 that.connections.forEach(function(con){ con.reconnect(); });\r
464 });\r
09c26937
D
465 }, 5000);\r
466\r
467 }, jump_server_interval * 1000);\r
468 }\r
469 });\r
696a66f8
D
470 };\r
471\r
472\r
473\r
474 /**\r
475 * Bind to certain commands that may be typed into the control box\r
476 */\r
477 this.bindControllboxCommands = function (controlbox) {\r
478 // Default aliases\r
479 $.extend(controlbox.preprocessor.aliases, {\r
480 // General aliases\r
481 '/p': '/part $1+',\r
482 '/me': '/action $1+',\r
483 '/j': '/join $1+',\r
484 '/q': '/query $1+',\r
d6146b37 485 '/w': '/whois $1+',\r
caa5ef1a 486 '/raw': '/quote $1+',\r
696a66f8
D
487\r
488 // Op related aliases\r
489 '/op': '/quote mode $channel +o $1+',\r
490 '/deop': '/quote mode $channel -o $1+',\r
491 '/hop': '/quote mode $channel +h $1+',\r
492 '/dehop': '/quote mode $channel -h $1+',\r
493 '/voice': '/quote mode $channel +v $1+',\r
494 '/devoice': '/quote mode $channel -v $1+',\r
aefbc5e1 495 '/k': '/kick $channel $1+',\r
696a66f8
D
496\r
497 // Misc aliases\r
70c7e208 498 '/slap': '/me slaps $1 around a bit with a large trout'\r
696a66f8
D
499 });\r
500\r
501 controlbox.on('unknown_command', unknownCommand);\r
502\r
503 controlbox.on('command', allCommands);\r
6c58c492 504 controlbox.on('command:msg', msgCommand);\r
696a66f8 505\r
6c58c492 506 controlbox.on('command:action', actionCommand);\r
696a66f8 507\r
6c58c492 508 controlbox.on('command:join', joinCommand);\r
696a66f8 509\r
6c58c492 510 controlbox.on('command:part', partCommand);\r
696a66f8 511\r
6c58c492 512 controlbox.on('command:nick', function (ev) {\r
e7d65587 513 _kiwi.gateway.changeNick(null, ev.params[0]);\r
696a66f8
D
514 });\r
515\r
6c58c492 516 controlbox.on('command:query', queryCommand);\r
696a66f8 517\r
9e77d0e2
D
518 controlbox.on('command:invite', inviteCommand);\r
519\r
6c58c492 520 controlbox.on('command:topic', topicCommand);\r
696a66f8 521\r
6c58c492 522 controlbox.on('command:notice', noticeCommand);\r
696a66f8 523\r
6c58c492 524 controlbox.on('command:quote', quoteCommand);\r
696a66f8 525\r
6c58c492 526 controlbox.on('command:kick', kickCommand);\r
696a66f8 527\r
6c58c492 528 controlbox.on('command:clear', clearCommand);\r
648e2c01 529\r
d8fb3499 530 controlbox.on('command:ctcp', ctcpCommand);\r
b1042f3d 531\r
cdbf2b6f
D
532 controlbox.on('command:server', serverCommand);\r
533\r
d6146b37
D
534 controlbox.on('command:whois', whoisCommand);\r
535\r
374133f1
D
536 controlbox.on('command:whowas', whowasCommand);\r
537\r
d1b3e8b3 538 controlbox.on('command:encoding', encodingCommand);\r
696a66f8 539\r
6c58c492 540 controlbox.on('command:css', function (ev) {\r
696a66f8
D
541 var queryString = '?reload=' + new Date().getTime();\r
542 $('link[rel="stylesheet"]').each(function () {\r
543 this.href = this.href.replace(/\?.*|$/, queryString);\r
544 });\r
545 });\r
546\r
6c58c492 547 controlbox.on('command:js', function (ev) {\r
696a66f8
D
548 if (!ev.params[0]) return;\r
549 $script(ev.params[0] + '?' + (new Date().getTime()));\r
550 });\r
551\r
09c26937 552\r
6c58c492 553 controlbox.on('command:set', function (ev) {\r
600bc234
D
554 if (!ev.params[0]) return;\r
555\r
556 var setting = ev.params[0],\r
557 value;\r
558\r
559 // Do we have a second param to set a value?\r
560 if (ev.params[1]) {\r
561 ev.params.shift();\r
562\r
563 value = ev.params.join(' ');\r
9383cc07
D
564\r
565 // If we're setting a true boolean value..\r
566 if (value === 'true')\r
567 value = true;\r
568\r
569 // If we're setting a false boolean value..\r
570 if (value === 'false')\r
571 value = false;\r
572\r
573 // If we're setting a number..\r
574 if (parseInt(value, 10).toString() === value)\r
575 value = parseInt(value, 10);\r
576\r
600bc234
D
577 _kiwi.global.settings.set(setting, value);\r
578 }\r
579\r
580 // Read the value to the user\r
6d5faa6e 581 _kiwi.app.panels().active.addMsg('', setting + ' = ' + _kiwi.global.settings.get(setting).toString());\r
600bc234
D
582 });\r
583\r
584\r
6c58c492 585 controlbox.on('command:save', function (ev) {\r
600bc234 586 _kiwi.global.settings.save();\r
247dd7ac 587 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_settings_saved').fetch());\r
600bc234
D
588 });\r
589\r
590\r
6c58c492 591 controlbox.on('command:alias', function (ev) {\r
696a66f8
D
592 var name, rule;\r
593\r
594 // No parameters passed so list them\r
595 if (!ev.params[1]) {\r
596 $.each(controlbox.preprocessor.aliases, function (name, rule) {\r
6d5faa6e 597 _kiwi.app.panels().server.addMsg(' ', name + ' => ' + rule);\r
696a66f8
D
598 });\r
599 return;\r
600 }\r
601\r
602 // Deleting an alias?\r
603 if (ev.params[0] === 'del' || ev.params[0] === 'delete') {\r
604 name = ev.params[1];\r
605 if (name[0] !== '/') name = '/' + name;\r
606 delete controlbox.preprocessor.aliases[name];\r
607 return;\r
608 }\r
609\r
610 // Add the alias\r
611 name = ev.params[0];\r
612 ev.params.shift();\r
613 rule = ev.params.join(' ');\r
614\r
615 // Make sure the name starts with a slash\r
616 if (name[0] !== '/') name = '/' + name;\r
617\r
618 // Now actually add the alias\r
619 controlbox.preprocessor.aliases[name] = rule;\r
620 });\r
621\r
09c26937 622\r
f3091277
D
623 controlbox.on('command:ignore', function (ev) {\r
624 var list = _kiwi.gateway.get('ignore_list');\r
625\r
626 // No parameters passed so list them\r
627 if (!ev.params[0]) {\r
628 if (list.length > 0) {\r
247dd7ac 629 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_title').fetch() + ':');\r
f3091277 630 $.each(list, function (idx, ignored_pattern) {\r
6d5faa6e 631 _kiwi.app.panels().active.addMsg(' ', ignored_pattern);\r
f3091277
D
632 });\r
633 } else {\r
247dd7ac 634 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_none').fetch());\r
f3091277
D
635 }\r
636 return;\r
637 }\r
638\r
639 // We have a parameter, so add it\r
640 list.push(ev.params[0]);\r
641 _kiwi.gateway.set('ignore_list', list);\r
247dd7ac 642 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_nick').fetch(ev.params[0]));\r
f3091277
D
643 });\r
644\r
645\r
646 controlbox.on('command:unignore', function (ev) {\r
647 var list = _kiwi.gateway.get('ignore_list');\r
648\r
649 if (!ev.params[0]) {\r
247dd7ac 650 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_stop_notice').fetch());\r
f3091277
D
651 return;\r
652 }\r
653\r
654 list = _.reject(list, function(pattern) {\r
655 return pattern === ev.params[0];\r
656 });\r
657\r
658 _kiwi.gateway.set('ignore_list', list);\r
659\r
247dd7ac 660 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_stopped').fetch(ev.params[0]));\r
f3091277
D
661 });\r
662\r
663\r
6c58c492
D
664 controlbox.on('command:applet', appletCommand);\r
665 controlbox.on('command:settings', settingsCommand);\r
22373da6 666 controlbox.on('command:script', scriptCommand);\r
696a66f8
D
667 };\r
668\r
669 // A fallback action. Send a raw command to the server\r
670 function unknownCommand (ev) {\r
671 var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
672 console.log('RAW: ' + raw_cmd);\r
e7d65587 673 _kiwi.gateway.raw(null, raw_cmd);\r
696a66f8
D
674 }\r
675\r
676 function allCommands (ev) {}\r
677\r
678 function joinCommand (ev) {\r
18818abd 679 var panels, channel_names;\r
696a66f8
D
680\r
681 channel_names = ev.params.join(' ').split(',');\r
18818abd 682 panels = that.connections.active_connection.createAndJoinChannels(channel_names);\r
696a66f8 683\r
18818abd 684 // Show the last channel if we have one\r
528cebc6 685 if (panels.length)\r
18818abd 686 panels[panels.length - 1].view.show();\r
696a66f8
D
687 }\r
688\r
689 function queryCommand (ev) {\r
a61a7bc8 690 var destination, message, panel;\r
696a66f8
D
691\r
692 destination = ev.params[0];\r
a61a7bc8
D
693 ev.params.shift();\r
694\r
695 message = ev.params.join(' ');\r
696a66f8
D
696\r
697 // Check if we have the panel already. If not, create it\r
6d5faa6e 698 panel = that.connections.active_connection.panels.getByName(destination);\r
696a66f8 699 if (!panel) {\r
eaaf73b0 700 panel = new _kiwi.model.Query({name: destination});\r
6d5faa6e 701 that.connections.active_connection.panels.add(panel);\r
696a66f8
D
702 }\r
703\r
704 if (panel) panel.view.show();\r
09c26937 705\r
a61a7bc8
D
706 if (message) {\r
707 that.connections.active_connection.gateway.msg(panel.get('name'), message);\r
708 panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), message);\r
709 }\r
710\r
696a66f8
D
711 }\r
712\r
713 function msgCommand (ev) {\r
b166c1ac
D
714 var message,\r
715 destination = ev.params[0],\r
6d5faa6e 716 panel = that.connections.active_connection.panels.getByName(destination) || that.panels().server;\r
696a66f8
D
717\r
718 ev.params.shift();\r
b166c1ac 719 message = formatToIrcMsg(ev.params.join(' '));\r
696a66f8 720\r
b166c1ac
D
721 panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), message);\r
722 _kiwi.gateway.privmsg(null, destination, message);\r
696a66f8
D
723 }\r
724\r
725 function actionCommand (ev) {\r
6d5faa6e 726 if (_kiwi.app.panels().active.isServer()) {\r
696a66f8
D
727 return;\r
728 }\r
729\r
6d5faa6e 730 var panel = _kiwi.app.panels().active;\r
e4de4648 731 panel.addMsg('', '* ' + _kiwi.app.connections.active_connection.get('nick') + ' ' + ev.params.join(' '), 'action');\r
e7d65587 732 _kiwi.gateway.action(null, panel.get('name'), ev.params.join(' '));\r
696a66f8
D
733 }\r
734\r
735 function partCommand (ev) {\r
736 if (ev.params.length === 0) {\r
e7d65587 737 _kiwi.gateway.part(null, _kiwi.app.panels().active.get('name'));\r
696a66f8
D
738 } else {\r
739 _.each(ev.params, function (channel) {\r
e7d65587 740 _kiwi.gateway.part(null, channel);\r
696a66f8
D
741 });\r
742 }\r
696a66f8
D
743 }\r
744\r
745 function topicCommand (ev) {\r
746 var channel_name;\r
747\r
748 if (ev.params.length === 0) return;\r
749\r
750 if (that.isChannelName(ev.params[0])) {\r
751 channel_name = ev.params[0];\r
752 ev.params.shift();\r
753 } else {\r
6d5faa6e 754 channel_name = _kiwi.app.panels().active.get('name');\r
696a66f8
D
755 }\r
756\r
e7d65587 757 _kiwi.gateway.topic(null, channel_name, ev.params.join(' '));\r
696a66f8
D
758 }\r
759\r
760 function noticeCommand (ev) {\r
761 var destination;\r
762\r
763 // Make sure we have a destination and some sort of message\r
764 if (ev.params.length <= 1) return;\r
765\r
766 destination = ev.params[0];\r
767 ev.params.shift();\r
768\r
e7d65587 769 _kiwi.gateway.notice(null, destination, ev.params.join(' '));\r
696a66f8
D
770 }\r
771\r
772 function quoteCommand (ev) {\r
773 var raw = ev.params.join(' ');\r
e7d65587 774 _kiwi.gateway.raw(null, raw);\r
696a66f8
D
775 }\r
776\r
777 function kickCommand (ev) {\r
6d5faa6e 778 var nick, panel = _kiwi.app.panels().active;\r
696a66f8
D
779\r
780 if (!panel.isChannel()) return;\r
781\r
782 // Make sure we have a nick\r
783 if (ev.params.length === 0) return;\r
784\r
785 nick = ev.params[0];\r
786 ev.params.shift();\r
787\r
e7d65587 788 _kiwi.gateway.kick(null, panel.get('name'), nick, ev.params.join(' '));\r
696a66f8
D
789 }\r
790\r
648e2c01
D
791 function clearCommand (ev) {\r
792 // Can't clear a server or applet panel\r
6d5faa6e 793 if (_kiwi.app.panels().active.isServer() || _kiwi.app.panels().active.isApplet()) {\r
648e2c01
D
794 return;\r
795 }\r
796\r
6d5faa6e
D
797 if (_kiwi.app.panels().active.clearMessages) {\r
798 _kiwi.app.panels().active.clearMessages();\r
648e2c01
D
799 }\r
800 }\r
801\r
b1042f3d
D
802 function ctcpCommand(ev) {\r
803 var target, type;\r
804\r
805 // Make sure we have a target and a ctcp type (eg. version, time)\r
806 if (ev.params.length < 2) return;\r
807\r
808 target = ev.params[0];\r
809 ev.params.shift();\r
810\r
811 type = ev.params[0];\r
812 ev.params.shift();\r
813\r
e7d65587 814 _kiwi.gateway.ctcp(null, true, type, target, ev.params.join(' '));\r
b1042f3d
D
815 }\r
816\r
696a66f8 817 function settingsCommand (ev) {\r
da848c4f
D
818 var settings = _kiwi.model.Applet.loadOnce('kiwi_settings');\r
819 settings.view.show();\r
696a66f8
D
820 }\r
821\r
22373da6
D
822 function scriptCommand (ev) {\r
823 var editor = _kiwi.model.Applet.loadOnce('kiwi_script_editor');\r
824 editor.view.show();\r
825 }\r
826\r
696a66f8
D
827 function appletCommand (ev) {\r
828 if (!ev.params[0]) return;\r
829\r
eaaf73b0 830 var panel = new _kiwi.model.Applet();\r
696a66f8
D
831\r
832 if (ev.params[1]) {\r
833 // Url and name given\r
834 panel.load(ev.params[0], ev.params[1]);\r
835 } else {\r
836 // Load a pre-loaded applet\r
eaaf73b0
D
837 if (_kiwi.applets[ev.params[0]]) {\r
838 panel.load(new _kiwi.applets[ev.params[0]]());\r
696a66f8 839 } else {\r
247dd7ac 840 _kiwi.app.panels().server.addMsg('', _kiwi.global.i18n.translate('client_models_application_applet_notfound').fetch(ev.params[0]));\r
696a66f8
D
841 return;\r
842 }\r
843 }\r
09c26937 844\r
6d5faa6e 845 _kiwi.app.connections.active_connection.panels.add(panel);\r
696a66f8
D
846 panel.view.show();\r
847 }\r
848\r
849\r
9e77d0e2
D
850\r
851 function inviteCommand (ev) {\r
852 var nick, channel;\r
853\r
854 // A nick must be specified\r
855 if (!ev.params[0])\r
856 return;\r
857\r
858 // Can only invite into channels\r
859 if (!_kiwi.app.panels().active.isChannel())\r
860 return;\r
861\r
862 nick = ev.params[0];\r
863 channel = _kiwi.app.panels().active.get('name');\r
864\r
865 _kiwi.app.connections.active_connection.gateway.raw('INVITE ' + nick + ' ' + channel);\r
866\r
867 _kiwi.app.panels().active.addMsg('', '== ' + nick + ' has been invited to ' + channel, 'action');\r
868 }\r
869\r
870\r
d6146b37
D
871 function whoisCommand (ev) {\r
872 var nick;\r
873\r
874 if (ev.params[0]) {\r
875 nick = ev.params[0];\r
876 } else if (_kiwi.app.panels().active.isQuery()) {\r
877 nick = _kiwi.app.panels().active.get('name');\r
878 }\r
879\r
4a933496
D
880 if (nick)\r
881 _kiwi.app.connections.active_connection.gateway.raw('WHOIS ' + nick + ' ' + nick);\r
d6146b37
D
882 }\r
883\r
884\r
374133f1
D
885 function whowasCommand (ev) {\r
886 var nick;\r
887\r
888 if (ev.params[0]) {\r
889 nick = ev.params[0];\r
890 } else if (_kiwi.app.panels().active.isQuery()) {\r
891 nick = _kiwi.app.panels().active.get('name');\r
892 }\r
893\r
894 if (nick)\r
895 _kiwi.app.connections.active_connection.gateway.raw('WHOWAS ' + nick);\r
896 }\r
897\r
d1b3e8b3
VDF
898 function encodingCommand (ev) {\r
899 if (ev.params[0]) {\r
3efb4f33
VDF
900 _kiwi.gateway.setEncoding(null, ev.params[0], function (success) {\r
901 if (success) {\r
247dd7ac 902 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_changed').fetch(ev.params[0]));\r
3efb4f33 903 } else {\r
247dd7ac 904 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_invalid').fetch(ev.params[0]));\r
3efb4f33 905 }\r
d1b3e8b3 906 });\r
3efb4f33 907 } else {\r
247dd7ac
N
908 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_notspecified').fetch());\r
909 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_usage').fetch());\r
d1b3e8b3
VDF
910 }\r
911 }\r
374133f1 912\r
cdbf2b6f
D
913 function serverCommand (ev) {\r
914 var server, port, ssl, password, nick,\r
915 tmp;\r
916\r
3735e390
D
917 // If no server address given, show the new connection dialog\r
918 if (!ev.params[0]) {\r
247dd7ac 919 tmp = new _kiwi.view.MenuBox(_kiwi.global.i18n.translate('client_models_application_connection_create').fetch());\r
3735e390
D
920 tmp.addItem('new_connection', new _kiwi.model.NewConnection().view.$el);\r
921 tmp.show();\r
922\r
923 // Center screen the dialog\r
924 tmp.$el.offset({\r
925 top: (that.view.$el.height() / 2) - (tmp.$el.height() / 2),\r
926 left: (that.view.$el.width() / 2) - (tmp.$el.width() / 2)\r
927 });\r
928\r
929 return;\r
930 }\r
cdbf2b6f
D
931\r
932 // Port given in 'host:port' format and no specific port given after a space\r
933 if (ev.params[0].indexOf(':') > 0) {\r
934 tmp = ev.params[0].split(':');\r
935 server = tmp[0];\r
936 port = tmp[1];\r
937\r
938 password = ev.params[1] || undefined;\r
939\r
940 } else {\r
941 // Server + port given as 'host port'\r
942 server = ev.params[0];\r
943 port = ev.params[1] || 6667;\r
944\r
945 password = ev.params[2] || undefined;\r
946 }\r
947\r
948 // + in the port means SSL\r
949 if (port.toString()[0] === '+') {\r
950 ssl = true;\r
951 port = parseInt(port.substring(1), 10);\r
952 } else {\r
953 ssl = false;\r
954 }\r
955\r
956 // Default port if one wasn't found\r
957 port = port || 6667;\r
958\r
959 // Use the same nick as we currently have\r
960 nick = _kiwi.app.connections.active_connection.get('nick');\r
961\r
247dd7ac 962 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_connection_connecting').fetch(server, port.toString()));\r
cdbf2b6f
D
963\r
964 _kiwi.gateway.newConnection({\r
965 nick: nick,\r
966 host: server,\r
967 port: port,\r
968 ssl: ssl,\r
969 password: password\r
970 }, function(err, new_connection) {\r
971 if (err)\r
247dd7ac 972 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_connection_error').fetch(server, port.toString(), err.toString()));\r
cdbf2b6f
D
973 });\r
974 }\r
975\r
976\r
696a66f8
D
977\r
978\r
979\r
980 this.isChannelName = function (channel_name) {\r
eaaf73b0 981 var channel_prefix = _kiwi.gateway.get('channel_prefix');\r
696a66f8
D
982\r
983 if (!channel_name || !channel_name.length) return false;\r
984 return (channel_prefix.indexOf(channel_name[0]) > -1);\r
985 };\r
986\r
fb321ba0 987\r
696a66f8
D
988 };\r
989\r
990\r
991 model = Backbone.Model.extend(new model());\r
992\r
993 return new model(arguments);\r
994};\r