Вход Регистрация
Файл: admin/applications/core/modules_admin/tools/rebuild.php
Строк: 1796
<?php
/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.3.3
 * Rebuild & Other Tools
 * Last Updated: $LastChangedDate: 2012-05-22 13:10:11 -0400 (Tue, 22 May 2012) $
 * </pre>
 *
 * @author         $Author: ips_terabyte $
 * @copyright    (c) 2001 - 2009 Invision Power Services, Inc.
 * @license        http://www.invisionpower.com/company/standards.php#license
 * @package        IP.Board
 * @subpackage    Core
 * @link        http://www.invisionpower.com
 * @version        $Rev: 10783 $
 */

if ( ! defined'IN_ACP' ) )
{
    print 
"<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'.";
    exit();
}

class 
admin_core_tools_rebuild  extends ipsCommand
{
    
/**
     * Skin object
     *
     * @var        object            Skin templates
     */
    
protected $html;

    
/**#@+
     * URL bits
     *
     * @var        string
     */
    
public $form_code        '';
    public 
$form_code_js    '';
    
/**#@-*/

    /**
     * Main class entry point
     *
     * @param    object        ipsRegistry reference
     * @return    @e void        [Outputs to screen]
     */
    
public function doExecuteipsRegistry $registry )
    {
        
$classToLoad IPSLib::loadLibraryIPS_ROOT_PATH 'applications/forums/sources/classes/forums/class_forums.php''class_forums''forums' );
        
$this->registry->setClass'class_forums', new $classToLoad$registry ) );
        
$this->registry->class_forums->forumsInit();

        
/* Load lang and skin */
        
$this->registry->class_localization->loadLanguageFile( array( 'admin_tools' ) );
        
$this->html $this->registry->output->loadTemplate'cp_skin_rebuild' );

        
/* URLs */
        
$this->form_code    $this->html->form_code    'module=tools&amp;section=rebuild';
        
$this->form_code_js $this->html->form_code_js 'module=tools&section=rebuild';

        
/* What to do */
        
switch( $this->request['do'] )
        {
            case 
'docount':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_recount' );
                
$this->doCount();
            break;

            case 
'doresyncforums':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_resynch' );
                
$this->resyncForums();
            break;

            case 
'doresynctopics':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_resyncht' );
                
$this->resyncTopics();
            break;

            case 
'doposts':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_rebuild' );
                
$this->rebuildPosts();
            break;

            case 
'dopostnames':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_postcounts' );
                
$this->rebuildPostNames();
            break;

            case 
'dopostcounts':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_postcounts' );
                
$this->rebuildPostCount();
            break;
            
            case 
'doreputationcount':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_postcounts' );
                
$this->rebuildReputationCount();
            break;

            case 
'dothumbnails':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_thumbs' );
                
$this->rebuildThumbnails();
            break;

            case 
'dophotos':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_thumbs' );
                
$this->rebuildPhotos();
            break;

            case 
'doattachdata':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_attach' );
                
$this->rebuildAttachdata();
            break;
            
            case 
'doseousernames':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_rebuild' );
                
$this->rebuildSeoUserNames();
            break;
            case 
'cleanattachments':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_orphaned' );
                
$this->cleanAttachments();
            break;

            case 
'cleanphotos':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_orphanp' );
                
$this->cleanPhotos();
            break;
            
            case 
'domsgcounts':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'tools_postcounts' );
                
$this->rebuildMsgCounts();
            break;

            
//-----------------------------------------
            // Tools
            //-----------------------------------------
            
            
case '320photos':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->tools320Photos();
            break;
            
            case 
'300pms':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->tools300Pms();
            break;
            
            case 
'220tool_contacts':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->tools220Contacts();
            break;

            case 
'210polls':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->tools210Polls();
            break;

            case 
'210calevents':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->tools210Calevents();
            break;

            case 
'210tool_settings':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->tools210DupeSettings();
            break;

            case 
'tool_settings':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->toolsDupeSettings();
            break;

            case 
'tool_converge':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->toolsConverge();
            break;

            case 
'tool_bansettings':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->toolBanSettings();
            break;

            case 
'tools':
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'cleanup_manage' );
                
$this->toolsSplashScreen();
            break;

            case 
'rebuild_overview':
            default:
                
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg'rebuild_manage' );
                
$this->rebuildSplashScreen();
            break;
        }

        
/* Output */
        
$this->registry->output->html_main .= $this->registry->output->global_template->global_frame_wrapper();
        
$this->registry->output->sendOutput();
    }
    
    
/**
     * 3.2.x Tools: Convert photos
     *
     * @return    @e void
     */
    
public function tools320photos()
    {
        
/* INIT */
        
$convertFrom    $this->request['from'] == 'avatars' 'avatars' 'photos';
        
$st                intval($this->request['st']);
        
$did            0;
        
$each            200;

        
/* Photo library */
        
require_once( IPS_ROOT_PATH 'sources/classes/member/photo.php' );/*noLibHook*/
        
$photo    = new classes_member_photo$this->registry );

        
/* Loop over members */
        
$this->DB->build( array( 'select' => '*''from' => 'profile_portal''order' => 'pp_member_id ASC''limit' => array( $st$each ) ) );
        
$outer    $this->DB->execute();
        
        while( 
$r $this->DB->fetch($outer) )
        {
            
$did++;

            
$update    = array();
            
            if( 
$r['fb_photo'] )
            {
                
$update['pp_photo_type']    = 'facebook';
            }
            else if( 
$r['tc_photo'] )
            {
                
$update['pp_photo_type']    = 'twitter';
            }
            else
            {
                if( 
$convertFrom == 'avatars' )
                {
                    if( 
$r['avatar_type'] == 'upload' AND $r['avatar_location'] )
                    {
                        
$update['pp_photo_type']    = 'custom';
                        
$update['pp_main_photo']    = $r['avatar_location'];
                        
$_dims                        = @getimagesize$this->settings['upload_dir'] . '/' $r['avatar_location'] );
                        
$update['pp_main_width']    = $_dims[0];
                        
$update['pp_main_height']    = $_dims[1];
                    }
                    else if( 
$r['avatar_type'] == 'gravatar' )
                    {
                        
$update['pp_photo_type']    = 'gravatar';
                        
$update['pp_gravatar']        = $r['avatar_location'];
                        
                        
$md5Gravatar md5$update['pp_gravatar'] );
                        
                        
$_url    "http://www.gravatar.com";
                        
                        if( 
$this->registry->output->isHTTPS )
                        {
                            
$_url    "https://secure.gravatar.com";
                        }
                        
                        
$update['pp_main_photo']    = $_url "/avatar/" .$md5Gravatar "?s=100";
                        
$update['pp_main_width']    = 100;
                        
$update['pp_main_height']    = 100;
                        
$update['pp_thumb_photo']    = $_url "/avatar/" .$md5Gravatar "?s=100";
                        
$update['pp_thumb_width']    = 100;
                        
$update['pp_thumb_height']    = 100;
                    }
                }
                else
                {
                    if( 
$r['pp_main_photo'] )
                    {
                        
$update['pp_photo_type']    = 'custom';
                        
$update['pp_main_photo']    = $r['pp_main_photo'];
                    }
                }
            }
            
            if( 
$update['pp_photo_type'] == 'custom' )
            {
                
$info    $photo->buildSizedPhotosstr_replace'upload:'''$update['pp_main_photo'] ), $r['pp_member_id'], true );

                
$update['pp_main_width']    = intval$info['final_width'] );
                
$update['pp_main_height']    = intval$info['final_height'] );
                
$update['pp_thumb_photo']    = $info['t_final_location'] ? $info['t_final_location'] : $info['final_location'];
                
$update['pp_thumb_width']    = intval$info['t_final_width'] );
                
$update['pp_thumb_height']    = intval$info['t_final_height'] );
            }
            
            if( 
count($update) )
            {
                
$this->DB->update'profile_portal'$update'pp_member_id=' $r['pp_member_id'] );
            }
        }

        
/* Show message and redirect */
        
if( $did )
        {
            
$this->request['st']        = ( $st $did );
            
            
$url  "{$this->settings['base_url']}{$this->form_code}&do=" $this->request['do'] . '&from=' $this->request['from'] . '&st=' $this->request['st'];
            
            
$this->_specialRedirect$urlsprintf$this->lang->words['tools320photos'], $this->request['st'], $did ) );
        }
        else
        {
            
$this->registry->output->redirect$this->settings['base_url'] . $this->form_code '&do=tools'$this->lang->words['re_photosconverted'] );
        }
    }
    
    
/**
     * 3.0.x Tools: PM Conversion
     *
     * @return    @e void
     */
    
public function tools300pms()
    {
        
/* INIT */
        
$pergo     100;
        
$start     intval$this->request['st'] );
        
$converted 0;
        
$seen      0;
        
        
//-----------------------------------------
        // Check to make sure table exists
        //-----------------------------------------

        
if ( ! $this->DB->checkForTable'message_text' ) )
        {
            
$this->registry->output->global_message $this->lang->words['re_msgsconverted'];
            
$this->toolsSplashScreen();
            return;
        }
        
        
        
/* Select max topic ID thus far */
        
$_tmp $this->DB->buildAndFetch( array( 'select' => 'MAX(mt_id) as max',
                                                 
'from'   => 'message_topics' ) );
                                                
        
$topicID intval$_tmp['max'] );
        
        
$this->DB->build( array( 'select' => '*',
                                 
'from'   => 'message_text',
                                 
'order'  => 'msg_id ASC',
                                 
'limit'  => array( $start$pergo ) ) );
                                
        
$o $this->DB->execute();
        
        while( 
$post $this->DB->fetch$o ) )
        {
            
$seen++;
            
            
/* Make sure all data is valid */
            
if ( intval$post['msg_sent_to_count'] ) < )
            {
                continue;
            }
            
            
