Chris@76
|
1 <?php
|
Chris@76
|
2
|
Chris@76
|
3 /**
|
Chris@76
|
4 * Simple Machines Forum (SMF)
|
Chris@76
|
5 *
|
Chris@76
|
6 * @package SMF
|
Chris@76
|
7 * @author Simple Machines http://www.simplemachines.org
|
Chris@76
|
8 * @copyright 2011 Simple Machines
|
Chris@76
|
9 * @license http://www.simplemachines.org/about/smf/license.php BSD
|
Chris@76
|
10 *
|
Chris@76
|
11 * @version 2.0
|
Chris@76
|
12 */
|
Chris@76
|
13
|
Chris@76
|
14 if (!defined('SMF'))
|
Chris@76
|
15 die('Hacking attempt...');
|
Chris@76
|
16
|
Chris@76
|
17 /* This file contains functions regarding manipulation of and information
|
Chris@76
|
18 about membergroups.
|
Chris@76
|
19
|
Chris@76
|
20 bool deleteMembergroups(array groups)
|
Chris@76
|
21 - delete one of more membergroups.
|
Chris@76
|
22 - requires the manage_membergroups permission.
|
Chris@76
|
23 - returns true on success or false on failure.
|
Chris@76
|
24 - has protection against deletion of protected membergroups.
|
Chris@76
|
25 - deletes the permissions linked to the membergroup.
|
Chris@76
|
26 - takes members out of the deleted membergroups.
|
Chris@76
|
27
|
Chris@76
|
28 bool removeMembersFromGroups(array members, array groups = null)
|
Chris@76
|
29 - remove one or more members from one or more membergroups.
|
Chris@76
|
30 - requires the manage_membergroups permission.
|
Chris@76
|
31 - returns true on success or false on failure.
|
Chris@76
|
32 - if groups is null, the specified members are stripped from all their
|
Chris@76
|
33 membergroups.
|
Chris@76
|
34 - function includes a protection against removing from implicit groups.
|
Chris@76
|
35 - non-admins are not able to remove members from the admin group.
|
Chris@76
|
36
|
Chris@76
|
37 bool addMembersToGroup(array members, group, type = 'auto')
|
Chris@76
|
38 - add one or more members to a specified group.
|
Chris@76
|
39 - requires the manage_membergroups permission.
|
Chris@76
|
40 - returns true on success or false on failure.
|
Chris@76
|
41 - the type parameter specifies whether the group is added as primary or
|
Chris@76
|
42 as additional group.
|
Chris@76
|
43 - function has protection against adding members to implicit groups.
|
Chris@76
|
44 - non-admins are not able to add members to the admin group.
|
Chris@76
|
45
|
Chris@76
|
46 bool listMembergroupMembers_Href(&array members, int membergroup, int limit = null)
|
Chris@76
|
47 - get a list of all members that are part of a membergroup.
|
Chris@76
|
48 - if limit is set to null, all members are returned.
|
Chris@76
|
49 - returns a list of href-links in $members.
|
Chris@76
|
50 - returns true if there are more than limit members.
|
Chris@76
|
51
|
Chris@76
|
52 */
|
Chris@76
|
53
|
Chris@76
|
54 // Delete one or more membergroups.
|
Chris@76
|
55 function deleteMembergroups($groups)
|
Chris@76
|
56 {
|
Chris@76
|
57 global $sourcedir, $smcFunc, $modSettings;
|
Chris@76
|
58
|
Chris@76
|
59 // Make sure it's an array.
|
Chris@76
|
60 if (!is_array($groups))
|
Chris@76
|
61 $groups = array((int) $groups);
|
Chris@76
|
62 else
|
Chris@76
|
63 {
|
Chris@76
|
64 $groups = array_unique($groups);
|
Chris@76
|
65
|
Chris@76
|
66 // Make sure all groups are integer.
|
Chris@76
|
67 foreach ($groups as $key => $value)
|
Chris@76
|
68 $groups[$key] = (int) $value;
|
Chris@76
|
69 }
|
Chris@76
|
70
|
Chris@76
|
71 // Some groups are protected (guests, administrators, moderators, newbies).
|
Chris@76
|
72 $protected_groups = array(-1, 0, 1, 3, 4);
|
Chris@76
|
73
|
Chris@76
|
74 // There maybe some others as well.
|
Chris@76
|
75 if (!allowedTo('admin_forum'))
|
Chris@76
|
76 {
|
Chris@76
|
77 $request = $smcFunc['db_query']('', '
|
Chris@76
|
78 SELECT id_group
|
Chris@76
|
79 FROM {db_prefix}membergroups
|
Chris@76
|
80 WHERE group_type = {int:is_protected}',
|
Chris@76
|
81 array(
|
Chris@76
|
82 'is_protected' => 1,
|
Chris@76
|
83 )
|
Chris@76
|
84 );
|
Chris@76
|
85 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
86 $protected_groups[] = $row['id_group'];
|
Chris@76
|
87 $smcFunc['db_free_result']($request);
|
Chris@76
|
88 }
|
Chris@76
|
89
|
Chris@76
|
90 // Make sure they don't delete protected groups!
|
Chris@76
|
91 $groups = array_diff($groups, array_unique($protected_groups));
|
Chris@76
|
92 if (empty($groups))
|
Chris@76
|
93 return false;
|
Chris@76
|
94
|
Chris@76
|
95 // Log the deletion.
|
Chris@76
|
96 $request = $smcFunc['db_query']('', '
|
Chris@76
|
97 SELECT group_name
|
Chris@76
|
98 FROM {db_prefix}membergroups
|
Chris@76
|
99 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
100 array(
|
Chris@76
|
101 'group_list' => $groups,
|
Chris@76
|
102 )
|
Chris@76
|
103 );
|
Chris@76
|
104 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
105 logAction('delete_group', array('group' => $row['group_name']), 'admin');
|
Chris@76
|
106 $smcFunc['db_free_result']($request);
|
Chris@76
|
107
|
Chris@76
|
108 // Remove the membergroups themselves.
|
Chris@76
|
109 $smcFunc['db_query']('', '
|
Chris@76
|
110 DELETE FROM {db_prefix}membergroups
|
Chris@76
|
111 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
112 array(
|
Chris@76
|
113 'group_list' => $groups,
|
Chris@76
|
114 )
|
Chris@76
|
115 );
|
Chris@76
|
116
|
Chris@76
|
117 // Remove the permissions of the membergroups.
|
Chris@76
|
118 $smcFunc['db_query']('', '
|
Chris@76
|
119 DELETE FROM {db_prefix}permissions
|
Chris@76
|
120 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
121 array(
|
Chris@76
|
122 'group_list' => $groups,
|
Chris@76
|
123 )
|
Chris@76
|
124 );
|
Chris@76
|
125 $smcFunc['db_query']('', '
|
Chris@76
|
126 DELETE FROM {db_prefix}board_permissions
|
Chris@76
|
127 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
128 array(
|
Chris@76
|
129 'group_list' => $groups,
|
Chris@76
|
130 )
|
Chris@76
|
131 );
|
Chris@76
|
132 $smcFunc['db_query']('', '
|
Chris@76
|
133 DELETE FROM {db_prefix}group_moderators
|
Chris@76
|
134 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
135 array(
|
Chris@76
|
136 'group_list' => $groups,
|
Chris@76
|
137 )
|
Chris@76
|
138 );
|
Chris@76
|
139
|
Chris@76
|
140 // Delete any outstanding requests.
|
Chris@76
|
141 $smcFunc['db_query']('', '
|
Chris@76
|
142 DELETE FROM {db_prefix}log_group_requests
|
Chris@76
|
143 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
144 array(
|
Chris@76
|
145 'group_list' => $groups,
|
Chris@76
|
146 )
|
Chris@76
|
147 );
|
Chris@76
|
148
|
Chris@76
|
149 // Update the primary groups of members.
|
Chris@76
|
150 $smcFunc['db_query']('', '
|
Chris@76
|
151 UPDATE {db_prefix}members
|
Chris@76
|
152 SET id_group = {int:regular_group}
|
Chris@76
|
153 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
154 array(
|
Chris@76
|
155 'group_list' => $groups,
|
Chris@76
|
156 'regular_group' => 0,
|
Chris@76
|
157 )
|
Chris@76
|
158 );
|
Chris@76
|
159
|
Chris@76
|
160 // Update any inherited groups (Lose inheritance).
|
Chris@76
|
161 $smcFunc['db_query']('', '
|
Chris@76
|
162 UPDATE {db_prefix}membergroups
|
Chris@76
|
163 SET id_parent = {int:uninherited}
|
Chris@76
|
164 WHERE id_parent IN ({array_int:group_list})',
|
Chris@76
|
165 array(
|
Chris@76
|
166 'group_list' => $groups,
|
Chris@76
|
167 'uninherited' => -2,
|
Chris@76
|
168 )
|
Chris@76
|
169 );
|
Chris@76
|
170
|
Chris@76
|
171 // Update the additional groups of members.
|
Chris@76
|
172 $request = $smcFunc['db_query']('', '
|
Chris@76
|
173 SELECT id_member, additional_groups
|
Chris@76
|
174 FROM {db_prefix}members
|
Chris@76
|
175 WHERE FIND_IN_SET({raw:additional_groups_explode}, additional_groups) != 0',
|
Chris@76
|
176 array(
|
Chris@76
|
177 'additional_groups_explode' => implode(', additional_groups) != 0 OR FIND_IN_SET(', $groups),
|
Chris@76
|
178 )
|
Chris@76
|
179 );
|
Chris@76
|
180 $updates = array();
|
Chris@76
|
181 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
182 $updates[$row['additional_groups']][] = $row['id_member'];
|
Chris@76
|
183 $smcFunc['db_free_result']($request);
|
Chris@76
|
184
|
Chris@76
|
185 foreach ($updates as $additional_groups => $memberArray)
|
Chris@76
|
186 updateMemberData($memberArray, array('additional_groups' => implode(',', array_diff(explode(',', $additional_groups), $groups))));
|
Chris@76
|
187
|
Chris@76
|
188 // No boards can provide access to these membergroups anymore.
|
Chris@76
|
189 $request = $smcFunc['db_query']('', '
|
Chris@76
|
190 SELECT id_board, member_groups
|
Chris@76
|
191 FROM {db_prefix}boards
|
Chris@76
|
192 WHERE FIND_IN_SET({raw:member_groups_explode}, member_groups) != 0',
|
Chris@76
|
193 array(
|
Chris@76
|
194 'member_groups_explode' => implode(', member_groups) != 0 OR FIND_IN_SET(', $groups),
|
Chris@76
|
195 )
|
Chris@76
|
196 );
|
Chris@76
|
197 $updates = array();
|
Chris@76
|
198 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
199 $updates[$row['member_groups']][] = $row['id_board'];
|
Chris@76
|
200 $smcFunc['db_free_result']($request);
|
Chris@76
|
201
|
Chris@76
|
202 foreach ($updates as $member_groups => $boardArray)
|
Chris@76
|
203 $smcFunc['db_query']('', '
|
Chris@76
|
204 UPDATE {db_prefix}boards
|
Chris@76
|
205 SET member_groups = {string:member_groups}
|
Chris@76
|
206 WHERE id_board IN ({array_int:board_lists})',
|
Chris@76
|
207 array(
|
Chris@76
|
208 'board_lists' => $boardArray,
|
Chris@76
|
209 'member_groups' => implode(',', array_diff(explode(',', $member_groups), $groups)),
|
Chris@76
|
210 )
|
Chris@76
|
211 );
|
Chris@76
|
212
|
Chris@76
|
213 // Recalculate the post groups, as they likely changed.
|
Chris@76
|
214 updateStats('postgroups');
|
Chris@76
|
215
|
Chris@76
|
216 // Make a note of the fact that the cache may be wrong.
|
Chris@76
|
217 $settings_update = array('settings_updated' => time());
|
Chris@76
|
218 // Have we deleted the spider group?
|
Chris@76
|
219 if (isset($modSettings['spider_group']) && in_array($modSettings['spider_group'], $groups))
|
Chris@76
|
220 $settings_update['spider_group'] = 0;
|
Chris@76
|
221
|
Chris@76
|
222 updateSettings($settings_update);
|
Chris@76
|
223
|
Chris@76
|
224 // It was a success.
|
Chris@76
|
225 return true;
|
Chris@76
|
226 }
|
Chris@76
|
227
|
Chris@76
|
228 // Remove one or more members from one or more membergroups.
|
Chris@76
|
229 function removeMembersFromGroups($members, $groups = null, $permissionCheckDone = false)
|
Chris@76
|
230 {
|
Chris@76
|
231 global $smcFunc, $user_info, $modSettings;
|
Chris@76
|
232
|
Chris@76
|
233 // You're getting nowhere without this permission, unless of course you are the group's moderator.
|
Chris@76
|
234 if (!$permissionCheckDone)
|
Chris@76
|
235 isAllowedTo('manage_membergroups');
|
Chris@76
|
236
|
Chris@76
|
237 // Assume something will happen.
|
Chris@76
|
238 updateSettings(array('settings_updated' => time()));
|
Chris@76
|
239
|
Chris@76
|
240 // Cleaning the input.
|
Chris@76
|
241 if (!is_array($members))
|
Chris@76
|
242 $members = array((int) $members);
|
Chris@76
|
243 else
|
Chris@76
|
244 {
|
Chris@76
|
245 $members = array_unique($members);
|
Chris@76
|
246
|
Chris@76
|
247 // Cast the members to integer.
|
Chris@76
|
248 foreach ($members as $key => $value)
|
Chris@76
|
249 $members[$key] = (int) $value;
|
Chris@76
|
250 }
|
Chris@76
|
251
|
Chris@76
|
252 // Before we get started, let's check we won't leave the admin group empty!
|
Chris@76
|
253 if ($groups === null || $groups == 1 || (is_array($groups) && in_array(1, $groups)))
|
Chris@76
|
254 {
|
Chris@76
|
255 $admins = array();
|
Chris@76
|
256 listMembergroupMembers_Href($admins, 1);
|
Chris@76
|
257
|
Chris@76
|
258 // Remove any admins if there are too many.
|
Chris@76
|
259 $non_changing_admins = array_diff(array_keys($admins), $members);
|
Chris@76
|
260
|
Chris@76
|
261 if (empty($non_changing_admins))
|
Chris@76
|
262 $members = array_diff($members, array_keys($admins));
|
Chris@76
|
263 }
|
Chris@76
|
264
|
Chris@76
|
265 // Just in case.
|
Chris@76
|
266 if (empty($members))
|
Chris@76
|
267 return false;
|
Chris@76
|
268 elseif ($groups === null)
|
Chris@76
|
269 {
|
Chris@76
|
270 // Wanna remove all groups from these members? That's easy.
|
Chris@76
|
271 $smcFunc['db_query']('', '
|
Chris@76
|
272 UPDATE {db_prefix}members
|
Chris@76
|
273 SET
|
Chris@76
|
274 id_group = {int:regular_member},
|
Chris@76
|
275 additional_groups = {string:blank_string}
|
Chris@76
|
276 WHERE id_member IN ({array_int:member_list})' . (allowedTo('admin_forum') ? '' : '
|
Chris@76
|
277 AND id_group != {int:admin_group}
|
Chris@76
|
278 AND FIND_IN_SET({int:admin_group}, additional_groups) = 0'),
|
Chris@76
|
279 array(
|
Chris@76
|
280 'member_list' => $members,
|
Chris@76
|
281 'regular_member' => 0,
|
Chris@76
|
282 'admin_group' => 1,
|
Chris@76
|
283 'blank_string' => '',
|
Chris@76
|
284 )
|
Chris@76
|
285 );
|
Chris@76
|
286
|
Chris@76
|
287 updateStats('postgroups', $members);
|
Chris@76
|
288
|
Chris@76
|
289 // Log what just happened.
|
Chris@76
|
290 foreach ($members as $member)
|
Chris@76
|
291 logAction('removed_all_groups', array('member' => $member), 'admin');
|
Chris@76
|
292
|
Chris@76
|
293 return true;
|
Chris@76
|
294 }
|
Chris@76
|
295 elseif (!is_array($groups))
|
Chris@76
|
296 $groups = array((int) $groups);
|
Chris@76
|
297 else
|
Chris@76
|
298 {
|
Chris@76
|
299 $groups = array_unique($groups);
|
Chris@76
|
300
|
Chris@76
|
301 // Make sure all groups are integer.
|
Chris@76
|
302 foreach ($groups as $key => $value)
|
Chris@76
|
303 $groups[$key] = (int) $value;
|
Chris@76
|
304 }
|
Chris@76
|
305
|
Chris@76
|
306 // Fetch a list of groups members cannot be assigned to explicitely, and the group names of the ones we want.
|
Chris@76
|
307 $implicitGroups = array(-1, 0, 3);
|
Chris@76
|
308 $request = $smcFunc['db_query']('', '
|
Chris@76
|
309 SELECT id_group, group_name, min_posts
|
Chris@76
|
310 FROM {db_prefix}membergroups
|
Chris@76
|
311 WHERE id_group IN ({array_int:group_list})',
|
Chris@76
|
312 array(
|
Chris@76
|
313 'group_list' => $groups,
|
Chris@76
|
314 )
|
Chris@76
|
315 );
|
Chris@76
|
316 $group_names = array();
|
Chris@76
|
317 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
318 {
|
Chris@76
|
319 if ($row['min_posts'] != -1)
|
Chris@76
|
320 $implicitGroups[] = $row['id_group'];
|
Chris@76
|
321 else
|
Chris@76
|
322 $group_names[$row['id_group']] = $row['group_name'];
|
Chris@76
|
323 }
|
Chris@76
|
324 $smcFunc['db_free_result']($request);
|
Chris@76
|
325
|
Chris@76
|
326 // Now get rid of those groups.
|
Chris@76
|
327 $groups = array_diff($groups, $implicitGroups);
|
Chris@76
|
328
|
Chris@76
|
329 // Don't forget the protected groups.
|
Chris@76
|
330 if (!allowedTo('admin_forum'))
|
Chris@76
|
331 {
|
Chris@76
|
332 $request = $smcFunc['db_query']('', '
|
Chris@76
|
333 SELECT id_group
|
Chris@76
|
334 FROM {db_prefix}membergroups
|
Chris@76
|
335 WHERE group_type = {int:is_protected}',
|
Chris@76
|
336 array(
|
Chris@76
|
337 'is_protected' => 1,
|
Chris@76
|
338 )
|
Chris@76
|
339 );
|
Chris@76
|
340 $protected_groups = array(1);
|
Chris@76
|
341 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
342 $protected_groups[] = $row['id_group'];
|
Chris@76
|
343 $smcFunc['db_free_result']($request);
|
Chris@76
|
344
|
Chris@76
|
345 // If you're not an admin yourself, you can't touch protected groups!
|
Chris@76
|
346 $groups = array_diff($groups, array_unique($protected_groups));
|
Chris@76
|
347 }
|
Chris@76
|
348
|
Chris@76
|
349 // Only continue if there are still groups and members left.
|
Chris@76
|
350 if (empty($groups) || empty($members))
|
Chris@76
|
351 return false;
|
Chris@76
|
352
|
Chris@76
|
353 // First, reset those who have this as their primary group - this is the easy one.
|
Chris@76
|
354 $log_inserts = array();
|
Chris@76
|
355 $request = $smcFunc['db_query']('', '
|
Chris@76
|
356 SELECT id_member, id_group
|
Chris@76
|
357 FROM {db_prefix}members AS members
|
Chris@76
|
358 WHERE id_group IN ({array_int:group_list})
|
Chris@76
|
359 AND id_member IN ({array_int:member_list})',
|
Chris@76
|
360 array(
|
Chris@76
|
361 'group_list' => $groups,
|
Chris@76
|
362 'member_list' => $members,
|
Chris@76
|
363 )
|
Chris@76
|
364 );
|
Chris@76
|
365 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
366 $log_inserts[] = array(
|
Chris@76
|
367 time(), 3, $user_info['id'], $user_info['ip'], 'removed_from_group',
|
Chris@76
|
368 0, 0, 0, serialize(array('group' => $group_names[$row['id_group']], 'member' => $row['id_member'])),
|
Chris@76
|
369 );
|
Chris@76
|
370 $smcFunc['db_free_result']($request);
|
Chris@76
|
371
|
Chris@76
|
372 $smcFunc['db_query']('', '
|
Chris@76
|
373 UPDATE {db_prefix}members
|
Chris@76
|
374 SET id_group = {int:regular_member}
|
Chris@76
|
375 WHERE id_group IN ({array_int:group_list})
|
Chris@76
|
376 AND id_member IN ({array_int:member_list})',
|
Chris@76
|
377 array(
|
Chris@76
|
378 'group_list' => $groups,
|
Chris@76
|
379 'member_list' => $members,
|
Chris@76
|
380 'regular_member' => 0,
|
Chris@76
|
381 )
|
Chris@76
|
382 );
|
Chris@76
|
383
|
Chris@76
|
384 // Those who have it as part of their additional group must be updated the long way... sadly.
|
Chris@76
|
385 $request = $smcFunc['db_query']('', '
|
Chris@76
|
386 SELECT id_member, additional_groups
|
Chris@76
|
387 FROM {db_prefix}members
|
Chris@76
|
388 WHERE (FIND_IN_SET({raw:additional_groups_implode}, additional_groups) != 0)
|
Chris@76
|
389 AND id_member IN ({array_int:member_list})
|
Chris@76
|
390 LIMIT ' . count($members),
|
Chris@76
|
391 array(
|
Chris@76
|
392 'member_list' => $members,
|
Chris@76
|
393 'additional_groups_implode' => implode(', additional_groups) != 0 OR FIND_IN_SET(', $groups),
|
Chris@76
|
394 )
|
Chris@76
|
395 );
|
Chris@76
|
396 $updates = array();
|
Chris@76
|
397 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
398 {
|
Chris@76
|
399 // What log entries must we make for this one, eh?
|
Chris@76
|
400 foreach (explode(',', $row['additional_groups']) as $group)
|
Chris@76
|
401 if (in_array($group, $groups))
|
Chris@76
|
402 $log_inserts[] = array(
|
Chris@76
|
403 time(), 3, $user_info['id'], $user_info['ip'], 'removed_from_group',
|
Chris@76
|
404 0, 0, 0, serialize(array('group' => $group_names[$group], 'member' => $row['id_member'])),
|
Chris@76
|
405 );
|
Chris@76
|
406
|
Chris@76
|
407 $updates[$row['additional_groups']][] = $row['id_member'];
|
Chris@76
|
408 }
|
Chris@76
|
409 $smcFunc['db_free_result']($request);
|
Chris@76
|
410
|
Chris@76
|
411 foreach ($updates as $additional_groups => $memberArray)
|
Chris@76
|
412 $smcFunc['db_query']('', '
|
Chris@76
|
413 UPDATE {db_prefix}members
|
Chris@76
|
414 SET additional_groups = {string:additional_groups}
|
Chris@76
|
415 WHERE id_member IN ({array_int:member_list})',
|
Chris@76
|
416 array(
|
Chris@76
|
417 'member_list' => $memberArray,
|
Chris@76
|
418 'additional_groups' => implode(',', array_diff(explode(',', $additional_groups), $groups)),
|
Chris@76
|
419 )
|
Chris@76
|
420 );
|
Chris@76
|
421
|
Chris@76
|
422 // Their post groups may have changed now...
|
Chris@76
|
423 updateStats('postgroups', $members);
|
Chris@76
|
424
|
Chris@76
|
425 // Do the log.
|
Chris@76
|
426 if (!empty($log_inserts) && !empty($modSettings['modlog_enabled']))
|
Chris@76
|
427 $smcFunc['db_insert']('',
|
Chris@76
|
428 '{db_prefix}log_actions',
|
Chris@76
|
429 array(
|
Chris@76
|
430 'log_time' => 'int', 'id_log' => 'int', 'id_member' => 'int', 'ip' => 'string-16', 'action' => 'string',
|
Chris@76
|
431 'id_board' => 'int', 'id_topic' => 'int', 'id_msg' => 'int', 'extra' => 'string-65534',
|
Chris@76
|
432 ),
|
Chris@76
|
433 $log_inserts,
|
Chris@76
|
434 array('id_action')
|
Chris@76
|
435 );
|
Chris@76
|
436
|
Chris@76
|
437 // Mission successful.
|
Chris@76
|
438 return true;
|
Chris@76
|
439 }
|
Chris@76
|
440
|
Chris@76
|
441 // Add one or more members to a membergroup.
|
Chris@76
|
442 /* Supported types:
|
Chris@76
|
443 - only_primary - Assigns a membergroup as primary membergroup, but only
|
Chris@76
|
444 if a member has not yet a primary membergroup assigned,
|
Chris@76
|
445 unless the member is already part of the membergroup.
|
Chris@76
|
446 - only_additional - Assigns a membergroup to the additional membergroups,
|
Chris@76
|
447 unless the member is already part of the membergroup.
|
Chris@76
|
448 - force_primary - Assigns a membergroup as primary membergroup no matter
|
Chris@76
|
449 what the previous primary membergroup was.
|
Chris@76
|
450 - auto - Assigns a membergroup to the primary group if it's still
|
Chris@76
|
451 available. If not, assign it to the additional group. */
|
Chris@76
|
452 function addMembersToGroup($members, $group, $type = 'auto', $permissionCheckDone = false)
|
Chris@76
|
453 {
|
Chris@76
|
454 global $smcFunc, $user_info, $modSettings;
|
Chris@76
|
455
|
Chris@76
|
456 // Show your licence, but only if it hasn't been done yet.
|
Chris@76
|
457 if (!$permissionCheckDone)
|
Chris@76
|
458 isAllowedTo('manage_membergroups');
|
Chris@76
|
459
|
Chris@76
|
460 // Make sure we don't keep old stuff cached.
|
Chris@76
|
461 updateSettings(array('settings_updated' => time()));
|
Chris@76
|
462
|
Chris@76
|
463 if (!is_array($members))
|
Chris@76
|
464 $members = array((int) $members);
|
Chris@76
|
465 else
|
Chris@76
|
466 {
|
Chris@76
|
467 $members = array_unique($members);
|
Chris@76
|
468
|
Chris@76
|
469 // Make sure all members are integer.
|
Chris@76
|
470 foreach ($members as $key => $value)
|
Chris@76
|
471 $members[$key] = (int) $value;
|
Chris@76
|
472 }
|
Chris@76
|
473 $group = (int) $group;
|
Chris@76
|
474
|
Chris@76
|
475 // Some groups just don't like explicitly having members.
|
Chris@76
|
476 $implicitGroups = array(-1, 0, 3);
|
Chris@76
|
477 $request = $smcFunc['db_query']('', '
|
Chris@76
|
478 SELECT id_group, group_name, min_posts
|
Chris@76
|
479 FROM {db_prefix}membergroups
|
Chris@76
|
480 WHERE id_group = {int:current_group}',
|
Chris@76
|
481 array(
|
Chris@76
|
482 'current_group' => $group,
|
Chris@76
|
483 )
|
Chris@76
|
484 );
|
Chris@76
|
485 $group_names = array();
|
Chris@76
|
486 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
487 {
|
Chris@76
|
488 if ($row['min_posts'] != -1)
|
Chris@76
|
489 $implicitGroups[] = $row['id_group'];
|
Chris@76
|
490 else
|
Chris@76
|
491 $group_names[$row['id_group']] = $row['group_name'];
|
Chris@76
|
492 }
|
Chris@76
|
493 $smcFunc['db_free_result']($request);
|
Chris@76
|
494
|
Chris@76
|
495 // Sorry, you can't join an implicit group.
|
Chris@76
|
496 if (in_array($group, $implicitGroups) || empty($members))
|
Chris@76
|
497 return false;
|
Chris@76
|
498
|
Chris@76
|
499 // Only admins can add admins...
|
Chris@76
|
500 if (!allowedTo('admin_forum') && $group == 1)
|
Chris@76
|
501 return false;
|
Chris@76
|
502 // ... and assign protected groups!
|
Chris@76
|
503 elseif (!allowedTo('admin_forum'))
|
Chris@76
|
504 {
|
Chris@76
|
505 $request = $smcFunc['db_query']('', '
|
Chris@76
|
506 SELECT group_type
|
Chris@76
|
507 FROM {db_prefix}membergroups
|
Chris@76
|
508 WHERE id_group = {int:current_group}
|
Chris@76
|
509 LIMIT {int:limit}',
|
Chris@76
|
510 array(
|
Chris@76
|
511 'current_group' => $group,
|
Chris@76
|
512 'limit' => 1,
|
Chris@76
|
513 )
|
Chris@76
|
514 );
|
Chris@76
|
515 list ($is_protected) = $smcFunc['db_fetch_row']($request);
|
Chris@76
|
516 $smcFunc['db_free_result']($request);
|
Chris@76
|
517
|
Chris@76
|
518 // Is it protected?
|
Chris@76
|
519 if ($is_protected == 1)
|
Chris@76
|
520 return false;
|
Chris@76
|
521 }
|
Chris@76
|
522
|
Chris@76
|
523 // Do the actual updates.
|
Chris@76
|
524 if ($type == 'only_additional')
|
Chris@76
|
525 $smcFunc['db_query']('', '
|
Chris@76
|
526 UPDATE {db_prefix}members
|
Chris@76
|
527 SET additional_groups = CASE WHEN additional_groups = {string:blank_string} THEN {string:id_group_string} ELSE CONCAT(additional_groups, {string:id_group_string_extend}) END
|
Chris@76
|
528 WHERE id_member IN ({array_int:member_list})
|
Chris@76
|
529 AND id_group != {int:id_group}
|
Chris@76
|
530 AND FIND_IN_SET({int:id_group}, additional_groups) = 0',
|
Chris@76
|
531 array(
|
Chris@76
|
532 'member_list' => $members,
|
Chris@76
|
533 'id_group' => $group,
|
Chris@76
|
534 'id_group_string' => (string) $group,
|
Chris@76
|
535 'id_group_string_extend' => ',' . $group,
|
Chris@76
|
536 'blank_string' => '',
|
Chris@76
|
537 )
|
Chris@76
|
538 );
|
Chris@76
|
539 elseif ($type == 'only_primary' || $type == 'force_primary')
|
Chris@76
|
540 $smcFunc['db_query']('', '
|
Chris@76
|
541 UPDATE {db_prefix}members
|
Chris@76
|
542 SET id_group = {int:id_group}
|
Chris@76
|
543 WHERE id_member IN ({array_int:member_list})' . ($type == 'force_primary' ? '' : '
|
Chris@76
|
544 AND id_group = {int:regular_group}
|
Chris@76
|
545 AND FIND_IN_SET({int:id_group}, additional_groups) = 0'),
|
Chris@76
|
546 array(
|
Chris@76
|
547 'member_list' => $members,
|
Chris@76
|
548 'id_group' => $group,
|
Chris@76
|
549 'regular_group' => 0,
|
Chris@76
|
550 )
|
Chris@76
|
551 );
|
Chris@76
|
552 elseif ($type == 'auto')
|
Chris@76
|
553 $smcFunc['db_query']('', '
|
Chris@76
|
554 UPDATE {db_prefix}members
|
Chris@76
|
555 SET
|
Chris@76
|
556 id_group = CASE WHEN id_group = {int:regular_group} THEN {int:id_group} ELSE id_group END,
|
Chris@76
|
557 additional_groups = CASE WHEN id_group = {int:id_group} THEN additional_groups
|
Chris@76
|
558 WHEN additional_groups = {string:blank_string} THEN {string:id_group_string}
|
Chris@76
|
559 ELSE CONCAT(additional_groups, {string:id_group_string_extend}) END
|
Chris@76
|
560 WHERE id_member IN ({array_int:member_list})
|
Chris@76
|
561 AND id_group != {int:id_group}
|
Chris@76
|
562 AND FIND_IN_SET({int:id_group}, additional_groups) = 0',
|
Chris@76
|
563 array(
|
Chris@76
|
564 'member_list' => $members,
|
Chris@76
|
565 'regular_group' => 0,
|
Chris@76
|
566 'id_group' => $group,
|
Chris@76
|
567 'blank_string' => '',
|
Chris@76
|
568 'id_group_string' => (string) $group,
|
Chris@76
|
569 'id_group_string_extend' => ',' . $group,
|
Chris@76
|
570 )
|
Chris@76
|
571 );
|
Chris@76
|
572 // Ack!!? What happened?
|
Chris@76
|
573 else
|
Chris@76
|
574 trigger_error('addMembersToGroup(): Unknown type \'' . $type . '\'', E_USER_WARNING);
|
Chris@76
|
575
|
Chris@76
|
576 // Update their postgroup statistics.
|
Chris@76
|
577 updateStats('postgroups', $members);
|
Chris@76
|
578
|
Chris@76
|
579 // Log the data.
|
Chris@76
|
580 $log_inserts = array();
|
Chris@76
|
581 foreach ($members as $member)
|
Chris@76
|
582 $log_inserts[] = array(
|
Chris@76
|
583 time(), 3, $user_info['id'], $user_info['ip'], 'added_to_group',
|
Chris@76
|
584 0, 0, 0, serialize(array('group' => $group_names[$group], 'member' => $member)),
|
Chris@76
|
585 );
|
Chris@76
|
586
|
Chris@76
|
587 if (!empty($log_inserts) && !empty($modSettings['modlog_enabled']))
|
Chris@76
|
588 $smcFunc['db_insert']('',
|
Chris@76
|
589 '{db_prefix}log_actions',
|
Chris@76
|
590 array(
|
Chris@76
|
591 'log_time' => 'int', 'id_log' => 'int', 'id_member' => 'int', 'ip' => 'string-16', 'action' => 'string',
|
Chris@76
|
592 'id_board' => 'int', 'id_topic' => 'int', 'id_msg' => 'int', 'extra' => 'string-65534',
|
Chris@76
|
593 ),
|
Chris@76
|
594 $log_inserts,
|
Chris@76
|
595 array('id_action')
|
Chris@76
|
596 );
|
Chris@76
|
597
|
Chris@76
|
598 return true;
|
Chris@76
|
599 }
|
Chris@76
|
600
|
Chris@76
|
601 function listMembergroupMembers_Href(&$members, $membergroup, $limit = null)
|
Chris@76
|
602 {
|
Chris@76
|
603 global $scripturl, $txt, $smcFunc;
|
Chris@76
|
604
|
Chris@76
|
605 $request = $smcFunc['db_query']('', '
|
Chris@76
|
606 SELECT id_member, real_name
|
Chris@76
|
607 FROM {db_prefix}members
|
Chris@76
|
608 WHERE id_group = {int:id_group} OR FIND_IN_SET({int:id_group}, additional_groups) != 0' . ($limit === null ? '' : '
|
Chris@76
|
609 LIMIT ' . ($limit + 1)),
|
Chris@76
|
610 array(
|
Chris@76
|
611 'id_group' => $membergroup,
|
Chris@76
|
612 )
|
Chris@76
|
613 );
|
Chris@76
|
614 $members = array();
|
Chris@76
|
615 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
616 $members[$row['id_member']] = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>';
|
Chris@76
|
617 $smcFunc['db_free_result']($request);
|
Chris@76
|
618
|
Chris@76
|
619 // If there are more than $limit members, add a 'more' link.
|
Chris@76
|
620 if ($limit !== null && count($members) > $limit)
|
Chris@76
|
621 {
|
Chris@76
|
622 array_pop($members);
|
Chris@76
|
623 return true;
|
Chris@76
|
624 }
|
Chris@76
|
625 else
|
Chris@76
|
626 return false;
|
Chris@76
|
627 }
|
Chris@76
|
628
|
Chris@76
|
629 // Retrieve a list of (visible) membergroups used by the cache.
|
Chris@76
|
630 function cache_getMembergroupList()
|
Chris@76
|
631 {
|
Chris@76
|
632 global $scripturl, $smcFunc;
|
Chris@76
|
633
|
Chris@76
|
634 $request = $smcFunc['db_query']('', '
|
Chris@76
|
635 SELECT id_group, group_name, online_color
|
Chris@76
|
636 FROM {db_prefix}membergroups
|
Chris@76
|
637 WHERE min_posts = {int:min_posts}
|
Chris@76
|
638 AND hidden = {int:not_hidden}
|
Chris@76
|
639 AND id_group != {int:mod_group}
|
Chris@76
|
640 AND online_color != {string:blank_string}
|
Chris@76
|
641 ORDER BY group_name',
|
Chris@76
|
642 array(
|
Chris@76
|
643 'min_posts' => -1,
|
Chris@76
|
644 'not_hidden' => 0,
|
Chris@76
|
645 'mod_group' => 3,
|
Chris@76
|
646 'blank_string' => '',
|
Chris@76
|
647 )
|
Chris@76
|
648 );
|
Chris@76
|
649 $groupCache = array();
|
Chris@76
|
650 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
651 $groupCache[] = '<a href="' . $scripturl . '?action=groups;sa=members;group=' . $row['id_group'] . '" ' . ($row['online_color'] ? 'style="color: ' . $row['online_color'] . '"' : '') . '>' . $row['group_name'] . '</a>';
|
Chris@76
|
652 $smcFunc['db_free_result']($request);
|
Chris@76
|
653
|
Chris@76
|
654 return array(
|
Chris@76
|
655 'data' => $groupCache,
|
Chris@76
|
656 'expires' => time() + 3600,
|
Chris@76
|
657 'refresh_eval' => 'return $GLOBALS[\'modSettings\'][\'settings_updated\'] > ' . time() . ';',
|
Chris@76
|
658 );
|
Chris@76
|
659 }
|
Chris@76
|
660
|
Chris@76
|
661 function list_getMembergroups($start, $items_per_page, $sort, $membergroup_type)
|
Chris@76
|
662 {
|
Chris@76
|
663 global $txt, $scripturl, $context, $settings, $smcFunc;
|
Chris@76
|
664
|
Chris@76
|
665 $groups = array();
|
Chris@76
|
666
|
Chris@76
|
667 // Get the basic group data.
|
Chris@76
|
668 $request = $smcFunc['db_query']('substring_membergroups', '
|
Chris@76
|
669 SELECT id_group, group_name, min_posts, online_color, stars, 0 AS num_members
|
Chris@76
|
670 FROM {db_prefix}membergroups
|
Chris@76
|
671 WHERE min_posts ' . ($membergroup_type === 'post_count' ? '!=' : '=') . ' -1' . (allowedTo('admin_forum') ? '' : '
|
Chris@76
|
672 AND group_type != {int:is_protected}') . '
|
Chris@76
|
673 ORDER BY {raw:sort}',
|
Chris@76
|
674 array(
|
Chris@76
|
675 'is_protected' => 1,
|
Chris@76
|
676 'sort' => $sort,
|
Chris@76
|
677 )
|
Chris@76
|
678 );
|
Chris@76
|
679 while ($row = $smcFunc['db_fetch_assoc']($request))
|
Chris@76
|
680 $groups[$row['id_group']] = array(
|
Chris@76
|
681 'id_group' => $row['id_group'],
|
Chris@76
|
682 'group_name' => $row['group_name'],
|
Chris@76
|
683 'min_posts' => $row['min_posts'],
|
Chris@76
|
684 'online_color' => $row['online_color'],
|
Chris@76
|
685 'stars' => $row['stars'],
|
Chris@76
|
686 'num_members' => $row['num_members'],
|
Chris@76
|
687 );
|
Chris@76
|
688 $smcFunc['db_free_result']($request);
|
Chris@76
|
689
|
Chris@76
|
690 // If we found any membergroups, get the amount of members in them.
|
Chris@76
|
691 if (!empty($groups))
|
Chris@76
|
692 {
|
Chris@76
|
693 if ($membergroup_type === 'post_count')
|
Chris@76
|
694 {
|
Chris@76
|
695 $query = $smcFunc['db_query']('', '
|
Chris@76
|
696 SELECT id_post_group AS id_group, COUNT(*) AS num_members
|
Chris@76
|
697 FROM {db_prefix}members
|
Chris@76
|
698 WHERE id_post_group IN ({array_int:group_list})
|
Chris@76
|
699 GROUP BY id_post_group',
|
Chris@76
|
700 array(
|
Chris@76
|
701 'group_list' => array_keys($groups),
|
Chris@76
|
702 )
|
Chris@76
|
703 );
|
Chris@76
|
704 while ($row = $smcFunc['db_fetch_assoc']($query))
|
Chris@76
|
705 $groups[$row['id_group']]['num_members'] += $row['num_members'];
|
Chris@76
|
706 $smcFunc['db_free_result']($query);
|
Chris@76
|
707 }
|
Chris@76
|
708
|
Chris@76
|
709 else
|
Chris@76
|
710 {
|
Chris@76
|
711 $query = $smcFunc['db_query']('', '
|
Chris@76
|
712 SELECT id_group, COUNT(*) AS num_members
|
Chris@76
|
713 FROM {db_prefix}members
|
Chris@76
|
714 WHERE id_group IN ({array_int:group_list})
|
Chris@76
|
715 GROUP BY id_group',
|
Chris@76
|
716 array(
|
Chris@76
|
717 'group_list' => array_keys($groups),
|
Chris@76
|
718 )
|
Chris@76
|
719 );
|
Chris@76
|
720 while ($row = $smcFunc['db_fetch_assoc']($query))
|
Chris@76
|
721 $groups[$row['id_group']]['num_members'] += $row['num_members'];
|
Chris@76
|
722 $smcFunc['db_free_result']($query);
|
Chris@76
|
723
|
Chris@76
|
724 $query = $smcFunc['db_query']('', '
|
Chris@76
|
725 SELECT mg.id_group, COUNT(*) AS num_members
|
Chris@76
|
726 FROM {db_prefix}membergroups AS mg
|
Chris@76
|
727 INNER JOIN {db_prefix}members AS mem ON (mem.additional_groups != {string:blank_string}
|
Chris@76
|
728 AND mem.id_group != mg.id_group
|
Chris@76
|
729 AND FIND_IN_SET(mg.id_group, mem.additional_groups) != 0)
|
Chris@76
|
730 WHERE mg.id_group IN ({array_int:group_list})
|
Chris@76
|
731 GROUP BY mg.id_group',
|
Chris@76
|
732 array(
|
Chris@76
|
733 'group_list' => array_keys($groups),
|
Chris@76
|
734 'blank_string' => '',
|
Chris@76
|
735 )
|
Chris@76
|
736 );
|
Chris@76
|
737 while ($row = $smcFunc['db_fetch_assoc']($query))
|
Chris@76
|
738 $groups[$row['id_group']]['num_members'] += $row['num_members'];
|
Chris@76
|
739 $smcFunc['db_free_result']($query);
|
Chris@76
|
740 }
|
Chris@76
|
741 }
|
Chris@76
|
742
|
Chris@76
|
743 // Apply manual sorting if the 'number of members' column is selected.
|
Chris@76
|
744 if (substr($sort, 0, 1) == '1' || strpos($sort, ', 1') !== false)
|
Chris@76
|
745 {
|
Chris@76
|
746 $sort_ascending = strpos($sort, 'DESC') === false;
|
Chris@76
|
747
|
Chris@76
|
748 foreach ($groups as $group)
|
Chris@76
|
749 $sort_array[] = $group['id_group'] != 3 ? (int) $group['num_members'] : -1;
|
Chris@76
|
750
|
Chris@76
|
751 array_multisort($sort_array, $sort_ascending ? SORT_ASC : SORT_DESC, SORT_REGULAR, $groups);
|
Chris@76
|
752 }
|
Chris@76
|
753
|
Chris@76
|
754 return $groups;
|
Chris@76
|
755 }
|
Chris@76
|
756
|
Chris@76
|
757 ?> |