PluginProbe
wpForo Forum / 3.1.2
wpForo Forum v3.1.2
3.1.5 3.1.4 3.1.2 3.1.1 3.1.0 3.0.9 3.0.8 3.0.7 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.1.1 1.1.2 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.10 1.4.11 1.4.12 1.4.13 1.4.2 All 137 releases
wpforo / classes / UserGroups.php

UserGroups.php in wpForo Forum 3.1.2, at classes/UserGroups.php

634 lines 20.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace wpforo\classes;
4
5 use stdClass;
6
7 // Exit if accessed directly
8 if( ! defined( 'ABSPATH' ) ) exit;
9
10 class UserGroups {
11 public $default;
12 public $default_groupid;
13 public $cans;
14 public $current;
15 private $post_flood_intervals;
16
17 function __construct() {
18 $this->init_defaults();
19 $this->cans = apply_filters( 'wpforo_usergroup_cans', $this->default->cans );
20 $this->init_hooks();
21 }
22
23 private function init_defaults() {
24 $this->default = new stdClass;
25
26 $this->default->default_groupid = 3;
27
28 $this->default->group = [
29 'groupid' => 0,
30 'name' => '',
31 'cans' => '',
32 'description' => '',
33 'utitle' => '',
34 'role' => '',
35 'access' => '',
36 'color' => '',
37 'visible' => 0,
38 'secondary' => 0,
39 'is_default' => 0,
40 ];
41
42 $this->default->post_flood_intervals = [
43 0 => 0,
44 1 => 0,
45 2 => 0,
46 3 => 0,
47 4 => 0,
48 5 => 0,
49 ];
50
51 $this->default->cans = [
52 'mf' => __( 'Dashboard - Manage Boards & Forums', 'wpforo' ),
53 'ms' => __( 'Dashboard - Manage Settings', 'wpforo' ),
54 'mai' => __( 'Dashboard - Manage AI Features', 'wpforo' ),
55 'mt' => __( 'Dashboard - Manage Tools', 'wpforo' ),
56 'vm' => __( 'Dashboard - Manage Members', 'wpforo' ),
57 'aum' => __( 'Dashboard - Moderate Topics & Posts', 'wpforo' ),
58 'vmg' => __( 'Dashboard - Manage Usergroups', 'wpforo' ),
59 'mp' => __( 'Dashboard - Manage Phrases', 'wpforo' ),
60 'mth' => __( 'Dashboard - Manage Themes', 'wpforo' ),
61
62 'em' => __( 'Dashboard - Can edit member', 'wpforo' ),
63 'bm' => __( 'Dashboard - Can ban member', 'wpforo' ),
64 'dm' => __( 'Dashboard - Can delete member', 'wpforo' ),
65
66 'aup' => __( 'Front - Can pass moderation', 'wpforo' ),
67 'view_stat' => __( 'Front - Can view statistic', 'wpforo' ),
68 'vmem' => __( 'Front - Can view members', 'wpforo' ),
69 'vprf' => __( 'Front - Can view profiles', 'wpforo' ),
70 'vpra' => __( 'Front - Can view member activity', 'wpforo' ),
71 'vprs' => __( 'Front - Can view member subscriptions', 'wpforo' ),
72
73 'upc' => __( 'Front - Can upload cover', 'wpforo' ),
74 'upa' => __( 'Front - Can upload avatar', 'wpforo' ),
75 'ups' => __( 'Front - Can have signature', 'wpforo' ),
76 'va' => __( 'Front - Can view avatars', 'wpforo' ),
77
78 'vmu' => __( 'Front - Can view member username', 'wpforo' ),
79 'vmm' => __( 'Front - Can view member email', 'wpforo' ),
80 'vmt' => __( 'Front - Can view member title', 'wpforo' ),
81 // 'vmct' => __( 'Front - Can view member custom title', 'wpforo' ),
82 'vmr' => __( 'Front - Can view member reputation', 'wpforo' ),
83 'vmw' => __( 'Front - Can view member website', 'wpforo' ),
84 'vmsn' => __( 'Front - Can view member social networks', 'wpforo' ),
85 'vmrd' => __( 'Front - Can view member reg. date', 'wpforo' ),
86 'vml' => __( 'Front - Can view member location', 'wpforo' ),
87 'vmo' => __( 'Front - Can view member occupation', 'wpforo' ),
88 'vms' => __( 'Front - Can view member signature', 'wpforo' ),
89 'vmam' => __( 'Front - Can view member about me', 'wpforo' ),
90 'vwpm' => __( 'Front - Can write PM', 'wpforo' ),
91 'caa' => __( 'Front - Can access to attachments', 'wpforo' ),
92 'vt_add_topic' => __( 'Front - Can access to add topic page', 'wpforo' ),
93
94 'ai_search' => __( 'Front - Can use AI semantic search', 'wpforo' ),
95 'ai_summary' => __( 'Front - Can use AI topic summarization', 'wpforo' ),
96 'ai_translation' => __( 'Front - Can use AI post translation', 'wpforo' ),
97 'ai_suggestion' => __( 'Front - Can see AI topic suggestion', 'wpforo' ),
98 ];
99 }
100
101 private function init_options() {
102 $this->default_groupid = $this->get_default_groupid( $this->default->default_groupid );
103 $this->post_flood_intervals = wpforo_get_option( 'wpforo_post_flood_intervals', $this->default->post_flood_intervals );
104 }
105
106 public function init_current() {
107 if( ! $this->current = $this->get_usergroup( WPF()->current_user_groupid ) ) {
108 $this->current = $this->get_usergroup();
109 }
110 }
111
112 private function init_hooks() {
113 // add_action('wpforo_after_add_usergroup', array($this, 'after_add_edit_usergroup'));
114 // add_action('wpforo_after_edit_usergroup', array($this, 'after_add_edit_usergroup'));
115 if( WPF()->is_installed() ) $this->init_options();
116 }
117
118 public function get_flood_interval( $groupid, $obj = 'post' ) {
119 $flood_interval = ( wpfkey( $this->post_flood_intervals, $groupid ) ? $this->post_flood_intervals[ $groupid ] : 3 );
120
121 return apply_filters( 'wpforo_usergroup_get_flood_interval', intval( $flood_interval ), $groupid, $obj );
122 }
123
124 public function fix_group( $group ) {
125 $group = wpforo_array_args_cast_and_merge( (array) $group, $this->default->group );
126 $cans = array_map( '__return_zero', $this->cans );
127 $group['cans'] = maybe_unserialize( $group['cans'] );
128 if( is_array( $group['cans'] ) ) {
129 $group['cans'] = wpforo_array_args_cast_and_merge( $group['cans'], $cans );
130 } else {
131 $group['cans'] = $cans;
132 }
133
134 return $group;
135 }
136
137 function usergroup_list_data() {
138 $ugdata = [];
139 $groups = WPF()->db->get_results( 'SELECT * FROM ' . WPF()->tables->usergroups . ' ORDER BY `name` ', ARRAY_A );
140 foreach( $groups as $group ) {
141 $user_count = WPF()->db->get_var( "SELECT COUNT(*) FROM " . WPF()->tables->profiles . " WHERE `groupid` = " . intval( $group['groupid'] ) . " OR FIND_IN_SET(" . intval( $group['groupid'] ) . ", `secondary_groupids`)" );
142 $ugdata[ $group['groupid'] ]['groupid'] = intval( $group['groupid'] );
143 $ugdata[ $group['groupid'] ]['name'] = wpforo_phrase( $group['name'], false );
144 $ugdata[ $group['groupid'] ]['role'] = $group['role'];
145 $ugdata[ $group['groupid'] ]['count'] = intval( $user_count );
146 $ugdata[ $group['groupid'] ]['access'] = $group['access'];
147 $ugdata[ $group['groupid'] ]['color'] = $group['color'];
148 $ugdata[ $group['groupid'] ]['secondary'] = $group['secondary'];
149 }
150
151 return $ugdata;
152 }
153
154 function add( $title, $cans = [], $description = '', $role = 'subscriber', $access = 'standard', $color = '', $visible = 1, $secondary = 0 ) {
155 $i = 2;
156 $real_title = $title;
157 while( WPF()->db->get_var(
158 WPF()->db->prepare(
159 "SELECT `groupid` FROM `" . WPF()->tables->usergroups . "` WHERE `name` = %s",
160 sanitize_text_field( $title )
161 )
162 ) ) {
163 $title = $real_title . '-' . $i;
164 $i ++;
165 }
166
167 $group = [
168 'name' => sanitize_text_field( $title ),
169 'cans' => serialize( wpforo_parse_args( $cans, array_map( '__return_zero', $this->cans ) ) ),
170 'description' => $description,
171 'utitle' => sanitize_text_field( $real_title ),
172 'role' => $role,
173 'access' => $access,
174 'color' => $color,
175 'visible' => $visible,
176 'secondary' => $secondary,
177 ];
178
179 if( WPF()->db->insert( WPF()->tables->usergroups, $group, [ '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d' ] ) ) {
180 $group['groupid'] = WPF()->db->insert_id;
181
182 do_action( 'wpforo_after_add_usergroup', $group );
183
184 WPF()->notice->add( 'User group successfully added', 'success' );
185
186 return $group['groupid'];
187 }
188
189 WPF()->notice->add( 'User group add error', 'error' );
190
191 return false;
192 }
193
194 function edit( $groupid, $title, $cans, $description = '', $role = null, $access = null, $color = '', $visible = 1, $secondary = 0 ) {
195 if( ! $this->can( 'vmg' ) ) {
196 WPF()->notice->add( 'Permission denied', 'error' );
197
198 return false;
199 }
200
201 if( $groupid = intval( $groupid ) ) {
202 $old_group = $this->get_usergroup( $groupid );
203 $group = [
204 'name' => sanitize_text_field( $title ),
205 'cans' => serialize( wpforo_parse_args( $cans, array_map( '__return_zero', $this->cans ) ) ),
206 'description' => $description,
207 'utitle' => $old_group['utitle'],
208 'role' => is_null( $role ) ? $old_group['role'] : $role,
209 'access' => is_null( $access ) ? $old_group['access'] : $access,
210 'color' => $color,
211 'visible' => $visible,
212 'secondary' => $secondary,
213 ];
214
215 if( false !== WPF()->db->update( WPF()->tables->usergroups, $group, [ 'groupid' => $groupid ], [ '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d' ], [ '%d' ] ) ) {
216 $group['groupid'] = $groupid;
217
218 do_action( 'wpforo_after_edit_usergroup', $group );
219
220 WPF()->notice->add( 'User group successfully edited', 'success' );
221
222 return $groupid;
223 }
224 }
225
226 WPF()->notice->add( 'User group edit error', 'error' );
227
228 return false;
229 }
230
231 function delete( $groupid, $mergeid ) {
232 if( ! $this->can( 'vmg' ) ) {
233 WPF()->notice->add( 'Permission denied', 'error' );
234
235 return false;
236 }
237
238 if( ( $groupid = intval( $groupid ) ) && ! in_array( $groupid, [ 1, 4 ] ) ) {
239 if( $mergeid = intval( $mergeid ) ) {
240 $sql = "UPDATE `" . WPF()->tables->profiles . "` SET `groupid` = %d WHERE `groupid` = %d";
241 WPF()->db->query( WPF()->db->prepare( $sql, $mergeid, $groupid ) );
242 }
243
244 if( false !== WPF()->db->delete( WPF()->tables->usergroups, [ 'groupid' => $groupid ], [ '%d' ] ) ) {
245 WPF()->notice->add( wpforo_phrase( 'Usergroup has been successfully deleted. All users of this usergroup have been moved to the usergroup you\'ve chosen', false ), 'success' );
246
247 return $groupid;
248 }
249 }
250
251 WPF()->notice->add( 'Can\'t delete this Usergroup', 'error' );
252
253 return false;
254 }
255
256 public function _get_usergroup( $groupid = 4 ) {
257 return WPF()->db->get_row(
258 WPF()->db->prepare(
259 "SELECT * FROM `" . WPF()->tables->usergroups . "` WHERE `groupid` = %d",
260 $groupid
261 ),
262 ARRAY_A
263 );
264 }
265
266 public function get_usergroup( $groupid = 4 ) {
267 return wpforo_ram_get( [ $this, '_get_usergroup' ], $groupid );
268 }
269
270 public function _get_usergroups( $field = 'full' ) {
271 if( $field === 'full' ) {
272 $groups = (array) WPF()->db->get_results( "SELECT * FROM `" . WPF()->tables->usergroups . "`", ARRAY_A );
273 } else {
274 $groups = WPF()->db->get_col( "SELECT `$field` FROM `" . WPF()->tables->usergroups . "`" );
275 }
276
277 return $groups;
278 }
279
280 public function get_usergroups( $field = 'full' ) {
281 return wpforo_ram_get( [ $this, '_get_usergroups' ], $field );
282 }
283
284 /**
285 * @param array|int $selected
286 * @param array|int $exclude
287 *
288 * @return string
289 */
290 public function get_selectbox( $selected = [], $exclude = [] ) {
291 $selected = array_map( 'intval', (array) $selected );
292 $exclude = array_map( 'intval', (array) $exclude );
293 $html = '';
294 foreach( $this->usergroup_list_data() as $group ) {
295 if( in_array( $group['groupid'], $exclude ) ) continue;
296 $html .= sprintf(
297 '<option value="%1$s" %2$s>%3$s</option>',
298 intval( $group['groupid'] ),
299 in_array( $group['groupid'], $selected ) ? ' selected ' : '',
300 esc_html( $group['name'] ) . "\t(" . $group['count'] . ")"
301 );
302 }
303
304 return $html;
305 }
306
307 /**
308 * @param array|int $selected
309 * @param array|int $exclude
310 */
311 public function show_selectbox( $selected = [], $exclude = [] ) {
312 echo $this->get_selectbox( $selected, $exclude );
313 }
314
315 function get_visible_usergroup_ids() {
316 $key = [ 'usergroup', 'get_visible_usergroup_ids' ];
317 if( WPF()->ram_cache->exists( $key ) ) return WPF()->ram_cache->get( $key );
318 $col = WPF()->db->get_col( "SELECT `groupid` FROM `" . WPF()->tables->usergroups . "` WHERE `visible` = 1" );
319 WPF()->ram_cache->set( $key, $col );
320
321 return $col;
322 }
323
324 public function _get_secondary_groupids() {
325 return WPF()->db->get_col( "SELECT `groupid` FROM `" . WPF()->tables->usergroups . "` WHERE `groupid` NOT IN(1,2,4) AND `secondary` = 1" );
326 }
327
328 public function get_secondary_groupids() {
329 return wpforo_ram_get( [$this, '_get_secondary_groupids'] );
330 }
331
332 function get_secondary_group_names( $ids ) {
333 if( ! is_array( $ids ) ) $ids = explode( ',', $ids );
334 $ids = array_map( 'intval', $ids );
335 $ids = array_diff( $ids, [ 1, 2, 4 ] );
336 if( $ids ) {
337 $ids = implode( ',', $ids );
338
339 return WPF()->db->get_col( "SELECT `name` FROM `" . WPF()->tables->usergroups . "` WHERE `secondary` = 1 AND `groupid` IN (" . esc_sql( $ids ) . ")" );
340 }
341
342 return [];
343 }
344
345 /**
346 * @deprecated since 2.1.6, instead of this method you can use $this->get_secondary_groups()
347 */
348 function get_secondary_usergroups() {
349 return $this->get_secondary_groups();
350 }
351
352 function get_secondary_groups() {
353 return wpforo_ram_get( [ $this, '_get_secondary_groups' ] );
354 }
355
356 function _get_secondary_groups() {
357 $order_by = apply_filters('wpforo_get_secondary_groups_order_by', 'ORDER BY `groupid` ASC');
358 return (array) WPF()->db->get_results( "SELECT * FROM `" . WPF()->tables->usergroups . "` WHERE `groupid` NOT IN(1,2,4) AND `secondary` = 1 " . esc_sql( $order_by ), ARRAY_A );
359 }
360
361 function get_groupids_by_role( $role ) {
362 if( $role ) {
363 $ugids = WPF()->db->get_col( "SELECT `groupid` FROM `" . WPF()->tables->usergroups . "` WHERE `role` = '" . esc_sql( $role ) . "' ORDER BY `groupid` ASC" );
364 if( ! empty( $ugids ) ) {
365 return $ugids;
366 }
367 }
368
369 return null;
370 }
371
372 function get_group_by_role( $role ) {
373 if( $role ) {
374 $usergroups = WPF()->db->get_results( "SELECT * FROM `" . WPF()->tables->usergroups . "` WHERE `role` = '" . esc_sql( $role ) . "' ORDER BY `groupid` ASC", ARRAY_A );
375 if( ! empty( $usergroups ) ) {
376 return $usergroups;
377 }
378 }
379
380 return null;
381 }
382
383 function get_roles() {
384 $roles = wp_roles();
385 $roles = $roles->get_names();
386
387 return $roles;
388 }
389
390 function get_roles_ug() {
391 $roles_ug = WPF()->db->get_results( "SELECT `name`, `role` FROM `" . WPF()->tables->usergroups . "`", ARRAY_A );
392 $roles = wp_roles();
393 $roles = $roles->get_names();
394 if( ! empty( $roles ) ) {
395 foreach( $roles as $role => $name ) {
396 foreach( $roles_ug as $ug ) {
397 if( wpfval( $ug, 'role' ) && $role == $ug['role'] ) {
398 $roles_ug[ $role ][] = $ug['name'];
399 }
400 }
401 }
402 }
403
404 return $roles_ug;
405 }
406
407 function get_roles_woug() {
408 $roles_woug = [];
409 $roles_ug = WPF()->db->get_col( "SELECT `role` FROM `" . WPF()->tables->usergroups . "` GROUP BY `role`" );
410 $roles = wp_roles();
411 $roles = $roles->get_names();
412 if( ! empty( $roles ) ) {
413 foreach( $roles as $role => $name ) {
414 if( ! in_array( $role, $roles_ug ) ) {
415 $roles_woug[ $role ] = $name;
416 }
417 }
418 }
419
420 return $roles_woug;
421 }
422
423 function get_role_usergroup_relation() {
424 $roles = [];
425 $data = WPF()->db->get_results( "SELECT `groupid`, `role` FROM `" . WPF()->tables->usergroups . "` ORDER BY `groupid` DESC", ARRAY_A );
426 if( ! empty( $data ) ) {
427 $data = array_map( function($d){ $d['groupid'] = intval( $d['groupid'] ); return $d; }, $data );
428 foreach( $data as $rel ) {
429 if( $rel['groupid'] === 1 && in_array( $rel['role'], [ 'subscriber', 'contributor' ], true ) ) {
430 $roles['administrator'] = $rel['groupid'];
431 } elseif( $rel['groupid'] === 2 && $rel['role'] === 'subscriber' ) {
432 $roles['editor'] = $rel['groupid'];
433 } elseif( $rel['role'] ) {
434 $roles[ $rel['role'] ] = $rel['groupid'];
435 }
436 }
437 }
438
439 return $roles;
440 }
441
442 function get_usergroup_role_relation() {
443 $usergroups = [];
444 $data = WPF()->db->get_results( "SELECT `groupid`, `role` FROM `" . WPF()->tables->usergroups . "`", ARRAY_A );
445 if( ! empty( $data ) ) {
446 foreach( $data as $rel ) {
447 $usergroups[ $rel['groupid'] ] = $rel['role'];
448 }
449 }
450
451 return $usergroups;
452 }
453
454 function get_usergroup_access_relation() {
455 $usergroups = [];
456 $data = WPF()->db->get_results( "SELECT `groupid`, `access` FROM `" . WPF()->tables->usergroups . "`", ARRAY_A );
457 if( ! empty( $data ) ) {
458 foreach( $data as $rel ) {
459 $usergroups[ (int) $rel['groupid'] ] = $rel['access'];
460 }
461 }
462
463 return $usergroups;
464 }
465
466 function set_ug_roles( $ug_role ) {
467 if( ! empty( $ug_role ) ) {
468 foreach( $ug_role as $usergroupid => $role ) {
469 $role = sanitize_text_field( $role );
470 WPF()->db->query( "UPDATE " . WPF()->tables->usergroups . " SET `role` = '" . esc_sql( $role ) . "' WHERE `groupid` = " . intval( $usergroupid ) );
471 }
472 }
473 }
474
475 function set_users_groupid( $groupid_userids ) {
476 $status = [ 'error' => 0, 'success' => false ];
477 if( ! empty( $groupid_userids ) ) {
478 foreach( $groupid_userids as $group_id => $user_ids ) {
479 if( $group_id && ! empty( $user_ids ) ) {
480 $userids = implode( ',', $user_ids );
481 $sql = "UPDATE " . WPF()->tables->profiles . " SET `groupid` = " . intval( $group_id ) . " WHERE `userid` IN(" . esc_sql( $userids ) . ")";
482 if( false === WPF()->db->query( $sql ) ) {
483 $status['error'] = WPF()->db->last_error;
484 $status['success'] = false;
485 break;
486 } else {
487 $status['success'] = true;
488 }
489 }
490 }
491 }
492 do_action( 'wpforo_set_users_groupid', $groupid_userids, $status );
493
494 return $status;
495 }
496
497 function build_users_groupid_array( $groupid_role_or_role_groupid, $users, $is_groupid_role = false ) {
498 $array = [];
499 $group_users = [];
500 $user_prime_group = [];
501 $user_second_groups = [];
502 if( ! empty( $users ) ) {
503 foreach( $users as $user ) {
504 if( ! empty( $user->roles ) ) {
505 foreach( $user->roles as $role ) {
506 //$ugids = wpforo_key( $usergroupid_role, $role, 'sort' );
507 $ugids = [];
508 if( !empty( $groupid_role_or_role_groupid ) ){
509 if( ! $is_groupid_role ){
510 foreach ( $groupid_role_or_role_groupid as $_role => $_groupid ){
511 if( $_role === $role ){
512 $ugids[] = $_groupid;
513 }
514 }
515 } else {
516 foreach ( $groupid_role_or_role_groupid as $_groupid => $_role ){
517 if( $_role === $role ){
518 $ugids[] = $_groupid;
519 }
520 }
521 }
522 }
523 sort( $ugids );
524
525 $ug_count = count( $ugids );
526 if( ! empty( $ugids ) ) {
527 foreach( $ugids as $ugid ) {
528 // The count of $ug_count === 1 means the user role is synced,
529 // it has one unique usergroup.
530 if( $ug_count === 1 ) {
531 if( ! isset( $user_prime_group[ $user->ID ] ) ) {
532 $user_prime_group[ $user->ID ][] = $ugid;
533 $group_users[ $ugid ][] = intval( $user->ID );
534 } else {
535 $user_second_groups[ $user->ID ][] = $ugid;
536 }
537 }
538 }
539 }
540 }
541 }
542 }
543 }
544 $array['group_users'] = $group_users;
545 $array['user_prime_group'] = $user_prime_group;
546 $array['user_second_groups'] = $user_second_groups;
547
548 return $array;
549 }
550
551 public function after_add_edit_usergroup( $group ) {
552 if( wpforo_setting( 'authorization', 'role_synch' ) ) {
553 $limit = apply_filters( 'wpforo_synch_roles_users_limit', 5000 );
554 $users = get_users( [ 'role' => $group['role'], 'number' => $limit ] );
555 if( ! empty( $users ) ) {
556 if( count( $users ) <= $limit ) {
557 $status = wpforo_synch_role( [ $group['groupid'] => $group['role'] ], $users );
558 wpforo_clean_cache( 'user' );
559 if( $error = wpfval( $status, 'error' ) ) {
560 WPF()->notice->add( $error, 'error' );
561 }
562 } else {
563 WPF()->notice->add( 'Please make sure you don\'t have not-synched Roles in the "User Roles" table below, then click on the [Synchronize] button to update users Usergroup IDs.', 'error' );
564 }
565 }
566 }
567 }
568
569 public function can( $do, $groupids = null ) {
570 if( is_null( $groupids ) ) {
571 if( current_user_can( 'administrator' ) ) return 1;
572 $groupids = WPF()->current_user_groupids;
573 }
574
575 if( $groupids = array_map( 'intval', (array) $groupids ) ) {
576 foreach( $groupids as $groupid ) {
577 if( $groupid ) {
578 $group = $this->get_usergroup( $groupid );
579 if( wpfval( $group, 'cans' ) ){
580 $group_cans = unserialize( $group['cans'] );
581 if( (int) wpfval( $group_cans, $do ) ) return 1;
582 }
583 }
584 }
585 }
586
587 return 0;
588 }
589
590 public function get_groupids_by_can( $do ) {
591 $usergroupids = [];
592 $usergroups = $this->get_usergroups();
593 foreach( $usergroups as $usergroup ) {
594 $cans = unserialize( $usergroup['cans'] );
595 if( isset( $cans[ $do ] ) && $cans[ $do ] ) {
596 $usergroupids[] = $usergroup['groupid'];
597 }
598 }
599
600 return $usergroupids;
601 }
602
603 public function can_manage_forum( $groupids = null ) {
604 return ( $this->can( 'cf', $groupids ) && $this->can( 'ef', $groupids ) && $this->can( 'df', $groupids ) ) || $this->can( 'mf', $groupids );
605 }
606
607 public function set_default( $groupid ) {
608 if( in_array( intval($groupid), [1,4], true ) ) return false;
609 if( WPF()->db->update(
610 WPF()->tables->usergroups,
611 ['is_default' => 1],
612 ['groupid' => $groupid],
613 ['%d'],
614 ['%d']
615 )){
616 return false !== WPF()->db->query( WPF()->db->prepare(
617 "UPDATE `" . WPF()->tables->usergroups . "` SET `is_default` = 0 WHERE `groupid` <> %d",
618 $groupid
619 ));
620 }
621
622 return false;
623 }
624
625 public function get_default_groupid( $default_groupid ){
626 $groupid = (int) WPF()->db->get_var(
627 "SELECT `groupid` FROM `" . WPF()->tables->usergroups . "` WHERE `is_default` = 1 ORDER BY `groupid` DESC"
628 );
629 if( !$groupid ) $groupid = $default_groupid;
630
631 return $groupid;
632 }
633 }
634