/* a little set up */
            
$oldTopics = array();
            
            
/* Now fetch all topics */
            
$this->DB->build( array( 'select' => '*',
                                     
'from'   => 'message_topics_old',
                                     
'where'  => 'mt_msg_id=' intval$post['msg_id'] ) ) );
                                    
            
$t $this->DB->execute();
            
            while( 
$topic $this->DB->fetch$t ) )
            {
                
/* Got any data? */
                
if ( ! $topic['mt_from_id'] OR ! $topic['mt_to_id'] )
                {
                    continue;
                }
                
                
$oldTopics$topic['mt_id'] ] = $topic;
            }
            
            
/* Fail safe */
            
if ( ! count$oldTopics ) )
            {
                continue;
            }
            
            
/* Increment number */
            
$topicID++;
            
            
/* Add in the post */
            
$this->DB->insert'message_posts', array( 'msg_topic_id'      => $topicID,
                                                       
'msg_date'          => $post['msg_date'],
                                                       
'msg_post'          => $post['msg_post'],
                                                       
'msg_post_key'      => $post['msg_post_key'],
                                                       
'msg_author_id'     => $post['msg_author_id'],
                                                       
'msg_ip_address'    => $post['msg_ip_address'],
                                                       
'msg_is_first_post' => ) );
            
$postID $this->DB->getInsertId();
            
            
/* Define some stuff. "To" member is added last in IPB 2 */
            
$_tmp       $oldTopics;
            
ksort$_tmp );
            
$topicData  array_pop$_tmp ); 
            
$_invited   = array();
            
$_seenOwner = array();
            
$_isDeleted 0;
            
            
/* Add the member rows */
            
foreach( $oldTopics as $mt_id => $data )
            {
                
/* Prevent SQL error with unique index: Seen the owner ID already? */
                
if ( $_seenOwner$data['mt_owner_id'] ] )
                {
                    continue;
                }
                
                
$_seenOwner$data['mt_owner_id'] ] = $data['mt_owner_id'];
                
                
/* Build invited - does not include 'to' person */
                
if ( $data['mt_owner_id'] AND ( $post['msg_author_id'] != $data['mt_owner_id'] ) AND ( $topicData['mt_to_id'] != $data['mt_owner_id'] ) )
                {
                    
$_invited$data['mt_owner_id'] ] = $data['mt_owner_id'];/*noLibHook*/
                
}
                
                
$_isSent  = ( $data['mt_vid_folder'] == 'sent' )   ? 0;
                
$_isDraft = ( $data['mt_vid_folder'] == 'unsent' ) ? 0;
                
                
$this->DB->insert'message_topic_user_map', array( 'map_user_id'     => $data['mt_owner_id'],
                                                                    
'map_topic_id'    => $topicID,
                                                                    
'map_folder_id'   => ( $_isDraft ) ? 'drafts' 'myconvo',
                                                                    
'map_read_time'   => ( $data['mt_user_read'] ) ? $data['mt_user_read'] : ( $data['mt_read'] ? time() : ),
                                                                    
'map_user_active' => 1,
                                                                    
'map_user_banned' => 0,
                                                                    
'map_has_unread'  => 0//( $data['mt_read'] ) ? 0 : 1,
                                                                    
'map_is_system'   => 0,
                                                                    
'map_last_topic_reply' => $post['msg_date'],
                                                                    
'map_is_starter'  => ( $data['mt_owner_id'] == $post['msg_author_id'] ) ? ) );
                
            }
            
            
/* Now, did we see the author? If not, add them too but as inactive */
            
if ( ! $_seenOwner$post['msg_author_id'] ] )
            {
                
$_isDeleted 1;
                
                
/*$this->DB->insert( 'message_topic_user_map', array( 'map_user_id'     => $post['msg_author_id'],
                                                                    'map_topic_id'    => $topicID,
                                                                    'map_folder_id'   => 'myconvo',
                                                                    'map_read_time'   => 0,
                                                                    'map_user_active' => 0,
                                                                    'map_user_banned' => 0,
                                                                    'map_has_unread'  => 0,
                                                                    'map_is_system'   => 0,
                                                                    'map_is_starter'  => 1 ) );*/
            
}
            
            
$_isSent  = ( $topicData['mt_vid_folder'] == 'sent' )   ? 0;
            
$_isDraft = ( $topicData['mt_vid_folder'] == 'unsent' ) ? 0;
            
            
/* This is for MSSQL. I need a quick fix. This is it. Enjoy. */
            
if ( method_exists$this->DB'setTableIdentityInsert' ) )
            {
                
$this->DB->setTableIdentityInsert'message_topics''ON' );
            }
            
            
/* Add the topic */
            
$this->DB->insert'message_topics', array( 'mt_id'                 => $topicID,
                                                        
'mt_date'             => $topicData['mt_date'],
                                                        
'mt_title'             => $topicData['mt_title'],
                                                        
'mt_starter_id'         => $post['msg_author_id'],
                                                        
'mt_start_time'      => $post['msg_date'],
                                                        
'mt_last_post_time'  => $post['msg_date'],
                                                        
'mt_invited_members' => serializearray_keys$_invited ) ),
                                                        
'mt_to_count'         => count(  array_keys$_invited ) ) + 1,
                                                        
'mt_to_member_id'     => $topicData['mt_to_id'],
                                                        
'mt_replies'         => 0,
                                                        
'mt_last_msg_id'     => $postID,
                                                        
'mt_first_msg_id'    => $postID,
                                                        
'mt_is_draft'         => $_isDraft,
                                                        
'mt_is_deleted'         => $_isDeleted,
                                                        
'mt_is_system'         => ) );
            
            
/* This is for MSSQL. I need a quick fix. This is it. Enjoy. */
            
if ( method_exists$this->DB'setTableIdentityInsert' ) )
            {
                
$this->DB->setTableIdentityInsert'message_topics''OFF' );
            }
            
            
$converted++;
        }
        
        
/* What to do? */
        
if ( $seen )
        {
            
$this->request['st'] = $start $pergo;

            
/* Re-do Page */
            
$url  "{$this->settings['base_url']}{$this->form_code}&do=".$this->request['do'].'&st=' $this->request['st'];
            
            
$this->_specialRedirect$urlsprintf$this->lang->words['tools300pms'], $this->request['st'], $converted ) );
        }
        else
        {
            
/* Update all members */
            
$this->DB->update'members', array( 'msg_count_reset' => ) );

            
$this->registry->output->redirect"{$this->settings['base_url']}{$this->form_code}&do=tools"$this->lang->words['re_pmsconverted'], );
        }
    }

    
/**
     * Tools: Ban Settings
     *
     * @return    @e void
     */
    
public function toolBanSettings()
    {
        
//-----------------------------------------
        // Init
        //-----------------------------------------

        
$bomb        = array();
        
$ban         = array();
        
$ip_count    0;
        
$email_count 0;
        
$name_count  0;

        
//-----------------------------------------
        // Get current entries
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from' => 'banfilters''order' => 'ban_date desc' ) );
        
$this->DB->execute();

        while ( 
$r $this->DB->fetch() )
        {
            
$ban$r['ban_type'] ][ $r['ban_content'] ] = $r;
        }

        
//-----------------------------------------
        // Get $INFO (again) ip email name
        //-----------------------------------------
        
$INFO = array();
        require( 
DOC_IPS_ROOT_PATH 'conf_global.php' );/*noLibHook*/

        //-----------------------------------------
        // IP
        //-----------------------------------------

        
if ( $INFO['ban_ip'] )
        {
            
$bomb explode'|'$INFO['ban_ip'] );

            if ( 
is_array$bomb ) and count$bomb ) )
            {
                foreach( 
$bomb as $bang )
                {
                    if ( ! 
is_array($ban['ip'][ $bang ]) )
                    {
                        
$this->DB->insert'banfilters', array( 'ban_type' => 'ip''ban_content' => $bang'ban_date' => time() ) );

                        
$ip_count++;
                    }
                }
            }
        }

        
//-----------------------------------------
        // EMAIL
        //-----------------------------------------

        
if ( $INFO['ban_email'] )
        {
            
$bomb explode'|'$INFO['ban_email'] );

            if ( 
is_array$bomb ) and count$bomb ) )
            {
                foreach( 
$bomb as $bang )
                {
                    if ( ! 
is_array($ban['email'][ $bang ]) )
                    {
                        
$this->DB->insert'banfilters', array( 'ban_type' => 'email''ban_content' => $bang'ban_date' => time() ) );

                        
$email_count++;
                    }
                }
            }
        }

        
//-----------------------------------------
        // EMAIL
        //-----------------------------------------

        
if ( $INFO['ban_names'] )
        {
            
$bomb explode'|'$INFO['ban_names'] );

            if ( 
is_array$bomb ) and count$bomb ) )
            {
                foreach( 
$bomb as $bang )
                {
                    if ( ! 
is_array($ban['name'][ $bang ]) )
                    {
                        
$this->DB->insert'banfilters', array( 'ban_type' => 'name''ban_content' => $bang'ban_date' => time() ) );

                        
$name_count++;
                    }
                }
            }
        }

        
$this->registry->output->global_message sprintf$this->lang->words['re_bansimport'], $ip_count$email_count$name_count );

        
$this->cache->rebuildCache'banfilters''global' );

        
$this->toolsSplashScreen();
    }

    
/**
     * 2.0.0 Tools: Converge
     *
     * @return    @e void
     */
    
