More work on text themes. Splitting translation and text themes, adding nick/ident...
[KiwiIRC.git] / client / src / models / member.js
1 _kiwi.model.Member = Backbone.Model.extend({
2 sortModes: function (modes) {
3 return modes.sort(function (a, b) {
4 var a_idx, b_idx, i;
5 var user_prefixes = _kiwi.gateway.get('user_prefixes');
6
7 for (i = 0; i < user_prefixes.length; i++) {
8 if (user_prefixes[i].mode === a) {
9 a_idx = i;
10 }
11 }
12 for (i = 0; i < user_prefixes.length; i++) {
13 if (user_prefixes[i].mode === b) {
14 b_idx = i;
15 }
16 }
17 if (a_idx < b_idx) {
18 return -1;
19 } else if (a_idx > b_idx) {
20 return 1;
21 } else {
22 return 0;
23 }
24 });
25 },
26 initialize: function (attributes) {
27 var nick, modes, prefix;
28 nick = this.stripPrefix(this.get("nick"));
29
30 modes = this.get("modes");
31 modes = modes || [];
32 this.sortModes(modes);
33 this.set({"nick": nick, "modes": modes, "prefix": this.getPrefix(modes)}, {silent: true});
34 this.isOp();
35 this.view = new _kiwi.view.Member({"model": this});
36 },
37 addMode: function (mode) {
38 var modes_to_add = mode.split(''),
39 modes, prefix;
40
41 modes = this.get("modes");
42 $.each(modes_to_add, function (index, item) {
43 modes.push(item);
44 });
45
46 modes = this.sortModes(modes);
47 this.set({"prefix": this.getPrefix(modes), "modes": modes});
48 this.isOp();
49
50 this.view.render();
51 },
52 removeMode: function (mode) {
53 var modes_to_remove = mode.split(''),
54 modes, prefix;
55
56 modes = this.get("modes");
57 modes = _.reject(modes, function (m) {
58 return (_.indexOf(modes_to_remove, m) !== -1);
59 });
60
61 this.set({"prefix": this.getPrefix(modes), "modes": modes});
62 this.isOp();
63
64 this.view.render();
65 },
66 getPrefix: function (modes) {
67 var prefix = '';
68 var user_prefixes = _kiwi.gateway.get('user_prefixes');
69
70 if (typeof modes[0] !== 'undefined') {
71 prefix = _.detect(user_prefixes, function (prefix) {
72 return prefix.mode === modes[0];
73 });
74 prefix = (prefix) ? prefix.symbol : '';
75 }
76 return prefix;
77 },
78 stripPrefix: function (nick) {
79 var tmp = nick, i, j, k, nick_char;
80 var user_prefixes = _kiwi.gateway.get('user_prefixes');
81 i = 0;
82
83 nick_character_loop:
84 for (j = 0; j < nick.length; j++) {
85 nick_char = nick.charAt(j);
86 for (k = 0; k < user_prefixes.length; k++) {
87 if (nick_char === user_prefixes[k].symbol) {
88 i++;
89 continue nick_character_loop;
90 }
91 }
92 break;
93 }
94
95 return tmp.substr(i);
96 },
97 displayNick: function (full) {
98 var display = this.get('nick');
99
100 if (full) {
101 if (this.get("ident")) {
102 display += ' [' + this.get("ident") + '@' + this.get("hostname") + ']';
103 }
104 }
105
106 return display;
107 },
108 getMemberMask: function () {
109 // Why to use %N and %H is quite clear here. %J is because %I is already for italic and %U for underlines. Better ideas ?
110 return {'%N': this.get('nick'), '%J': this.get("ident"), '%H': this.get("hostname")};
111 },
112 isOp: function () {
113 var user_prefixes = _kiwi.gateway.get('user_prefixes'),
114 modes = this.get('modes'),
115 o, max_mode;
116 if (modes.length > 0) {
117 o = _.indexOf(user_prefixes, _.find(user_prefixes, function (prefix) {
118 return prefix.mode === 'o';
119 }));
120 max_mode = _.indexOf(user_prefixes, _.find(user_prefixes, function (prefix) {
121 return prefix.mode === modes[0];
122 }));
123 if ((max_mode === -1) || (max_mode > o)) {
124 this.set({"is_op": false}, {silent: true});
125 } else {
126 this.set({"is_op": true}, {silent: true});
127 }
128 } else {
129 this.set({"is_op": false}, {silent: true});
130 }
131 }
132 });