1 _kiwi
.model
.Member
= Backbone
.Model
.extend({
2 initialize: function (attributes
) {
3 var nick
, modes
, prefix
;
5 // The nick may have a mode prefix, we don't want this
6 nick
= this.stripPrefix(this.get("nick"));
8 // Make sure we have a mode array, and that it's sorted
9 modes
= this.get("modes");
11 this.sortModes(modes
);
13 this.set({"nick": nick
, "modes": modes
, "prefix": this.getPrefix(modes
)}, {silent
: true});
15 this.updateOpStatus();
17 this.view
= new _kiwi
.view
.Member({"model": this});
22 * Sort modes in order of importance
24 sortModes: function (modes
) {
27 return modes
.sort(function (a
, b
) {
29 var user_prefixes
= that
.get('user_prefixes');
31 for (i
= 0; i
< user_prefixes
.length
; i
++) {
32 if (user_prefixes
[i
].mode
=== a
) {
37 for (i
= 0; i
< user_prefixes
.length
; i
++) {
38 if (user_prefixes
[i
].mode
=== b
) {
45 } else if (a_idx
> b_idx
) {
54 addMode: function (mode
) {
55 var modes_to_add
= mode
.split(''),
58 modes
= this.get("modes");
59 $.each(modes_to_add
, function (index
, item
) {
63 modes
= this.sortModes(modes
);
64 this.set({"prefix": this.getPrefix(modes
), "modes": modes
});
66 this.updateOpStatus();
72 removeMode: function (mode
) {
73 var modes_to_remove
= mode
.split(''),
76 modes
= this.get("modes");
77 modes
= _
.reject(modes
, function (m
) {
78 return (_
.indexOf(modes_to_remove
, m
) !== -1);
81 this.set({"prefix": this.getPrefix(modes
), "modes": modes
});
83 this.updateOpStatus();
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.
94 getPrefix: function (modes
) {
96 var user_prefixes
= this.get('user_prefixes');
98 if (typeof modes
[0] !== 'undefined') {
99 prefix
= _
.detect(user_prefixes
, function (prefix
) {
100 return prefix
.mode
=== modes
[0];
103 prefix
= (prefix
) ? prefix
.symbol
: '';
111 * Remove any recognised prefix from a nick
113 stripPrefix: function (nick
) {
114 var tmp
= nick
, i
, j
, k
, nick_char
;
115 var user_prefixes
= this.get('user_prefixes');
120 for (j
= 0; j
< nick
.length
; j
++) {
121 nick_char
= nick
.charAt(j
);
123 for (k
= 0; k
< user_prefixes
.length
; k
++) {
124 if (nick_char
=== user_prefixes
[k
].symbol
) {
126 continue nick_character_loop
;
133 return tmp
.substr(i
);
138 * Format this nick into readable format (eg. nick [ident@hostname])
140 displayNick: function (full
) {
141 var display
= this.get('nick');
144 if (this.get("ident")) {
145 display
+= ' [' + this.get("ident") + '@' + this.get("hostname") + ']';
154 * With the modes set on the user, make note if we have some sort of op status
156 updateOpStatus: function () {
157 var user_prefixes
= this.get('user_prefixes'),
158 modes
= this.get('modes'),
161 if (modes
.length
> 0) {
162 o
= _
.indexOf(user_prefixes
, _
.find(user_prefixes
, function (prefix
) {
163 return prefix
.mode
=== 'o';
166 max_mode
= _
.indexOf(user_prefixes
, _
.find(user_prefixes
, function (prefix
) {
167 return prefix
.mode
=== modes
[0];
170 if ((max_mode
=== -1) || (max_mode
> o
)) {
171 this.set({"is_op": false}, {silent
: true});
173 this.set({"is_op": true}, {silent
: true});
177 this.set({"is_op": false}, {silent
: true});