Commit | Line | Data |
---|---|---|
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 | }); |