| @@ -1671,9 +1671,9 @@ | ||
| 1671 | 1671 | 'user_info' => $user_info, |
| 1672 | 1672 | 'forum' => $context['forum'] ?? null, |
| 1673 | 1673 | 'board_id' => $this->board_id, |
| 1674 | 1674 | 'settings' => $this->settings, |
| 1675 | - 'timestamp' => current_time( 'mysql' ), | |
| 1675 | + 'timestamp' => current_time( 'mysql', true ), // UTC for timezone conversion | |
| 1676 | 1676 | ]; |
| 1677 | 1677 | } |
| 1678 | 1678 | |
| 1679 | 1679 | /** |
| @@ -1722,14 +1722,23 @@ | ||
| 1722 | 1722 | // Get display name |
| 1723 | 1723 | $user = get_userdata( $userid ); |
| 1724 | 1724 | $display_name = $user ? $user->display_name : 'User'; |
| 1725 | 1725 | |
| 1726 | + // Get user's group IDs for permission checks (primary + secondary) | |
| 1727 | + $user_groupids = []; | |
| 1728 | + if ( ! empty( $member['groupid'] ) ) { | |
| 1729 | + $user_groupids[] = (int) $member['groupid']; | |
| 1730 | + } | |
| 1731 | + if ( ! empty( $member['secondary_groupids'] ) ) { | |
| 1732 | + $user_groupids = array_merge( $user_groupids, array_map( 'intval', (array) $member['secondary_groupids'] ) ); | |
| 1733 | + } | |
| 1734 | + | |
| 1726 | 1735 | return [ |
| 1727 | 1736 | 'is_guest' => false, |
| 1728 | 1737 | 'is_new' => $post_count < $new_user_threshold, |
| 1729 | 1738 | 'is_trusted' => $trust_level >= 3, // Trusted Member level |
| 1730 | - 'is_moderator' => WPF()->usergroup->can( 'em' ), // Edit members permission | |
| 1731 | - 'is_admin' => WPF()->usergroup->can( 'ms' ), // Manage settings permission | |
| 1739 | + 'is_moderator' => ! empty( $user_groupids ) && WPF()->usergroup->can( 'em', $user_groupids ), // Edit members permission | |
| 1740 | + 'is_admin' => ! empty( $user_groupids ) && WPF()->usergroup->can( 'ms', $user_groupids ), // Manage settings permission | |
| 1732 | 1741 | 'post_count' => $post_count, |
| 1733 | 1742 | 'trust_level' => $trust_level, |
| 1734 | 1743 | 'points' => $points, |
| 1735 | 1744 | 'status' => $member['status'] ?? 'active', |
| @@ -2849,16 +2858,24 @@ | ||
| 2849 | 2858 | if ( ! $userid ) { |
| 2850 | 2859 | return false; |
| 2851 | 2860 | } |
| 2852 | 2861 | |
| 2853 | - // Admins are always exempt | |
| 2854 | - if ( WPF()->usergroup->can( 'ms' ) ) { // Manage settings = admin | |
| 2855 | - return true; | |
| 2862 | + // Get user's group IDs (primary + secondary) | |
| 2863 | + $member = WPF()->member->get_member( $userid ); | |
| 2864 | + $user_groupids = []; | |
| 2865 | + if ( ! empty( $member['groupid'] ) ) { | |
| 2866 | + $user_groupids[] = (int) $member['groupid']; | |
| 2856 | 2867 | } |
| 2868 | + if ( ! empty( $member['secondary_groupids'] ) ) { | |
| 2869 | + $user_groupids = array_merge( $user_groupids, array_map( 'intval', (array) $member['secondary_groupids'] ) ); | |
| 2870 | + } | |
| 2857 | 2871 | |
| 2858 | - // Check if moderators are exempt (configurable) | |
| 2859 | - $moderators_exempt = apply_filters( 'wpforo_ai_moderation_moderators_exempt', true ); | |
| 2860 | - if ( $moderators_exempt && WPF()->usergroup->can( 'em' ) ) { // Edit members = moderator | |
| 2872 | + if ( empty( $user_groupids ) ) { | |
| 2873 | + return false; | |
| 2874 | + } | |
| 2875 | + | |
| 2876 | + // Admins and moderators are exempt (em permission covers both) | |
| 2877 | + if ( WPF()->usergroup->can( 'em', $user_groupids ) ) { | |
| 2861 | 2878 | return true; |
| 2862 | 2879 | } |
| 2863 | 2880 | |
| 2864 | 2881 | return false; |
| @@ -2938,9 +2955,9 @@ | ||
| 2938 | 2955 | 'context_used' => 0, |
| 2939 | 2956 | 'indexed_topics_count' => 0, |
| 2940 | 2957 | 'detection_time_ms' => 0, |
| 2941 | 2958 | 'content_preview' => null, |
| 2942 | - 'created' => current_time( 'mysql' ), | |
| 2959 | + 'created' => current_time( 'mysql', true ), // UTC for timezone conversion | |
| 2943 | 2960 | ]; |
| 2944 | 2961 | |
| 2945 | 2962 | $data = wp_parse_args( $data, $defaults ); |
| 2946 | 2963 | |
| @@ -3233,9 +3250,9 @@ | ||
| 3233 | 3250 | $result = $wpdb->update( |
| 3234 | 3251 | WPF()->tables->ai_moderation, |
| 3235 | 3252 | [ |
| 3236 | 3253 | 'reviewed_by' => $reviewer_id, |
| 3237 | - 'reviewed_at' => current_time( 'mysql' ), | |
| 3254 | + 'reviewed_at' => current_time( 'mysql', true ), // UTC for timezone conversion | |
| 3238 | 3255 | 'review_action' => $action, |
| 3239 | 3256 | 'review_notes' => $notes, |
| 3240 | 3257 | ], |
| 3241 | 3258 | [ 'id' => $id ], |