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