function mmb_isOn($var, $key) { return mmb_validate($var, $key, '') == 'on' ? 1 : 0; }
$SessionId = StartSession($UserId); } $changepasswordsessionid = ""; $action = ""; } elseif ($action == "UserLogout") { // Выход CloseSession($SessionId, 3); $SessionId = ""; $action = ""; $view = "MainPage"; } elseif ($action == "CancelChangeUserData") { // Действие вызывается ссылкой Отмена CMmb::setViews('ViewUserData', ''); } elseif ($action == "FindUser") { // Действие вызывается поиском участника $FindString = mmb_validate($_POST, 'FindString', ''); if (trim($FindString) == '' or trim($FindString) == 'Часть ФИО') { CMmb::setShortResult('Не указан критерий поиска.', ''); return; } if (trim($FindString) == 'все-все' or trim($FindString) == 'все-все-все') { $sqlFindString = ''; } else { $sqlFindString = trim($FindString); } $sql = "select count(*) as FindUsersCount\n\t\t from Users u\n\t\t\twhere ltrim(COALESCE(u.user_password, '')) <> '' \n and u.user_hide = 0 \n\t\t\t and COALESCE(u.user_noshow, 0) = 0\n and user_name like '%{$sqlFindString}%'"; //echo 'sql '.$sql; if (CSql::singleValue($sql, 'FindUsersCount') > 0) { $view = "ViewUsers"; } else { CMmb::setShortResult('Не найдено пользователей, чьи ФИО содержат ' . trim($FindString), '');
} print "Типы сообщений: <select name=\"levels[]\" size=\"6\" multiple style=\"margin-left: 10px; margin-right: 5px; vertical-align: top;\"\n onchange=\"document.LogsForm.submit();\">"; foreach ($allLevels as $lev) { $sel = in_array($lev, $levels) ? ' selected="selected"' : ''; print "<option value=\"{$lev}\"{$sel}>{$lev}</option>\n"; } print "</select>\n\n"; // фильтруем кол-во ошибок и печатаем селект $limit = mmb_validateInt($_REQUEST, 'num_rec', 100); print 'Количество: <select name="num_rec" style="margin-left: 10px; margin-right: 5px;" onchange="document.LogsForm.submit();">'; foreach (array(100, 500, 1000, 5000) as $lim) { $sel = $lim == $limit ? ' selected="selected"' : ''; print "<option value=\"{$lim}\"{$sel}>{$lim}</option>\n"; } print "</select>\n"; $searchVal = ReverseEscapeString(mmb_validate($_REQUEST, 'search', '')); print "<input type=\"text\" placeholder=\"Искать\" name=\"search\" onchange=\"document.LogsForm.submit()\" style=\"margin-left: 2em;\" value='" . CMmbUI::toHtml($searchVal) . "'/>"; print "</div>\n"; $cond = count($levels) == 0 ? 'true' : "logs_level in ('" . implode("', '", $levels) . "')"; if ($searchVal == '') { $searchCond = 'true'; } else { $search = array("%", "_", "[", "]"); $replace = array("\\%", "\\_", "\\[", "\\]"); $searchVal = str_replace($search, $replace, $searchVal); $searchCond = "logs_message like(" . CSql::quote("%{$searchVal}%") . ")"; } $sql = "select logs_id, logs_level, user_id, logs_operation, logs_message, logs_dt, logs_duration from Logs \n where {$cond} and {$searchCond} \n order by logs_id desc \n limit {$limit}"; $Result = MySqlQuery($sql); print "<table class='std'>\n"; print "<tr class='gray head'><th>#</th><th width='50'>id</th><th>Время</th><th>Уровень</th><th>Пользователь</th><th>Операция</th><th>Сообщение</th><th>Длительность</th></tr>\n";
} mysql_free_result($result); } function GetTeamPlace($teamId) { return isset($this->teamPlaces[$teamId]) ? $this->teamPlaces[$teamId] : 0; } function GetUserDistance($userId, $distanceId) { return isset($this->userDistance[$userId]) && isset($this->userDistance[$userId][$distanceId]) ? $this->userDistance[$userId][$distanceId] : null; } } $TabIndex = 0; /*print('<form name="RankUsersForm" action="'.$MyPHPScript.'" method="post">'."\r\n"); print('<input type="hidden" name="action" value="">'."\r\n");*/ $ShowAllRaids = mmb_validate($_GET, 'rating', '') == 'all'; $js = "window.location.search = '?rating' + (this.checked ? '=all' : ''); "; print 'Отображать все марш-броски (долгая загрузка) <input type="checkbox" autocomplete="off" name="ShowAllRaids" ' . ($ShowAllRaids ? 'checked="checked"' : '') . ' tabindex="' . ++$TabIndex . '" title="Отображать все марш-броски" onchange="' . $js . '" />' . "\r\n"; //print('</form>'."\r\n"); print '<br/><br/>' . "\r\n"; print '<div style="margin-top: 15px; max-width: 1500px;" align="left">Рейтинг по версии slazav: по всем ММБ суммируется отношение времени лидера к времени участника. <br/>Для марш-бросков с несколькими дистанциями это отношение дополнительно умножается на отношение длины текущей дистанции к максимальной из длин дистанций. Рейтинг участника марш-броска не рассчитывается в следующих случаях: 1) команда вне зачёта; 2) команда не финишировала; 3) участник сошёл с дистанции. Для марш-бросков до 2012 года сход участников не отражён в данных - можно сообщать о неточностях на общий адрес или в сообщество (ЖЖ) </div>' . "\r\n"; print '<br/>' . "\r\n"; // Возможно здесь нужно вызвать пересчёт рейтинга по всем ММБ и это не долго // RecalcTeamUsersRank(0); $sql = "select tu.user_id, CASE WHEN COALESCE(u.user_noshow, 0) = 1 THEN '{$Anonimus}' ELSE u.user_name END as user_name, SUM(tu.teamuser_rank) as userrank,\n\t COUNT(tu.teamuser_id) as userrankcount,\n\t\t\t 0 as distance_id, ' ' as distance_name, 'Итог' as raid_name,\n\t\t\t ' ' as team_num, ' ' as team_name\n\t from TeamUsers tu\n\t\t inner join Users u\n\t\t\t on u.user_id = tu.user_id\n\t\t inner join Teams t\n\t\t\t on t.team_id = tu.team_id\n\t\t inner join Distances d\n\t\t\t on t.distance_id = d.distance_id\n\t\t where d.distance_hide = 0\n\t\t\t and t.team_hide = 0\n\t\t and COALESCE(t.team_outofrange, 0) = 0\n\t\t and COALESCE(t.team_result, 0) > 0\n\t\t\t and COALESCE(tu.teamuser_rank, 0) > 0\n\t\t group by tu.user_id\n\t\t order by userrank DESC\n\t\t "; /*
// Точка уже есть и пользователь сошёл - обновляем точку $sql = "update TeamLevelDismiss set levelpoint_id = {$LevelPointId} where teamleveldismiss_id = {$DismissId}"; $rs = MySqlQuery($sql); } else { // Точки нет, а пользователь сошёл - создаём точку $sql = "insert into TeamLevelDismiss (teamuser_id, levelpoint_id, device_id) \n\t\t\t values ({$HideTeamUserId}, {$LevelPointId}, 1) "; $rs = MySqlQuery($sql); } } else { if ($DismissId) { // Точка есть, а пользователь не сошёл - удаляем точку $sql = "delete from TeamLevelDismiss where teamleveldismiss_id = {$DismissId}"; $rs = MySqlQuery($sql); } else { // ТОчка нет и пользователь не сошёл - ничего не делаем $view = mmb_validate($_POST, 'view', 'ViewTeamData'); return; } } // Конец разбора возможных ситуаций со сходами и наличием точки в TeamLevelDismiss /* $sql = "update TeamUsers set levelpoint_id = ".($LevelPointId > 0 ? $LevelPointId : 'null' )." where teamuser_id = ".$HideTeamUserId; $rs = MySqlQuery($sql); $view = "ViewTeamData"; */ // Письмо об изменениях всем, кроме автора изменений // !!! Сход относится к результатам на дистанции и об их изменений письма слать не надо $ChangeDataUserName = CSql::userName($UserId); $sql = "select u.user_email, u.user_name, t.team_num, d.distance_name, r.raid_name\n\t\tfrom Users u\n\t\t\tinner join TeamUsers tu on tu.user_id = u.user_id\n\t\t\tinner join Teams t on tu.team_id = t.team_id\n\t\t\tinner join Distances d on t.distance_id = d.distance_id\n\t\t\tinner join Raids r on d.raid_id = r.raid_id\n\t\twhere tu.teamuser_hide = 0 and tu.team_id = {$TeamId} and u.user_id <> {$UserId}\n\t\torder by tu.teamuser_id asc"; $Result = MySqlQuery($sql); while ($Row = mysql_fetch_assoc($Result)) {
print "</td></tr>\n"; // Информация о дистанции(ях) $sql = "SELECT d.distance_name, d.distance_data, d.distance_id FROM Distances d WHERE d.distance_hide = 0 AND d.raid_id = {$RaidId}"; $Result = MySqlQuery($sql); while ($Row = mysql_fetch_assoc($Result)) { ShowDistanceHeader($RaidId, $Row['distance_id'], $Row['distance_name'], $Row['distance_data'], $lottery_count, $colspan); } mysql_free_result($Result); // ============ Вывод списка команд =========================== // Выводим список команд if ($OrderType == 'Num') { // Сортировка по номеру (в обратном порядке) $sql = "select t.team_num, t.team_id, t.team_usegps, t.team_name, t.team_greenpeace,\n \t\t\t t.team_mapscount, d.distance_name, d.distance_id,\n\t\t\t \t\t\tCOALESCE(t.team_outofrange, 0) as team_outofrange,\n\t\t\t\t\t\tCOALESCE(t.team_dismiss, 0) as team_dismiss\n\t \tfrom Teams t\n\t\t \t\t\tinner join Distances d on t.distance_id = d.distance_id\n\t\t\t\twhere d.distance_hide = 0 and t.team_hide = 0 and d.raid_id = {$RaidId}\n\t\t\t\t\t\tand {$DistanceCondition} and {$GpsCondition}\n\t\t\t\torder by team_num desc"; } elseif ($OrderType == 'Place') { // Сортировка по месту требует более хитрого запроса $levelPointId = mmb_validate($_REQUEST, 'LevelPointId', ''); if (!empty($levelPointId)) { $LevelCondition = "tlp.levelpoint_id = {$levelPointId}"; $sql = "select t.team_num, t.team_id, t.team_usegps, t.team_name, t.team_greenpeace,\n\t\t\t t.team_mapscount, lp.levelpoint_order as team_progress,\n\t\t\t CASE WHEN COALESCE(t.team_minlevelpointorderwitherror, 0) > lp.levelpoint_order THEN 0 ELSE COALESCE(t.team_minlevelpointorderwitherror, 0) END as team_error,\n\t\t\t\t\t d.distance_name, d.distance_id,\n\t TIME_FORMAT(tlp.teamlevelpoint_result, '%H:%i') as team_sresult,\n\t\t\t\t\t COALESCE(t.team_outofrange, 0) as team_outofrange,\n\t\t\t\t\t COALESCE(t.team_dismiss, 0) as team_dismiss,\n\t\t\t\t\t COALESCE(t.team_donelevelpoint, COALESCE(lp.levelpoint_name, '')) as levelpoint_name,\n\t\t\t\t\t COALESCE(t.team_comment, '') as team_comment /*,\n\t\t\t\t\t COALESCE(t.team_skippedlevelpoint, '') as team_skippedlevelpoint */\n\t\t\t\t\tfrom Teams t\n\t\t\t\t\t\t\tinner join Distances d\ton t.distance_id = d.distance_id\n\t\t\t\t\t\t\tinner join TeamLevelPoints tlp\ton t.team_id = tlp.team_id\n \t\t\t\t\t\tinner join LevelPoints lp on tlp.levelpoint_id = lp.levelpoint_id\n\t\t\t\t \twhere t.team_hide = 0 and {$LevelCondition} and {$GpsCondition}\n\t\t\t\t order by distance_name, team_outofrange, team_progress desc, team_error asc, tlp.teamlevelpoint_result asc, team_num asc "; } else { $sql = "select t.team_num, t.team_id, t.team_usegps, t.team_name, t.team_greenpeace,\n\t\t\t t.team_mapscount, t.team_maxlevelpointorderdone as team_progress,\n\t\t\t COALESCE(t.team_minlevelpointorderwitherror, 0) as team_error,\n\t\t\t\t\t d.distance_name, d.distance_id,\n\t\t\t TIME_FORMAT(t.team_result, '%H:%i') as team_sresult,\n\t\t\t\t\t COALESCE(t.team_outofrange, 0) as team_outofrange,\n\t\t\t\t\t COALESCE(t.team_dismiss, 0) as team_dismiss,\n\t\t\t\t\t COALESCE(t.team_donelevelpoint, COALESCE(lp.levelpoint_name, '')) as levelpoint_name,\n\t\t\t\t \t COALESCE(t.team_comment, '') as team_comment /*,\n\t\t\t\t\t\t COALESCE(t.team_skippedlevelpoint, '') as team_skippedlevelpoint */\n\t\t\t\t\t from Teams t\n\t\t\t\t\t\t\tinner join Distances d\ton t.distance_id = d.distance_id\n\t\t\t\t\t\t\tleft outer join LevelPoints lp\n\t\t\t\t\t\t\ton lp.distance_id = t.distance_id\n\t\t\t\t\t \t\t\tand lp.levelpoint_order = t.team_maxlevelpointorderdone\n\t\t\t\t \t where d.distance_hide = 0 and t.team_hide = 0 and d.raid_id = {$RaidId}\n\t\t\t\t \t\t\tand {$DistanceCondition} and {$GpsCondition}\n\t\t\t order by distance_name, team_outofrange, team_progress desc, team_error asc, team_result asc, team_num asc "; } $skpd = microtime(true); $skippedPoints = GetAllSkippedPoints($RaidId, $levelPointId); $skpd = microtime(true) - $skpd; $skpd0 = $skippedPoints['__time__']; //$skpd0 = 0; // Конец проверки, задана ли точка фильтрации } elseif ($OrderType == 'Errors') { // Не знаю, как будет реализовано $sql = "select t.team_num, t.team_id, t.team_usegps, t.team_name, t.team_greenpeace,\n\t\t\t t.team_mapscount, COALESCE(t.team_maxlevelpointorderdone, 0) as team_progress,\n\t\t\t COALESCE(t.team_minlevelpointorderwitherror, 0) as team_error,\n\t\t\t\t\t d.distance_name, d.distance_id,\n TIME_FORMAT(t.team_result, '%H:%i') as team_sresult,\n\t\t\t\t\t\t\tCOALESCE(t.team_outofrange, 0) as team_outofrange,\n\t\t\t\t\t\t\tCOALESCE(t.team_dismiss, 0) as team_dismiss,\n\t\t\t \t\t\tCOALESCE(lp.levelpoint_name, '') as levelpoint_name,\n\t\t\t \t\t\tCONCAT_WS(' Комментарий: ', COALESCE(errt.errcomment, ''), COALESCE(t.team_comment, '')) as team_comment\n\t\t\t \t\tfrom Teams t\n\t\t\t\t\t\t\tinner join\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tselect tlp.team_id,\n\t\t\t\t\t\t\t\tGROUP_CONCAT(CONCAT_WS(' - ', lp.levelpoint_name, err.error_name) ORDER BY lp.levelpoint_order, ' ') as errcomment\n\t\t\t\t \t\t\t\tfrom TeamLevelPoints tlp\n\t\t\t\t \t\t\t\t inner join LevelPoints lp\n\t\t\t\t \t\t\t\t on tlp.levelpoint_id = lp.levelpoint_id\n\t\t\t\t \t\t\t\t inner join Errors err\n\t\t\t\t \t\t\t\t on tlp.error_id = err.error_id\n\t\t\t\t\t\t\t\twhere COALESCE(tlp.error_id, 0) <> 0\n\t\t\t\t \t\t\t\tgroup by tlp.team_id\n\t\t\t\t\t\t\t\t) errt\n\t\t\t\t\t\t\ton t.team_id = errt.team_id\n\t\t\t\t\t\t\tinner join Distances d\n\t\t\t\t\t\t\ton t.distance_id = d.distance_id\n\t\t\t\t\t\t\tleft outer join LevelPoints lp\n\t\t\t\t\t\t\ton lp.distance_id = t.distance_id\n\t\t\t\t \t\t\t\tand lp.levelpoint_order = t.team_maxlevelpointorderdone\n\t\t\t \t\twhere d.distance_hide = 0 and t.team_hide = 0 and d.raid_id = {$RaidId}\n\t\t\t \t\t\t\tand {$DistanceCondition}\n\t\t\t order by distance_name, team_outofrange, team_progress desc, team_error asc, team_result asc, team_num asc ";
error_reporting(E_ALL); } else { ini_set('display_errors', 1); error_reporting(E_ERROR); } // Пробегаем помассивам POST GET REQUEST COOKIE и чистим возможные sql инъекции и мусор ClearArrays(); // Устанавливаем часовой пояс по умолчанию date_default_timezone_set("Europe/Moscow"); // Флаг ошибки (1 - цвет текста statustext становится красным и всплывает окно с сообщением) // и текст, который выводится в статусную строку (под логотип) $alert = 0; $statustext = ""; //"Сегодня: ".date("d.m.Y")." Время: ".date("H:i:s"); // Инициализируем права доступа пользователя $SessionId = mmb_validate($_COOKIE, CMmb::CookieName, ''); $OldSessionId = $SessionId; $RaidId = (int) mmb_validateInt($_REQUEST, 'RaidId', 0); $TeamId = (int) mmb_validateInt($_REQUEST, 'TeamId', 0); $DistanceId = (int) mmb_validateInt($_REQUEST, 'DistanceId', 0); // 21/03/2016 получаем $UserId из сессии. // эта инициализация сейчас перекрываетвя в GetPrivileges, но есдли в будующем захочется отказаться от GetPrivileges // то полезно пользователя определять здесь и остальные необходимые операции тоже здесь делать $UserId = (int) CSql::userId($SessionId); // обновляем данные сессии (удаляем закрытые, пишем в cookies UpdateSession($SessionId); // 27/12/2013 Заменил на сортировку по ключу // Находим последний ММБ, если ММБ не указан, чтобы определить привелегии if (empty($RaidId)) { //GetPrivileges($SessionId, $RaidId, $TeamId, $UserId, $Administrator, $TeamUser, $Moderator, $OldMmb, $RaidStage, $TeamOutOfRange); $orderBy = CSql::userAdmin($UserId) ? 'raid_id' : 'raid_registrationenddate';
} // Получаем информацию об этапах, которые могла проходить команда $sql = "select l.level_id, l.level_name, l.level_pointnames, l.level_starttype, l.level_pointpenalties,\n\t\tl.level_begtime, l.level_maxbegtime, l.level_minendtime, l.level_endtime,\n\t\ttl.teamlevel_begtime, tl.teamlevel_endtime,\n\t\ttl.teamlevel_points, tl.teamlevel_progress, tl.teamlevel_penalty,\n\t\ttl.teamlevel_id\n\t\tfrom Teams t\n\t\t\tinner join Distances d on t.distance_id = d.distance_id\n\t\t\tinner join Levels l on d.distance_id = l.distance_id\n\t\t\tleft outer join TeamLevels tl on l.level_id = tl.level_id and t.team_id = tl.team_id and tl.teamlevel_hide = 0\n\t\twhere l.level_hide = 0 and t.team_id = {$TeamId}"; $rs = MySqlQuery($sql); // ================ Цикл обработки данных по этапам $statustext = ""; while ($Row = mysql_fetch_assoc($rs)) { // По этому ключу потом определяем, есть ли уже строчка в TeamLevels или её нужно создать $TeamLevelId = $Row['teamlevel_id']; $levelPfx = 'Level' . $Row['level_id']; // Обрабатываем сход с этапа $TeamLevelProgress = mmb_validateInt($_POST, $levelPfx . '_progress', 0); // Вычисляем время выхода на этап $BegYear = mmb_validate($_POST, $levelPfx . '_begyear', ''); $BegDate = mmb_validate($_POST, $levelPfx . '_begdate', ''); $BegTime = mmb_validate($_POST, $levelPfx . '_begtime', ''); $BegYDTs = CSql::timeString($BegYear, $BegDate, $BegTime); // Конвертируем в даты php для сравнения $BegYDT = strtotime(substr(trim($BegYDTs), 1, -1)); $BegMinYDT = strtotime(substr(trim($Row['level_begtime']), 1, -1)); $BegMaxYDT = strtotime(substr(trim($Row['level_maxbegtime']), 1, -1)); // Обнуляем время старта, если он не в порядке готовности if ($Row['level_starttype'] != 1) { $BegYDTs = "NULL"; } else { if ($BegYDT < $BegMinYDT or $BegYDT > $BegMaxYDT) { if ($TeamLevelProgress > 0) { $statustext = $statustext . "</br> старта '{$Row['level_name']}'"; } // Теперь не выходим, а ставим время NULL - вдруг пользователь сохранить хотел КП $BegYDTs = "NULL";
// Меняем статус в журнале $sql = " update UserUnionLogs set union_status = 3 \n where userunionlog_id = {$UserUnionLogId}"; MySqlQuery($sql); CMmb::setViews('ViewUserUnionPage', ''); } elseif ($action == 'AddLink') { $pUserId = mmb_validateInt($_POST, 'UserId'); if ($pUserId <= 0) { CMmb::setErrorMessage('Пользователь не найден'); return; } if ($SessionId <= 0) { CMmb::setErrorMessage('Сессия не найдена'); return; } $pLinkName = trim(mmb_validate($_POST, 'NewLinkName')); $pLinkUrl = trim(mmb_validate($_POST, 'NewLinkUrl')); $pLinkTypeId = mmb_validateInt($_POST, 'LinkTypeId'); $pLinkRaidId = mmb_validateInt($_POST, 'LinkRaidId'); if ($pLinkRaidId <= 0) { CMmb::setErrorMessage('ММБ не найден'); return; } if (empty($pLinkUrl) or $pLinkUrl == 'Адрес ссылки на впечатление') { $alert = 1; CMmb::setResult('Не указан адрес ссылки', 'ViewUserData'); return; } if (empty($pLinkTypeId)) { $alert = 1; CMmb::setResult('Не указан тип ссылки', 'ViewUserData'); return;