Mercurial > hg > vamp-website
diff forum/Sources/LockTopic.php @ 76:e3e11437ecea website
Add forum code
author | Chris Cannam |
---|---|
date | Sun, 07 Jul 2013 11:25:48 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/forum/Sources/LockTopic.php Sun Jul 07 11:25:48 2013 +0200 @@ -0,0 +1,158 @@ +<?php + +/** + * Simple Machines Forum (SMF) + * + * @package SMF + * @author Simple Machines http://www.simplemachines.org + * @copyright 2011 Simple Machines + * @license http://www.simplemachines.org/about/smf/license.php BSD + * + * @version 2.0 + */ + +if (!defined('SMF')) + die('Hacking attempt...'); + +/* This file only takes care of two things - locking and stickying. + + void LockTopic() + - locks a topic, toggles between locked/unlocked/admin locked. + - only admins can unlock topics locked by other admins. + - requires the lock_own or lock_any permission. + - logs the action to the moderator log. + - returns to the topic after it is done. + - accessed via ?action=lock. + + void Sticky() + - stickies a topic - toggles between sticky and normal. + - requires the make_sticky permission. + - adds an entry to the moderator log. + - when done, sends the user back to the topic. + - accessed via ?action=sticky. +*/ + +// Locks a topic... either by way of a moderator or the topic starter. +function LockTopic() +{ + global $topic, $user_info, $sourcedir, $board, $smcFunc; + + // Just quit if there's no topic to lock. + if (empty($topic)) + fatal_lang_error('not_a_topic', false); + + checkSession('get'); + + // Get Subs-Post.php for sendNotifications. + require_once($sourcedir . '/Subs-Post.php'); + + // Find out who started the topic - in case User Topic Locking is enabled. + $request = $smcFunc['db_query']('', ' + SELECT id_member_started, locked + FROM {db_prefix}topics + WHERE id_topic = {int:current_topic} + LIMIT 1', + array( + 'current_topic' => $topic, + ) + ); + list ($starter, $locked) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + // Can you lock topics here, mister? + $user_lock = !allowedTo('lock_any'); + if ($user_lock && $starter == $user_info['id']) + isAllowedTo('lock_own'); + else + isAllowedTo('lock_any'); + + // Locking with high privileges. + if ($locked == '0' && !$user_lock) + $locked = '1'; + // Locking with low privileges. + elseif ($locked == '0') + $locked = '2'; + // Unlocking - make sure you don't unlock what you can't. + elseif ($locked == '2' || ($locked == '1' && !$user_lock)) + $locked = '0'; + // You cannot unlock this! + else + fatal_lang_error('locked_by_admin', 'user'); + + // Actually lock the topic in the database with the new value. + $smcFunc['db_query']('', ' + UPDATE {db_prefix}topics + SET locked = {int:locked} + WHERE id_topic = {int:current_topic}', + array( + 'current_topic' => $topic, + 'locked' => $locked, + ) + ); + + // If they are allowed a "moderator" permission, log it in the moderator log. + if (!$user_lock) + logAction($locked ? 'lock' : 'unlock', array('topic' => $topic, 'board' => $board)); + // Notify people that this topic has been locked? + sendNotifications($topic, empty($locked) ? 'unlock' : 'lock'); + + // Back to the topic! + redirectexit('topic=' . $topic . '.' . $_REQUEST['start'] . (WIRELESS ? ';moderate' : '')); +} + +// Sticky a topic. Can't be done by topic starters - that would be annoying! +function Sticky() +{ + global $modSettings, $topic, $board, $sourcedir, $smcFunc; + + // Make sure the user can sticky it, and they are stickying *something*. + isAllowedTo('make_sticky'); + + // You shouldn't be able to (un)sticky a topic if the setting is disabled. + if (empty($modSettings['enableStickyTopics'])) + fatal_lang_error('cannot_make_sticky', false); + + // You can't sticky a board or something! + if (empty($topic)) + fatal_lang_error('not_a_topic', false); + + checkSession('get'); + + // We need Subs-Post.php for the sendNotifications() function. + require_once($sourcedir . '/Subs-Post.php'); + + // Is this topic already stickied, or no? + $request = $smcFunc['db_query']('', ' + SELECT is_sticky + FROM {db_prefix}topics + WHERE id_topic = {int:current_topic} + LIMIT 1', + array( + 'current_topic' => $topic, + ) + ); + list ($is_sticky) = $smcFunc['db_fetch_row']($request); + $smcFunc['db_free_result']($request); + + // Toggle the sticky value.... pretty simple ;). + $smcFunc['db_query']('', ' + UPDATE {db_prefix}topics + SET is_sticky = {int:is_sticky} + WHERE id_topic = {int:current_topic}', + array( + 'current_topic' => $topic, + 'is_sticky' => empty($is_sticky) ? 1 : 0, + ) + ); + + // Log this sticky action - always a moderator thing. + logAction(empty($is_sticky) ? 'sticky' : 'unsticky', array('topic' => $topic, 'board' => $board)); + // Notify people that this topic has been stickied? + if (empty($is_sticky)) + sendNotifications($topic, 'sticky'); + + // Take them back to the now stickied topic. + redirectexit('topic=' . $topic . '.' . $_REQUEST['start'] . (WIRELESS ? ';moderate' : '')); +} + +?> \ No newline at end of file