Fix typo
[KiwiIRC.git] / client / assets / 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
93e84f75
D
26 // Any options sent down from the server\r
27 this.server_settings = options[0].server_settings || {};\r
0fa2ca42 28 this.translations = options[0].translations || {};\r
93e84f75 29\r
696a66f8
D
30 // Best guess at where the kiwi server is\r
31 this.detectKiwiServer();\r
ce13508b 32\r
2ffd1291 33 // Takes instances of model_network\r
0e546dd4 34 this.connections = new _kiwi.model.NetworkPanelList();\r
4966ba53
D
35\r
36 // Set any default settings before anything else is applied\r
37 if (this.server_settings && this.server_settings.client && this.server_settings.client.settings) {\r
38 this.applyDefaultClientSettings(this.server_settings.client.settings);\r
39 }\r
696a66f8 40 };\r
2ffd1291 41\r
696a66f8
D
42\r
43 this.start = function () {\r
44 // Only debug if set in the querystring\r
45 if (!getQueryVariable('debug')) {\r
46 manageDebug(false);\r
47 } else {\r
48 //manageDebug(true);\r
49 }\r
f2bb5380 50\r
696a66f8 51 // Set the gateway up\r
eaaf73b0
D
52 _kiwi.gateway = new _kiwi.model.Gateway();\r
53 this.bindGatewayCommands(_kiwi.gateway);\r
696a66f8
D
54\r
55 this.initializeClient();\r
56 this.initializeGlobals();\r
57\r
58 this.view.barsHide(true);\r
59\r
f2bb5380 60 this.showIntialConenctionDialog();\r
696a66f8
D
61 };\r
62\r
63\r
696a66f8
D
64 this.detectKiwiServer = function () {\r
65 // If running from file, default to localhost:7777 by default\r
66 if (window.location.protocol === 'file:') {\r
67 this.kiwi_server = 'http://localhost:7778';\r
68 } else {\r
69 // Assume the kiwi server is on the same server\r
70 this.kiwi_server = window.location.protocol + '//' + window.location.host;\r
71 }\r
72 };\r
73\r
74\r
f2bb5380
D
75 this.showIntialConenctionDialog = function() {\r
76 var connection_dialog = new _kiwi.model.NewConnection();\r
77 this.populateDefaultServerSettings(connection_dialog);\r
78\r
4047ee2b
D
79 connection_dialog.view.$el.addClass('initial');\r
80 this.view.$el.find('.panel_container:first').append(connection_dialog.view.$el);\r
f2bb5380 81\r
0935901c 82 var $info = $($('#tmpl_new_connection_info').html().trim());\r
21e3d147 83\r
cdb6781d 84 if ($info.html()) {\r
21e3d147
D
85 connection_dialog.view.infoBoxSet($info);\r
86 connection_dialog.view.infoBoxShow();\r
87 }\r
88\r
f2bb5380
D
89 // TODO: Shouldn't really be here but it's not working in the view.. :/\r
90 // Hack for firefox browers: Focus is not given on this event loop iteration\r
91 setTimeout(function(){\r
92 connection_dialog.view.$el.find('.nick').select();\r
93 }, 0);\r
94\r
95 // Once connected, close this dialog and remove its own event\r
96 var fn = function() {\r
4047ee2b 97 connection_dialog.view.$el.slideUp(function() {\r
4047ee2b
D
98 connection_dialog.view.dispose();\r
99 connection_dialog = null;\r
100\r
f2bb5380
D
101 _kiwi.gateway.off('onconnect', fn);\r
102 });\r
103\r
104 };\r
105 _kiwi.gateway.on('onconnect', fn);\r
106 };\r
107\r
108\r
696a66f8 109 this.initializeClient = function () {\r
eaaf73b0 110 this.view = new _kiwi.view.Application({model: this, el: this.get('container')});\r
c966123a 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
307 // Populate the server select box with defaults\r
f2bb5380 308 new_connection_dialog.view.populateFields(defaults);\r
696a66f8
D
309 };\r
310\r
311\r
6d5faa6e 312 this.panels = (function() {\r
c966123a
D
313 var fn = function(panel_type) {\r
314 var panels;\r
315\r
316 // Default panel type\r
317 panel_type = panel_type || 'connections';\r
318\r
319 switch (panel_type) {\r
320 case 'connections':\r
321 panels = this.connections.panels();\r
322 break;\r
323 case 'applets':\r
324 panels = this.applet_panels.models;\r
325 break;\r
326 }\r
6d5faa6e
D
327\r
328 // Active panels / server\r
329 panels.active = this.connections.active_panel;\r
a9bc007f
D
330 panels.server = this.connections.active_connection ?\r
331 this.connections.active_connection.panels.server :\r
332 null;\r
6d5faa6e
D
333\r
334 return panels;\r
335 };\r
336\r
337 _.extend(fn, Backbone.Events);\r
338\r
339 return fn;\r
340 })();\r
e4de4648
D
341\r
342\r
696a66f8 343 this.bindGatewayCommands = function (gw) {\r
696a66f8
D
344 gw.on('onconnect', function (event) {\r
345 that.view.barsShow();\r
696a66f8
D
346 });\r
347\r
348\r
24d27c8c
D
349 /**\r
350 * Handle the reconnections to the kiwi server\r
351 */\r
696a66f8
D
352 (function () {\r
353 var gw_stat = 0;\r
354\r
355 gw.on('disconnect', function (event) {\r
247dd7ac 356 var msg = _kiwi.global.i18n.translate('client_models_application_reconnecting').fetch() + '...';\r
696a66f8
D
357 that.message.text(msg, {timeout: 10000});\r
358\r
343cd967
PV
359 that.view.$el.removeClass('connected');\r
360\r
696a66f8 361 // Mention the disconnection on every channel\r
24d27c8c
D
362 _kiwi.app.connections.forEach(function(connection) {\r
363 connection.panels.server.addMsg('', msg, 'action quit');\r
364\r
365 connection.panels.forEach(function(panel) {\r
366 if (!panel.isChannel())\r
367 return;\r
368\r
369 panel.addMsg('', msg, 'action quit');\r
370 });\r
696a66f8 371 });\r
696a66f8
D
372\r
373 gw_stat = 1;\r
374 });\r
24d27c8c
D
375\r
376\r
696a66f8 377 gw.on('reconnecting', function (event) {\r
247dd7ac 378 var msg = _kiwi.global.i18n.translate('client_models_application_reconnect_in_x_seconds').fetch(event.delay/1000) + '...';\r
24d27c8c
D
379\r
380 // Only need to mention the repeating re-connection messages on server panels\r
381 _kiwi.app.connections.forEach(function(connection) {\r
382 connection.panels.server.addMsg('', msg, 'action quit');\r
383 });\r
696a66f8 384 });\r
24d27c8c
D
385\r
386\r
343cd967
PV
387 gw.on('onconnect', function (event) {\r
388 that.view.$el.addClass('connected');\r
696a66f8
D
389 if (gw_stat !== 1) return;\r
390\r
247dd7ac 391 var msg = _kiwi.global.i18n.translate('client_models_application_reconnect_successfully').fetch() + ':)';\r
696a66f8
D
392 that.message.text(msg, {timeout: 5000});\r
393\r
394 // Mention the disconnection on every channel\r
24d27c8c
D
395 _kiwi.app.connections.forEach(function(connection) {\r
396 connection.panels.server.addMsg('', msg, 'action join');\r
397\r
398 connection.panels.forEach(function(panel) {\r
399 if (!panel.isChannel())\r
400 return;\r
401\r
402 panel.addMsg('', msg, 'action join');\r
403 });\r
696a66f8 404 });\r
696a66f8
D
405\r
406 gw_stat = 0;\r
407 });\r
408 })();\r
409\r
696a66f8
D
410 };\r
411\r
412\r
413\r
414 /**\r
415 * Bind to certain commands that may be typed into the control box\r
416 */\r
417 this.bindControllboxCommands = function (controlbox) {\r
418 // Default aliases\r
419 $.extend(controlbox.preprocessor.aliases, {\r
420 // General aliases\r
421 '/p': '/part $1+',\r
422 '/me': '/action $1+',\r
423 '/j': '/join $1+',\r
424 '/q': '/query $1+',\r
d6146b37 425 '/w': '/whois $1+',\r
caa5ef1a 426 '/raw': '/quote $1+',\r
696a66f8
D
427\r
428 // Op related aliases\r
429 '/op': '/quote mode $channel +o $1+',\r
430 '/deop': '/quote mode $channel -o $1+',\r
431 '/hop': '/quote mode $channel +h $1+',\r
432 '/dehop': '/quote mode $channel -h $1+',\r
433 '/voice': '/quote mode $channel +v $1+',\r
434 '/devoice': '/quote mode $channel -v $1+',\r
aefbc5e1 435 '/k': '/kick $channel $1+',\r
696a66f8
D
436\r
437 // Misc aliases\r
70c7e208 438 '/slap': '/me slaps $1 around a bit with a large trout'\r
696a66f8
D
439 });\r
440\r
441 controlbox.on('unknown_command', unknownCommand);\r
442\r
443 controlbox.on('command', allCommands);\r
6c58c492 444 controlbox.on('command:msg', msgCommand);\r
696a66f8 445\r
6c58c492 446 controlbox.on('command:action', actionCommand);\r
696a66f8 447\r
6c58c492 448 controlbox.on('command:join', joinCommand);\r
696a66f8 449\r
6c58c492 450 controlbox.on('command:part', partCommand);\r
696a66f8 451\r
6c58c492 452 controlbox.on('command:nick', function (ev) {\r
e7d65587 453 _kiwi.gateway.changeNick(null, ev.params[0]);\r
696a66f8
D
454 });\r
455\r
6c58c492 456 controlbox.on('command:query', queryCommand);\r
696a66f8 457\r
9e77d0e2
D
458 controlbox.on('command:invite', inviteCommand);\r
459\r
6c58c492 460 controlbox.on('command:topic', topicCommand);\r
696a66f8 461\r
6c58c492 462 controlbox.on('command:notice', noticeCommand);\r
696a66f8 463\r
6c58c492 464 controlbox.on('command:quote', quoteCommand);\r
696a66f8 465\r
6c58c492 466 controlbox.on('command:kick', kickCommand);\r
696a66f8 467\r
6c58c492 468 controlbox.on('command:clear', clearCommand);\r
648e2c01 469\r
d8fb3499 470 controlbox.on('command:ctcp', ctcpCommand);\r
b1042f3d 471\r
cdbf2b6f
D
472 controlbox.on('command:server', serverCommand);\r
473\r
d6146b37
D
474 controlbox.on('command:whois', whoisCommand);\r
475\r
374133f1
D
476 controlbox.on('command:whowas', whowasCommand);\r
477\r
d1b3e8b3 478 controlbox.on('command:encoding', encodingCommand);\r
696a66f8 479\r
6c58c492 480 controlbox.on('command:css', function (ev) {\r
696a66f8
D
481 var queryString = '?reload=' + new Date().getTime();\r
482 $('link[rel="stylesheet"]').each(function () {\r
483 this.href = this.href.replace(/\?.*|$/, queryString);\r
484 });\r
485 });\r
486\r
6c58c492 487 controlbox.on('command:js', function (ev) {\r
696a66f8
D
488 if (!ev.params[0]) return;\r
489 $script(ev.params[0] + '?' + (new Date().getTime()));\r
490 });\r
491\r
600bc234 492 \r
6c58c492 493 controlbox.on('command:set', function (ev) {\r
600bc234
D
494 if (!ev.params[0]) return;\r
495\r
496 var setting = ev.params[0],\r
497 value;\r
498\r
499 // Do we have a second param to set a value?\r
500 if (ev.params[1]) {\r
501 ev.params.shift();\r
502\r
503 value = ev.params.join(' ');\r
9383cc07
D
504\r
505 // If we're setting a true boolean value..\r
506 if (value === 'true')\r
507 value = true;\r
508\r
509 // If we're setting a false boolean value..\r
510 if (value === 'false')\r
511 value = false;\r
512\r
513 // If we're setting a number..\r
514 if (parseInt(value, 10).toString() === value)\r
515 value = parseInt(value, 10);\r
516\r
600bc234
D
517 _kiwi.global.settings.set(setting, value);\r
518 }\r
519\r
520 // Read the value to the user\r
6d5faa6e 521 _kiwi.app.panels().active.addMsg('', setting + ' = ' + _kiwi.global.settings.get(setting).toString());\r
600bc234
D
522 });\r
523\r
524\r
6c58c492 525 controlbox.on('command:save', function (ev) {\r
600bc234 526 _kiwi.global.settings.save();\r
247dd7ac 527 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_settings_saved').fetch());\r
600bc234
D
528 });\r
529\r
530\r
6c58c492 531 controlbox.on('command:alias', function (ev) {\r
696a66f8
D
532 var name, rule;\r
533\r
534 // No parameters passed so list them\r
535 if (!ev.params[1]) {\r
536 $.each(controlbox.preprocessor.aliases, function (name, rule) {\r
6d5faa6e 537 _kiwi.app.panels().server.addMsg(' ', name + ' => ' + rule);\r
696a66f8
D
538 });\r
539 return;\r
540 }\r
541\r
542 // Deleting an alias?\r
543 if (ev.params[0] === 'del' || ev.params[0] === 'delete') {\r
544 name = ev.params[1];\r
545 if (name[0] !== '/') name = '/' + name;\r
546 delete controlbox.preprocessor.aliases[name];\r
547 return;\r
548 }\r
549\r
550 // Add the alias\r
551 name = ev.params[0];\r
552 ev.params.shift();\r
553 rule = ev.params.join(' ');\r
554\r
555 // Make sure the name starts with a slash\r
556 if (name[0] !== '/') name = '/' + name;\r
557\r
558 // Now actually add the alias\r
559 controlbox.preprocessor.aliases[name] = rule;\r
560 });\r
561\r
f3091277
D
562 \r
563 controlbox.on('command:ignore', function (ev) {\r
564 var list = _kiwi.gateway.get('ignore_list');\r
565\r
566 // No parameters passed so list them\r
567 if (!ev.params[0]) {\r
568 if (list.length > 0) {\r
247dd7ac 569 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_title').fetch() + ':');\r
f3091277 570 $.each(list, function (idx, ignored_pattern) {\r
6d5faa6e 571 _kiwi.app.panels().active.addMsg(' ', ignored_pattern);\r
f3091277
D
572 });\r
573 } else {\r
247dd7ac 574 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_none').fetch());\r
f3091277
D
575 }\r
576 return;\r
577 }\r
578\r
579 // We have a parameter, so add it\r
580 list.push(ev.params[0]);\r
581 _kiwi.gateway.set('ignore_list', list);\r
247dd7ac 582 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_nick').fetch(ev.params[0]));\r
f3091277
D
583 });\r
584\r
585\r
586 controlbox.on('command:unignore', function (ev) {\r
587 var list = _kiwi.gateway.get('ignore_list');\r
588\r
589 if (!ev.params[0]) {\r
247dd7ac 590 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_stop_notice').fetch());\r
f3091277
D
591 return;\r
592 }\r
593\r
594 list = _.reject(list, function(pattern) {\r
595 return pattern === ev.params[0];\r
596 });\r
597\r
598 _kiwi.gateway.set('ignore_list', list);\r
599\r
247dd7ac 600 _kiwi.app.panels().active.addMsg(' ', _kiwi.global.i18n.translate('client_models_application_ignore_stopped').fetch(ev.params[0]));\r
f3091277
D
601 });\r
602\r
603\r
6c58c492
D
604 controlbox.on('command:applet', appletCommand);\r
605 controlbox.on('command:settings', settingsCommand);\r
22373da6 606 controlbox.on('command:script', scriptCommand);\r
696a66f8
D
607 };\r
608\r
609 // A fallback action. Send a raw command to the server\r
610 function unknownCommand (ev) {\r
611 var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
612 console.log('RAW: ' + raw_cmd);\r
e7d65587 613 _kiwi.gateway.raw(null, raw_cmd);\r
696a66f8
D
614 }\r
615\r
616 function allCommands (ev) {}\r
617\r
618 function joinCommand (ev) {\r
18818abd 619 var panels, channel_names;\r
696a66f8
D
620\r
621 channel_names = ev.params.join(' ').split(',');\r
18818abd 622 panels = that.connections.active_connection.createAndJoinChannels(channel_names);\r
696a66f8 623\r
18818abd 624 // Show the last channel if we have one\r
528cebc6 625 if (panels.length)\r
18818abd 626 panels[panels.length - 1].view.show();\r
696a66f8
D
627 }\r
628\r
629 function queryCommand (ev) {\r
630 var destination, panel;\r
631\r
632 destination = ev.params[0];\r
633\r
634 // Check if we have the panel already. If not, create it\r
6d5faa6e 635 panel = that.connections.active_connection.panels.getByName(destination);\r
696a66f8 636 if (!panel) {\r
eaaf73b0 637 panel = new _kiwi.model.Query({name: destination});\r
6d5faa6e 638 that.connections.active_connection.panels.add(panel);\r
696a66f8
D
639 }\r
640\r
641 if (panel) panel.view.show();\r
642 \r
643 }\r
644\r
645 function msgCommand (ev) {\r
646 var destination = ev.params[0],\r
6d5faa6e 647 panel = that.connections.active_connection.panels.getByName(destination) || that.panels().server;\r
696a66f8
D
648\r
649 ev.params.shift();\r
650\r
e4de4648 651 panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), ev.params.join(' '));\r
e7d65587 652 _kiwi.gateway.privmsg(null, destination, ev.params.join(' '));\r
696a66f8
D
653 }\r
654\r
655 function actionCommand (ev) {\r
6d5faa6e 656 if (_kiwi.app.panels().active.isServer()) {\r
696a66f8
D
657 return;\r
658 }\r
659\r
6d5faa6e 660 var panel = _kiwi.app.panels().active;\r
e4de4648 661 panel.addMsg('', '* ' + _kiwi.app.connections.active_connection.get('nick') + ' ' + ev.params.join(' '), 'action');\r
e7d65587 662 _kiwi.gateway.action(null, panel.get('name'), ev.params.join(' '));\r
696a66f8
D
663 }\r
664\r
665 function partCommand (ev) {\r
666 if (ev.params.length === 0) {\r
e7d65587 667 _kiwi.gateway.part(null, _kiwi.app.panels().active.get('name'));\r
696a66f8
D
668 } else {\r
669 _.each(ev.params, function (channel) {\r
e7d65587 670 _kiwi.gateway.part(null, channel);\r
696a66f8
D
671 });\r
672 }\r
696a66f8
D
673 }\r
674\r
675 function topicCommand (ev) {\r
676 var channel_name;\r
677\r
678 if (ev.params.length === 0) return;\r
679\r
680 if (that.isChannelName(ev.params[0])) {\r
681 channel_name = ev.params[0];\r
682 ev.params.shift();\r
683 } else {\r
6d5faa6e 684 channel_name = _kiwi.app.panels().active.get('name');\r
696a66f8
D
685 }\r
686\r
e7d65587 687 _kiwi.gateway.topic(null, channel_name, ev.params.join(' '));\r
696a66f8
D
688 }\r
689\r
690 function noticeCommand (ev) {\r
691 var destination;\r
692\r
693 // Make sure we have a destination and some sort of message\r
694 if (ev.params.length <= 1) return;\r
695\r
696 destination = ev.params[0];\r
697 ev.params.shift();\r
698\r
e7d65587 699 _kiwi.gateway.notice(null, destination, ev.params.join(' '));\r
696a66f8
D
700 }\r
701\r
702 function quoteCommand (ev) {\r
703 var raw = ev.params.join(' ');\r
e7d65587 704 _kiwi.gateway.raw(null, raw);\r
696a66f8
D
705 }\r
706\r
707 function kickCommand (ev) {\r
6d5faa6e 708 var nick, panel = _kiwi.app.panels().active;\r
696a66f8
D
709\r
710 if (!panel.isChannel()) return;\r
711\r
712 // Make sure we have a nick\r
713 if (ev.params.length === 0) return;\r
714\r
715 nick = ev.params[0];\r
716 ev.params.shift();\r
717\r
e7d65587 718 _kiwi.gateway.kick(null, panel.get('name'), nick, ev.params.join(' '));\r
696a66f8
D
719 }\r
720\r
648e2c01
D
721 function clearCommand (ev) {\r
722 // Can't clear a server or applet panel\r
6d5faa6e 723 if (_kiwi.app.panels().active.isServer() || _kiwi.app.panels().active.isApplet()) {\r
648e2c01
D
724 return;\r
725 }\r
726\r
6d5faa6e
D
727 if (_kiwi.app.panels().active.clearMessages) {\r
728 _kiwi.app.panels().active.clearMessages();\r
648e2c01
D
729 }\r
730 }\r
731\r
b1042f3d
D
732 function ctcpCommand(ev) {\r
733 var target, type;\r
734\r
735 // Make sure we have a target and a ctcp type (eg. version, time)\r
736 if (ev.params.length < 2) return;\r
737\r
738 target = ev.params[0];\r
739 ev.params.shift();\r
740\r
741 type = ev.params[0];\r
742 ev.params.shift();\r
743\r
e7d65587 744 _kiwi.gateway.ctcp(null, true, type, target, ev.params.join(' '));\r
b1042f3d
D
745 }\r
746\r
696a66f8 747 function settingsCommand (ev) {\r
da848c4f
D
748 var settings = _kiwi.model.Applet.loadOnce('kiwi_settings');\r
749 settings.view.show();\r
696a66f8
D
750 }\r
751\r
22373da6
D
752 function scriptCommand (ev) {\r
753 var editor = _kiwi.model.Applet.loadOnce('kiwi_script_editor');\r
754 editor.view.show();\r
755 }\r
756\r
696a66f8
D
757 function appletCommand (ev) {\r
758 if (!ev.params[0]) return;\r
759\r
eaaf73b0 760 var panel = new _kiwi.model.Applet();\r
696a66f8
D
761\r
762 if (ev.params[1]) {\r
763 // Url and name given\r
764 panel.load(ev.params[0], ev.params[1]);\r
765 } else {\r
766 // Load a pre-loaded applet\r
eaaf73b0
D
767 if (_kiwi.applets[ev.params[0]]) {\r
768 panel.load(new _kiwi.applets[ev.params[0]]());\r
696a66f8 769 } else {\r
247dd7ac 770 _kiwi.app.panels().server.addMsg('', _kiwi.global.i18n.translate('client_models_application_applet_notfound').fetch(ev.params[0]));\r
696a66f8
D
771 return;\r
772 }\r
773 }\r
774 \r
6d5faa6e 775 _kiwi.app.connections.active_connection.panels.add(panel);\r
696a66f8
D
776 panel.view.show();\r
777 }\r
778\r
779\r
9e77d0e2
D
780\r
781 function inviteCommand (ev) {\r
782 var nick, channel;\r
783\r
784 // A nick must be specified\r
785 if (!ev.params[0])\r
786 return;\r
787\r
788 // Can only invite into channels\r
789 if (!_kiwi.app.panels().active.isChannel())\r
790 return;\r
791\r
792 nick = ev.params[0];\r
793 channel = _kiwi.app.panels().active.get('name');\r
794\r
795 _kiwi.app.connections.active_connection.gateway.raw('INVITE ' + nick + ' ' + channel);\r
796\r
797 _kiwi.app.panels().active.addMsg('', '== ' + nick + ' has been invited to ' + channel, 'action');\r
798 }\r
799\r
800\r
d6146b37
D
801 function whoisCommand (ev) {\r
802 var nick;\r
803\r
804 if (ev.params[0]) {\r
805 nick = ev.params[0];\r
806 } else if (_kiwi.app.panels().active.isQuery()) {\r
807 nick = _kiwi.app.panels().active.get('name');\r
808 }\r
809\r
4a933496
D
810 if (nick)\r
811 _kiwi.app.connections.active_connection.gateway.raw('WHOIS ' + nick + ' ' + nick);\r
d6146b37
D
812 }\r
813\r
814\r
374133f1
D
815 function whowasCommand (ev) {\r
816 var nick;\r
817\r
818 if (ev.params[0]) {\r
819 nick = ev.params[0];\r
820 } else if (_kiwi.app.panels().active.isQuery()) {\r
821 nick = _kiwi.app.panels().active.get('name');\r
822 }\r
823\r
824 if (nick)\r
825 _kiwi.app.connections.active_connection.gateway.raw('WHOWAS ' + nick);\r
826 }\r
827\r
d1b3e8b3
VDF
828 function encodingCommand (ev) {\r
829 if (ev.params[0]) {\r
3efb4f33
VDF
830 _kiwi.gateway.setEncoding(null, ev.params[0], function (success) {\r
831 if (success) {\r
247dd7ac 832 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_changed').fetch(ev.params[0]));\r
3efb4f33 833 } else {\r
247dd7ac 834 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_invalid').fetch(ev.params[0]));\r
3efb4f33 835 }\r
d1b3e8b3 836 });\r
3efb4f33 837 } else {\r
247dd7ac
N
838 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_notspecified').fetch());\r
839 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_encoding_usage').fetch());\r
d1b3e8b3
VDF
840 }\r
841 }\r
374133f1 842\r
cdbf2b6f
D
843 function serverCommand (ev) {\r
844 var server, port, ssl, password, nick,\r
845 tmp;\r
846\r
3735e390
D
847 // If no server address given, show the new connection dialog\r
848 if (!ev.params[0]) {\r
247dd7ac 849 tmp = new _kiwi.view.MenuBox(_kiwi.global.i18n.translate('client_models_application_connection_create').fetch());\r
3735e390
D
850 tmp.addItem('new_connection', new _kiwi.model.NewConnection().view.$el);\r
851 tmp.show();\r
852\r
853 // Center screen the dialog\r
854 tmp.$el.offset({\r
855 top: (that.view.$el.height() / 2) - (tmp.$el.height() / 2),\r
856 left: (that.view.$el.width() / 2) - (tmp.$el.width() / 2)\r
857 });\r
858\r
859 return;\r
860 }\r
cdbf2b6f
D
861\r
862 // Port given in 'host:port' format and no specific port given after a space\r
863 if (ev.params[0].indexOf(':') > 0) {\r
864 tmp = ev.params[0].split(':');\r
865 server = tmp[0];\r
866 port = tmp[1];\r
867\r
868 password = ev.params[1] || undefined;\r
869\r
870 } else {\r
871 // Server + port given as 'host port'\r
872 server = ev.params[0];\r
873 port = ev.params[1] || 6667;\r
874\r
875 password = ev.params[2] || undefined;\r
876 }\r
877\r
878 // + in the port means SSL\r
879 if (port.toString()[0] === '+') {\r
880 ssl = true;\r
881 port = parseInt(port.substring(1), 10);\r
882 } else {\r
883 ssl = false;\r
884 }\r
885\r
886 // Default port if one wasn't found\r
887 port = port || 6667;\r
888\r
889 // Use the same nick as we currently have\r
890 nick = _kiwi.app.connections.active_connection.get('nick');\r
891\r
247dd7ac 892 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_connection_connecting').fetch(server, port.toString()));\r
cdbf2b6f
D
893\r
894 _kiwi.gateway.newConnection({\r
895 nick: nick,\r
896 host: server,\r
897 port: port,\r
898 ssl: ssl,\r
899 password: password\r
900 }, function(err, new_connection) {\r
901 if (err)\r
247dd7ac 902 _kiwi.app.panels().active.addMsg('', _kiwi.global.i18n.translate('client_models_application_connection_error').fetch(server, port.toString(), err.toString()));\r
cdbf2b6f
D
903 });\r
904 }\r
905\r
906\r
696a66f8
D
907\r
908\r
909\r
910 this.isChannelName = function (channel_name) {\r
eaaf73b0 911 var channel_prefix = _kiwi.gateway.get('channel_prefix');\r
696a66f8
D
912\r
913 if (!channel_name || !channel_name.length) return false;\r
914 return (channel_prefix.indexOf(channel_name[0]) > -1);\r
915 };\r
916\r
fb321ba0 917\r
696a66f8
D
918 };\r
919\r
920\r
921 model = Backbone.Model.extend(new model());\r
922\r
923 return new model(arguments);\r
924};\r