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