public function toolsConverge()
    {
        
//-----------------------------------------
        // Get all validating members...
        //-----------------------------------------

        
$to_unconverge    = array();
        
$unconverge_count 0;

        
$this->DB->build( array( 'select' => 'member_id, email, member_group_id''from' => 'members''where' => 'member_group_id='.$this->settings['auth_group'] ) );
        
$this->DB->execute();

        while( 
$m $this->DB->fetch() )
        {
            if ( 
preg_match"#^{$m['member_id']}-#"$m['email'] ) )
            {
                
$to_unconverge[] = $m['member_id'];
            }
        }

        
$unconverge_count intvalcount$to_unconverge ) );

        if ( 
$unconverge_count )
        {
            foreach( 
$to_unconverge as $mid )
            {
                
$this->DB->update'members'     , array( 'member_group_id' => $this->settings['member_group'] ), 'member_id='.$mid );
            }
        }

        
//-----------------------------------------
        // Time to move on dude
        //-----------------------------------------

        
$this->registry->output->global_message = (sprintf$this->lang->words['re_convergerest'], $unconverge_count ) );
        
$this->toolsSplashScreen();
    }

    
/**
     * 2.0.0 Tools: Dupe Settings
     *
     * @return    @e void
     */
    
public function toolsDupeSettings()
    {
        
//-----------------------------------------
        // Remove dupe categories
        //-----------------------------------------

        
$title_id_to_keep    = array();
        
$title_id_to_delete  = array();
        
$title_deleted_count 0;

        
$this->DB->build( array( 'select' => '*''from' => 'core_sys_settings_titles''order' => 'conf_title_id' ) );
        
$this->DB->execute();

        while ( 
$r $this->DB->fetch() )
        {
            if ( 
$title_id_to_keep$r['conf_title_title'] ] )
            {
                
$title_id_to_delete$r['conf_title_id'] ] = $r['conf_title_id'];
            }
            else
            {
                
$title_id_to_keep$r['conf_title_title'] ] = $r['conf_title_id'];
            }
        }

        if ( 
count$title_id_to_delete ) )
        {
            
$this->DB->delete'conf_settings_titles''conf_title_id IN ('.implode','$title_id_to_delete ).')' );
        }

        
$title_deleted_count intvalcount($title_id_to_delete) );

        
//-----------------------------------------
        // Remove dupe settings
        //-----------------------------------------

        
$setting_id_to_keep       = array();
        
$setting_id_to_delete     = array();
        
$setting_id_deleted_count 0;

        
$this->DB->build( array( 'select' => '*''from' => 'core_sys_conf_settings''order' => 'conf_id' ) );
        
$this->DB->execute();

        while ( 
$r $this->DB->fetch() )
        {
            if ( 
$setting_id_to_keep$r['conf_title'].','.$r['conf_key'] ] )
            {
                
$setting_id_to_delete$r['conf_id'] ] = $r['conf_id'];
            }
            else
            {
                
$setting_id_to_keep$r['conf_title'].','.$r['conf_key'] ] = $r['conf_id'];
            }
        }

        if ( 
count$setting_id_to_delete ) )
        {
            
$this->DB->delete'conf_settings''conf_id IN ('.implode','$setting_id_to_delete ).')' );
        }

        
$setting_deleted_count intvalcount($setting_id_to_delete) );

        
//-----------------------------------------
        // Time to move on dude
        //-----------------------------------------

        
$this->registry->output->global_message sprintf$this->lang->words['re_deletetitle'], $title_deleted_count$setting_deleted_count ) ;
        
$this->toolsSplashScreen();
    }

    
/**
     * 2.1.0 Tools: Dupe Settings
     *
     * @return    @e void
     */
    
public function tools210DupeSettings()
    {
        
//-----------------------------------------
        // Remove dupe categories
        //-----------------------------------------

        
$title_id_to_keep    = array();
        
$title_id_to_delete  = array();
        
$title_deleted_count 0;
        
$msg                 '';

        
$this->DB->build( array( 'select' => '*''from' => 'core_sys_settings_titles''order' => 'conf_title_id DESC' ) );
        
$this->DB->execute();

        while ( 
$r $this->DB->fetch() )
        {
            if ( 
$title_id_to_keep$r['conf_title_title'] ] )
            {
                
$title_id_to_delete$r['conf_title_id'] ] = $r['conf_title_id'];

                
$msg .= sprintf$this->lang->words['re_deletingid'], $r['conf_title_title'], $r['conf_title_id'] ) . "<br />";
            }
            else
            {
                
$title_id_to_keep$r['conf_title_title'] ] = $r['conf_title_id'];
                
$msg .= sprintf$this->lang->words['re_keepingid'],  $r['conf_title_title'], $r['conf_title_id'] ) . "<br />";
            }
        }

        if ( 
count$title_id_to_delete ) )
        {
            
$this->DB->delete'core_sys_conf_settings''conf_title_id IN ('.implode','$title_id_to_delete ).')' );
        }

        
$title_deleted_count intvalcount($title_id_to_delete) );

        
//-----------------------------------------
        // Time to move on dude
        //-----------------------------------------

        
$this->registry->output->global_message sprintf$this->lang->words['re_duplicatetitle'], $title_deleted_count$msg );
        
$this->toolsSplashScreen();
    }
        
    
/**
     * 2.1.0 Tools: Calendar Events
     *
     * @return    @e void
     */
    
public function tools210Calevents()
    {
        
$start intval($_GET['st']);
        
$lend  50;
        
$end   $start $lend;
        
$max   intval($_GET['max']);

        
//-----------------------------------------
        // Check to make sure table exists
        //-----------------------------------------

        
if ( ! $this->DB->checkForTable'calendar_events' ) )
        {
            
$this->registry->output->global_message $this->lang->words['re_calremoved'];
            
$this->toolsSplashScreen();
            return;
        }

        
//-----------------------------------------
        // Do we need to run this tool?
        //-----------------------------------------

        
if ( ! $max )
        {
            
$original $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as max''from' => 'calendar_events' ) );
            
$new      $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as max''from' => 'cal_events' ) );

            if ( 
$new['max'] >= $original['max'] OR ! $original['max'] )
            {
                
$this->registry->output->global_message $this->lang->words['re_calalready'];
                
$this->toolsSplashScreen();
            }
        }

        
$max intval$original['max'] );

        
//-----------------------------------------
        // In steps...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from'   => 'calendar_events''limit'  => array( $start$lend ) ) );
        
$o $this->DB->execute();

        
//-----------------------------------------
        // Do it...
        //-----------------------------------------

        
if ( $this->DB->getTotalRows($o) )
        {
            
//-----------------------------------------
            // Got some to convert!
            //-----------------------------------------

            
while ( $r $this->DB->fetch($o) )
            {
                
$recur_remap = array( 'w' => 1,
                                      
'm' => 2,
                                      
'y' => );

                
$begin_date        IPSTime::date_getgmdate$r['unix_stamp']     );
                
$end_date          IPSTime::date_getgmdate$r['end_unix_stamp'] );

                if ( ! 
$begin_date OR ! $end_date )
                {
                    continue;
                }

                
$day               $begin_date['mday'];
                
$month             $begin_date['mon'];
                
$year              $begin_date['year'];

                
$end_day           $end_date['mday'];
                
$end_month         $end_date['mon'];
                
$end_year          $end_date['year'];

                
$_final_unix_from  gmmktime(000$month$day$year );

                
//-----------------------------------------
                // Recur or ranged...
                //-----------------------------------------

                
if ( $r['event_repeat'] OR $r['event_ranged'] )
                {
                    
$_final_unix_to gmmktime(235959$end_month$end_day$end_year);
                }
                else
                {
                    
$_final_unix_to 0;
                }

                
$new_event = array( 'event_calendar_id' => 1,
                                    
'event_member_id'   => $r['userid'],
                                    
'event_content'     => $r['event_text'],
                                    
'event_title'       => $r['title'],
                                    
'event_smilies'     => $r['show_emoticons'],
                                    
'event_perms'       => $r['read_perms'],
                                    
'event_private'     => $r['priv_event'],
                                    
'event_approved'    => 1,
                                    
'event_unixstamp'   => $r['unix_stamp'],
                                    
'event_recurring'   => ( $r['event_repeat'] && $recur_remap$r['repeat_unit'] ] ) ? $recur_remap$r['repeat_unit'] ] : 0,
                                    
'event_tz'          => 0,
                                    
'event_unix_from'   => $_final_unix_from,
                                    
'event_unix_to'     => $_final_unix_to );

                
//-----------------------------------------
                // INSERT
                //-----------------------------------------

                
$this->DB->insert'cal_events'$new_event );
            }

            
$this->registry->output->global_message sprintf$this->lang->words['re_calstartto'], $start$end );

            
$url  "{$this->settings['base_url']}{$this->form_code}&do=".$this->request['do'].'&max='.$max.'&st='.$end;
        }
        else
        {
            
$this->registry->output->global_message $this->lang->words['re_calsconverted'];

            
$url  "{$this->settings['base_url']}{$this->form_code}&do=tools";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->registry->output->redirect$url$this->registry->output->global_message );
    }

    
/**
     * 2.1.0 Tools: Polls
     *
     * @return    @e void
     */
    
public function tools210Polls()
    {
        
$start     intval$this->request['st'] );
        
$lend      50;
        
$end       $start $lend;
        
$max       intval$this->request['max'] );
        
$done      0;
        
$converted intval$this->request['conv'] );

        
//-----------------------------------------
        // First off.. grab number of polls to convert
        //-----------------------------------------

        
if ( ! $max )
        {
            
$total $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as max',
                                                                       
'from'   => 'topics',
                                                                       
'where'  => "poll_state IN ('open', 'close', 'closed')" ) );

            
$max   $total['max'];
        }

        if ( 
$max )
        {
            
$done 1;
        }

        
//-----------------------------------------
        // In steps...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*',
                                                      
'from'   => 'topics',
                                                      
'where'  => "poll_state IN ('open', 'close', 'closed' )",
                                                      
