Merge branch 'development' of https://github.com/crtaylor123/KiwiIRC into crtaylor123...
[KiwiIRC.git] / client / src / models / member.js
1 _kiwi.model.Member = Backbone.Model.extend({
2 initialize: function (attributes) {
3 var nick, modes, prefix;
4
5 // The nick may have a mode prefix, we don't want this
6 nick = this.stripPrefix(this.get("nick"));
7
8 // Make sure we have a mode array, and that it's sorted
9 modes = this.get("modes");
10 modes = modes || [];
11 this.sortModes(modes);
12
13 this.set({"nick": nick, "modes": modes, "prefix": this.getPrefix(modes)}, {silent: true});
14
15 this.updateOpStatus();
16
17 this.view = new _kiwi.view.Member({"model": this});
18 },
19
20
21 /**
22 * Sort modes in order of importance
23 */
24 sortModes: function (modes) {
25 var that = this;
26
27 return modes.sort(function (a, b) {
28 var a_idx, b_idx, i;
29 var user_prefixes = that.get('user_prefixes');
30
31 for (i = 0; i < user_prefixes.length; i++) {
32 if (user_prefixes[i].mode === a) {
33 a_idx = i;
34 }
35 }
36
37 for (i = 0; i < user_prefixes.length; i++) {
38 if (user_prefixes[i].mode === b) {
39 b_idx = i;
40 }
41 }
42
43 if (a_idx < b_idx) {
44 return -1;
45 } else if (a_idx > b_idx) {
46 return 1;
47 } else {
48 return 0;
49 }
50 });
51 },
52
53
54 addMode: function (mode) {
55 var modes_to_add = mode.split(''),
56 modes, prefix;
57
58 modes = this.get("modes");
59 $.each(modes_to_add, function (index, item) {
60 modes.push(item);
61 });
62
63 modes = this.sortModes(modes);
64 this.set({"prefix": this.getPrefix(modes), "modes": modes});
65
66 this.updateOpStatus();
67
68 this.view.render();
69 },
70
71
72 removeMode: function (mode) {
73 var modes_to_remove = mode.split(''),
74 modes, prefix;
75
76 modes = this.get("modes");
77 modes = _.reject(modes, function (m) {
78 return (_.indexOf(modes_to_remove, m) !== -1);
79 });
80
81 this.set({"prefix": this.getPrefix(modes), "modes": modes});
82
83 this.updateOpStatus();
84
85 this.view.render();
86 },
87
88
89 /**
90 * Figure out a valid prefix given modes.
91 * If a user is an op but also has voice, the prefix
92 * should be the op as it is more important.
93 */
94 getPrefix: function (modes) {
95 var prefix = '';
96 var user_prefixes = this.get('user_prefixes');
97
98 if (typeof modes[0] !== 'undefined') {
99 prefix = _.detect(user_prefixes, function (prefix) {
100 return prefix.mode === modes[0];
101 });
102
103 prefix = (prefix) ? prefix.symbol : '';
104 }
105
106 return prefix;
107 },
108
109
110 /**
111 * Remove any recognised prefix from a nick
112 */
113 stripPrefix: function (nick) {
114 var tmp = nick, i, j, k, nick_char;
115 var user_prefixes = this.get('user_prefixes');
116
117 i = 0;
118
119 nick_character_loop:
120 for (j = 0; j < nick.length; j++) {
121 nick_char = nick.charAt(j);
122
123 for (k = 0; k < user_prefixes.length; k++) {
124 if (nick_char === user_prefixes[k].symbol) {
125 i++;
126 continue nick_character_loop;
127 }
128 }
129
130 break;
131 }
132
133 return tmp.substr(i);
134 },
135
136
137 /**
138 * Format this nick into readable format (eg. nick [ident@hostname])
139 */
140 displayNick: function (full) {
141 var display = this.get('nick');
142
143 if (full) {
144 if (this.get("ident")) {
145 display += ' [' + this.get("ident") + '@' + this.get("hostname") + ']';
146 }
147 }
148
149 return display;
150 },
151
152
153 /**
154 * With the modes set on the user, make note if we have some sort of op status
155 */
156 updateOpStatus: function () {
157 var user_prefixes = this.get('user_prefixes'),
158 modes = this.get('modes'),
159 o, max_mode;
160
161 if (modes.length > 0) {
162 o = _.indexOf(user_prefixes, _.find(user_prefixes, function (prefix) {
163 return prefix.mode === 'o';
164 }));
165
166 max_mode = _.indexOf(user_prefixes, _.find(user_prefixes, function (prefix) {
167 return prefix.mode === modes[0];
168 }));
169
170 if ((max_mode === -1) || (max_mode > o)) {
171 this.set({"is_op": false}, {silent: true});
172 } else {
173 this.set({"is_op": true}, {silent: true});
174 }
175
176 } else {
177 this.set({"is_op": false}, {silent: true});
178 }
179 }
180 });