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