'limit'  => array( $start$lend ) ) );
        
$o $this->DB->execute();

        
//-----------------------------------------
        // Do it...
        //-----------------------------------------

        
if ( $this->DB->getTotalRows($o) )
        {
            
//-----------------------------------------
            // Got some to convert!
            //-----------------------------------------

            
while ( $r $this->DB->fetch($o) )
            {
                
$converted++;

                
$new_poll  = array( => array() );

                
$poll_data $this->DB->buildAndFetch( array( 'select' => '*',
                                                                               
'from'   => 'polls',
                                                                               
'where'  => "tid=".$r['tid']
                                                                      )      );
                if ( ! 
$poll_data['pid'] )
                {
                    continue;
                }

                if ( ! 
$poll_data['poll_question'] )
                {
                    
$poll_data['poll_question'] = $r['title'];
                }

                
//-----------------------------------------
                // Kick start new poll
                //-----------------------------------------

                
$new_poll[1]['question'] = $poll_data['poll_question'];

                
//-----------------------------------------
                // Get OLD polls
                //-----------------------------------------

                
$poll_answers unserializestripslashes$poll_data['choices'] ) );

                
reset($poll_answers);

                foreach ( 
$poll_answers as $entry )
                {
                    
$id     $entry[0];
                    
$choice $entry[1];
                    
$votes  $entry[2];

                    
$total_votes += $votes;

                    if ( 
strlen($choice) < )
                    {
                        continue;
                    }

                    
$new_poll]['choice'][ $id ] = $choice;
                    
$new_poll]['votes'][ $id  ] = $votes;
                }

                
//-----------------------------------------
                // Got something?
                //-----------------------------------------

                
if ( count$new_poll[1]['choice'] ) )
                {
                    
$this->DB->update'polls' , array( 'choices'    => serialize$new_poll ) ), 'tid='.$r['tid'] );
                    
$this->DB->update'topics', array( 'poll_state' => ), 'tid='.$r['tid'] );
                }

                
//-----------------------------------------
                // All done?
                //-----------------------------------------

                
if ( $converted >= $max )
                {
                    
$done 1;
                    continue;
                }
            }
        }
        else
        {
            
$done 1;
        }


        if ( ! 
$done )
        {
            
$this->registry->output->global_message sprintf$this->lang->words['re_pollstartto'], $start$end$max );

            
$url  "{$this->settings['base_url']}{$this->form_code}&do=".$this->request['do'].'&max='.$max.'&st='.$end.'&conv='.$converted;
        }
        else
        {
            
$this->registry->output->global_message $this->lang->words['re_pollconverted'];

            
$url  "{$this->settings['base_url']}{$this->form_code}&do=tools";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->registry->output->redirect$url$this->registry->output->global_message );
    }

    
/**
     * 2.2.0 Tools: Contacts
     * DEPRECATED
     *
     * @return    @e void
     */
    
public function tools220Contacts()
    {
        
//-----------------------------------------
        // INIT
        //-----------------------------------------

        
$start           intval($_GET['st']);
        
$lend            50;
        
$end             $start $lend;
        
$done            0;
        
$updated         0;

        
//-----------------------------------------
        // Get lib
        //-----------------------------------------

        
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir('members') . '/sources/friends.php''profileFriendsLib''members' );
        
$profile     =  new $classToLoad$this->registry );


        
//-----------------------------------------
        // OK..
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*',
                                                  
'from'   => 'contacts',
                                                  
'where'  => 'allow_msg=1',
                                                 
'limit'  => array( $start$lend ) ) );

        
$o $this->DB->execute();

        
//-----------------------------------------
        // Do it...
        //-----------------------------------------

        
if ( $this->DB->getTotalRows($o) )
        {
            
//-----------------------------------------
            // Got some to convert!
            //-----------------------------------------

            
while( $row $this->DB->fetch$o ) )
            {
                
//-----------------------------------------
                // Already a friend
                //-----------------------------------------

                
$friend $this->DB->buildAndFetch( array( 'select' => '*',
                                                                            
'from'   => 'profile_friends',
                                                                            
'where'  => 'friends_member_id=' intval$row['member_id'] ) . ' AND friends_friend_id=' intval$row['contact_id'] ) ) );

                if ( ! 
$friend['friends_id'] )
                {
                    
//-----------------------------------------
                    // Add to DB
                    //-----------------------------------------

                    
$this->DB->insert'profile_friends', array( 'friends_member_id' => $row['member_id'],
                                                                              
'friends_friend_id' => $row['contact_id'],
                                                                              
'friends_approved'  => 1,
                                                                              
'friends_added'     => time() ) );

                    
//-----------------------------------------
                    // Rebuild...
                    //-----------------------------------------

                    
$profile->recacheFriends( array( 'member_id' => $row['member_id'] ) );

                    
$updated++;
                }

                
$this->DB->delete"contacts""id={$row['id']});
            }
        }
        else
        {
            
$done 1;
        }

        
//-----------------------------------------
        // Done?
        //-----------------------------------------

        
if ( ! $done )
        {
            
$this->registry->output->global_message sprintf$this->lang->words['re_contactsstartto'],$start$end$updated );

            
$url  "{$this->settings['base_url']}{$this->form_code}&do=".$this->request['do'].'&st='.$end;
        }
        else
        {
            
$this->registry->output->global_message $this->lang->words['re_contactsup'];

            
$url  "{$this->settings['base_url']}{$this->form_code}&do=tools";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->registry->output->redirect$url$this->registry->output->global_message );
    }

    
/**
     * Cleanup Tools Splash Screen
     *
     * @return    @e void
     */
    
public function toolsSplashScreen()
    {
        
/* Output */
        
$this->registry->output->html .= $this->html->toolsSplashScreen();
    }

    
/**
     * Count stats
     *
     * @return    @e void
     */
    
public function doCount()
    {
        if ( empty(
$this->request['posts']) && empty($this->request['online']) && empty($this->request['members']) && empty($this->request['lastreg']) )
        {
            
$this->registry->output->showError$this->lang->words['re_nothing'], 11154 );
        }

        
$stats $this->cache->getCache('stats');

        if ( 
$this->request['posts'] )
        {
            
$topics $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as tcount',
                                                                      
'from'   => 'topics',
                                                                       
'where'  => $this->registry->getClass('class_forums')->fetchTopicHiddenQuery( array( 'visible' ), '' ) ) );

            
$posts  $this->DB->buildAndFetch( array( 'select' => 'SUM(posts) as replies',
                                                                     
'from'   => 'topics',
                                                                     
'where'  => $this->registry->getClass('class_forums')->fetchTopicHiddenQuery( array( 'visible' ), '' ) ) );

            
$stats['total_topics']  = $topics['tcount'];
            
$stats['total_replies'] = $posts['replies'];
        }

        if ( 
$this->request['members'] )
        {
            
$r $this->DB->buildAndFetch( array( 'select' => 'count(member_id) as members''from' => 'members''where' => "member_group_id <> '{$this->settings['auth_group']}'" ) );
            
            
$stats['mem_count'] = intval($r['members']);
        }

        if ( 
$this->request['lastreg'] )
        {
            
$stats array_merge$statsIPSMember::resetLastRegisteredMembertrue ) );
        }

        if ( 
$this->request['online'] )
        {
            
$stats['most_date']  = time();
            
$stats['most_count'] = 1;
        }

        
$this->cache->setCache'stats'$stats, array( 'array' => ) );
        
        
$this->registry->output->global_message    $this->lang->words['re_statsrecount'];
        
$this->registry->output->silentRedirectWithMessage$this->settings['base_url'] . $this->form_code );
    }

    
/**
     * Clean out photos
     *
     * @return    @e void
     */
    
public function cleanPhotos()
    {
        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done        0;
        
$start        intval($this->request['st']) >= intval($this->request['st']) : 0;
        
$end        intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$display    $end $start;
        
$output        = array();

        
//-----------------------------------------
        // Pop open the directory and
        // peek inside...
        //-----------------------------------------

        
$i 0;
        
        try
        {
            foreach( new 
DirectoryIterator$this->settings['upload_dir'] . '/profile' ) as $file )
             {
                 if ( 
strstr$file->getFilename(), 'photo-' ) )
                 {
                     
$fullfile $file->getPathname();
                     
$relativefile str_replace$this->settings['upload_dir'] . '/'''$fullfile );

                     
$i++;
            
                     
//-----------------------------------------
                     // Already started?
                     //-----------------------------------------
            
                     
if ( $start $i )
                     {
                         continue;
                     }
            
                     
//-----------------------------------------
                     // Done for this iteration?
                     //-----------------------------------------
            
                     
if ( $i $display )
                     {
                         break;
                     }
            
                     
//-----------------------------------------
                     // Try and get attach row
                     //-----------------------------------------
                     
                     
$found $this->DB->buildAndFetch( array( 'select' => 'pp_member_id''from' => 'profile_portal''where' => "pp_main_photo='{$relativefile}' OR pp_thumb_photo='{$relativefile}'" ) );
                        
                     if ( ! 
$found['pp_member_id'] )
                     {
                         @
unlink$fullfile );
                         
$output[] = "<span style='color:red'>{$this->lang->words['re_removedorph']} {$file->getFilename()}</span>";
                     }
                     else
                     {
                         
$output[] = "<span style='color:gray'>{$this->lang->words['re_attachedok']} {$file->getFilename()}</span>";
                     }
                }
             }
        } catch ( 
Exception $e ) {}

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( $i $display)
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $display );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$display}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Clean out attachments
     *
     * @return    @e void
     */
    
