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