wenpai.org/wp-content/plugins/bbp-style-pack/modtools/moderation.php
2024-06-21 23:57:39 +08:00

328 lines
10 KiB
PHP

<?php
class bspbbPressModToolsPlugin_Moderation extends bspbbPressModToolsPlugin {
public static function init() {
$self = new self();
// Moderate the post and mark as awaiting approval
add_filter( 'bbp_new_topic_pre_insert', array( $self, 'moderate_post' ) );
add_filter( 'bbp_edit_topic_pre_insert', array( $self, 'moderate_post' ) );
add_filter( 'bbp_new_reply_pre_insert', array( $self, 'moderate_post' ) );
add_filter( 'bbp_edit_reply_pre_insert', array( $self, 'moderate_post' ) );
// Trigger action processing
add_action( 'init', array( $self, 'handle_actions' ) );
}
/**
* Mark topics and replies as awaiting moderation
*
* @since 0.1.0
* @since 1.0.0 Added english detection and expanded logic to allow multiple rules
*
* @param INT $post_id
*/
public function moderate_post( $post ) {
global $wpdb;
$pending = false;
// Check if the topic is a reply or topic
if ( 'reply' != $post['post_type'] && 'topic' != $post['post_type'] ) {
return $post;
}
// Skip moderation if the post is marked as spam
if ( 'spam' == $post['post_status'] ) {
return $post;
}
// Skip moderation if the user has moderation power
if ( $this->user_can_moderate() ) {
return $post;
}
// Check if any moderation type is set, if not or is off return the post as is.
$moderation_type = get_option( '_bbp_moderation_type' );
if ( empty( $moderation_type ) || 'off' == $moderation_type ) {
return $post;
}
// Check if we should be moderating the topic or reply
$moderation_post_types = get_option( '_bbp_moderation_post_types' );
if ( ! is_array( $moderation_post_types ) or ! in_array( $post['post_type'], $moderation_post_types ) ) {
return $post;
}
// If the moderation type is set to 'all', set post status to pending and return $post
if ( ! empty( $moderation_type ) && 'all' == $moderation_type ) {
$pending = true;
}
// If user is flagged for moderation
if ( get_user_meta( $post['post_author'], '_bbp_moderation_flagged', true ) ) {
$pending = true;
}
// If moderation type is custom, run valid checks
if ( ! empty( $moderation_type ) && 'custom' == $moderation_type ) {
$test_content = htmlspecialchars_decode( stripslashes( $post['post_content'] ) );
$test_title = htmlspecialchars_decode( stripslashes( $post['post_title'] ) );
$custom_moderation_options = get_option( '_bbp_moderation_custom' );
// Check if anon/guest posts are allowed and if the user is a guest
if ( ! empty( $custom_moderation_options ) && in_array( 'anon', $custom_moderation_options ) ) {
if ( $post['post_author'] === 0 ) {
$pending = true;
}
}
// Run the ascii english detection check
if ( ! empty( $custom_moderation_options ) && ( in_array( 'ascii', $custom_moderation_options ) || in_array( 'ascii_unnaproved', $custom_moderation_options ) ) ) {
$ascii_approved = get_user_meta( $post['post_author'], '_ascii_moderation_approved', true );
if ( ! $ascii_approved ) {
$english_arr = array();
$non_english_arr = array();
$len = strlen( $test_content );
for ($i = 0; $i < $len; $i++) {
$ord = ord( $test_content[$i] );
if ( $ord == 10 || $ord == 32 || $ord == 194 || $ord == 163 ) {
} else if ( $ord > 127 ) {
$non_english_arr[] = $ord;
} else {
$english_arr[] = $ord;
}
}
$len = strlen( $test_title );
for ($i = 0; $i < $len; $i++) {
$ord = ord( $test_title[$i] );
if ( $ord == 10 || $ord == 32 || $ord == 194 || $ord == 163 ) {
} else if ( $ord > 127 ) {
$non_english_arr[] = $ord;
} else {
$english_arr[] = $ord;
}
}
$english_percent = ( count( $english_arr ) / ( count( $non_english_arr ) + count( $english_arr ) ) ) * 100 ;
$bbp_moderation_english_threshold = get_option( '_bbp_moderation_english_threshold');
$english_threshold = ! empty( $bbp_moderation_english_threshold ) ? $bbp_moderation_english_threshold : 70;
if ( (int) $english_percent < (int) $english_threshold ) {
$pending = true;
}
}
}
// Moderate posts with links
if ( ! empty( $custom_moderation_options ) && in_array( 'links', $custom_moderation_options ) ) {
// Check if user has not had a previous post with a link approved
if ( ! get_user_meta( $post['post_author'], '_link_moderation_approved', TRUE ) ) {
// Check for a link in the post content
$pattern = '#(https?\://)?(www\.)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?#';
if ( preg_match( $pattern, $post['post_content'] ) or preg_match( $pattern, $post['post_title'] ) ) {
$pending = true;
}
}
}
// Moderate first post if user is logged in
if ( $post['post_author'] > 0 ) {
if ( ! empty( $custom_moderation_options ) && in_array( 'users', $custom_moderation_options ) ) {
// Check if user has any published posts
$sql = $wpdb->prepare( "SELECT COUNT( ID ) FROM {$wpdb->posts} WHERE post_author = %d AND post_type IN ('topic','reply') AND post_status = 'publish'", $post['post_author'] );
$count = $wpdb->get_var( $sql );
if ( $count < 1 ) {
$pending = true;
}
}
}
}
$pending = apply_filters( 'bbp_modtools_moderate_post', $pending, $post );
if ( $pending ) {
$post['post_status'] = 'pending';
}
return $post;
}
/**
* Handle actions
*
* @since 1.1.0
*
*/
public function handle_actions() {
if ( ! isset( $_GET[$this->plugin_slug . '-wp_nonce'] ) or ! wp_verify_nonce( $_GET[$this->plugin_slug . '-wp_nonce'], 'moderator_action' ) )
return;
if ( ! isset( $_GET['action'] ) )
return;
switch ( $_GET['action'] ) {
case $this->plugin_slug . '-approve':
case $this->plugin_slug . '-remove':
$this->handle_moderation_action( $_GET['action'] );
break;
case $this->plugin_slug . '-block_user':
case $this->plugin_slug . '-unblock_user':
$this->handle_block_action( $_GET['action'] );
break;
case $this->plugin_slug . '-add_moderation_flag':
case $this->plugin_slug . '-remove_moderation_flag':
$this->handle_moderation_flag_action( $_GET['action'] );
break;
}
}
/**
* Handle moderator actions
*
* @since 0.1.0
* @since 1.0.0 moved flag setting and added actions to handle flag in preperation for bbPress 2.6
*
*/
public function handle_moderation_action( $action ) {
if ( ! $this->user_can_moderate() ) {
return;
}
if ( isset( $_GET['topic_id'] ) ) {
$post_id = absint( filter_var( $_GET['topic_id'], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
} else if ( isset( $_GET['reply_id'] ) ) {
$post_id = absint( filter_var( $_GET['reply_id'], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
}
$post = get_post( $post_id );
if ( empty( $post ) ) {
return;
}
if ( $action == $this->plugin_slug . '-approve' ) {
// Execute pre pending code
if ( 'topic' == $post->post_type ) {
do_action( 'bbp_approve_topic', $post->ID );
} else if ( 'reply' == $post->post_type ) {
do_action( 'bbp_approve_reply', $post->ID );
}
wp_update_post( array(
'ID' => $post->ID,
'post_status' => 'publish',
) );
// Execute post pending code
if ( 'topic' == $post->post_type ) {
$forum_id = bbp_get_topic_forum_id( $post->ID );
do_action( 'bbp_approved_topic', $post->ID );
do_action( 'bbp_new_topic', $post->ID, $forum_id, 0, $post->post_author );
} else if ( 'reply' == $post->post_type ) {
$topic_id = bbp_get_reply_topic_id( $post->ID );
$forum_id = bbp_get_topic_forum_id( $topic_id );
$reply_to = (int) get_post_meta( $post->ID, '_bbp_reply_to', true );
$bbp_reply_count = get_post_meta( $topic_id, '_bbp_reply_count', true );
$bbp_last_reply_id = get_post_meta( $topic_id, '_bbp_last_reply_id', true );
$bbp_last_active_id = get_post_meta( $topic_id, '_bbp_last_active_id', true );
$bbp_last_active_time = get_post_meta( $topic_id, '_bbp_last_active_time', true );
do_action( 'bbp_approved_reply', $post->ID );
do_action( 'bbp_new_reply', $post->ID, $topic_id, $forum_id, 0, $post->post_author, true, $reply_to );
// If this isn't the last reply, reset topic freshness to previous state
if ( $post->menu_order != $bbp_reply_count ) {
update_post_meta( $topic_id, '_bbp_last_reply_id', $bbp_last_reply_id );
update_post_meta( $topic_id, '_bbp_last_active_id', $bbp_last_active_id );
update_post_meta( $topic_id, '_bbp_last_active_time', $bbp_last_active_time );
}
}
} elseif ( $action == $this->plugin_slug . '-remove' ) {
wp_update_post( array(
'ID' => $post->ID,
'post_status' => 'pending',
));
}
if ( $post->post_type == 'reply' ) {
wp_redirect( remove_query_arg( array( 'reply_id', 'topic_id', 'action', $this->plugin_slug . '-wp_nonce' ), $_SERVER['REQUEST_URI'] ) );
} else {
wp_redirect( site_url( '?post_type=' . $post->post_type . '&p=' . $post->ID ) );
}
exit;
}
/**
* Handle block actions
*
* @since 1.1.0
*
*/
public function handle_block_action( $action ) {
if ( ! isset( $_GET['author_id'] ) ) {
return;
}
$author_id = absint( filter_var( $_GET['author_id'], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
if ( $action == $this->plugin_slug . '-block_user' ) {
bbp_set_user_role( $author_id, 'bbp_blocked' );
}
if ( $action == $this->plugin_slug . '-unblock_user' ) {
bbp_set_user_role( $author_id, 'bbp_participant' );
}
}
/**
* Handle moderation flag actions
*
* @since 1.2.0
*
*/
public function handle_moderation_flag_action( $action ) {
if ( ! isset( $_GET['author_id'] ) ) {
return;
}
$author_id = absint( filter_var( $_GET['author_id'], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
if ( $action == $this->plugin_slug . '-add_moderation_flag' ) {
update_user_meta( $author_id, '_bbp_moderation_flagged', 1 );
}
if ( $action == $this->plugin_slug . '-remove_moderation_flag' ) {
delete_user_meta( $author_id, '_bbp_moderation_flagged' );
}
}
}
bspbbPressModToolsPlugin_Moderation::init();