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