annotate forum/Sources/ModerationCenter.php @ 85:6d7b61434be7 website

Add a copy of this here, just in case!
author Chris Cannam
date Mon, 20 Jan 2014 11:02:36 +0000
parents e3e11437ecea
children
rev   line source
Chris@76 1 <?php
Chris@76 2
Chris@76 3 /**
Chris@76 4 * Simple Machines Forum (SMF)
Chris@76 5 *
Chris@76 6 * @package SMF
Chris@76 7 * @author Simple Machines http://www.simplemachines.org
Chris@76 8 * @copyright 2011 Simple Machines
Chris@76 9 * @license http://www.simplemachines.org/about/smf/license.php BSD
Chris@76 10 *
Chris@76 11 * @version 2.0.1
Chris@76 12 */
Chris@76 13
Chris@76 14 if (!defined('SMF'))
Chris@76 15 die('Hacking attempt...');
Chris@76 16
Chris@76 17 /*
Chris@76 18 //!!!
Chris@76 19 */
Chris@76 20
Chris@76 21 // Entry point for the moderation center.
Chris@76 22 function ModerationMain($dont_call = false)
Chris@76 23 {
Chris@76 24 global $txt, $context, $scripturl, $sc, $modSettings, $user_info, $settings, $sourcedir, $options, $smcFunc;
Chris@76 25
Chris@76 26 // Don't run this twice... and don't conflict with the admin bar.
Chris@76 27 if (isset($context['admin_area']))
Chris@76 28 return;
Chris@76 29
Chris@76 30 $context['can_moderate_boards'] = $user_info['mod_cache']['bq'] != '0=1';
Chris@76 31 $context['can_moderate_groups'] = $user_info['mod_cache']['gq'] != '0=1';
Chris@76 32 $context['can_moderate_approvals'] = $modSettings['postmod_active'] && !empty($user_info['mod_cache']['ap']);
Chris@76 33
Chris@76 34 // Everyone using this area must be allowed here!
Chris@76 35 if (!$context['can_moderate_boards'] && !$context['can_moderate_groups'] && !$context['can_moderate_approvals'])
Chris@76 36 isAllowedTo('access_mod_center');
Chris@76 37
Chris@76 38 // We're gonna want a menu of some kind.
Chris@76 39 require_once($sourcedir . '/Subs-Menu.php');
Chris@76 40
Chris@76 41 // Load the language, and the template.
Chris@76 42 loadLanguage('ModerationCenter');
Chris@76 43 loadTemplate(false, 'admin');
Chris@76 44
Chris@76 45 $context['admin_preferences'] = !empty($options['admin_preferences']) ? unserialize($options['admin_preferences']) : array();
Chris@76 46 $context['robot_no_index'] = true;
Chris@76 47
Chris@76 48 // This is the menu structure - refer to Subs-Menu.php for the details.
Chris@76 49 $moderation_areas = array(
Chris@76 50 'main' => array(
Chris@76 51 'title' => $txt['mc_main'],
Chris@76 52 'areas' => array(
Chris@76 53 'index' => array(
Chris@76 54 'label' => $txt['moderation_center'],
Chris@76 55 'function' => 'ModerationHome',
Chris@76 56 ),
Chris@76 57 'modlog' => array(
Chris@76 58 'label' => $txt['modlog_view'],
Chris@76 59 'enabled' => !empty($modSettings['modlog_enabled']) && $context['can_moderate_boards'],
Chris@76 60 'file' => 'Modlog.php',
Chris@76 61 'function' => 'ViewModlog',
Chris@76 62 ),
Chris@76 63 'notice' => array(
Chris@76 64 'file' => 'ModerationCenter.php',
Chris@76 65 'function' => 'ShowNotice',
Chris@76 66 'select' => 'index'
Chris@76 67 ),
Chris@76 68 'warnings' => array(
Chris@76 69 'label' => $txt['mc_warnings'],
Chris@76 70 'enabled' => in_array('w', $context['admin_features']) && $modSettings['warning_settings'][0] == 1 && $context['can_moderate_boards'],
Chris@76 71 'function' => 'ViewWarnings',
Chris@76 72 'subsections' => array(
Chris@76 73 'log' => array($txt['mc_warning_log']),
Chris@76 74 'templates' => array($txt['mc_warning_templates'], 'issue_warning'),
Chris@76 75 ),
Chris@76 76 ),
Chris@76 77 'userwatch' => array(
Chris@76 78 'label' => $txt['mc_watched_users_title'],
Chris@76 79 'enabled' => in_array('w', $context['admin_features']) && $modSettings['warning_settings'][0] == 1 && $context['can_moderate_boards'],
Chris@76 80 'function' => 'ViewWatchedUsers',
Chris@76 81 'subsections' => array(
Chris@76 82 'member' => array($txt['mc_watched_users_member']),
Chris@76 83 'post' => array($txt['mc_watched_users_post']),
Chris@76 84 ),
Chris@76 85 ),
Chris@76 86 ),
Chris@76 87 ),
Chris@76 88 'posts' => array(
Chris@76 89 'title' => $txt['mc_posts'],
Chris@76 90 'enabled' => $context['can_moderate_boards'] || $context['can_moderate_approvals'],
Chris@76 91 'areas' => array(
Chris@76 92 'postmod' => array(
Chris@76 93 'label' => $txt['mc_unapproved_posts'],
Chris@76 94 'enabled' => $context['can_moderate_approvals'],
Chris@76 95 'file' => 'PostModeration.php',
Chris@76 96 'function' => 'PostModerationMain',
Chris@76 97 'custom_url' => $scripturl . '?action=moderate;area=postmod',
Chris@76 98 'subsections' => array(
Chris@76 99 'posts' => array($txt['mc_unapproved_replies']),
Chris@76 100 'topics' => array($txt['mc_unapproved_topics']),
Chris@76 101 ),
Chris@76 102 ),
Chris@76 103 'attachmod' => array(
Chris@76 104 'label' => $txt['mc_unapproved_attachments'],
Chris@76 105 'enabled' => $context['can_moderate_approvals'],
Chris@76 106 'file' => 'PostModeration.php',
Chris@76 107 'function' => 'PostModerationMain',
Chris@76 108 'custom_url' => $scripturl . '?action=moderate;area=attachmod;sa=attachments',
Chris@76 109 ),
Chris@76 110 'reports' => array(
Chris@76 111 'label' => $txt['mc_reported_posts'],
Chris@76 112 'enabled' => $context['can_moderate_boards'],
Chris@76 113 'file' => 'ModerationCenter.php',
Chris@76 114 'function' => 'ReportedPosts',
Chris@76 115 'subsections' => array(
Chris@76 116 'open' => array($txt['mc_reportedp_active']),
Chris@76 117 'closed' => array($txt['mc_reportedp_closed']),
Chris@76 118 ),
Chris@76 119 ),
Chris@76 120 ),
Chris@76 121 ),
Chris@76 122 'groups' => array(
Chris@76 123 'title' => $txt['mc_groups'],
Chris@76 124 'enabled' => $context['can_moderate_groups'],
Chris@76 125 'areas' => array(
Chris@76 126 'groups' => array(
Chris@76 127 'label' => $txt['mc_group_requests'],
Chris@76 128 'file' => 'Groups.php',
Chris@76 129 'function' => 'Groups',
Chris@76 130 'custom_url' => $scripturl . '?action=moderate;area=groups;sa=requests',
Chris@76 131 ),
Chris@76 132 'viewgroups' => array(
Chris@76 133 'label' => $txt['mc_view_groups'],
Chris@76 134 'file' => 'Groups.php',
Chris@76 135 'function' => 'Groups',
Chris@76 136 ),
Chris@76 137 ),
Chris@76 138 ),
Chris@76 139 'prefs' => array(
Chris@76 140 'title' => $txt['mc_prefs'],
Chris@76 141 'areas' => array(
Chris@76 142 'settings' => array(
Chris@76 143 'label' => $txt['mc_settings'],
Chris@76 144 'function' => 'ModerationSettings',
Chris@76 145 ),
Chris@76 146 ),
Chris@76 147 ),
Chris@76 148 );
Chris@76 149
Chris@76 150 // I don't know where we're going - I don't know where we've been...
Chris@76 151 $menuOptions = array(
Chris@76 152 'action' => 'moderate',
Chris@76 153 'disable_url_session_check' => true,
Chris@76 154 );
Chris@76 155 $mod_include_data = createMenu($moderation_areas, $menuOptions);
Chris@76 156 unset($moderation_areas);
Chris@76 157
Chris@76 158 // We got something - didn't we? DIDN'T WE!
Chris@76 159 if ($mod_include_data == false)
Chris@76 160 fatal_lang_error('no_access', false);
Chris@76 161
Chris@76 162 // Retain the ID information in case required by a subaction.
Chris@76 163 $context['moderation_menu_id'] = $context['max_menu_id'];
Chris@76 164 $context['moderation_menu_name'] = 'menu_data_' . $context['moderation_menu_id'];
Chris@76 165
Chris@76 166 // What a pleasant shortcut - even tho we're not *really* on the admin screen who cares...
Chris@76 167 $context['admin_area'] = $mod_include_data['current_area'];
Chris@76 168
Chris@76 169 // Build the link tree.
Chris@76 170 $context['linktree'][] = array(
Chris@76 171 'url' => $scripturl . '?action=moderate',
Chris@76 172 'name' => $txt['moderation_center'],
Chris@76 173 );
Chris@76 174 if (isset($mod_include_data['current_area']) && $mod_include_data['current_area'] != 'index')
Chris@76 175 $context['linktree'][] = array(
Chris@76 176 'url' => $scripturl . '?action=moderate;area=' . $mod_include_data['current_area'],
Chris@76 177 'name' => $mod_include_data['label'],
Chris@76 178 );
Chris@76 179 if (!empty($mod_include_data['current_subsection']) && $mod_include_data['subsections'][$mod_include_data['current_subsection']][0] != $mod_include_data['label'])
Chris@76 180 $context['linktree'][] = array(
Chris@76 181 'url' => $scripturl . '?action=moderate;area=' . $mod_include_data['current_area'] . ';sa=' . $mod_include_data['current_subsection'],
Chris@76 182 'name' => $mod_include_data['subsections'][$mod_include_data['current_subsection']][0],
Chris@76 183 );
Chris@76 184
Chris@76 185 // Now - finally - the bit before the encore - the main performance of course!
Chris@76 186 if (!$dont_call)
Chris@76 187 {
Chris@76 188 if (isset($mod_include_data['file']))
Chris@76 189 require_once($sourcedir . '/' . $mod_include_data['file']);
Chris@76 190
Chris@76 191 $mod_include_data['function']();
Chris@76 192 }
Chris@76 193 }
Chris@76 194
Chris@76 195 // This function basically is the home page of the moderation center.
Chris@76 196 function ModerationHome()
Chris@76 197 {
Chris@76 198 global $txt, $context, $scripturl, $modSettings, $user_info, $user_settings;
Chris@76 199
Chris@76 200 loadTemplate('ModerationCenter');
Chris@76 201
Chris@76 202 $context['page_title'] = $txt['moderation_center'];
Chris@76 203 $context['sub_template'] = 'moderation_center';
Chris@76 204
Chris@76 205 // Load what blocks the user actually can see...
Chris@76 206 $valid_blocks = array(
Chris@76 207 'n' => 'LatestNews',
Chris@76 208 'p' => 'Notes',
Chris@76 209 );
Chris@76 210 if ($context['can_moderate_groups'])
Chris@76 211 $valid_blocks['g'] = 'GroupRequests';
Chris@76 212 if ($context['can_moderate_boards'])
Chris@76 213 {
Chris@76 214 $valid_blocks['r'] = 'ReportedPosts';
Chris@76 215 $valid_blocks['w'] = 'WatchedUsers';
Chris@76 216 }
Chris@76 217
Chris@76 218 if (empty($user_settings['mod_prefs']))
Chris@76 219 $user_blocks = 'n' . ($context['can_moderate_boards'] ? 'wr' : '') . ($context['can_moderate_groups'] ? 'g' : '');
Chris@76 220 else
Chris@76 221 list (, $user_blocks) = explode('|', $user_settings['mod_prefs']);
Chris@76 222
Chris@76 223 $user_blocks = str_split($user_blocks);
Chris@76 224
Chris@76 225 $context['mod_blocks'] = array();
Chris@76 226 foreach ($valid_blocks as $k => $block)
Chris@76 227 {
Chris@76 228 if (in_array($k, $user_blocks))
Chris@76 229 {
Chris@76 230 $block = 'ModBlock' . $block;
Chris@76 231 if (function_exists($block))
Chris@76 232 $context['mod_blocks'][] = $block();
Chris@76 233 }
Chris@76 234 }
Chris@76 235 }
Chris@76 236
Chris@76 237 // Just prepares the time stuff for the simple machines latest news.
Chris@76 238 function ModBlockLatestNews()
Chris@76 239 {
Chris@76 240 global $context, $user_info;
Chris@76 241
Chris@76 242 $context['time_format'] = urlencode($user_info['time_format']);
Chris@76 243
Chris@76 244 // Return the template to use.
Chris@76 245 return 'latest_news';
Chris@76 246 }
Chris@76 247
Chris@76 248 // Show a list of the most active watched users.
Chris@76 249 function ModBlockWatchedUsers()
Chris@76 250 {
Chris@76 251 global $context, $smcFunc, $scripturl, $modSettings;
Chris@76 252
Chris@76 253 if (($watched_users = cache_get_data('recent_user_watches', 240)) === null)
Chris@76 254 {
Chris@76 255 $modSettings['warning_watch'] = empty($modSettings['warning_watch']) ? 1 : $modSettings['warning_watch'];
Chris@76 256 $request = $smcFunc['db_query']('', '
Chris@76 257 SELECT id_member, real_name, last_login
Chris@76 258 FROM {db_prefix}members
Chris@76 259 WHERE warning >= {int:warning_watch}
Chris@76 260 ORDER BY last_login DESC
Chris@76 261 LIMIT 10',
Chris@76 262 array(
Chris@76 263 'warning_watch' => $modSettings['warning_watch'],
Chris@76 264 )
Chris@76 265 );
Chris@76 266 $watched_users = array();
Chris@76 267 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 268 $watched_users[] = $row;
Chris@76 269 $smcFunc['db_free_result']($request);
Chris@76 270
Chris@76 271 cache_put_data('recent_user_watches', $watched_users, 240);
Chris@76 272 }
Chris@76 273
Chris@76 274 $context['watched_users'] = array();
Chris@76 275 foreach ($watched_users as $user)
Chris@76 276 {
Chris@76 277 $context['watched_users'][] = array(
Chris@76 278 'id' => $user['id_member'],
Chris@76 279 'name' => $user['real_name'],
Chris@76 280 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $user['id_member'] . '">' . $user['real_name'] . '</a>',
Chris@76 281 'href' => $scripturl . '?action=profile;u=' . $user['id_member'],
Chris@76 282 'last_login' => !empty($user['last_login']) ? timeformat($user['last_login']) : '',
Chris@76 283 );
Chris@76 284 }
Chris@76 285
Chris@76 286 return 'watched_users';
Chris@76 287 }
Chris@76 288
Chris@76 289 // Show an area for the moderator to type into.
Chris@76 290 function ModBlockNotes()
Chris@76 291 {
Chris@76 292 global $context, $smcFunc, $scripturl, $txt, $user_info;
Chris@76 293
Chris@76 294 // Are we saving a note?
Chris@76 295 if (isset($_POST['makenote']) && isset($_POST['new_note']))
Chris@76 296 {
Chris@76 297 checkSession();
Chris@76 298
Chris@76 299 $_POST['new_note'] = $smcFunc['htmlspecialchars'](trim($_POST['new_note']));
Chris@76 300 // Make sure they actually entered something.
Chris@76 301 if (!empty($_POST['new_note']) && $_POST['new_note'] !== $txt['mc_click_add_note'])
Chris@76 302 {
Chris@76 303 // Insert it into the database then!
Chris@76 304 $smcFunc['db_insert']('',
Chris@76 305 '{db_prefix}log_comments',
Chris@76 306 array(
Chris@76 307 'id_member' => 'int', 'member_name' => 'string', 'comment_type' => 'string', 'recipient_name' => 'string',
Chris@76 308 'body' => 'string', 'log_time' => 'int',
Chris@76 309 ),
Chris@76 310 array(
Chris@76 311 $user_info['id'], $user_info['name'], 'modnote', '', $_POST['new_note'], time(),
Chris@76 312 ),
Chris@76 313 array('id_comment')
Chris@76 314 );
Chris@76 315
Chris@76 316 // Clear the cache.
Chris@76 317 cache_put_data('moderator_notes', null, 240);
Chris@76 318 cache_put_data('moderator_notes_total', null, 240);
Chris@76 319 }
Chris@76 320
Chris@76 321 // Redirect otherwise people can resubmit.
Chris@76 322 redirectexit('action=moderate');
Chris@76 323 }
Chris@76 324
Chris@76 325 // Bye... bye...
Chris@76 326 if (isset($_GET['notes']) && isset($_GET['delete']) && is_numeric($_GET['delete']))
Chris@76 327 {
Chris@76 328 checkSession('get');
Chris@76 329
Chris@76 330 // Lets delete it.
Chris@76 331 $smcFunc['db_query']('', '
Chris@76 332 DELETE FROM {db_prefix}log_comments
Chris@76 333 WHERE id_comment = {int:note}
Chris@76 334 AND comment_type = {string:type}',
Chris@76 335 array(
Chris@76 336 'note' => $_GET['delete'],
Chris@76 337 'type' => 'modnote',
Chris@76 338 )
Chris@76 339 );
Chris@76 340
Chris@76 341 // Clear the cache.
Chris@76 342 cache_put_data('moderator_notes', null, 240);
Chris@76 343 cache_put_data('moderator_notes_total', null, 240);
Chris@76 344
Chris@76 345 redirectexit('action=moderate');
Chris@76 346 }
Chris@76 347
Chris@76 348 // How many notes in total?
Chris@76 349 if (($moderator_notes_total = cache_get_data('moderator_notes_total', 240)) === null)
Chris@76 350 {
Chris@76 351 $request = $smcFunc['db_query']('', '
Chris@76 352 SELECT COUNT(*)
Chris@76 353 FROM {db_prefix}log_comments AS lc
Chris@76 354 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lc.id_member)
Chris@76 355 WHERE lc.comment_type = {string:modnote}',
Chris@76 356 array(
Chris@76 357 'modnote' => 'modnote',
Chris@76 358 )
Chris@76 359 );
Chris@76 360 list ($moderator_notes_total) = $smcFunc['db_fetch_row']($request);
Chris@76 361 $smcFunc['db_free_result']($request);
Chris@76 362
Chris@76 363 cache_put_data('moderator_notes_total', $moderator_notes_total, 240);
Chris@76 364 }
Chris@76 365
Chris@76 366 // Grab the current notes. We can only use the cache for the first page of notes.
Chris@76 367 $offset = isset($_GET['notes']) && isset($_GET['start']) ? $_GET['start'] : 0;
Chris@76 368 if ($offset != 0 || ($moderator_notes = cache_get_data('moderator_notes', 240)) === null)
Chris@76 369 {
Chris@76 370 $request = $smcFunc['db_query']('', '
Chris@76 371 SELECT IFNULL(mem.id_member, 0) AS id_member, IFNULL(mem.real_name, lc.member_name) AS member_name,
Chris@76 372 lc.log_time, lc.body, lc.id_comment AS id_note
Chris@76 373 FROM {db_prefix}log_comments AS lc
Chris@76 374 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lc.id_member)
Chris@76 375 WHERE lc.comment_type = {string:modnote}
Chris@76 376 ORDER BY id_comment DESC
Chris@76 377 LIMIT {int:offset}, 10',
Chris@76 378 array(
Chris@76 379 'modnote' => 'modnote',
Chris@76 380 'offset' => $offset,
Chris@76 381 )
Chris@76 382 );
Chris@76 383 $moderator_notes = array();
Chris@76 384 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 385 $moderator_notes[] = $row;
Chris@76 386 $smcFunc['db_free_result']($request);
Chris@76 387
Chris@76 388 if ($offset == 0)
Chris@76 389 cache_put_data('moderator_notes', $moderator_notes, 240);
Chris@76 390 }
Chris@76 391
Chris@76 392 // Lets construct a page index.
Chris@76 393 $context['page_index'] = constructPageIndex($scripturl . '?action=moderate;area=index;notes', $_GET['start'], $moderator_notes_total, 10);
Chris@76 394 $context['start'] = $_GET['start'];
Chris@76 395
Chris@76 396 $context['notes'] = array();
Chris@76 397 foreach ($moderator_notes as $note)
Chris@76 398 {
Chris@76 399 $context['notes'][] = array(
Chris@76 400 'author' => array(
Chris@76 401 'id' => $note['id_member'],
Chris@76 402 'link' => $note['id_member'] ? ('<a href="' . $scripturl . '?action=profile;u=' . $note['id_member'] . '" title="' . $txt['on'] . ' ' . strip_tags(timeformat($note['log_time'])) . '">' . $note['member_name'] . '</a>') : $note['member_name'],
Chris@76 403 ),
Chris@76 404 'time' => timeformat($note['log_time']),
Chris@76 405 'text' => parse_bbc($note['body']),
Chris@76 406 'delete_href' => $scripturl . '?action=moderate;area=index;notes;delete=' . $note['id_note'] . ';' . $context['session_var'] . '=' . $context['session_id'],
Chris@76 407 );
Chris@76 408 }
Chris@76 409
Chris@76 410 return 'notes';
Chris@76 411 }
Chris@76 412
Chris@76 413 // Show a list of the most recent reported posts.
Chris@76 414 function ModBlockReportedPosts()
Chris@76 415 {
Chris@76 416 global $context, $user_info, $scripturl, $smcFunc;
Chris@76 417
Chris@76 418 // Got the info already?
Chris@76 419 $cachekey = md5(serialize($user_info['mod_cache']['bq']));
Chris@76 420 $context['reported_posts'] = array();
Chris@76 421 if ($user_info['mod_cache']['bq'] == '0=1')
Chris@76 422 return 'reported_posts_block';
Chris@76 423
Chris@76 424 if (($reported_posts = cache_get_data('reported_posts_' . $cachekey, 90)) === null)
Chris@76 425 {
Chris@76 426 // By George, that means we in a position to get the reports, jolly good.
Chris@76 427 $request = $smcFunc['db_query']('', '
Chris@76 428 SELECT lr.id_report, lr.id_msg, lr.id_topic, lr.id_board, lr.id_member, lr.subject,
Chris@76 429 lr.num_reports, IFNULL(mem.real_name, lr.membername) AS author_name,
Chris@76 430 IFNULL(mem.id_member, 0) AS id_author
Chris@76 431 FROM {db_prefix}log_reported AS lr
Chris@76 432 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lr.id_member)
Chris@76 433 WHERE ' . ($user_info['mod_cache']['bq'] == '1=1' || $user_info['mod_cache']['bq'] == '0=1' ? $user_info['mod_cache']['bq'] : 'lr.' . $user_info['mod_cache']['bq']) . '
Chris@76 434 AND lr.closed = {int:not_closed}
Chris@76 435 AND lr.ignore_all = {int:not_ignored}
Chris@76 436 ORDER BY lr.time_updated DESC
Chris@76 437 LIMIT 10',
Chris@76 438 array(
Chris@76 439 'not_closed' => 0,
Chris@76 440 'not_ignored' => 0,
Chris@76 441 )
Chris@76 442 );
Chris@76 443 $reported_posts = array();
Chris@76 444 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 445 $reported_posts[] = $row;
Chris@76 446 $smcFunc['db_free_result']($request);
Chris@76 447
Chris@76 448 // Cache it.
Chris@76 449 cache_put_data('reported_posts_' . $cachekey, $reported_posts, 90);
Chris@76 450 }
Chris@76 451
Chris@76 452 $context['reported_posts'] = array();
Chris@76 453 foreach ($reported_posts as $i => $row)
Chris@76 454 {
Chris@76 455 $context['reported_posts'][] = array(
Chris@76 456 'id' => $row['id_report'],
Chris@76 457 'alternate' => $i % 2,
Chris@76 458 'topic_href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . '#msg' . $row['id_msg'],
Chris@76 459 'report_href' => $scripturl . '?action=moderate;area=reports;report=' . $row['id_report'],
Chris@76 460 'author' => array(
Chris@76 461 'id' => $row['id_author'],
Chris@76 462 'name' => $row['author_name'],
Chris@76 463 'link' => $row['id_author'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_author'] . '">' . $row['author_name'] . '</a>' : $row['author_name'],
Chris@76 464 'href' => $scripturl . '?action=profile;u=' . $row['id_author'],
Chris@76 465 ),
Chris@76 466 'comments' => array(),
Chris@76 467 'subject' => $row['subject'],
Chris@76 468 'num_reports' => $row['num_reports'],
Chris@76 469 );
Chris@76 470 }
Chris@76 471
Chris@76 472 return 'reported_posts_block';
Chris@76 473 }
Chris@76 474
Chris@76 475 // Show a list of all the group requests they can see.
Chris@76 476 function ModBlockGroupRequests()
Chris@76 477 {
Chris@76 478 global $context, $user_info, $scripturl, $smcFunc;
Chris@76 479
Chris@76 480 $context['group_requests'] = array();
Chris@76 481 // Make sure they can even moderate someone!
Chris@76 482 if ($user_info['mod_cache']['gq'] == '0=1')
Chris@76 483 return 'group_requests_block';
Chris@76 484
Chris@76 485 // What requests are outstanding?
Chris@76 486 $request = $smcFunc['db_query']('', '
Chris@76 487 SELECT lgr.id_request, lgr.id_member, lgr.id_group, lgr.time_applied, mem.member_name, mg.group_name, mem.real_name
Chris@76 488 FROM {db_prefix}log_group_requests AS lgr
Chris@76 489 INNER JOIN {db_prefix}members AS mem ON (mem.id_member = lgr.id_member)
Chris@76 490 INNER JOIN {db_prefix}membergroups AS mg ON (mg.id_group = lgr.id_group)
Chris@76 491 WHERE ' . ($user_info['mod_cache']['gq'] == '1=1' || $user_info['mod_cache']['gq'] == '0=1' ? $user_info['mod_cache']['gq'] : 'lgr.' . $user_info['mod_cache']['gq']) . '
Chris@76 492 ORDER BY lgr.id_request DESC
Chris@76 493 LIMIT 10',
Chris@76 494 array(
Chris@76 495 )
Chris@76 496 );
Chris@76 497 for ($i = 0; $row = $smcFunc['db_fetch_assoc']($request); $i ++)
Chris@76 498 {
Chris@76 499 $context['group_requests'][] = array(
Chris@76 500 'id' => $row['id_request'],
Chris@76 501 'alternate' => $i % 2,
Chris@76 502 'request_href' => $scripturl . '?action=groups;sa=requests;gid=' . $row['id_group'],
Chris@76 503 'member' => array(
Chris@76 504 'id' => $row['id_member'],
Chris@76 505 'name' => $row['real_name'],
Chris@76 506 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>',
Chris@76 507 'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
Chris@76 508 ),
Chris@76 509 'group' => array(
Chris@76 510 'id' => $row['id_group'],
Chris@76 511 'name' => $row['group_name'],
Chris@76 512 ),
Chris@76 513 'time_submitted' => timeformat($row['time_applied']),
Chris@76 514 );
Chris@76 515 }
Chris@76 516 $smcFunc['db_free_result']($request);
Chris@76 517
Chris@76 518 return 'group_requests_block';
Chris@76 519 }
Chris@76 520
Chris@76 521 //!!! This needs to be given its own file.
Chris@76 522 // Browse all the reported posts...
Chris@76 523 function ReportedPosts()
Chris@76 524 {
Chris@76 525 global $txt, $context, $scripturl, $modSettings, $user_info, $smcFunc;
Chris@76 526
Chris@76 527 loadTemplate('ModerationCenter');
Chris@76 528
Chris@76 529 // Put the open and closed options into tabs, because we can...
Chris@76 530 $context[$context['moderation_menu_name']]['tab_data'] = array(
Chris@76 531 'title' => $txt['mc_reported_posts'],
Chris@76 532 'help' => '',
Chris@76 533 'description' => $txt['mc_reported_posts_desc'],
Chris@76 534 );
Chris@76 535
Chris@76 536 // This comes under the umbrella of moderating posts.
Chris@76 537 if ($user_info['mod_cache']['bq'] == '0=1')
Chris@76 538 isAllowedTo('moderate_forum');
Chris@76 539
Chris@76 540 // Are they wanting to view a particular report?
Chris@76 541 if (!empty($_REQUEST['report']))
Chris@76 542 return ModReport();
Chris@76 543
Chris@76 544 // Set up the comforting bits...
Chris@76 545 $context['page_title'] = $txt['mc_reported_posts'];
Chris@76 546 $context['sub_template'] = 'reported_posts';
Chris@76 547
Chris@76 548 // Are we viewing open or closed reports?
Chris@76 549 $context['view_closed'] = isset($_GET['sa']) && $_GET['sa'] == 'closed' ? 1 : 0;
Chris@76 550
Chris@76 551 // Are we doing any work?
Chris@76 552 if ((isset($_GET['ignore']) || isset($_GET['close'])) && isset($_GET['rid']))
Chris@76 553 {
Chris@76 554 checkSession('get');
Chris@76 555 $_GET['rid'] = (int) $_GET['rid'];
Chris@76 556
Chris@76 557 // Update the report...
Chris@76 558 $smcFunc['db_query']('', '
Chris@76 559 UPDATE {db_prefix}log_reported
Chris@76 560 SET ' . (isset($_GET['ignore']) ? 'ignore_all = {int:ignore_all}' : 'closed = {int:closed}') . '
Chris@76 561 WHERE id_report = {int:id_report}
Chris@76 562 AND ' . $user_info['mod_cache']['bq'],
Chris@76 563 array(
Chris@76 564 'ignore_all' => isset($_GET['ignore']) ? (int) $_GET['ignore'] : 0,
Chris@76 565 'closed' => isset($_GET['close']) ? (int) $_GET['close'] : 0,
Chris@76 566 'id_report' => $_GET['rid'],
Chris@76 567 )
Chris@76 568 );
Chris@76 569
Chris@76 570 // Time to update.
Chris@76 571 updateSettings(array('last_mod_report_action' => time()));
Chris@76 572 recountOpenReports();
Chris@76 573 }
Chris@76 574 elseif (isset($_POST['close']) && isset($_POST['close_selected']))
Chris@76 575 {
Chris@76 576 checkSession('post');
Chris@76 577
Chris@76 578 // All the ones to update...
Chris@76 579 $toClose = array();
Chris@76 580 foreach ($_POST['close'] as $rid)
Chris@76 581 $toClose[] = (int) $rid;
Chris@76 582
Chris@76 583 if (!empty($toClose))
Chris@76 584 {
Chris@76 585 $smcFunc['db_query']('', '
Chris@76 586 UPDATE {db_prefix}log_reported
Chris@76 587 SET closed = {int:is_closed}
Chris@76 588 WHERE id_report IN ({array_int:report_list})
Chris@76 589 AND ' . $user_info['mod_cache']['bq'],
Chris@76 590 array(
Chris@76 591 'report_list' => $toClose,
Chris@76 592 'is_closed' => 1,
Chris@76 593 )
Chris@76 594 );
Chris@76 595
Chris@76 596 // Time to update.
Chris@76 597 updateSettings(array('last_mod_report_action' => time()));
Chris@76 598 recountOpenReports();
Chris@76 599 }
Chris@76 600 }
Chris@76 601
Chris@76 602 // How many entries are we viewing?
Chris@76 603 $request = $smcFunc['db_query']('', '
Chris@76 604 SELECT COUNT(*)
Chris@76 605 FROM {db_prefix}log_reported AS lr
Chris@76 606 WHERE lr.closed = {int:view_closed}
Chris@76 607 AND ' . ($user_info['mod_cache']['bq'] == '1=1' || $user_info['mod_cache']['bq'] == '0=1' ? $user_info['mod_cache']['bq'] : 'lr.' . $user_info['mod_cache']['bq']),
Chris@76 608 array(
Chris@76 609 'view_closed' => $context['view_closed'],
Chris@76 610 )
Chris@76 611 );
Chris@76 612 list ($context['total_reports']) = $smcFunc['db_fetch_row']($request);
Chris@76 613 $smcFunc['db_free_result']($request);
Chris@76 614
Chris@76 615 // So, that means we can page index, yes?
Chris@76 616 $context['page_index'] = constructPageIndex($scripturl . '?action=moderate;area=reports' . ($context['view_closed'] ? ';sa=closed' : ''), $_GET['start'], $context['total_reports'], 10);
Chris@76 617 $context['start'] = $_GET['start'];
Chris@76 618
Chris@76 619 // By George, that means we in a position to get the reports, golly good.
Chris@76 620 $request = $smcFunc['db_query']('', '
Chris@76 621 SELECT lr.id_report, lr.id_msg, lr.id_topic, lr.id_board, lr.id_member, lr.subject, lr.body,
Chris@76 622 lr.time_started, lr.time_updated, lr.num_reports, lr.closed, lr.ignore_all,
Chris@76 623 IFNULL(mem.real_name, lr.membername) AS author_name, IFNULL(mem.id_member, 0) AS id_author
Chris@76 624 FROM {db_prefix}log_reported AS lr
Chris@76 625 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lr.id_member)
Chris@76 626 WHERE lr.closed = {int:view_closed}
Chris@76 627 AND ' . ($user_info['mod_cache']['bq'] == '1=1' || $user_info['mod_cache']['bq'] == '0=1' ? $user_info['mod_cache']['bq'] : 'lr.' . $user_info['mod_cache']['bq']) . '
Chris@76 628 ORDER BY lr.time_updated DESC
Chris@76 629 LIMIT ' . $context['start'] . ', 10',
Chris@76 630 array(
Chris@76 631 'view_closed' => $context['view_closed'],
Chris@76 632 )
Chris@76 633 );
Chris@76 634 $context['reports'] = array();
Chris@76 635 $report_ids = array();
Chris@76 636 for ($i = 0; $row = $smcFunc['db_fetch_assoc']($request); $i++)
Chris@76 637 {
Chris@76 638 $report_ids[] = $row['id_report'];
Chris@76 639 $context['reports'][$row['id_report']] = array(
Chris@76 640 'id' => $row['id_report'],
Chris@76 641 'alternate' => $i % 2,
Chris@76 642 'topic_href' => $scripturl . '?topic=' . $row['id_topic'] . '.msg' . $row['id_msg'] . '#msg' . $row['id_msg'],
Chris@76 643 'report_href' => $scripturl . '?action=moderate;area=reports;report=' . $row['id_report'],
Chris@76 644 'author' => array(
Chris@76 645 'id' => $row['id_author'],
Chris@76 646 'name' => $row['author_name'],
Chris@76 647 'link' => $row['id_author'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_author'] . '">' . $row['author_name'] . '</a>' : $row['author_name'],
Chris@76 648 'href' => $scripturl . '?action=profile;u=' . $row['id_author'],
Chris@76 649 ),
Chris@76 650 'comments' => array(),
Chris@76 651 'time_started' => timeformat($row['time_started']),
Chris@76 652 'last_updated' => timeformat($row['time_updated']),
Chris@76 653 'subject' => $row['subject'],
Chris@76 654 'body' => parse_bbc($row['body']),
Chris@76 655 'num_reports' => $row['num_reports'],
Chris@76 656 'closed' => $row['closed'],
Chris@76 657 'ignore' => $row['ignore_all']
Chris@76 658 );
Chris@76 659 }
Chris@76 660 $smcFunc['db_free_result']($request);
Chris@76 661
Chris@76 662 // Now get all the people who reported it.
Chris@76 663 if (!empty($report_ids))
Chris@76 664 {
Chris@76 665 $request = $smcFunc['db_query']('', '
Chris@76 666 SELECT lrc.id_comment, lrc.id_report, lrc.time_sent, lrc.comment,
Chris@76 667 IFNULL(mem.id_member, 0) AS id_member, IFNULL(mem.real_name, lrc.membername) AS reporter
Chris@76 668 FROM {db_prefix}log_reported_comments AS lrc
Chris@76 669 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lrc.id_member)
Chris@76 670 WHERE lrc.id_report IN ({array_int:report_list})',
Chris@76 671 array(
Chris@76 672 'report_list' => $report_ids,
Chris@76 673 )
Chris@76 674 );
Chris@76 675 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 676 {
Chris@76 677 $context['reports'][$row['id_report']]['comments'][] = array(
Chris@76 678 'id' => $row['id_comment'],
Chris@76 679 'message' => $row['comment'],
Chris@76 680 'time' => timeformat($row['time_sent']),
Chris@76 681 'member' => array(
Chris@76 682 'id' => $row['id_member'],
Chris@76 683 'name' => empty($row['reporter']) ? $txt['guest'] : $row['reporter'],
Chris@76 684 'link' => $row['id_member'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['reporter'] . '</a>' : (empty($row['reporter']) ? $txt['guest'] : $row['reporter']),
Chris@76 685 'href' => $row['id_member'] ? $scripturl . '?action=profile;u=' . $row['id_member'] : '',
Chris@76 686 ),
Chris@76 687 );
Chris@76 688 }
Chris@76 689 $smcFunc['db_free_result']($request);
Chris@76 690 }
Chris@76 691 }
Chris@76 692
Chris@76 693 // Act as an entrace for all group related activity.
Chris@76 694 //!!! As for most things in this file, this needs to be moved somewhere appropriate.
Chris@76 695 function ModerateGroups()
Chris@76 696 {
Chris@76 697 global $txt, $context, $scripturl, $modSettings, $user_info;
Chris@76 698
Chris@76 699 // You need to be allowed to moderate groups...
Chris@76 700 if ($user_info['mod_cache']['gq'] == '0=1')
Chris@76 701 isAllowedTo('manage_membergroups');
Chris@76 702
Chris@76 703 // Load the group templates.
Chris@76 704 loadTemplate('ModerationCenter');
Chris@76 705
Chris@76 706 // Setup the subactions...
Chris@76 707 $subactions = array(
Chris@76 708 'requests' => 'GroupRequests',
Chris@76 709 'view' => 'ViewGroups',
Chris@76 710 );
Chris@76 711
Chris@76 712 if (!isset($_GET['sa']) || !isset($subactions[$_GET['sa']]))
Chris@76 713 $_GET['sa'] = 'view';
Chris@76 714 $context['sub_action'] = $_GET['sa'];
Chris@76 715
Chris@76 716 // Call the relevant function.
Chris@76 717 $subactions[$context['sub_action']]();
Chris@76 718 }
Chris@76 719
Chris@76 720 // How many open reports do we have?
Chris@76 721 function recountOpenReports()
Chris@76 722 {
Chris@76 723 global $user_info, $context, $smcFunc;
Chris@76 724
Chris@76 725 $request = $smcFunc['db_query']('', '
Chris@76 726 SELECT COUNT(*)
Chris@76 727 FROM {db_prefix}log_reported
Chris@76 728 WHERE ' . $user_info['mod_cache']['bq'] . '
Chris@76 729 AND closed = {int:not_closed}
Chris@76 730 AND ignore_all = {int:not_ignored}',
Chris@76 731 array(
Chris@76 732 'not_closed' => 0,
Chris@76 733 'not_ignored' => 0,
Chris@76 734 )
Chris@76 735 );
Chris@76 736 list ($open_reports) = $smcFunc['db_fetch_row']($request);
Chris@76 737 $smcFunc['db_free_result']($request);
Chris@76 738
Chris@76 739 $_SESSION['rc'] = array(
Chris@76 740 'id' => $user_info['id'],
Chris@76 741 'time' => time(),
Chris@76 742 'reports' => $open_reports,
Chris@76 743 );
Chris@76 744
Chris@76 745 $context['open_mod_reports'] = $open_reports;
Chris@76 746 }
Chris@76 747
Chris@76 748 function ModReport()
Chris@76 749 {
Chris@76 750 global $user_info, $context, $sourcedir, $scripturl, $txt, $smcFunc;
Chris@76 751
Chris@76 752 // Have to at least give us something
Chris@76 753 if (empty($_REQUEST['report']))
Chris@76 754 fatal_lang_error('mc_no_modreport_specified');
Chris@76 755
Chris@76 756 // Integers only please
Chris@76 757 $_REQUEST['report'] = (int) $_REQUEST['report'];
Chris@76 758
Chris@76 759 // Get the report details, need this so we can limit access to a particular board
Chris@76 760 $request = $smcFunc['db_query']('', '
Chris@76 761 SELECT lr.id_report, lr.id_msg, lr.id_topic, lr.id_board, lr.id_member, lr.subject, lr.body,
Chris@76 762 lr.time_started, lr.time_updated, lr.num_reports, lr.closed, lr.ignore_all,
Chris@76 763 IFNULL(mem.real_name, lr.membername) AS author_name, IFNULL(mem.id_member, 0) AS id_author
Chris@76 764 FROM {db_prefix}log_reported AS lr
Chris@76 765 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lr.id_member)
Chris@76 766 WHERE lr.id_report = {int:id_report}
Chris@76 767 AND ' . ($user_info['mod_cache']['bq'] == '1=1' || $user_info['mod_cache']['bq'] == '0=1' ? $user_info['mod_cache']['bq'] : 'lr.' . $user_info['mod_cache']['bq']) . '
Chris@76 768 LIMIT 1',
Chris@76 769 array(
Chris@76 770 'id_report' => $_REQUEST['report'],
Chris@76 771 )
Chris@76 772 );
Chris@76 773
Chris@76 774 // So did we find anything?
Chris@76 775 if (!$smcFunc['db_num_rows']($request))
Chris@76 776 fatal_lang_error('mc_no_modreport_found');
Chris@76 777
Chris@76 778 // Woohoo we found a report and they can see it! Bad news is we have more work to do
Chris@76 779 $row = $smcFunc['db_fetch_assoc']($request);
Chris@76 780 $smcFunc['db_free_result']($request);
Chris@76 781
Chris@76 782 // If they are adding a comment then... add a comment.
Chris@76 783 if (isset($_POST['add_comment']) && !empty($_POST['mod_comment']))
Chris@76 784 {
Chris@76 785 checkSession();
Chris@76 786
Chris@76 787 $newComment = trim($smcFunc['htmlspecialchars']($_POST['mod_comment']));
Chris@76 788
Chris@76 789 // In it goes.
Chris@76 790 if (!empty($newComment))
Chris@76 791 {
Chris@76 792 $smcFunc['db_insert']('',
Chris@76 793 '{db_prefix}log_comments',
Chris@76 794 array(
Chris@76 795 'id_member' => 'int', 'member_name' => 'string', 'comment_type' => 'string', 'recipient_name' => 'string',
Chris@76 796 'id_notice' => 'int', 'body' => 'string', 'log_time' => 'int',
Chris@76 797 ),
Chris@76 798 array(
Chris@76 799 $user_info['id'], $user_info['name'], 'reportc', '',
Chris@76 800 $_REQUEST['report'], $newComment, time(),
Chris@76 801 ),
Chris@76 802 array('id_comment')
Chris@76 803 );
Chris@76 804
Chris@76 805 // Redirect to prevent double submittion.
Chris@76 806 redirectexit($scripturl . '?action=moderate;area=reports;report=' . $_REQUEST['report']);
Chris@76 807 }
Chris@76 808 }
Chris@76 809
Chris@76 810 $context['report'] = array(
Chris@76 811 'id' => $row['id_report'],
Chris@76 812 'topic_id' => $row['id_topic'],
Chris@76 813 'board_id' => $row['id_board'],
Chris@76 814 'message_id' => $row['id_msg'],
Chris@76 815 'message_href' => $scripturl . '?msg=' . $row['id_msg'],
Chris@76 816 'message_link' => '<a href="' . $scripturl . '?msg=' . $row['id_msg'] . '">' . $row['subject'] . '</a>',
Chris@76 817 'report_href' => $scripturl . '?action=moderate;area=reports;report=' . $row['id_report'],
Chris@76 818 'author' => array(
Chris@76 819 'id' => $row['id_author'],
Chris@76 820 'name' => $row['author_name'],
Chris@76 821 'link' => $row['id_author'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_author'] . '">' . $row['author_name'] . '</a>' : $row['author_name'],
Chris@76 822 'href' => $scripturl . '?action=profile;u=' . $row['id_author'],
Chris@76 823 ),
Chris@76 824 'comments' => array(),
Chris@76 825 'mod_comments' => array(),
Chris@76 826 'time_started' => timeformat($row['time_started']),
Chris@76 827 'last_updated' => timeformat($row['time_updated']),
Chris@76 828 'subject' => $row['subject'],
Chris@76 829 'body' => parse_bbc($row['body']),
Chris@76 830 'num_reports' => $row['num_reports'],
Chris@76 831 'closed' => $row['closed'],
Chris@76 832 'ignore' => $row['ignore_all']
Chris@76 833 );
Chris@76 834
Chris@76 835 // So what bad things do the reporters have to say about it?
Chris@76 836 $request = $smcFunc['db_query']('', '
Chris@76 837 SELECT lrc.id_comment, lrc.id_report, lrc.time_sent, lrc.comment, lrc.member_ip,
Chris@76 838 IFNULL(mem.id_member, 0) AS id_member, IFNULL(mem.real_name, lrc.membername) AS reporter
Chris@76 839 FROM {db_prefix}log_reported_comments AS lrc
Chris@76 840 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lrc.id_member)
Chris@76 841 WHERE lrc.id_report = {int:id_report}',
Chris@76 842 array(
Chris@76 843 'id_report' => $context['report']['id'],
Chris@76 844 )
Chris@76 845 );
Chris@76 846 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 847 {
Chris@76 848 $context['report']['comments'][] = array(
Chris@76 849 'id' => $row['id_comment'],
Chris@76 850 'message' => $row['comment'],
Chris@76 851 'time' => timeformat($row['time_sent']),
Chris@76 852 'member' => array(
Chris@76 853 'id' => $row['id_member'],
Chris@76 854 'name' => empty($row['reporter']) ? $txt['guest'] : $row['reporter'],
Chris@76 855 'link' => $row['id_member'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['reporter'] . '</a>' : (empty($row['reporter']) ? $txt['guest'] : $row['reporter']),
Chris@76 856 'href' => $row['id_member'] ? $scripturl . '?action=profile;u=' . $row['id_member'] : '',
Chris@76 857 'ip' => !empty($row['member_ip']) && allowedTo('moderate_forum') ? '<a href="' . $scripturl . '?action=trackip;searchip=' . $row['member_ip'] . '">' . $row['member_ip'] . '</a>' : '',
Chris@76 858 ),
Chris@76 859 );
Chris@76 860 }
Chris@76 861 $smcFunc['db_free_result']($request);
Chris@76 862
Chris@76 863 // Hang about old chap, any comments from moderators on this one?
Chris@76 864 $request = $smcFunc['db_query']('', '
Chris@76 865 SELECT lc.id_comment, lc.id_notice, lc.log_time, lc.body,
Chris@76 866 IFNULL(mem.id_member, 0) AS id_member, IFNULL(mem.real_name, lc.member_name) AS moderator
Chris@76 867 FROM {db_prefix}log_comments AS lc
Chris@76 868 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lc.id_member)
Chris@76 869 WHERE lc.id_notice = {int:id_report}
Chris@76 870 AND lc.comment_type = {string:reportc}',
Chris@76 871 array(
Chris@76 872 'id_report' => $context['report']['id'],
Chris@76 873 'reportc' => 'reportc',
Chris@76 874 )
Chris@76 875 );
Chris@76 876 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 877 {
Chris@76 878 $context['report']['mod_comments'][] = array(
Chris@76 879 'id' => $row['id_comment'],
Chris@76 880 'message' => parse_bbc($row['body']),
Chris@76 881 'time' => timeformat($row['log_time']),
Chris@76 882 'member' => array(
Chris@76 883 'id' => $row['id_member'],
Chris@76 884 'name' => $row['moderator'],
Chris@76 885 'link' => $row['id_member'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['moderator'] . '</a>' : $row['moderator'],
Chris@76 886 'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
Chris@76 887 ),
Chris@76 888 );
Chris@76 889 }
Chris@76 890 $smcFunc['db_free_result']($request);
Chris@76 891
Chris@76 892 // What have the other moderators done to this message?
Chris@76 893 require_once($sourcedir . '/Modlog.php');
Chris@76 894 require_once($sourcedir . '/Subs-List.php');
Chris@76 895 loadLanguage('Modlog');
Chris@76 896
Chris@76 897 // This is all the information from the moderation log.
Chris@76 898 $listOptions = array(
Chris@76 899 'id' => 'moderation_actions_list',
Chris@76 900 'title' => $txt['mc_modreport_modactions'],
Chris@76 901 'items_per_page' => 15,
Chris@76 902 'no_items_label' => $txt['modlog_no_entries_found'],
Chris@76 903 'base_href' => $scripturl . '?action=moderate;area=reports;report=' . $context['report']['id'],
Chris@76 904 'default_sort_col' => 'time',
Chris@76 905 'get_items' => array(
Chris@76 906 'function' => 'list_getModLogEntries',
Chris@76 907 'params' => array(
Chris@76 908 'lm.id_topic = {int:id_topic}',
Chris@76 909 array('id_topic' => $context['report']['topic_id']),
Chris@76 910 1,
Chris@76 911 ),
Chris@76 912 ),
Chris@76 913 'get_count' => array(
Chris@76 914 'function' => 'list_getModLogEntryCount',
Chris@76 915 'params' => array(
Chris@76 916 'lm.id_topic = {int:id_topic}',
Chris@76 917 array('id_topic' => $context['report']['topic_id']),
Chris@76 918 1,
Chris@76 919 ),
Chris@76 920 ),
Chris@76 921 // This assumes we are viewing by user.
Chris@76 922 'columns' => array(
Chris@76 923 'action' => array(
Chris@76 924 'header' => array(
Chris@76 925 'value' => $txt['modlog_action'],
Chris@76 926 ),
Chris@76 927 'data' => array(
Chris@76 928 'db' => 'action_text',
Chris@76 929 'class' => 'smalltext',
Chris@76 930 ),
Chris@76 931 'sort' => array(
Chris@76 932 'default' => 'lm.action',
Chris@76 933 'reverse' => 'lm.action DESC',
Chris@76 934 ),
Chris@76 935 ),
Chris@76 936 'time' => array(
Chris@76 937 'header' => array(
Chris@76 938 'value' => $txt['modlog_date'],
Chris@76 939 ),
Chris@76 940 'data' => array(
Chris@76 941 'db' => 'time',
Chris@76 942 'class' => 'smalltext',
Chris@76 943 ),
Chris@76 944 'sort' => array(
Chris@76 945 'default' => 'lm.log_time',
Chris@76 946 'reverse' => 'lm.log_time DESC',
Chris@76 947 ),
Chris@76 948 ),
Chris@76 949 'moderator' => array(
Chris@76 950 'header' => array(
Chris@76 951 'value' => $txt['modlog_member'],
Chris@76 952 ),
Chris@76 953 'data' => array(
Chris@76 954 'db' => 'moderator_link',
Chris@76 955 'class' => 'smalltext',
Chris@76 956 ),
Chris@76 957 'sort' => array(
Chris@76 958 'default' => 'mem.real_name',
Chris@76 959 'reverse' => 'mem.real_name DESC',
Chris@76 960 ),
Chris@76 961 ),
Chris@76 962 'position' => array(
Chris@76 963 'header' => array(
Chris@76 964 'value' => $txt['modlog_position'],
Chris@76 965 ),
Chris@76 966 'data' => array(
Chris@76 967 'db' => 'position',
Chris@76 968 'class' => 'smalltext',
Chris@76 969 ),
Chris@76 970 'sort' => array(
Chris@76 971 'default' => 'mg.group_name',
Chris@76 972 'reverse' => 'mg.group_name DESC',
Chris@76 973 ),
Chris@76 974 ),
Chris@76 975 'ip' => array(
Chris@76 976 'header' => array(
Chris@76 977 'value' => $txt['modlog_ip'],
Chris@76 978 ),
Chris@76 979 'data' => array(
Chris@76 980 'db' => 'ip',
Chris@76 981 'class' => 'smalltext',
Chris@76 982 ),
Chris@76 983 'sort' => array(
Chris@76 984 'default' => 'lm.ip',
Chris@76 985 'reverse' => 'lm.ip DESC',
Chris@76 986 ),
Chris@76 987 ),
Chris@76 988 ),
Chris@76 989 );
Chris@76 990
Chris@76 991 // Create the watched user list.
Chris@76 992 createList($listOptions);
Chris@76 993
Chris@76 994 // Make sure to get the correct tab selected.
Chris@76 995 if ($context['report']['closed'])
Chris@76 996 $context[$context['moderation_menu_name']]['current_subsection'] = 'closed';
Chris@76 997
Chris@76 998 // Finally we are done :P
Chris@76 999 loadTemplate('ModerationCenter');
Chris@76 1000 $context['page_title'] = sprintf($txt['mc_viewmodreport'], $context['report']['subject'], $context['report']['author']['name']);
Chris@76 1001 $context['sub_template'] = 'viewmodreport';
Chris@76 1002 }
Chris@76 1003
Chris@76 1004 // Show a notice sent to a user.
Chris@76 1005 function ShowNotice()
Chris@76 1006 {
Chris@76 1007 global $smcFunc, $txt, $context;
Chris@76 1008
Chris@76 1009 $context['page_title'] = $txt['show_notice'];
Chris@76 1010 $context['sub_template'] = 'show_notice';
Chris@76 1011 $context['template_layers'] = array();
Chris@76 1012
Chris@76 1013 loadTemplate('ModerationCenter');
Chris@76 1014
Chris@76 1015 //!!! Assumes nothing needs permission more than accessing moderation center!
Chris@76 1016 $id_notice = (int) $_GET['nid'];
Chris@76 1017 $request = $smcFunc['db_query']('', '
Chris@76 1018 SELECT body, subject
Chris@76 1019 FROM {db_prefix}log_member_notices
Chris@76 1020 WHERE id_notice = {int:id_notice}',
Chris@76 1021 array(
Chris@76 1022 'id_notice' => $id_notice,
Chris@76 1023 )
Chris@76 1024 );
Chris@76 1025 if ($smcFunc['db_num_rows']($request) == 0)
Chris@76 1026 fatal_lang_error('no_access', false);
Chris@76 1027 list ($context['notice_body'], $context['notice_subject']) = $smcFunc['db_fetch_row']($request);
Chris@76 1028 $smcFunc['db_free_result']($request);
Chris@76 1029
Chris@76 1030 $context['notice_body'] = parse_bbc($context['notice_body'], false);
Chris@76 1031 }
Chris@76 1032
Chris@76 1033 // View watched users.
Chris@76 1034 function ViewWatchedUsers()
Chris@76 1035 {
Chris@76 1036 global $smcFunc, $modSettings, $context, $txt, $scripturl, $user_info, $sourcedir;
Chris@76 1037
Chris@76 1038 // Some important context!
Chris@76 1039 $context['page_title'] = $txt['mc_watched_users_title'];
Chris@76 1040 $context['view_posts'] = isset($_GET['sa']) && $_GET['sa'] == 'post';
Chris@76 1041 $context['start'] = isset($_REQUEST['start']) ? (int) $_REQUEST['start'] : 0;
Chris@76 1042
Chris@76 1043 loadTemplate('ModerationCenter');
Chris@76 1044
Chris@76 1045 // Get some key settings!
Chris@76 1046 $modSettings['warning_watch'] = empty($modSettings['warning_watch']) ? 1 : $modSettings['warning_watch'];
Chris@76 1047
Chris@76 1048 // Put some pretty tabs on cause we're gonna be doing hot stuff here...
Chris@76 1049 $context[$context['moderation_menu_name']]['tab_data'] = array(
Chris@76 1050 'title' => $txt['mc_watched_users_title'],
Chris@76 1051 'help' => '',
Chris@76 1052 'description' => $txt['mc_watched_users_desc'],
Chris@76 1053 );
Chris@76 1054
Chris@76 1055 // First off - are we deleting?
Chris@76 1056 if (!empty($_REQUEST['delete']))
Chris@76 1057 {
Chris@76 1058 checkSession(!is_array($_REQUEST['delete']) ? 'get' : 'post');
Chris@76 1059
Chris@76 1060 $toDelete = array();
Chris@76 1061 if (!is_array($_REQUEST['delete']))
Chris@76 1062 $toDelete[] = (int) $_REQUEST['delete'];
Chris@76 1063 else
Chris@76 1064 foreach ($_REQUEST['delete'] as $did)
Chris@76 1065 $toDelete[] = (int) $did;
Chris@76 1066
Chris@76 1067 if (!empty($toDelete))
Chris@76 1068 {
Chris@76 1069 require_once($sourcedir . '/RemoveTopic.php');
Chris@76 1070 // If they don't have permission we'll let it error - either way no chance of a security slip here!
Chris@76 1071 foreach ($toDelete as $did)
Chris@76 1072 removeMessage($did);
Chris@76 1073 }
Chris@76 1074 }
Chris@76 1075
Chris@76 1076 // Start preparing the list by grabbing relevant permissions.
Chris@76 1077 if (!$context['view_posts'])
Chris@76 1078 {
Chris@76 1079 $approve_query = '';
Chris@76 1080 $delete_boards = array();
Chris@76 1081 }
Chris@76 1082 else
Chris@76 1083 {
Chris@76 1084 // Still obey permissions!
Chris@76 1085 $approve_boards = boardsAllowedTo('approve_posts');
Chris@76 1086 $delete_boards = boardsAllowedTo('delete_any');
Chris@76 1087
Chris@76 1088 if ($approve_boards == array(0))
Chris@76 1089 $approve_query = '';
Chris@76 1090 elseif (!empty($approve_boards))
Chris@76 1091 $approve_query = ' AND m.id_board IN (' . implode(',', $approve_boards) . ')';
Chris@76 1092 // Nada, zip, etc...
Chris@76 1093 else
Chris@76 1094 $approve_query = ' AND 0';
Chris@76 1095 }
Chris@76 1096
Chris@76 1097 require_once($sourcedir . '/Subs-List.php');
Chris@76 1098
Chris@76 1099 // This is all the information required for a watched user listing.
Chris@76 1100 $listOptions = array(
Chris@76 1101 'id' => 'watch_user_list',
Chris@76 1102 'title' => $txt['mc_watched_users_title'] . ' - ' . ($context['view_posts'] ? $txt['mc_watched_users_post'] : $txt['mc_watched_users_member']),
Chris@76 1103 'width' => '100%',
Chris@76 1104 'items_per_page' => $modSettings['defaultMaxMessages'],
Chris@76 1105 'no_items_label' => $context['view_posts'] ? $txt['mc_watched_users_no_posts'] : $txt['mc_watched_users_none'],
Chris@76 1106 'base_href' => $scripturl . '?action=moderate;area=userwatch;sa=' . ($context['view_posts'] ? 'post' : 'member'),
Chris@76 1107 'default_sort_col' => $context['view_posts'] ? '' : 'member',
Chris@76 1108 'get_items' => array(
Chris@76 1109 'function' => $context['view_posts'] ? 'list_getWatchedUserPosts' : 'list_getWatchedUsers',
Chris@76 1110 'params' => array(
Chris@76 1111 $approve_query,
Chris@76 1112 $delete_boards,
Chris@76 1113 ),
Chris@76 1114 ),
Chris@76 1115 'get_count' => array(
Chris@76 1116 'function' => $context['view_posts'] ? 'list_getWatchedUserPostsCount' : 'list_getWatchedUserCount',
Chris@76 1117 'params' => array(
Chris@76 1118 $approve_query,
Chris@76 1119 ),
Chris@76 1120 ),
Chris@76 1121 // This assumes we are viewing by user.
Chris@76 1122 'columns' => array(
Chris@76 1123 'member' => array(
Chris@76 1124 'header' => array(
Chris@76 1125 'value' => $txt['mc_watched_users_member'],
Chris@76 1126 ),
Chris@76 1127 'data' => array(
Chris@76 1128 'sprintf' => array(
Chris@76 1129 'format' => '<a href="' . $scripturl . '?action=profile;u=%1$d">%2$s</a>',
Chris@76 1130 'params' => array(
Chris@76 1131 'id' => false,
Chris@76 1132 'name' => false,
Chris@76 1133 ),
Chris@76 1134 ),
Chris@76 1135 ),
Chris@76 1136 'sort' => array(
Chris@76 1137 'default' => 'real_name',
Chris@76 1138 'reverse' => 'real_name DESC',
Chris@76 1139 ),
Chris@76 1140 ),
Chris@76 1141 'warning' => array(
Chris@76 1142 'header' => array(
Chris@76 1143 'value' => $txt['mc_watched_users_warning'],
Chris@76 1144 ),
Chris@76 1145 'data' => array(
Chris@76 1146 'function' => create_function('$member', '
Chris@76 1147 global $scripturl;
Chris@76 1148
Chris@76 1149 return allowedTo(\'issue_warning\') ? \'<a href="\' . $scripturl . \'?action=profile;area=issuewarning;u=\' . $member[\'id\'] . \'">\' . $member[\'warning\'] . \'%</a>\' : $member[\'warning\'] . \'%\';
Chris@76 1150 '),
Chris@76 1151 ),
Chris@76 1152 'sort' => array(
Chris@76 1153 'default' => 'warning',
Chris@76 1154 'reverse' => 'warning DESC',
Chris@76 1155 ),
Chris@76 1156 ),
Chris@76 1157 'posts' => array(
Chris@76 1158 'header' => array(
Chris@76 1159 'value' => $txt['posts'],
Chris@76 1160 ),
Chris@76 1161 'data' => array(
Chris@76 1162 'sprintf' => array(
Chris@76 1163 'format' => '<a href="' . $scripturl . '?action=profile;u=%1$d;area=showposts;sa=messages">%2$s</a>',
Chris@76 1164 'params' => array(
Chris@76 1165 'id' => false,
Chris@76 1166 'posts' => false,
Chris@76 1167 ),
Chris@76 1168 ),
Chris@76 1169 ),
Chris@76 1170 'sort' => array(
Chris@76 1171 'default' => 'posts',
Chris@76 1172 'reverse' => 'posts DESC',
Chris@76 1173 ),
Chris@76 1174 ),
Chris@76 1175 'last_login' => array(
Chris@76 1176 'header' => array(
Chris@76 1177 'value' => $txt['mc_watched_users_last_login'],
Chris@76 1178 ),
Chris@76 1179 'data' => array(
Chris@76 1180 'db' => 'last_login',
Chris@76 1181 ),
Chris@76 1182 'sort' => array(
Chris@76 1183 'default' => 'last_login',
Chris@76 1184 'reverse' => 'last_login DESC',
Chris@76 1185 ),
Chris@76 1186 ),
Chris@76 1187 'last_post' => array(
Chris@76 1188 'header' => array(
Chris@76 1189 'value' => $txt['mc_watched_users_last_post'],
Chris@76 1190 ),
Chris@76 1191 'data' => array(
Chris@76 1192 'function' => create_function('$member', '
Chris@76 1193 global $scripturl;
Chris@76 1194
Chris@76 1195 if ($member[\'last_post_id\'])
Chris@76 1196 return \'<a href="\' . $scripturl . \'?msg=\' . $member[\'last_post_id\'] . \'">\' . $member[\'last_post\'] . \'</a>\';
Chris@76 1197 else
Chris@76 1198 return $member[\'last_post\'];
Chris@76 1199 '),
Chris@76 1200 ),
Chris@76 1201 ),
Chris@76 1202 ),
Chris@76 1203 'form' => array(
Chris@76 1204 'href' => $scripturl . '?action=moderate;area=userwatch;sa=post',
Chris@76 1205 'include_sort' => true,
Chris@76 1206 'include_start' => true,
Chris@76 1207 'hidden_fields' => array(
Chris@76 1208 $context['session_var'] => $context['session_id'],
Chris@76 1209 ),
Chris@76 1210 ),
Chris@76 1211 'additional_rows' => array(
Chris@76 1212 $context['view_posts'] ?
Chris@76 1213 array(
Chris@76 1214 'position' => 'bottom_of_list',
Chris@76 1215 'value' => '
Chris@76 1216 <input type="submit" name="delete_selected" value="' . $txt['quickmod_delete_selected'] . '" class="button_submit" />',
Chris@76 1217 'align' => 'right',
Chris@76 1218 ) : array(),
Chris@76 1219 ),
Chris@76 1220 );
Chris@76 1221
Chris@76 1222 // If this is being viewed by posts we actually change the columns to call a template each time.
Chris@76 1223 if ($context['view_posts'])
Chris@76 1224 {
Chris@76 1225 $listOptions['columns'] = array(
Chris@76 1226 'posts' => array(
Chris@76 1227 'data' => array(
Chris@76 1228 'function' => create_function('$post', '
Chris@76 1229 return template_user_watch_post_callback($post);
Chris@76 1230 '),
Chris@76 1231 ),
Chris@76 1232 ),
Chris@76 1233 );
Chris@76 1234 }
Chris@76 1235
Chris@76 1236 // Create the watched user list.
Chris@76 1237 createList($listOptions);
Chris@76 1238
Chris@76 1239 $context['sub_template'] = 'show_list';
Chris@76 1240 $context['default_list'] = 'watch_user_list';
Chris@76 1241 }
Chris@76 1242
Chris@76 1243 function list_getWatchedUserCount($approve_query)
Chris@76 1244 {
Chris@76 1245 global $smcFunc, $modSettings;
Chris@76 1246
Chris@76 1247 $request = $smcFunc['db_query']('', '
Chris@76 1248 SELECT COUNT(*)
Chris@76 1249 FROM {db_prefix}members
Chris@76 1250 WHERE warning >= {int:warning_watch}',
Chris@76 1251 array(
Chris@76 1252 'warning_watch' => $modSettings['warning_watch'],
Chris@76 1253 )
Chris@76 1254 );
Chris@76 1255 list ($totalMembers) = $smcFunc['db_fetch_row']($request);
Chris@76 1256 $smcFunc['db_free_result']($request);
Chris@76 1257
Chris@76 1258 return $totalMembers;
Chris@76 1259 }
Chris@76 1260
Chris@76 1261 function list_getWatchedUsers($start, $items_per_page, $sort, $approve_query, $dummy)
Chris@76 1262 {
Chris@76 1263 global $smcFunc, $txt, $scripturl, $modSettings, $user_info, $context;
Chris@76 1264
Chris@76 1265 $request = $smcFunc['db_query']('', '
Chris@76 1266 SELECT id_member, real_name, last_login, posts, warning
Chris@76 1267 FROM {db_prefix}members
Chris@76 1268 WHERE warning >= {int:warning_watch}
Chris@76 1269 ORDER BY {raw:sort}
Chris@76 1270 LIMIT ' . $start . ', ' . $items_per_page,
Chris@76 1271 array(
Chris@76 1272 'warning_watch' => $modSettings['warning_watch'],
Chris@76 1273 'sort' => $sort,
Chris@76 1274 )
Chris@76 1275 );
Chris@76 1276 $watched_users = array();
Chris@76 1277 $members = array();
Chris@76 1278 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1279 {
Chris@76 1280 $watched_users[$row['id_member']] = array(
Chris@76 1281 'id' => $row['id_member'],
Chris@76 1282 'name' => $row['real_name'],
Chris@76 1283 'last_login' => $row['last_login'] ? timeformat($row['last_login']) : $txt['never'],
Chris@76 1284 'last_post' => $txt['not_applicable'],
Chris@76 1285 'last_post_id' => 0,
Chris@76 1286 'warning' => $row['warning'],
Chris@76 1287 'posts' => $row['posts'],
Chris@76 1288 );
Chris@76 1289 $members[] = $row['id_member'];
Chris@76 1290 }
Chris@76 1291 $smcFunc['db_free_result']($request);
Chris@76 1292
Chris@76 1293 if (!empty($members))
Chris@76 1294 {
Chris@76 1295 // First get the latest messages from these users.
Chris@76 1296 $request = $smcFunc['db_query']('', '
Chris@76 1297 SELECT m.id_member, MAX(m.id_msg) AS last_post_id
Chris@76 1298 FROM {db_prefix}messages AS m' . ($user_info['query_see_board'] == '1=1' ? '' : '
Chris@76 1299 INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board AND {query_see_board})') . '
Chris@76 1300 WHERE m.id_member IN ({array_int:member_list})' . (!$modSettings['postmod_active'] || allowedTo('approve_posts') ? '' : '
Chris@76 1301 AND m.approved = {int:is_approved}') . '
Chris@76 1302 GROUP BY m.id_member',
Chris@76 1303 array(
Chris@76 1304 'member_list' => $members,
Chris@76 1305 'is_approved' => 1,
Chris@76 1306 )
Chris@76 1307 );
Chris@76 1308 $latest_posts = array();
Chris@76 1309 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1310 $latest_posts[$row['id_member']] = $row['last_post_id'];
Chris@76 1311
Chris@76 1312 if (!empty($latest_posts))
Chris@76 1313 {
Chris@76 1314 // Now get the time those messages were posted.
Chris@76 1315 $request = $smcFunc['db_query']('', '
Chris@76 1316 SELECT id_member, poster_time
Chris@76 1317 FROM {db_prefix}messages
Chris@76 1318 WHERE id_msg IN ({array_int:message_list})',
Chris@76 1319 array(
Chris@76 1320 'message_list' => $latest_posts,
Chris@76 1321 )
Chris@76 1322 );
Chris@76 1323 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1324 {
Chris@76 1325 $watched_users[$row['id_member']]['last_post'] = timeformat($row['poster_time']);
Chris@76 1326 $watched_users[$row['id_member']]['last_post_id'] = $latest_posts[$row['id_member']];
Chris@76 1327 }
Chris@76 1328
Chris@76 1329 $smcFunc['db_free_result']($request);
Chris@76 1330 }
Chris@76 1331
Chris@76 1332 $request = $smcFunc['db_query']('', '
Chris@76 1333 SELECT MAX(m.poster_time) AS last_post, MAX(m.id_msg) AS last_post_id, m.id_member
Chris@76 1334 FROM {db_prefix}messages AS m' . ($user_info['query_see_board'] == '1=1' ? '' : '
Chris@76 1335 INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board AND {query_see_board})') . '
Chris@76 1336 WHERE m.id_member IN ({array_int:member_list})' . (!$modSettings['postmod_active'] || allowedTo('approve_posts') ? '' : '
Chris@76 1337 AND m.approved = {int:is_approved}') . '
Chris@76 1338 GROUP BY m.id_member',
Chris@76 1339 array(
Chris@76 1340 'member_list' => $members,
Chris@76 1341 'is_approved' => 1,
Chris@76 1342 )
Chris@76 1343 );
Chris@76 1344 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1345 {
Chris@76 1346 $watched_users[$row['id_member']]['last_post'] = timeformat($row['last_post']);
Chris@76 1347 $watched_users[$row['id_member']]['last_post_id'] = $row['last_post_id'];
Chris@76 1348 }
Chris@76 1349 $smcFunc['db_free_result']($request);
Chris@76 1350 }
Chris@76 1351
Chris@76 1352 return $watched_users;
Chris@76 1353 }
Chris@76 1354
Chris@76 1355 function list_getWatchedUserPostsCount($approve_query)
Chris@76 1356 {
Chris@76 1357 global $smcFunc, $modSettings, $user_info;
Chris@76 1358
Chris@76 1359 $request = $smcFunc['db_query']('', '
Chris@76 1360 SELECT COUNT(*)
Chris@76 1361 FROM {db_prefix}messages AS m
Chris@76 1362 INNER JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)
Chris@76 1363 INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board)
Chris@76 1364 WHERE mem.warning >= {int:warning_watch}
Chris@76 1365 AND {query_see_board}
Chris@76 1366 ' . $approve_query,
Chris@76 1367 array(
Chris@76 1368 'warning_watch' => $modSettings['warning_watch'],
Chris@76 1369 )
Chris@76 1370 );
Chris@76 1371 list ($totalMemberPosts) = $smcFunc['db_fetch_row']($request);
Chris@76 1372 $smcFunc['db_free_result']($request);
Chris@76 1373
Chris@76 1374 return $totalMemberPosts;
Chris@76 1375 }
Chris@76 1376
Chris@76 1377 function list_getWatchedUserPosts($start, $items_per_page, $sort, $approve_query, $delete_boards)
Chris@76 1378 {
Chris@76 1379 global $smcFunc, $txt, $scripturl, $modSettings, $user_info;
Chris@76 1380
Chris@76 1381 $request = $smcFunc['db_query']('', '
Chris@76 1382 SELECT m.id_msg, m.id_topic, m.id_board, m.id_member, m.subject, m.body, m.poster_time,
Chris@76 1383 m.approved, mem.real_name, m.smileys_enabled
Chris@76 1384 FROM {db_prefix}messages AS m
Chris@76 1385 INNER JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)
Chris@76 1386 INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board)
Chris@76 1387 WHERE mem.warning >= {int:warning_watch}
Chris@76 1388 AND {query_see_board}
Chris@76 1389 ' . $approve_query . '
Chris@76 1390 ORDER BY m.id_msg DESC
Chris@76 1391 LIMIT ' . $start . ', ' . $items_per_page,
Chris@76 1392 array(
Chris@76 1393 'warning_watch' => $modSettings['warning_watch'],
Chris@76 1394 )
Chris@76 1395 );
Chris@76 1396 $member_posts = array();
Chris@76 1397 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1398 {
Chris@76 1399 $row['subject'] = censorText($row['subject']);
Chris@76 1400 $row['body'] = censorText($row['body']);
Chris@76 1401
Chris@76 1402 $member_posts[$row['id_msg']] = array(
Chris@76 1403 'id' => $row['id_msg'],
Chris@76 1404 'id_topic' => $row['id_topic'],
Chris@76 1405 'author_link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>',
Chris@76 1406 'subject' => $row['subject'],
Chris@76 1407 'body' => parse_bbc($row['body'], $row['smileys_enabled'], $row['id_msg']),
Chris@76 1408 'poster_time' => timeformat($row['poster_time']),
Chris@76 1409 'approved' => $row['approved'],
Chris@76 1410 'can_delete' => $delete_boards == array(0) || in_array($row['id_board'], $delete_boards),
Chris@76 1411 );
Chris@76 1412 }
Chris@76 1413 $smcFunc['db_free_result']($request);
Chris@76 1414
Chris@76 1415 return $member_posts;
Chris@76 1416 }
Chris@76 1417
Chris@76 1418 // Entry point for viewing warning related stuff.
Chris@76 1419 function ViewWarnings()
Chris@76 1420 {
Chris@76 1421 global $context, $txt;
Chris@76 1422
Chris@76 1423 $subActions = array(
Chris@76 1424 'log' => array('ViewWarningLog'),
Chris@76 1425 'templateedit' => array('ModifyWarningTemplate', 'issue_warning'),
Chris@76 1426 'templates' => array('ViewWarningTemplates', 'issue_warning'),
Chris@76 1427 );
Chris@76 1428
Chris@76 1429 $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) && (empty($subActions[$_REQUEST['sa']][1]) || allowedTo($subActions[$_REQUEST['sa']]))? $_REQUEST['sa'] : 'log';
Chris@76 1430
Chris@76 1431 // Some of this stuff is overseas, so to speak.
Chris@76 1432 loadTemplate('ModerationCenter');
Chris@76 1433 loadLanguage('Profile');
Chris@76 1434
Chris@76 1435 // Setup the admin tabs.
Chris@76 1436 $context[$context['moderation_menu_name']]['tab_data'] = array(
Chris@76 1437 'title' => $txt['mc_warnings'],
Chris@76 1438 'description' => $txt['mc_warnings_description'],
Chris@76 1439 );
Chris@76 1440
Chris@76 1441 // Call the right function.
Chris@76 1442 $subActions[$_REQUEST['sa']][0]();
Chris@76 1443 }
Chris@76 1444
Chris@76 1445 // Simply put, look at the warning log!
Chris@76 1446 function ViewWarningLog()
Chris@76 1447 {
Chris@76 1448 global $smcFunc, $modSettings, $context, $txt, $scripturl, $sourcedir;
Chris@76 1449
Chris@76 1450 // Setup context as always.
Chris@76 1451 $context['page_title'] = $txt['mc_warning_log_title'];
Chris@76 1452
Chris@76 1453 require_once($sourcedir . '/Subs-List.php');
Chris@76 1454
Chris@76 1455 // This is all the information required for a watched user listing.
Chris@76 1456 $listOptions = array(
Chris@76 1457 'id' => 'warning_list',
Chris@76 1458 'title' => $txt['mc_warning_log_title'],
Chris@76 1459 'items_per_page' => $modSettings['defaultMaxMessages'],
Chris@76 1460 'no_items_label' => $txt['mc_warnings_none'],
Chris@76 1461 'base_href' => $scripturl . '?action=moderate;area=warnings;sa=log;' . $context['session_var'] . '=' . $context['session_id'],
Chris@76 1462 'default_sort_col' => 'time',
Chris@76 1463 'get_items' => array(
Chris@76 1464 'function' => 'list_getWarnings',
Chris@76 1465 ),
Chris@76 1466 'get_count' => array(
Chris@76 1467 'function' => 'list_getWarningCount',
Chris@76 1468 ),
Chris@76 1469 // This assumes we are viewing by user.
Chris@76 1470 'columns' => array(
Chris@76 1471 'issuer' => array(
Chris@76 1472 'header' => array(
Chris@76 1473 'value' => $txt['profile_warning_previous_issued'],
Chris@76 1474 ),
Chris@76 1475 'data' => array(
Chris@76 1476 'db' => 'issuer_link',
Chris@76 1477 ),
Chris@76 1478 'sort' => array(
Chris@76 1479 'default' => 'member_name_col',
Chris@76 1480 'reverse' => 'member_name_col DESC',
Chris@76 1481 ),
Chris@76 1482 ),
Chris@76 1483 'recipient' => array(
Chris@76 1484 'header' => array(
Chris@76 1485 'value' => $txt['mc_warnings_recipient'],
Chris@76 1486 ),
Chris@76 1487 'data' => array(
Chris@76 1488 'db' => 'recipient_link',
Chris@76 1489 ),
Chris@76 1490 'sort' => array(
Chris@76 1491 'default' => 'recipient_name',
Chris@76 1492 'reverse' => 'recipient_name DESC',
Chris@76 1493 ),
Chris@76 1494 ),
Chris@76 1495 'time' => array(
Chris@76 1496 'header' => array(
Chris@76 1497 'value' => $txt['profile_warning_previous_time'],
Chris@76 1498 ),
Chris@76 1499 'data' => array(
Chris@76 1500 'db' => 'time',
Chris@76 1501 ),
Chris@76 1502 'sort' => array(
Chris@76 1503 'default' => 'lc.log_time DESC',
Chris@76 1504 'reverse' => 'lc.log_time',
Chris@76 1505 ),
Chris@76 1506 ),
Chris@76 1507 'reason' => array(
Chris@76 1508 'header' => array(
Chris@76 1509 'value' => $txt['profile_warning_previous_reason'],
Chris@76 1510 ),
Chris@76 1511 'data' => array(
Chris@76 1512 'function' => create_function('$warning', '
Chris@76 1513 global $scripturl, $settings, $txt;
Chris@76 1514
Chris@76 1515 $output = \'
Chris@76 1516 <div class="floatleft">
Chris@76 1517 \' . $warning[\'reason\'] . \'
Chris@76 1518 </div>\';
Chris@76 1519
Chris@76 1520 if (!empty($warning[\'id_notice\']))
Chris@76 1521 $output .= \'
Chris@76 1522 <div class="floatright">
Chris@76 1523 <a href="\' . $scripturl . \'?action=moderate;area=notice;nid=\' . $warning[\'id_notice\'] . \'" onclick="window.open(this.href, \\\'\\\', \\\'scrollbars=yes,resizable=yes,width=400,height=250\\\');return false;" target="_blank" class="new_win" title="\' . $txt[\'profile_warning_previous_notice\'] . \'"><img src="\' . $settings[\'default_images_url\'] . \'/filter.gif" alt="\' . $txt[\'profile_warning_previous_notice\'] . \'" /></a>
Chris@76 1524 </div>\';
Chris@76 1525
Chris@76 1526 return $output;
Chris@76 1527 '),
Chris@76 1528 ),
Chris@76 1529 ),
Chris@76 1530 'points' => array(
Chris@76 1531 'header' => array(
Chris@76 1532 'value' => $txt['profile_warning_previous_level'],
Chris@76 1533 ),
Chris@76 1534 'data' => array(
Chris@76 1535 'db' => 'counter',
Chris@76 1536 ),
Chris@76 1537 ),
Chris@76 1538 ),
Chris@76 1539 );
Chris@76 1540
Chris@76 1541 // Create the watched user list.
Chris@76 1542 createList($listOptions);
Chris@76 1543
Chris@76 1544 $context['sub_template'] = 'show_list';
Chris@76 1545 $context['default_list'] = 'warning_list';
Chris@76 1546 }
Chris@76 1547
Chris@76 1548 function list_getWarningCount()
Chris@76 1549 {
Chris@76 1550 global $smcFunc, $modSettings;
Chris@76 1551
Chris@76 1552 $request = $smcFunc['db_query']('', '
Chris@76 1553 SELECT COUNT(*)
Chris@76 1554 FROM {db_prefix}log_comments
Chris@76 1555 WHERE comment_type = {string:warning}',
Chris@76 1556 array(
Chris@76 1557 'warning' => 'warning',
Chris@76 1558 )
Chris@76 1559 );
Chris@76 1560 list ($totalWarns) = $smcFunc['db_fetch_row']($request);
Chris@76 1561 $smcFunc['db_free_result']($request);
Chris@76 1562
Chris@76 1563 return $totalWarns;
Chris@76 1564 }
Chris@76 1565
Chris@76 1566 function list_getWarnings($start, $items_per_page, $sort)
Chris@76 1567 {
Chris@76 1568 global $smcFunc, $txt, $scripturl, $modSettings, $user_info;
Chris@76 1569
Chris@76 1570 $request = $smcFunc['db_query']('', '
Chris@76 1571 SELECT IFNULL(mem.id_member, 0) AS id_member, IFNULL(mem.real_name, lc.member_name) AS member_name_col,
Chris@76 1572 IFNULL(mem2.id_member, 0) AS id_recipient, IFNULL(mem2.real_name, lc.recipient_name) AS recipient_name,
Chris@76 1573 lc.log_time, lc.body, lc.id_notice, lc.counter
Chris@76 1574 FROM {db_prefix}log_comments AS lc
Chris@76 1575 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lc.id_member)
Chris@76 1576 LEFT JOIN {db_prefix}members AS mem2 ON (mem2.id_member = lc.id_recipient)
Chris@76 1577 WHERE lc.comment_type = {string:warning}
Chris@76 1578 ORDER BY ' . $sort . '
Chris@76 1579 LIMIT ' . $start . ', ' . $items_per_page,
Chris@76 1580 array(
Chris@76 1581 'warning' => 'warning',
Chris@76 1582 )
Chris@76 1583 );
Chris@76 1584 $warnings = array();
Chris@76 1585 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1586 {
Chris@76 1587 $warnings[] = array(
Chris@76 1588 'issuer_link' => $row['id_member'] ? ('<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['member_name_col'] . '</a>') : $row['member_name_col'],
Chris@76 1589 'recipient_link' => $row['id_recipient'] ? ('<a href="' . $scripturl . '?action=profile;u=' . $row['id_recipient'] . '">' . $row['recipient_name'] . '</a>') : $row['recipient_name'],
Chris@76 1590 'time' => timeformat($row['log_time']),
Chris@76 1591 'reason' => $row['body'],
Chris@76 1592 'counter' => $row['counter'] > 0 ? '+' . $row['counter'] : $row['counter'],
Chris@76 1593 'id_notice' => $row['id_notice'],
Chris@76 1594 );
Chris@76 1595 }
Chris@76 1596 $smcFunc['db_free_result']($request);
Chris@76 1597
Chris@76 1598 return $warnings;
Chris@76 1599 }
Chris@76 1600
Chris@76 1601 // Load all the warning templates.
Chris@76 1602 function ViewWarningTemplates()
Chris@76 1603 {
Chris@76 1604 global $smcFunc, $modSettings, $context, $txt, $scripturl, $sourcedir, $user_info;
Chris@76 1605
Chris@76 1606 // Submitting a new one?
Chris@76 1607 if (isset($_POST['add']))
Chris@76 1608 return ModifyWarningTemplate();
Chris@76 1609 elseif (isset($_POST['delete']) && !empty($_POST['deltpl']))
Chris@76 1610 {
Chris@76 1611 checkSession('post');
Chris@76 1612
Chris@76 1613 // Log the actions.
Chris@76 1614 $request = $smcFunc['db_query']('', '
Chris@76 1615 SELECT recipient_name
Chris@76 1616 FROM {db_prefix}log_comments
Chris@76 1617 WHERE id_comment IN ({array_int:delete_ids})
Chris@76 1618 AND comment_type = {string:warntpl}
Chris@76 1619 AND (id_recipient = {int:generic} OR id_recipient = {int:current_member})',
Chris@76 1620 array(
Chris@76 1621 'delete_ids' => $_POST['deltpl'],
Chris@76 1622 'warntpl' => 'warntpl',
Chris@76 1623 'generic' => 0,
Chris@76 1624 'current_member' => $user_info['id'],
Chris@76 1625 )
Chris@76 1626 );
Chris@76 1627 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1628 logAction('delete_warn_template', array('template' => $row['recipient_name']));
Chris@76 1629 $smcFunc['db_free_result']($request);
Chris@76 1630
Chris@76 1631 // Do the deletes.
Chris@76 1632 $smcFunc['db_query']('', '
Chris@76 1633 DELETE FROM {db_prefix}log_comments
Chris@76 1634 WHERE id_comment IN ({array_int:delete_ids})
Chris@76 1635 AND comment_type = {string:warntpl}
Chris@76 1636 AND (id_recipient = {int:generic} OR id_recipient = {int:current_member})',
Chris@76 1637 array(
Chris@76 1638 'delete_ids' => $_POST['deltpl'],
Chris@76 1639 'warntpl' => 'warntpl',
Chris@76 1640 'generic' => 0,
Chris@76 1641 'current_member' => $user_info['id'],
Chris@76 1642 )
Chris@76 1643 );
Chris@76 1644 }
Chris@76 1645
Chris@76 1646 // Setup context as always.
Chris@76 1647 $context['page_title'] = $txt['mc_warning_templates_title'];
Chris@76 1648
Chris@76 1649 require_once($sourcedir . '/Subs-List.php');
Chris@76 1650
Chris@76 1651 // This is all the information required for a watched user listing.
Chris@76 1652 $listOptions = array(
Chris@76 1653 'id' => 'warning_template_list',
Chris@76 1654 'title' => $txt['mc_warning_templates_title'],
Chris@76 1655 'items_per_page' => $modSettings['defaultMaxMessages'],
Chris@76 1656 'no_items_label' => $txt['mc_warning_templates_none'],
Chris@76 1657 'base_href' => $scripturl . '?action=moderate;area=warnings;sa=templates;' . $context['session_var'] . '=' . $context['session_id'],
Chris@76 1658 'default_sort_col' => 'title',
Chris@76 1659 'get_items' => array(
Chris@76 1660 'function' => 'list_getWarningTemplates',
Chris@76 1661 ),
Chris@76 1662 'get_count' => array(
Chris@76 1663 'function' => 'list_getWarningTemplateCount',
Chris@76 1664 ),
Chris@76 1665 // This assumes we are viewing by user.
Chris@76 1666 'columns' => array(
Chris@76 1667 'title' => array(
Chris@76 1668 'header' => array(
Chris@76 1669 'value' => $txt['mc_warning_templates_name'],
Chris@76 1670 ),
Chris@76 1671 'data' => array(
Chris@76 1672 'sprintf' => array(
Chris@76 1673 'format' => '<a href="' . $scripturl . '?action=moderate;area=warnings;sa=templateedit;tid=%1$d">%2$s</a>',
Chris@76 1674 'params' => array(
Chris@76 1675 'id_comment' => false,
Chris@76 1676 'title' => false,
Chris@76 1677 'body' => false,
Chris@76 1678 ),
Chris@76 1679 ),
Chris@76 1680 ),
Chris@76 1681 'sort' => array(
Chris@76 1682 'default' => 'template_title',
Chris@76 1683 'reverse' => 'template_title DESC',
Chris@76 1684 ),
Chris@76 1685 ),
Chris@76 1686 'creator' => array(
Chris@76 1687 'header' => array(
Chris@76 1688 'value' => $txt['mc_warning_templates_creator'],
Chris@76 1689 ),
Chris@76 1690 'data' => array(
Chris@76 1691 'db' => 'creator',
Chris@76 1692 ),
Chris@76 1693 'sort' => array(
Chris@76 1694 'default' => 'creator_name',
Chris@76 1695 'reverse' => 'creator_name DESC',
Chris@76 1696 ),
Chris@76 1697 ),
Chris@76 1698 'time' => array(
Chris@76 1699 'header' => array(
Chris@76 1700 'value' => $txt['mc_warning_templates_time'],
Chris@76 1701 ),
Chris@76 1702 'data' => array(
Chris@76 1703 'db' => 'time',
Chris@76 1704 ),
Chris@76 1705 'sort' => array(
Chris@76 1706 'default' => 'lc.log_time DESC',
Chris@76 1707 'reverse' => 'lc.log_time',
Chris@76 1708 ),
Chris@76 1709 ),
Chris@76 1710 'delete' => array(
Chris@76 1711 'header' => array(
Chris@76 1712 'style' => 'width: 4%;',
Chris@76 1713 ),
Chris@76 1714 'data' => array(
Chris@76 1715 'function' => create_function('$rowData', '
Chris@76 1716 global $context, $txt, $scripturl;
Chris@76 1717
Chris@76 1718 return \'<input type="checkbox" name="deltpl[]" value="\' . $rowData[\'id_comment\'] . \'" class="input_check" />\';
Chris@76 1719 '),
Chris@76 1720 'style' => 'text-align: center;',
Chris@76 1721 ),
Chris@76 1722 ),
Chris@76 1723 ),
Chris@76 1724 'form' => array(
Chris@76 1725 'href' => $scripturl . '?action=moderate;area=warnings;sa=templates',
Chris@76 1726 ),
Chris@76 1727 'additional_rows' => array(
Chris@76 1728 array(
Chris@76 1729 'position' => 'below_table_data',
Chris@76 1730 'value' => '
Chris@76 1731 <input type="submit" name="add" value="' . $txt['mc_warning_template_add'] . '" class="button_submit" />
Chris@76 1732 <input type="submit" name="delete" value="' . $txt['mc_warning_template_delete'] . '" onclick="return confirm(\'' . $txt['mc_warning_template_delete_confirm'] . '\');" class="button_submit" />',
Chris@76 1733 'style' => 'text-align: right;',
Chris@76 1734 ),
Chris@76 1735 ),
Chris@76 1736 );
Chris@76 1737
Chris@76 1738 // Create the watched user list.
Chris@76 1739 createList($listOptions);
Chris@76 1740
Chris@76 1741 $context['sub_template'] = 'show_list';
Chris@76 1742 $context['default_list'] = 'warning_template_list';
Chris@76 1743 }
Chris@76 1744
Chris@76 1745 function list_getWarningTemplateCount()
Chris@76 1746 {
Chris@76 1747 global $smcFunc, $modSettings, $user_info;
Chris@76 1748
Chris@76 1749 $request = $smcFunc['db_query']('', '
Chris@76 1750 SELECT COUNT(*)
Chris@76 1751 FROM {db_prefix}log_comments
Chris@76 1752 WHERE comment_type = {string:warntpl}
Chris@76 1753 AND (id_recipient = {string:generic} OR id_recipient = {int:current_member})',
Chris@76 1754 array(
Chris@76 1755 'warntpl' => 'warntpl',
Chris@76 1756 'generic' => 0,
Chris@76 1757 'current_member' => $user_info['id'],
Chris@76 1758 )
Chris@76 1759 );
Chris@76 1760 list ($totalWarns) = $smcFunc['db_fetch_row']($request);
Chris@76 1761 $smcFunc['db_free_result']($request);
Chris@76 1762
Chris@76 1763 return $totalWarns;
Chris@76 1764 }
Chris@76 1765
Chris@76 1766 function list_getWarningTemplates($start, $items_per_page, $sort)
Chris@76 1767 {
Chris@76 1768 global $smcFunc, $txt, $scripturl, $modSettings, $user_info;
Chris@76 1769
Chris@76 1770 $request = $smcFunc['db_query']('', '
Chris@76 1771 SELECT lc.id_comment, IFNULL(mem.id_member, 0) AS id_member,
Chris@76 1772 IFNULL(mem.real_name, lc.member_name) AS creator_name, recipient_name AS template_title,
Chris@76 1773 lc.log_time, lc.body
Chris@76 1774 FROM {db_prefix}log_comments AS lc
Chris@76 1775 LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lc.id_member)
Chris@76 1776 WHERE lc.comment_type = {string:warntpl}
Chris@76 1777 AND (id_recipient = {string:generic} OR id_recipient = {int:current_member})
Chris@76 1778 ORDER BY ' . $sort . '
Chris@76 1779 LIMIT ' . $start . ', ' . $items_per_page,
Chris@76 1780 array(
Chris@76 1781 'warntpl' => 'warntpl',
Chris@76 1782 'generic' => 0,
Chris@76 1783 'current_member' => $user_info['id'],
Chris@76 1784 )
Chris@76 1785 );
Chris@76 1786 $templates = array();
Chris@76 1787 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1788 {
Chris@76 1789 $templates[] = array(
Chris@76 1790 'id_comment' => $row['id_comment'],
Chris@76 1791 'creator' => $row['id_member'] ? ('<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['creator_name'] . '</a>') : $row['creator_name'],
Chris@76 1792 'time' => timeformat($row['log_time']),
Chris@76 1793 'title' => $row['template_title'],
Chris@76 1794 'body' => $smcFunc['htmlspecialchars']($row['body']),
Chris@76 1795 );
Chris@76 1796 }
Chris@76 1797 $smcFunc['db_free_result']($request);
Chris@76 1798
Chris@76 1799 return $templates;
Chris@76 1800 }
Chris@76 1801
Chris@76 1802 // Edit a warning template.
Chris@76 1803 function ModifyWarningTemplate()
Chris@76 1804 {
Chris@76 1805 global $smcFunc, $context, $txt, $user_info, $sourcedir;
Chris@76 1806
Chris@76 1807 $context['id_template'] = isset($_REQUEST['tid']) ? (int) $_REQUEST['tid'] : 0;
Chris@76 1808 $context['is_edit'] = $context['id_template'];
Chris@76 1809
Chris@76 1810 // Standard template things.
Chris@76 1811 $context['page_title'] = $context['is_edit'] ? $txt['mc_warning_template_modify'] : $txt['mc_warning_template_add'];
Chris@76 1812 $context['sub_template'] = 'warn_template';
Chris@76 1813 $context[$context['moderation_menu_name']]['current_subsection'] = 'templates';
Chris@76 1814
Chris@76 1815 // Defaults.
Chris@76 1816 $context['template_data'] = array(
Chris@76 1817 'title' => '',
Chris@76 1818 'body' => $txt['mc_warning_template_body_default'],
Chris@76 1819 'personal' => false,
Chris@76 1820 'can_edit_personal' => true,
Chris@76 1821 );
Chris@76 1822
Chris@76 1823 // If it's an edit load it.
Chris@76 1824 if ($context['is_edit'])
Chris@76 1825 {
Chris@76 1826 $request = $smcFunc['db_query']('', '
Chris@76 1827 SELECT id_member, id_recipient, recipient_name AS template_title, body
Chris@76 1828 FROM {db_prefix}log_comments
Chris@76 1829 WHERE id_comment = {int:id}
Chris@76 1830 AND comment_type = {string:warntpl}
Chris@76 1831 AND (id_recipient = {int:generic} OR id_recipient = {int:current_member})',
Chris@76 1832 array(
Chris@76 1833 'id' => $context['id_template'],
Chris@76 1834 'warntpl' => 'warntpl',
Chris@76 1835 'generic' => 0,
Chris@76 1836 'current_member' => $user_info['id'],
Chris@76 1837 )
Chris@76 1838 );
Chris@76 1839 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 1840 {
Chris@76 1841 $context['template_data'] = array(
Chris@76 1842 'title' => $row['template_title'],
Chris@76 1843 'body' => $smcFunc['htmlspecialchars']($row['body']),
Chris@76 1844 'personal' => $row['id_recipient'],
Chris@76 1845 'can_edit_personal' => $row['id_member'] == $user_info['id'],
Chris@76 1846 );
Chris@76 1847 }
Chris@76 1848 $smcFunc['db_free_result']($request);
Chris@76 1849 }
Chris@76 1850
Chris@76 1851 // Wait, we are saving?
Chris@76 1852 if (isset($_POST['save']))
Chris@76 1853 {
Chris@76 1854 checkSession('post');
Chris@76 1855
Chris@76 1856 // To check the BBC is pretty good...
Chris@76 1857 require_once($sourcedir . '/Subs-Post.php');
Chris@76 1858
Chris@76 1859 // Bit of cleaning!
Chris@76 1860 $_POST['template_body'] = trim($_POST['template_body']);
Chris@76 1861 $_POST['template_title'] = trim($_POST['template_title']);
Chris@76 1862
Chris@76 1863 // Need something in both boxes.
Chris@76 1864 if (empty($_POST['template_body']) || empty($_POST['template_title']))
Chris@76 1865 fatal_error($txt['mc_warning_template_error_empty']);
Chris@76 1866
Chris@76 1867 // Safety first.
Chris@76 1868 $_POST['template_title'] = $smcFunc['htmlspecialchars']($_POST['template_title']);
Chris@76 1869
Chris@76 1870 // Clean up BBC.
Chris@76 1871 preparsecode($_POST['template_body']);
Chris@76 1872 // But put line breaks back!
Chris@76 1873 $_POST['template_body'] = strtr($_POST['template_body'], array('<br />' => "\n"));
Chris@76 1874
Chris@76 1875 // Is this personal?
Chris@76 1876 $recipient_id = !empty($_POST['make_personal']) ? $user_info['id'] : 0;
Chris@76 1877
Chris@76 1878 // If we are this far it's save time.
Chris@76 1879 if ($context['is_edit'])
Chris@76 1880 {
Chris@76 1881 // Simple update...
Chris@76 1882 $smcFunc['db_query']('', '
Chris@76 1883 UPDATE {db_prefix}log_comments
Chris@76 1884 SET id_recipient = {int:personal}, recipient_name = {string:title}, body = {string:body}
Chris@76 1885 WHERE id_comment = {int:id}
Chris@76 1886 AND comment_type = {string:warntpl}
Chris@76 1887 AND (id_recipient = {int:generic} OR id_recipient = {int:current_member})'.
Chris@76 1888 ($recipient_id ? ' AND id_member = {int:current_member}' : ''),
Chris@76 1889 array(
Chris@76 1890 'personal' => $recipient_id,
Chris@76 1891 'title' => $_POST['template_title'],
Chris@76 1892 'body' => $_POST['template_body'],
Chris@76 1893 'id' => $context['id_template'],
Chris@76 1894 'warntpl' => 'warntpl',
Chris@76 1895 'generic' => 0,
Chris@76 1896 'current_member' => $user_info['id'],
Chris@76 1897 )
Chris@76 1898 );
Chris@76 1899
Chris@76 1900 // If it wasn't visible and now is they've effectively added it.
Chris@76 1901 if ($context['template_data']['personal'] && !$recipient_id)
Chris@76 1902 logAction('add_warn_template', array('template' => $_POST['template_title']));
Chris@76 1903 // Conversely if they made it personal it's a delete.
Chris@76 1904 elseif (!$context['template_data']['personal'] && $recipient_id)
Chris@76 1905 logAction('delete_warn_template', array('template' => $_POST['template_title']));
Chris@76 1906 // Otherwise just an edit.
Chris@76 1907 else
Chris@76 1908 logAction('modify_warn_template', array('template' => $_POST['template_title']));
Chris@76 1909 }
Chris@76 1910 else
Chris@76 1911 {
Chris@76 1912 $smcFunc['db_insert']('',
Chris@76 1913 '{db_prefix}log_comments',
Chris@76 1914 array(
Chris@76 1915 'id_member' => 'int', 'member_name' => 'string', 'comment_type' => 'string', 'id_recipient' => 'int',
Chris@76 1916 'recipient_name' => 'string-255', 'body' => 'string-65535', 'log_time' => 'int',
Chris@76 1917 ),
Chris@76 1918 array(
Chris@76 1919 $user_info['id'], $user_info['name'], 'warntpl', $recipient_id,
Chris@76 1920 $_POST['template_title'], $_POST['template_body'], time(),
Chris@76 1921 ),
Chris@76 1922 array('id_comment')
Chris@76 1923 );
Chris@76 1924
Chris@76 1925 logAction('add_warn_template', array('template' => $_POST['template_title']));
Chris@76 1926 }
Chris@76 1927
Chris@76 1928 // Get out of town...
Chris@76 1929 redirectexit('action=moderate;area=warnings;sa=templates');
Chris@76 1930 }
Chris@76 1931 }
Chris@76 1932
Chris@76 1933 // Change moderation preferences.
Chris@76 1934 function ModerationSettings()
Chris@76 1935 {
Chris@76 1936 global $context, $smcFunc, $txt, $sourcedir, $scripturl, $user_settings, $user_info;
Chris@76 1937
Chris@76 1938 // Some useful context stuff.
Chris@76 1939 loadTemplate('ModerationCenter');
Chris@76 1940 $context['page_title'] = $txt['mc_settings'];
Chris@76 1941 $context['sub_template'] = 'moderation_settings';
Chris@76 1942
Chris@76 1943 // What blocks can this user see?
Chris@76 1944 $context['homepage_blocks'] = array(
Chris@76 1945 'n' => $txt['mc_prefs_latest_news'],
Chris@76 1946 'p' => $txt['mc_notes'],
Chris@76 1947 );
Chris@76 1948 if ($context['can_moderate_groups'])
Chris@76 1949 $context['homepage_blocks']['g'] = $txt['mc_group_requests'];
Chris@76 1950 if ($context['can_moderate_boards'])
Chris@76 1951 {
Chris@76 1952 $context['homepage_blocks']['r'] = $txt['mc_reported_posts'];
Chris@76 1953 $context['homepage_blocks']['w'] = $txt['mc_watched_users'];
Chris@76 1954 }
Chris@76 1955
Chris@76 1956 // Does the user have any settings yet?
Chris@76 1957 if (empty($user_settings['mod_prefs']))
Chris@76 1958 {
Chris@76 1959 $mod_blocks = 'n' . ($context['can_moderate_boards'] ? 'wr' : '') . ($context['can_moderate_groups'] ? 'g' : '');
Chris@76 1960 $pref_binary = 5;
Chris@76 1961 $show_reports = 1;
Chris@76 1962 }
Chris@76 1963 else
Chris@76 1964 {
Chris@76 1965 list ($show_reports, $mod_blocks, $pref_binary) = explode('|', $user_settings['mod_prefs']);
Chris@76 1966 }
Chris@76 1967
Chris@76 1968 // Are we saving?
Chris@76 1969 if (isset($_POST['save']))
Chris@76 1970 {
Chris@76 1971 checkSession('post');
Chris@76 1972 /* Current format of mod_prefs is:
Chris@76 1973 x|ABCD|yyy
Chris@76 1974
Chris@76 1975 WHERE:
Chris@76 1976 x = Show report count on forum header.
Chris@76 1977 ABCD = Block indexes to show on moderation main page.
Chris@76 1978 yyy = Integer with the following bit status:
Chris@76 1979 - yyy & 1 = Always notify on reports.
Chris@76 1980 - yyy & 2 = Notify on reports for moderators only.
Chris@76 1981 - yyy & 4 = Notify about posts awaiting approval.
Chris@76 1982 */
Chris@76 1983
Chris@76 1984 // Do blocks first!
Chris@76 1985 $mod_blocks = '';
Chris@76 1986 if (!empty($_POST['mod_homepage']))
Chris@76 1987 foreach ($_POST['mod_homepage'] as $k => $v)
Chris@76 1988 {
Chris@76 1989 // Make sure they can add this...
Chris@76 1990 if (isset($context['homepage_blocks'][$k]))
Chris@76 1991 $mod_blocks .= $k;
Chris@76 1992 }
Chris@76 1993
Chris@76 1994 // Now check other options!
Chris@76 1995 $pref_binary = 0;
Chris@76 1996
Chris@76 1997 if ($context['can_moderate_approvals'] && !empty($_POST['mod_notify_approval']))
Chris@76 1998 $pref_binary |= 4;
Chris@76 1999
Chris@76 2000 if ($context['can_moderate_boards'])
Chris@76 2001 {
Chris@76 2002 if (!empty($_POST['mod_notify_report']))
Chris@76 2003 $pref_binary |= ($_POST['mod_notify_report'] == 2 ? 1 : 2);
Chris@76 2004
Chris@76 2005 $show_reports = !empty($_POST['mod_show_reports']) ? 1 : 0;
Chris@76 2006 }
Chris@76 2007
Chris@76 2008 // Put it all together.
Chris@76 2009 $mod_prefs = $show_reports . '|' . $mod_blocks . '|' . $pref_binary;
Chris@76 2010 updateMemberData($user_info['id'], array('mod_prefs' => $mod_prefs));
Chris@76 2011 }
Chris@76 2012
Chris@76 2013 // What blocks does the user currently have selected?
Chris@76 2014 $context['mod_settings'] = array(
Chris@76 2015 'show_reports' => $show_reports,
Chris@76 2016 'notify_report' => $pref_binary & 2 ? 1 : ($pref_binary & 1 ? 2 : 0),
Chris@76 2017 'notify_approval' => $pref_binary & 4,
Chris@76 2018 'user_blocks' => str_split($mod_blocks),
Chris@76 2019 );
Chris@76 2020 }
Chris@76 2021
Chris@76 2022 ?>