Correctly switching between polling/websockets
[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
903f9288 19 this.set('base_path', options.base_path ? options.base_path : '');\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
1c098c72 31 this.text_theme = options.text_theme || {};\r
93e84f75 32\r
9ea8542e 33 // Best guess at where the kiwi server is if not already specified\r
3dc62fbb 34 this.kiwi_server = options.kiwi_server || this.detectKiwiServer();\r
ce13508b 35\r
17f187e6
D
36 // The applet to initially load\r
37 this.startup_applet_name = options.startup || 'kiwi_startup';\r
38\r
4966ba53
D
39 // Set any default settings before anything else is applied\r
40 if (this.server_settings && this.server_settings.client && this.server_settings.client.settings) {\r
41 this.applyDefaultClientSettings(this.server_settings.client.settings);\r
42 }\r
3dc62fbb 43 },\r
2ffd1291 44\r
696a66f8 45\r
6b8fbed0 46 initializeInterfaces: function () {\r
696a66f8 47 // Set the gateway up\r
eaaf73b0
D
48 _kiwi.gateway = new _kiwi.model.Gateway();\r
49 this.bindGatewayCommands(_kiwi.gateway);\r
696a66f8
D
50\r
51 this.initializeClient();\r
52 this.initializeGlobals();\r
53\r
54 this.view.barsHide(true);\r
3dc62fbb 55 },\r
696a66f8
D
56\r
57\r
3dc62fbb 58 detectKiwiServer: function () {\r
696a66f8
D
59 // If running from file, default to localhost:7777 by default\r
60 if (window.location.protocol === 'file:') {\r
9ea8542e 61 return 'http://localhost:7778';\r
696a66f8
D
62 } else {\r
63 // Assume the kiwi server is on the same server\r
9ea8542e 64 return window.location.protocol + '//' + window.location.host;\r
696a66f8 65 }\r
3dc62fbb 66 },\r
696a66f8
D
67\r
68\r
17f187e6
D
69 showStartup: function() {\r
70 this.startup_applet = _kiwi.model.Applet.load(this.startup_applet_name, {no_tab: true});\r
71 this.startup_applet.tab = this.view.$('.console');\r
72 this.startup_applet.view.show();\r
3dc62fbb 73 },\r
f2bb5380
D
74\r
75\r
3dc62fbb 76 initializeClient: function () {\r
eaaf73b0 77 this.view = new _kiwi.view.Application({model: this, el: this.get('container')});\r
c966123a 78\r
d199cacf
D
79 // Takes instances of model_network\r
80 this.connections = new _kiwi.model.NetworkPanelList();\r
81\r
f2bb5380 82 // Applets panel list\r
c966123a
D
83 this.applet_panels = new _kiwi.model.PanelList();\r
84 this.applet_panels.view.$el.addClass('panellist applets');\r
de214968 85 this.view.$el.find('.tabs').append(this.applet_panels.view.$el);\r
c966123a 86\r
ce13508b
D
87 /**\r
88 * Set the UI components up\r
89 */\r
1e85105e 90 this.controlbox = new _kiwi.view.ControlBox({el: $('#kiwi .controlbox')[0]});\r
696a66f8 91 this.bindControllboxCommands(this.controlbox);\r
626c1246 92 this.rightbar = new _kiwi.view.RightBar({el: this.view.$('.right_bar')[0]});\r
696a66f8 93\r
de214968 94 this.topicbar = new _kiwi.view.TopicBar({el: this.view.$el.find('.topic')[0]});\r
696a66f8 95\r
4f99a29b 96 new _kiwi.view.AppToolbar({el: _kiwi.app.view.$el.find('.toolbar .app_tools')[0]});\r
9936359c 97 new _kiwi.view.ChannelTools({el: _kiwi.app.view.$el.find('.channel_tools')[0]});\r
7de3dd03 98\r
707593d2 99 this.message = new _kiwi.view.StatusMessage({el: this.view.$el.find('.status_message')[0]});\r
696a66f8 100\r
30f9f42a 101 this.resize_handle = new _kiwi.view.ResizeHandler({el: this.view.$el.find('.memberlists_resize_handle')[0]});\r
696a66f8
D
102\r
103 // Rejigg the UI sizes\r
104 this.view.doLayout();\r
3dc62fbb 105 },\r
696a66f8
D
106\r
107\r
3dc62fbb 108 initializeGlobals: function () {\r
6d5faa6e 109 _kiwi.global.connections = this.connections;\r
a9bc007f
D
110\r
111 _kiwi.global.panels = this.panels;\r
112 _kiwi.global.panels.applets = this.applet_panels;\r
113\r
6228b635
D
114 _kiwi.global.components.Applet = _kiwi.model.Applet;\r
115 _kiwi.global.components.Panel =_kiwi.model.Panel;\r
ba389555 116 _kiwi.global.components.MenuBox = _kiwi.view.MenuBox;\r
3dc62fbb 117 },\r
696a66f8
D
118\r
119\r
3dc62fbb 120 applyDefaultClientSettings: function (settings) {\r
1cfc4800
JA
121 _.each(settings, function (value, setting) {\r
122 if (typeof _kiwi.global.settings.get(setting) === 'undefined') {\r
123 _kiwi.global.settings.set(setting, value);\r
124 }\r
125 });\r
3dc62fbb 126 },\r
1cfc4800
JA
127\r
128\r
3dc62fbb 129 panels: (function() {\r
aa24a133
D
130 var active_panel;\r
131\r
c966123a
D
132 var fn = function(panel_type) {\r
133 var panels;\r
134\r
135 // Default panel type\r
136 panel_type = panel_type || 'connections';\r
137\r
138 switch (panel_type) {\r
139 case 'connections':\r
140 panels = this.connections.panels();\r
141 break;\r
142 case 'applets':\r
143 panels = this.applet_panels.models;\r
144 break;\r
145 }\r
6d5faa6e
D
146\r
147 // Active panels / server\r
aa24a133 148 panels.active = active_panel;\r
a9bc007f
D
149 panels.server = this.connections.active_connection ?\r
150 this.connections.active_connection.panels.server :\r
151 null;\r
6d5faa6e
D
152\r
153 return panels;\r
154 };\r
155\r
156 _.extend(fn, Backbone.Events);\r
157\r
aa24a133
D
158 // Keep track of the active panel. Channel/query/server or applet\r
159 fn.bind('active', function (new_active_panel) {\r
160 active_panel = new_active_panel;\r
161 });\r
162\r
6d5faa6e 163 return fn;\r
3dc62fbb 164 })(),\r
e4de4648
D
165\r
166\r
3dc62fbb 167 bindGatewayCommands: function (gw) {\r
645fe41b
JA
168 var that = this;\r
169\r
18ae1a72
D
170 // As soon as an IRC connection is made, show the full client UI\r
171 gw.on('connection:connect', function (event) {\r
696a66f8 172 that.view.barsShow();\r
696a66f8
D
173 });\r
174\r
175\r
24d27c8c
D
176 /**\r
177 * Handle the reconnections to the kiwi server\r
178 */\r
696a66f8 179 (function () {\r
d6eec6ed 180 // 0 = non-reconnecting state. 1 = reconnecting state.\r
696a66f8 181 var gw_stat = 0;\r
d6eec6ed
D
182\r
183 // If the current or upcoming disconnect was planned\r
09c26937 184 var unplanned_disconnect = false;\r
696a66f8
D
185\r
186 gw.on('disconnect', function (event) {\r
09c26937
D
187 unplanned_disconnect = !gw.disconnect_requested;\r
188\r
189 if (unplanned_disconnect) {\r
190 var msg = _kiwi.global.i18n.translate('client_models_application_reconnecting').fetch() + '...';\r
191 that.message.text(msg, {timeout: 10000});\r
192 }\r
696a66f8 193\r
343cd967
PV
194 that.view.$el.removeClass('connected');\r
195\r
696a66f8 196 // Mention the disconnection on every channel\r
24d27c8c 197 _kiwi.app.connections.forEach(function(connection) {\r
9ec48c54 198 connection.panels.server.addMsg('', styleText('quit', {text: msg}), 'action quit');\r
24d27c8c
D
199\r
200 connection.panels.forEach(function(panel) {\r
201 if (!panel.isChannel())\r
202 return;\r
203\r
9ec48c54 204 panel.addMsg('', styleText('quit', {text: msg}), 'action quit');\r
24d27c8c 205 });\r
696a66f8 206 });\r
696a66f8
D
207\r
208 gw_stat = 1;\r
209 });\r
24d27c8c
D
210\r
211\r
696a66f8 212 gw.on('reconnecting', function (event) {\r
247dd7ac 213 var msg = _kiwi.global.i18n.translate('client_models_application_reconnect_in_x_seconds').fetch(event.delay/1000) + '...';\r
24d27c8c
D
214\r
215 // Only need to mention the repeating re-connection messages on server panels\r
216 _kiwi.app.connections.forEach(function(connection) {\r
9ec48c54 217 connection.panels.server.addMsg('', styleText('quit', {text: msg}), 'action quit');\r
24d27c8c 218 });\r
696a66f8 219 });\r
24d27c8c
D
220\r
221\r
78354438
D
222 // After the socket has connected, kiwi handshakes and then triggers a kiwi:connected event\r
223 gw.on('kiwi:connected', function (event) {\r
343cd967 224 that.view.$el.addClass('connected');\r
696a66f8
D
225 if (gw_stat !== 1) return;\r
226\r
09c26937
D
227 if (unplanned_disconnect) {\r
228 var msg = _kiwi.global.i18n.translate('client_models_application_reconnect_successfully').fetch() + ':)';\r
229 that.message.text(msg, {timeout: 5000});\r
230 }\r
696a66f8 231\r
d6eec6ed 232 // Mention the re-connection on every channel\r
24d27c8c 233 _kiwi.app.connections.forEach(function(connection) {\r
78354438
D
234 connection.reconnect();\r
235\r
9ec48c54 236 connection.panels.server.addMsg('', styleText('rejoin', {text: msg}), 'action join');\r
24d27c8c
D
237\r
238 connection.panels.forEach(function(panel) {\r
239 if (!panel.isChannel())\r
240 return;\r
241\r
9ec48c54 242 panel.addMsg('', styleText('rejoin', {text: msg}), 'action join');\r
24d27c8c 243 });\r
696a66f8 244 });\r
696a66f8
D
245\r
246 gw_stat = 0;\r
247 });\r
248 })();\r
249\r
09c26937 250\r
645fe41b 251 gw.on('kiwi:reconfig', function () {\r
bceb5db6 252 $.getJSON(that.get('settings_path'), function (data) {\r
645fe41b
JA
253 that.server_settings = data.server_settings || {};\r
254 that.translations = data.translations || {};\r
255 });\r
256 });\r
09c26937
D
257\r
258\r
259 gw.on('kiwi:jumpserver', function (data) {\r
d6eec6ed
D
260 var serv;\r
261 // No server set? Then nowhere to jump to.\r
262 if (typeof data.kiwi_server === 'undefined')\r
263 return;\r
264\r
265 serv = data.kiwi_server;\r
266\r
267 // Strip any trailing slash from the end\r
268 if (serv[serv.length-1] === '/')\r
269 serv = serv.substring(0, serv.length-1);\r
270\r
09c26937
D
271 // Force the jumpserver now?\r
272 if (data.force) {\r
bf169745
D
273 // Get an interval between 5 and 6 minutes so everyone doesn't reconnect it all at once\r
274 var jump_server_interval = Math.random() * (360 - 300) + 300;\r
09c26937 275\r
bf169745 276 // Tell the user we are going to disconnect, wait 5 minutes then do the actual reconnect\r
a749d105 277 var msg = _kiwi.global.i18n.translate('client_models_application_jumpserver_prepare').fetch();\r
09c26937
D
278 that.message.text(msg, {timeout: 10000});\r
279\r
280 setTimeout(function forcedReconnect() {\r
a749d105 281 var msg = _kiwi.global.i18n.translate('client_models_application_jumpserver_reconnect').fetch();\r
09c26937
D
282 that.message.text(msg, {timeout: 8000});\r
283\r
284 setTimeout(function forcedReconnectPartTwo() {\r
e5baa247 285 _kiwi.app.kiwi_server = serv;\r
338817f1 286\r
d6eec6ed
D
287 _kiwi.gateway.reconnect(function() {\r
288 // Reconnect all the IRC connections\r
289 that.connections.forEach(function(con){ con.reconnect(); });\r
290 });\r
09c26937
D
291 }, 5000);\r
292\r
293 }, jump_server_interval * 1000);\r
294 }\r
295 });\r
3dc62fbb 296 },\r
696a66f8
D
297\r
298\r
299\r
300 /**\r
301 * Bind to certain commands that may be typed into the control box\r
302 */\r
3dc62fbb
D
303 bindControllboxCommands: function (controlbox) {\r
304 var that = this;\r
305\r
696a66f8
D
306 // Default aliases\r
307 $.extend(controlbox.preprocessor.aliases, {\r
308 // General aliases\r
3dc62fbb
D
309 '/p': '/part $1+',\r
310 '/me': '/action $1+',\r
311 '/j': '/join $1+',\r
312 '/q': '/query $1+',\r
313 '/w': '/whois $1+',\r
314 '/raw': '/quote $1+',\r
696a66f8
D
315\r
316 // Op related aliases\r
3dc62fbb
D
317 '/op': '/quote mode $channel +o $1+',\r
318 '/deop': '/quote mode $channel -o $1+',\r
319 '/hop': '/quote mode $channel +h $1+',\r
320 '/dehop': '/quote mode $channel -h $1+',\r
321 '/voice': '/quote mode $channel +v $1+',\r
322 '/devoice': '/quote mode $channel -v $1+',\r
323 '/k': '/kick $channel $1+',\r
324 '/ban': '/quote mode $channel +b $1+',\r
325 '/unban': '/quote mode $channel -b $1+',\r
696a66f8
D
326\r
327 // Misc aliases\r
3dc62fbb 328 '/slap': '/me slaps $1 around a bit with a large trout'\r
696a66f8
D
329 });\r
330\r
3dc62fbb
D
331 // Functions to bind to controlbox events\r
332 var fn_to_bind = {\r
333 'unknown_command': unknownCommand,\r
334 'command': allCommands,\r
335 'command:msg': msgCommand,\r
336 'command:action': actionCommand,\r
337 'command:join': joinCommand,\r
338 'command:part': partCommand,\r
339 'command:nick': nickCommand,\r
340 'command:query': queryCommand,\r
341 'command:invite': inviteCommand,\r
342 'command:topic': topicCommand,\r
343 'command:notice': noticeCommand,\r
344 'command:quote': quoteCommand,\r
345 'command:kick': kickCommand,\r
346 'command:clear': clearCommand,\r
347 'command:ctcp': ctcpCommand,\r
348 'command:server': serverCommand,\r
349 'command:whois': whoisCommand,\r
350 'command:whowas': whowasCommand,\r
351 'command:encoding': encodingCommand,\r
352 'command:channel': channelCommand,\r
353 'command:applet': appletCommand,\r
354 'command:settings': settingsCommand,\r
355 'command:script': scriptCommand\r
356 };\r
72db27e4 357\r
3dc62fbb 358 fn_to_bind['command:css'] = function (ev) {\r
696a66f8
D
359 var queryString = '?reload=' + new Date().getTime();\r
360 $('link[rel="stylesheet"]').each(function () {\r
361 this.href = this.href.replace(/\?.*|$/, queryString);\r
362 });\r
3dc62fbb 363 };\r
696a66f8 364\r
3dc62fbb 365 fn_to_bind['command:js'] = function (ev) {\r
696a66f8
D
366 if (!ev.params[0]) return;\r
367 $script(ev.params[0] + '?' + (new Date().getTime()));\r
3dc62fbb 368 };\r
696a66f8 369\r
09c26937 370\r
3dc62fbb 371 fn_to_bind['command:set'] = function (ev) {\r
600bc234
D
372 if (!ev.params[0]) return;\r
373\r
374 var setting = ev.params[0],\r
375 value;\r
376\r
377 // Do we have a second param to set a value?\r
378 if (ev.params[1]) {\r
379 ev.params.shift();\r
380\r
381 value = ev.params.join(' ');\r
9383cc07
D
382\r
383 // If we're setting a true boolean value..\r
384 if (value === 'true')\r
385 value = true;\r
386\r
387 // If we're setting a false boolean value..\r
388 if (value === 'false')\r
389 value = false;\r
390\r
391 // If we're setting a number..\r
392 if (parseInt(value, 10).toString() === value)\r
393 value = parseInt(value, 10);\r
394\r
600bc234
D
395 _kiwi.global.settings.set(setting, value);\r
396 }\r
397\r
398 // Read the value to the user\r
9ec48c54 399 _kiwi.app.panels().active.addMsg('', styleText('set_setting', {text: setting + ' = ' + _kiwi.global.settings.get(setting).toString()}));\r
3dc62fbb 400 };\r
600bc234
D
401\r
402\r
3dc62fbb 403 fn_to_bind['command:save'] = function (ev) {\r
600bc234 404 _kiwi.global.settings.save();\r
9ec48c54 405 _kiwi.app.panels().active.addMsg('', styleText('settings_saved', {text: translateText('client_models_application_settings_saved')}));\r
3dc62fbb 406 };\r
600bc234
D
407\r
408\r
3dc62fbb 409 fn_to_bind['command:alias'] = function (ev) {\r
696a66f8
D
410 var name, rule;\r
411\r
412 // No parameters passed so list them\r
413 if (!ev.params[1]) {\r
414 $.each(controlbox.preprocessor.aliases, function (name, rule) {\r
9ec48c54 415 _kiwi.app.panels().server.addMsg(' ', styleText('list_aliases', {text: name + ' => ' + rule}));\r
696a66f8
D
416 });\r
417 return;\r
418 }\r
419\r
420 // Deleting an alias?\r
421 if (ev.params[0] === 'del' || ev.params[0] === 'delete') {\r
422 name = ev.params[1];\r
423 if (name[0] !== '/') name = '/' + name;\r
424 delete controlbox.preprocessor.aliases[name];\r
425 return;\r
426 }\r
427\r
428 // Add the alias\r
429 name = ev.params[0];\r
430 ev.params.shift();\r
431 rule = ev.params.join(' ');\r
432\r
433 // Make sure the name starts with a slash\r
434 if (name[0] !== '/') name = '/' + name;\r
435\r
436 // Now actually add the alias\r
437 controlbox.preprocessor.aliases[name] = rule;\r
3dc62fbb 438 };\r
696a66f8 439\r
09c26937 440\r
3dc62fbb 441 fn_to_bind['command:ignore'] = function (ev) {\r
425efe7a 442 var list = this.connections.active_connection.get('ignore_list');\r
f3091277
D
443\r
444 // No parameters passed so list them\r
445 if (!ev.params[0]) {\r
446 if (list.length > 0) {\r
9ec48c54 447 _kiwi.app.panels().active.addMsg(' ', styleText('ignore_title', {text: translateText('client_models_application_ignore_title')}));\r
f3091277 448 $.each(list, function (idx, ignored_pattern) {\r
9ec48c54 449 _kiwi.app.panels().active.addMsg(' ', styleText('ignored_pattern', {text: ignored_pattern}));\r
f3091277
D
450 });\r
451 } else {\r
9ec48c54 452 _kiwi.app.panels().active.addMsg(' ', styleText('ignore_none', {text: translateText('client_models_application_ignore_none')}));\r
f3091277
D
453 }\r
454 return;\r
455 }\r
456\r
457 // We have a parameter, so add it\r
458 list.push(ev.params[0]);\r
425efe7a 459 this.connections.active_connection.set('ignore_list', list);\r
9ec48c54 460 _kiwi.app.panels().active.addMsg(' ', styleText('ignore_nick', {text: translateText('client_models_application_ignore_nick', [ev.params[0]])}));\r
3dc62fbb 461 };\r
f3091277
D
462\r
463\r
3dc62fbb 464 fn_to_bind['command:unignore'] = function (ev) {\r
425efe7a 465 var list = this.connections.active_connection.get('ignore_list');\r
f3091277
D
466\r
467 if (!ev.params[0]) {\r
9ec48c54 468 _kiwi.app.panels().active.addMsg(' ', styleText('ignore_stop_notice', {text: translateText('client_models_application_ignore_stop_notice')}));\r
f3091277
D
469 return;\r
470 }\r
471\r
472 list = _.reject(list, function(pattern) {\r
473 return pattern === ev.params[0];\r
474 });\r
475\r
425efe7a 476 this.connections.active_connection.set('ignore_list', list);\r
f3091277 477\r
9ec48c54 478 _kiwi.app.panels().active.addMsg(' ', styleText('ignore_stopped', {text: translateText('client_models_application_ignore_stopped', [ev.params[0]])}));\r
3dc62fbb
D
479 };\r
480\r
481\r
482 _.each(fn_to_bind, function(fn, event_name) {\r
483 controlbox.on(event_name, _.bind(fn, that));\r
f3091277 484 });\r
696a66f8 485 }\r
3dc62fbb 486 });\r
696a66f8 487\r
696a66f8 488\r
696a66f8 489\r
696a66f8 490\r
3dc62fbb
D
491 // A fallback action. Send a raw command to the server\r
492 function unknownCommand (ev) {\r
493 var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
494 console.log('RAW: ' + raw_cmd);\r
425efe7a 495 this.connections.active_connection.gateway.raw(raw_cmd);\r
3dc62fbb 496 }\r
696a66f8 497\r
3dc62fbb 498 function allCommands (ev) {}\r
696a66f8 499\r
3dc62fbb
D
500 function joinCommand (ev) {\r
501 var panels, channel_names;\r
a61a7bc8 502\r
3dc62fbb
D
503 channel_names = ev.params.join(' ').split(',');\r
504 panels = this.connections.active_connection.createAndJoinChannels(channel_names);\r
696a66f8 505\r
3dc62fbb
D
506 // Show the last channel if we have one\r
507 if (panels.length)\r
508 panels[panels.length - 1].view.show();\r
509 }\r
696a66f8 510\r
3dc62fbb
D
511 function queryCommand (ev) {\r
512 var destination, message, panel;\r
09c26937 513\r
3dc62fbb
D
514 destination = ev.params[0];\r
515 ev.params.shift();\r
a61a7bc8 516\r
3dc62fbb 517 message = ev.params.join(' ');\r
696a66f8 518\r
3dc62fbb
D
519 // Check if we have the panel already. If not, create it\r
520 panel = this.connections.active_connection.panels.getByName(destination);\r
521 if (!panel) {\r
522 panel = new _kiwi.model.Query({name: destination});\r
523 this.connections.active_connection.panels.add(panel);\r
524 }\r
696a66f8 525\r
3dc62fbb 526 if (panel) panel.view.show();\r
696a66f8 527\r
3dc62fbb
D
528 if (message) {\r
529 this.connections.active_connection.gateway.msg(panel.get('name'), message);\r
b3896ef2 530 panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), styleText('privmsg', {text: message}), 'privmsg');\r
696a66f8
D
531 }\r
532\r
3dc62fbb 533 }\r
696a66f8 534\r
3dc62fbb
D
535 function msgCommand (ev) {\r
536 var message,\r
537 destination = ev.params[0],\r
538 panel = this.connections.active_connection.panels.getByName(destination) || this.panels().server;\r
696a66f8 539\r
3dc62fbb
D
540 ev.params.shift();\r
541 message = formatToIrcMsg(ev.params.join(' '));\r
696a66f8 542\r
b3896ef2 543 panel.addMsg(_kiwi.app.connections.active_connection.get('nick'), styleText('privmsg', {text: message}), 'privmsg');\r
207a7779 544 this.connections.active_connection.gateway.msg(destination, message);\r
3dc62fbb 545 }\r
696a66f8 546\r
3dc62fbb
D
547 function actionCommand (ev) {\r
548 if (_kiwi.app.panels().active.isServer()) {\r
549 return;\r
550 }\r
696a66f8 551\r
3dc62fbb 552 var panel = _kiwi.app.panels().active;\r
9ec48c54 553 panel.addMsg('', styleText('action', {nick: _kiwi.app.connections.active_connection.get('nick'), text: ev.params.join(' ')}), 'action');\r
425efe7a 554 this.connections.active_connection.gateway.action(panel.get('name'), ev.params.join(' '));\r
3dc62fbb
D
555 }\r
556\r
557 function partCommand (ev) {\r
7f272ac9
JA
558 var that = this,\r
559 chans,\r
560 msg;\r
3dc62fbb 561 if (ev.params.length === 0) {\r
425efe7a 562 this.connections.active_connection.gateway.part(_kiwi.app.panels().active.get('name'));\r
3dc62fbb 563 } else {\r
7f272ac9
JA
564 chans = ev.params[0].split(',');\r
565 msg = ev.params[1];\r
566 _.each(chans, function (channel) {\r
567 that.connections.active_connection.gateway.part(channel, msg);\r
3dc62fbb 568 });\r
696a66f8 569 }\r
3dc62fbb 570 }\r
696a66f8 571\r
3dc62fbb 572 function nickCommand (ev) {\r
425efe7a 573 this.connections.active_connection.gateway.changeNick(ev.params[0]);\r
3dc62fbb 574 }\r
696a66f8 575\r
3dc62fbb
D
576 function topicCommand (ev) {\r
577 var channel_name;\r
696a66f8 578\r
3dc62fbb 579 if (ev.params.length === 0) return;\r
696a66f8 580\r
12ba9939 581 if (this.connections.active_connection.isChannelName(ev.params[0])) {\r
3dc62fbb
D
582 channel_name = ev.params[0];\r
583 ev.params.shift();\r
584 } else {\r
585 channel_name = _kiwi.app.panels().active.get('name');\r
696a66f8
D
586 }\r
587\r
425efe7a 588 this.connections.active_connection.gateway.topic(channel_name, ev.params.join(' '));\r
3dc62fbb 589 }\r
696a66f8 590\r
3dc62fbb
D
591 function noticeCommand (ev) {\r
592 var destination;\r
696a66f8 593\r
3dc62fbb
D
594 // Make sure we have a destination and some sort of message\r
595 if (ev.params.length <= 1) return;\r
696a66f8 596\r
3dc62fbb
D
597 destination = ev.params[0];\r
598 ev.params.shift();\r
696a66f8 599\r
425efe7a 600 this.connections.active_connection.gateway.notice(destination, ev.params.join(' '));\r
3dc62fbb 601 }\r
696a66f8 602\r
3dc62fbb
D
603 function quoteCommand (ev) {\r
604 var raw = ev.params.join(' ');\r
425efe7a 605 this.connections.active_connection.gateway.raw(raw);\r
3dc62fbb 606 }\r
696a66f8 607\r
3dc62fbb
D
608 function kickCommand (ev) {\r
609 var nick, panel = _kiwi.app.panels().active;\r
648e2c01 610\r
3dc62fbb 611 if (!panel.isChannel()) return;\r
648e2c01 612\r
3dc62fbb
D
613 // Make sure we have a nick\r
614 if (ev.params.length === 0) return;\r
b1042f3d 615\r
3dc62fbb
D
616 nick = ev.params[0];\r
617 ev.params.shift();\r
b1042f3d 618\r
425efe7a 619 this.connections.active_connection.gateway.kick(panel.get('name'), nick, ev.params.join(' '));\r
3dc62fbb 620 }\r
b1042f3d 621\r
3dc62fbb
D
622 function clearCommand (ev) {\r
623 // Can't clear a server or applet panel\r
624 if (_kiwi.app.panels().active.isServer() || _kiwi.app.panels().active.isApplet()) {\r
625 return;\r
b1042f3d
D
626 }\r
627\r
3dc62fbb
D
628 if (_kiwi.app.panels().active.clearMessages) {\r
629 _kiwi.app.panels().active.clearMessages();\r
696a66f8 630 }\r
3dc62fbb 631 }\r
696a66f8 632\r
3dc62fbb
D
633 function ctcpCommand(ev) {\r
634 var target, type;\r
22373da6 635\r
3dc62fbb
D
636 // Make sure we have a target and a ctcp type (eg. version, time)\r
637 if (ev.params.length < 2) return;\r
696a66f8 638\r
3dc62fbb
D
639 target = ev.params[0];\r
640 ev.params.shift();\r
696a66f8 641\r
3dc62fbb
D
642 type = ev.params[0];\r
643 ev.params.shift();\r
09c26937 644\r
9de52d29 645 this.connections.active_connection.gateway.ctcpRequest(type, target, ev.params.join(' '));\r
3dc62fbb 646 }\r
696a66f8 647\r
3dc62fbb
D
648 function settingsCommand (ev) {\r
649 var settings = _kiwi.model.Applet.loadOnce('kiwi_settings');\r
650 settings.view.show();\r
651 }\r
696a66f8 652\r
3dc62fbb
D
653 function scriptCommand (ev) {\r
654 var editor = _kiwi.model.Applet.loadOnce('kiwi_script_editor');\r
655 editor.view.show();\r
656 }\r
9e77d0e2 657\r
3dc62fbb
D
658 function appletCommand (ev) {\r
659 if (!ev.params[0]) return;\r
9e77d0e2 660\r
3dc62fbb 661 var panel = new _kiwi.model.Applet();\r
9e77d0e2 662\r
3dc62fbb
D
663 if (ev.params[1]) {\r
664 // Url and name given\r
665 panel.load(ev.params[0], ev.params[1]);\r
666 } else {\r
667 // Load a pre-loaded applet\r
668 if (_kiwi.applets[ev.params[0]]) {\r
669 panel.load(new _kiwi.applets[ev.params[0]]());\r
670 } else {\r
9ec48c54 671 _kiwi.app.panels().server.addMsg('', styleText('applet_notfound', {text: translateText('client_models_application_applet_notfound', [ev.params[0]])}));\r
9e77d0e2 672 return;\r
3dc62fbb
D
673 }\r
674 }\r
9e77d0e2 675\r
3dc62fbb
D
676 _kiwi.app.connections.active_connection.panels.add(panel);\r
677 panel.view.show();\r
678 }\r
9e77d0e2 679\r
9e77d0e2 680\r
9e77d0e2 681\r
3dc62fbb
D
682 function inviteCommand (ev) {\r
683 var nick, channel;\r
9e77d0e2 684\r
3dc62fbb
D
685 // A nick must be specified\r
686 if (!ev.params[0])\r
687 return;\r
d6146b37 688\r
3dc62fbb
D
689 // Can only invite into channels\r
690 if (!_kiwi.app.panels().active.isChannel())\r
691 return;\r
d6146b37 692\r
3dc62fbb
D
693 nick = ev.params[0];\r
694 channel = _kiwi.app.panels().active.get('name');\r
d6146b37 695\r
3dc62fbb 696 _kiwi.app.connections.active_connection.gateway.raw('INVITE ' + nick + ' ' + channel);\r
d6146b37 697\r
9ec48c54 698 _kiwi.app.panels().active.addMsg('', styleText('channel_has_been_invited', {nick: nick, text: translateText('client_models_application_has_been_invited', [channel])}), 'action');\r
3dc62fbb 699 }\r
374133f1 700\r
374133f1 701\r
3dc62fbb
D
702 function whoisCommand (ev) {\r
703 var nick;\r
374133f1 704\r
3dc62fbb
D
705 if (ev.params[0]) {\r
706 nick = ev.params[0];\r
707 } else if (_kiwi.app.panels().active.isQuery()) {\r
708 nick = _kiwi.app.panels().active.get('name');\r
d1b3e8b3 709 }\r
374133f1 710\r
3dc62fbb
D
711 if (nick)\r
712 _kiwi.app.connections.active_connection.gateway.raw('WHOIS ' + nick + ' ' + nick);\r
713 }\r
cdbf2b6f 714\r
3735e390 715\r
3dc62fbb
D
716 function whowasCommand (ev) {\r
717 var nick;\r
3735e390 718\r
3dc62fbb
D
719 if (ev.params[0]) {\r
720 nick = ev.params[0];\r
721 } else if (_kiwi.app.panels().active.isQuery()) {\r
722 nick = _kiwi.app.panels().active.get('name');\r
723 }\r
cdbf2b6f 724\r
3dc62fbb
D
725 if (nick)\r
726 _kiwi.app.connections.active_connection.gateway.raw('WHOWAS ' + nick);\r
727 }\r
cdbf2b6f 728\r
3dc62fbb
D
729 function encodingCommand (ev) {\r
730 if (ev.params[0]) {\r
731 _kiwi.gateway.setEncoding(null, ev.params[0], function (success) {\r
732 if (success) {\r
9ec48c54 733 _kiwi.app.panels().active.addMsg('', styleText('encoding_changed', {text: translateText('client_models_application_encoding_changed', [ev.params[0]])}));\r
3dc62fbb 734 } else {\r
9ec48c54 735 _kiwi.app.panels().active.addMsg('', styleText('encoding_invalid', {text: translateText('client_models_application_encoding_invalid', [ev.params[0]])}));\r
3dc62fbb
D
736 }\r
737 });\r
738 } else {\r
9ec48c54
D
739 _kiwi.app.panels().active.addMsg('', styleText('client_models_application_encoding_notspecified', {text: translateText('client_models_application_encoding_notspecified')}));\r
740 _kiwi.app.panels().active.addMsg('', styleText('client_models_application_encoding_usage', {text: translateText('client_models_application_encoding_usage')}));\r
3dc62fbb
D
741 }\r
742 }\r
cdbf2b6f 743\r
3dc62fbb
D
744 function channelCommand (ev) {\r
745 var active_panel = _kiwi.app.panels().active;\r
cdbf2b6f 746\r
3dc62fbb
D
747 if (!active_panel.isChannel())\r
748 return;\r
cdbf2b6f 749\r
3dc62fbb
D
750 new _kiwi.model.ChannelInfo({channel: _kiwi.app.panels().active});\r
751 }\r
cdbf2b6f 752\r
3dc62fbb
D
753 function serverCommand (ev) {\r
754 var server, port, ssl, password, nick,\r
755 tmp;\r
cdbf2b6f 756\r
3dc62fbb
D
757 // If no server address given, show the new connection dialog\r
758 if (!ev.params[0]) {\r
759 tmp = new _kiwi.view.MenuBox(_kiwi.global.i18n.translate('client_models_application_connection_create').fetch());\r
760 tmp.addItem('new_connection', new _kiwi.model.NewConnection().view.$el);\r
761 tmp.show();\r
cdbf2b6f 762\r
3dc62fbb
D
763 // Center screen the dialog\r
764 tmp.$el.offset({\r
765 top: (this.view.$el.height() / 2) - (tmp.$el.height() / 2),\r
766 left: (this.view.$el.width() / 2) - (tmp.$el.width() / 2)\r
cdbf2b6f 767 });\r
cdbf2b6f 768\r
3dc62fbb
D
769 return;\r
770 }\r
cdbf2b6f 771\r
3dc62fbb
D
772 // Port given in 'host:port' format and no specific port given after a space\r
773 if (ev.params[0].indexOf(':') > 0) {\r
774 tmp = ev.params[0].split(':');\r
775 server = tmp[0];\r
776 port = tmp[1];\r
696a66f8 777\r
3dc62fbb 778 password = ev.params[1] || undefined;\r
696a66f8 779\r
3dc62fbb
D
780 } else {\r
781 // Server + port given as 'host port'\r
782 server = ev.params[0];\r
783 port = ev.params[1] || 6667;\r
696a66f8 784\r
3dc62fbb
D
785 password = ev.params[2] || undefined;\r
786 }\r
696a66f8 787\r
3dc62fbb
D
788 // + in the port means SSL\r
789 if (port.toString()[0] === '+') {\r
790 ssl = true;\r
791 port = parseInt(port.substring(1), 10);\r
792 } else {\r
793 ssl = false;\r
794 }\r
696a66f8 795\r
3dc62fbb
D
796 // Default port if one wasn't found\r
797 port = port || 6667;\r
fb321ba0 798\r
3dc62fbb
D
799 // Use the same nick as we currently have\r
800 nick = _kiwi.app.connections.active_connection.get('nick');\r
696a66f8 801\r
67c98ac4 802 _kiwi.app.panels().active.addMsg('', styleText('server_connecting', {text: translateText('client_models_application_connection_connecting', [server, port.toString()])}));\r
696a66f8 803\r
3dc62fbb
D
804 _kiwi.gateway.newConnection({\r
805 nick: nick,\r
806 host: server,\r
807 port: port,\r
808 ssl: ssl,\r
809 password: password\r
810 }, function(err, new_connection) {\r
811 if (err)\r
67c98ac4 812 _kiwi.app.panels().active.addMsg('', styleText('server_connecting_error', {text: translateText('client_models_application_connection_error', [server, port.toString(), err.toString()])}));\r
3dc62fbb
D
813 });\r
814 }\r
696a66f8 815\r
3dc62fbb 816})();\r