Gazelle/sections/forums/mod_thread.php

392 lines
10 KiB
PHP
Raw Normal View History

2011-03-28 14:21:28 +00:00
<?
/*********************************************************************\
//--------------Mod thread-------------------------------------------//
2013-02-22 08:00:24 +00:00
This page gets called if we're editing a thread.
2011-03-28 14:21:28 +00:00
Known issues:
2013-02-22 08:00:24 +00:00
If multiple threads are moved before forum activity occurs then
threads will linger with the 'Moved' flag until they're knocked off
2011-03-28 14:21:28 +00:00
the front page.
\*********************************************************************/
2013-10-14 08:00:53 +00:00
define('TRASH_FORUM_ID', 12);
2011-03-28 14:21:28 +00:00
// Quick SQL injection check
2013-04-19 08:00:55 +00:00
if (!is_number($_POST['threadid'])) {
error(404);
}
2013-05-04 08:00:48 +00:00
if ($_POST['title'] == '') {
2013-04-19 08:00:55 +00:00
error(0);
}
2011-03-28 14:21:28 +00:00
// End injection check
// Make sure they are moderators
2013-04-19 08:00:55 +00:00
if (!check_perms('site_moderate_forums')) {
error(403);
}
2011-03-28 14:21:28 +00:00
authorize();
// Variables for database input
$TopicID = (int)$_POST['threadid'];
2013-10-23 08:01:03 +00:00
$Sticky = isset($_POST['sticky']) ? 1 : 0;
$Locked = isset($_POST['locked']) ? 1 : 0;
$Ranking = (int)$_POST['ranking'];
2013-07-02 08:01:37 +00:00
if (!$Sticky && $Ranking > 0) {
2013-07-01 08:01:00 +00:00
$Ranking = 0;
2013-07-02 08:01:37 +00:00
} elseif (0 > $Ranking) {
2013-10-14 08:00:53 +00:00
error('Ranking cannot be a negative value');
2013-07-01 08:01:00 +00:00
}
2011-03-28 14:21:28 +00:00
$Title = db_string($_POST['title']);
2012-04-02 08:00:21 +00:00
$RawTitle = $_POST['title'];
2011-03-28 14:21:28 +00:00
$ForumID = (int)$_POST['forumid'];
$Page = (int)$_POST['page'];
2013-10-14 08:00:53 +00:00
$Action = '';
2011-03-28 14:21:28 +00:00
2012-04-02 08:00:21 +00:00
2011-03-28 14:21:28 +00:00
if ($Locked == 1) {
2012-04-02 08:00:21 +00:00
2013-07-02 08:01:37 +00:00
$DB->query("
DELETE FROM forums_last_read_topics
WHERE TopicID = '$TopicID'");
2011-03-28 14:21:28 +00:00
}
2013-04-19 08:00:55 +00:00
$DB->query("
SELECT
t.ForumID,
2013-10-14 08:00:53 +00:00
f.Name,
2013-04-19 08:00:55 +00:00
f.MinClassWrite,
2013-08-28 23:08:41 +00:00
COUNT(p.ID) AS Posts,
2013-10-14 08:00:53 +00:00
t.AuthorID,
t.Title,
t.IsLocked,
t.IsSticky,
t.Ranking
2011-03-28 14:21:28 +00:00
FROM forums_topics AS t
2013-07-02 08:01:37 +00:00
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'
2011-03-28 14:21:28 +00:00
GROUP BY p.TopicID");
2013-10-14 08:00:53 +00:00
list($OldForumID, $OldForumName, $MinClassWrite, $Posts, $ThreadAuthorID, $OldTitle, $OldLocked, $OldSticky, $OldRanking) = $DB->next_record(MYSQLI_BOTH, false);
2011-03-28 14:21:28 +00:00
2013-04-19 08:00:55 +00:00
if ($MinClassWrite > $LoggedUser['Class']) {
error(403);
}
2011-03-28 14:21:28 +00:00
// If we're deleting a thread
2013-04-19 08:00:55 +00:00
if (isset($_POST['delete'])) {
2013-10-14 08:00:53 +00:00
if (!check_perms('site_admin_forums')) {
error(403);
}
2013-02-22 08:00:24 +00:00
2013-10-14 08:00:53 +00:00
$DB->query("
DELETE FROM forums_posts
WHERE TopicID = '$TopicID'");
$DB->query("
DELETE FROM forums_topics
WHERE ID = '$TopicID'");
2013-02-22 08:00:24 +00:00
2013-10-14 08:00:53 +00:00
$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_NUM, false);
2013-02-22 08:00:24 +00:00
2013-10-14 08:00:53 +00:00
$DB->query("
UPDATE forums
SET
NumTopics = NumTopics - 1,
NumPosts = NumPosts - '$Posts',
LastPostTopicID = '$NewLastTopic',
LastPostID = '$NewLastPostID',
LastPostAuthorID = '$NewLastAuthorID',
LastPostTime = '$NewLastAddedTime'
2013-10-23 08:01:03 +00:00
WHERE ID = '$ForumID'");
2013-12-25 08:01:15 +00:00
$Cache->delete_value("forums_$ForumID");
2013-02-22 08:00:24 +00:00
2013-10-14 08:00:53 +00:00
$Cache->delete_value("thread_$TopicID");
2013-02-22 08:00:24 +00:00
2013-10-14 08:00:53 +00:00
$Cache->begin_transaction('forums_list');
$UpdateArray = array(
'NumPosts' => $NumPosts,
'NumTopics' => '-1',
'LastPostID' => $NewLastPostID,
'LastPostAuthorID' => $NewLastAuthorID,
'LastPostTopicID' => $NewLastTopic,
'LastPostTime' => $NewLastAddedTime,
'Title' => $NewLastTitle,
'IsLocked' => $NewLocked,
'IsSticky' => $NewSticky
);
2011-03-28 14:21:28 +00:00
2013-10-14 08:00:53 +00:00
$Cache->update_row($ForumID, $UpdateArray);
$Cache->commit_transaction(0);
$Cache->delete_value("thread_{$TopicID}_info");
2013-08-28 23:08:41 +00:00
2013-10-14 08:00:53 +00:00
// subscriptions
Subscriptions::move_subscriptions('forums', $TopicID, null);
2013-08-28 23:08:41 +00:00
2013-10-14 08:00:53 +00:00
// quote notifications
Subscriptions::flush_quote_notifications('forums', $TopicID);
2013-10-15 08:01:05 +00:00
$DB->query("
DELETE FROM users_notify_quoted
WHERE Page = 'forums'
AND PageID = '$TopicID'");
2013-10-14 08:00:53 +00:00
2013-10-15 08:01:05 +00:00
header("Location: forums.php?action=viewforum&forumid=$ForumID");
2011-03-28 14:21:28 +00:00
} else { // If we're just editing it
2013-10-14 08:00:53 +00:00
$Action = 'editing';
if (isset($_POST['trash'])) {
$ForumID = TRASH_FORUM_ID;
$Action = 'trashing';
}
2013-05-16 16:15:57 +00:00
2013-07-02 08:01:37 +00:00
$Cache->begin_transaction("thread_{$TopicID}_info");
2011-03-28 14:21:28 +00:00
$UpdateArray = array(
2013-04-19 08:00:55 +00:00
'IsSticky' => $Sticky,
2013-07-01 08:01:00 +00:00
'Ranking' => $Ranking,
2013-04-19 08:00:55 +00:00
'IsLocked' => $Locked,
'Title' => Format::cut_string($RawTitle, 150, 1, 0),
'ForumID' => $ForumID
2011-03-28 14:21:28 +00:00
);
$Cache->update_row(false, $UpdateArray);
$Cache->commit_transaction(0);
2013-02-22 08:00:24 +00:00
2013-04-19 08:00:55 +00:00
$DB->query("
UPDATE forums_topics
SET
IsSticky = '$Sticky',
2013-07-01 08:01:00 +00:00
Ranking = '$Ranking',
2013-04-19 08:00:55 +00:00
IsLocked = '$Locked',
Title = '$Title',
2013-07-02 08:01:37 +00:00
ForumID = '$ForumID'
WHERE ID = '$TopicID'");
2013-02-22 08:00:24 +00:00
2013-10-23 08:01:03 +00:00
// always clear cache when editing a thread.
// if a thread title, etc. is changed, this cache key must be cleared so the thread listing
// properly shows the new thread title.
$Cache->delete_value("forums_$ForumID");
2013-02-22 08:00:24 +00:00
2013-04-19 08:00:55 +00:00
if ($ForumID != $OldForumID) { // If we're moving a thread, change the forum stats
2013-10-14 08:00:53 +00:00
$Cache->delete_value("forums_$OldForumID");
2013-02-22 08:00:24 +00:00
2013-07-02 08:01:37 +00:00
$DB->query("
SELECT MinClassRead, MinClassWrite, Name
FROM forums
WHERE ID = '$ForumID'");
2012-06-16 08:00:18 +00:00
list($MinClassRead, $MinClassWrite, $ForumName) = $DB->next_record(MYSQLI_NUM, false);
2013-07-02 08:01:37 +00:00
$Cache->begin_transaction("thread_{$TopicID}_info");
2011-03-28 14:21:28 +00:00
$UpdateArray = array(
2013-04-19 08:00:55 +00:00
'ForumName' => $ForumName,
'MinClassRead' => $MinClassRead,
'MinClassWrite' => $MinClassWrite
2011-03-28 14:21:28 +00:00
);
$Cache->update_row(false, $UpdateArray);
2013-04-19 08:00:55 +00:00
$Cache->commit_transaction(3600 * 24 * 5);
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$Cache->begin_transaction('forums_list');
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
// Forum we're moving from
2013-04-19 08:00:55 +00:00
$DB->query("
SELECT
t.ID,
t.LastPostID,
t.Title,
p.AuthorID,
um.Username,
p.AddedTime,
2013-07-02 08:01:37 +00:00
(
SELECT COUNT(pp.ID)
2013-04-19 08:00:55 +00:00
FROM forums_posts AS pp
2013-07-02 08:01:37 +00:00
JOIN forums_topics AS tt ON pp.TopicID = tt.ID
WHERE tt.ForumID = '$OldForumID'
),
2013-04-19 08:00:55 +00:00
t.IsLocked,
2013-07-01 08:01:00 +00:00
t.IsSticky,
t.Ranking
2013-02-22 08:00:24 +00:00
FROM forums_topics AS t
2013-07-02 08:01:37 +00:00
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'
2013-04-19 08:00:55 +00:00
ORDER BY t.LastPostID DESC
LIMIT 1");
2013-07-01 08:01:00 +00:00
list($NewLastTopic, $NewLastPostID, $NewLastTitle, $NewLastAuthorID, $NewLastAuthorName, $NewLastAddedTime, $NumPosts, $NewLocked, $NewSticky, $NewRanking) = $DB->next_record(MYSQLI_NUM, false);
2013-02-22 08:00:24 +00:00
2013-04-19 08:00:55 +00:00
$DB->query("
UPDATE forums
SET
2013-07-02 08:01:37 +00:00
NumTopics = NumTopics - 1,
NumPosts = NumPosts - '$Posts',
LastPostTopicID = '$NewLastTopic',
LastPostID = '$NewLastPostID',
LastPostAuthorID = '$NewLastAuthorID',
LastPostTime = '$NewLastAddedTime'
WHERE ID = '$OldForumID'");
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$UpdateArray = array(
2013-04-19 08:00:55 +00:00
'NumPosts' => $NumPosts,
'NumTopics' => '-1',
'LastPostID' => $NewLastPostID,
'LastPostAuthorID' => $NewLastAuthorID,
'LastPostTopicID' => $NewLastTopic,
'LastPostTime' => $NewLastAddedTime,
'Title' => $NewLastTitle,
'IsLocked' => $NewLocked,
2013-07-01 08:01:00 +00:00
'IsSticky' => $NewSticky,
'Ranking' => $NewRanking
2011-03-28 14:21:28 +00:00
);
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$Cache->update_row($OldForumID, $UpdateArray);
// Forum we're moving to
2013-02-22 08:00:24 +00:00
2013-04-19 08:00:55 +00:00
$DB->query("
SELECT
t.ID,
t.LastPostID,
t.Title,
p.AuthorID,
um.Username,
p.AddedTime,
2013-07-02 08:01:37 +00:00
(
SELECT COUNT(pp.ID)
2013-04-19 08:00:55 +00:00
FROM forums_posts AS pp
2013-07-02 08:01:37 +00:00
JOIN forums_topics AS tt ON pp.TopicID = tt.ID
2013-10-23 08:01:03 +00:00
WHERE tt.ForumID = '$ForumID'
)
2013-04-19 08:00:55 +00:00
FROM forums_topics AS t
2013-07-02 08:01:37 +00:00
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'
2013-04-19 08:00:55 +00:00
ORDER BY t.LastPostID DESC
LIMIT 1");
2012-06-16 08:00:18 +00:00
list($NewLastTopic, $NewLastPostID, $NewLastTitle, $NewLastAuthorID, $NewLastAuthorName, $NewLastAddedTime, $NumPosts) = $DB->next_record(MYSQLI_NUM, false);
2013-02-22 08:00:24 +00:00
2013-04-19 08:00:55 +00:00
$DB->query("
UPDATE forums
SET
2013-07-02 08:01:37 +00:00
NumTopics = NumTopics + 1,
NumPosts = NumPosts + '$Posts',
LastPostTopicID = '$NewLastTopic',
LastPostID = '$NewLastPostID',
LastPostAuthorID = '$NewLastAuthorID',
LastPostTime = '$NewLastAddedTime'
WHERE ID = '$ForumID'");
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$UpdateArray = array(
2013-04-19 08:00:55 +00:00
'NumPosts' => ($NumPosts + $Posts),
'NumTopics' => '+1',
'LastPostID' => $NewLastPostID,
'LastPostAuthorID' => $NewLastAuthorID,
'LastPostTopicID' => $NewLastTopic,
'LastPostTime' => $NewLastAddedTime,
'Title' => $NewLastTitle
2011-03-28 14:21:28 +00:00
);
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$Cache->update_row($ForumID, $UpdateArray);
2013-02-22 08:00:24 +00:00
2011-03-28 14:21:28 +00:00
$Cache->commit_transaction(0);
2013-08-28 23:08:41 +00:00
if ($ForumID == TRASH_FORUM_ID) {
2013-10-14 08:00:53 +00:00
$Action = 'trashing';
2013-08-28 23:08:41 +00:00
}
2013-02-22 08:00:24 +00:00
} else { // Editing
2013-07-02 08:01:37 +00:00
$DB->query("
SELECT LastPostTopicID
FROM forums
WHERE ID = '$ForumID'");
2011-03-28 14:21:28 +00:00
list($LastTopicID) = $DB->next_record();
2013-04-19 08:00:55 +00:00
if ($LastTopicID == $TopicID) {
2011-03-28 14:21:28 +00:00
$UpdateArray = array(
2013-04-19 08:00:55 +00:00
'Title' => $RawTitle,
'IsLocked' => $Locked,
2013-07-01 08:01:00 +00:00
'IsSticky' => $Sticky,
'Ranking' => $Ranking
2011-03-28 14:21:28 +00:00
);
$Cache->begin_transaction('forums_list');
$Cache->update_row($ForumID, $UpdateArray);
$Cache->commit_transaction(0);
}
}
2013-04-19 08:00:55 +00:00
if ($Locked) {
$CatalogueID = floor($NumPosts / THREAD_CATALOGUE);
for ($i = 0; $i <= $CatalogueID; $i++) {
2013-07-02 08:01:37 +00:00
$Cache->expire_value("thread_{$TopicID}_catalogue_$i", 3600 * 24 * 7); // 7 days
2011-03-28 14:21:28 +00:00
}
2013-07-02 08:01:37 +00:00
$Cache->expire_value("thread_{$TopicID}_info", 3600 * 24 * 7); // 7 days
2013-02-22 08:00:24 +00:00
2013-07-02 08:01:37 +00:00
$DB->query("
UPDATE forums_polls
SET Closed = '0'
WHERE TopicID = '$TopicID'");
$Cache->delete_value("polls_$TopicID");
2011-03-28 14:21:28 +00:00
}
2013-10-14 08:00:53 +00:00
// topic notes and notifications
$TopicNotes = [];
switch ($Action) {
case 'editing':
if ($OldTitle != $RawTitle) {
// title edited
2013-10-23 08:01:03 +00:00
$TopicNotes[] = "Title edited from \"$OldTitle\" to \"$RawTitle\"";
2013-10-14 08:00:53 +00:00
}
if ($OldLocked != $Locked) {
if (!$OldLocked) {
$TopicNotes[] = 'Locked';
} else {
$TopicNotes[] = 'Unlocked';
}
}
if ($OldSticky != $Sticky) {
if (!$OldSticky) {
$TopicNotes[] = 'Stickied';
} else {
$TopicNotes[] = 'Unstickied';
}
}
if ($OldRanking != $Ranking) {
2013-10-23 08:01:03 +00:00
$TopicNotes[] = "Ranking changed from \"$OldRanking\" to \"$Ranking\"";
2013-10-14 08:00:53 +00:00
}
if ($ForumID != $OldForumID) {
2013-12-01 08:00:44 +00:00
$TopicNotes[] = "Moved from [url=" . site_url() . "forums.php?action=viewforum&forumid=$OldForumID]{$OldForumName}[/url] to [url=" . site_url() . "forums.php?action=viewforum&forumid=$ForumID]{$ForumName}[/url]";
2013-10-14 08:00:53 +00:00
}
break;
case 'trashing':
2013-12-01 08:00:44 +00:00
$TopicNotes[] = "Trashed (moved from [url=" . site_url() . "forums.php?action=viewforum&forumid=$OldForumID]{$OldForumName}[/url] to [url=" . site_url() . "forums.php?action=viewforum&forumid=$ForumID]{$ForumName}[/url])";
2013-10-23 08:01:03 +00:00
$Notification = "Your thread \"$NewLastTitle\" has been trashed";
2013-10-14 08:00:53 +00:00
break;
default:
break;
}
if (isset($Notification)) {
2013-10-15 08:01:05 +00:00
NotificationsManager::notify_user($ThreadAuthorID, NotificationsManager::FORUMALERTS, $Notification, "forums.php?action=viewthread&threadid=$TopicID");
2013-10-14 08:00:53 +00:00
}
if (count($TopicNotes) > 0) {
Forums::add_topic_note($TopicID, implode("\n", $TopicNotes));
2013-08-28 23:08:41 +00:00
}
2013-10-15 08:01:05 +00:00
header("Location: forums.php?action=viewthread&threadid=$TopicID&page=$Page");
2011-03-28 14:21:28 +00:00
}