<?php
/**
* MyBB 1.6
* Copyright 2010 MyBB Group, All Rights Reserved
*
* Website: http://mybb.com
* License: http://mybb.com/about/license
*
* $Id: class_custommoderation.php 5828 2012-05-08 16:06:16Z Tomm $
*/
// Disallow direct access to this file for security reasons
if(!defined("IN_MYBB"))
{
die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}
/**
* Used to execute a custom moderation tool
*
*/
class CustomModeration extends Moderation
{
/**
* Get info on a tool
*
* @param int Tool ID
* @param mixed Thread IDs
* @param mixed Post IDs
* @return mixed Returns tool data (tid, type, name, description) in an array, otherwise boolean false.
*/
function tool_info($tool_id)
{
global $db;
// Get tool info
$query = $db->simple_select("modtools", "*", 'tid="'.intval($tool_id).'"');
$tool = $db->fetch_array($query);
if(!$tool['tid'])
{
return false;
}
else
{
return $tool;
}
}
/**
* Execute Custom Moderation Tool
*
* @param int Tool ID
* @param mixed Thread ID(s)
* @param mixed Post IDs
* @return string 'forum' or 'default' indicating where to redirect
*/
function execute($tool_id, $tids=0, $pids=0)
{
global $db;
// Get tool info
$query = $db->simple_select("modtools", '*', 'tid="'.intval($tool_id).'"');
$tool = $db->fetch_array($query);
if(!$tool['tid'])
{
return false;
}
// Format single tid and pid
if(!is_array($tids))
{
$tids = array($tids);
}
if(!is_array($pids))
{
$pids = array($pids);
}
// Unserialize custom moderation
$post_options = unserialize($tool['postoptions']);
$thread_options = unserialize($tool['threadoptions']);
// If the tool type is a post tool, then execute the post moderation
if($tool['type'] == 'p')
{
$deleted_thread = $this->execute_post_moderation($post_options, $pids, $tids);
}
// Always execute thead moderation
$this->execute_thread_moderation($thread_options, $tids);
// If the thread is deleted, indicate to the calling script to redirect to the forum, and not the nonexistant thread
if($thread_options['deletethread'] == 1 || $deleted_thread === 1)
{
return 'forum';
}
return 'default';
}
/**
* Execute Inline Post Moderation
*
* @param array Moderation information
* @param mixed Post IDs
* @param array Thread IDs (in order of dateline ascending)
* @return boolean true
*/
function execute_post_moderation($post_options, $pids, $tid)
{
global $db, $mybb, $lang;
if(is_array($tid))
{
$tid = intval($tid[0]); // There's only 1 thread when doing inline post moderation
// The thread chosen is the first thread in the array of tids.
// It is recommended that this be the tid of the oldest post
}
// Get the information about thread
$thread = get_thread($tid);
// If deleting posts, only do that
if($post_options['deleteposts'] == 1)
{
foreach($pids as $pid)
{
$this->delete_post($pid);
}
$delete_tids = array();
$imploded_pids = implode(",", array_map("intval", $pids));
$query = $db->simple_select("threads", "tid", "firstpost IN ({$imploded_pids})");
while($threadid = $db->fetch_field($query, "tid"))
{
$delete_tids[] = $threadid;
}
if(!empty($delete_tids))
{
foreach($delete_tids as $delete_tid)
{
$this->delete_thread($delete_tid);
mark_reports($delete_tid, "thread");
}
// return 1 here so the code in execute() above knows to redirect to the forum
return 1;
}
}
else
{
if($post_options['mergeposts'] == 1) // Merge posts
{
$this->merge_posts($pids);
}
if($post_options['approveposts'] == 'approve') // Approve posts
{
$this->approve_posts($pids);
}
elseif($post_options['approveposts'] == 'unapprove') // Unapprove posts
{
$this->unapprove_posts($pids);
}
elseif($post_options['approveposts'] == 'toggle') // Toggle post visibility
{
$this->toggle_post_visibility($pids);
}
if($post_options['splitposts'] > 0 || $post_options['splitposts'] == -2) // Split posts
{
$query = $db->simple_select("posts", "COUNT(*) AS totalposts", "tid='{$tid}'");
$count = $db->fetch_array($query);
if($count['totalposts'] == 1)
{
error($lang->error_cantsplitonepost);
}
if($count['totalposts'] == count($pids))
{
error($lang->error_cantsplitall);
}
if($post_options['splitposts'] == -2)
{
$post_options['splitposts'] = $thread['fid'];
}
if(empty($post_options['splitpostsnewsubject']))
{
// Enter in a subject if a predefined one does not exist.
$post_options['splitpostsnewsubject'] = "{$lang->split_thread_subject} {$thread['subject']}";
}
$new_subject = str_ireplace('{subject}', $thread['subject'], $post_options['splitpostsnewsubject']);
$new_tid = $this->split_posts($pids, $tid, $post_options['splitposts'], $new_subject);
if($post_options['splitpostsclose'] == 'close') // Close new thread
{
$this->close_threads($new_tid);
}
if($post_options['splitpostsstick'] == 'stick') // Stick new thread
{
$this->stick_threads($new_tid);
}
if($post_options['splitpostsunapprove'] == 'unapprove') // Unapprove new thread
{
$this->unapprove_threads($new_tid, $thread['fid']);
}
if(!empty($post_options['splitpostsaddreply'])) // Add reply to new thread
{
require_once MYBB_ROOT."inc/datahandlers/post.php";
$posthandler = new PostDataHandler("insert");
if(empty($post_options['splitpostsreplysubject']))
{
$post_options['splitpostsreplysubject'] = 'RE: '.$new_subject;
}
else
{
$post_options['splitpostsreplysubject'] = str_ireplace('{username}', $mybb->user['username'], $post_options['splitpostsreplysubject']);
$post_options['splitpostsreplysubject'] = str_ireplace('{subject}', $new_subject, $post_options['splitpostsreplysubject']);
}
// Set the post data that came from the input to the $post array.
$post = array(
"tid" => $new_tid,
"fid" => $post_options['splitposts'],
"subject" => $post_options['splitpostsreplysubject'],
"uid" => $mybb->user['uid'],
"username" => $mybb->user['username'],
"message" => $post_options['splitpostsaddreply'],
"ipaddress" => $db->escape_string(get_ip()),
);
// Set up the post options from the input.
$post['options'] = array(
"signature" => 1,
"emailnotify" => 0,
"disablesmilies" => 0
);
$posthandler->set_data($post);
if($posthandler->validate_post($post))
{
$posthandler->insert_post($post);
}
}
}
}
return true;
}
/**
* Execute Normal and Inline Thread Moderation
*
* @param array Moderation information
* @param mixed Thread IDs
* @return boolean true
*/
function execute_thread_moderation($thread_options, $tids)
{
global $db, $mybb;
$tid = intval($tids[0]); // Take the first thread to get thread data from
$query = $db->simple_select("threads", 'fid', "tid='$tid'");
$thread = $db->fetch_array($query);
// If deleting threads, only do that
if($thread_options['deletethread'] == 1)
{
foreach($tids as $tid)
{
$this->delete_thread($tid);
}
}
else
{
if($thread_options['mergethreads'] == 1 && count($tids) > 1) // Merge Threads (ugly temp code until find better fix)
{
$tid_list = implode(',', $tids);
$options = array('order_by' => 'dateline', 'order_dir' => 'DESC');
$query = $db->simple_select("threads", 'tid, subject', "tid IN ($tid_list)", $options); // Select threads from newest to oldest
$last_tid = 0;
while($tid = $db->fetch_array($query))
{
if($last_tid != 0)
{
$this->merge_threads($last_tid, $tid['tid'], $tid['subject']); // And keep merging them until we get down to one thread.
}
$last_tid = $tid['tid'];
}
}
if($thread_options['deletepoll'] == 1) // Delete poll
{
foreach($tids as $tid)
{
$this->delete_poll($tid);
}
}
if($thread_options['removeredirects'] == 1) // Remove redirects
{
foreach($tids as $tid)
{
$this->remove_redirects($tid);
}
}
if($thread_options['approvethread'] == 'approve') // Approve thread
{
$this->approve_threads($tids, $thread['fid']);
}
elseif($thread_options['approvethread'] == 'unapprove') // Unapprove thread
{
$this->unapprove_threads($tids, $thread['fid']);
}
elseif($thread_options['approvethread'] == 'toggle') // Toggle thread visibility
{
$this->toggle_thread_visibility($tids, $thread['fid']);
}
if($thread_options['openthread'] == 'open') // Open thread
{
$this->open_threads($tids);
}
elseif($thread_options['openthread'] == 'close') // Close thread
{
$this->close_threads($tids);
}
elseif($thread_options['openthread'] == 'toggle') // Toggle thread visibility
{
$this->toggle_thread_status($tids);
}
if($thread_options['threadprefix'] != '-1')
{
$this->apply_thread_prefix($tids, $thread_options['threadprefix']); // Update thread prefix
}
if(my_strtolower(trim($thread_options['newsubject'])) != '{subject}') // Update thread subjects
{
$this->change_thread_subject($tids, $thread_options['newsubject']);
}
if(!empty($thread_options['addreply'])) // Add reply to thread
{
$tid_list = implode(',', $tids);
$query = $db->simple_select("threads", 'fid, subject, tid, firstpost, closed', "tid IN ($tid_list) AND closed NOT LIKE 'moved|%'");
require_once MYBB_ROOT."inc/datahandlers/post.php";
// Loop threads adding a reply to each one
while($thread = $db->fetch_array($query))
{
$posthandler = new PostDataHandler("insert");
if(empty($thread_options['replysubject']))
{
$new_subject = 'RE: '.$thread['subject'];
}
else
{
$new_subject = str_ireplace('{username}', $mybb->user['username'], $thread_options['replysubject']);
$new_subject = str_ireplace('{subject}', $thread['subject'], $new_subject);
}
// Set the post data that came from the input to the $post array.
$post = array(
"tid" => $thread['tid'],
"replyto" => $thread['firstpost'],
"fid" => $thread['fid'],
"subject" => $new_subject,
"uid" => $mybb->user['uid'],
"username" => $mybb->user['username'],
"message" => $thread_options['addreply'],
"ipaddress" => $db->escape_string(get_ip()),
);
// Set up the post options from the input.
$post['options'] = array(
"signature" => 1,
"emailnotify" => 0,
"disablesmilies" => 0
);
if($thread['closed'] == 1)
{
// Keep this thread closed
$post['modoptions']['closethread'] = 1;
}
$posthandler->set_data($post);
if($posthandler->validate_post($post))
{
$posthandler->insert_post($post);
}
}
}
if($thread_options['movethread'] > 0 && $thread_options['movethread'] != $thread['fid']) // Move thread
{
if($thread_options['movethreadredirect'] == 1) // Move Thread with redirect
{
$time = TIME_NOW + ($thread_options['movethreadredirectexpire'] * 86400);
foreach($tids as $tid)
{
$this->move_thread($tid, $thread_options['movethread'], 'redirect', $time);
}
}
else // Normal move
{
$this->move_threads($tids, $thread_options['movethread']);
}
}
if($thread_options['copythread'] > 0 || $thread_options['copythread'] == -2) // Copy thread
{
if($thread_options['copythread'] == -2)
{
$thread_options['copythread'] = $thread['fid'];
}
foreach($tids as $tid)
{
$new_tid = $this->move_thread($tid, $thread_options['copythread'], 'copy');
}
}
}
return true;
}
}
?>