Commit | Line | Data |
---|---|---|
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 | */ | |
d772b95d D |
52 | user_prefixes: [ |
53 | {symbol: '~', mode: 'q'}, | |
54 | {symbol: '&', mode: 'a'}, | |
55 | {symbol: '@', mode: 'o'}, | |
56 | {symbol: '%', mode: 'h'}, | |
57 | {symbol: '+', mode: 'v'} | |
58 | ], | |
425efe7a JA |
59 | |
60 | /** | |
61 | * List of nicks we are ignoring | |
62 | * @type Array | |
63 | */ | |
64 | ignore_list: [] | |
ce13508b D |
65 | }, |
66 | ||
67 | ||
68 | initialize: function () { | |
d6eec6ed D |
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 | } | |
ce13508b | 74 | |
c62a9570 | 75 | // Create our panel list (tabs) |
0e546dd4 | 76 | this.panels = new _kiwi.model.PanelList([], this); |
c62a9570 | 77 | //this.panels.network = this; |
0e546dd4 D |
78 | |
79 | // Automatically create a server tab | |
80 | var server_panel = new _kiwi.model.Server({name: 'Server'}); | |
81 | this.panels.add(server_panel); | |
c966123a | 82 | this.panels.server = this.panels.active = server_panel; |
ce13508b D |
83 | }, |
84 | ||
85 | ||
d6eec6ed D |
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 | ||
ce13508b | 114 | bindGatewayEvents: function () { |
0e546dd4 | 115 | //this.gateway.on('all', function() {console.log('ALL', this.get('connection_id'), arguments);}); |
ce13508b | 116 | |
4047ee2b | 117 | this.gateway.on('connect', onConnect, this); |
a36b7eb6 | 118 | this.gateway.on('disconnect', onDisconnect, this); |
ce13508b D |
119 | |
120 | this.gateway.on('nick', function(event) { | |
2ffd1291 | 121 | if (event.nick === this.get('nick')) { |
ce13508b D |
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); | |
e2c54b3e | 133 | this.gateway.on('nick', onNick, this); |
ce13508b D |
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); | |
72db27e4 | 142 | this.gateway.on('banlist', onBanlist, this); |
ce13508b D |
143 | this.gateway.on('mode', onMode, this); |
144 | this.gateway.on('whois', onWhois, this); | |
5989f3f4 | 145 | this.gateway.on('whowas', onWhowas, this); |
ce13508b D |
146 | this.gateway.on('away', onAway, this); |
147 | this.gateway.on('list_start', onListStart, this); | |
f8240e98 | 148 | this.gateway.on('irc_error', onIrcError, this); |
3d753975 | 149 | this.gateway.on('unknown_command', onUnknownCommand, this); |
72db27e4 | 150 | this.gateway.on('channel_info', onChannelInfo, this); |
18818abd D |
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 | ||
d6eec6ed | 163 | // Multiple channels may come as comma-delimited |
18818abd D |
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(); | |
0db58ad7 | 176 | |
b8bba51e | 177 | // Add channel_prefix in front of the first channel if missing |
0db58ad7 D |
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; | |
18818abd D |
181 | } |
182 | ||
183 | // Check if we have the panel already. If not, create it | |
184 | channel = that.panels.getByName(channel_name); | |
185 | if (!channel) { | |
72db27e4 | 186 | channel = new _kiwi.model.Channel({name: channel_name, network: that}); |
18818abd D |
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; | |
24d27c8c D |
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 | }); | |
425efe7a JA |
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; | |
ce13508b D |
236 | } |
237 | }); | |
238 | ||
239 | ||
d6eec6ed | 240 | |
a36b7eb6 D |
241 | function onDisconnect(event) { |
242 | $.each(this.panels.models, function (index, panel) { | |
247dd7ac | 243 | panel.addMsg('', _kiwi.global.i18n.translate('client_models_network_disconnected').fetch(), 'action quit'); |
a36b7eb6 D |
244 | }); |
245 | } | |
246 | ||
247 | ||
ce13508b | 248 | |
4047ee2b | 249 | function onConnect(event) { |
18818abd D |
250 | var panels, channel_names; |
251 | ||
252 | // Update our nick with what the network gave us | |
4047ee2b D |
253 | this.set('nick', event.nick); |
254 | ||
24d27c8c D |
255 | // If this is a re-connection then we may have some channels to re-join |
256 | this.rejoinAllChannels(); | |
257 | ||
18818abd | 258 | // Auto joining channels |
4047ee2b | 259 | if (this.auto_join && this.auto_join.channel) { |
852c230c | 260 | panels = this.createAndJoinChannels(this.auto_join.channel + ' ' + (this.auto_join.key || '')); |
18818abd D |
261 | |
262 | // Show the last channel if we have one | |
263 | if (panels) | |
264 | panels[panels.length - 1].view.show(); | |
cf3d9759 D |
265 | |
266 | delete this.auto_join; | |
4047ee2b D |
267 | } |
268 | } | |
269 | ||
270 | ||
271 | ||
ce13508b D |
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) { | |
72db27e4 | 304 | c = new _kiwi.model.Channel({name: event.channel, network: this}); |
ce13508b D |
305 | this.panels.add(c); |
306 | } | |
307 | ||
308 | members = c.get('members'); | |
309 | if (!members) return; | |
310 | ||
11412289 D |
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 | }); | |
697a76c5 | 317 | members.add(user, {kiwi: event}); |
ce13508b D |
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 || ''; | |
697a76c5 | 328 | part_options.time = event.time; |
ce13508b D |
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 | ||
697a76c5 | 345 | members.remove(user, {kiwi: part_options}); |
ce13508b D |
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 || ''; | |
697a76c5 | 356 | quit_options.time = event.time; |
ce13508b D |
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) { | |
697a76c5 | 363 | panel.get('members').remove(member, {kiwi: quit_options}); |
ce13508b D |
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 || ''; | |
697a76c5 JA |
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; | |
ce13508b D |
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 | ||
eed5ac29 | 390 | |
697a76c5 | 391 | members.remove(user, {kiwi: part_options}); |
ce13508b | 392 | |
b8c035b2 | 393 | if (part_options.current_user_kicked) { |
d6eec6ed | 394 | members.reset([]); |
ce13508b D |
395 | } |
396 | } | |
397 | ||
398 | ||
399 | ||
400 | function onMsg(event) { | |
401 | var panel, | |
aef6e2a7 | 402 | is_pm = (event.channel.toLowerCase() == this.get('nick').toLowerCase()); |
ce13508b D |
403 | |
404 | // An ignored user? don't do anything with it | |
425efe7a | 405 | if (this.isNickIgnored(event.nick)) { |
ce13508b D |
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 | ||
697a76c5 | 426 | panel.addMsg(event.nick, event.msg, 'privmsg', {time: event.time}); |
ce13508b D |
427 | } |
428 | ||
429 | ||
430 | ||
e2c54b3e D |
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); | |
697a76c5 | 443 | panel.addMsg('', '== ' + _kiwi.global.i18n.translate('client_models_network_nickname_changed').fetch(event.nick, event.newnick) , 'action nick', {time: event.time}); |
e2c54b3e D |
444 | } |
445 | }); | |
446 | } | |
447 | ||
448 | ||
449 | ||
ce13508b D |
450 | function onCtcpRequest(event) { |
451 | // An ignored user? don't do anything with it | |
425efe7a | 452 | if (this.isNickIgnored(event.nick)) { |
ce13508b D |
453 | return; |
454 | } | |
455 | ||
456 | // Reply to a TIME ctcp | |
457 | if (event.msg.toUpperCase() === 'TIME') { | |
e3691498 | 458 | this.gateway.ctcp(false, event.type, event.nick, (new Date()).toString()); |
ce13508b D |
459 | } |
460 | } | |
461 | ||
462 | ||
463 | ||
464 | function onCtcpResponse(event) { | |
465 | // An ignored user? don't do anything with it | |
425efe7a | 466 | if (this.isNickIgnored(event.nick)) { |
ce13508b D |
467 | return; |
468 | } | |
469 | ||
697a76c5 | 470 | this.panels.server.addMsg('[' + event.nick + ']', 'CTCP ' + event.msg, 'ctcp', {time: event.time}); |
ce13508b D |
471 | } |
472 | ||
473 | ||
474 | ||
475 | function onNotice(event) { | |
17f187e6 | 476 | var panel, active_panel, channel_name; |
ce13508b D |
477 | |
478 | // An ignored user? don't do anything with it | |
425efe7a | 479 | if (!event.from_server && event.nick && this.isNickIgnored(event.nick)) { |
ce13508b D |
480 | return; |
481 | } | |
482 | ||
483 | // Find a panel for the destination(channel) or who its from | |
0190c2c9 D |
484 | if (!event.from_server) { |
485 | panel = this.panels.getByName(event.target) || this.panels.getByName(event.nick); | |
4550fa1f D |
486 | |
487 | // Forward ChanServ messages to its associated channel | |
b70909a6 | 488 | if (event.nick && event.nick.toLowerCase() == 'chanserv' && event.msg.charAt(0) == '[') { |
4550fa1f D |
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 | ||
0190c2c9 D |
497 | if (!panel) { |
498 | panel = this.panels.server; | |
499 | } | |
500 | } else { | |
ce13508b D |
501 | panel = this.panels.server; |
502 | } | |
503 | ||
697a76c5 | 504 | panel.addMsg('[' + (event.nick||'') + ']', event.msg, 'notice', {time: event.time}); |
2119ce7a | 505 | |
17f187e6 D |
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 | } | |
ce13508b D |
513 | } |
514 | ||
515 | ||
516 | ||
517 | function onAction(event) { | |
518 | var panel, | |
aef6e2a7 | 519 | is_pm = (event.channel.toLowerCase() == this.get('nick').toLowerCase()); |
ce13508b D |
520 | |
521 | // An ignored user? don't do anything with it | |
425efe7a | 522 | if (this.isNickIgnored(event.nick)) { |
ce13508b D |
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) { | |
72db27e4 | 530 | panel = new _kiwi.model.Channel({name: event.nick, network: this}); |
ce13508b D |
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 | ||
697a76c5 | 543 | panel.addMsg('', '* ' + event.nick + ' ' + event.msg, 'action', {time: event.time}); |
ce13508b D |
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)); | |
247dd7ac | 570 | c.addMsg('', _kiwi.global.i18n.translate('client_models_network_topic').fetch(event.nick, when), 'topic'); |
ce13508b D |
571 | } |
572 | ||
573 | ||
574 | ||
72db27e4 D |
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 | ||
ce13508b | 588 | function onUserlist(event) { |
11412289 D |
589 | var that = this, |
590 | channel = this.panels.getByName(event.channel); | |
ce13508b D |
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) { | |
11412289 D |
597 | var user = new _kiwi.model.Member({ |
598 | nick: item.nick, | |
599 | modes: item.modes, | |
600 | user_prefixes: that.get('user_prefixes') | |
601 | }); | |
ce13508b D |
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 | ||
72db27e4 | 624 | function onBanlist(event) { |
72db27e4 D |
625 | var channel = this.panels.getByName(event.channel); |
626 | if (!channel) | |
627 | return; | |
628 | ||
629 | channel.set('banlist', event.bans || []); | |
630 | } | |
631 | ||
632 | ||
633 | ||
ce13508b | 634 | function onMode(event) { |
19c15434 D |
635 | var channel, i, prefixes, members, member, find_prefix, |
636 | request_updated_banlist = false; | |
ce13508b D |
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(); | |
ce13508b D |
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 | } | |
19c15434 D |
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; | |
ce13508b D |
706 | } |
707 | ||
697a76c5 | 708 | channel.addMsg('', '== ' + _kiwi.global.i18n.translate('client_models_network_mode').fetch(event.nick, friendlyModeString()), 'action mode', {time: event.time}); |
19c15434 D |
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 | ||
ce13508b D |
714 | } else { |
715 | // This is probably a mode being set on us. | |
716 | if (event.target.toLowerCase() === this.get("nick").toLowerCase()) { | |
247dd7ac | 717 | this.panels.server.addMsg('', '== ' + _kiwi.global.i18n.translate('client_models_network_selfmode').fetch(event.nick, friendlyModeString()), 'action mode'); |
ce13508b D |
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 | ||
e7d65587 | 737 | panel = _kiwi.app.panels().active; |
ce13508b D |
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) { | |
247dd7ac | 741 | panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_channels').fetch(event.chans), 'whois'); |
ce13508b | 742 | } else if (event.irc_server) { |
247dd7ac | 743 | panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_server').fetch(event.irc_server, event.server_info), 'whois'); |
ce13508b D |
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 | ||
247dd7ac | 751 | panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_idle_and_signon').fetch(idle_time, logon_date), 'whois'); |
f701d5ba | 752 | } else if (event.away_reason) { |
247dd7ac | 753 | panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_away').fetch(event.away_reason), 'whois'); |
ce13508b | 754 | } else { |
247dd7ac | 755 | panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_idle').fetch(idle_time), 'whois'); |
ce13508b D |
756 | } |
757 | } | |
758 | ||
5989f3f4 JA |
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 { | |
247dd7ac | 769 | panel.addMsg(event.nick, _kiwi.global.i18n.translate('client_models_network_nickname_notfound').fetch(), 'whois'); |
5989f3f4 JA |
770 | } |
771 | } | |
ce13508b D |
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) { | |
17dfa698 | 780 | member.set('away', !(!event.reason)); |
ce13508b D |
781 | } |
782 | }); | |
783 | } | |
784 | ||
785 | ||
786 | ||
787 | function onListStart(event) { | |
b24da6ba D |
788 | var chanlist = _kiwi.model.Applet.loadOnce('kiwi_chanlist'); |
789 | chanlist.view.show(); | |
ce13508b D |
790 | } |
791 | ||
792 | ||
793 | ||
794 | function onIrcError(event) { | |
795 | var panel, tmp; | |
796 | ||
f8240e98 | 797 | if (event.channel !== undefined && !(panel = this.panels.getByName(event.channel))) { |
ce13508b D |
798 | panel = this.panels.server; |
799 | } | |
800 | ||
801 | switch (event.error) { | |
802 | case 'banned_from_channel': | |
247dd7ac N |
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)); | |
ce13508b D |
805 | break; |
806 | case 'bad_channel_key': | |
247dd7ac N |
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)); | |
ce13508b D |
809 | break; |
810 | case 'invite_only_channel': | |
247dd7ac N |
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)); | |
ce13508b | 813 | break; |
3d753975 D |
814 | case 'user_on_channel': |
815 | panel.addMsg(' ', '== ' + event.nick + ' is already on this channel'); | |
816 | break; | |
ce13508b | 817 | case 'channel_is_full': |
247dd7ac N |
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)); | |
ce13508b D |
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': | |
247dd7ac | 834 | this.panels.server.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_nickname_alreadyinuse').fetch( event.nick), 'status'); |
2e06af20 | 835 | if (this.panels.server !== this.panels.active) { |
247dd7ac | 836 | _kiwi.app.message.text(_kiwi.global.i18n.translate('client_models_network_nickname_alreadyinuse').fetch(event.nick)); |
ce13508b D |
837 | } |
838 | ||
839 | // Only show the nickchange component if the controlbox is open | |
2e06af20 | 840 | if (_kiwi.app.controlbox.$el.css('display') !== 'none') { |
ce13508b D |
841 | (new _kiwi.view.NickChangeBox()).render(); |
842 | } | |
843 | ||
844 | break; | |
845 | ||
846 | case 'password_mismatch': | |
247dd7ac | 847 | this.panels.server.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_network_badpassword').fetch(), 'status'); |
ce13508b D |
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 | } | |
3d753975 D |
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 | ||
3d753975 D |
864 | this.panels.server.addMsg('', '[' + event.command + '] ' + display_params.join(', ', '')); |
865 | } | |
ce13508b D |
866 | } |
867 | ||
eed5ac29 | 868 | )(); |