Merge branch 'ResidentBiscuit-rb_ui_work' into development
[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(' ', styleText('channel_join', {member: member.getMaskParts(), text: translateText('client_models_channel_join'), channel: name}), '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(' ', styleText('channel_quit', {member: member.getMaskParts(), text: translateText('client_models_channel_quit', [msg]), channel: name}), '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(' ', styleText('channel_kicked', {member: member.getMaskParts(), text: translateText('client_models_channel_kicked', [options.kiwi.by, msg]), channel: name}), 'action kick', {time: options.kiwi.time});
41 }
42 } else {
43 this.addMsg(' ', styleText('channel_selfkick', {text: translateText('client_models_channel_selfkick', [options.kiwi.by, msg]), channel: name}), 'action kick', {time: options.kiwi.time});
44 }
45 } else if (show_message) {
46 this.addMsg(' ', styleText('channel_part', {member: member.getMaskParts(), text: translateText('client_models_channel_part', [msg]), channel: name}), 'action part', {time: options.kiwi.time});
47
48 }
49 }, this);
50
51 _kiwi.global.events.emit('panel:created', {panel: this});
52 },
53
54
55 addMsg: function (nick, msg, type, opts) {
56 var message_obj, bs, d, members, member,
57 scrollback = (parseInt(_kiwi.global.settings.get('scrollback'), 10) || 250);
58
59 opts = opts || {};
60
61 // Time defaults to now
62 if (typeof opts.time === 'number') {
63 opts.time = new Date(opts.time);
64 } else {
65 opts.time = new Date();
66 }
67
68 // CSS style defaults to empty string
69 if (!opts || typeof opts.style === 'undefined') {
70 opts.style = '';
71 }
72
73 // Create a message object
74 message_obj = {"msg": msg, "date": opts.date, "time": opts.time, "nick": nick, "chan": this.get("name"), "type": type, "style": opts.style};
75
76 // If this user has one, get its prefix
77 members = this.get('members');
78 if (members) {
79 member = members.getByNick(message_obj.nick);
80 if (member) {
81 message_obj.nick_prefix = member.get('prefix');
82 }
83 }
84
85 // The CSS class (action, topic, notice, etc)
86 if (typeof message_obj.type !== "string") {
87 message_obj.type = '';
88 }
89
90 // Make sure we don't have NaN or something
91 if (typeof message_obj.msg !== "string") {
92 message_obj.msg = '';
93 }
94
95 // Update the scrollback
96 bs = this.get("scrollback");
97 if (bs) {
98 bs.push(message_obj);
99
100 // Keep the scrolback limited
101 if (bs.length > scrollback) {
102 bs = _.last(bs, scrollback);
103 }
104 this.set({"scrollback": bs}, {silent: true});
105 }
106
107 this.trigger("msg", message_obj);
108 },
109
110
111 clearMessages: function () {
112 this.set({'scrollback': []}, {silent: true});
113 this.addMsg('', 'Window cleared');
114
115 this.view.render();
116 },
117
118
119 setMode: function(mode_string) {
120 this.get('network').gateway.mode(this.get('name'), mode_string);
121 },
122
123 isChannel: function() {
124 return true;
125 }
126 });