function bb_delete_topic($topic_id, $new_status = 0)
{
    global $bbdb;
    $topic_id = (int) $topic_id;
    add_filter('get_topic_where', 'bb_no_where');
    if ($topic = get_topic($topic_id)) {
        $new_status = (int) $new_status;
        $old_status = (int) $topic->topic_status;
        if ($new_status == $old_status) {
            return;
        }
        $thread_args = array('per_page' => -1, 'order' => 'DESC');
        if (0 != $old_status && 0 == $new_status) {
            $thread_args['post_status'] = 'all';
        }
        $poster_ids = array();
        $posts = get_thread($topic_id, $thread_args);
        if ($posts && count($posts)) {
            foreach ($posts as $post) {
                _bb_delete_post($post->post_id, $new_status);
                $poster_ids[] = $post->poster_id;
            }
        }
        if (count($poster_ids)) {
            foreach (array_unique($poster_ids) as $id) {
                if ($user = bb_get_user($id)) {
                    $topics_replied_key = $bbdb->prefix . 'topics_replied';
                    bb_update_usermeta($user->ID, $topics_replied_key, $old_status ? $user->{$topics_replied_key} + 1 : $user->{$topics_replied_key} - 1);
                }
            }
        }
        if ($ids = $bbdb->get_col("SELECT user_id, meta_value FROM {$bbdb->usermeta} WHERE meta_key = 'favorites' and FIND_IN_SET('{$topic_id}', meta_value) > 0")) {
            foreach ($ids as $id) {
                bb_remove_user_favorite($id, $topic_id);
            }
        }
        switch ($new_status) {
            case 0:
                // Undeleting
                $bbdb->update($bbdb->topics, array('topic_status' => $new_status), compact('topic_id'));
                $topic_posts = (int) $bbdb->get_var($bbdb->prepare("SELECT COUNT(*) FROM {$bbdb->posts} WHERE topic_id = %d AND post_status = 0", $topic_id));
                $all_posts = (int) $bbdb->get_var($bbdb->prepare("SELECT COUNT(*) FROM {$bbdb->posts} WHERE topic_id = %d", $topic_id));
                bb_update_topicmeta($topic_id, 'deleted_posts', $all_posts - $topic_posts);
                $bbdb->query($bbdb->prepare("UPDATE {$bbdb->forums} SET topics = topics + 1, posts = posts + %d WHERE forum_id = %d", $topic_posts, $topic->forum_id));
                $bbdb->update($bbdb->topics, compact('topic_posts'), compact('topic_id'));
                bb_topic_set_last_post($topic_id);
                bb_update_post_positions($topic_id);
                break;
            default:
                // Other statuses (like Delete and Bozo)
                bb_remove_topic_tags($topic_id);
                $bbdb->update($bbdb->topics, array('topic_status' => $new_status, 'tag_count' => 0), compact('topic_id'));
                $bbdb->query($bbdb->prepare("UPDATE {$bbdb->forums} SET topics = topics - 1, posts = posts - %d WHERE forum_id = %d", $topic->topic_posts, $topic->forum_id));
                break;
        }
        do_action('bb_delete_topic', $topic_id, $new_status, $old_status);
        wp_cache_delete($topic_id, 'bb_topic');
        wp_cache_delete($topic->topic_slug, 'bb_topic_slug');
        wp_cache_delete($topic_id, 'bb_thread');
        wp_cache_delete($topic->forum_id, 'bb_forum');
        wp_cache_flush('bb_forums');
        wp_cache_flush('bb_query');
        wp_cache_flush('bb_cache_posts_post_ids');
        return $topic_id;
    } else {
        return false;
    }
}
function bb_delete_post($post_id, $new_status = 0)
{
    global $bbdb, $topic, $bb_post;
    $post_id = (int) $post_id;
    $bb_post = bb_get_post($post_id);
    $new_status = (int) $new_status;
    $old_status = (int) $bb_post->post_status;
    add_filter('get_topic_where', 'bb_no_where');
    $topic = get_topic($bb_post->topic_id);
    $topic_id = (int) $topic->topic_id;
    if ($bb_post) {
        $uid = (int) $bb_post->poster_id;
        if ($new_status == $old_status) {
            return;
        }
        _bb_delete_post($post_id, $new_status);
        if (0 == $old_status) {
            bb_update_topicmeta($topic_id, 'deleted_posts', $topic->deleted_posts + 1);
            $bbdb->query($bbdb->prepare("UPDATE {$bbdb->forums} SET posts = posts - 1 WHERE forum_id = %d", $topic->forum_id));
        } else {
            if (0 == $new_status) {
                bb_update_topicmeta($topic_id, 'deleted_posts', $topic->deleted_posts - 1);
                $bbdb->query($bbdb->prepare("UPDATE {$bbdb->forums} SET posts = posts + 1 WHERE forum_id = %d", $topic->forum_id));
            }
        }
        $posts = (int) $bbdb->get_var($bbdb->prepare("SELECT COUNT(*) FROM {$bbdb->posts} WHERE topic_id = %d AND post_status = 0", $topic_id));
        $bbdb->update($bbdb->topics, array('topic_posts' => $posts), compact('topic_id'));
        if (0 == $posts) {
            if (0 == $topic->topic_status || 1 == $new_status) {
                bb_delete_topic($topic_id, $new_status);
            }
        } else {
            if (0 != $topic->topic_status) {
                $bbdb->update($bbdb->topics, array('topic_status' => 0), compact('topic_id'));
                $bbdb->query($bbdb->prepare("UPDATE {$bbdb->forums} SET topics = topics + 1 WHERE forum_id = %d", $topic->forum_id));
            }
            bb_topic_set_last_post($topic_id);
            bb_update_post_positions($topic_id);
            bb_update_topic_voices($topic_id);
        }
        $user = bb_get_user($uid);
        $user_posts = new BB_Query('post', array('post_author_id' => $user->ID, 'topic_id' => $topic_id));
        if ($new_status && !$user_posts->results) {
            $topics_replied_key = $bbdb->prefix . 'topics_replied';
            bb_update_usermeta($user->ID, $topics_replied_key, $user->{$topics_replied_key} - 1);
        }
        nxt_cache_delete($topic_id, 'bb_topic');
        nxt_cache_delete($topic_id, 'bb_thread');
        nxt_cache_flush('bb_forums');
        nxt_cache_flush('bb_query');
        nxt_cache_flush('bb_cache_posts_post_ids');
        do_action('bb_delete_post', $post_id, $new_status, $old_status);
        return $post_id;
    } else {
        return false;
    }
}