public function cleanAttachments()
    {
        
/* Upload Class */
        
require_once( IPS_KERNEL_PATH.'classUpload.php' );/*noLibHook*/
        
$upload = new classUpload();

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Pop open the directory and
        // peek inside...
        //-----------------------------------------

        
$i 0;
        
        try
        {
             foreach( new 
DirectoryIterator$this->settings['upload_dir'] ) as $file )
             {
                if ( 
$file->getFilename() == '.' OR $file->getFilename() == '..' )
                {
                    continue;
                }
            
                 
$fullfile $this->settings['upload_dir'] . '/' $file->getFilename();
            
                 if( 
is_dir$fullfile ) )
                 {
                     
$ndh opendir$fullfile );
                    
                    try
                    {
                         foreach( new 
DirectoryIterator$fullfile ) as $nfile )
                         {
                            if ( 
$nfile->getFilename() == '.' OR $nfile->getFilename() == '..' )
                            {
                                continue;
                            }
                        
                             if ( 
strstr$nfile->getFilename(), 'post-' ) )
                             {
                                 
$i++;
                        
                                 
//-----------------------------------------
                                 // Already started?
                                 //-----------------------------------------
                        
                                 
if ( $start $i )
                                 {
                                     continue;
                                 }
                        
                                 
//-----------------------------------------
                                 // Done for this iteration?
                                 //-----------------------------------------
                        
                                 
if ( $i $dis )
                                 {
                                     break;
                                 }
                        
                                 
//-----------------------------------------
                                 // Try and get attach row
                                 //-----------------------------------------
                        
                                 
$found $this->DB->buildAndFetch( array( 'select' => 'attach_id''from' => 'attachments''where' => "attach_location='{$file->getFilename()}/{$nfile->getFilename()}' OR attach_thumb_location='{$file->getFilename()}/{$nfile->getFilename()}'" ) );
                        
                                 if ( ! 
$found['attach_id'] )
                                 {
                                     @
unlink$fullfile '/' $nfile );
                                     
$output[] = "<span style='color:red'>{$this->lang->words['re_removedorph']} {$nfile->getFilename()}</span>";
                                 }
                                 else
                                 {
                                     
$output[] = "<span style='color:gray'>{$this->lang->words['re_attachedok']} {$nfile->getFilename()}</span>";
                                 }
                            }
                        }
                    } catch ( 
Exception $e ) {}
                    
                    
closedir$ndh );
                }
                 else if ( 
strstr$file'post-' ) )
                 {
                     
$i++;
            
                     
//-----------------------------------------
                     // Already started?
                     //-----------------------------------------
            
                     
if ( $start $i )
                     {
                         continue;
                     }
            
                     
//-----------------------------------------
                     // Done for this iteration?
                     //-----------------------------------------
            
                     
if ( $i $dis )
                     {
                         break;
                     }
            
                     
//-----------------------------------------
                     // Try and get attach row
                     //-----------------------------------------
            
                     
$found $this->DB->buildAndFetch( array( 'select' => 'attach_id''from' => 'attachments''where' => "attach_location='{$file->getFilename()}' OR attach_thumb_location='{$file->getFilename()}'" ) );
            
                     if ( ! 
$found['attach_id'] )
                     {
                         @
unlink$fullfile );
                         
$output[] = "<span style='color:red'>{$this->lang->words['re_removedorph']} {$file->getFilename()}</span>";
                     }
                     else
                     {
                         
$output[] = "<span style='color:gray'>{$this->lang->words['re_attachedok']} {$file->getFilename()}</span>";
                     }
                }
             }
        } catch ( 
Exception $e ) {}
        
        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( $i $dis)
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------

            
$text sprintf$this->lang->words['re_thisgoeshere'], $dis ) . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Rebuild Attachment Data
     *
     * @return    @e void
     */
    
public function rebuildAttachdata()
    {
        
/* Upload Class */
        
require_once( IPS_KERNEL_PATH.'classUpload.php' );/*noLibHook*/
        
$upload = new classUpload();

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'attach_id''from' => 'attachments''limit' => array($dis,1) ) );
        
$max intval$tmp['attach_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from' => 'attachments''order' => 'attach_id ASC''limit' => array($start,$end) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
//-----------------------------------------
            // Get ext
            //-----------------------------------------

            
$update = array();

            
$update['attach_ext'] = IPSText::getFileExtension$r['attach_file'] );

            if ( 
$r['attach_location'] )
            {
                if ( 
is_file$this->settings['upload_dir'].'/'.$r['attach_location'] ) )
                {
                    
$update['attach_filesize'] = @filesize$this->settings['upload_dir'].'/'.$r['attach_location'] );

                    if( 
$r['attach_is_image'] )
                    {
                        
$dims = @getimagesize$this->settings['upload_dir'].'/'.$r['attach_location'] );

                        if( 
$dims[0] AND $dims[1] )
                        {
                            
$update['attach_img_width'] = $dims[0];
                            
$update['attach_img_height'] = $dims[1];
                        }
                    }
                }
            }

            if ( 
count$update ) )
            {
                
$this->DB->update'attachments'$update'attach_id='.$r['attach_id'] );
            }

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Rebuild Photos
     *
     * @return    @e void
     */
    
public function rebuildPhotos()
    {
        
/* Image Class */
        
$classToLoad  IPSLib::loadLibraryIPS_ROOT_PATH 'sources/classes/member/photo.php''classes_member_photo' );
        
$photoClass = new $classToLoad$this->registry );

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array(  'select' => 'pp_member_id''from' => 'profile_portal''where' => "pp_main_photo != ''"'order' => 'pp_member_id ASC''limit' => array($dis,1)  ) );
        
$max intval$tmp['pp_member_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from' => 'profile_portal''order' => 'pp_member_id ASC''where' => "pp_main_photo != ''"'limit' => array($start,$end) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
/* Preserve FB, Twitter and Gravatar photos */
            
if( $r['pp_photo_type'] != 'custom' )
            {
                continue;
            }

            
$update = array();
                        
            
$info    $photoClass->buildSizedPhotosstr_replace'upload:'''$r['pp_main_photo'] ), $r['pp_member_id'], true );

            if( 
$info['status'] == 'missing_image' )
            {
                
$update['pp_main_photo']    = '';
                
$update['pp_main_width']    = 0;
                
$update['pp_main_height']    = 0;
                
$update['pp_thumb_photo']    = '';
                
$update['pp_thumb_width']    = 0;
                
$update['pp_thumb_height']    = 0;
            }
            else
            {
                
$update['pp_main_width']    = intval$info['final_width'] );
                
$update['pp_main_height']    = intval$info['final_height'] );
                
$update['pp_thumb_photo']    = $info['t_final_location'] ? $info['t_final_location'] : $info['final_location'];
                
$update['pp_thumb_width']    = intval$info['t_final_width'] );
                
$update['pp_thumb_height']    = intval$info['t_final_height'] );
            }

            
$this->DB->update'profile_portal'$update'pp_member_id=' $r['pp_member_id'] );
            
            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Rebuild Post Thumbnails
     *
     * @return    @e void
     */
    
public function rebuildThumbnails()
    {
        require_once( 
IPS_KERNEL_PATH 'classImage.php' );/*noLibHook*/
        
require_once( IPS_KERNEL_PATH 'classImageGd.php' );/*noLibHook*/

        //-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'attach_id''from' => 'attachments''where' => "attach_rel_module IN('post','msg')"'limit' => array($dis,1)  ) );
        
$max intval$tmp['attach_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from' => 'attachments''where' => "attach_rel_module IN('post','msg')"'order' => 'attach_id ASC''limit' => array($start,$end) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            if ( 
$r['attach_is_image'] )
            {
                if ( 
$r['attach_thumb_location'] and ( $r['attach_thumb_location'] != $r['attach_location'] ) )
                {
                    if ( 
is_file$this->settings['upload_dir'] . '/' $r['attach_thumb_location'] ) )
                    {
                        if ( ! @
unlink$this->settings['upload_dir'] . '/' $r['attach_thumb_location'] ) )
                        {
                            
$output[] = $this->lang->words['re_noremove'] . $r['attach_thumb_location'];
                            continue;
                        }
                    }
                }

                
$attach_data    = array();
                
$thumbnail        preg_replace"/^(.*).(.+?)$/""\1_thumb.\2"$r['attach_location'] );

                
$image = new classImageGd();

                
$image->init( array(
                                         
'image_path'     => $this->settings['upload_dir'],
                                         
'image_file'     => $r['attach_location'],
                               )          );

                
$image->force_resize    false;

                
$return $image->resizeImage$this->settings['siu_width'], $this->settings['siu_height'] );
                
                if( !
$return['noResize'] )
                {
                    
$image->writeImage$this->settings['upload_dir'] . '/' $thumbnail );

                    
$attach_data['attach_thumb_location'] = $thumbnail;
                }

                
$attach_data['attach_thumb_width']    = intval($return['newWidth'] ? $return['newWidth'] : $image->cur_dimensions['width']);
                
$attach_data['attach_thumb_height']   = intval($return['newHeight'] ? $return['newHeight'] : $image->cur_dimensions['height']);

                if ( 
count$attach_data ) )
                {
                    
$this->DB->update'attachments'$attach_data'attach_id='.$r['attach_id'] );

                    
$output[] = $this->lang->words['re_resized'] . $r['attach_location'];
                }

                unset(
$image);
            }

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }
    
    
/**
     * Rebuild Messenger Totals
     *
     * @return    @e void
     */
    
public function rebuildMsgCounts()
    {
        
//-----------------------------------------
        // Grab messenger lib
        //-----------------------------------------

        
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir'members' ) . '/sources/classes/messaging/messengerFunctions.php''messengerFunctions''members' );
        
$messengerFunctions = new $classToLoad$this->registry );

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis   $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'member_id''from' => 'members''limit' => array($dis,1)  ) );
        
$max intval$tmp['member_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => 'member_id, members_display_name''from' => 'members''order' => 'member_id ASC''limit' => array($start,$end) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
$messengerFunctions->resetMembersFolderCounts$r['member_id'] );
            
