$txt['modlog_ac_locked'], 'sticky' => $txt['modlog_ac_stickied'], 'modify' => $txt['modlog_ac_modified'], 'merge' => $txt['modlog_ac_merged'], 'split' => $txt['modlog_ac_split'], 'move' => $txt['modlog_ac_moved'], 'remove' => $txt['modlog_ac_removed'], 'delete' => $txt['modlog_ac_deleted'], 'delete_member' => $txt['modlog_ac_deleted_member'], 'ban' => $txt['modlog_ac_banned'], 'news' => $txt['modlog_ac_news'], 'profile' => $txt['modlog_ac_profile'], 'pruned' => $txt['modlog_ac_pruned'], ); // Do the column stuff. $context['columns'] = array( 'lm.action' => array('label' => $txt['modlog_action']), 'lm.logTime' => array('label' => $txt['modlog_date']), 'mem.realName' => array('label' => $txt['modlog_member']), 'mg.groupName' => array('label' => $txt['modlog_position']), 'lm.IP' => array('label' => $txt['modlog_ip']) ); // Check the order column exists. if (!isset($context['columns'][$context['order']])) $context['order'] = 'lm.logTime'; // Provide extra information about each column - the link, whether it's selected, etc. foreach ($context['columns'] as $col => $dummy) { $context['columns'][$col]['href'] = $scripturl . '?action=modlog;order=' . $col . ';start=0'; if (!isset($_REQUEST['d']) && $col == $context['order']) $context['columns'][$col]['href'] .= ';d'; $context['columns'][$col]['link'] = '' . $context['columns'][$col]['label'] . ''; $context['columns'][$col]['selected'] = $context['order'] == $col; } // Sort direction? $context['sort_direction'] = !isset($_REQUEST['d']) ? 'down' : 'up'; // Count the amount of entries in total for pagination. $result = db_query(" SELECT COUNT(ID_ACTION) FROM {$db_prefix}log_actions", __FILE__, __LINE__); list ($total) = mysql_fetch_row($result); mysql_free_result($result); // Create the page index. $context['page_index'] = isset($_REQUEST['search']) ? '' : constructPageIndex($scripturl . '?action=modlog;order=' . $context['order'] . $context['dir'], $context['start'], $total, $displaypage); // Here we have the query getting the log details. $result = db_query(" SELECT lm.ID_ACTION, lm.ID_MEMBER, lm.IP, lm.logTime, lm.action, lm.extra, mem.realName, mg.groupName FROM {$db_prefix}log_actions AS lm LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = lm.ID_MEMBER) LEFT JOIN {$db_prefix}membergroups AS mg ON (mg.ID_GROUP = IF(mem.ID_GROUP = 0, mem.ID_POST_GROUP, mem.ID_GROUP))" . (isset($_REQUEST['search']) ? " WHERE $context[order] LIKE '%$_REQUEST[search]%'" : '') . " ORDER BY $context[order]" . (isset($_REQUEST['d']) ? '' : ' DESC') . (isset($_REQUEST['search']) ? '' : " LIMIT $context[start], $displaypage"), __FILE__, __LINE__); // Decide whether the amount returns is total entries or ones that match search string. $context['entrynum'] = isset($_REQUEST['search']) ? $txt['modlog_search_result'] . ': ' . mysql_num_rows($result) : $txt['modlog_total_entries'] . ': ' . $total; // Arrays for decoding objects into. $topics = array(); $boards = array(); $members = array(); $context['entries'] = array(); while ($row = mysql_fetch_assoc($result)) { $row['extra'] = unserialize($row['extra']); // Is this associated with a topic? if (isset($row['extra']['topic'])) $topics[$row['extra']['topic']][] = $row['ID_ACTION']; if (isset($row['extra']['new_topic'])) $topics[$row['extra']['new_topic']][] = $row['ID_ACTION']; // How about a member? if (isset($row['extra']['member'])) $members[$row['extra']['member']][] = $row['ID_ACTION']; // Associated with a board? if (isset($row['extra']['board_to'])) $boards[$row['extra']['board_to']][] = $row['ID_ACTION']; if (isset($row['extra']['board_from'])) $boards[$row['extra']['board_from']][] = $row['ID_ACTION']; // IP Info? if (isset($row['extra']['ip_range'])) $row['extra']['ip_range'] = '' . $row['extra']['ip_range'] . ''; // Email? if (isset($row['extra']['email'])) $row['extra']['email'] = '' . $row['extra']['email'] . ''; // The array to go to the template. Note here that action is set to a "default" value of the action doesn't match anything in the descriptions. Allows easy adding of logging events with basic details. $context['entries'][$row['ID_ACTION']] = array( 'id' => $row['ID_ACTION'], 'ip' => $row['IP'], 'position' => $row['groupName'], 'moderator' => array( 'id' => $row['ID_MEMBER'], 'name' => $row['realName'], 'href' => $scripturl . '?action=profile;u=' . $row['ID_MEMBER'], 'link' => '' . $row['realName'] . '' ), 'time' => timeformat($row['logTime']), 'timestamp' => $row['logTime'], 'editable' => time() > $row['logTime'] + $hoursdisable * 3600, 'extra' => $row['extra'], 'action' => isset($descriptions[$row['action']]) ? $descriptions[$row['action']] : $row['action'], ); } mysql_free_result($result); if (!empty($boards)) { $request = db_query(" SELECT ID_BOARD, name FROM {$db_prefix}boards WHERE ID_BOARD IN (" . implode(', ', array_keys($boards)) . ") LIMIT " . count(array_keys($boards)), __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { foreach ($boards[$row['ID_BOARD']] as $action) { // Make the board number into a link - dealing with moving too. if ($context['entries'][$action]['extra']['board_to'] == $row['ID_BOARD']) $context['entries'][$action]['extra']['board_to'] = '' . $row['name'] . ''; elseif ($context['entries'][$action]['extra']['board_from'] == $row['ID_BOARD']) $context['entries'][$action]['extra']['board_from'] = '' . $row['name'] . ''; } } mysql_free_result($request); } if (!empty($topics)) { $request = db_query(" SELECT ms.subject, t.ID_TOPIC FROM {$db_prefix}topics AS t, {$db_prefix}messages AS ms WHERE t.ID_TOPIC IN (" . implode(', ', array_keys($topics)) . ") AND ms.ID_MSG = t.ID_FIRST_MSG LIMIT " . count(array_keys($topics)), __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { foreach ($topics[$row['ID_TOPIC']] as $action) { $this_action = &$context['entries'][$action]; // This isn't used in the current theme. $this_action['topic'] = array( 'id' => $row['ID_TOPIC'], 'subject' => $row['subject'], 'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0', 'link' => '' . $row['subject'] . '' ); // Make the topic number into a link - dealing with splitting too. if ($this_action['extra']['topic'] == $row['ID_TOPIC']) $this_action['extra']['topic'] = '' . $row['subject'] . ''; elseif ($this_action['extra']['new_topic'] == $row['ID_TOPIC']) $this_action['extra']['new_topic'] = '' . $row['subject'] . ''; } } mysql_free_result($request); } if (!empty($members)) { $request = db_query(" SELECT realName, ID_MEMBER FROM {$db_prefix}members WHERE ID_MEMBER IN (" . implode(', ', array_keys($members)) . ") LIMIT " . count(array_keys($members)), __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { foreach ($members[$row['ID_MEMBER']] as $action) { // Not used currently. $context['entries'][$action]['member'] = array( 'id' => $row['ID_MEMBER'], 'name' => $row['realName'], 'href' => $scripturl . '?action=profile;u=' . $row['ID_MEMBER'], 'link' => '' . $row['realName'] . '' ); // Make the member number into a name. $context['entries'][$action]['extra']['member'] = '' . $row['realName'] . ''; } } mysql_free_result($request); } } // Function that deletes off the old entries and handles search information. function ViewModlog2() { global $db_prefix, $txt, $modSettings, $scripturl; // Standard check... isAllowedTo('admin_forum'); // Amount of hours before is possible to delete entry. $hoursdisable = 24; if (isset($_POST['removeall'])) db_query(" DELETE FROM {$db_prefix}log_actions WHERE logtime < " . (time() - $hoursdisable * 3600), __FILE__, __LINE__); elseif (!empty($_POST['remove']) && isset($_POST['delete'])) db_query(" DELETE FROM {$db_prefix}log_actions WHERE ID_ACTION IN ('" . implode("', '", array_unique($_POST['delete'])) . "') AND logTime < " . (time() - $hoursdisable * 3600), __FILE__, __LINE__); redirectexit('action=modlog' . (isset($_POST['start']) ? ';start=' . $_POST['start'] : '') . (isset($_POST['order']) ? ';order=' . $_POST['order'] : '') . (!empty($_POST['dir']) ? ';d' : '') . (isset($_POST['search']) ? ';search=' . $_POST['search'] : '')); } ?>