Chris@76: time() - $context['hoursdisable'] * 3600, Chris@76: 'moderate_log' => $context['log_type'], Chris@76: ) Chris@76: ); Chris@76: } Chris@76: elseif (!empty($_POST['remove']) && isset($_POST['delete']) && $context['can_delete']) Chris@76: { Chris@76: checkSession(); Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}log_actions Chris@76: WHERE id_log = {int:moderate_log} Chris@76: AND id_action IN ({array_string:delete_actions}) Chris@76: AND log_time < {int:twenty_four_hours_wait}', Chris@76: array( Chris@76: 'twenty_four_hours_wait' => time() - $context['hoursdisable'] * 3600, Chris@76: 'delete_actions' => array_unique($_POST['delete']), Chris@76: 'moderate_log' => $context['log_type'], Chris@76: ) Chris@76: ); Chris@76: } Chris@76: Chris@76: // Do the column stuff! Chris@76: $sort_types = array( Chris@76: 'action' =>'lm.action', Chris@76: 'time' => 'lm.log_time', Chris@76: 'member' => 'mem.real_name', Chris@76: 'group' => 'mg.group_name', Chris@76: 'ip' => 'lm.ip', Chris@76: ); Chris@76: Chris@76: // Setup the direction stuff... Chris@76: $context['order'] = isset($_REQUEST['sort']) && isset($sort_types[$_REQUEST['sort']]) ? $_REQUEST['sort'] : 'time'; Chris@76: Chris@76: // If we're coming from a search, get the variables. Chris@76: if (!empty($_REQUEST['params']) && empty($_REQUEST['is_search'])) Chris@76: { Chris@76: $search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))); Chris@76: $search_params = @unserialize($search_params); Chris@76: } Chris@76: Chris@76: // This array houses all the valid search types. Chris@76: $searchTypes = array( Chris@76: 'action' => array('sql' => 'lm.action', 'label' => $txt['modlog_action']), Chris@76: 'member' => array('sql' => 'mem.real_name', 'label' => $txt['modlog_member']), Chris@76: 'group' => array('sql' => 'mg.group_name', 'label' => $txt['modlog_position']), Chris@76: 'ip' => array('sql' => 'lm.ip', 'label' => $txt['modlog_ip']) Chris@76: ); Chris@76: Chris@76: if (!isset($search_params['string']) || (!empty($_REQUEST['search']) && $search_params['string'] != $_REQUEST['search'])) Chris@76: $search_params_string = empty($_REQUEST['search']) ? '' : $_REQUEST['search']; Chris@76: else Chris@76: $search_params_string = $search_params['string']; Chris@76: Chris@76: if (isset($_REQUEST['search_type']) || empty($search_params['type']) || !isset($searchTypes[$search_params['type']])) Chris@76: $search_params_type = isset($_REQUEST['search_type']) && isset($searchTypes[$_REQUEST['search_type']]) ? $_REQUEST['search_type'] : (isset($searchTypes[$context['order']]) ? $context['order'] : 'member'); Chris@76: else Chris@76: $search_params_type = $search_params['type']; Chris@76: Chris@76: $search_params_column = $searchTypes[$search_params_type]['sql']; Chris@76: $search_params = array( Chris@76: 'string' => $search_params_string, Chris@76: 'type' => $search_params_type, Chris@76: ); Chris@76: Chris@76: // Setup the search context. Chris@76: $context['search_params'] = empty($search_params['string']) ? '' : base64_encode(serialize($search_params)); Chris@76: $context['search'] = array( Chris@76: 'string' => $search_params['string'], Chris@76: 'type' => $search_params['type'], Chris@76: 'label' => $searchTypes[$search_params_type]['label'], Chris@76: ); Chris@76: Chris@76: // If they are searching by action, then we must do some manual intervention to search in their language! Chris@76: if ($search_params['type'] == 'action' && !empty($search_params['string'])) Chris@76: { Chris@76: // For the moment they can only search for ONE action! Chris@76: foreach ($txt as $key => $text) Chris@76: { Chris@76: if (substr($key, 0, 10) == 'modlog_ac_' && strpos($text, $search_params['string']) !== false) Chris@76: { Chris@76: $search_params['string'] = substr($key, 10); Chris@76: break; Chris@76: } Chris@76: } Chris@76: } Chris@76: Chris@76: require_once($sourcedir . '/Subs-List.php'); Chris@76: Chris@76: // This is all the information required for a watched user listing. Chris@76: $listOptions = array( Chris@76: 'id' => 'moderation_log_list', Chris@76: 'title' => '' . $txt['help'] . ' ' . $txt['modlog_' . ($context['log_type'] == 3 ? 'admin' : 'moderation') . '_log'], Chris@76: 'width' => '100%', Chris@76: 'items_per_page' => $context['displaypage'], Chris@76: 'no_items_label' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin_log_' : '') . 'no_entries_found'], Chris@76: 'base_href' => $scripturl . $context['url_start'] . (!empty($context['search_params']) ? ';params=' . $context['search_params'] : ''), Chris@76: 'default_sort_col' => 'time', Chris@76: 'get_items' => array( Chris@76: 'function' => 'list_getModLogEntries', Chris@76: 'params' => array( Chris@76: (!empty($search_params['string']) ? ' INSTR({raw:sql_type}, {string:search_string})' : ''), Chris@76: array('sql_type' => $search_params_column, 'search_string' => $search_params['string']), Chris@76: $context['log_type'], Chris@76: ), Chris@76: ), Chris@76: 'get_count' => array( Chris@76: 'function' => 'list_getModLogEntryCount', Chris@76: 'params' => array( Chris@76: (!empty($search_params['string']) ? ' INSTR({raw:sql_type}, {string:search_string})' : ''), Chris@76: array('sql_type' => $search_params_column, 'search_string' => $search_params['string']), Chris@76: $context['log_type'], Chris@76: ), Chris@76: ), Chris@76: // This assumes we are viewing by user. Chris@76: 'columns' => array( Chris@76: 'action' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['modlog_action'], Chris@76: 'class' => 'lefttext first_th', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db' => 'action_text', Chris@76: 'class' => 'smalltext', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'lm.action', Chris@76: 'reverse' => 'lm.action DESC', Chris@76: ), Chris@76: ), Chris@76: 'time' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['modlog_date'], Chris@76: 'class' => 'lefttext', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db' => 'time', Chris@76: 'class' => 'smalltext', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'lm.log_time DESC', Chris@76: 'reverse' => 'lm.log_time', Chris@76: ), Chris@76: ), Chris@76: 'moderator' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['modlog_member'], Chris@76: 'class' => 'lefttext', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db' => 'moderator_link', Chris@76: 'class' => 'smalltext', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'mem.real_name', Chris@76: 'reverse' => 'mem.real_name DESC', Chris@76: ), Chris@76: ), Chris@76: 'position' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['modlog_position'], Chris@76: 'class' => 'lefttext', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db' => 'position', Chris@76: 'class' => 'smalltext', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'mg.group_name', Chris@76: 'reverse' => 'mg.group_name DESC', Chris@76: ), Chris@76: ), Chris@76: 'ip' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['modlog_ip'], Chris@76: 'class' => 'lefttext', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db' => 'ip', Chris@76: 'class' => 'smalltext', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'lm.ip', Chris@76: 'reverse' => 'lm.ip DESC', Chris@76: ), Chris@76: ), Chris@76: 'delete' => array( Chris@76: 'header' => array( Chris@76: 'value' => '', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'function' => create_function('$entry', ' Chris@76: return \'\'; Chris@76: '), Chris@76: 'style' => 'text-align: center;', Chris@76: ), Chris@76: ), Chris@76: ), Chris@76: 'form' => array( Chris@76: 'href' => $scripturl . $context['url_start'], Chris@76: 'include_sort' => true, Chris@76: 'include_start' => true, Chris@76: 'hidden_fields' => array( Chris@76: $context['session_var'] => $context['session_id'], Chris@76: 'params' => $context['search_params'] Chris@76: ), Chris@76: ), Chris@76: 'additional_rows' => array( Chris@76: array( Chris@76: 'position' => 'after_title', Chris@76: 'value' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin' : 'moderation') . '_log_desc'], Chris@76: 'class' => 'smalltext', Chris@76: 'style' => 'padding: 2ex;', Chris@76: ), Chris@76: array( Chris@76: 'position' => 'below_table_data', Chris@76: 'value' => ' Chris@76: ' . $txt['modlog_search'] . ' (' . $txt['modlog_by'] . ': ' . $context['search']['label'] . '): Chris@76: Chris@76: ' . ($context['can_delete'] ? ' | Chris@76: Chris@76: ' : ''), Chris@76: ), Chris@76: ), Chris@76: ); Chris@76: Chris@76: // Create the watched user list. Chris@76: createList($listOptions); Chris@76: Chris@76: $context['sub_template'] = 'show_list'; Chris@76: $context['default_list'] = 'moderation_log_list'; Chris@76: } Chris@76: Chris@76: // Get the number of mod log entries. Chris@76: function list_getModLogEntryCount($query_string = '', $query_params = array(), $log_type = 1) Chris@76: { Chris@76: global $smcFunc, $user_info; Chris@76: Chris@76: $modlog_query = allowedTo('admin_forum') || $user_info['mod_cache']['bq'] == '1=1' ? '1=1' : ($user_info['mod_cache']['bq'] == '0=1' ? 'lm.id_board = 0 AND lm.id_topic = 0' : (strtr($user_info['mod_cache']['bq'], array('id_board' => 'b.id_board')) . ' AND ' . strtr($user_info['mod_cache']['bq'], array('id_board' => 't.id_board')))); Chris@76: Chris@76: $result = $smcFunc['db_query']('', ' Chris@76: SELECT COUNT(*) Chris@76: FROM {db_prefix}log_actions AS lm Chris@76: LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lm.id_member) Chris@76: LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END) Chris@76: LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lm.id_board) Chris@76: LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lm.id_topic) Chris@76: WHERE id_log = {int:log_type} Chris@76: AND {raw:modlog_query}' Chris@76: . (!empty($query_string) ? ' Chris@76: AND ' . $query_string : ''), Chris@76: array_merge($query_params, array( Chris@76: 'reg_group_id' => 0, Chris@76: 'log_type' => $log_type, Chris@76: 'modlog_query' => $modlog_query, Chris@76: )) Chris@76: ); Chris@76: list ($entry_count) = $smcFunc['db_fetch_row']($result); Chris@76: $smcFunc['db_free_result']($result); Chris@76: Chris@76: return $entry_count; Chris@76: } Chris@76: Chris@76: function list_getModLogEntries($start, $items_per_page, $sort, $query_string = '', $query_params = array(), $log_type = 1) Chris@76: { Chris@76: global $context, $scripturl, $txt, $smcFunc, $user_info; Chris@76: Chris@76: $modlog_query = allowedTo('admin_forum') || $user_info['mod_cache']['bq'] == '1=1' ? '1=1' : ($user_info['mod_cache']['bq'] == '0=1' ? 'lm.id_board = 0 AND lm.id_topic = 0' : (strtr($user_info['mod_cache']['bq'], array('id_board' => 'b.id_board')) . ' AND ' . strtr($user_info['mod_cache']['bq'], array('id_board' => 't.id_board')))); Chris@76: Chris@76: // Do a little bit of self protection. Chris@76: if (!isset($context['hoursdisable'])) Chris@76: $context['hoursdisable'] = 24; Chris@76: Chris@76: // Can they see the IP address? Chris@76: $seeIP = allowedTo('moderate_forum'); Chris@76: Chris@76: // Here we have the query getting the log details. Chris@76: $result = $smcFunc['db_query']('', ' Chris@76: SELECT Chris@76: lm.id_action, lm.id_member, lm.ip, lm.log_time, lm.action, lm.id_board, lm.id_topic, lm.id_msg, lm.extra, Chris@76: mem.real_name, mg.group_name Chris@76: FROM {db_prefix}log_actions AS lm Chris@76: LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lm.id_member) Chris@76: LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END) Chris@76: LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lm.id_board) Chris@76: LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lm.id_topic) Chris@76: WHERE id_log = {int:log_type} Chris@76: AND {raw:modlog_query}' Chris@76: . (!empty($query_string) ? ' Chris@76: AND ' . $query_string : '') . ' Chris@76: ORDER BY ' . $sort . ' Chris@76: LIMIT ' . $start . ', ' . $items_per_page, Chris@76: array_merge($query_params, array( Chris@76: 'reg_group_id' => 0, Chris@76: 'log_type' => $log_type, Chris@76: 'modlog_query' => $modlog_query, Chris@76: )) Chris@76: ); Chris@76: Chris@76: // Arrays for decoding objects into. Chris@76: $topics = array(); Chris@76: $boards = array(); Chris@76: $members = array(); Chris@76: $messages = array(); Chris@76: $entries = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($result)) Chris@76: { Chris@76: $row['extra'] = @unserialize($row['extra']); Chris@76: Chris@76: // Corrupt? Chris@76: $row['extra'] = is_array($row['extra']) ? $row['extra'] : array(); Chris@76: Chris@76: // Add on some of the column stuff info Chris@76: if (!empty($row['id_board'])) Chris@76: { Chris@76: if ($row['action'] == 'move') Chris@76: $row['extra']['board_to'] = $row['id_board']; Chris@76: else Chris@76: $row['extra']['board'] = $row['id_board']; Chris@76: } Chris@76: Chris@76: if (!empty($row['id_topic'])) Chris@76: $row['extra']['topic'] = $row['id_topic']; Chris@76: if (!empty($row['id_msg'])) Chris@76: $row['extra']['message'] = $row['id_msg']; Chris@76: Chris@76: // Is this associated with a topic? Chris@76: if (isset($row['extra']['topic'])) Chris@76: $topics[(int) $row['extra']['topic']][] = $row['id_action']; Chris@76: if (isset($row['extra']['new_topic'])) Chris@76: $topics[(int) $row['extra']['new_topic']][] = $row['id_action']; Chris@76: Chris@76: // How about a member? Chris@76: if (isset($row['extra']['member'])) Chris@76: { Chris@76: // Guests don't have names! Chris@76: if (empty($row['extra']['member'])) Chris@76: $row['extra']['member'] = $txt['modlog_parameter_guest']; Chris@76: else Chris@76: { Chris@76: // Try to find it... Chris@76: $members[(int) $row['extra']['member']][] = $row['id_action']; Chris@76: } Chris@76: } Chris@76: Chris@76: // Associated with a board? Chris@76: if (isset($row['extra']['board_to'])) Chris@76: $boards[(int) $row['extra']['board_to']][] = $row['id_action']; Chris@76: if (isset($row['extra']['board_from'])) Chris@76: $boards[(int) $row['extra']['board_from']][] = $row['id_action']; Chris@76: if (isset($row['extra']['board'])) Chris@76: $boards[(int) $row['extra']['board']][] = $row['id_action']; Chris@76: Chris@76: // A message? Chris@76: if (isset($row['extra']['message'])) Chris@76: $messages[(int) $row['extra']['message']][] = $row['id_action']; Chris@76: Chris@76: // IP Info? Chris@76: if (isset($row['extra']['ip_range'])) Chris@76: if ($seeIP) Chris@76: $row['extra']['ip_range'] = '' . $row['extra']['ip_range'] . ''; Chris@76: else Chris@76: $row['extra']['ip_range'] = $txt['logged']; Chris@76: Chris@76: // Email? Chris@76: if (isset($row['extra']['email'])) Chris@76: $row['extra']['email'] = '' . $row['extra']['email'] . ''; Chris@76: Chris@76: // Bans are complex. Chris@76: if ($row['action'] == 'ban') Chris@76: { Chris@76: $row['action_text'] = $txt['modlog_ac_ban']; Chris@76: foreach (array('member', 'email', 'ip_range', 'hostname') as $type) Chris@76: if (isset($row['extra'][$type])) Chris@76: $row['action_text'] .= $txt['modlog_ac_ban_trigger_' . $type]; Chris@76: } Chris@76: Chris@76: // 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. Chris@76: $entries[$row['id_action']] = array( Chris@76: 'id' => $row['id_action'], Chris@76: 'ip' => $seeIP ? $row['ip'] : $txt['logged'], Chris@76: 'position' => empty($row['real_name']) && empty($row['group_name']) ? $txt['guest'] : $row['group_name'], Chris@76: 'moderator_link' => $row['id_member'] ? '' . $row['real_name'] . '' : (empty($row['real_name']) ? ($txt['guest'] . (!empty($row['extra']['member_acted']) ? ' (' . $row['extra']['member_acted'] . ')' : '')) : $row['real_name']), Chris@76: 'time' => timeformat($row['log_time']), Chris@76: 'timestamp' => forum_time(true, $row['log_time']), Chris@76: 'editable' => time() > $row['log_time'] + $context['hoursdisable'] * 3600, Chris@76: 'extra' => $row['extra'], Chris@76: 'action' => $row['action'], Chris@76: 'action_text' => isset($row['action_text']) ? $row['action_text'] : '', Chris@76: ); Chris@76: } Chris@76: $smcFunc['db_free_result']($result); Chris@76: Chris@76: if (!empty($boards)) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_board, name Chris@76: FROM {db_prefix}boards Chris@76: WHERE id_board IN ({array_int:board_list}) Chris@76: LIMIT ' . count(array_keys($boards)), Chris@76: array( Chris@76: 'board_list' => array_keys($boards), Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: foreach ($boards[$row['id_board']] as $action) Chris@76: { Chris@76: // Make the board number into a link - dealing with moving too. Chris@76: if (isset($entries[$action]['extra']['board_to']) && $entries[$action]['extra']['board_to'] == $row['id_board']) Chris@76: $entries[$action]['extra']['board_to'] = '' . $row['name'] . ''; Chris@76: elseif (isset($entries[$action]['extra']['board_from']) && $entries[$action]['extra']['board_from'] == $row['id_board']) Chris@76: $entries[$action]['extra']['board_from'] = '' . $row['name'] . ''; Chris@76: elseif (isset($entries[$action]['extra']['board']) && $entries[$action]['extra']['board'] == $row['id_board']) Chris@76: $entries[$action]['extra']['board'] = '' . $row['name'] . ''; Chris@76: } Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: } Chris@76: Chris@76: if (!empty($topics)) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT ms.subject, t.id_topic Chris@76: FROM {db_prefix}topics AS t Chris@76: INNER JOIN {db_prefix}messages AS ms ON (ms.id_msg = t.id_first_msg) Chris@76: WHERE t.id_topic IN ({array_int:topic_list}) Chris@76: LIMIT ' . count(array_keys($topics)), Chris@76: array( Chris@76: 'topic_list' => array_keys($topics), Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: foreach ($topics[$row['id_topic']] as $action) Chris@76: { Chris@76: $this_action = &$entries[$action]; Chris@76: Chris@76: // This isn't used in the current theme. Chris@76: $this_action['topic'] = array( Chris@76: 'id' => $row['id_topic'], Chris@76: 'subject' => $row['subject'], Chris@76: 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0', Chris@76: 'link' => '' . $row['subject'] . '' Chris@76: ); Chris@76: Chris@76: // Make the topic number into a link - dealing with splitting too. Chris@76: if (isset($this_action['extra']['topic']) && $this_action['extra']['topic'] == $row['id_topic']) Chris@76: $this_action['extra']['topic'] = '' . $row['subject'] . ''; Chris@76: elseif (isset($this_action['extra']['new_topic']) && $this_action['extra']['new_topic'] == $row['id_topic']) Chris@76: $this_action['extra']['new_topic'] = '' . $row['subject'] . ''; Chris@76: } Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: } Chris@76: Chris@76: if (!empty($messages)) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_msg, subject Chris@76: FROM {db_prefix}messages Chris@76: WHERE id_msg IN ({array_int:message_list}) Chris@76: LIMIT ' . count(array_keys($messages)), Chris@76: array( Chris@76: 'message_list' => array_keys($messages), Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: foreach ($messages[$row['id_msg']] as $action) Chris@76: { Chris@76: $this_action = &$entries[$action]; Chris@76: Chris@76: // This isn't used in the current theme. Chris@76: $this_action['message'] = array( Chris@76: 'id' => $row['id_msg'], Chris@76: 'subject' => $row['subject'], Chris@76: 'href' => $scripturl . '?msg=' . $row['id_msg'], Chris@76: 'link' => '' . $row['subject'] . '', Chris@76: ); Chris@76: Chris@76: // Make the message number into a link. Chris@76: if (isset($this_action['extra']['message']) && $this_action['extra']['message'] == $row['id_msg']) Chris@76: $this_action['extra']['message'] = '' . $row['subject'] . ''; Chris@76: } Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: } Chris@76: Chris@76: if (!empty($members)) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT real_name, id_member Chris@76: FROM {db_prefix}members Chris@76: WHERE id_member IN ({array_int:member_list}) Chris@76: LIMIT ' . count(array_keys($members)), Chris@76: array( Chris@76: 'member_list' => array_keys($members), Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: foreach ($members[$row['id_member']] as $action) Chris@76: { Chris@76: // Not used currently. Chris@76: $entries[$action]['member'] = array( Chris@76: 'id' => $row['id_member'], Chris@76: 'name' => $row['real_name'], Chris@76: 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], Chris@76: 'link' => '' . $row['real_name'] . '' Chris@76: ); Chris@76: // Make the member number into a name. Chris@76: $entries[$action]['extra']['member'] = '' . $row['real_name'] . ''; Chris@76: } Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: } Chris@76: Chris@76: // Do some formatting of the action string. Chris@76: foreach ($entries as $k => $entry) Chris@76: { Chris@76: // Make any message info links so its easier to go find that message. Chris@76: if (isset($entry['extra']['message']) && (empty($entry['message']) || empty($entry['message']['id']))) Chris@76: $entries[$k]['extra']['message'] = '' . $entry['extra']['message'] . ''; Chris@76: Chris@76: // Mark up any deleted members, topics and boards. Chris@76: foreach (array('board', 'board_from', 'board_to', 'member', 'topic', 'new_topic') as $type) Chris@76: if (!empty($entry['extra'][$type]) && is_numeric($entry['extra'][$type])) Chris@76: $entries[$k]['extra'][$type] = sprintf($txt['modlog_id'], $entry['extra'][$type]); Chris@76: Chris@76: if (empty($entries[$k]['action_text'])) Chris@76: $entries[$k]['action_text'] = isset($txt['modlog_ac_' . $entry['action']]) ? $txt['modlog_ac_' . $entry['action']] : $entry['action']; Chris@76: $entries[$k]['action_text'] = preg_replace('~\{([A-Za-z\d_]+)\}~ie', 'isset($entries[$k][\'extra\'][\'$1\']) ? $entries[$k][\'extra\'][\'$1\'] : \'\'', $entries[$k]['action_text']); Chris@76: } Chris@76: Chris@76: // Back we go! Chris@76: return $entries; Chris@76: } Chris@76: Chris@76: ?>