$messengerFunctions->resetMembersTotalTopicCount$r['member_id'] );
            
$messengerFunctions->resetMembersNewTopicCount$r['member_id'] );

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Rebuild Post Count
     *
     * @return    @e void
     */
    
public function rebuildPostCount()
    {
        
//-----------------------------------------
        // Forums not to count?
        //-----------------------------------------

        
$forums = array();

        foreach( 
$this->registry->class_forums->forum_by_id as $data )
        {
            if ( ! 
$data['inc_postcount'] )
            {
                
$forums[] = $data['id'];
            }
        }
        
        
/* Init */
        
if ( ! $this->registry->isClassLoaded('topics') )
        {
            
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir'forums' ) . "/sources/classes/topics.php"'app_forums_classes_topics''forums' );
            
$this->registry->setClass'topics', new $classToLoad$this->registry ) );
        }
        
        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis   $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'member_id''from' => 'members''limit' => array($dis,1)  ) );
        
$max intval$tmp['member_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => 'member_id, name''from' => 'members''order' => 'member_id ASC''limit' => array($start,$end) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            if ( ! 
count$forums ) )
            {
                
$count $this->registry->topics->getPosts( array( 'onlyViewable'    => false,
                                                                   
'skipForumCheck'  => true,
                                                                   
'getCountOnly'    => true,
                                                                   
'authorId'         => $r['member_id'] ) );
            }
            else
            {
                
$count $this->registry->topics->getPosts( array( 'onlyViewable'    => false,
                                                                   
'skipForumCheck'  => true,
                                                                   
'getCountOnly'    => true,
                                                                   
'notForumId'      => $forums,
                                                                   
'authorId'         => $r['member_id'] ) );
            }
            
            if ( 
$this->settings['archive_on'] )
            {
                if ( ! 
count$forums ) )
                {
                    
$acount $this->registry->topics->getPosts( array( 'onlyViewable'    => false,
                                                                        
'skipForumCheck'  => true,
                                                                        
'getCountOnly'    => true,
                                                                        
'isArchivedTopic' => true,
                                                                        
'authorId'          => $r['member_id'] ) );
                }
                else
                {
                    
$acount $this->registry->topics->getPosts( array( 'onlyViewable'    => false,
                                                                        
'skipForumCheck'  => true,
                                                                        
'getCountOnly'    => true,
                                                                        
'notForumId'      => $forums,
                                                                        
'isArchivedTopic' => true,
                                                                        
'authorId'          => $r['member_id'] ) );
                }
                
                
$count += intval$acount );
            }

            
$this->DB->update'members', array( 'posts' => intval$count ) ), 'member_id='.$r['member_id'] );

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }
    
    
/**
     * Rebuild Reputation Counts
     *
     * @return    @e void
     */
    
public function rebuildReputationCount()
    {
        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis   $end $start;
        
$output = array();
        
        
//-----------------------------------------
        // Load reputation classes
        //-----------------------------------------
        
        
$_rep_author_config = array();
        
$_rep_log_joins = array();
        foreach( 
ipsRegistry::$applications as $appKey => $data )
        {
            
$rep_author_config    = array();
            
$rep_log_joins        = array();
            
$file                IPSLib::getAppDir$appKey ) . '/extensions/reputation.php';
            
            if ( 
file_exists$file ) )
            {
                require( 
$file );/*noLibHook*/
                
$_rep_author_config$appKey ] = $rep_author_config;
                
$_rep_log_joins$appKey ] = $rep_log_joins;
            }
        }
                        
        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'member_id''from' => 'members''limit' => array($dis,1)  ) );
        
$max intval$tmp['member_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => 'member_id, name''from' => 'members''order' => 'member_id ASC''limit' => array($start,$end) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
$total 0;
            
            foreach ( 
$_rep_author_config as $app => $types )
            {
                foreach ( 
$types as $type => $data )
                {
                    
$prefix NULL;
                    foreach ( 
$_rep_log_joins$app ] as $j )
                    {
                        if ( 
is_array$j['from'] ) AND count$j['from'] ) )
                        {
                            foreach ( 
$j['from'] as $t => $p )
                            {
                                if ( 
$t == $data['table'] )
                                {
                                    
$prefix $p;
                                    break 
2;
                                }
                            }
                        }
                    }
                    
                    if ( !
is_null$prefix ) )
                    {
                        
$_total $this->DB->buildAndFetch( array(
                            
'select'    => "sum(r.rep_rating) as total",
                            
'from'        => array( 'reputation_index' => 'r' ),
                            
'add_join'    => $_rep_log_joins$app ],
                            
'where'        => "r.app='{$app}' AND r.type='{$type}' AND {$prefix}.{$data['column']}={$r['member_id']}",
                            
'group'        => "{$prefix}.{$data['column']}",
                            ) );
                            
                        
$total += $_total['total'];
                    }
                }
            }

            
$this->DB->update'profile_portal', array( 'pp_reputation_points' => $total ), 'pp_member_id='.$r['member_id'] );

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }
    
    
/**
     * Rebuild Seo User Names
     *
     * @return    @e void
     */
    
public function rebuildSeoUserNames()
    {
        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'member_id''from' => 'members''limit' => array( $dis)  ) );
        
$max intval$tmp['member_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => 'member_id, members_display_name''from' => 'members''order' => 'member_id ASC''limit' => array( $start$end ) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
$this->DB->update'members', array( 'members_seo_name' => IPSText::makeSeoTitle$r['members_display_name'] ) ), "member_id=" $r['member_id'] );
            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }
    
    
    
/**
     * Rebuild Post Names
     *
     * @return    @e void
     */
    
public function rebuildPostNames()
    {
        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'member_id''from' => 'members''limit' => array( $dis)  ) );
        
$max intval$tmp['member_id'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => 'member_id, members_display_name''from' => 'members''order' => 'member_id ASC''limit' => array( $start$end ) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
$seoName IPSText::makeSeoTitle$r['members_display_name'] );
            
$this->DB->update'topics', array( 'starter_name' => $r['members_display_name'], 'seo_first_name' => $seoName ), "starter_id=" $r['member_id'] );
            
$this->DB->update'topics', array( 'last_poster_name' => $r['members_display_name'], 'seo_last_name' => $seoName ), "last_poster_id=" $r['member_id'] );

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Rebuild posts
     *
     * @return    @e void
     */
    
public function rebuildPosts()
    {
        
//-----------------------------------------
        // If it's "none", go back
        //-----------------------------------------
        
        
if( !$this->request['type'] OR $this->request['type'] == 'none' )
        {
            
$this->rebuildSplashScreen();
            return;
        }

        
//-----------------------------------------
        // Only need to rebuild once
        //-----------------------------------------

        
$sections        = array();
        
$alreadyRebuilt    $this->DB->buildAndFetch( array( 'select' => 'cs_value''from' => 'cache_store''where' => "cs_key='isRebuilt'" ) );

        if( 
$alreadyRebuilt['cs_value'] )
        {
            
$sections    explode','$alreadyRebuilt['cs_value'] );
        }

        
//-----------------------------------------
        // Get new parser and old parser
        //-----------------------------------------
        
        
$classToLoad IPSLib::loadLibraryIPS_ROOT_PATH 'sources/handlers/han_parse_bbcode.php''parseBbcode' );
        
$parser        = new $classToLoad$this->registry );
        
$oldparser    = new $classToLoad$this->registry'legacy' );

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$last    0;
        
$start  intval($this->request['st']) >=intval($this->request['st']) : 0;
        
$end    intval$this->request['pergo'] ) ? intval$this->request['pergo'] ) : 100;
        
$dis    intval($this->request['dis']) >=intval($this->request['dis']) : 0;
        
$output = array();
        
$plugin    null;

        
$types    = array( 'posts''pms''announce''sigs''aboutme''rules' );
        
        foreach( 
ipsRegistry::$applications as $app_dir => $app_data )
        {
            
//-----------------------------------------
            // Retrieve the RSS links for the header
            //-----------------------------------------
        
            
if( is_fileIPSLib::getAppDir$app_dir ) . '/extensions/upgradePostRebuild.php' ) )
            {
                
$className IPSLib::loadLibraryIPSLib::getAppDir$app_dir ) . '/extensions/upgradePostRebuild.php''postRebuild_'.$app_dir$app_dir );
                
                if( 
class_exists$className ) )
                {
                    
$rebuild = new $className$this->registry );
                    
                    if( 
method_exists$rebuild"getDropdown" ) )
                    {
                        
$options    $rebuild->getDropdown();
                        
                        if( 
count($options) )
                        {
                            foreach( 
$options as $appOption )
                            {
                                
$types[]    = $appOption[0];
                                
                                if( 
$appOption[0] == $this->request['type'] )
                                {
                                    
$plugin    =& $rebuild;
                                    break 
2;
                                }
                            }
                        }
                    }
                }
            }
        }

        
$type    in_array$this->request['type'], $types ) ? $this->request['type'] : 'posts';

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
switch( $type )
        {
            case 
'announce':
                
$tmp $this->DB->buildAndFetch( array( 'select' => 'announce_id''from' => 'announcements''limit' => array($dis,1)  ) );
                
$max intval$tmp['announce_id'] );
            break;

            case 
'pms':
                
$tmp $this->DB->buildAndFetch( array( 'select' => 'msg_id''from' => 'message_posts''limit' => array($dis,1)  ) );
                
$max intval$tmp['msg_id'] );
            break;

            case 
'sigs':
                
$tmp $this->DB->buildAndFetch( array( 'select' => 'pp_member_id''from' => 'profile_portal''where' => "signature IS NOT NULL AND signature != ''"'limit' => array($dis,1)  ) );
                
