More work on text themes. Splitting translation and text themes, adding nick/ident...
[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('client_models_channel_join', {'%M': member.getMemberMask(), '%T': translateText('client_models_channel_join'), '%C': 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('client_models_channel_quit', {'%M': member.getMemberMask(), '%T': translateText('client_models_channel_quit', [msg]), '%C': 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('client_models_channel_kicked', {'%M': member.getMemberMask(), '%T': translateText('client_models_channel_kicked', [options.kiwi.by, msg]), '%C': name}), 'action kick', {time: options.kiwi.time});
41 }
42 } else {
43 this.addMsg(' ', styleText('client_models_channel_selfkick', {'%T': translateText('client_models_channel_selfkick', [options.kiwi.by, msg]), '%C': name}), 'action kick', {time: options.kiwi.time});
44 }
45 } else if (show_message) {
46 this.addMsg(' ', styleText('client_models_channel_part', {'%M': member.getMemberMask(), '%T': translateText('client_models_channel_part', [msg]), '%C': name}), 'action part', {time: options.kiwi.time});
47
48 }
49 }, this);
50 },
51
52
53 addMsg: function (nick, msg, type, opts) {
54 var message_obj, bs, d,
55 scrollback = (parseInt(_kiwi.global.settings.get('scrollback'), 10) || 250);
56
57 opts = opts || {};
58
59 // Time defaults to now
60 if (typeof opts.time === 'number') {
61 opts.time = new Date(opts.time);
62 } else {
63 opts.time = new Date();
64 }
65
66 // CSS style defaults to empty string
67 if (!opts || typeof opts.style === 'undefined') {
68 opts.style = '';
69 }
70
71 // Run through the plugins
72 message_obj = {"msg": msg, "date": opts.date, "time": opts.time, "nick": nick, "chan": this.get("name"), "type": type, "style": opts.style};
73 //tmp = _kiwi.plugs.run('addmsg', message_obj);
74 if (!message_obj) {
75 return;
76 }
77
78 // The CSS class (action, topic, notice, etc)
79 if (typeof message_obj.type !== "string") {
80 message_obj.type = '';
81 }
82
83 // Make sure we don't have NaN or something
84 if (typeof message_obj.msg !== "string") {
85 message_obj.msg = '';
86 }
87
88 // Update the scrollback
89 bs = this.get("scrollback");
90 if (bs) {
91 bs.push(message_obj);
92
93 // Keep the scrolback limited
94 if (bs.length > scrollback) {
95 bs.splice(scrollback);
96 }
97 this.set({"scrollback": bs}, {silent: true});
98 }
99
100 this.trigger("msg", message_obj);
101 },
102
103
104 clearMessages: function () {
105 this.set({'scrollback': []}, {silent: true});
106 this.addMsg('', 'Window cleared');
107
108 this.view.render();
109 },
110
111
112 setMode: function(mode_string) {
113 this.get('network').gateway.mode(this.get('name'), mode_string);
114 },
115
116 isChannel: function() {
117 return true;
118 }
119 });