ers'];
}
// Make the page title more descriptive.
$context['page_title'] .= ' - ' . (isset($txt['gr_type_' . $context['report_type']]) ? $txt['gr_type_' . $context['report_type']] : $context['report_type']);
// Now generate the data.
$context['report_types'][$context['report_type']]['function']();
// Finish the tables before exiting - this is to help the templates a little more.
finishTables();
}
// Standard report about what settings the boards have.
function BoardReport()
{
global $context, $db_prefix, $txt;
// Get every moderator.
$request = db_query("
SELECT mods.ID_BOARD, mods.ID_MEMBER, mem.realName
FROM ({$db_prefix}moderators AS mods, {$db_prefix}members AS mem)
WHERE mem.ID_MEMBER = mods.ID_MEMBER", __FILE__, __LINE__);
$moderators = array();
while ($row = mysql_fetch_assoc($request))
$moderators[$row['ID_BOARD']][] = $row['realName'];
mysql_free_result($request);
// Get all the possible membergroups!
$request = db_query("
SELECT ID_GROUP, groupName, onlineColor
FROM {$db_prefix}membergroups", __FILE__, __LINE__);
$groups = array(-1 => $txt[28], 0 => $txt['full_member']);
while ($row = mysql_fetch_assoc($request))
$groups[$row['ID_GROUP']] = empty($row['onlineColor']) ? $row['groupName'] : '' . $row['groupName'] . '';
mysql_free_result($request);
// All the fields we'll show.
$boardSettings = array(
'category' => $txt['board_category'],
'parent' => $txt['board_parent'],
'num_topics' => $txt['board_num_topics'],
'num_posts' => $txt['board_num_posts'],
'count_posts' => $txt['board_count_posts'],
'theme' => $txt['board_theme'],
'override_theme' => $txt['board_override_theme'],
'moderators' => $txt['board_moderators'],
'groups' => $txt['board_groups'],
);
// Do it in columns, it's just easier.
setKeys('cols');
// Go through each board!
$request = db_query("
SELECT b.ID_BOARD, b.name, b.numPosts, b.numTopics, b.countPosts, b.memberGroups, b.override_theme, b.permission_mode,
c.name AS catName, IFNULL(par.name, '$txt[none]') AS parentName, IFNULL(th.value, '$txt[none]') AS themeName
FROM {$db_prefix}boards AS b
LEFT JOIN {$db_prefix}categories AS c ON (c.ID_CAT = b.ID_CAT)
LEFT JOIN {$db_prefix}boards AS par ON (par.ID_BOARD = b.ID_PARENT)
LEFT JOIN {$db_prefix}themes AS th ON (th.ID_THEME = b.ID_THEME AND variable = 'name')", __FILE__, __LINE__);
$boards = array(0 => array('name' => $txt['global_boards'], 'local_perms' => 1));
while ($row = mysql_fetch_assoc($request))
{
// Each board has it's own table.
newTable($row['name'], '', 'left', 'auto', 'left', 200, 'left');
// First off, add in the side key.
addData($boardSettings);
// Create the main data array.
$boardData = array(
'category' => $row['catName'],
'parent' => $row['parentName'],
'num_posts' => $row['numPosts'],
'num_topics' => $row['numTopics'],
'count_posts' => empty($row['countPosts']) ? $txt['yes'] : $txt['no'],
'theme' => $row['themeName'],
'override_theme' => $row['override_theme'] ? $txt['yes'] : $txt['no'],
'moderators' => empty($moderators[$row['ID_BOARD']]) ? $txt['none'] : implode(', ', $moderators[$row['ID_BOARD']]),
);
// Work out the membergroups who can access it.
$allowedGroups = explode(',', $row['memberGroups']);
foreach ($allowedGroups as $key => $group)
{
if (isset($groups[$group]))
$allowedGroups[$key] = $groups[$group];
else
unset($allowedGroups[$key]);
}
$boardData['groups'] = implode(', ', $allowedGroups);
// Next add the main data.
addData($boardData);
}
mysql_free_result($request);
}
// Generate a report on the current permissions by board and membergroup.
function BoardPermissionsReport()
{
global $context, $db_prefix, $txt, $modSettings;
if (isset($_REQUEST['boards']))
{
if (!is_array($_REQUEST['boards']))
$_REQUEST['boards'] = explode(',', $_REQUEST['boards']);
foreach ($_REQUEST['boards'] as $k => $dummy)
$_REQUEST['boards'][$k] = (int) $dummy;
$board_clause = 'ID_BOARD IN (' . implode(', ', $_REQUEST['boards']) . ')';
}
else
$board_clause = '1';
if (isset($_REQUEST['groups']))
{
if (!is_array($_REQUEST['groups']))
$_REQUEST['groups'] = explode(',', $_REQUEST['groups']);
foreach ($_REQUEST['groups'] as $k => $dummy)
$_REQUEST['groups'][$k] = (int) $dummy;
$group_clause = 'ID_GROUP IN (' . implode(', ', $_REQUEST['groups']) . ')';
}
else
$group_clause = '1';
// Fetch all the board names.
$request = db_query("
SELECT ID_BOARD, name, permission_mode
FROM {$db_prefix}boards
WHERE $board_clause", __FILE__, __LINE__);
$boards = array(0 => array('name' => $txt['global_boards'], 'local_perms' => 1));
while ($row = mysql_fetch_assoc($request))
$boards[$row['ID_BOARD']] = array(
'name' => $row['name'],
'local_perms' => !empty($modSettings['permission_enable_by_board']) && $row['permission_mode'] == 1,
'permission_mode' => empty($modSettings['permission_enable_by_board']) ? (empty($row['permission_mode']) ? 'normal' : ($row['permission_mode'] == 2 ? 'no_polls' : ($row['permission_mode'] == 3 ? 'reply_only' : 'read_only'))) : 'normal',
);
mysql_free_result($request);
// Get all the possible membergroups, except for admin!
$request = db_query("
SELECT ID_GROUP, groupName
FROM {$db_prefix}membergroups
WHERE $group_clause
AND ID_GROUP != 1" . (empty($modSettings['permission_enable_postgroups']) ? "
AND minPosts = -1" : '') . "
ORDER BY minPosts, IF(ID_GROUP < 4, ID_GROUP, 4), groupName", __FILE__, __LINE__);
if (!isset($_REQUEST['groups']) || in_array(-1, $_REQUEST['groups']) || in_array(0, $_REQUEST['groups']))
$memberGroups = array('col' => '', -1 => $txt['membergroups_guests'], 0 => $txt['membergroups_members']);
else
$memberGroups = array('col' => '');
while ($row = mysql_fetch_assoc($request))
$memberGroups[$row['ID_GROUP']] = $row['groupName'];
mysql_free_result($request);
// Make sure that every group is represented - plus in rows!
setKeys('rows', $memberGroups);
// Cache every permission setting, to make sure we don't miss any allows.
$permissions = array();
$board_permissions = array();
$request = db_query("
SELECT ID_BOARD, ID_GROUP, addDeny, permission
FROM {$db_prefix}board_permissions
WHERE $board_clause
AND $group_clause" . (empty($modSettings['permission_enable_deny']) ? "
AND addDeny = 1" : '') . "
ORDER BY ID_BOARD, permission", __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($request))
{
$board_permissions[$row['ID_BOARD']][$row['ID_GROUP']][$row['permission']] = $row['addDeny'];
// Make sure we get every permission.
if (!isset($permissions[$row['permission']]))
{
// This will be reused on other boards.
$permissions[$row['permission']] = array(
'title' => isset($txt['board_perms_name_' . $row['permission']]) ? $txt['board_perms_name_' . $row['permission']] : $row['permission'],
);
}
}
mysql_free_result($request);
// Now cycle through the board permissions array... lots to do ;)
foreach ($board_permissions as $board => $groups)
{
// If it's not using local permissions don't show any!
if ($board != 0 && !$boards[$board]['local_perms'])
continue;
// Create the table for this board first.
newTable($boards[$board]['name'], 'x', 'all', 100, 'center', 200, 'left');
// Add the header row - shows all the membergroups.
addData($memberGroups);
// Add the seperator.
addSeperator($txt['board_perms_permission']);
// Here cycle through all the detected permissions.
foreach ($permissions as $ID_PERM => $perm_info)
{
// Is this identical to the global?
$identicalGlobal = $board == 0 ? false : true;
// Default data for this row.
$curData = array('col' => $perm_info['title']);
// Now cycle each membergroup in this set of permissions.
foreach ($memberGroups as $ID_GROUP => $name)
{
// Don't overwrite the key column!
if ($ID_GROUP === 'col')
continue;
$group_permissions = isset($groups[$ID_GROUP]) ? $groups[$ID_GROUP] : array();
// Do we have any data for this group?
if (isset($group_permissions[$ID_PERM]))
{
// Set the data for this group to be the local permission.
$curData[$ID_GROUP] = $group_permissions[$ID_PERM];
// If it's different than the global - then this permission needs to be shown in diff view.
if (!isset($board_permissions[0][$ID_GROUP][$ID_PERM]) || $board_permissions[0][$ID_GROUP][$ID_PERM] != $group_permissions[$ID_PERM])
$identicalGlobal = false;
}
// Otherwise means it's set to disallow..
else
{
$curData[$ID_GROUP] = 'x';
if (isset($board_permissions[0][$ID_GROUP][$ID_PERM]) && $board_permissions[0][$ID_GROUP][$ID_PERM] != 'x')
$identicalGlobal = false;
}
// Now actually make the data for the group look right.
if (empty($curData[$ID_GROUP]))
$curData[$ID_GROUP] = '' . $txt['board_perms_deny'] . '';
elseif ($curData[$ID_GROUP] == 1)
$curData[$ID_GROUP] = '' . $txt['board_perms_allow'] . '';
else
$curData[$ID_GROUP] = 'x';
// Embolden those permissions different from global (makes it a lot easier!)
if (@$board_permissions[0][$ID_GROUP][$ID_PERM] != @$group_permissions[$ID_PERM])
$curData[$ID_GROUP] = '' . $curData[$ID_GROUP] . '';
}
// Now add the data for this permission.
//!!! Make an option for changing the view here!
if (!$identicalGlobal || !isset($_REQUEST['show_differences']))
addData($curData);
}
}
// We'll do a little bit of seperate stuff for boards using "simple" local permissions.
setKeys('rows');
foreach ($boards as $id => $board)
{
if ($id != 0 && !empty($board['permission_mode']) && $board['permission_mode'] != 'normal')
{
newTable($board['name'], 'x', 'top');
// Just add a description of the permission type.
addData(array('' . $txt['board_perms_group_' . $board['permission_mode']] . ''));
}
}
}
// Show what the membergroups are made of.
function MemberGroupsReport()
{
global $context, $db_prefix, $txt, $settings, $modSettings;
// Fetch all the board names.
$request = db_query("
SELECT ID_BOARD, name, memberGroups, permission_mode
FROM {$db_prefix}boards", __FILE__, __LINE__);
while ($row = mysql_fetch_assoc($request))
$boards[$row['ID_BOARD']] = array(
'id' => $row['ID_BOARD'],
'name' => $row['name'],
'local_perms' => !empty($modSettings['permission_enable_by_board']) && $row['permission_mode'] == 1,
'permission_mode' => empty($modSettings['permission_enable_by_board']) ? (empty($row['permission_mode']) ? $txt['permission_mode_normal'] : ($row['permission_mode'] == 2 ? $txt['permission_mode_no_polls'] : ($row['permission_mode'] == 3 ? $txt['permission_mode_reply_only'] : $txt['permission_mode_read_only']))) : $txt['permission_mode_normal'],
'groups' => array_merge(array(1,3), explode(',', $row['memberGroups'])),
);
mysql_free_result($request);
// Standard settings.
$mgSettings = array(
'name' => '',
'#sep#1' => $txt['member_group_settings'],
'color' => $txt['member_group_color'],
'minPosts' => $txt['member_group_minPosts'],
'maxMessages' => $txt['member_group_maxMessages'],
'stars' => $txt['member_group_stars'],
'#sep#2' => $txt['member_group_access'],
);
// Add on the boards!
foreach ($boards as $board)
$mgSettings['board_' . $board['id']] = $board['name'];
// Add all the membergroup settings, plus we'll be adding in columns!
setKeys('cols', $mgSettings);
// Only one table this time!
newTable($txt['gr_type_member_groups'], '-', 'all', 100, 'center', 200, 'left');
// Get the shaded column in.
addData($mgSettings);
// Now start cycling the membergroups!
$request = db_query("
SELECT mg.ID_GROUP, mg.groupName, mg.onlineColor, mg.minPosts, mg.maxMessages, mg.stars" . (empty($modSettings['permission_enable_by_board']) ? ", IF(bp.permission IS NOT NULL OR mg.ID_GROUP = 1, 1, 0) AS can_moderate" : '') . "
FROM {$db_prefix}membergroups AS mg" . (empty($modSettings['permission_enable_by_board']) ? "
LEFT JOIN {$db_prefix}board_permissions AS bp ON (bp.ID_GROUP = mg.ID_GROUP AND bp.ID_BOARD = 0 AND bp.permission = 'moderate_board')" : '') . "
ORDER BY mg.minPosts, IF(mg.ID_GROUP < 4, mg.ID_GROUP, 4), mg.groupName", __FILE__, __LINE__);
// Cache them so we get regular members too.
$rows = array(
array(
'ID_GROUP' => -1,
'groupName' => $txt['membergroups_guests'],
'onlineColor' => '-',
'minPosts' => -1,
'maxMessages' => null,
'stars' => ''
),
array(
'ID_GROUP' => 0,
'groupName' => $txt['membergroups_members'],
'onlineColor' => '-',
'minPosts' => -1,
'maxMessages' =