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