/** * Resyncronize forum data * * @access public * @return void */ public function resyncForums() { require_once IPSLib::getAppDir('forums') . '/sources/classes/moderate.php'; $modfunc = new moderatorLibrary($this->registry); //----------------------------------------- // Set up //----------------------------------------- $done = 0; $start = intval($this->request['st']) >= 0 ? 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, 1))); $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[] = "Processed forum " . $r['name']; $done++; } //----------------------------------------- // Finish - or more?... //----------------------------------------- if (!$done and !$max) { //----------------------------------------- // Done.. //----------------------------------------- $text = $this->lang->words['re_rebuildcomp'] . implode("<br />", $output); $url = "{$this->settings['base_url']}{$this->form_code}"; $time = 2; } else { //----------------------------------------- // More.. //----------------------------------------- $thisgoeshere = sprintf($this->lang->words['re_thisgoeshere'], $dis); $text = $thisgoeshere . implode("<br />", $output); $url = "{$this->settings['base_url']}{$this->form_code}&do={$this->request['do']}&pergo={$this->request['pergo']}&st={$dis}"; $time = 0; } //----------------------------------------- // Bye.... //----------------------------------------- $this->registry->output->redirect($url, $text, $time); }
/** * Delete a forum * * @access public * @return void Outputs to screen **/ public function doDelete() { //----------------------------------------- // Auth check... //----------------------------------------- $this->registry->adminFunctions->checkSecurityKey(); //----------------------------------------- // Continue //----------------------------------------- $this->request['f'] = intval($this->request['f']); $this->request['MOVE_ID'] = intval($this->request['MOVE_ID']); $this->request['new_parent_id'] = intval($this->request['new_parent_id']); $forum = $this->registry->class_forums->forum_by_id[$this->request['f']]; if (!$forum['id']) { $this->registry->output->showError($this->lang->words['for_noid_source'], 11313); } if (!$this->request['new_parent_id']) { $this->request['new_parent_id'] = -1; } else { if ($this->request['new_parent_id'] == $this->request['f']) { $this->registry->output->global_message = $this->lang->words['for_child_no_parent']; $this->deleteForm(); return; } } //----------------------------------------- // Would deleting this category orphan the only // remaining forums? //----------------------------------------- if ($forum['parent_id'] == -1) { $otherParent = 0; foreach ($this->registry->class_forums->forum_by_id as $id => $data) { if ($data['parent_id'] == -1) { $otherParent = $id; break; } } if (!$otherParent) { $this->registry->output->showError($this->lang->words['nodelete_last_cat'], 11364); } } //----------------------------------------- // Get library //----------------------------------------- require_once IPSLib::getAppDir('forums') . '/sources/classes/moderate.php'; $modfunc = new moderatorLibrary($this->registry); //----------------------------------------- // Move stuff //----------------------------------------- if ($this->request['MOVE_ID']) { if ($this->request['MOVE_ID'] == $this->request['f']) { $this->registry->output->global_message = $this->lang->words['for_wherewhatwhy']; $this->deleteForm(); } //----------------------------------------- // Move topics... //----------------------------------------- $this->DB->update('topics', array('forum_id' => $this->request['MOVE_ID']), 'forum_id=' . $this->request['f']); //----------------------------------------- // Move polls... //----------------------------------------- $this->DB->update('polls', array('forum_id' => $this->request['MOVE_ID']), 'forum_id=' . $this->request['f']); //----------------------------------------- // Move voters... //----------------------------------------- $this->DB->update('voters', array('forum_id' => $this->request['MOVE_ID']), 'forum_id=' . $this->request['f']); $modfunc->forumRecount($this->request['MOVE_ID']); } //----------------------------------------- // Delete the forum //----------------------------------------- $this->DB->delete('forums', "id=" . $this->request['f']); $this->DB->delete('permission_index', "app='forums' AND perm_type='forum' AND perm_type_id=" . $this->request['f']); //----------------------------------------- // Remove moderators from this forum //----------------------------------------- $this->DB->build(array('select' => '*', 'from' => 'moderators', 'where' => "forum_id LIKE '%,{$this->request['f']},%'")); $outer = $this->DB->execute(); while ($r = $this->DB->fetch($outer)) { $forums = explode(',', IPSText::cleanPermString($r['forum_id'])); $newForums = array(); foreach ($forums as $aForumId) { if ($aForumId != $this->request['f']) { $newForums[] = $aForumId; } } if (!count($newForums)) { $this->DB->delete('moderators', "mid=" . $r['mid']); } else { $this->DB->update('moderators', array('forum_id' => ',' . implode(',', $newForums) . ','), 'mid=' . $r['mid']); } } //----------------------------------------- // Delete forum subscriptions //----------------------------------------- $this->DB->delete('forum_tracker', "forum_id=" . $this->request['f']); //----------------------------------------- // Update children //----------------------------------------- $this->DB->update('forums', array('parent_id' => $this->request['new_parent_id']), "parent_id=" . $this->request['f']); //----------------------------------------- // Rebuild forum cache //----------------------------------------- $this->recacheForums(); //----------------------------------------- // Rebuild moderator cache //----------------------------------------- require_once IPSLib::getAppDir('forums') . '/modules_admin/forums/moderator.php'; $moderator = new admin_forums_forums_moderator($this->registry); $moderator->makeRegistryShortcuts($this->registry); $moderator->rebuildModeratorCache(); $this->registry->adminFunctions->saveAdminLog(sprintf($this->lang->words['for_removedlog'], $forum['name'])); $this->registry->output->doneScreen($this->lang->words['for_removed'], $this->lang->words['for_control'], $this->form_code, 'redirect'); }
/** * Delete a member's posts [process] * * @access private * @return void [Outputs to screen] */ private function _deletePostsDo() { //----------------------------------------- // INIT //----------------------------------------- $member_id = intval($this->request['member_id']); $delete_posts = intval($this->request['dposts']); $delete_topics = intval($this->request['dtopics']); $end = intval($this->request['dpergo']) ? intval($this->request['dpergo']) : 50; $init = intval($this->request['init']); $done = 0; $start = intval($this->request['st']) >= 0 ? intval($this->request['st']) : 0; $forums_affected = array(); $topics_affected = array(); $img = '<img src="' . $this->settings['skin_acp_url'] . '/images/aff_tick_small.png" border="0" alt="-" /> '; $posts_deleted = 0; $topics_deleted = 0; //-------------------------------------------- // NOT INIT YET? //-------------------------------------------- if (!$init) { $url = $this->settings['base_url'] . '&' . $this->form_code_js . "&do=deleteposts_process&dpergo=" . $this->request['dpergo'] . "&st=0" . "&init=1" . "&dposts={$delete_posts}" . "&dtopics={$delete_topics}" . "&use_trash_can=" . intval($this->request['use_trash_can']) . "&member_id={$member_id}"; $this->registry->output->multipleRedirectInit($url); } //-------------------------------------------- // Not loaded the func? //-------------------------------------------- if (!is_object($mod_func)) { require_once IPS_ROOT_PATH . 'sources/classes/itemmarking/classItemMarking.php'; $this->registry->setClass('classItemMarking', new classItemMarking($this->registry)); require_once IPSLib::getAppDir('forums') . '/sources/classes/moderate.php'; $mod_func = new moderatorLibrary($this->registry); } //----------------------------------------- // Trash-can set up //----------------------------------------- $trash_append = ''; if ($this->settings['forum_trash_can_enable'] and $this->settings['forum_trash_can_id']) { if ($this->registry->class_forums->forum_by_id[$this->settings['forum_trash_can_id']]['sub_can_post']) { if ($this->request['use_trash_can']) { $this->trash_forum = $this->settings['forum_trash_can_id']; $trash_append = " AND forum_id<>{$this->trash_forum}"; } } } //----------------------------------------- // Get member //----------------------------------------- $member = IPSMember::load($member_id, 'core'); //----------------------------------------- // Avoid limit... //----------------------------------------- $this->DB->build(array('select' => 'p.*', 'from' => array('posts' => 'p'), 'where' => "p.author_id={$member_id}{$trash_append}", 'order' => 'p.pid ASC', 'limit' => array($start, $end), 'add_join' => array(array('select' => 't.*', 'from' => array('topics' => 't'), 'where' => 't.tid=p.topic_id', 'type' => 'left')))); $outer = $this->DB->execute(); //----------------------------------------- // Process... //----------------------------------------- while ($r = $this->DB->fetch($outer)) { //----------------------------------------- // Copy record to topic array //----------------------------------------- $topic = $r; //----------------------------------------- // No longer a topic? //----------------------------------------- if (!$topic['tid']) { continue; } $done++; //----------------------------------------- // Get number of MID posters //----------------------------------------- $topic_i_posted = $this->DB->buildAndFetch(array('select' => 'COUNT(*) as count', 'from' => 'posts', 'where' => 'author_id=' . $member_id . ' AND topic_id=' . $r['topic_id'])); //----------------------------------------- // Aready deleted this topic? //----------------------------------------- if (!$topic_i_posted['count']) { continue; } //----------------------------------------- // First check: Our topic and no other replies? //----------------------------------------- if ($topic['starter_id'] == $member_id and $topic_i_posted['count'] == $topic['posts'] + 1) { //----------------------------------------- // Ok, deleting topics or posts? //----------------------------------------- if (($delete_posts or $delete_topics) and ($this->trash_forum and $this->trash_forum != $topic['forum_id'])) { //----------------------------------------- // Move, don't delete //----------------------------------------- $mod_func->topicMove($r['topic_id'], $topic['forum_id'], $this->trash_forum); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $forums_affected[$this->trash_forum] = $this->trash_forum; $topics_deleted++; $posts_deleted += $topic_i_posted['count']; } else { if ($delete_posts or $delete_topics) { $this->DB->delete('posts', 'author_id=' . $member_id . ' AND topic_id=' . $r['topic_id']); $this->DB->delete('topics', 'tid=' . $r['topic_id']); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $topics_deleted++; $posts_deleted += $topic_i_posted['count']; } } } else { if ($topic['starter_id'] == $member_id and $delete_topics) { if ($this->trash_forum and $this->trash_forum != $topic['forum_id']) { //----------------------------------------- // Move, don't delete //----------------------------------------- $mod_func->topicMove($r['topic_id'], $topic['forum_id'], $this->trash_forum); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $forums_affected[$this->trash_forum] = $this->trash_forum; $topics_deleted++; $posts_deleted += $topic_i_posted['count']; } else { $this->DB->delete('posts', 'topic_id=' . $r['topic_id']); $this->DB->delete('topics', 'tid=' . $r['topic_id']); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $topics_deleted++; $posts_deleted += $topic['posts'] + 1; } } else { if ($delete_posts and !$r['new_topic']) { if ($this->trash_forum and $this->trash_forum != $topic['forum_id']) { //----------------------------------------- // Set up and pass to split topic handler //----------------------------------------- $new_title = $this->lang->words['acp_posts_deleted_from'] . $topic['title']; $new_desc = $this->lang->words['acp_posts_deleted_from_tid'] . $topic['tid']; //----------------------------------------- // Is first post queued? //----------------------------------------- $topic_approved = 1; $first_post = $this->DB->buildAndFetch(array('select' => 'pid, queued', 'from' => 'posts', 'where' => "pid=" . $r['pid'])); if ($first_post['queued']) { $topic_approved = 0; $this->DB->update('posts', array('queued' => 0), 'pid=' . $first_post['pid']); } //----------------------------------------- // Complete a new dummy topic //----------------------------------------- $this->DB->insert('topics', array('title' => $new_title, 'description' => $new_desc, 'state' => 'open', 'posts' => 0, 'starter_id' => $member_id, 'starter_name' => $member['members_display_name'], 'start_date' => time(), 'last_poster_id' => $member_id, 'last_poster_name' => $member['members_display_name'], 'last_post' => time(), 'icon_id' => 0, 'author_mode' => 1, 'poll_state' => 0, 'last_vote' => 0, 'views' => 0, 'forum_id' => $this->trash_forum, 'approved' => $topic_approved, 'pinned' => 0)); $new_topic_id = $this->DB->getInsertId(); //----------------------------------------- // Move the posts //----------------------------------------- $this->DB->update('posts', array('topic_id' => $new_topic_id, 'new_topic' => 0, 'queued' => 0), "pid={$r['pid']}"); $this->DB->update('posts', array('new_topic' => 0), "topic_id={$topic['tid']}"); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $forums_affected[$this->trash_forum] = $this->trash_forum; $topics_affected[$topic['tid']] = $topic['tid']; $topics_affected[$new_topic_id] = $new_topic_id; $posts_deleted++; } else { $this->DB->delete('posts', 'pid=' . $r['pid']); $forums_affected[$topic['forum_id']] = $topic['forum_id']; $topics_affected[$topic['tid']] = $topic['tid']; $posts_deleted++; } } } } } //----------------------------------------- // Rebuild topics and forums //----------------------------------------- if (count($topics_affected)) { foreach ($topics_affected as $tid) { $mod_func->rebuildTopic($tid, 0); } } if (count($forums_affected)) { foreach ($forums_affected as $fid) { $mod_func->forumRecount($fid); } } //----------------------------------------- // Finish - or more?... //----------------------------------------- if (!$done) { //----------------------------------------- // Recount stats.. //----------------------------------------- $mod_func->statsRecount(); //----------------------------------------- // Reset member's posts //----------------------------------------- $forums = array(); foreach ($this->registry->class_forums->forum_by_id as $data) { if (!$data['inc_postcount']) { $forums[] = $data['id']; } } if (!count($forums)) { $count = $this->DB->buildAndFetch(array('select' => 'count(*) as count', 'from' => 'posts', 'where' => 'queued != 1 AND author_id=' . $member_id)); } else { $count = $this->DB->buildAndFetch(array('select' => 'count(p.pid) as count', 'from' => array('posts' => 'p'), 'where' => 'p.queued <> 1 AND p.author_id=' . $member_id . ' AND t.forum_id NOT IN (' . implode(",", $forums) . ')', 'add_join' => array(array('type' => 'left', 'from' => array('topics' => 't'), 'where' => 't.tid=p.topic_id')))); } $new_post_count = intval($count['count']); $this->registry->adminFunctions->saveAdminLog(sprintf($this->lang->words['member_posts_deleted'], $member['members_display_name'])); IPSMember::save($member_id, array('core' => array('posts' => $new_post_count))); $this->registry->output->multipleRedirectFinish($this->lang->words['mem_posts_process_done']); } else { //----------------------------------------- // More.. //----------------------------------------- $next = $start + $end; $url = $this->settings['base_url'] . '&' . $this->form_code_js . "&do=deleteposts_process&dpergo={$end}" . "&st={$next}" . "&init=1" . "&dposts={$delete_posts}" . "&dtopics={$delete_topics}" . "&use_trash_can=" . intval($this->request['use_trash_can']) . "&member_id={$member_id}"; $text = sprintf($this->lang->words['mem_posts_process_more'], $end, $posts_deleted, $topics_deleted); $this->registry->output->multipleRedirectHit($url, $img . ' ' . $text); } }