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