$max intval$tmp['pp_member_id'] );
            break;

            case 
'aboutme':
                
$tmp $this->DB->buildAndFetch( array( 'select' => 'pp_member_id''from' => 'profile_portal''where' => "pp_about_me IS NOT NULL AND pp_about_me != ''"'limit' => array($dis,1)  ) );
                
$max intval$tmp['pp_member_id'] );
            break;

            case 
'posts':
                
$tmp $this->DB->buildAndFetch( array( 'select' => 'pid''from' => 'posts''limit' => array($dis,1)  ) );
                
$max intval$tmp['pid'] );
            break;
            
            case 
'rules':
                
$tmp $this->DB->buildAndFetch( array( 'select' => 'id''from' => 'forums''where' => "rules_text IS NOT NULL AND rules_text != ''"'limit' => array($dis,1)  ) );
                
$max intval$tmp['id'] );
            break;
            
            default:
                
$max $rebuild->getMax$type$dis );
            break;
                
        }

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
switch( $type )
        {
            case 
'announce':
                
$this->DB->build( array( 'select'     => 'a.*',
                                                         
'from'     => array( 'announcements' => 'a' ),
                                                         
'order'     => 'a.announce_id ASC',
                                                         
'where'    => 'a.announce_id > ' $start,
                                                         
'limit'     => array($end),
                                                         
'add_join'    => array(     => array( 'type'        => 'left',
                                                                                              
'select'    => 'm.member_group_id, m.mgroup_others',
                                                                                                
'from'        => array( 'members' => 'm' ),
                                                                                                
'where'     => "m.member_id=a.announce_member_id"
                                                                                  
)    )
                                                )         );
            break;

            case 
'pms':
                
$this->DB->build( array( 'select'     => 'p.*',
                                                         
'from'     => array( 'message_posts' => 'p' ),
                                                         
'order'     => 'p.msg_id ASC',
                                                         
'where'    => 'p.msg_id > ' $start,
                                                         
'limit'     => array($end),
                                                         
'add_join'    => array(     => array( 'type'        => 'left',
                                                                                              
'select'    => 'm.member_group_id, m.mgroup_others',
                                                                                                
'from'        => array( 'members' => 'm' ),
                                                                                                
'where'     => "m.member_id=p.msg_author_id"
                                                                                  
)    )
                                                )         );
            break;

            case 
'sigs':
                
$this->DB->build( array( 'select'     => 'me.signature, me.pp_member_id',
                                                         
'from'     => array( 'profile_portal' => 'me' ),
                                                         
'order'     => 'me.pp_member_id ASC',
                                                         
'where'    => "me.signature IS NOT NULL AND me.signature != '' AND me.pp_member_id > " $start,
                                                         
'limit'     => array($end),
                                                         
'add_join'    => array(     => array( 'type'        => 'left',
                                                                                              
'select'    => 'm.member_group_id, m.mgroup_others',
                                                                                                
'from'        => array( 'members' => 'm' ),
                                                                                                
'where'     => "m.member_id=me.pp_member_id"
                                                                                  
)    )
                                                )         );
            break;

            case 
'aboutme':
                
$this->DB->build( array( 'select'     => 'pp.pp_about_me, pp.pp_member_id',
                                                         
'from'     => array( 'profile_portal' => 'pp' ),
                                                         
'order'     => 'pp.pp_member_id ASC',
                                                         
'where'    => "pp.pp_about_me != '' AND pp.pp_about_me IS NOT NULL AND pp.pp_member_id > " $start,
                                                         
'limit'     => array($end),
                                                         
'add_join'    => array(     => array( 'type'        => 'left',
                                                                                              
'select'    => 'm.member_group_id, m.mgroup_others',
                                                                                                
'from'        => array( 'members' => 'm' ),
                                                                                                
'where'     => "m.member_id=pp.pp_member_id"
                                                                                  
)    )
                                                )         );
            break;

            case 
'posts':
                
$this->DB->build( array( 'select'     => 'p.*',
                                                         
'from'     => array( 'posts' => 'p' ),
                                                         
'order'     => 'p.pid ASC',
                                                         
'where'    => 'p.pid > ' $start,
                                                         
'limit'     => array($end),
                                                         
'add_join'    => array(     => array( 'type'        => 'left',
                                                                                             
'select'    => 't.forum_id',
                                                                                                
'from'        => array( 'topics' => 't' ),
                                                                                                
'where'     => "t.tid=p.topic_id"
                                                                                  
),
                                                                                  
=> array( 'type'        => 'left',
                                                                                              
'select'    => 'm.member_group_id, m.mgroup_others',
                                                                                                
'from'        => array( 'members' => 'm' ),
                                                                                                
'where'     => "m.member_id=p.author_id"
                                                                                  
)    )
                                                )         );
            break;

            case 
'rules':
                
$this->DB->build( array( 'select' => '*''from' => 'forums''order' => 'id ASC''where' => "rules_text IS NOT NULL AND rules_text != '' AND id > " $start'limit' => array($end) ) );
            break;

            default:
                
$plugin->executeQuery$type$start$end );
            break;
        }

        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        /* On mssql, the select query blocks all the updates.  Doing this causes the engine not to lock */
        
if ( method_exists$this->DB'setQueryRowLocking' ) )
        {
            
$this->DB->setQueryRowLocking'OFF' );
        }
        
        while( 
$r $this->DB->fetch$outer ) )
        {
            
//-----------------------------------------
            // Group
            //-----------------------------------------
            
            
if( $r['member_group_id'] )
            {
                
$r    array_merge$r$this->caches['group_cache'][ $r['member_group_id'] ] );
            }

            
//-----------------------------------------
            // Reset
            //-----------------------------------------
            
            
$parser->quote_open                $oldparser->quote_open            0;
            
$parser->quote_closed            $oldparser->quote_closed            0;
            
$parser->quote_error            $oldparser->quote_error            0;
            
$parser->error                    $oldparser->error                    '';
            
$parser->image_count            $oldparser->image_count            0;
            
$parser->parsing_mgroup            $oldparser->parsing_mgroup        $r['member_group_id'];
            
$parser->parsing_mgroup_others    $oldparser->parsing_mgroup_others    $r['mgroup_others'];

            
$this->memberData['g_bypass_badwords'] = $this->caches['group_cache'][ $r['member_group_id'] ]['g_bypass_badwords'];

            switch( 
$type )
            {
                case 
'announce':
                    
$parser->parse_smilies    $oldparser->parse_smilies    1;
                    
$parser->parse_html        $oldparser->parse_html    $r['announce_html_enabled'];
                    
$parser->parse_bbcode    $oldparser->parse_bbcode    1;
                    
$parser->parse_nl2br    $oldparser->parse_nl2br    = ( $r['announce_html_enabled'] ? $r['announce_nlbr_enabled'] : );
                    
$parser->parsing_section        'announcement';

                    
$rawpost $oldparser->preEditParse$r['announce_post'] );
                break;

                case 
'pms':
                    
$parser->parse_smilies    $oldparser->parse_smilies    1;
                    
$parser->parse_html        $oldparser->parse_html    $r['g_dohtml'];
                    
$parser->parse_bbcode    $oldparser->parse_bbcode    1;
                    
$parser->parse_nl2br    $oldparser->parse_nl2br    1;
                    
$parser->parsing_section        'pms';

                    
$rawpost $oldparser->preEditParse$r['msg_post'] );
                break;

                case 
'sigs':
                    
$parser->parse_smilies    $oldparser->parse_smilies    0;
                    
$parser->parse_html        $oldparser->parse_html    $r['g_dohtml'];
                    
$parser->parse_bbcode    $oldparser->parse_bbcode    1;
                    
$parser->parse_nl2br    $oldparser->parse_nl2br    1;
                    
$parser->parsing_section        'signatures';

                    
$rawpost $oldparser->preEditParse$r['signature'] );
                break;

                case 
'aboutme':
                    
$parser->parse_smilies    $oldparser->parse_smilies    1;
                    
$parser->parse_html        $oldparser->parse_html    $r['g_dohtml'];
                    
$parser->parse_bbcode    $oldparser->parse_bbcode    1;
                    
$parser->parse_nl2br    $oldparser->parse_nl2br    1;
                    
$parser->parsing_section        'aboutme';

                    
$rawpost $oldparser->preEditParse$r['pp_about_me'] );
                break;

                case 
'posts':
                    
$parser->parse_smilies    $oldparser->parse_smilies    $r['use_emo'];
                    
$parser->parse_html        $oldparser->parse_html    = ( $this->registry->class_forums->forum_by_id$r['forum_id'] ]['use_html'] AND $r['g_dohtml'] AND $r['post_htmlstate'] > ) ? 0;
                    
$parser->parse_bbcode    $oldparser->parse_bbcode    $this->registry->class_forums->forum_by_id$r['forum_id'] ]['use_ibc'];
                    
$parser->parse_nl2br    $oldparser->parse_nl2br    = ( $r['post_htmlstate'] != ) ? 0;
                    
$parser->parsing_section        'topics';
                    
                    
$rawpost $oldparser->preEditParse$r['post'] );
                break;
                
                case 
'rules':
                    
$parser->parse_smilies    $oldparser->parse_smilies    1;
                    
$parser->parse_html        $oldparser->parse_html    1;
                    
$parser->parse_bbcode    $oldparser->parse_bbcode    1;
                    
$parser->parse_nl2br    $oldparser->parse_nl2br    1;
                    
$parser->parsing_section        'rules';

                    
$rawpost $oldparser->preEditParse$r['rules_text'] );
                break;
                
                default:
                    
$plugin->parser        =& $parser;
                    
$plugin->oldparser    =& $oldparser;

                    
$rawpost $plugin->getRawPost$type$r );
                break;
            }
            
            
