Prototype leak fixes
[KiwiIRC.git] / client_backbone / dev / model_application.js
CommitLineData
fed91446 1kiwi.model.Application = Backbone.Model.extend(new (function () {\r
4d6fcfeb
D
2\r
3 // Set to a reference to this object within initialize()\r
4 var that = null;\r
2c80d916 5\r
99e0111e
D
6 // The auto connect details entered into the server select box\r
7 var auto_connect_details = {};\r
8\r
b5141adb
D
9 /** Instance of kiwi.model.PanelList */\r
10 this.panels = null;\r
11\r
f8ce99b4 12 /** kiwi.view.Application */\r
4d6fcfeb 13 this.view = null;\r
f8ce99b4
D
14\r
15 /** kiwi.view.StatusMessage */\r
4d6fcfeb 16 this.message = null;\r
f8ce99b4 17\r
a37b761a
D
18 /* Address for the kiwi server */\r
19 this.kiwi_server = null;\r
20\r
2c80d916 21 this.initialize = function () {\r
2c80d916 22 that = this;\r
a37b761a
D
23\r
24 // Best guess at where the kiwi server is\r
25 this.detectKiwiServer();\r
48d660e6 26 };\r
2c80d916 27\r
48d660e6 28 this.start = function () {\r
9df70c63
D
29 // Only debug if set in the querystring\r
30 if (!getQueryVariable('debug')) {\r
4d6fcfeb 31 manageDebug(false);\r
9df70c63 32 } else {\r
b075a0d6 33 //manageDebug(true);\r
9df70c63
D
34 }\r
35 \r
2c80d916
D
36 // Set the gateway up\r
37 kiwi.gateway = new kiwi.model.Gateway();\r
38 this.bindGatewayCommands(kiwi.gateway);\r
39\r
2c80d916 40 this.initializeClient();\r
721ad945
D
41 this.initializeGlobals();\r
42\r
2af70088 43 this.view.barsHide(true);\r
2c80d916 44\r
4c1f047c 45 this.panels.server.server_login.bind('server_connect', function (event) {\r
a37b761a 46 var server_login = this;\r
c4fc06f6 47 auto_connect_details = event;\r
a37b761a 48\r
c4fc06f6
D
49 server_login.networkConnecting();\r
50 \r
51 $script(that.kiwi_server + '/socket.io/socket.io.js?ts='+(new Date().getTime()), function () {\r
52 if (!window.io) {\r
53 kiwiServerNotFound();\r
54 return;\r
55 }\r
56 kiwi.gateway.set('kiwi_server', that.kiwi_server + '/kiwi');\r
a37b761a 57 kiwi.gateway.set('nick', event.nick);\r
0f3d4221
D
58 \r
59 kiwi.gateway.connect(event.server, event.port, event.ssl, event.password, function () {});\r
a37b761a 60 });\r
2af70088 61 });\r
2c80d916 62\r
58e209fa 63 // TODO: Shouldn't really be here but it's not working in the view.. :/\r
72e939c0
D
64 // Hack for firefox browers: Focus is not given on this event loop iteration\r
65 setTimeout(function(){\r
66 kiwi.app.panels.server.server_login.$el.find('.nick').select();\r
67 }, 0);\r
2c80d916
D
68 };\r
69\r
70\r
c4fc06f6
D
71 function kiwiServerNotFound (e) {\r
72 that.panels.server.server_login.showError();\r
73 }\r
74\r
75\r
a37b761a
D
76 this.detectKiwiServer = function () {\r
77 // If running from file, default to localhost:7777 by default\r
9437a6f0
D
78 if (window.location.protocol === 'file:') {\r
79 this.kiwi_server = 'http://localhost:7778';\r
a37b761a
D
80 } else {\r
81 // Assume the kiwi server is on the same server\r
da111bc7 82 this.kiwi_server = window.location.protocol + '//' + window.location.host;\r
a37b761a 83 }\r
a37b761a
D
84 };\r
85\r
86\r
2c80d916 87 this.initializeClient = function () {\r
b5141adb 88 this.view = new kiwi.view.Application({model: this, el: this.get('container')});\r
2c80d916
D
89 \r
90 /**\r
91 * Set the UI components up\r
92 */\r
4c1f047c
D
93 this.panels = new kiwi.model.PanelList();\r
94\r
2c80d916
D
95 this.controlbox = new kiwi.view.ControlBox({el: $('#controlbox')[0]});\r
96 this.bindControllboxCommands(this.controlbox);\r
97\r
52773494
D
98 this.topicbar = new kiwi.view.TopicBar({el: $('#topic')[0]});\r
99\r
f8ce99b4
D
100 this.message = new kiwi.view.StatusMessage({el: $('#status_message')[0]});\r
101\r
fe1fa679 102 this.resize_handle = new kiwi.view.ResizeHandler({el: $('#memberlists_resize_handle')[0]});\r
4c1f047c 103 \r
2c80d916
D
104 this.panels.server.view.show();\r
105\r
106 // Rejigg the UI sizes\r
107 this.view.doLayout();\r
2af70088 108\r
b075a0d6 109 this.populateDefaultServerSettings();\r
2c80d916
D
110 };\r
111\r
112\r
721ad945
D
113 this.initializeGlobals = function () {\r
114 kiwi.global.control = this.controlbox;\r
115 };\r
116\r
117\r
b075a0d6
D
118 this.populateDefaultServerSettings = function () {\r
119 var parts;\r
120 var defaults = {\r
121 nick: getQueryVariable('nick') || 'kiwi_' + Math.ceil(Math.random() * 10000).toString(),\r
122 server: 'irc.kiwiirc.com',\r
123 port: 6667,\r
124 ssl: false,\r
125 channel: window.location.hash || '#kiwiirc'\r
126 };\r
127\r
128 // Process the URL part by part, extracting as we go\r
129 parts = window.location.pathname.toString().split('/');\r
130 parts.shift();\r
131\r
132 if (parts.length > 0 && parts[0].toLowerCase() === 'client') {\r
133 parts.shift();\r
134\r
135 if (parts.length > 0 && parts[0]) {\r
b075a0d6
D
136 // TODO: Extract the port from this hostname\r
137 defaults.server = parts[0];\r
138 parts.shift();\r
139 }\r
140\r
141 if (parts.length > 0 && parts[0]) {\r
142 defaults.channel = '#' + parts[0];\r
143 parts.shift();\r
144 }\r
145 }\r
146\r
147 // Set any random numbers if needed\r
148 defaults.nick = defaults.nick.replace('?', Math.floor(Math.random() * 100000).toString());\r
149\r
150 // Populate the server select box with defaults\r
151 this.panels.server.server_login.populateFields(defaults);\r
152 };\r
153\r
2c80d916
D
154\r
155 this.bindGatewayCommands = function (gw) {\r
156 gw.on('onmotd', function (event) {\r
28a61196 157 that.panels.server.addMsg(kiwi.gateway.get('name'), event.msg, 'motd');\r
2c80d916
D
158 });\r
159\r
160\r
99e0111e
D
161 gw.on('onconnect', function (event) {\r
162 that.view.barsShow();\r
163 \r
164 if (auto_connect_details.channel) {\r
592c9d59 165 that.controlbox.processInput('/JOIN ' + auto_connect_details.channel);\r
99e0111e
D
166 }\r
167 });\r
2c80d916
D
168\r
169\r
f8ce99b4
D
170 (function () {\r
171 var gw_stat = 0;\r
172\r
173 gw.on('disconnect', function (event) {\r
e8e30b57
D
174 var msg = 'You have been disconnected. Attempting to reconnect for you..';\r
175 that.message.text(msg, {timeout: 10000});\r
176\r
177 // Mention the disconnection on every channel\r
178 $.each(kiwi.app.panels.models, function (idx, panel) {\r
e8e30b57
D
179 if (!panel || !panel.isChannel()) return;\r
180 panel.addMsg('', msg, 'action quit');\r
181 });\r
182 kiwi.app.panels.server.addMsg('', msg, 'action quit');\r
183\r
f8ce99b4
D
184 gw_stat = 1;\r
185 });\r
186 gw.on('reconnecting', function (event) {\r
e8e30b57
D
187 msg = 'You have been disconnected. Attempting to reconnect again in ' + (event.delay/1000) + ' seconds..';\r
188 kiwi.app.panels.server.addMsg('', msg, 'action quit');\r
f8ce99b4
D
189 });\r
190 gw.on('connect', function (event) {\r
191 if (gw_stat !== 1) return;\r
192\r
e8e30b57
D
193 var msg = 'It\'s OK, you\'re connected again :)';\r
194 that.message.text(msg, {timeout: 5000});\r
195\r
196 // Mention the disconnection on every channel\r
197 $.each(kiwi.app.panels.models, function (idx, panel) {\r
198 if (!panel || !panel.isChannel()) return;\r
199 panel.addMsg('', msg, 'action join');\r
200 });\r
201 kiwi.app.panels.server.addMsg('', msg, 'action join');\r
202\r
f8ce99b4
D
203 gw_stat = 0;\r
204 });\r
205 })();\r
206\r
207\r
2c80d916 208 gw.on('onjoin', function (event) {\r
2c80d916
D
209 var c, members, user;\r
210 c = that.panels.getByName(event.channel);\r
211 if (!c) {\r
212 c = new kiwi.model.Channel({name: event.channel});\r
213 that.panels.add(c);\r
214 }\r
215\r
216 members = c.get('members');\r
217 if (!members) return;\r
218\r
219 user = new kiwi.model.Member({nick: event.nick, ident: event.ident, hostname: event.hostname});\r
220 members.add(user);\r
221 // TODO: highlight the new channel in some way\r
222 });\r
223\r
224\r
225 gw.on('onpart', function (event) {\r
5712c148
D
226 var channel, members, user,\r
227 part_options = {};\r
228\r
229 part_options.type = 'part';\r
230 part_options.message = event.message || '';\r
2c80d916
D
231\r
232 channel = that.panels.getByName(event.channel);\r
233 if (!channel) return;\r
234\r
235 // If this is us, close the panel\r
236 if (event.nick === kiwi.gateway.get('nick')) {\r
237 channel.close();\r
238 return;\r
239 }\r
240\r
241 members = channel.get('members');\r
242 if (!members) return;\r
243\r
244 user = members.getByNick(event.nick);\r
245 if (!user) return;\r
246\r
5712c148
D
247 members.remove(user, part_options);\r
248 });\r
249\r
250\r
251 gw.on('onquit', function (event) {\r
252 var member, members,\r
253 quit_options = {};\r
254\r
255 quit_options.type = 'quit';\r
256 quit_options.message = event.message || '';\r
257\r
258 $.each(that.panels.models, function (index, panel) {\r
259 if (!panel.isChannel()) return;\r
260\r
261 member = panel.get('members').getByNick(event.nick);\r
262 if (member) {\r
263 panel.get('members').remove(member, quit_options);\r
264 }\r
265 });\r
2c80d916
D
266 });\r
267\r
268\r
94016cd4
D
269 gw.on('onkick', function (event) {\r
270 var channel, members, user,\r
271 part_options = {};\r
272\r
273 part_options.type = 'kick';\r
274 part_options.by = event.nick;\r
275 part_options.message = event.message || '';\r
276\r
277 channel = that.panels.getByName(event.channel);\r
278 if (!channel) return;\r
279\r
280 members = channel.get('members');\r
281 if (!members) return;\r
282\r
283 user = members.getByNick(event.kicked);\r
284 if (!user) return;\r
285\r
286 members.remove(user, part_options);\r
287\r
288 if (event.kicked === kiwi.gateway.get('nick')) {\r
289 members.reset([]);\r
290 }\r
291 \r
292 });\r
293\r
294\r
2c80d916
D
295 gw.on('onmsg', function (event) {\r
296 var panel,\r
297 is_pm = (event.channel == kiwi.gateway.get('nick'));\r
298\r
299 if (is_pm) {\r
300 // If a panel isn't found for this PM, create one\r
301 panel = that.panels.getByName(event.nick);\r
302 if (!panel) {\r
303 panel = new kiwi.model.Channel({name: event.nick});\r
304 that.panels.add(panel);\r
305 }\r
306\r
307 } else {\r
308 // If a panel isn't found for this channel, reroute to the\r
309 // server panel\r
310 panel = that.panels.getByName(event.channel);\r
311 if (!panel) {\r
312 panel = that.panels.server;\r
313 }\r
314 }\r
315 \r
316 panel.addMsg(event.nick, event.msg);\r
317 });\r
318\r
319\r
320 gw.on('onnotice', function (event) {\r
68314431
D
321 var panel;\r
322\r
9783a703
D
323 // Find a panel for the destination(channel) or who its from\r
324 panel = that.panels.getByName(event.target) || that.panels.getByName(event.nick);\r
68314431
D
325 if (!panel) {\r
326 panel = that.panels.server;\r
327 }\r
328\r
329 panel.addMsg('[' + (event.nick||'') + ']', event.msg);\r
2c80d916
D
330 });\r
331\r
332\r
0f40d499
D
333 gw.on('onaction', function (event) {\r
334 var panel,\r
335 is_pm = (event.channel == kiwi.gateway.get('nick'));\r
336\r
337 if (is_pm) {\r
338 // If a panel isn't found for this PM, create one\r
339 panel = that.panels.getByName(event.nick);\r
340 if (!panel) {\r
341 panel = new kiwi.model.Channel({name: event.nick});\r
342 that.panels.add(panel);\r
343 }\r
344\r
345 } else {\r
346 // If a panel isn't found for this channel, reroute to the\r
347 // server panel\r
348 panel = that.panels.getByName(event.channel);\r
349 if (!panel) {\r
350 panel = that.panels.server;\r
351 }\r
352 }\r
353\r
354 panel.addMsg('', '* ' + event.nick + ' ' + event.msg, 'action');\r
355 });\r
356\r
357\r
2c80d916
D
358 gw.on('ontopic', function (event) {\r
359 var c;\r
360 c = that.panels.getByName(event.channel);\r
361 if (!c) return;\r
362\r
363 // Set the channels topic\r
364 c.set('topic', event.topic);\r
365\r
366 // If this is the active channel, update the topic bar too\r
48d660e6 367 if (c.get('name') === kiwi.app.panels.active.get('name')) {\r
52773494 368 that.topicbar.setCurrentTopic(event.topic);\r
2c80d916
D
369 }\r
370 });\r
371\r
372\r
4a9e8527
D
373 gw.on('ontopicsetby', function (event) {\r
374 var c, when;\r
375 c = that.panels.getByName(event.channel);\r
376 if (!c) return;\r
377\r
51a4c383 378 when = formatDate(new Date(event.when * 1000));\r
4a9e8527
D
379 c.addMsg('', 'Topic set by ' + event.nick + ' at ' + when, 'topic');\r
380 });\r
381\r
382\r
2c80d916
D
383 gw.on('onuserlist', function (event) {\r
384 var channel;\r
385 channel = that.panels.getByName(event.channel);\r
386\r
387 // If we didn't find a channel for this, may aswell leave\r
388 if (!channel) return;\r
389\r
390 channel.temp_userlist = channel.temp_userlist || [];\r
391 _.each(event.users, function (item) {\r
392 var user = new kiwi.model.Member({nick: item.nick, modes: item.modes});\r
393 channel.temp_userlist.push(user);\r
394 });\r
395 });\r
396\r
397\r
398 gw.on('onuserlist_end', function (event) {\r
399 var channel;\r
400 channel = that.panels.getByName(event.channel);\r
401\r
402 // If we didn't find a channel for this, may aswell leave\r
403 if (!channel) return;\r
404\r
405 // Update the members list with the new list\r
406 channel.get('members').reset(channel.temp_userlist || []);\r
407\r
408 // Clear the temporary userlist\r
409 delete channel.temp_userlist;\r
410 });\r
dfe8ef37
D
411\r
412\r
413 gw.on('onmode', function (event) {\r
703d2778
JA
414 var channel, i, prefixes, members, member, find_prefix;\r
415 \r
51beac3b
D
416 // Build a nicely formatted string to be displayed to a regular human\r
417 function friendlyModeString (event_modes, alt_target) {\r
418 var modes = {}, return_string;\r
419\r
420 // If no default given, use the main event info\r
421 if (!event_modes) {\r
422 event_modes = event.modes;\r
423 alt_target = event.target;\r
424 }\r
425\r
426 // Reformat the mode object to make it easier to work with\r
427 _.each(event_modes, function (mode){\r
428 var param = mode.param || alt_target || '';\r
429\r
430 // Make sure we have some modes for this param\r
431 if (!modes[param]) {\r
432 modes[param] = {'+':'', '-':''};\r
433 }\r
434\r
435 modes[param][mode.mode[0]] += mode.mode.substr(1);\r
436 });\r
437\r
438 // Put the string together from each mode\r
439 return_string = [];\r
440 _.each(modes, function (modeset, param) {\r
441 var str = '';\r
442 if (modeset['+']) str += '+' + modeset['+'];\r
443 if (modeset['-']) str += '-' + modeset['-'];\r
444 return_string.push(str + ' ' + param);\r
445 });\r
446 return_string = return_string.join(', ');\r
447\r
448 return return_string;\r
449 }\r
450\r
451\r
703d2778
JA
452 channel = that.panels.getByName(event.target);\r
453 if (channel) {\r
454 prefixes = kiwi.gateway.get('user_prefixes');\r
455 find_prefix = function (p) {\r
456 return event.modes[i].mode[1] === p.mode;\r
457 };\r
458 for (i = 0; i < event.modes.length; i++) {\r
459 if (_.any(prefixes, find_prefix)) {\r
460 if (!members) {\r
461 members = channel.get('members');\r
462 }\r
463 member = members.getByNick(event.modes[i].param);\r
464 if (!member) {\r
465 console.log('MODE command recieved for unknown member %s on channel %s', event.modes[i].param, event.target);\r
466 return;\r
467 } else {\r
468 if (event.modes[i].mode[0] === '+') {\r
469 member.addMode(event.modes[i].mode[1]);\r
470 } else if (event.modes[i].mode[0] === '-') {\r
471 member.removeMode(event.modes[i].mode[1]);\r
472 }\r
81b5b773 473 members.sort();\r
51beac3b 474 //channel.addMsg('', '=== ' + event.nick + ' set mode ' + event.modes[i].mode + ' ' + event.modes[i].param, 'action mode');\r
703d2778
JA
475 }\r
476 } else {\r
51beac3b 477 // Channel mode being set\r
703d2778 478 // TODO: Store this somewhere?\r
51beac3b 479 //channel.addMsg('', 'CHANNEL === ' + event.nick + ' set mode ' + event.modes[i].mode + ' on ' + event.target, 'action mode');\r
703d2778
JA
480 }\r
481 }\r
51beac3b
D
482\r
483 channel.addMsg('', '=== ' + event.nick + ' sets mode ' + friendlyModeString(), 'action mode');\r
703d2778
JA
484 } else {\r
485 // This is probably a mode being set on us.\r
486 if (event.target.toLowerCase() === kiwi.gateway.get("nick").toLowerCase()) {\r
51beac3b 487 that.panels.server.addMsg('', '=== ' + event.nick + ' set mode ' + friendlyModeString(), 'action mode');\r
703d2778 488 } else {\r
51beac3b 489 console.log('MODE command recieved for unknown target %s: ', event.target, event);\r
703d2778 490 }\r
dfe8ef37 491 }\r
967687fc
D
492 });\r
493\r
494\r
495 gw.on('onnick', function (event) {\r
496 var member;\r
dfe8ef37 497\r
967687fc
D
498 $.each(that.panels.models, function (index, panel) {\r
499 if (!panel.isChannel()) return;\r
500\r
501 member = panel.get('members').getByNick(event.nick);\r
502 if (member) {\r
503 member.set('nick', event.newnick);\r
504 panel.addMsg('', '== ' + event.nick + ' is now known as ' + event.newnick, 'action nick');\r
505 }\r
506 });\r
dfe8ef37 507 });\r
a7758021
D
508\r
509\r
510 gw.on('onwhois', function (event) {\r
511 /*globals secondsToTime */\r
512 var logon_date, idle_time = '', panel;\r
513\r
514 if (event.end) {\r
515 return;\r
516 }\r
517\r
518 if (typeof event.idle !== 'undefined') {\r
519 idle_time = secondsToTime(parseInt(event.idle, 10));\r
520 idle_time = idle_time.h.toString().lpad(2, "0") + ':' + idle_time.m.toString().lpad(2, "0") + ':' + idle_time.s.toString().lpad(2, "0");\r
521 }\r
522\r
523 panel = kiwi.app.panels.active;\r
7f96413b
JA
524 if (event.ident) {\r
525 panel.addMsg(event.nick, 'is ' + event.nick + '!' + event.ident + '@' + event.host + ' * ' + event.msg, 'whois');\r
526 } else if (event.chans) {\r
527 panel.addMsg(event.nick, 'on ' + event.chans, 'whois');\r
528 } else if (event.server) {\r
529 panel.addMsg(event.nick, 'using ' + event.server, 'whois');\r
530 } else if (event.msg) {\r
a7758021
D
531 panel.addMsg(event.nick, event.msg, 'whois');\r
532 } else if (event.logon) {\r
533 logon_date = new Date();\r
534 logon_date.setTime(event.logon * 1000);\r
6d9c8cd4 535 logon_date = formatDate(logon_date);\r
a7758021
D
536\r
537 panel.addMsg(event.nick, 'idle for ' + idle_time + ', signed on ' + logon_date, 'whois');\r
538 } else {\r
539 panel.addMsg(event.nick, 'idle for ' + idle_time, 'whois');\r
540 }\r
541 });\r
3f77e986
D
542\r
543\r
21536e7b
D
544 gw.on('onlist_start', function (data) {\r
545 if (kiwi.app.channel_list) {\r
51ae0eb8 546 kiwi.app.channel_list.close();\r
21536e7b
D
547 delete kiwi.app.channel_list;\r
548 }\r
549\r
550 var panel = new kiwi.model.Applet(),\r
51ae0eb8 551 applet = new kiwi.applets.Chanlist();\r
21536e7b 552\r
51ae0eb8 553 panel.load(applet);\r
21536e7b
D
554 \r
555 kiwi.app.panels.add(panel);\r
556 panel.view.show();\r
ea033d12 557 \r
51ae0eb8 558 kiwi.app.channel_list = applet;\r
21536e7b
D
559 });\r
560\r
561\r
562 gw.on('onlist_channel', function (data) {\r
51ae0eb8 563 // TODO: Put this listener within the applet itself\r
21536e7b
D
564 kiwi.app.channel_list.addChannel(data.chans);\r
565 });\r
566\r
567\r
568 gw.on('onlist_end', function (data) {\r
51ae0eb8 569 // TODO: Put this listener within the applet itself\r
21536e7b
D
570 delete kiwi.app.channel_list;\r
571 });\r
572\r
573\r
3f77e986
D
574 gw.on('onirc_error', function (data) {\r
575 var panel, tmp;\r
576\r
577 if (data.channel !== undefined && !(panel = kiwi.app.panels.getByName(data.channel))) {\r
578 panel = kiwi.app.panels.server;\r
579 }\r
580\r
581 switch (data.error) {\r
582 case 'banned_from_channel':\r
583 panel.addMsg(' ', '=== You are banned from ' + data.channel + '. ' + data.reason, 'status');\r
584 kiwi.app.message.text('You are banned from ' + data.channel + '. ' + data.reason);\r
585 break;\r
586 case 'bad_channel_key':\r
587 panel.addMsg(' ', '=== Bad channel key for ' + data.channel, 'status');\r
588 kiwi.app.message.text('Bad channel key or password for ' + data.channel);\r
589 break;\r
590 case 'invite_only_channel':\r
591 panel.addMsg(' ', '=== ' + data.channel + ' is invite only.', 'status');\r
592 kiwi.app.message.text(data.channel + ' is invite only');\r
593 break;\r
594 case 'channel_is_full':\r
595 panel.addMsg(' ', '=== ' + data.channel + ' is full.', 'status');\r
596 kiwi.app.message.text(data.channel + ' is full');\r
597 break;\r
598 case 'chanop_privs_needed':\r
599 panel.addMsg(' ', '=== ' + data.reason, 'status');\r
600 kiwi.app.message.text(data.reason + ' (' + data.channel + ')');\r
601 break;\r
602 case 'no_such_nick':\r
603 tmp = kiwi.app.panels.getByName(data.nick);\r
604 if (tmp) {\r
605 tmp.addMsg(' ', '=== ' + data.nick + ': ' + data.reason, 'status');\r
606 } else {\r
607 kiwi.app.panels.server.addMsg(' ', '=== ' + data.nick + ': ' + data.reason, 'status');\r
608 }\r
609 break;\r
610 case 'nickname_in_use':\r
611 kiwi.app.panels.server.addMsg(' ', '=== The nickname ' + data.nick + ' is already in use. Please select a new nickname', 'status');\r
612 if (kiwi.app.panels.server !== kiwi.app.panels.active) {\r
613 kiwi.app.message.text('The nickname "' + data.nick + '" is already in use. Please select a new nickname');\r
51beac3b 614 }\r
ad07cfe2
D
615\r
616 // Only show the nickchange component if the controlbox is open\r
617 if (that.controlbox.$el.css('display') !== 'none') {\r
618 (new kiwi.view.NickChangeBox()).render();\r
3f77e986 619 }\r
51beac3b 620\r
3f77e986
D
621 break;\r
622 default:\r
623 // We don't know what data contains, so don't do anything with it.\r
624 //kiwi.front.tabviews.server.addMsg(null, ' ', '=== ' + data, 'status');\r
625 }\r
626 });\r
2c80d916
D
627 };\r
628\r
629\r
630\r
631 /**\r
632 * Bind to certain commands that may be typed into the control box\r
633 */\r
634 this.bindControllboxCommands = function (controlbox) {\r
4d6fcfeb 635 // Default aliases\r
64c6bcb4
D
636 $.extend(controlbox.preprocessor.aliases, {\r
637 '/p': '/part $1+',\r
638 '/me': '/action $1+',\r
639 '/j': '/join $1+',\r
640 '/q': '/query $1+',\r
4d6fcfeb 641 '/k': '/kick $1+'\r
64c6bcb4
D
642 });\r
643\r
4d6fcfeb 644 controlbox.on('unknown_command', unknownCommand);\r
2c80d916 645\r
4d6fcfeb
D
646 controlbox.on('command', allCommands);\r
647 controlbox.on('command_msg', msgCommand);\r
2c80d916 648\r
4d6fcfeb 649 controlbox.on('command_action', actionCommand);\r
0f40d499 650\r
4d6fcfeb 651 controlbox.on('command_join', joinCommand);\r
2c80d916 652\r
4d6fcfeb 653 controlbox.on('command_part', partCommand);\r
2c80d916
D
654\r
655 controlbox.on('command_nick', function (ev) {\r
656 kiwi.gateway.changeNick(ev.params[0]);\r
657 });\r
658\r
4d6fcfeb 659 controlbox.on('command_query', queryCommand);\r
9783a703 660\r
4d6fcfeb 661 controlbox.on('command_topic', topicCommand);\r
b5141adb 662\r
4d6fcfeb 663 controlbox.on('command_notice', noticeCommand);\r
68314431 664\r
4d6fcfeb 665 controlbox.on('command_quote', quoteCommand);\r
31325e67 666\r
4d6fcfeb 667 controlbox.on('command_kick', kickCommand);\r
e32b5eca 668\r
31325e67 669\r
2c80d916
D
670 controlbox.on('command_css', function (ev) {\r
671 var queryString = '?reload=' + new Date().getTime();\r
672 $('link[rel="stylesheet"]').each(function () {\r
673 this.href = this.href.replace(/\?.*|$/, queryString);\r
674 });\r
675 });\r
bacc69cb 676\r
19cc6364
D
677 controlbox.on('command_js', function (ev) {\r
678 if (!ev.params[0]) return;\r
679 $script(ev.params[0] + '?' + (new Date().getTime()));\r
680 });\r
681\r
64c6bcb4 682 controlbox.on('command_alias', function (ev) {\r
4d6fcfeb
D
683 var name, rule;\r
684\r
64c6bcb4
D
685 // No parameters passed so list them\r
686 if (!ev.params[1]) {\r
687 $.each(controlbox.preprocessor.aliases, function (name, rule) {\r
688 kiwi.app.panels.server.addMsg(' ', name + ' => ' + rule);\r
689 });\r
690 return;\r
691 }\r
692\r
693 // Deleting an alias?\r
694 if (ev.params[0] === 'del' || ev.params[0] === 'delete') {\r
4d6fcfeb 695 name = ev.params[1];\r
64c6bcb4
D
696 if (name[0] !== '/') name = '/' + name;\r
697 delete controlbox.preprocessor.aliases[name];\r
698 return;\r
699 }\r
700\r
701 // Add the alias\r
4d6fcfeb 702 name = ev.params[0];\r
64c6bcb4 703 ev.params.shift();\r
4d6fcfeb 704 rule = ev.params.join(' ');\r
64c6bcb4 705\r
4d6fcfeb 706 // Make sure the name starts with a slash\r
64c6bcb4 707 if (name[0] !== '/') name = '/' + name;\r
4d6fcfeb
D
708\r
709 // Now actually add the alias\r
64c6bcb4
D
710 controlbox.preprocessor.aliases[name] = rule;\r
711 });\r
712\r
4d6fcfeb
D
713 controlbox.on('command_applet', appletCommand);\r
714 controlbox.on('command_settings', settingsCommand);\r
2c80d916
D
715 };\r
716\r
9783a703 717 // A fallback action. Send a raw command to the server\r
4d6fcfeb 718 function unknownCommand (ev) {\r
9783a703
D
719 var raw_cmd = ev.command + ' ' + ev.params.join(' ');\r
720 console.log('RAW: ' + raw_cmd);\r
721 kiwi.gateway.raw(raw_cmd);\r
4d6fcfeb 722 }\r
2c80d916 723\r
4d6fcfeb 724 function allCommands (ev) {}\r
2c80d916 725\r
4d6fcfeb 726 function joinCommand (ev) {\r
0e12f51d
D
727 var channel, channel_names;\r
728\r
729 channel_names = ev.params.join(' ').split(',');\r
730\r
731 $.each(channel_names, function (index, channel_name) {\r
732 // Trim any whitespace off the name\r
733 channel_name = channel_name.trim();\r
734\r
735 // Check if we have the panel already. If not, create it\r
736 channel = that.panels.getByName(channel_name);\r
737 if (!channel) {\r
738 channel = new kiwi.model.Channel({name: channel_name});\r
739 kiwi.app.panels.add(channel);\r
740 }\r
741\r
742 kiwi.gateway.join(channel_name);\r
743 });\r
744\r
745 if (channel) channel.view.show();\r
746 \r
4d6fcfeb 747 }\r
2c80d916 748\r
4d6fcfeb 749 function queryCommand (ev) {\r
9783a703
D
750 var destination, panel;\r
751\r
752 destination = ev.params[0];\r
753\r
754 // Check if we have the panel already. If not, create it\r
755 panel = that.panels.getByName(destination);\r
756 if (!panel) {\r
757 panel = new kiwi.model.Channel({name: destination});\r
758 kiwi.app.panels.add(panel);\r
759 }\r
760\r
761 if (panel) panel.view.show();\r
762 \r
4d6fcfeb 763 }\r
9783a703 764\r
4d6fcfeb 765 function msgCommand (ev) {\r
9783a703
D
766 var destination = ev.params[0],\r
767 panel = that.panels.getByName(destination) || that.panels.server;\r
768\r
769 ev.params.shift();\r
770\r
771 panel.addMsg(kiwi.gateway.get('nick'), ev.params.join(' '));\r
772 kiwi.gateway.privmsg(destination, ev.params.join(' '));\r
4d6fcfeb 773 }\r
2c80d916 774\r
4d6fcfeb 775 function actionCommand (ev) {\r
48d660e6 776 if (kiwi.app.panels.active === kiwi.app.panels.server) {\r
0f40d499
D
777 return;\r
778 }\r
779\r
48d660e6 780 var panel = kiwi.app.panels.active;\r
0f40d499
D
781 panel.addMsg('', '* ' + kiwi.gateway.get('nick') + ' ' + ev.params.join(' '), 'action');\r
782 kiwi.gateway.action(panel.get('name'), ev.params.join(' '));\r
4d6fcfeb 783 }\r
0f40d499 784\r
4d6fcfeb 785 function partCommand (ev) {\r
2c80d916 786 if (ev.params.length === 0) {\r
48d660e6 787 kiwi.gateway.part(kiwi.app.panels.active.get('name'));\r
2c80d916
D
788 } else {\r
789 _.each(ev.params, function (channel) {\r
790 kiwi.gateway.part(channel);\r
791 });\r
792 }\r
52773494 793 // TODO: More responsive = close tab now, more accurate = leave until part event\r
48d660e6 794 //kiwi.app.panels.remove(kiwi.app.panels.active);\r
4d6fcfeb 795 }\r
2c80d916 796\r
4d6fcfeb 797 function topicCommand (ev) {\r
b5141adb
D
798 var channel_name;\r
799\r
800 if (ev.params.length === 0) return;\r
801\r
802 if (that.isChannelName(ev.params[0])) {\r
803 channel_name = ev.params[0];\r
804 ev.params.shift();\r
805 } else {\r
48d660e6 806 channel_name = kiwi.app.panels.active.get('name');\r
b5141adb
D
807 }\r
808\r
809 kiwi.gateway.topic(channel_name, ev.params.join(' '));\r
4d6fcfeb 810 }\r
b5141adb 811\r
4d6fcfeb 812 function noticeCommand (ev) {\r
68314431
D
813 var destination;\r
814\r
815 // Make sure we have a destination and some sort of message\r
816 if (ev.params.length <= 1) return;\r
817\r
818 destination = ev.params[0];\r
819 ev.params.shift();\r
820\r
821 kiwi.gateway.notice(destination, ev.params.join(' '));\r
4d6fcfeb 822 }\r
68314431 823\r
4d6fcfeb 824 function quoteCommand (ev) {\r
31325e67
D
825 var raw = ev.params.join(' ');\r
826 kiwi.gateway.raw(raw);\r
4d6fcfeb 827 }\r
31325e67 828\r
4d6fcfeb 829 function kickCommand (ev) {\r
e32b5eca
D
830 var nick, panel = kiwi.app.panels.active;\r
831\r
832 if (!panel.isChannel()) return;\r
833\r
834 // Make sure we have a nick\r
835 if (ev.params.length === 0) return;\r
836\r
837 nick = ev.params[0];\r
838 ev.params.shift();\r
839\r
840 kiwi.gateway.kick(panel.get('name'), nick, ev.params.join(' '));\r
4d6fcfeb 841 }\r
e32b5eca 842\r
4d6fcfeb 843 function settingsCommand (ev) {\r
19cc6364
D
844 var panel = new kiwi.model.Applet();\r
845 panel.load(new kiwi.applets.Settings());\r
846 \r
847 kiwi.app.panels.add(panel);\r
848 panel.view.show();\r
4d6fcfeb 849 }\r
bacc69cb 850\r
4d6fcfeb 851 function appletCommand (ev) {\r
26738910
D
852 if (!ev.params[0]) return;\r
853\r
854 var panel = new kiwi.model.Applet();\r
855\r
856 if (ev.params[1]) {\r
857 // Url and name given\r
858 panel.load(ev.params[0], ev.params[1]);\r
859 } else {\r
860 // Load a pre-loaded applet\r
861 if (kiwi.applets[ev.params[0]]) {\r
721ad945 862 panel.load(new kiwi.applets[ev.params[0]]());\r
26738910
D
863 } else {\r
864 kiwi.app.panels.server.addMsg('', 'Applet "' + ev.params[0] + '" does not exist');\r
865 return;\r
866 }\r
867 }\r
868 \r
869 kiwi.app.panels.add(panel);\r
870 panel.view.show();\r
4d6fcfeb 871 }\r
26738910 872\r
2c80d916
D
873\r
874\r
875\r
876\r
b5141adb
D
877 this.isChannelName = function (channel_name) {\r
878 var channel_prefix = kiwi.gateway.get('channel_prefix');\r
879\r
880 if (!channel_name || !channel_name.length) return false;\r
881 return (channel_prefix.indexOf(channel_name[0]) > -1);\r
882 };\r
883\r
4d6fcfeb 884\r
fed91446 885})());\r