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