Moderator Core Functions | > Module written by Matt Mecham | +-------------------------------------------------------------------------- | NOTE: | This module does not do any access/permission checks, it merely | does what is asked and returns - see function for more info +-------------------------------------------------------------------------- */ class modfunctions { //------------------------------------------------------ // @modfunctions: constructor // ----------- // Accepts: NOTHING // Returns: NOTHING (TRUE) //------------------------------------------------------ var $topic = ""; var $forum = ""; var $error = ""; var $auto_update = FALSE; var $stm = ""; var $upload_dir = ""; var $moderator = ""; function modfunctions() { global $ibforums; $this->error = ""; $this->upload_dir = $ibforums->vars['upload_dir']; 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->forum = $forum; if ( is_array($topic) ) { $this->topic = $topic; } if ( is_array($moderator) ) { $this->moderator = $moderator; } 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) { global $std, $ibforums, $DB; if ( $post == "" ) { return FALSE; } if ( count( $tids ) < 1 ) { return FALSE; } $post = array( 'author_id' => $ibforums->member['id'], 'use_sig' => 1, 'use_emo' => 1, 'ip_address' => $ibforums->input['IP_ADDRESS'], 'post_date' => time(), 'icon_id' => 0, 'post' => $post, 'author_name' => $ibforums->member['name'], 'forum_id' => "", 'topic_id' => "", 'queued' => 0, 'attach_id' => "", 'attach_hits' => "", 'attach_type' => "", ); //------------------------------------- // 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['forum_id'] = $fid; $pa['topic_id'] = $tid; $db_string = $DB->compile_db_insert_string( $pa ); $DB->query("INSERT INTO ibf_posts (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")"); unset($db_string); $ta = array ( 'last_poster_id' => $ibforums->member['id'], 'last_poster_name' => $ibforums->member['name'], 'last_post' => $pa['post_date'], ); $db_string = $DB->compile_db_update_string( $ta ); $DB->query("UPDATE ibf_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 ) { $DB->query("UPDATE ibf_stats SET TOTAL_REPLIES=TOTAL_REPLIES+".$add_posts); //------------------------------------------------- // 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 ($ibforums->member['g_promotion'] != '-1&-1') { list($gid, $gposts) = explode( '&', $ibforums->member['g_promotion'] ); if ( $gid > 0 and $gposts > 0 ) { if ( $ibforums->member['posts'] + $add_posts >= $gposts ) { $mgroup = "mgroup='$gid', "; } } } $DB->query("UPDATE ibf_members SET ".$pcount.$mgroup."last_post=".time()." WHERE id=".$ibforums->member['id']); } return TRUE; } //------------------------------------------------------ // @topic_close: close topic ID's // ----------- // Accepts: Array ID's | Single ID // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function topic_close($id) { global $ibforums, $DB; $this->stm_init(); $this->stm_add_close(); $this->stm_exec($id); } //------------------------------------------------------ // @topic_open: open topic ID's // ----------- // Accepts: Array ID's | Single ID // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function topic_open($id) { global $ibforums, $DB; $this->stm_init(); $this->stm_add_open(); $this->stm_exec($id); } //------------------------------------------------------ // @topic_pin: pin topic ID's // ----------- // Accepts: Array ID's | Single ID // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function topic_pin($id) { global $ibforums, $DB; $this->stm_init(); $this->stm_add_pin(); $this->stm_exec($id); } //------------------------------------------------------ // @topic_unpin: unpin topic ID's // ----------- // Accepts: Array ID's | Single ID // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function topic_unpin($id) { global $ibforums, $DB; $this->stm_init(); $this->stm_add_unpin(); $this->stm_exec($id); } //------------------------------------------------------ // @topic_delete: deletetopic ID(s) // ----------- // Accepts: $id (array | string) // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function topic_delete($id) { global $std, $ibforums, $DB; $this->error = ""; if ( is_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 //------------------------------------ $DB->query("DELETE FROM ibf_polls WHERE tid".$tid); //------------------------------------ // Remove polls assigned to this topic //------------------------------------ $DB->query("DELETE FROM ibf_voters WHERE tid".$tid); //------------------------------------ // Remove polls assigned to this topic //------------------------------------ $DB->query("DELETE FROM ibf_topics WHERE tid".$tid); //------------------------------------ // Remove polls assigned to this topic //------------------------------------ $DB->query("SELECT attach_id, attach_hits, attach_file FROM ibf_posts WHERE attach_id <> '' AND topic_id".$tid); //------------------------------------ // Remove the attachments //------------------------------------ if ( $DB->get_num_rows() ) { while ( $r = $DB->fetch_row() ) { if (is_file($this->upload_dir."/".$r['attach_id'])) { @unlink ($this->upload_dir."/".$r['attach_id']); } } } //------------------------------------ // Remove the posts //------------------------------------ $DB->query("DELETE FROM ibf_posts WHERE topic_id".$tid); //------------------------------------ // Recount forum... //------------------------------------ if ( $this->forum['id'] ) { $this->forum_recount( $this->forum['id'] ); } $this->stats_recount(); } //------------------------------------------------------ // @topic_move: move topic ID(s) // ----------- // Accepts: $topics (array | string) $source, // $moveto // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function topic_move($topics, $source, $moveto, $leavelink=0) { global $std, $ibforums, $DB; $this->error = ""; $source = intval($source); $moveto = intval($moveto); if ( is_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 //---------------------------------- $DB->query("UPDATE ibf_topics SET forum_id=$moveto WHERE forum_id=$source AND tid".$tid); //---------------------------------- // Update the posts //---------------------------------- $DB->query("UPDATE ibf_posts SET forum_id=$moveto WHERE forum_id=$source AND topic_id".$tid); //---------------------------------- // Update the polls //---------------------------------- $DB->query("UPDATE ibf_polls SET forum_id=$moveto WHERE forum_id=$source AND tid".$tid); //---------------------------------- // Are we leaving a stink er link? //---------------------------------- if ( $leavelink != 0 ) { $oq = $DB->query("SELECT * FROM ibf_topics WHERE tid".$tid); while ( $row = $DB->fetch_row($oq) ) { $db_string = $DB->compile_db_insert_string( 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'] ) ); $DB->query("INSERT INTO ibf_topics (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")"); } } //---------------------------------- // Sort out subscriptions //---------------------------------- $DB->query("SELECT tr.*, m.id, m.mgroup, m.org_perm_id, f.read_perms, f.id, t.tid, g.g_id, g.g_perm_id FROM ibf_tracker tr LEFT JOIN ibf_topics t ON (tr.topic_id=t.tid) LEFT JOIN ibf_forums f ON (t.forum_id=f.id) LEFT JOIN ibf_members m on (m.id=tr.member_id) LEFT JOIN ibf_groups g on (g.g_id=m.mgroup) WHERE tr.topic_id".$tid); $trid_to_delete = array(); while ( $r = $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( ",", $r['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 ) { $DB->query("DELETE FROM ibf_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() { global $ibforums, $DB, $std; $DB->query("SELECT COUNT(tid) as tcount from ibf_topics WHERE approved=1"); $topics = $DB->fetch_row(); $DB->query("SELECT COUNT(pid) as pcount from ibf_posts WHERE queued <> 1"); $posts = $DB->fetch_row(); $posts = $posts['pcount'] - $topics['tcount']; $DB->query("UPDATE ibf_stats SET TOTAL_TOPICS=".$topics['tcount'].", TOTAL_REPLIES=".$posts); } //------------------------------------------------------ // @forum_recount_queue: Resets use_mod_posts boolean // ----------- // Accepts: forum_id // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function forum_recount_queue($fid="") { global $ibforums, $DB, $std; $fid = intval($fid); if ( ! $fid ) { return FALSE; } $DB->query("SELECT count(tid) as cnt FROM ibf_topics WHERE forum_id=$fid and approved <> 1"); $topic = $DB->fetch_row(); $tcount = intval( $topic['cnt'] ); $DB->query("SELECT count(pid) as cnt FROM ibf_posts WHERE forum_id=$fid and queued=1"); $post = $DB->fetch_row(); $pcount = intval( $post['cnt'] ); if ( ($tcount > 0) or ($pcount > 0) ) { $DB->query("UPDATE ibf_forums SET has_mod_posts=1 WHERE id=$fid"); } else { $DB->query("UPDATE ibf_forums SET has_mod_posts=0 WHERE id=$fid"); } return TRUE; } //------------------------------------------------------ // @forum_recount: Recount topic & posts in a forum // ----------- // Accepts: forum_id // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function forum_recount($fid="") { global $ibforums, $DB, $std; $fid = intval($fid); if ( ! $fid ) { if ( $this->forum['id'] ) { $fid = $this->forum['id']; } else { return FALSE; } } //---------------------------------------------- // Get the topics.. //---------------------------------------------- $DB->query("SELECT COUNT(tid) as count FROM ibf_topics WHERE approved=1 and forum_id=$fid"); $topics = $DB->fetch_row(); //---------------------------------------------- // Get the posts.. //---------------------------------------------- $DB->query("SELECT COUNT(pid) as count FROM ibf_posts WHERE queued <> 1 and forum_id=$fid"); $posts = $DB->fetch_row(); //---------------------------------------------- // Get the forum last poster.. //---------------------------------------------- $DB->query("SELECT tid, title, last_poster_id, last_poster_name, last_post FROM ibf_topics WHERE approved=1 and forum_id=$fid ORDER BY last_post DESC LIMIT 0,1"); $last_post = $DB->fetch_row(); //---------------------------------------------- // Get real post count by removing topic starting posts from the count //---------------------------------------------- $real_posts = intval($posts['count']) - intval($topics['count']); //---------------------------------------------- // Reset this forums stats //---------------------------------------------- $db_string = $DB->compile_db_update_string( array ( 'last_poster_id' => $last_post['last_poster_id'], 'last_poster_name' => $last_post['last_poster_name'], 'last_post' => $last_post['last_post'], 'last_title' => $last_post['title'], 'last_id' => $last_post['tid'], 'topics' => intval($topics['count']) < 1 ? 0 : intval($topics['count']), 'posts' => intval($real_posts) < 1 ? 0 : intval($real_posts), ) ); $DB->query("UPDATE ibf_forums SET $db_string WHERE id=".$fid); 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) { global $ibforums, $DB; if ( count($this->stm) < 1 ) { return FALSE; } $final_array = array(); foreach( $this->stm as $idx => $real_array ) { foreach( $real_array as $k => $v ) { $final_array[ $k ] = $v; } } $db_string = $DB->compile_db_update_string( $final_array ); if ( is_array($id) ) { if ( count($id) > 0 ) { $DB->query("UPDATE ibf_topics SET $db_string WHERE tid IN(".implode( ",", $id ).")"); return TRUE; } else { return FALSE; } } else if ( intval($id) != "" ) { $DB->query("UPDATE ibf_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' ); 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' ); 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; } //------------------------------------------------------ // @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: NOTHING (TRUE/FALSE) //------------------------------------------------------ function sql_prune_create( $forum_id, $starter_id="", $topic_state="", $post_min="", $date_exp="", $ignore_pin="" ) { $sql = "SELECT tid FROM ibf_topics WHERE approved=1 and forum_id=".intval($forum_id); 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 <> 1"; } return $sql; } //------------------------------------------------------ // @mm_authorize: Authorizes current member // ----------- // Accepts: (NOTHING: Should already be passed to init) // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function mm_authorize() { global $ibforums, $std; $pass_go = FALSE; if ( $ibforums->member['id'] ) { if ( $ibforums->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( $forum_topic_mm_id, $this_mm_id ) { $retval = FALSE; if ( stristr( $forum_topic_mm_id , ','.$this_mm_id.',' ) ) { $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') { global $std, $ibforums, $DB, $HTTP_REFERER, $QUERY_STRING; $db_string = $std->compile_db_string( array ( 'forum_id' => $fid, 'topic_id' => $tid, 'post_id' => $pid, 'member_id' => $ibforums->member['id'], 'member_name' => $ibforums->member['name'], 'ip_address' => $ibforums->input['IP_ADDRESS'], 'http_referer'=> $HTTP_REFERER, 'ctime' => time(), 'topic_title' => $t_title, 'action' => $mod_title, 'query_string'=> $QUERY_STRING, ) ); $DB->query("INSERT INTO ibf_moderator_logs (" .$db_string['FIELD_NAMES']. ") VALUES (". $db_string['FIELD_VALUES'] .")"); } } ?>