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