Files
2025-12-19 00:26:08 -08:00

1336 lines
38 KiB
PHP

<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board
| ========================================
| by Matthew Mecham
| (c) 2001 - 2004 Invision Power Services
| http://www.invisionboard.com
| ========================================
| Web: http://www.invisionboard.com
| Email: matt@ibforums.com
| Licence Info: http://www.invisionpower.com
+---------------------------------------------------------------------------
|
| > Moderator Core Functions
| > Module written by Matt Mecham
| > DBA Checked: Fri 21 May 2004
|
+--------------------------------------------------------------------------
| NOTE:
| This module does not do any access/permission checks, it merely
| does what is asked and returns - see function for more info
+--------------------------------------------------------------------------
*/
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'.";
exit();
}
class func_mod
{
var $ipsclass;
var $topic = "";
var $forum = "";
var $error = "";
var $auto_update = FALSE;
var $stm = "";
var $upload_dir = "./uploads";
var $moderator = "";
//-----------------------------------------
// @modfunctions: constructor
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE)
//-----------------------------------------
function func_mod()
{
$this->error = "";
return TRUE;
}
//-----------------------------------------
// @init: initialize module (allows us to create new obj)
// -----------
// Accepts: References to @$forum [ @$topic , @$moderator ]
// Returns: NOTHING (TRUE)
//-----------------------------------------
function init($forum="", $topic="", $moderator="")
{
$this->upload_dir = $this->ipsclass->vars['upload_dir'];
$this->forum = $forum;
if ( is_array($topic) )
{
$this->topic = $topic;
}
if ( is_array($moderator) )
{
$this->moderator = $moderator;
}
return TRUE;
}
//-----------------------------------------
// @post_delete: delete post ID(s)
// -----------
// Accepts: $id (array | string)
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function post_delete($id)
{
$posts = array();
$attach_tid = array();
$topics = array();
$this->error = "";
if ( is_array( $id ) )
{
// Better safe than sorry - this should have already been done though
$id = $this->ipsclass->clean_int_array( $id );
if ( count($id) > 0 )
{
$pid = " IN(".implode(",",$id).")";
}
else
{
return FALSE;
}
}
else
{
if ( intval($id) )
{
$pid = "=$id";
}
else
{
return FALSE;
}
}
//-----------------------------------------
// Get Stuff
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => 'pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) );
$this->ipsclass->DB->simple_exec();
while ( $r = $this->ipsclass->DB->fetch_row() )
{
$posts[ $r['pid'] ] = $r['topic_id'];
$topics[ $r['topic_id'] ] = 1;
}
//-----------------------------------------
// Is there an attachment to this post?
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'attachments', 'where' => "attach_rel_module='post' AND attach_rel_id".$pid ) );
$this->ipsclass->DB->simple_exec();
$attach_ids = array();
while ( $killmeh = $this->ipsclass->DB->fetch_row( ) )
{
if ( $killmeh['attach_location'] )
{
@unlink( $this->ipsclass->vars['upload_dir']."/".$killmeh['attach_location'] );
}
if ( $killmeh['attach_thumb_location'] )
{
@unlink( $this->ipsclass->vars['upload_dir']."/".$killmeh['attach_thumb_location'] );
}
$attach_ids[] = $killmeh['attach_id'];
$attach_tid[ $posts[ $killmeh['attach_pid'] ] ] = $posts[ $killmeh['attach_pid'] ];
}
if ( count($attach_ids) )
{
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'attachments', 'where' => "attach_id IN(".implode(",",$attach_ids).")" ) );
//-----------------------------------------
// Recount topic upload marker
//-----------------------------------------
require_once( ROOT_PATH.'sources/classes/post/class_post.php' );
$postlib = new class_post();
$postlib->ipsclass =& $this->ipsclass;
foreach( $attach_tid as $tid )
{
$postlib->pf_recount_topic_attachments($tid);
}
}
//-----------------------------------------
// delete the post
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) );
//-----------------------------------------
// Update the stats
//-----------------------------------------
$this->ipsclass->cache['stats']['total_replies'] -= count($posts);
$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
//-----------------------------------------
// Update all relevant topics
//-----------------------------------------
foreach( array_keys($topics) as $tid )
{
$this->rebuild_topic($tid);
}
$this->add_moderate_log("", "", "", $pid, "Deleted posts ($pid)");
return TRUE;
}
//-----------------------------------------
// @topic_add_reply: Appends topic with reply
// -----------
// Accepts: $post, $tids = array( 'tid', 'forumid' );
//
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function rebuild_topic($tid, $doforum=1)
{
$tid = intval($tid);
if ( $this->ipsclass->vars['post_order_column'] != 'post_date' )
{
$this->ipsclass->vars['post_order_column'] = 'pid';
}
if ( $this->ipsclass->vars['post_order_sort'] != 'desc' )
{
$this->ipsclass->vars['post_order_sort'] = 'asc';
}
//-----------------------------------------
// Get the correct number of replies
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => 'COUNT(*) as posts', 'from' => 'posts', 'where' => "topic_id=$tid and queued != 1" ) );
$this->ipsclass->DB->simple_exec();
$posts = $this->ipsclass->DB->fetch_row();
$pcount = intval( $posts['posts'] - 1 );
//-----------------------------------------
// Get the correct number of queued replies
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => 'COUNT(*) as posts', 'from' => 'posts', 'where' => "topic_id=$tid and queued=1" ) );
$this->ipsclass->DB->simple_exec();
$qposts = $this->ipsclass->DB->fetch_row();
$qpcount = intval( $qposts['posts'] );
//-----------------------------------------
// Get last post info
//-----------------------------------------
$this->ipsclass->DB->cache_add_query( 'mod_func_get_last_post', array( 'tid' => $tid, 'orderby' => $this->ipsclass->vars['post_order_column'] ) );
$this->ipsclass->DB->cache_exec_query();
$last_post = $this->ipsclass->DB->fetch_row();
$last_poster_name = $last_post['members_display_name'] ? $last_post['members_display_name'] : $last_post['author_name'];
//-----------------------------------------
// Get first post info
//-----------------------------------------
$this->ipsclass->DB->build_query( array( 'select' => 'p.post_date, p.author_id, p.author_name, p.pid',
'from' => array( 'posts' => 'p' ),
'where' => "p.topic_id=$tid",
'order' => "p.{$this->ipsclass->vars['post_order_column']} ASC",
'limit' => array(0,1),
'add_join' => array( 0 => array( 'select' => 'm.id, m.members_display_name',
'from' => array( 'members' => 'm' ),
'where' => "p.author_id=m.id",
'type' => 'left' ) )
) );
$this->ipsclass->DB->exec_query();
$first_post = $this->ipsclass->DB->fetch_row();
$first_poster_name = $first_post['members_display_name'] ? $first_post['members_display_name'] : $first_post['author_name'];
//-----------------------------------------
// Get number of attachments
//-----------------------------------------
$this->ipsclass->DB->cache_add_query( 'mod_func_get_attach_count', array( 'tid' => $tid ) );
$this->ipsclass->DB->cache_exec_query();
$attach = $this->ipsclass->DB->fetch_row();
//-----------------------------------------
// Update topic
//-----------------------------------------
$this->ipsclass->DB->force_data_type = array( 'starter_name' => 'string',
'last_poster_name' => 'string' );
$this->ipsclass->DB->do_update( 'topics', array( 'last_post' => intval($last_post['post_date'] ? $last_post['post_date'] : $first_post['post_date']),
'last_poster_id' => intval($last_post['author_id'] ? $last_post['author_id'] : ( $pcount > 0 ? 0 : $first_post['author_id'] )),
'last_poster_name' => $last_poster_name ? $last_poster_name : ( $pcount > 0 ? $this->ipsclass->lang['global_guestname'] : $first_poster_name ),
'topic_queuedposts' => intval($qpcount),
'posts' => intval($pcount),
'starter_id' => intval($first_post['author_id']),
'starter_name' => $first_poster_name,
'start_date' => intval($first_post['post_date']),
'topic_firstpost' => intval($first_post['pid']),
'topic_hasattach' => intval($attach['count'])
), 'tid='.$tid );
//-----------------------------------------
// Update first post
//-----------------------------------------
if ( (!isset($first_post['new_topic']) OR $first_post['new_topic'] != 1) and $first_post['pid'] )
{
$this->ipsclass->DB->do_shutdown_update( 'posts', array( 'new_topic' => 0 ), 'topic_id='.$tid );
$this->ipsclass->DB->do_shutdown_update( 'posts', array( 'new_topic' => 1 ), 'pid='.$first_post['pid'] );
}
//-----------------------------------------
// If we deleted the last post in a topic that was
// the last post in a forum, best update that :D
//-----------------------------------------
if ( ($this->ipsclass->forums->forum_by_id[ $last_post['forum_id'] ]['last_id'] == $tid) AND ($doforum == 1) )
{
$tt = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'title, tid, last_post, last_poster_id, last_poster_name',
'from' => 'topics',
'where' => 'forum_id='.$last_post['forum_id'].' and approved=1',
'order' => 'last_post desc',
'limit' => array( 0,1 )
) );
$dbs = array(
'last_title' => $tt['title'] ? $tt['title'] : "",
'last_id' => $tt['tid'] ? $tt['tid'] : 0,
'last_post' => $tt['last_post'] ? $tt['last_post'] : 0,
'last_poster_name' => $tt['last_poster_name'] ? $tt['last_poster_name'] : "",
'last_poster_id' => $tt['last_poster_id'] ? $tt['last_poster_id'] : 0,
);
$this->ipsclass->DB->force_data_type = array( 'last_poster_name' => 'string',
'last_title' => 'string' );
$this->ipsclass->DB->do_update( 'forums', $dbs, "id=".intval($this->forum['id']) );
if ( $this->ipsclass->forums->forum_by_id[ $this->forum['id'] ]['newest_id'] == $tid )
{
$sort_key = $this->ipsclass->forums->forum_by_id[ $this->forum['id'] ]['sort_key'];
$tt = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'title, tid',
'from' => 'topics',
'where' => 'forum_id='.$this->forum['id'].' and approved=1',
'order' => 'start_date desc',
'limit' => array( 0,1 )
) );
$dbs['newest_id'] = $tt['tid'] ? $tt['tid'] : "";
$dbs['newest_title'] = $tt['title'] ? $tt['title'] : "";
}
//-----------------------------------------
// Update forum cache
//-----------------------------------------
foreach( $dbs as $k => $v )
{
$this->ipsclass->cache['forum_cache'][ $this->forum['id'] ][ $k ] = $v;
}
$this->ipsclass->update_cache( array( 'name' => 'forum_cache', 'array' => 1, 'deletefirst' => 0 ) );
}
return TRUE;
}
//-----------------------------------------
// @topic_add_reply: Appends topic with reply
// -----------
// Accepts: $post, $tids = array( 'tid', 'forumid' );
//
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_add_reply($post="", $tids=array(), $incpost=0)
{
if ( $post == "" )
{
return FALSE;
}
if ( count( $tids ) < 1 )
{
return FALSE;
}
$post = array(
'author_id' => $this->ipsclass->member['id'],
'use_sig' => 1,
'use_emo' => 1,
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
'post_date' => time(),
'icon_id' => 0,
'post' => $post,
'author_name' => $this->ipsclass->member['members_display_name'],
'topic_id' => "",
'queued' => 0,
);
//-----------------------------------------
// Add posts...
//-----------------------------------------
$seen_fids = array();
$add_posts = 0;
foreach( $tids as $row )
{
$tid = intval($row[0]);
$fid = intval($row[1]);
$pa = array();
$ta = array();
if ( ! in_array( $fid, $seen_fids ) )
{
$seen_fids[] = $fid;
}
if ( $tid and $fid )
{
$pa = $post;
$pa['topic_id'] = $tid;
$this->ipsclass->DB->do_insert( 'posts', $pa );
$ta = array (
'last_poster_id' => $this->ipsclass->member['id'],
'last_poster_name' => $this->ipsclass->member['members_display_name'],
'last_post' => $pa['post_date'],
);
$db_string = $this->ipsclass->DB->compile_db_update_string( $ta );
$this->ipsclass->DB->force_data_type = array( 'last_poster_name' => 'string' );
$this->ipsclass->DB->simple_exec_query( array( 'update' => 'topics', 'set' => $db_string.", posts=posts+1", 'where' => 'tid='.$tid ) );
$add_posts++;
}
}
if ( $this->auto_update != FALSE )
{
if ( count($seen_fids) > 0 )
{
foreach( $seen_fids as $id )
{
$this->forum_recount( $id );
}
}
}
if ( $add_posts > 0 )
{
$this->ipsclass->cache['stats']['total_replies'] += $add_posts;
$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) );
//-----------------------------------------
// Update current members stuff
//-----------------------------------------
$pcount = "";
$mgroup = "";
if ( ($this->forum['inc_postcount']) and ($incpost != 0) )
{
//-----------------------------------------
// Increment the users post count
//-----------------------------------------
$pcount = "posts=posts+".$add_posts.", ";
}
//-----------------------------------------
// Are we checking for auto promotion?
//-----------------------------------------
if ($this->ipsclass->member['g_promotion'] != '-1&-1')
{
list($gid, $gposts) = explode( '&', $this->ipsclass->member['g_promotion'] );
if ( $gid > 0 and $gposts > 0 )
{
if ( $this->ipsclass->member['posts'] + $add_posts >= $gposts )
{
$mgroup = "mgroup='$gid', ";
}
}
}
$this->ipsclass->DB->simple_exec_query( array( 'update' => 'members', 'set' => $pcount.$mgroup."last_post=".time(), 'where' => "id=".$this->ipsclass->member['id'] ) );
}
return TRUE;
}
//-----------------------------------------
// @topic_close: close topic ID's
// -----------
// Accepts: Array ID's | Single ID
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_close($id)
{
$this->stm_init();
$this->stm_add_close();
$this->stm_exec($id);
return TRUE;
}
//-----------------------------------------
// @topic_open: open topic ID's
// -----------
// Accepts: Array ID's | Single ID
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_open($id)
{
$this->stm_init();
$this->stm_add_open();
$this->stm_exec($id);
return TRUE;
}
//-----------------------------------------
// @topic_pin: pin topic ID's
// -----------
// Accepts: Array ID's | Single ID
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_pin($id)
{
$this->stm_init();
$this->stm_add_pin();
$this->stm_exec($id);
return TRUE;
}
//-----------------------------------------
// @topic_unpin: unpin topic ID's
// -----------
// Accepts: Array ID's | Single ID
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_unpin($id)
{
$this->stm_init();
$this->stm_add_unpin();
$this->stm_exec($id);
return TRUE;
}
//-----------------------------------------
// @topic_delete: deletetopic ID(s)
// -----------
// Accepts: $id (array | string)
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_delete($id, $nostats=0)
{
$posts = array();
$attach = array();
$this->error = "";
if ( is_array( $id ) )
{
$id = $this->ipsclass->clean_int_array( $id );
if ( count($id) > 0 )
{
$tid = " IN(".implode(",",$id).")";
}
else
{
return FALSE;
}
}
else
{
if ( intval($id) )
{
$tid = "=$id";
}
else
{
return FALSE;
}
}
//-----------------------------------------
// Remove polls assigned to this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'polls', 'where' => "tid".$tid ) );
//-----------------------------------------
// Remove polls assigned to this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'voters', 'where' => "tid".$tid ) );
//-----------------------------------------
// Remove subscriptions to this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'tracker', 'where' => "topic_id".$tid ) );
//-----------------------------------------
// Remove ratings to this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topic_ratings', 'where' => "rating_tid".$tid ) );
//-----------------------------------------
// Remove topics read markers for this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topics_read', 'where' => "read_tid".$tid ) );
//-----------------------------------------
// Remove stored views for this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topic_views', 'where' => "views_tid".$tid ) );
//-----------------------------------------
// Remove polls assigned to this topic
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'topics', 'where' => "tid".$tid ) );
//-----------------------------------------
// Get PIDS for attachment deletion
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => 'pid', 'from' => 'posts', 'where' => "topic_id".$tid ) );
$this->ipsclass->DB->simple_exec();
while ( $r = $this->ipsclass->DB->fetch_row() )
{
$posts[] = $r['pid'];
}
//-----------------------------------------
// Remove the attachments
//-----------------------------------------
if ( count( $posts ) )
{
$this->ipsclass->DB->simple_construct( array( "select" => '*', 'from' => 'attachments', 'where' => "attach_rel_module='post' AND attach_rel_id IN (".implode(",",$posts).")" ) );
$o = $this->ipsclass->DB->simple_exec();
while ( $killmeh = $this->ipsclass->DB->fetch_row( $o ) )
{
if ( $killmeh['attach_location'] )
{
@unlink( $this->ipsclass->vars['upload_dir']."/".$killmeh['attach_location'] );
}
if ( $killmeh['attach_thumb_location'] )
{
@unlink( $this->ipsclass->vars['upload_dir']."/".$killmeh['attach_thumb_location'] );
}
$attach[] = $killmeh['attach_id'];
}
if ( count( $attach ) )
{
$this->ipsclass->DB->simple_construct( array( 'delete' => 'attachments', 'where' => "attach_id IN (".implode(",",$attach).")" ) );
$this->ipsclass->DB->simple_exec();
}
}
//-----------------------------------------
// Remove the posts
//-----------------------------------------
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "topic_id".$tid ) );
//-----------------------------------------
// Recount forum...
//-----------------------------------------
if ( $nostats == 0 )
{
if ( $this->forum['id'] )
{
$this->ipsclass->forums->forum_by_id[ $this->forum['id'] ]['_update_deletion'] = 1;
$this->forum_recount( $this->forum['id'] );
}
$this->stats_recount();
}
return TRUE;
}
//-----------------------------------------
// @topic_move: move topic ID(s)
// -----------
// Accepts: $topics (array | string) $source,
// $moveto
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function topic_move($topics, $source, $moveto, $leavelink=0)
{
$this->error = "";
$source = intval($source);
$moveto = intval($moveto);
if ( is_array( $topics ) )
{
$topics = $this->ipsclass->clean_int_array( $topics );
if ( count($topics) > 0 )
{
$tid = " IN(".implode(",",$topics).")";
}
else
{
return FALSE;
}
}
else
{
if ( intval($topics) )
{
$tid = "=$topics";
}
else
{
return FALSE;
}
}
//-----------------------------------------
// Update the topic
//-----------------------------------------
$this->ipsclass->DB->do_update( 'topics', array( 'forum_id' => $moveto ), "forum_id=$source AND tid".$tid );
//-----------------------------------------
// Update the polls
//-----------------------------------------
$this->ipsclass->DB->do_update( 'polls', array( 'forum_id' => $moveto ), "forum_id=$source AND tid".$tid );
//-----------------------------------------
// Are we leaving a stink er link?
//-----------------------------------------
if ( $leavelink != 0 )
{
$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'topics', 'where' => "tid".$tid ) );
$oq = $this->ipsclass->DB->simple_exec();
$this->ipsclass->DB->force_data_type = array( 'title' => 'string',
'starter_name' => 'string',
'last_poster_name' => 'string' );
while ( $row = $this->ipsclass->DB->fetch_row($oq) )
{
$this->ipsclass->DB->do_insert( 'topics', array (
'title' => $row['title'],
'description' => $row['description'],
'state' => 'link',
'posts' => 0,
'views' => 0,
'starter_id' => $row['starter_id'],
'start_date' => $row['start_date'],
'starter_name' => $row['starter_name'],
'last_post' => $row['last_post'],
'forum_id' => $source,
'approved' => 1,
'pinned' => 0,
'moved_to' => $row['tid'].'&'.$moveto,
'last_poster_id' => $row['last_poster_id'],
'last_poster_name' => $row['last_poster_name']
) );
}
}
//-----------------------------------------
// Sort out subscriptions
//-----------------------------------------
$this->ipsclass->DB->cache_add_query( 'mod_func_get_topic_tracker', array( 'tid' => $tid ) );
$this->ipsclass->DB->cache_exec_query();
$trid_to_delete = array();
while ( $r = $this->ipsclass->DB->fetch_row() )
{
//-----------------------------------------
// Match the perm group against forum_mask
//-----------------------------------------
$perm_id = $r['g_perm_id'];
if ( $r['org_perm_id'] )
{
$perm_id = $r['org_perm_id'];
}
$pass = 0;
$forum_perm_array = explode( ",", $this->ipsclass->forums->forum_by_id[ $r['forum_id'] ]['read_perms'] );
foreach( explode( ',', $perm_id ) as $u_id )
{
if ( in_array( $u_id, $forum_perm_array ) )
{
$pass = 1;
}
}
if ( $pass != 1 )
{
$trid_to_delete[] = $r['trid'];
}
}
if ( count($trid_to_delete) > 0 )
{
$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'tracker', 'where' => "trid IN(".implode(',', $trid_to_delete ).")" ) );
}
return TRUE;
}
//-----------------------------------------
// @stats_recount: Recount all topics & posts
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stats_recount()
{
if ( ! is_array($this->ipsclass->cache['stats']) )
{
$stats = $this->ipsclass->DB->simple_exec_query( array( 'select' => '*', 'from' => 'cache_store', 'where' => "cs_key='stats'" ) );
$this->ipsclass->cache['stats'] = unserialize($this->ipsclass->txt_stripslashes($stats['cs_value']));
}
$topics = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'COUNT(*) as tcount',
'from' => 'topics',
'where' => 'approved=1' ) );
$posts = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'SUM(posts) as replies',
'from' => 'topics',
'where' => 'approved=1' ) );
$this->ipsclass->cache['stats']['total_topics'] = $topics['tcount'];
$this->ipsclass->cache['stats']['total_replies'] = $posts['replies'];
$this->ipsclass->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0, 'donow' => 1 ) );
return TRUE;
}
//-----------------------------------------
// @forum_recount: Recount topic & posts in a forum
// -----------
// Accepts: forum_id
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function forum_recount($fid="")
{
$fid = intval($fid);
if ( ! $fid )
{
if ( $this->forum['id'] )
{
$fid = $this->forum['id'];
}
else
{
return FALSE;
}
}
//-----------------------------------------
// Get the topics..
//-----------------------------------------
$topics = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'COUNT(*) as count',
'from' => 'topics',
'where' => "approved=1 and forum_id=$fid" ) );
//-----------------------------------------
// Get the QUEUED topics..
//-----------------------------------------
$queued_topics = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'COUNT(*) as count',
'from' => 'topics',
'where' => "approved=0 and forum_id=$fid" ) );
//-----------------------------------------
// Get the posts..
//-----------------------------------------
$posts = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'SUM(posts) as replies',
'from' => 'topics',
'where' => "approved=1 and forum_id=$fid" ) );
//-----------------------------------------
// Get the QUEUED posts..
//-----------------------------------------
$queued_posts = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'SUM(topic_queuedposts) as replies',
'from' => 'topics',
'where' => "forum_id=$fid" ) );
//-----------------------------------------
// Get the forum last poster..
//-----------------------------------------
$this->ipsclass->DB->simple_construct( array( 'select' => 'tid, title, last_poster_id, last_poster_name, last_post',
'from' => 'topics',
'where' => "approved=1 and forum_id=$fid",
'order' => 'last_post DESC',
'limit' => array( 0,1 ) ) );
$this->ipsclass->DB->simple_exec();
$last_post = $this->ipsclass->DB->fetch_row();
$sort_key = $this->ipsclass->cache['forum_cache'][ $fid ]['sort_key'] ?
$this->ipsclass->cache['forum_cache'][ $fid ]['sort_key'] : 'last_post';
$newest_topic = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'title, tid',
'from' => 'topics',
'where' => 'forum_id='.$fid.' and approved=1',
'order' => 'start_date desc',
'limit' => array( 0,1 )
) );
//-----------------------------------------
// Reset this forums stats
//-----------------------------------------
$dbs = array(
'last_poster_id' => intval($last_post['last_poster_id']),
'last_poster_name' => $last_post['last_poster_name'],
'last_post' => intval($last_post['last_post']),
'last_title' => $last_post['title'],
'last_id' => intval($last_post['tid']),
'topics' => intval($topics['count']),
'posts' => intval($posts['replies']),
'queued_topics' => intval($queued_topics['count']),
'queued_posts' => intval($queued_posts['replies']),
'newest_id' => intval($newest_topic['tid']),
'newest_title' => $newest_topic['title'],
);
if ( isset($this->ipsclass->forums->forum_by_id[ $fid ]['_update_deletion']) AND $this->ipsclass->forums->forum_by_id[ $fid ]['_update_deletion'] )
{
$dbs['forum_last_deletion'] = time();
}
$this->ipsclass->DB->force_data_type = array( 'last_poster_name' => 'string',
'last_title' => 'string',
'newest_title' => 'string' );
$this->ipsclass->DB->do_update( 'forums', $dbs, "id=".$fid );
//-----------------------------------------
// Update forum cache
//-----------------------------------------
foreach( $dbs as $k => $v )
{
$this->ipsclass->cache['forum_cache'][ $fid ][ $k ] = $v;
}
$this->ipsclass->update_cache( array( 'name' => 'forum_cache', 'array' => 1, 'deletefirst' => 0 ) );
return TRUE;
}
//-----------------------------------------
// @stm_init: Clear statement ready for multi-actions
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_init()
{
$this->stm = array();
return TRUE;
}
//-----------------------------------------
// @stm_exec: Executes stored statement
// -----------
// Accepts: Array ID's | Single ID
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_exec($id)
{
if ( count($this->stm) < 1 )
{
return FALSE;
}
$final_array = array();
foreach( $this->stm as $real_array )
{
foreach( $real_array as $k => $v )
{
$final_array[ $k ] = $v;
}
}
$db_string = $this->ipsclass->DB->compile_db_update_string( $final_array );
if ( is_array($id) )
{
$id = $this->ipsclass->clean_int_array( $id );
if ( count($id) > 0 )
{
$this->ipsclass->DB->simple_exec_query( array( 'update' => 'topics', 'set' => $db_string, 'where' => "tid IN(".implode( ",", $id ).")" ) );
return TRUE;
}
else
{
return FALSE;
}
}
else if ( intval($id) != "" )
{
$this->ipsclass->DB->simple_exec_query( array( 'update' => 'topics', 'set' => $db_string, 'where' => "tid=".intval($id) ) );
}
else
{
return FALSE;
}
}
//-----------------------------------------
// @stm_add_pin: add pin command to statement
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_pin()
{
$this->stm[] = array( 'pinned' => 1 );
return TRUE;
}
//-----------------------------------------
// @stm_add_unpin: add unpin command to statement
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_unpin()
{
$this->stm[] = array( 'pinned' => 0 );
return TRUE;
}
//-----------------------------------------
// @stm_add_close: add close command to statement
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_close()
{
$this->stm[] = array( 'state' => 'closed' );
$this->stm[] = array( 'topic_open_time' => 0 );
$this->stm[] = array( 'topic_close_time' => 0 );
return TRUE;
}
//-----------------------------------------
// @stm_add_open: add open command to statement
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_open()
{
$this->stm[] = array( 'state' => 'open' );
$this->stm[] = array( 'topic_open_time' => 0 );
$this->stm[] = array( 'topic_close_time' => 0 );
return TRUE;
}
//-----------------------------------------
// @stm_add_title: add edit title command to statement
// -----------
// Accepts: new_title
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_title($new_title='')
{
if ( $new_title == "" )
{
return FALSE;
}
$this->stm[] = array( 'title' => $new_title );
return TRUE;
}
//-----------------------------------------
// @stm_add_desc: add edit desc command to statement
// -----------
// Accepts: new_title
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_desc($new_desc='')
{
if ( $new_desc == "" )
{
return FALSE;
}
$this->stm[] = array( 'description' => $new_desc );
return TRUE;
}
//-----------------------------------------
// @stm_add_approve: Approve topic
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_approve()
{
$this->stm[] = array( 'approved' => 1 );
return TRUE;
}
//-----------------------------------------
// @stm_add_unapprove: Unapprove topic
// -----------
// Accepts: NOTHING
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function stm_add_unapprove()
{
$this->stm[] = array( 'approved' => 0 );
return TRUE;
}
//-----------------------------------------
// @sql_prune_create: returns formatted SQL statement
// -----------
// Accepts: forum_id, poss_starter_id, poss_topic_state, poss_post_min
// poss_date_expiration, poss_ignore_pin_state
// Returns: formatted sql query
//-----------------------------------------
function sql_prune_create( $forum_id, $starter_id="", $topic_state="", $post_min="", $date_exp="", $ignore_pin="", $pergo=0, $limit=0 )
{
$this->ipsclass->DB->build_query( array( 'select' => 'tid', 'from' => 'topics', 'where' => 'forum_id='.intval($forum_id) ) );
$sql = $this->ipsclass->DB->cur_query;
if ( intval($date_exp) )
{
$sql .= " AND last_post < $date_exp";
}
if ( intval($starter_id) )
{
$sql .= " AND starter_id=$starter_id";
}
if ( intval($post_min) )
{
$sql .= " AND posts < $post_min";
}
if ($topic_state != 'all')
{
if ($topic_state)
{
$sql .= " AND state='$topic_state'";
}
}
if ( $ignore_pin != "" )
{
$sql .= " AND pinned=0";
}
if ( $pergo )
{
$this->ipsclass->DB->cur_query = $sql;
$this->ipsclass->DB->simple_limit( 0, $pergo );
$sql = $this->ipsclass->DB->cur_query;
$this->ipsclass->DB->flush_query();
}
return $sql;
}
//-----------------------------------------
// @mm_authorize: Authorizes current member
// -----------
// Accepts: (NOTHING: Should already be passed to init)
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function mm_authorize()
{
$pass_go = FALSE;
if ( $this->ipsclass->member['id'] )
{
if ( $this->ipsclass->member['g_is_supmod'] )
{
$pass_go = TRUE;
}
else if ( $this->moderator['can_mm'] == 1 )
{
$pass_go = TRUE;
}
}
return $pass_go;
}
//-----------------------------------------
// @mm_check_id_in_forum: Checks to see if mm_id is in
// the forum saved topic_mm_id
// -----------
// Accepts: (forum_topic_mm_id , this_mm_id)
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function mm_check_id_in_forum( $fid, $mm_data)
{
$retval = FALSE;
if ( $mm_data['mm_forums'] == '*' OR strstr( ",". $mm_data['mm_forums'].",", ",".$fid."," ) )
{
$retval = TRUE;
}
return $retval;
}
//-----------------------------------------
// @add_moderate_log: Adds entry to mod log
// -----------
// Accepts: (forum_id, topic_id, topic_title, post_id, title)
// Returns: NOTHING (TRUE/FALSE)
//-----------------------------------------
function add_moderate_log($fid, $tid, $pid, $t_title, $mod_title='Unknown')
{
$this->ipsclass->DB->force_data_type = array( 'member_name' => 'string' );
$this->ipsclass->DB->do_insert( 'moderator_logs', array (
'forum_id' => intval($fid),
'topic_id' => intval($tid),
'post_id' => intval($pid),
'member_id' => $this->ipsclass->member['id'],
'member_name' => $this->ipsclass->member['members_display_name'],
'ip_address' => $this->ipsclass->input['IP_ADDRESS'],
'http_referer'=> htmlspecialchars($this->ipsclass->my_getenv('HTTP_REFERER')),
'ctime' => time(),
'topic_title' => substr( $t_title, 0, 255 ),
'action' => substr( $mod_title, 0, 128 ),
'query_string'=> substr( htmlspecialchars($this->ipsclass->my_getenv('QUERY_STRING')), 0, 255 ),
) );
return TRUE;
}
}
?>