Merge branch 'development' of https://github.com/crtaylor123/KiwiIRC into crtaylor123...
[KiwiIRC.git] / client / src / models / network.js
1 (function () {
2
3 _kiwi.model.Network = Backbone.Model.extend({
4 defaults: {
5 connection_id: 0,
6 /**
7 * The name of the network
8 * @type String
9 */
10 name: 'Network',
11
12 /**
13 * The address (URL) of the network
14 * @type String
15 */
16 address: '',
17
18 /**
19 * The port for the network
20 * @type Int
21 */
22 port: 6667,
23
24 /**
25 * If this network uses SSL
26 * @type Bool
27 */
28 ssl: false,
29
30 /**
31 * The password to connect to this network
32 * @type String
33 */
34 password: '',
35
36 /**
37 * The current nickname
38 * @type String
39 */
40 nick: '',
41
42 /**
43 * The channel prefix for this network
44 * @type String
45 */
46 channel_prefix: '#',
47
48 /**
49 * The user prefixes for channel owner/admin/op/voice etc. on this network
50 * @type Array
51 */
52 user_prefixes: [
53 {symbol: '~', mode: 'q'},
54 {symbol: '&', mode: 'a'},
55 {symbol: '@', mode: 'o'},
56 {symbol: '%', mode: 'h'},
57 {symbol: '+', mode: 'v'}
58 ],
59
60 /**
61 * List of nicks we are ignoring
62 * @type Array
63 */
64 ignore_list: []
65 },
66
67
68 initialize: function () {
69 // If we already have a connection, bind our events
70 if (typeof this.get('connection_id') !== 'undefined') {
71 this.gateway = _kiwi.global.components.Network(this.get('connection_id'));
72 this.bindGatewayEvents();
73 }
74
75 // Create our panel list (tabs)
76 this.panels = new _kiwi.model.PanelList([], this);
77 //this.panels.network = this;
78
79 // Automatically create a server tab
80 var server_panel = new _kiwi.model.Server({name: 'Server'});
81 this.panels.add(server_panel);
82 this.panels.server = this.panels.active = server_panel;
83 },
84
85
86 reconnect: function(callback_fn) {
87 var that = this,
88 server_info = {
89 nick: this.get('nick'),
90 host: this.get('address'),
91 port: this.get('port'),
92 ssl: this.get('ssl'),
93 password: this.get('password')
94 };
95
96 _kiwi.gateway.makeIrcConnection(server_info, function(err, connection_id) {
97 if (!err) {
98 that.gateway.dispose();
99
100 that.set('connection_id', connection_id);
101 that.gateway = _kiwi.global.components.Network(that.get('connection_id'));
102 that.bindGatewayEvents();
103
104 callback_fn && callback_fn(err);
105
106 } else {
107 console.log("_kiwi.gateway.socket.on('error')", {reason: err});
108 callback_fn && callback_fn(err);
109 }
110 });
111 },
112
113
114 bindGatewayEvents: function () {
115 //this.gateway.on('all', function() {console.log('ALL', this.get('connection_id'), arguments);});
116
117 this.gateway.on('connect', onConnect, this);
118 this.gateway.on('disconnect', onDisconnect, this);
119
120 this.gateway.on('nick', function(event) {
121 if (event.nick === this.get('nick')) {
122 this.set('nick', event.newnick);
123 }
124 }, this);
125
126 this.gateway.on('options', onOptions, this);
127 this.gateway.on('motd', onMotd, this);
128 this.gateway.on('join', onJoin, this);
129 this.gateway.on('part', onPart, this);
130 this.gateway.on('quit', onQuit, this);
131 this.gateway.on('kick', onKick, this);
132 this.gateway.on('msg', onMsg, this);
133 this.gateway.on('nick', onNick, this);
134 this.gateway.on('ctcp_request', onCtcpRequest, this);
135 this.gateway.on('ctcp_response', onCtcpResponse, this);
136 this.gateway.on('notice', onNotice, this);
137 this.gateway.on('action', onAction, this);
138 this.gateway.on('topic', onTopic, this);
139 this.gateway.on('topicsetby', onTopicSetBy, this);
140 this.gateway.on('userlist', onUserlist, this);
141 this.gateway.on('userlist_end', onUserlistEnd, this);
142 this.gateway.on('banlist', onBanlist, this);
143 this.gateway.on('mode', onMode, this);
144 this.gateway.on('whois', onWhois, this);
145 this.gateway.on('whowas', onWhowas, this);
146 this.gateway.on('away', onAway, this);
147 this.gateway.on('list_start', onListStart, this);
148 this.gateway.on('irc_error', onIrcError, this);
149 this.gateway.on('unknown_command', onUnknownCommand, this);
150 this.gateway.on('channel_info', onChannelInfo, this);
151 },
152
153
154 /**
155 * Create panels and join the channel
156 * This will not wait for the join event to create a panel. This
157 * increases responsiveness in case of network lag
158 */
159 createAndJoinChannels: function (channels) {
160 var that = this,
161 panels = [];
162
163 // Multiple channels may come as comma-delimited
164 if (typeof channels === 'string') {
165 channels = channels.split(',');
166 }
167
168 $.each(channels, function (index, channel_name_key) {
169 // We may have a channel key so split it off
170 var spli = channel_name_key.trim().split(' '),
171 channel_name = spli[0],
172 channel_key = spli[1] || '';
173
174 // Trim any whitespace off the name
175 channel_name = channel_name.trim();
176
177 // Add channel_prefix in front of the first channel if missing
178 if (that.get('channel_prefix').indexOf(channel_name[0]) === -1) {
179 // Could be many prefixes but '#' is highly likely the required one
180 channel_name = '#' + channel_name;
181 }
182
183 // Check if we have the panel already. If not, create it
184 channel = that.panels.getByName(channel_name);
185 if (!channel) {
186 channel = new _kiwi.model.Channel({name: channel_name, network: that});
187 that.panels.add(channel);
188 }
189
190 panels.push(channel);
191
192 that.gateway.join(channel_name, channel_key);
193 });
194
195 return panels;
196 },
197
198
199 /**
200 * Join all the open channels we have open
201 * Reconnecting to a network would typically call this.
202 */
203 rejoinAllChannels: function() {
204 var that = this;
205
206 this.panels.forEach(function(panel) {
207 if (!panel.isChannel())
208 return;
209
210 that.gateway.join(panel.get('name'));
211 });
212 },
213
214 isChannelName: function (channel_name) {
215 var channel_prefix = this.get('channel_prefix');
216
217 if (!channel_name || !channel_name.length) return false;
218 return (channel_prefix.indexOf(channel_name[0]) > -1);
219 },
220
221 // Check a nick alongside our ignore list
222 isNickIgnored: function (nick) {
223 var idx, list = this.get('ignore_list');
224 var pattern, regex;
225
226 for (idx = 0; idx < list.length; idx++) {
227 pattern = list[idx].replace(/([.+^$[\]\\(){}|-])/g, "\\$1")
228 .replace('*', '.*')
229 .replace('?', '.');
230
231 regex = new RegExp(pattern, 'i');
232 if (regex.test(nick)) return true;
233 }
234
235 return false;
236 }
237 });
238
239
240
241 function onDisconnect(event) {
242 $.each(this.panels.models, function (index, panel) {
243 panel.addMsg('', _kiwi.global.i18n.translate('client_models_network_disconnected').fetch(), 'action quit');
244 });
245 }
246
247
248
249 function onConnect(event) {
250 var panels, channel_names;
251
252 // Update our nick with what the network gave us
253 this.set('nick', event.nick);
254
255 // If this is a re-connection then we may have some channels to re-join
256 this.rejoinAllChannels();
257
258 // Auto joining channels
259 if (this.auto_join && this.auto_join.channel) {
260 panels = this.createAndJoinChannels(this.auto_join.channel + ' ' + (this.auto_join.key || ''));
261
262 // Show the last channel if we have one
263 if (panels)
264 panels[panels.length - 1].view.show();
265
266 delete this.auto_join;
267 }
268 }
269
270
271
272 function onOptions(event) {
273 var that = this;
274
275 $.each(event.options, function (name, value) {
276 switch (name) {
277 case 'CHANTYPES':
278 that.set('channel_prefix', value.join(''));
279 break;
280 case 'NETWORK':
281 that.set('name', value);
282 break;
283 case 'PREFIX':
284 that.set('user_prefixes', value);
285 break;
286 }
287 });
288
289 this.set('cap', event.cap);
290 }
291
292
293
294 function onMotd(event) {
295 this.panels.server.addMsg(this.get('name'), event.msg, 'motd');
296 }
297
298
299
300 function onJoin(event) {
301 var c, members, user;
302 c = this.panels.getByName(event.channel);
303 if (!c) {
304 c = new _kiwi.model.Channel({name: event.channel, network: this});
305 this.panels.add(c);
306 }
307
308 members = c.get('members');
309 if (!members) return;
310
311 user = new _kiwi.model.Member({
312 nick: event.nick,
313 ident: event.ident,
314 hostname: event.hostname,
315 user_prefixes: this.get('user_prefixes')
316 });
317 members.add(user, {kiwi: event});
318 }
319
320
321
322 function onPart(event) {
323 var channel, members, user,
324 part_options = {};
325
326 part_options.type = 'part';
327 part_options.message = event.message || '';
328 part_options.time = event.time;
329
330 channel = this.panels.getByName(event.channel);
331 if (!channel) return;
332
333 // If this is us, close the panel
334 if (event.nick === this.get('nick')) {
335 channel.close();
336 return;
337 }
338
339 members = channel.get('members');
340 if (!members) return;
341
342 user = members.getByNick(event.nick);
343 if (!user) return;
344
345 members.remove(user, {kiwi: part_options});
346 }
347
348
349
350 function onQuit(event) {
351 var member, members,
352 quit_options = {};
353
354 quit_options.type = 'quit';
355 quit_options.message = event.message || '';
356 quit_options.time = event.time;
357
358 $.each(this.panels.models, function (index, panel) {
359 if (!panel.isChannel()) return;
360
361 member = panel.get('members').getByNick(event.nick);
362 if (member) {
363 panel.get('members').remove(member, {kiwi: quit_options});
364 }
365 });
366 }
367
368
369
370 function onKick(event) {
371 var channel, members, user,
372 part_options = {};
373
374 part_options.type = 'kick';
375 part_options.by = event.nick;
376 part_options.message = event.message || '';
377 part_options.current_user_kicked = (event.kicked == this.get('nick'));
378 part_options.current_user_initiated = (event.nick == this.get('nick'));
379 part_options.time = event.time;
380
381 channel = this.panels.getByName(event.channel);
382 if (!channel) return;
383
384 members = channel.get('members');
385 if (!members) return;
386
387 user = members.getByNick(event.kicked);
388 if (!user) return;
389
390
391 members.remove(user, {kiwi: part_options});
392
393 if (part_options.current_user_kicked) {
394 members.reset([]);
395 }
396 }
397
398
399
400 function onMsg(event) {
401 var panel,
402 is_pm = (event.channel.toLowerCase() == this.get('nick').toLowerCase());
403
404 // An ignored user? don't do anything with it
405 if (this.isNickIgnored(event.nick)) {
406 return;
407 }
408
409 if (is_pm) {
410 // If a panel isn't found for this PM, create one
411 panel = this.panels.getByName(event.nick);
412 if (!panel) {
413 panel = new _kiwi.model.Query({name: event.nick});
414 this.panels.add(panel);
415 }
416
417 } else {
418 // If a panel isn't found for this channel, reroute to the
419 // server panel
420 panel = this.panels.getByName(event.channel);
421 if (!panel) {
422 panel = this.panels.server;
423 }
424 }
425
426 panel.addMsg(event.nick, event.msg, 'privmsg', {time: event.time});
427 }
428
429
430
431 function onNick(event) {
432 var member;
433
434 $.each(this.panels.models, function (index, panel) {
435 if (panel.get('name') == event.nick)
436 panel.set('name', event.newnick);
437
438 if (!panel.isChannel()) return;
439
440 member = panel.get('members').getByNick(event.nick);
441 if (member) {
442 member.set('nick', event.newnick);
443 panel.addMsg('', '== ' + _kiwi.global.i18n.translate('client_models_network_nickname_changed').fetch(event.nick, event.newnick) , 'action nick', {time: event.time});
444 }
445 });
446 }
447
448
449
450 function onCtcpRequest(event) {
451 // An ignored user? don't do anything with it
452 if (this.isNickIgnored(event.nick)) {
453 return;
454 }
455
456 // Reply to a TIME ctcp
457 if (event.msg.toUpperCase() === 'TIME') {
458 this.gateway.ctcp(false, event.type, event.nick, (new Date()).toString());
459 }
460 }
461
462
463
464 function onCtcpResponse(event) {
465 // An ignored user? don't do anything with it
466 if (this.isNickIgnored(event.nick)) {
467 return;
468 }
469
470 this.panels.server.addMsg('[' + event.nick + ']', 'CTCP ' + event.msg, 'ctcp', {time: event.time});
471 }
472
473
474
475 function onNotice(event) {
476 var panel, active_panel, channel_name;
477
478 // An ignored user? don't do anything with it
479 if (!event.from_server && event.nick && this.isNickIgnored(event.nick)) {
480 return;
481 }
482
483 // Find a panel for the destination(channel) or who its from
484 if (!event.from_server) {
485 panel = this.panels.getByName(event.target) || this.panels.getByName(event.nick);
486
487 // Forward ChanServ messages to its associated channel
488 if (event.nick && event.nick.toLowerCase() == 'chanserv' && event.msg.charAt(0) == '[') {
489 channel_name = /\[([^ \]]+)\]/gi.exec(event.msg);
490 if (channel_name && channel_name[1]) {
491 channel_name = channel_name[1];
492
493 panel = this.panels.getByName(channel_name);
494 }
495 }
496
497 if (!panel) {
498 panel = this.panels.server;
499 }
500 } else {
501 panel = this.panels.server;
502 }
503
504 panel.addMsg('[' + (event.nick||'') + ']', event.msg, 'notice', {time: event.time});
505
506 // Show this notice to the active panel if it didn't have a set target, but only in an active channel or query window
507 active_panel = _kiwi.app.panels().active;
508
509 if (!event.from_server && panel === this.panels.server && active_panel !== this.panels.server) {
510 if (active_panel.isChannel() || active_panel.isQuery())
511 active_panel.addMsg('[' + (event.nick||'') + ']', event.msg, 'notice', {time: event.time});
512 }
513 }
514
515
516
517 function onAction(event) {
518 var panel,
519 is_pm = (event.channel.toLowerCase() == this.get('nick').toLowerCase());
520
521 // An ignored user? don't do anything with it
522 if (this.isNickIgnored(event.nick)) {
523 return;
524 }
525
526 if (is_pm) {
527 // If a panel isn't found for this PM, create one
528 panel = this.panels.getByName(event.nick);
529 if (!panel) {
530 panel = new _kiwi.model.Channel({name: event.nick, network: this});
531 this.panels.add(panel);
532 }
533
534 } else {
535 // If a panel isn't found for this channel, reroute to the
536 // server panel
537 panel = this.panels.getByName(event.channel);
538 if (!panel) {
539 panel = this.panels.server;
540 }
541 }
542
543 panel.addMsg('', '* ' + event.nick + ' ' + event.msg, 'action', {time: event.time});
544 }
545
546
547
548 function onTopic(event) {
549 var c;
550 c = this.panels.getByName(event.channel);
551 if (!c) return;
552
553 // Set the channels topic
554 c.set('topic', event.topic);
555
556 // If this is the active channel, update the topic bar too
557 if (c.get('name') === this.panels.active.get('name')) {
558 _kiwi.app.topicbar.setCurrentTopic(event.topic);
559 }
560 }
561
562
563
564 function onTopicSetBy(event) {
565 var c, when;
566 c = this.panels.getByName(event.channel);
567 if (!c) return;
568
569 when = formatDate(new Date(event.when * 1000));
570 c.addMsg('', _kiwi.global.i18n.translate('client_models_network_topic').fetch(event.nick, when), 'topic');
571 }
572
573
574
575 function onChannelInfo(event) {
576 var channel = this.panels.getByName(event.channel);
577 if (!channel) return;
578
579 if (event.url) {
580 channel.set('info_url', event.url);
581 } else if (event.modes) {
582 channel.set('info_modes', event.modes);
583 }
584 }
585
586
587
588 function onUserlist(event) {
589 var that = this,
590 channel = this.panels.getByName(event.channel);
591
592 // If we didn't find a channel for this, may aswell leave
593 if (!channel) return;
594
595 channel.temp_userlist = channel.temp_userlist || [];
596 _.each(event.users, function (item) {
597 var user = new _kiwi.model.Member({
598 nick: item.nick,
599 modes: item.modes,
600 user_prefixes: that.get('user_prefixes')
601 });
602 channel.temp_userlist.push(user);
603 });
604 }
605
606
607
608 function onUserlistEnd(event) {
609 var channel;
610 channel = this.panels.getByName(event.channel);
611
612 // If we didn't find a channel for this, may aswell leave
613 if (!channel) return;
614
615 // Update the members list with the new list
616 channel.get('members').reset(channel.temp_userlist || []);
617
618 // Clear the temporary userlist
619 delete channel.temp_userlist;
620 }
621
622
623
624 function onBanlist(event) {
625 var channel = this.panels.getByName(event.channel);
626 if (!channel)
627 return;
628
629 channel.set('banlist', event.bans || []);
630 }
631
632
633
634 function onMode(event) {
635 var channel, i, prefixes, members, member, find_prefix,
636 request_updated_banlist = false;
637
638 // Build a nicely formatted string to be displayed to a regular human
639 function friendlyModeString (event_modes, alt_target) {
640 var modes = {}, return_string;
641
642 // If no default given, use the main event info
643 if (!event_modes) {
644 event_modes = event.modes;
645 alt_target = event.target;
646 }
647
648 // Reformat the mode object to make it easier to work with
649 _.each(event_modes, function (mode){
650 var param = mode.param || alt_target || '';
651
652 // Make sure we have some modes for this param
653 if (!modes[param]) {
654 modes[param] = {'+':'', '-':''};
655 }
656
657 modes[param][mode.mode[0]] += mode.mode.substr(1);
658 });
659
660 // Put the string together from each mode
661 return_string = [];
662 _.each(modes, function (modeset, param) {
663 var str = '';
664 if (modeset['+']) str += '+' + modeset['+'];
665 if (modeset['-']) str += '-' + modeset['-'];
666 return_string.push(str + ' ' + param);
667 });
668 return_string = return_string.join(', ');
669
670 return return_string;
671 }
672
673
674 channel = this.panels.getByName(event.target);
675 if (channel) {
676 prefixes = this.get('user_prefixes');
677 find_prefix = function (p) {
678 return event.modes[i].mode[1] === p.mode;
679 };
680 for (i = 0; i < event.modes.length; i++) {
681 if (_.any(prefixes, find_prefix)) {
682 if (!members) {
683 members = channel.get('members');
684 }
685 member = members.getByNick(event.modes[i].param);
686 if (!member) {
687 console.log('MODE command recieved for unknown member %s on channel %s', event.modes[i].param, event.target);
688 return;
689 } else {
690 if (event.modes[i].mode[0] === '+') {
691 member.addMode(event.modes[i].mode[1]);
692 } else if (event.modes[i].mode[0] === '-') {
693 member.removeMode(event.modes[i].mode[1]);
694 }
695 members.sort();
696 }
697 } else {
698 // Channel mode being set
699 // TODO: Store this somewhere?
700 //channel.addMsg('', 'CHANNEL === ' + event.nick + ' set mode ' + event.modes[i].mode + ' on ' + event.target, 'action mode');
701 }
702
703 // TODO: Be smart, remove this specific ban from the banlist rather than request a whole banlist
704 if (event.modes[i].mode[1] == 'b')
705 request_updated_banlist = true;
706 }
707
708 channel.addMsg('', '== ' + _kiwi.global.i18n.translate('client_models_network_mode').fetch(event.nick, friendlyModeString()), 'action mode', {time: event.time});
709
710 // TODO: Be smart, remove the specific ban from the banlist rather than request a whole banlist
711 if (request_updated_banlist)
712 this.gateway.raw('MODE ' + channel.get('name') + ' +b');
713
714 } else {
715 // This is probably a mode being set on us.
716 if (event.target.toLowerCase() === this.get("nick").toLowerCase()) {
717 this.panels.server.addMsg('', '== ' + _kiwi.global.i18n.translate('client_models_network_selfmode').fetch(event.nick, friendlyModeString()), 'action mode');
718 } else {
719 console.log('MODE command recieved for unknown target %s: ', event.target, event);
720 }
721 }
722 }
723
724
725
726 function onWhois(event) {
727 var logon_date, idle_time = '', panel;
728
729 if (event.end)
730 return;
731
732 if (typeof event.idle !== 'undefined') {
733 idle_time = secondsToTime(parseInt(event.idle, 10));
734 idle_time = idle_time.h.toString().lpad(2, "0") + ':' + idle_time.m.toString().lpad(2, "0") + ':' + idle_time.s.toString().lpad(2, "0");
735 }
736
737 panel = _kiwi.app.panels().active;
738 if (event.ident) {
739 panel.addMsg(event.nick, event.nick + ' [' + event.nick + '!' + event.ident + '@' + event.host + '] * ' + event.msg, 'whois');
740 } else if (event.chans) {
741 panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_channels').fetch(event.chans), 'whois');
742 } else if (event.irc_server) {
743 panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_server').fetch(event.irc_server, event.server_info), 'whois');
744 } else if (event.msg) {
745 panel.addMsg(event.nick, event.msg, 'whois');
746 } else if (event.logon) {
747 logon_date = new Date();
748 logon_date.setTime(event.logon * 1000);
749 logon_date = formatDate(logon_date);
750
751 panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_idle_and_signon').fetch(idle_time, logon_date), 'whois');
752 } else if (event.away_reason) {
753 panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_away').fetch(event.away_reason), 'whois');
754 } else {
755 panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_idle').fetch(idle_time), 'whois');
756 }
757 }
758
759 function onWhowas(event) {
760 var panel;
761
762 if (event.end)
763 return;
764
765 panel = _kiwi.app.panels().active;
766 if (event.host) {
767 panel.addMsg(event.nick, event.nick + ' [' + event.nick + ((event.ident)? '!' + event.ident : '') + '@' + event.host + '] * ' + event.real_name, 'whois');
768 } else {
769 panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_nickname_notfound').fetch(), 'whois');
770 }
771 }
772
773
774 function onAway(event) {
775 $.each(this.panels.models, function (index, panel) {
776 if (!panel.isChannel()) return;
777
778 member = panel.get('members').getByNick(event.nick);
779 if (member) {
780 member.set('away', !(!event.reason));
781 }
782 });
783 }
784
785
786
787 function onListStart(event) {
788 var chanlist = _kiwi.model.Applet.loadOnce('kiwi_chanlist');
789 chanlist.view.show();
790 }
791
792
793
794 function onIrcError(event) {
795 var panel, tmp;
796
797 if (event.channel !== undefined && !(panel = this.panels.getByName(event.channel))) {
798 panel = this.panels.server;
799 }
800
801 switch (event.error) {
802 case 'banned_from_channel':
803 panel.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_banned').fetch(event.channel, event.reason), 'status');
804 _kiwi.app.message.text(_kiwi.global.i18n.translate('client_models_network_banned').fetch(event.channel, event.reason));
805 break;
806 case 'bad_channel_key':
807 panel.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_channel_badkey').fetch(event.channel), 'status');
808 _kiwi.app.message.text(_kiwi.global.i18n.translate('client_models_network_channel_badkey').fetch(event.channel));
809 break;
810 case 'invite_only_channel':
811 panel.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_channel_inviteonly').fetch(event.channel), 'status');
812 _kiwi.app.message.text(_kiwi.global.i18n.translate('client_models_network_channel_inviteonly').fetch(event.channel));
813 break;
814 case 'user_on_channel':
815 panel.addMsg(' ', '== ' + event.nick + ' is already on this channel');
816 break;
817 case 'channel_is_full':
818 panel.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_channel_limitreached').fetch(event.channel), 'status');
819 _kiwi.app.message.text(_kiwi.global.i18n.translate('client_models_network_channel_limitreached').fetch(event.channel));
820 break;
821 case 'chanop_privs_needed':
822 panel.addMsg(' ', '== ' + event.reason, 'status');
823 _kiwi.app.message.text(event.reason + ' (' + event.channel + ')');
824 break;
825 case 'no_such_nick':
826 tmp = this.panels.getByName(event.nick);
827 if (tmp) {
828 tmp.addMsg(' ', '== ' + event.nick + ': ' + event.reason, 'status');
829 } else {
830 this.panels.server.addMsg(' ', '== ' + event.nick + ': ' + event.reason, 'status');
831 }
832 break;
833 case 'nickname_in_use':
834 this.panels.server.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_nickname_alreadyinuse').fetch( event.nick), 'status');
835 if (this.panels.server !== this.panels.active) {
836 _kiwi.app.message.text(_kiwi.global.i18n.translate('client_models_network_nickname_alreadyinuse').fetch(event.nick));
837 }
838
839 // Only show the nickchange component if the controlbox is open
840 if (_kiwi.app.controlbox.$el.css('display') !== 'none') {
841 (new _kiwi.view.NickChangeBox()).render();
842 }
843
844 break;
845
846 case 'password_mismatch':
847 this.panels.server.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_badpassword').fetch(), 'status');
848 break;
849 default:
850 // We don't know what data contains, so don't do anything with it.
851 //_kiwi.front.tabviews.server.addMsg(null, ' ', '== ' + data, 'status');
852 }
853 }
854
855
856 function onUnknownCommand(event) {
857 var display_params = _.clone(event.params);
858
859 // A lot of commands have our nick as the first parameter. This is redundant for us
860 if (display_params[0] && display_params[0] == this.get('nick')) {
861 display_params.shift();
862 }
863
864 this.panels.server.addMsg('', '[' + event.command + '] ' + display_params.join(', ', ''));
865 }
866 }
867
868 )();