/* @link http://community.invisionpower.com/tracker/issue-36434-rebuild-post-content-remove-break-from-post-content/ New parser retains <br>, legacy retains n */
            
if ( strstr$rawpost"n" ) )
            {
                
$rawpost nl2br$rawpost );
            }

            
$newpost $parser->preDbParse$rawpost );

            
//-----------------------------------------
            // Remove old ' escaping
            //-----------------------------------------

            
$newpost str_replace"\'""'"$newpost );

            
//-----------------------------------------
            // Convert old dohtml?
            //-----------------------------------------

            
$htmlstate 0;

            if ( 
strstrstrtolower($newpost), '[dohtml]' ) )
            {
                
//-----------------------------------------
                // Can we use HTML?
                //-----------------------------------------

                
if ( $type == 'posts' AND $this->registry->class_forums->forum_by_id$r['forum_id'] ]['use_html'] )
                {
                    
$htmlstate 2;
                }

                
$newpost preg_replace"#[dohtml]#i" ""$newpost );
                
$newpost preg_replace"#[/dohtml]#i"""$newpost );
            }
            else
            {
                
$htmlstate intval$r['post_htmlstate'] );
            }

            
//-----------------------------------------
            // Convert old attachment tags
            //-----------------------------------------

            
$newpost preg_replace"#[attachmentid=(d+?)]#is""[attachment=\1:attachment]"$newpost );

            if ( 
$newpost OR $type == 'sigs' OR $type == 'aboutme' )
            {
                switch( 
$type )
                {
                    case 
'posts':
                        
$this->DB->update'posts', array( 'post' => $newpost'post_htmlstate' => $htmlstate ), 'pid='.$r['pid'] );
                        
$last $r['pid'];
                    break;

                    case 
'pms':
                        
$this->DB->update'message_posts', array( 'msg_post' => $newpost ), 'msg_id='.$r['msg_id'] );
                        
$last $r['msg_id'];
                    break;

                    case 
'sigs':
                        
$this->DB->update'profile_portal', array( 'signature' => $newpost ), 'pp_member_id='.$r['pp_member_id'] );
                        
$last $r['pp_member_id'];
                    break;

                    case 
'aboutme':
                        
$this->DB->update'profile_portal', array( 'pp_about_me' => $newpost ), 'pp_member_id='.$r['pp_member_id'] );
                        
$last $r['pp_member_id'];
                    break;

                    case 
'announce':
                        
$this->DB->update'announcements', array( 'announce_post' => $newpost ), 'announce_id='.$r['announce_id'] );
                        
$last $r['announce_id'];
                    break;
                    
                    case 
'rules':
                        
$this->DB->update'forums', array( 'rules_text' => $newpost ), 'id='.$r['id'] );
                        
$last $r['id'];
                    break;
                    
                    default:
                        
$last $plugin->storeNewPost$type$r$newpost );
                    break;
                }
            }

            
$done++;
        }

        if ( 
method_exists$this->DB'setQueryRowLocking' ) )
        {
            
$this->DB->setQueryRowLocking'ON' );
        }
        
        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $last and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";

            
$sections[]    = $type;
            
$this->DB->replace'cache_store', array( 'cs_key' => 'isRebuilt''cs_value' => implode','$sections ) ), array( "cs_key" ) );
            
            if( 
$type == 'posts' )
            {
                
$this->DB->delete'content_cache_posts' );
            }
            else if( 
$type == 'sigs' )
            {
                
$this->DB->delete'content_cache_sigs' );
            }
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------

            
$dis  $dis $done;
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&type={$type}&pergo={$this->request['pergo']}&st={$last}&dis={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Resyncronize Topics
     *
     * @return    @e void
     */
    
public function resyncTopics()
    {
        
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir'forums' ) . '/sources/classes/moderate.php''moderatorLibrary''forums' );
        
$modfunc = new $classToLoad$this->registry );

        
$this->registry->class_localization->loadLanguageFile( array( 'public_global' ) );

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval$this->request['st'] ) >= intval$this->request['st']    ) : 0;
        
$end    intval$this->request['pergo'] )   ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'count(*) as count''from' => 'topics''limit' => array( $dis)  ) );
        
$max intval$tmp['count'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from' => 'topics''where' => "state != 'link'"'order' => 'tid ASC''limit' => array( $start$end ) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
$modfunc->rebuildTopic($r['tid'], 0);

            if ( 
$this->request['pergo'] <= 200 )
            {
                
$output[] = $this->lang->words['re_processed'].$r['title'];
            }

            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Resyncronize forum data
     *
     * @return    @e void
     */
    
public function resyncForums()
    {
        
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir'forums' ) . '/sources/classes/moderate.php''moderatorLibrary''forums' );
        
$modfunc = new $classToLoad$this->registry );

        
//-----------------------------------------
        // Set up
        //-----------------------------------------

        
$done   0;
        
$start  intval$this->request['st'] ) >= intval$this->request['st'] )    : 0;
        
$end    intval$this->request['pergo'] )   ? intval$this->request['pergo'] ) : 100;
        
$dis    $end $start;
        
$output = array();

        
//-----------------------------------------
        // Got any more?
        //-----------------------------------------

        
$tmp $this->DB->buildAndFetch( array( 'select' => 'count(*) as count''from' => 'forums''limit' => array( $dis)  ) );
        
$max intval$tmp['count'] );

        
//-----------------------------------------
        // Avoid limit...
        //-----------------------------------------

        
$this->DB->build( array( 'select' => '*''from' => 'forums''order' => 'id ASC''limit' => array( $start$end ) ) );
        
$outer $this->DB->execute();

        
//-----------------------------------------
        // Process...
        //-----------------------------------------

        
while( $r $this->DB->fetch$outer ) )
        {
            
$modfunc->forumRecount$r['id'] );
            
$output[] = sprintf$this->lang->words['rebuild_process_f'], $r['name'] );
            
$done++;
        }

        
//-----------------------------------------
        // Finish - or more?...
        //-----------------------------------------

        
if ( ! $done and ! $max )
        {
             
//-----------------------------------------
            // Done..
            //-----------------------------------------

            
$text $this->lang->words['re_rebuildcomp'] . '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}";
        }
        else
        {
            
//-----------------------------------------
            // More..
            //-----------------------------------------
            
$thisgoeshere sprintf$this->lang->words['re_thisgoeshere'], $dis );
            
$text $thisgoeshere '<br />' implode"<br />"$output );
            
$url  "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}";
        }

        
//-----------------------------------------
        // Bye....
        //-----------------------------------------

        
$this->_specialRedirect$url$text );
    }

    
/**
     * Splash screen with rebuild options
     *
     * @return    @e void
     */
    
public function rebuildSplashScreen()
    {
        
/* Build Form Elements */
        
$form = array();

        
$form['posts']   = $this->registry->output->formDropdown'posts'  , array( => array( 0$this->lang->words['yesno_no'] ), => array( 1$this->lang->words['yesno_yes'] ) ) );
        
$form['members'] = $this->registry->output->formDropdown'members', array( => array( 0$this->lang->words['yesno_no'] ), => array( 1$this->lang->words['yesno_yes'] ) ) );
        
$form['lastreg'] = $this->registry->output->formDropdown'lastreg', array( => array( 0$this->lang->words['yesno_no'] ), => array( 1$this->lang->words['yesno_yes'] ) ) );
        
$form['online']  = $this->registry->output->formDropdown'online' , array( => array( 0$this->lang->words['yesno_no'] ), => array( 1$this->lang->words['yesno_yes'] ) ) );

        
//-----------------------------------------
        // Only need to rebuild once
        //-----------------------------------------

        
$todo         = array(
                            array( 
'posts'     $this->lang->words['remenu_posts'] ),
                            array( 
'pms'     $this->lang->words['remenu_pms'] ),
                            array( 
'announce'$this->lang->words['remenu_announce'] ),
                            array( 
'sigs'     $this->lang->words['remenu_sigs'] ),
                            array( 
'aboutme' $this->lang->words['remenu_aboutme'] ),
                            array( 
'rules'     $this->lang->words['remenu_rules'] ),
                        );

        foreach( 
ipsRegistry::$applications as $app_dir => $app_data )
        {
            
//-----------------------------------------
            // Retrieve the RSS links for the header
            //-----------------------------------------
        
            
if( is_fileIPSLib::getAppDir$app_dir ) . '/extensions/upgradePostRebuild.php' ) )
            {
                
$className IPSLib::loadLibraryIPSLib::getAppDir$app_dir ) . '/extensions/upgradePostRebuild.php''postRebuild_'.$app_dir$app_dir );
                
                if( 
class_exists$className ) )
                {
                    
$rebuild = new $className$this->registry );
                    
                    if( 
method_exists$rebuild"getDropdown" ) )
                    {
                        
$todo array_merge$todo$rebuild->getDropdown() );
                    }
                }
            }
        }

        
$final        = array();
        
$sections    = array();

        
$alreadyRebuilt    $this->DB->buildAndFetch( array( 'select' => 'cs_value''from' => 'cache_store''where' => "cs_key='isRebuilt'" ) );

        if( 
$alreadyRebuilt['cs_value'] )
        {
            
$sections    explode','$alreadyRebuilt['cs_value'] );
        }

        
$form['pergo']  = $this->registry->output->formSimpleInput'pergo''50');

        
/* Output */
        
$this->registry->output->html           .= $this->html->rebuildSplashScreen$form$todo$sections );
    }
    
    
/**
     * Redirect via a temporary page
     *
     * @param    string    $url    URL to redirect to
     * @param    string    $text    Text to display
     * @return    @e void
     */
    
protected function _specialRedirect$url$text )
    {
        
$this->registry->output->html    .= $this->registry->output->global_template->temporaryRedirect$url$text );
    }
}
Онлайн: 2
Реклама