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