379 lines
12 KiB
PHP
379 lines
12 KiB
PHP
<?php
|
|
/*
|
|
Plugin Name: Bozo Users
|
|
Plugin URI: http://bbpress.org/
|
|
Description: Allows moderators to mark certain users as a "bozo". Bozo users can post, but their content is only visible to themselves.
|
|
Author: Michael Adams
|
|
Version: 1.1
|
|
Author URI: http://blogwaffe.com/
|
|
*/
|
|
|
|
function bb_bozo_posts( $where ) {
|
|
if ( !$id = bb_get_current_user_info( 'id' ) )
|
|
return $where;
|
|
|
|
return preg_replace(
|
|
'/(\w+\.)?post_status = ["\']?0["\']?/',
|
|
"( \\1post_status = 0 OR \\1post_status > 1 AND \\1poster_id = '$id' )",
|
|
$where);
|
|
}
|
|
|
|
function bb_bozo_topics( $where ) {
|
|
if ( !$id = bb_get_current_user_info( 'id' ) )
|
|
return $where;
|
|
|
|
return preg_replace(
|
|
'/(\w+\.)?topic_status = ["\']?0["\']?/',
|
|
"( \\1topic_status = 0 OR \\1topic_status > 1 AND \\1topic_poster = '$id' )",
|
|
$where);
|
|
}
|
|
|
|
// Gets those users with the bozo bit. Does not grab users who have been bozoed on a specific topic.
|
|
// NOT bbdb::prepared
|
|
function bb_get_bozos( $page = 1 ) {
|
|
global $bbdb, $bb_last_countable_query;
|
|
$page = (int) $page;
|
|
$limit = (int) bb_get_option('page_topics');
|
|
if ( 1 < $page )
|
|
$limit = ($limit * ($page - 1)) . ", $limit";
|
|
$bb_last_countable_query = "SELECT user_id FROM $bbdb->usermeta WHERE meta_key='is_bozo' AND meta_value='1' ORDER BY umeta_id DESC LIMIT $limit";
|
|
if ( $ids = (array) $bbdb->get_col( $bb_last_countable_query ) )
|
|
bb_cache_users( $ids );
|
|
return $ids;
|
|
}
|
|
|
|
function bb_current_user_is_bozo( $topic_id = false ) {
|
|
global $bb_current_user;
|
|
if ( bb_current_user_can('browse_deleted') && 'all' == @$_GET['view'] )
|
|
return false;
|
|
$is_bozo = isset($bb_current_user->data->is_bozo) && $bb_current_user->data->is_bozo;
|
|
if ( !$topic_id || $is_bozo )
|
|
return $is_bozo;
|
|
|
|
global $topic;
|
|
$topic = get_topic( $topic_id );
|
|
$id = bb_get_current_user_info( 'id' );
|
|
return isset($topic->bozos[$id]) && $topic->bozos[$id];
|
|
}
|
|
|
|
function bb_bozo_pre_permalink() {
|
|
if ( bb_is_topic() )
|
|
add_filter( 'get_topic_where', 'bb_bozo_topics' );
|
|
}
|
|
|
|
function bb_bozo_post_permalink() {
|
|
if ( bb_is_topic() )
|
|
remove_filter( 'get_topic_where', 'bb_bozo_topics' );
|
|
}
|
|
|
|
function bb_bozo_latest_filter() {
|
|
global $bb_current_user;
|
|
if ( isset($bb_current_user->data->bozo_topics) && $bb_current_user->data->bozo_topics )
|
|
add_filter( 'get_latest_topics_where', 'bb_bozo_topics' );
|
|
}
|
|
|
|
function bb_bozo_topic_db_filter() {
|
|
global $topic, $topic_id;
|
|
if ( bb_current_user_is_bozo( $topic->topic_id ? $topic->topic_id : $topic_id ) ) {
|
|
add_filter( 'get_thread_where', 'bb_bozo_posts' );
|
|
add_filter( 'get_thread_post_ids_where', 'bb_bozo_posts' );
|
|
}
|
|
}
|
|
|
|
function bb_bozo_profile_db_filter() {
|
|
global $user;
|
|
if ( bb_get_current_user_info( 'id' ) == $user->ID && @is_array($user->bozo_topics) )
|
|
add_filter( 'get_recent_user_replies_where', 'bb_bozo_posts' );
|
|
}
|
|
|
|
function bb_bozo_recount_topics() {
|
|
global $bbdb;
|
|
global $messages;
|
|
if ( isset($_POST['topic-bozo-posts']) && 1 == $_POST['topic-bozo-posts'] ):
|
|
$old = (array) $bbdb->get_col("SELECT object_id FROM $bbdb->meta WHERE object_type = 'bb_topic' AND meta_key = 'bozos'");
|
|
$old = array_flip($old);
|
|
$messages[] = __('Counted the number of bozo posts in each topic');
|
|
if ( $topics = (array) $bbdb->get_col("SELECT topic_id, poster_id, COUNT(post_id) FROM $bbdb->posts WHERE post_status > 1 GROUP BY topic_id, poster_id") ) :
|
|
$unique_topics = array_unique($topics);
|
|
$posters = (array) $bbdb->get_col('', 1);
|
|
$counts = (array) $bbdb->get_col('', 2);
|
|
foreach ($unique_topics as $i):
|
|
$bozos = array();
|
|
$indices = array_keys($topics, $i);
|
|
foreach ( $indices as $index )
|
|
$bozos[(int) $posters[$index]] = (int) $counts[$index];
|
|
if ( $bozos ) :
|
|
bb_update_topicmeta( $i, 'bozos', $bozos );
|
|
unset($indices, $index, $old[$i]);
|
|
endif;
|
|
endforeach;
|
|
unset($topics, $i, $counts, $posters, $bozos);
|
|
endif;
|
|
if ( $old ) :
|
|
$old = join(',', array_map('intval', array_flip($old)));
|
|
$bbdb->query("DELETE FROM $bbdb->meta WHERE object_type = 'bb_topic' AND object_id IN ($old) AND meta_key = 'bozos'");
|
|
endif;
|
|
endif;
|
|
}
|
|
|
|
function bb_bozo_recount_users() {
|
|
global $bbdb;
|
|
global $messages;
|
|
if ( isset($_POST['topics-replied-with-bozos']) && 1 == $_POST['topics-replied-with-bozos'] ) :
|
|
$messages[] = __('Counted each bozo user's total posts as well as the total topics to which they have replied');
|
|
if ( $users = (array) $bbdb->get_col("SELECT ID FROM $bbdb->users") ) :
|
|
$no_bozos = array();
|
|
$bozo_mkey = $bbdb->prefix . 'bozo_topics';
|
|
foreach ( $users as $user ) :
|
|
$topics_replied = (int) $bbdb->get_var( $bbdb->prepare(
|
|
"SELECT COUNT(DISTINCT topic_id) FROM $bbdb->posts WHERE post_status = 0 AND poster_id = %d",
|
|
$user
|
|
) );
|
|
bb_update_usermeta( $user, $bbdb->prefix. 'topics_replied', $topics_replied );
|
|
$bozo_keys = (array) $bbdb->get_col( $bbdb->prepare(
|
|
"SELECT topic_id, COUNT(post_id) FROM $bbdb->posts WHERE post_status > 1 AND poster_id = %d GROUP BY topic_id",
|
|
$user
|
|
) );
|
|
$bozo_values = (array) $bbdb->get_col('', 1);
|
|
if ( $c = count($bozo_keys) ) :
|
|
for ( $i=0; $i < $c; $i++ )
|
|
$bozo_topics[(int) $bozo_keys[$i]] = (int) $bozo_values[$i];
|
|
bb_update_usermeta( $user, $bozo_mkey, $bozo_topics );
|
|
else :
|
|
$no_bozos[] = (int) $user;
|
|
endif;
|
|
endforeach;
|
|
if ( $no_bozos ) :
|
|
$no_bozos = join(',', $no_bozos);
|
|
$bbdb->query( $bbdb->prepare(
|
|
"DELETE FROM $bbdb->usermeta WHERE user_id IN ($no_bozos) AND meta_key = %s",
|
|
$bozo_mkey
|
|
) );
|
|
endif;
|
|
unset($users, $user, $topics_replied, $bozo_keys, $bozo_values, $bozo_topics);
|
|
endif;
|
|
endif;
|
|
}
|
|
|
|
function bb_bozo_post_del_class( $classes, $post_id, $post )
|
|
{
|
|
if ( 1 < $post->post_status && bb_current_user_can('browse_deleted') ) {
|
|
if ( $classes ) {
|
|
return $classes . ' bozo';
|
|
}
|
|
return 'bozo';
|
|
}
|
|
return $classes;
|
|
}
|
|
|
|
function bb_bozo_add_recount_list() {
|
|
global $recount_list;
|
|
$recount_list[21] = array('topics-replied-with-bozos', __('Count each bozo user's total posts as well as the total topics to which they have replied'), 'bb_bozo_recount_users');
|
|
$recount_list[22] = array('topic-bozo-posts', __('Count the number of bozo posts in each topic'), 'bb_bozo_recount_topics');
|
|
return;
|
|
}
|
|
|
|
function bb_bozo_topic_pages_add( $add ) {
|
|
global $topic;
|
|
if ( isset($_GET['view']) && 'all' == $_GET['view'] && bb_current_user_can('browse_deleted') ) :
|
|
$add += @array_sum($topic->bozos);
|
|
endif;
|
|
if ( bb_current_user_is_bozo( $topic->topic_id ) )
|
|
$add += $topic->bozos[bb_get_current_user_info( 'id' )];
|
|
return $add;
|
|
}
|
|
|
|
function bb_bozo_get_topic_posts( $topic_posts ) {
|
|
global $topic;
|
|
if ( bb_current_user_is_bozo( $topic->topic_id ) )
|
|
$topic_posts += $topic->bozos[bb_get_current_user_info( 'id' )];
|
|
return $topic_posts;
|
|
}
|
|
|
|
function bb_bozo_new_post( $post_id ) {
|
|
$bb_post = bb_get_post( $post_id );
|
|
if ( 1 < $bb_post->post_status )
|
|
bb_bozon( $bb_post->poster_id, $bb_post->topic_id );
|
|
$topic = get_topic( $bb_post->topic_id, false );
|
|
if ( 0 == $topic->topic_posts )
|
|
bb_delete_topic( $topic->topic_id, 2 );
|
|
}
|
|
|
|
function bb_bozo_pre_post_status( $status, $post_id, $topic_id ) {
|
|
if ( !$post_id && bb_current_user_is_bozo() )
|
|
$status = 2;
|
|
elseif ( bb_current_user_is_bozo( $topic_id ) )
|
|
$status = 2;
|
|
return $status;
|
|
}
|
|
|
|
function bb_bozo_delete_post( $post_id, $new_status, $old_status ) {
|
|
$bb_post = bb_get_post( $post_id );
|
|
if ( 1 < $new_status && 2 > $old_status )
|
|
bb_bozon( $bb_post->poster_id, $bb_post->topic_id );
|
|
elseif ( 2 > $new_status && 1 < $old_status )
|
|
bb_fermion( $bb_post->poster_id, $bb_post->topic_id );
|
|
}
|
|
|
|
function bb_bozon( $user_id, $topic_id = 0 ) {
|
|
global $bbdb;
|
|
|
|
$user_id = (int) $user_id;
|
|
$topic_id = (int) $topic_id;
|
|
|
|
if ( !$topic_id )
|
|
bb_update_usermeta( $user_id, 'is_bozo', 1 );
|
|
else {
|
|
$topic = get_topic( $topic_id );
|
|
$user = bb_get_user( $user_id );
|
|
|
|
$bozo_topics_key = $bbdb->prefix . 'bozo_topics';
|
|
|
|
if ( isset($topic->bozos[$user_id]) )
|
|
$topic->bozos[$user_id]++;
|
|
elseif ( is_array($topic->bozos) )
|
|
$topic->bozos[$user_id] = 1;
|
|
else
|
|
$topic->bozos = array($user_id => 1);
|
|
bb_update_topicmeta( $topic_id, 'bozos', $topic->bozos );
|
|
|
|
if ( isset($user->{$bozo_topics_key}[$topic_id]) )
|
|
$user->{$bozo_topics_key}[$topic_id]++;
|
|
elseif ( is_array($user->bozo_topics) )
|
|
$user->{$bozo_topics_key}[$topic_id] = 1;
|
|
else
|
|
$user->$bozo_topics_key = array($topic_id => 1);
|
|
bb_update_usermeta( $user_id, $bozo_topics_key, $user->$bozo_topics_key );
|
|
}
|
|
}
|
|
|
|
function bb_fermion( $user_id, $topic_id = 0 ) {
|
|
global $bbdb;
|
|
|
|
$user_id = (int) $user_id;
|
|
$topic_id = (int) $topic_id;
|
|
|
|
if ( !$topic_id )
|
|
bb_delete_usermeta( $user_id, 'is_bozo' );
|
|
else {
|
|
$topic = get_topic( $topic_id );
|
|
$user = bb_get_user( $user_id );
|
|
|
|
$bozo_topics_key = $bbdb->prefix . 'bozo_topics';
|
|
|
|
if ( --$topic->bozos[$user_id] < 1 )
|
|
unset($topic->bozos[$user_id]);
|
|
bb_update_topicmeta( $topic_id, 'bozos', $topic->bozos );
|
|
|
|
if ( --$user->{$bozo_topics_key}[$topic_id] < 1 )
|
|
unset($user->{$bozo_topics_key}[$topic_id]);
|
|
bb_update_usermeta( $user_id, $bozo_topics_key, $user->$bozo_topics_key );
|
|
}
|
|
}
|
|
|
|
function bb_bozo_profile_admin_keys( $a ) {
|
|
$a['is_bozo'] = array(
|
|
0, // Required
|
|
__('This user is a bozo'), // Label
|
|
'checkbox', // Type
|
|
'1', // Value
|
|
'' // Default when not set
|
|
);
|
|
return $a;
|
|
}
|
|
|
|
|
|
|
|
function bb_bozo_get_bozo_user_ids()
|
|
{
|
|
global $bbdb;
|
|
$sql = "SELECT `user_id` FROM `$bbdb->usermeta` WHERE `meta_key` = 'is_bozo' AND `meta_value` = '1';";
|
|
$user_ids = $bbdb->get_col( $sql, 0 );
|
|
if ( is_wp_error( $user_ids ) || empty( $user_ids ) ) {
|
|
return false;
|
|
}
|
|
return $user_ids;
|
|
}
|
|
|
|
function bb_bozo_user_search_description( $description, $h2_search, $h2_role, $user_search_object )
|
|
{
|
|
if ( is_array( $user_search_object->roles ) && in_array( 'bozo', $user_search_object->roles ) ) {
|
|
return sprintf( '%1$s%2$s that are bozos', $h2_search, $h2_role );
|
|
}
|
|
return $description;
|
|
}
|
|
add_filter( 'bb_user_search_description', 'bb_bozo_user_search_description', 10, 4 );
|
|
|
|
function bb_bozo_user_search_form_add_inputs( $r, $user_search_object )
|
|
{
|
|
$checked = '';
|
|
if ( is_array( $user_search_object->roles ) && in_array( 'bozo', $user_search_object->roles ) ) {
|
|
$checked = ' checked="checked"';
|
|
}
|
|
|
|
$r .= "\t" . '<div>' . "\n";
|
|
$r .= "\t\t" . '<label for="userbozo">' . __('Bozos only') . '</label>' . "\n";
|
|
$r .= "\t\t" . '<div>' . "\n";
|
|
$r .= "\t\t\t" . '<input class="checkbox-input" type="checkbox" name="userrole[]" id="userbozo" value="bozo"' . $checked . ' />' . "\n";
|
|
$r .= "\t\t" . '</div>' . "\n";
|
|
$r .= "\t" . '</div>' . "\n";
|
|
|
|
return $r;
|
|
}
|
|
add_filter( 'bb_user_search_form_inputs', 'bb_bozo_user_search_form_add_inputs', 10, 2 );
|
|
|
|
function bb_bozo_user_search_role_user_ids( $role_user_ids, $roles, $args )
|
|
{
|
|
if ( !in_array( 'bozo', $roles ) ) {
|
|
return $role_user_ids;
|
|
}
|
|
|
|
$bozo_user_ids = bb_bozo_get_bozo_user_ids();
|
|
|
|
if ( 1 === count( $roles ) ) {
|
|
return $bozo_user_ids;
|
|
}
|
|
|
|
global $bbdb;
|
|
$role_meta_key = $bbdb->escape( $bbdb->prefix . 'capabilities' );
|
|
$role_sql_terms = array();
|
|
foreach ( $roles as $role ) {
|
|
if ( 'bozo' === $role ) {
|
|
continue;
|
|
}
|
|
$role_sql_terms[] = "`meta_value` LIKE '%" . $bbdb->escape( like_escape( $role ) ) . "%'";
|
|
}
|
|
$role_sql_terms = join( ' OR ', $role_sql_terms );
|
|
$role_sql = "SELECT `user_id` FROM `$bbdb->usermeta` WHERE `meta_key` = '$role_meta_key' AND ($role_sql_terms);";
|
|
$role_user_ids = $bbdb->get_col( $role_sql, 0 );
|
|
if ( is_wp_error( $role_user_ids ) || empty( $role_user_ids ) ) {
|
|
return array();
|
|
}
|
|
|
|
return array_intersect( $bozo_user_ids, $role_user_ids );
|
|
}
|
|
add_filter( 'bb_user_search_role_user_ids', 'bb_bozo_user_search_role_user_ids', 10, 3 );
|
|
|
|
|
|
|
|
|
|
add_filter( 'pre_post_status', 'bb_bozo_pre_post_status', 5, 3 );
|
|
add_action( 'bb_new_post', 'bb_bozo_new_post', 5 );
|
|
add_action( 'bb_delete_post', 'bb_bozo_delete_post', 5, 3 );
|
|
|
|
add_action( 'pre_permalink', 'bb_bozo_pre_permalink' );
|
|
add_action( 'post_permalink', 'bb_bozo_post_permalink' );
|
|
add_action( 'bb_index.php_pre_db', 'bb_bozo_latest_filter' );
|
|
add_action( 'bb_forum.php_pre_db', 'bb_bozo_latest_filter' );
|
|
add_action( 'bb_topic.php_pre_db', 'bb_bozo_topic_db_filter' );
|
|
add_action( 'bb_profile.php_pre_db', 'bb_bozo_profile_db_filter' );
|
|
|
|
add_action( 'bb_recount_list', 'bb_bozo_add_recount_list' );
|
|
add_action( 'topic_pages_add', 'bb_bozo_topic_pages_add' );
|
|
|
|
add_filter( 'post_del_class', 'bb_bozo_post_del_class', 10, 3 );
|
|
add_filter( 'get_topic_posts', 'bb_bozo_get_topic_posts' );
|
|
|
|
add_filter( 'get_profile_admin_keys', 'bb_bozo_profile_admin_keys' );
|
|
?>
|