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