1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657:
<?php
if (!defined('SMF'))
die('No direct access...');
function ViewModlog()
{
global $txt, $context, $scripturl, $sourcedir, $smcFunc;
$context['log_type'] = isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'adminlog' ? 3 : 1;
if ($context['log_type'] == 3)
isAllowedTo('admin_forum');
if ($context['log_type'] == 3 || $_REQUEST['action'] == 'admin')
$context['url_start'] = '?action=admin;area=logs;sa=' . ($context['log_type'] == 3 ? 'adminlog' : 'modlog') . ';type=' . $context['log_type'];
else
$context['url_start'] = '?action=moderate;area=modlog;type=' . $context['log_type'];
$context['can_delete'] = allowedTo('admin_forum');
loadLanguage('Modlog');
$context['page_title'] = $context['log_type'] == 3 ? $txt['modlog_admin_log'] : $txt['modlog_view'];
$context['displaypage'] = 30;
if (isset($_POST['removeall']) && $context['can_delete'])
{
checkSession();
validateToken('mod-ml');
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}log_actions
WHERE id_log = {int:moderate_log}',
array(
'moderate_log' => $context['log_type'],
)
);
$log_type = isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'adminlog' ? 'admin' : 'moderate';
logAction('clearlog_' . $log_type, array(), $log_type);
}
elseif (!empty($_POST['remove']) && isset($_POST['delete']) && $context['can_delete'])
{
checkSession();
validateToken('mod-ml');
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}log_actions
WHERE id_log = {int:moderate_log}
AND id_action IN ({array_string:delete_actions})
AND action NOT LIKE {string:clearlog}',
array(
'delete_actions' => array_unique($_POST['delete']),
'moderate_log' => $context['log_type'],
'clearlog' => 'clearlog_%',
)
);
}
$sort_types = array(
'action' => 'lm.action',
'time' => 'lm.log_time',
'member' => 'mem.real_name',
'group' => 'mg.group_name',
'ip' => 'lm.ip',
);
$context['order'] = isset($_REQUEST['sort']) && isset($sort_types[$_REQUEST['sort']]) ? $_REQUEST['sort'] : 'time';
if (!empty($_REQUEST['params']) && empty($_REQUEST['is_search']))
{
$search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
$search_params = $smcFunc['json_decode']($search_params, true);
}
$searchTypes = array(
'action' => array('sql' => 'lm.action', 'label' => $txt['modlog_action']),
'member' => array('sql' => 'mem.real_name', 'label' => $txt['modlog_member']),
'group' => array('sql' => 'mg.group_name', 'label' => $txt['modlog_position']),
'ip' => array('sql' => 'lm.ip', 'label' => $txt['modlog_ip'])
);
if (!isset($search_params['string']) || (!empty($_REQUEST['search']) && $search_params['string'] != $_REQUEST['search']))
$search_params_string = empty($_REQUEST['search']) ? '' : $_REQUEST['search'];
else
$search_params_string = $search_params['string'];
if (isset($_REQUEST['search_type']) || empty($search_params['type']) || !isset($searchTypes[$search_params['type']]))
$search_params_type = isset($_REQUEST['search_type']) && isset($searchTypes[$_REQUEST['search_type']]) ? $_REQUEST['search_type'] : (isset($searchTypes[$context['order']]) ? $context['order'] : 'member');
else
$search_params_type = $search_params['type'];
$search_params_column = $searchTypes[$search_params_type]['sql'];
$search_params = array(
'string' => $search_params_string,
'type' => $search_params_type,
);
$context['search_params'] = empty($search_params['string']) ? '' : base64_encode($smcFunc['json_encode']($search_params));
$context['search'] = array(
'string' => $search_params['string'],
'type' => $search_params['type'],
'label' => $searchTypes[$search_params_type]['label'],
);
if ($search_params['type'] == 'action' && !empty($search_params['string']))
{
foreach ($txt as $key => $text)
{
if (substr($key, 0, 10) == 'modlog_ac_' && strpos($text, $search_params['string']) !== false)
{
$search_params['string'] = substr($key, 10);
break;
}
}
}
require_once($sourcedir . '/Subs-List.php');
$listOptions = array(
'id' => 'moderation_log_list',
'width' => '100%',
'items_per_page' => $context['displaypage'],
'no_items_label' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin_log_' : '') . 'no_entries_found'],
'base_href' => $scripturl . $context['url_start'] . (!empty($context['search_params']) ? ';params=' . $context['search_params'] : ''),
'default_sort_col' => 'time',
'get_items' => array(
'function' => 'list_getModLogEntries',
'params' => array(
(!empty($search_params['string']) ? ' INSTR({raw:sql_type}, {string:search_string})' : ''),
array('sql_type' => $search_params_column, 'search_string' => $search_params['string']),
$context['log_type'],
),
),
'get_count' => array(
'function' => 'list_getModLogEntryCount',
'params' => array(
(!empty($search_params['string']) ? ' INSTR({raw:sql_type}, {string:search_string})' : ''),
array('sql_type' => $search_params_column, 'search_string' => $search_params['string']),
$context['log_type'],
),
),
'columns' => array(
'action' => array(
'header' => array(
'value' => $txt['modlog_action'],
'class' => 'lefttext',
),
'data' => array(
'db' => 'action_text',
'class' => 'smalltext',
),
'sort' => array(
'default' => 'lm.action',
'reverse' => 'lm.action DESC',
),
),
'time' => array(
'header' => array(
'value' => $txt['modlog_date'],
'class' => 'lefttext',
),
'data' => array(
'db' => 'time',
'class' => 'smalltext',
),
'sort' => array(
'default' => 'lm.log_time DESC',
'reverse' => 'lm.log_time',
),
),
'moderator' => array(
'header' => array(
'value' => $txt['modlog_member'],
'class' => 'lefttext',
),
'data' => array(
'db' => 'moderator_link',
'class' => 'smalltext',
),
'sort' => array(
'default' => 'mem.real_name',
'reverse' => 'mem.real_name DESC',
),
),
'position' => array(
'header' => array(
'value' => $txt['modlog_position'],
'class' => 'lefttext',
),
'data' => array(
'db' => 'position',
'class' => 'smalltext',
),
'sort' => array(
'default' => 'mg.group_name',
'reverse' => 'mg.group_name DESC',
),
),
'ip' => array(
'header' => array(
'value' => $txt['modlog_ip'],
'class' => 'lefttext',
),
'data' => array(
'db' => 'ip',
'class' => 'smalltext',
),
'sort' => array(
'default' => 'lm.ip',
'reverse' => 'lm.ip DESC',
),
),
'delete' => array(
'header' => array(
'value' => '<input type="checkbox" name="all" onclick="invertAll(this, this.form);">',
'class' => 'centercol',
),
'data' => array(
'function' => function($entry)
{
return '<input type="checkbox" name="delete[]" value="' . $entry['id'] . '"' . ($entry['editable'] ? '' : ' disabled') . '>';
},
'class' => 'centercol',
),
),
),
'form' => array(
'href' => $scripturl . $context['url_start'],
'include_sort' => true,
'include_start' => true,
'hidden_fields' => array(
$context['session_var'] => $context['session_id'],
'params' => $context['search_params']
),
'token' => 'mod-ml',
),
'additional_rows' => array(
array(
'position' => 'below_table_data',
'value' => '
' . $txt['modlog_search'] . ' (' . $txt['modlog_by'] . ': ' . $context['search']['label'] . '):
<input type="text" name="search" size="18" value="' . $smcFunc['htmlspecialchars']($context['search']['string']) . '">
<input type="submit" name="is_search" value="' . $txt['modlog_go'] . '" class="button" style="float:none">
' . ($context['can_delete'] ? '
<input type="submit" name="remove" value="' . $txt['modlog_remove'] . '" data-confirm="' . $txt['modlog_remove_selected_confirm'] . '" class="button you_sure">
<input type="submit" name="removeall" value="' . $txt['modlog_removeall'] . '" data-confirm="' . $txt['modlog_remove_all_confirm'] . '" class="button you_sure">' : ''),
'class' => 'floatright',
),
),
);
$moderation_menu_name = array();
call_integration_hook('integrate_viewModLog', array(&$listOptions, &$moderation_menu_name));
createToken('mod-ml');
createList($listOptions);
$context['sub_template'] = 'show_list';
$context['default_list'] = 'moderation_log_list';
if (!empty($moderation_menu_name))
$context[$context['moderation_menu_name']]['tab_data'] = $moderation_menu_name;
elseif (isset($context['moderation_menu_name']))
$context[$context['moderation_menu_name']]['tab_data'] = array(
'title' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin' : 'moderation') . '_log'],
'help' => $context['log_type'] == 3 ? 'adminlog' : 'modlog',
'description' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin' : 'moderation') . '_log_desc']
);
}
function list_getModLogEntryCount($query_string = '', $query_params = array(), $log_type = 1, $ignore_boards = false)
{
global $smcFunc, $user_info;
$modlog_query = allowedTo('admin_forum') || $user_info['mod_cache']['bq'] == '1=1' ? '1=1' : (($user_info['mod_cache']['bq'] == '0=1' || $ignore_boards) ? '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'))));
$result = $smcFunc['db_query']('', '
SELECT COUNT(*)
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 = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lm.id_board)
LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lm.id_topic)
WHERE id_log = {int:log_type}
AND {raw:modlog_query}'
. (!empty($query_string) ? '
AND ' . $query_string : ''),
array_merge($query_params, array(
'reg_group_id' => 0,
'log_type' => $log_type,
'modlog_query' => $modlog_query,
))
);
list ($entry_count) = $smcFunc['db_fetch_row']($result);
$smcFunc['db_free_result']($result);
return $entry_count;
}
function list_getModLogEntries($start, $items_per_page, $sort, $query_string = '', $query_params = array(), $log_type = 1, $ignore_boards = false)
{
global $scripturl, $txt, $smcFunc, $user_info;
$modlog_query = allowedTo('admin_forum') || $user_info['mod_cache']['bq'] == '1=1' ? '1=1' : (($user_info['mod_cache']['bq'] == '0=1' || $ignore_boards) ? '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'))));
$seeIP = allowedTo('moderate_forum');
$result = $smcFunc['db_query']('', '
SELECT
lm.id_action, lm.id_member, lm.ip, lm.log_time, lm.action, lm.id_board, lm.id_topic, lm.id_msg, lm.extra,
mem.real_name, mg.group_name
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 = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lm.id_board)
LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lm.id_topic)
WHERE id_log = {int:log_type}
AND {raw:modlog_query}'
. (!empty($query_string) ? '
AND ' . $query_string : '') . '
ORDER BY {raw:sort}
LIMIT {int:start}, {int:max}',
array_merge($query_params, array(
'reg_group_id' => 0,
'log_type' => $log_type,
'modlog_query' => $modlog_query,
'sort' => $sort,
'start' => $start,
'max' => $items_per_page,
))
);
$topics = array();
$boards = array();
$members = array();
$messages = array();
$entries = array();
while ($row = $smcFunc['db_fetch_assoc']($result))
{
$row['extra'] = $smcFunc['json_decode']($row['extra'], true);
$row['extra'] = is_array($row['extra']) ? $row['extra'] : array();
if (!empty($row['id_board']))
{
if ($row['action'] == 'move')
$row['extra']['board_to'] = $row['id_board'];
else
$row['extra']['board'] = $row['id_board'];
}
if (!empty($row['id_topic']))
$row['extra']['topic'] = $row['id_topic'];
if (!empty($row['id_msg']))
$row['extra']['message'] = $row['id_msg'];
if (isset($row['extra']['topic']))
$topics[(int) $row['extra']['topic']][] = $row['id_action'];
if (isset($row['extra']['new_topic']))
$topics[(int) $row['extra']['new_topic']][] = $row['id_action'];
if (isset($row['extra']['member']))
{
if (empty($row['extra']['member']))
$row['extra']['member'] = $txt['modlog_parameter_guest'];
else
{
$members[(int) $row['extra']['member']][] = $row['id_action'];
}
}
if (isset($row['extra']['board_to']))
$boards[(int) $row['extra']['board_to']][] = $row['id_action'];
if (isset($row['extra']['board_from']))
$boards[(int) $row['extra']['board_from']][] = $row['id_action'];
if (isset($row['extra']['board']))
$boards[(int) $row['extra']['board']][] = $row['id_action'];
if (isset($row['extra']['message']))
$messages[(int) $row['extra']['message']][] = $row['id_action'];
if (isset($row['extra']['ip_range']))
if ($seeIP)
$row['extra']['ip_range'] = '<a href="' . $scripturl . '?action=trackip;searchip=' . $row['extra']['ip_range'] . '">' . $row['extra']['ip_range'] . '</a>';
else
$row['extra']['ip_range'] = $txt['logged'];
if (isset($row['extra']['email']))
$row['extra']['email'] = '<a href="mailto:' . $row['extra']['email'] . '">' . $row['extra']['email'] . '</a>';
if ($row['action'] == 'ban' || $row['action'] == 'banremove')
{
$row['action_text'] = $txt['modlog_ac_ban' . ($row['action'] == 'banremove' ? '_remove' : '')];
foreach (array('member', 'email', 'ip_range', 'hostname') as $type)
if (isset($row['extra'][$type]))
$row['action_text'] .= $txt['modlog_ac_ban_trigger_' . $type];
}
$entries[$row['id_action']] = array(
'id' => $row['id_action'],
'ip' => $seeIP ? inet_dtop($row['ip']) : $txt['logged'],
'position' => empty($row['real_name']) && empty($row['group_name']) ? $txt['guest'] : $row['group_name'],
'moderator_link' => $row['id_member'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>' : (empty($row['real_name']) ? ($txt['guest'] . (!empty($row['extra']['member_acted']) ? ' (' . $row['extra']['member_acted'] . ')' : '')) : $row['real_name']),
'time' => timeformat($row['log_time']),
'timestamp' => forum_time(true, $row['log_time']),
'editable' => substr($row['action'], 0, 8) !== 'clearlog',
'extra' => $row['extra'],
'action' => $row['action'],
'action_text' => isset($row['action_text']) ? $row['action_text'] : '',
);
}
$smcFunc['db_free_result']($result);
if (!empty($boards))
{
$request = $smcFunc['db_query']('', '
SELECT id_board, name
FROM {db_prefix}boards
WHERE id_board IN ({array_int:board_list})
LIMIT {int:limit}',
array(
'board_list' => array_keys($boards),
'limit' => count(array_keys($boards)),
)
);
while ($row = $smcFunc['db_fetch_assoc']($request))
{
foreach ($boards[$row['id_board']] as $action)
{
if (isset($entries[$action]['extra']['board_to']) && $entries[$action]['extra']['board_to'] == $row['id_board'])
$entries[$action]['extra']['board_to'] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
elseif (isset($entries[$action]['extra']['board_from']) && $entries[$action]['extra']['board_from'] == $row['id_board'])
$entries[$action]['extra']['board_from'] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
elseif (isset($entries[$action]['extra']['board']) && $entries[$action]['extra']['board'] == $row['id_board'])
$entries[$action]['extra']['board'] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
}
}
$smcFunc['db_free_result']($request);
}
if (!empty($topics))
{
$request = $smcFunc['db_query']('', '
SELECT ms.subject, t.id_topic
FROM {db_prefix}topics AS t
INNER JOIN {db_prefix}messages AS ms ON (ms.id_msg = t.id_first_msg)
WHERE t.id_topic IN ({array_int:topic_list})
LIMIT {int:limit}',
array(
'topic_list' => array_keys($topics),
'limit' => count(array_keys($topics)),
)
);
while ($row = $smcFunc['db_fetch_assoc']($request))
{
foreach ($topics[$row['id_topic']] as $action)
{
$this_action = &$entries[$action];
$this_action['topic'] = array(
'id' => $row['id_topic'],
'subject' => $row['subject'],
'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0',
'link' => '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.0">' . $row['subject'] . '</a>'
);
if (isset($this_action['extra']['topic']) && $this_action['extra']['topic'] == $row['id_topic'])
$this_action['extra']['topic'] = '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.' . (isset($this_action['extra']['message']) ? 'msg' . $this_action['extra']['message'] . '#msg' . $this_action['extra']['message'] : '0') . '">' . $row['subject'] . '</a>';
elseif (isset($this_action['extra']['new_topic']) && $this_action['extra']['new_topic'] == $row['id_topic'])
$this_action['extra']['new_topic'] = '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.' . (isset($this_action['extra']['message']) ? 'msg' . $this_action['extra']['message'] . '#msg' . $this_action['extra']['message'] : '0') . '">' . $row['subject'] . '</a>';
}
}
$smcFunc['db_free_result']($request);
}
if (!empty($messages))
{
$request = $smcFunc['db_query']('', '
SELECT id_msg, subject
FROM {db_prefix}messages
WHERE id_msg IN ({array_int:message_list})
LIMIT {int:limit}',
array(
'message_list' => array_keys($messages),
'limit' => count(array_keys($messages)),
)
);
while ($row = $smcFunc['db_fetch_assoc']($request))
{
foreach ($messages[$row['id_msg']] as $action)
{
$this_action = &$entries[$action];
$this_action['message'] = array(
'id' => $row['id_msg'],
'subject' => $row['subject'],
'href' => $scripturl . '?msg=' . $row['id_msg'],
'link' => '<a href="' . $scripturl . '?msg=' . $row['id_msg'] . '">' . $row['subject'] . '</a>',
);
if (isset($this_action['extra']['message']) && $this_action['extra']['message'] == $row['id_msg'])
$this_action['extra']['message'] = '<a href="' . $scripturl . '?msg=' . $row['id_msg'] . '">' . $row['subject'] . '</a>';
}
}
$smcFunc['db_free_result']($request);
}
if (!empty($members))
{
$request = $smcFunc['db_query']('', '
SELECT real_name, id_member
FROM {db_prefix}members
WHERE id_member IN ({array_int:member_list})
LIMIT {int:limit}',
array(
'member_list' => array_keys($members),
'limit' => count(array_keys($members)),
)
);
while ($row = $smcFunc['db_fetch_assoc']($request))
{
foreach ($members[$row['id_member']] as $action)
{
$entries[$action]['member'] = array(
'id' => $row['id_member'],
'name' => $row['real_name'],
'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>'
);
$entries[$action]['extra']['member'] = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>';
}
}
$smcFunc['db_free_result']($request);
}
foreach ($entries as $k => $entry)
{
if (isset($entry['extra']['message']) && (empty($entry['message']) || empty($entry['message']['id'])))
$entries[$k]['extra']['message'] = '<a href="' . $scripturl . '?msg=' . $entry['extra']['message'] . '">' . $entry['extra']['message'] . '</a>';
foreach (array('board', 'board_from', 'board_to', 'member', 'topic', 'new_topic') as $type)
if (!empty($entry['extra'][$type]) && is_numeric($entry['extra'][$type]))
$entries[$k]['extra'][$type] = sprintf($txt['modlog_id'], $entry['extra'][$type]);
if (isset($entry['extra']['report']))
{
if (stristr($entry['action'], 'user_report'))
$entries[$k]['extra']['report'] = '<a href="' . $scripturl . '?action=moderate;area=reportedmembers;sa=details;rid=' . $entry['extra']['report'] . '">' . $txt['modlog_report'] . '</a>';
else
$entries[$k]['extra']['report'] = '<a href="' . $scripturl . '?action=moderate;area=reportedposts;sa=details;rid=' . $entry['extra']['report'] . '">' . $txt['modlog_report'] . '</a>';
}
if (empty($entries[$k]['action_text']))
$entries[$k]['action_text'] = isset($txt['modlog_ac_' . $entry['action']]) ? $txt['modlog_ac_' . $entry['action']] : $entry['action'];
$entries[$k]['action_text'] = preg_replace_callback('~\{([A-Za-z\d_]+)\}~i',
function($matches) use ($entries, $k)
{
return isset($entries[$k]['extra'][$matches[1]]) ? $entries[$k]['extra'][$matches[1]] : '';
}, $entries[$k]['action_text']);
}
return $entries;
}
?>