Gazelle/sections/forums/mod_thread.php
What.CD dcaa536e58 Update sphinxapi for v2
Allow indexing by column 0 in ->to_array()

Only need numeric indices in 'ip_bans' key

Cache keys were completely broken on the debug pages

Add bbcode missing functions to staffpms

Add border to improve layout of torrent pages with postmod

Fix a bug where users could download anyone's snatch/upload/seedlist regardless of paranoia settings

Don't escape thread titles before caching

Better BBCode URL matching

Fix user search by tracker IP for ocelot data

Fix bug where the same thread would show up twice in the announcements forum

Update tables before sending invite email to prevent sending multiple invites
2011-05-12 10:24:03 +00:00

254 lines
7.5 KiB
PHP

<?
/*********************************************************************\
//--------------Mod thread-------------------------------------------//
This page gets called if we're editing a thread.
Known issues:
If multiple threads are moved before forum activity occurs then
threads will linger with the 'Moved' flag until they're knocked off
the front page.
\*********************************************************************/
// Quick SQL injection check
if(!is_number($_POST['threadid'])) { error(404); }
if($_POST['title'] == ''){ error(0); }
// End injection check
// Make sure they are moderators
if(!check_perms('site_moderate_forums')) { error(403); }
authorize();
// Variables for database input
$TopicID = (int)$_POST['threadid'];
$Sticky = (isset($_POST['sticky'])) ? 1 : 0;
$Locked = (isset($_POST['locked'])) ? 1 : 0;
$Title = db_string($_POST['title']);
$ForumID = (int)$_POST['forumid'];
$Page = (int)$_POST['page'];
if ($Locked == 1) {
$DB->query("DELETE FROM forums_last_read_topics WHERE TopicID='$TopicID'");
}
$DB->query("SELECT
t.ForumID,
f.MinClassWrite,
COUNT(p.ID) AS Posts
FROM forums_topics AS t
LEFT JOIN forums_posts AS p ON p.TopicID=t.ID
LEFT JOIN forums AS f ON f.ID=.t.ForumID
WHERE t.ID='$TopicID'
GROUP BY p.TopicID");
list($OldForumID, $MinClassWrite, $Posts) = $DB->next_record();
if($MinClassWrite > $LoggedUser['Class']) { error(403); }
// If we're moving
$Cache->delete_value('forums_'.$ForumID);
$Cache->delete_value('forums_'.$OldForumID);
// If we're deleting a thread
if(isset($_POST['delete'])) {
$DB->query("DELETE FROM forums_posts WHERE TopicID='$TopicID'");
$DB->query("DELETE FROM forums_topics WHERE ID='$TopicID'");
$DB->query("SELECT
t.ID,
t.LastPostID,
t.Title,
p.AuthorID,
um.Username,
p.AddedTime,
(SELECT COUNT(pp.ID) FROM forums_posts AS pp JOIN forums_topics AS tt ON pp.TopicID=tt.ID WHERE tt.ForumID='$ForumID'),
t.IsLocked,
t.IsSticky
FROM forums_topics AS t
JOIN forums_posts AS p ON p.ID=t.LastPostID
LEFT JOIN users_main AS um ON um.ID=p.AuthorID
WHERE t.ForumID='$ForumID'
GROUP BY t.ID
ORDER BY t.LastPostID DESC LIMIT 1");
list($NewLastTopic, $NewLastPostID, $NewLastTitle, $NewLastAuthorID, $NewLastAuthorName, $NewLastAddedTime, $NumPosts, $NewLocked, $NewSticky) = $DB->next_record(MYSQLI_BOTH, false);
$DB->query("UPDATE forums SET
NumTopics=NumTopics-1,
NumPosts=NumPosts-'$Posts',
LastPostTopicID='$NewLastTopic',
LastPostID='$NewLastPostID',
LastPostAuthorID='$NewLastAuthorID',
LastPostTime='$NewLastAddedTime'
WHERE ID='$ForumID'");
$Cache->delete('thread_'.$TopicID);
$Cache->begin_transaction('forums_list');
$UpdateArray = array(
'NumPosts'=>$NumPosts,
'NumTopics'=>'-1',
'LastPostID'=>$NewLastPostID,
'LastPostAuthorID'=>$NewLastAuthorID,
'Username'=>$NewLastAuthorName,
'LastPostTopicID'=>$NewLastTopic,
'LastPostTime'=>$NewLastAddedTime,
'Title'=>$NewLastTitle,
'IsLocked'=>$NewLocked,
'IsSticky'=>$NewSticky
);
$Cache->update_row($ForumID, $UpdateArray);
$Cache->commit_transaction(0);
$Cache->delete_value('thread_'.$TopicID.'_info');
header('Location: forums.php?action=viewforum&forumid='.$ForumID);
} else { // If we're just editing it
$Cache->begin_transaction('thread_'.$TopicID.'_info');
$UpdateArray = array(
'IsSticky'=>$Sticky,
'IsLocked'=>$Locked,
'Title'=>cut_string($_POST['title'], 150, 1, 0),
'ForumID'=>$ForumID
);
$Cache->update_row(false, $UpdateArray);
$Cache->commit_transaction(0);
$DB->query("UPDATE forums_topics SET
IsSticky = '$Sticky',
IsLocked = '$Locked',
Title = '$Title',
ForumID ='$ForumID'
WHERE ID='$TopicID'");
if($ForumID!=$OldForumID) { // If we're moving a thread, change the forum stats
$DB->query("SELECT MinClassRead, MinClassWrite, Name FROM forums WHERE ID='$ForumID'");
list($MinClassRead, $MinClassWrite, $ForumName) = $DB->next_record();
$Cache->begin_transaction('thread_'.$TopicID.'_info');
$UpdateArray = array(
'ForumName'=>$ForumName,
'MinClassRead'=>$MinClassRead,
'MinClassWrite'=>$MinClassWrite
);
$Cache->update_row(false, $UpdateArray);
$Cache->commit_transaction(3600*24*5);
$Cache->begin_transaction('forums_list');
// Forum we're moving from
$DB->query("SELECT
t.ID,
t.LastPostID,
t.Title,
p.AuthorID,
um.Username,
p.AddedTime,
(SELECT COUNT(pp.ID) FROM forums_posts AS pp JOIN forums_topics AS tt ON pp.TopicID=tt.ID WHERE tt.ForumID='$OldForumID'),
t.IsLocked,
t.IsSticky
FROM forums_topics AS t
JOIN forums_posts AS p ON p.ID=t.LastPostID
LEFT JOIN users_main AS um ON um.ID=p.AuthorID
WHERE t.ForumID='$OldForumID'
ORDER BY t.LastPostID DESC LIMIT 1");
list($NewLastTopic, $NewLastPostID, $NewLastTitle, $NewLastAuthorID, $NewLastAuthorName, $NewLastAddedTime, $NumPosts, $NewLocked, $NewSticky) = $DB->next_record(MYSQLI_NUM, false);
$DB->query("UPDATE forums SET
NumTopics=NumTopics-1,
NumPosts=NumPosts-'$Posts',
LastPostTopicID='$NewLastTopic',
LastPostID='$NewLastPostID',
LastPostAuthorID='$NewLastAuthorID',
LastPostTime='$NewLastAddedTime'
WHERE ID='$OldForumID'");
$UpdateArray = array(
'NumPosts'=>$NumPosts,
'NumTopics'=>'-1',
'LastPostID'=>$NewLastPostID,
'LastPostAuthorID'=>$NewLastAuthorID,
'Username'=>$NewLastAuthorName,
'LastPostTopicID'=>$NewLastTopic,
'LastPostTime'=>$NewLastAddedTime,
'Title'=>$NewLastTitle,
'IsLocked'=>$NewLocked,
'IsSticky'=>$NewSticky
);
$Cache->update_row($OldForumID, $UpdateArray);
// Forum we're moving to
$DB->query("SELECT
t.ID,
t.LastPostID,
t.Title,
p.AuthorID,
um.Username,
p.AddedTime,
(SELECT COUNT(pp.ID) FROM forums_posts AS pp JOIN forums_topics AS tt ON pp.TopicID=tt.ID WHERE tt.ForumID='$ForumID')
FROM forums_topics AS t
JOIN forums_posts AS p ON p.ID=t.LastPostID
LEFT JOIN users_main AS um ON um.ID=p.AuthorID
WHERE t.ForumID='$ForumID'
ORDER BY t.LastPostID DESC LIMIT 1");
list($NewLastTopic, $NewLastPostID, $NewLastTitle, $NewLastAuthorID, $NewLastAuthorName, $NewLastAddedTime, $NumPosts) = $DB->next_record();
$DB->query("UPDATE forums SET
NumTopics=NumTopics+1,
NumPosts=NumPosts+'$Posts',
LastPostTopicID='$NewLastTopic',
LastPostID='$NewLastPostID',
LastPostAuthorID='$NewLastAuthorID',
LastPostTime='$NewLastAddedTime'
WHERE ID='$ForumID'");
$UpdateArray = array(
'NumPosts'=>($NumPosts+$Posts),
'NumTopics'=>'+1',
'LastPostID'=>$NewLastPostID,
'LastPostAuthorID'=>$NewLastAuthorID,
'Username'=>$NewLastAuthorName,
'LastPostTopicID'=>$NewLastTopic,
'LastPostTime'=>$NewLastAddedTime,
'Title'=>$NewLastTitle
);
$Cache->update_row($ForumID, $UpdateArray);
$Cache->commit_transaction(0);
} else { // Editing
$DB->query("SELECT LastPostTopicID FROM forums WHERE ID='$ForumID'");
list($LastTopicID) = $DB->next_record();
if($LastTopicID == $TopicID) {
$UpdateArray = array(
'Title'=>$_POST['title'],
'IsLocked'=>$Locked,
'IsSticky'=>$Sticky
);
$Cache->begin_transaction('forums_list');
$Cache->update_row($ForumID, $UpdateArray);
$Cache->commit_transaction(0);
}
}
if($Locked) {
$CatalogueID = floor($NumPosts/THREAD_CATALOGUE);
for($i=0;$i<=$CatalogueID;$i++) {
$Cache->expire_value('thread_'.$TopicID.'_catalogue_'.$i,3600*24*7);
}
$Cache->expire_value('thread_'.$TopicID.'_info',3600*24*7);
$DB->query('UPDATE forums_polls SET Closed=\'0\' WHERE TopicID=\''.$TopicID.'\'');
$Cache->delete_value('polls_'.$TopicID);
}
header('Location: forums.php?action=viewthread&threadid='.$TopicID.'&page='.$Page);
}