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