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