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