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