function GetPrivileges($SessionId, &$RaidId, &$TeamId, &$UserId, &$Administrator, &$TeamUser, &$Moderator, &$OldMmb, &$RaidStage, &$TeamOutOfRange) { // Инициализируем переменные самым низким уровнем доступа $UserId = 0; $Administrator = 0; $TeamUser = 0; $Moderator = 0; $OldMmb = 0; $RaidStage = 0; $TeamOutOfRange = 0; $UserId = GetSession($SessionId); // Проверяем, не является ли пользователь администратором if ($UserId > 0) { $sql = "select user_admin from Users where user_hide = 0 and user_id = {$UserId}"; $Result = MySqlQuery($sql); if (!$Result) { return; } $Row = mysql_fetch_assoc($Result); $Administrator = $Row['user_admin']; mysql_free_result($Result); } // Контролируем, что команда есть в базе if ($TeamId > 0) { $sql = "select team_id, COALESCE(team_outofrange, 0) as team_outofrange from Teams where team_id = {$TeamId}"; $Result = MySqlQuery($sql); $Row = mysql_fetch_assoc($Result); if (mysql_num_rows($Result) == 0) { $TeamId = 0; } $TeamOutOfRange = $Row['team_outofrange']; mysql_free_result($Result); } // Если ($TeamId == 0) && ($RaidId != 0), то сделать $TeamId равным команде пользователя, если он участвует в RaidId // !! реализовать алгоритм !! // Проверяем, является ли пользователь членом команды if ($UserId > 0 && $TeamId > 0) { $sql = "select CASE WHEN count(*) > 0 THEN 1 ELSE 0 END as userinteam\n\t\t\t\tfrom TeamUsers tu\n\t\t\twhere teamuser_hide = 0 and team_id = {$TeamId} and user_id = {$UserId}"; $TeamUser = CSql::singleValue($sql, 'userinteam'); } // Если известна команда, то все дальнейшие действия проводим с тем ММБ, // в который записана команда if ($TeamId > 0) { $sql = "select raid_id from Distances d\n\t\t\t\tinner join Teams t on t.distance_id = d.distance_id\n\t\t\twhere t.team_id = {$TeamId}"; $RaidId = (int) CSql::singleValue($sql, 'raid_id'); } // Контролируем, что маршбросок существует в базе if ($RaidId > 0) { $sql = "select raid_id from Raids where raid_id = {$RaidId}"; if (CSql::rowCount($sql) == 0) { $RaidId = 0; } } // Если неизвестен маршбросок // то модератор и период маршброска считаются по умолчанию if ($RaidId <= 0) { return; } // Проверяем, является ли пользователь модератором марш-броска if ($UserId > 0) { $sql = "select CASE WHEN count(*) > 0 THEN 1 ELSE 0 END as user_moderator\n\t\t\tfrom RaidModerators\n\t\t\twhere raidmoderator_hide = 0 and raid_id = {$RaidId} and user_id = {$UserId}"; $Moderator = CSql::singleValue($sql, 'user_moderator'); } // 2015-10-24 Отключаем проверку на старые ммб - всё уже в базе // Определяем, проводился ли марш-бросок до 2012 года //$sql = "select CASE WHEN raid_registrationenddate is not null and YEAR(raid_registrationenddate) <= 2011 // THEN 1 // ELSE 0 // END as oldmmb // from Raids where raid_id = $RaidId"; // //$OldMmb = CSql::singleValue($sql, 'oldmmb'); // 20/03/2016 ДОбавил фильтрацию точек с нулеым или NULL мимнимальным и максимальным временем точки, так как для обычных // КП это время решили не вносить // 21/11/2013 Добавил RaidStage (финиш закрыт, но нельзя показывать результаты и сместил 6 на 7) // 30.10.2013 Для трёхдневного ММБ изменил INTERVAL 12 на INTERVAL 24 // RaidStage указывает на то, на какой временной стадии находится ммб // 0 - raid_registrationenddate IS NULL, марш-бросок не показывать // 1 - raid_registrationenddate еще не наступил // 2 - raid_registrationenddate наступил, но удалять участников еще можно // 3 - удалять участников уже нельзя, но первый этап не стартовал // 4 - первый этап стартовал, финиш еще не закрылся // 5 - финиш закрылся, но результаты нельзя показывать // 6 - результаты можно показывать, но raid_closedate не наступил или Is NULL // 7 - raid_closedate наступил $sql = "select\n\t\tCASE\n\t\t\tWHEN r.raid_registrationenddate IS NULL THEN 0\n\t\t\tWHEN r.raid_registrationenddate >= DATE(NOW()) THEN 1\n\t\t\tELSE 2\n\t\tEND as registration,\n\t\t(select count(*) from LevelPoints lp\n\t\t\tinner join Distances d on lp.distance_id = d.distance_id\n\t\t\twhere (d.raid_id = r.raid_id) and (NOW() >= DATE_SUB(lp.levelpoint_mindatetime, INTERVAL COALESCE(r.raid_readonlyhoursbeforestart, 8) HOUR))\n\t\t\t\tand COALESCE(lp.levelpoint_mindatetime, 0) > 0\t\t\t\n\t\t)\n\t\tas cantdelete,\n\t\t(select count(*) from LevelPoints lp\n\t\t\tinner join Distances d on lp.distance_id = d.distance_id\n\t\t\twhere (d.raid_id = r.raid_id) and (NOW() >= lp.levelpoint_mindatetime)\n\t\t\t\tand COALESCE(lp.levelpoint_mindatetime, 0) > 0\t\t\t\n\n\t\t)\n\t\tas started,\n\t\t(select count(*) from LevelPoints lp\n\t\t\tinner join Distances d on lp.distance_id = d.distance_id\n\t\t\twhere (d.raid_id = r.raid_id) and (NOW() < lp.levelpoint_maxdatetime)\n\t\t\t\tand COALESCE(lp.levelpoint_maxdatetime, 0) > 0\t\t\t\n\t\t)\n\t\tas notfinished,\n\t\tCASE\n\t\t\tWHEN (r.raid_closedate IS NULL) OR (r.raid_closedate >= DATE(NOW())) THEN 0\n\t\t\tELSE 1\n\t\tEND as closed,\n\t\tCOALESCE(r.raid_noshowresult, 0) as noshowresult\n\t\tfrom Raids r where r.raid_id={$RaidId}"; $Row = CSql::singleRow($sql); if ($Row['registration'] == 0) { $RaidStage = 0; } elseif ($Row['registration'] == 1) { $RaidStage = 1; } else { if ($Row['cantdelete'] == 0) { $RaidStage = 2; } elseif ($Row['started'] == 0) { $RaidStage = 3; } elseif ($Row['notfinished'] > 0) { $RaidStage = 4; } else { if ($Row['closed'] == 0) { if ($Row['noshowresult'] == 1) { $RaidStage = 5; } else { $RaidStage = 6; } } else { $RaidStage = 7; } } } // Если команда не определена, а регистрация закончена, то команда вне зачета if ($RaidStage >= 2 && empty($TeamId) && $TeamOutOfRange == 0) { $TeamOutOfRange = 1; } // Если команда не определена, и регистрация не закончена, то нужно проверить лимит if ($RaidStage < 2 && empty($TeamId) && $TeamOutOfRange == 0) { // Если достигнут лимит или есть команды в списке ожидания, то "вне зачета" if (IsOutOfRaidLimit($RaidId) == 1 or FindFirstTeamInWaitList($RaidId) > 0) { $TeamOutOfRange = 1; } } // Конец проверки на лимиты }
$pUserId = $_POST['UserId']; if ($UserId == $pUserId) { CMmb::setErrorMessage('Нельзя сделать слияние с самим собой'); return; } // Проверяем, что пользователя нет в слиянии $sql = " select userunionlog_id\n\t from UserUnionLogs \n\t\t where union_status <> 0\n\t\t and union_status <> 3\n\t\t and user_id = {$UserId}"; if (CSql::rowCount($sql) > 0) { CMmb::setResult('Пользователь уже есть в слиянии', 'ViewUserUnionPage', ''); $viewsubmode = "ReturnAfterError"; return; } // Проверяем, что пользователь не скрыт // здесь можно ещё проверить, что пользователь импортирован или любое другое условие $sql = " select user_id \n\t from Users \n\t\t where user_hide = 0 \n\t\t and user_id = {$pUserId}"; if (CSql::rowCount($sql) <= 0) { CMmb::setResult('Пользователь скрыт', 'ViewAdminUnionPage'); $viewsubmode = "ReturnAfterError"; return; } $UnionRequestId = 0; $Sql = "insert into UserUnionLogs (user_id, userunionlog_dt, \n\t\t user_parentid, union_status)\n\t\t\t values ({$UserId}, now(), {$pUserId}, 1)"; $UnionRequestId = MySqlQuery($Sql); if ($UnionRequestId) { $Row = CSql::fullUser($pUserId); $pUserName = $Row['user_name']; $pUserEmail = $Row['user_email']; $Import = $Row['user_importattempt']; // Проверяем, что пользовтельский email не является автогенерированным if (substr(trim($pUserEmail), -7) != '@mmb.ru' && !empty($pUserName)) { $pRequestUserName = CSql::userName($UserId);
$sql = "select COALESCE(t.team_num, 0) as team_num\n\t\t\tfrom Teams t\n\t\t\twhere t.team_hide = 0 and t.team_id = {$teamId}"; $teamNum = (int) CSql::singleValue($sql, 'team_num'); if ($teamNum) { print "<a style=\"font-size:80%; margin-right: 15px;\" href=\"#{$teamNum}\" title=\"Переход к строке Вашей команды\">Моя команда</a>\r\n"; } } $StartLink = CSql::raidFileLink($RaidId, 10, true); if (!empty($StartLink)) { print '<a style="font-size:80%; margin-right: 15px;" href="' . $StartLink . '" title="Информация о месте и порядке старта ММБ" target = "_blank">Старт</a>' . "\r\n"; } print '<a style="font-size:80%; margin-right: 15px;" href="?links&RaidId=' . $RaidId . '" title="Страница впечатлений: отчеты, фотографии, треки...">Впечатления</a>' . "\r\n"; print '<a style="font-size:80%; margin-right: 15px;" href="?files&RaidId=' . $RaidId . '" title="Все материалы ММБ: положение, карты, легенды...">Материалы</a>' . "\r\n"; print '<a style="font-size:80%; margin-right: 15px;" href="javascript: JsonExport();">Json</a> ' . "\r\n"; // можем / нужно ли показывать карты? $mapQuery = "select raidfile_name, raidfile_comment\n\t from RaidFiles\n\t where raid_id = {$RaidId} \n\t \tand filetype_id = 4 \n\t \tand substr(lower(raidfile_name), -4) in ('.png','.gif','.jpg','jpeg')\n\t \tand raidfile_hide = 0\n\t \t\t\torder by raidfile_id asc"; $canShowMaps = CRights::canShowImages($RaidId) && CSql::rowCount($mapQuery) > 0; $showMapImages = mmb_validateInt($_GET, 'showMap', '0'); if ($canShowMaps) { if ($showMapImages == 1) { print '<a style="font-size:80%; margin-right: 15px;" href="?protocol&RaidId=' . $RaidId . '&showMap=0" title="Не отображать карты в протоколе - можно смотреть на странцие материалов">Скрыть карты</a> ' . "\r\n"; } else { print '<a style="font-size:80%; margin-right: 15px;" href="?protocol&RaidId=' . $RaidId . '&showMap=1" title="Отображать карты на этой странице - время загрзуки может заметно вырасти!">Показать карты</a> ' . "\r\n"; } } print '</div>' . "\r\n"; // собственно вывод карт if ($canShowMaps and $showMapImages) { print '<div align="left" style="margin-top:10px; margin-bottom:10px; font-size: 100%;">' . "\r\n"; $Result = MySqlQuery($mapQuery); while ($Row = mysql_fetch_assoc($Result)) { $ImageLink = $Row['raidfile_name'];