Merge branch 'development' of https://github.com/crtaylor123/KiwiIRC into crtaylor123...
[KiwiIRC.git] / client / src / models / channel.js
1 // TODO: Channel modes
2 // TODO: Listen to gateway events for anythign related to this channel
3 _kiwi.model.Channel = _kiwi.model.Panel.extend({
4 initialize: function (attributes) {
5 var name = this.get("name") || "",
6 members;
7
8 this.set({
9 "members": new _kiwi.model.MemberList(),
10 "name": name,
11 "scrollback": [],
12 "topic": ""
13 }, {"silent": true});
14
15 this.view = new _kiwi.view.Channel({"model": this, "name": name});
16
17 members = this.get("members");
18 members.channel = this;
19 members.bind("add", function (member, members, options) {
20 var show_message = _kiwi.global.settings.get('show_joins_parts');
21 if (show_message === false) {
22 return;
23 }
24
25 this.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_channel_join').fetch(member.displayNick(true)), 'action join', {time: options.kiwi.time});
26 }, this);
27
28 members.bind("remove", function (member, members, options) {
29 var show_message = _kiwi.global.settings.get('show_joins_parts');
30 var msg = (options.kiwi.message) ? '(' + options.kiwi.message + ')' : '';
31
32 if (options.kiwi.type === 'quit' && show_message) {
33 this.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_channel_quit').fetch(member.displayNick(true), msg), 'action quit', {time: options.kiwi.time});
34
35 } else if (options.kiwi.type === 'kick') {
36
37 if (!options.kiwi.current_user_kicked) {
38 //If user kicked someone, show the message regardless of settings.
39 if (show_message || options.kiwi.current_user_initiated) {
40 this.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_channel_kicked').fetch(member.displayNick(true), options.kiwi.by, msg), 'action kick', {time: options.kiwi.time});
41 }
42 } else {
43 this.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_channel_selfkick').fetch(options.kiwi.by, msg), 'action kick', {time: options.kiwi.time});
44 }
45 } else if (show_message) {
46 this.addMsg(' ', '== ' + _kiwi.global.i18n.translate('client_models_channel_part').fetch(member.displayNick(true), msg), 'action part', {time: options.kiwi.time});
47 }
48 }, this);
49 },
50
51
52 addMsg: function (nick, msg, type, opts) {
53 var message_obj, bs, d,
54 scrollback = (parseInt(_kiwi.global.settings.get('scrollback'), 10) || 250);
55
56 opts = opts || {};
57
58 // Time defaults to now
59 if (typeof opts.time === 'number') {
60 opts.time = new Date(opts.time);
61 } else {
62 opts.time = new Date();
63 }
64
65 // CSS style defaults to empty string
66 if (!opts || typeof opts.style === 'undefined') {
67 opts.style = '';
68 }
69
70 // Run through the plugins
71 message_obj = {"msg": msg, "date": opts.date, "time": opts.time, "nick": nick, "chan": this.get("name"), "type": type, "style": opts.style};
72 //tmp = _kiwi.plugs.run('addmsg', message_obj);
73 if (!message_obj) {
74 return;
75 }
76
77 // The CSS class (action, topic, notice, etc)
78 if (typeof message_obj.type !== "string") {
79 message_obj.type = '';
80 }
81
82 // Make sure we don't have NaN or something
83 if (typeof message_obj.msg !== "string") {
84 message_obj.msg = '';
85 }
86
87 // Update the scrollback
88 bs = this.get("scrollback");
89 if (bs) {
90 bs.push(message_obj);
91
92 // Keep the scrolback limited
93 if (bs.length > scrollback) {
94 bs.splice(scrollback);
95 }
96 this.set({"scrollback": bs}, {silent: true});
97 }
98
99 this.trigger("msg", message_obj);
100 },
101
102
103 clearMessages: function () {
104 this.set({'scrollback': []}, {silent: true});
105 this.addMsg('', 'Window cleared');
106
107 this.view.render();
108 },
109
110
111 setMode: function(mode_string) {
112 this.get('network').gateway.mode(this.get('name'), mode_string);
113 },
114
115 isChannel: function() {
116 return true;
117 }
118 });