print "</div>\n"; } mysql_free_result($Result); print "</td></tr>\n"; } // Закончили вывод списка участников // ============ Новый участник // Возможность добавлять участников заканчивается вместе с возможностью создавать команды // Обычный пользователь может добавлять новых участников при редактировании своей команды // Модератор/Администратор могут создавать новые команды с другим участником вместо себя //if (($AllowEdit == 1) && CanCreateTeam($Administrator, $Moderator, $OldMmb, $RaidStage, $TeamOutOfRange) && // (($viewmode <> "Add") || $Moderator || $Administrator)) // 21.03.2016 Определяем, когда можно добавлять нового пользователя // при добавлении команды можно только модераторам или администраторам // при правке - в зависимости от типа команды if ($viewmode != 'Add' and CRights::canEditTeam($UserId, $RaidId, $TeamId) or $viewmode == 'Add' and (CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::raidStage($RaidId) < 7) { print '<tr><td class="input" style="padding-top: 10px;">' . "\n"; // Предупредим команды в зачете о том, что они могут добавлять участников только до закрытия регистрации if ($TeamUser and !$TeamOutOfRange) { print 'Добавление новых участников в команду разрешено до ' . $RegistrationEnd . ".<br/>\n"; //print('После этой даты они могут участвовать в ММБ только в виде самостоятельной команды вне зачета.<br/>'."\n"); } print '<input type="text" name="NewTeamUserEmail" size="50" value="Email нового участника" tabindex="' . ++$TabIndex . '"' . CMmbUI::placeholder('Email нового участника') . 'title="Укажите e-mail пользователя, которого Вы хотите добавить в команду. Пользователь может запретить добавлять себя в команду в настройках своей учетной записи.">' . "\n"; print "</td></tr>\n"; } // 20/02/2014 Пользовательское соглашение if ($viewmode == "Add" && $AllowEdit == 1) { print '<tr><td class="input" style="padding-top: 10px; font-size: 80%;">' . "\n"; print '<b>Условия участия (выдержка из <a href="' . $RaidRulesLink . '">положения</a>):</b><br/>' . "\n"; // Ищем последнее пользовательское соглашение $ConfirmFile = trim($MyStoreHttpLink) . CSql::raidFileName(null, 8, true);
print "</div>\n"; } mysql_free_result($Result); print "</td></tr>\n"; } // Закончили вывод списка участников // ============ Новый участник // Возможность добавлять участников заканчивается вместе с возможностью создавать команды // Обычный пользователь может добавлять новых участников при редактировании своей команды // Модератор/Администратор могут создавать новые команды с другим участником вместо себя //if (($AllowEdit == 1) && CanCreateTeam($Administrator, $Moderator, $OldMmb, $RaidStage, $TeamOutOfRange) && // (($viewmode <> "Add") || $Moderator || $Administrator)) // 21.03.2016 Определяем, когда можно добавлять нового пользователя // при добавлении команды можно только можераторам или администраторам // при правке - в зависимости от типа команды if ($viewmode != 'Add' and ($TeamId == CSql::userTeamId($UserId, $RaidId) or CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and !CSql::teamOutOfRange($TeamId) and CSql::raidStage($RaidId) < 2 or $viewmode != 'Add' and ($TeamId == CSql::userTeamId($UserId, $RaidId) or CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::teamOutOfRange($TeamId) and CSql::raidStage($RaidId) < 7 or $viewmode == 'Add' and (CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::raidStage($RaidId) < 7) { print '<tr><td class="input" style="padding-top: 10px;">' . "\n"; // Предупредим команды в зачете о том, что они могут добавлять участников только до закрытия регистрации if ($TeamUser and !$TeamOutOfRange) { print 'Добавление новых участников в команду разрешено до ' . $RegistrationEnd . ".<br/>\n"; print 'После этой даты они могут участвовать в ММБ только в виде самостоятельной команды вне зачета.<br/>' . "\n"; } print '<input type="text" name="NewTeamUserEmail" size="50" value="Email нового участника" tabindex="' . ++$TabIndex . '"' . CMmbUI::placeholder('Email нового участника') . 'title="Укажите e-mail пользователя, которого Вы хотите добавить в команду. Пользователь может запретить добавлять себя в команду в настройках своей учетной записи.">' . "\n"; print "</td></tr>\n"; } // 20/02/2014 Пользовательское соглашение if ($viewmode == "Add" && $AllowEdit == 1) { print '<tr><td class="input" style="padding-top: 10px; font-size: 80%;">' . "\n"; print '<b>Условия участия (выдержка из <a href="' . $RaidRulesLink . '">положения</a>):</b><br/>' . "\n"; // Ищем последнее пользовательское соглашение $sql = "select rf.raidfile_id, rf.raidfile_name\n\t\tfrom RaidFiles rf\n\t\twhere rf.raidfile_hide = 0 and rf.filetype_id = 8\n\t\torder by rf.raid_id DESC, rf.raidfile_id DESC\n\t\tLIMIT 0,1";
function RecalcUsersRank($raidId) { // Смотрим статус переданного $raidStage = CSql::raidStage($raidId); // Если финиш не закрылся, то пересчитывать нужно по предыдудщему if ($raidStage < 5) { // Находим предыдущий закрытый $sql = " select MAX(r.raid_id) as maxraidid\n\t\t from Raids r \n\t \t where r.raid_closedate IS NOT NULL"; $maxRaidId = CSql::singleValue($sql, 'maxraidid'); } else { $maxRaidId = $raidId; } // Обнуляем рейтинг по всем пользовтелям $sql = " update Users u\tSET user_rank = NULL, user_r6 = NULL, \n \t\t\t\tuser_minraidid = NULL, user_maxraidid = NULL,\n \t\t\t\tuser_noinvitation = NULL, user_maxnotstartraidid = NULL\n \t\t"; $rs = MySqlQuery($sql); // Сбрасываем признак неявки команды по всем ММБ с весны 2012 $sql = " update Teams t \n\t\t\tinner join Distances d\n\t \ton t.distance_id = d.distance_id\n\t\t SET t.team_dismiss = NULL \n\t\t where d.raid_id >= 19\n\t\t and d.raid_id = {$maxRaidId}\n \t\t"; $rs = MySqlQuery($sql); // Устанавливаем признак неявки команды по всем ММБ с весны 2012 $sql = "\n\t\tupdate Teams t\n\t\t\tinner join Distances d\n\t \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t \tselect tlp.team_id, count(*) as points\n\t\t\t \tfrom TeamLevelPoints tlp\n\t\t\t\tgroup by tlp.team_id\n \t\t) teamdismiss\n \t\ton t.team_id = teamdismiss.team_id\n\t\tSET t.team_dismiss = 1\n\t\twhere d.distance_hide = 0 \n\t\t and t.team_hide = 0 \n\t\t and COALESCE(t.team_outofrange, 0) = 0\n\t\t and d.raid_id <= {$maxRaidId}\n\t\t and d.raid_id >= 19\n\t \t and COALESCE(teamdismiss.points, 0) = 0\n "; $rs = MySqlQuery($sql); // Добавил проверку на сход // проверка на ошибки идёт по полю, посчитанному в пересчете результатов $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, SUM(COALESCE(tu.teamuser_rank, 0.00)) as rank, \n\t\t\tSUM(COALESCE(tu.teamuser_rank, 0.00) * POW(0.9, {$maxRaidId} \n\t\t\t- d.raid_id \n\t\t\t- (select count(*) \n\t\t\t\tfrom RaidDevelopers rd \n\t\t\t\twhere rd.raiddeveloper_hide = 0\n\t\t\t\t\tand rd.raid_id > d.raid_id\n\t\t\t\t\tand rd.user_id = tu.user_id\n\t\t\t))) as r6,\n\t\t\tSUM(COALESCE(tu.teamuser_rank, 0.00) * POW(0.9, {$maxRaidId} \n\t\t\t- d.raid_id)) as r6old\n\t from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t \tselect tld.teamuser_id, MIN(lp.levelpoint_order) as minorder\n\t\t \tfrom TeamLevelDismiss tld\n\t\t\t \tinner join LevelPoints lp\n\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t group by tld.teamuser_id\n ) c\n\t\t\ton tu.teamuser_id = c.teamuser_id\n\t\twhere d.distance_hide = 0 \n\t\t and tu.teamuser_hide = 0\n\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 and COALESCE(t.team_minlevelpointorderwitherror, 0) = 0\n\t\t and COALESCE(c.minorder, 0) = 0\n\t\t and d.raid_id <= {$maxRaidId}\n\t\tgroup by tu.user_id\n \t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_rank = a.rank, u.user_r6 = a.r6, u.user_r6old = a.r6old\n "; $rs = MySqlQuery($sql); // теперь считаем минимальный и максимальный ключ ММБ по всем пользователям // добавил учет невыходов на старт // добавил учет невыходов на старт для команды $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, MIN(d.raid_id) as minraidid, \n\t\t\tMAX(d.raid_id) as maxraidid \n\t from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t\tselect tld.teamuser_id\n\t\t\t\tfrom TeamLevelDismiss tld\n\t\t\t\t\tinner join LevelPoints lp\n\t\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t\tgroup by tld.teamuser_id\n\t\t\t\thaving MIN(lp.levelpoint_order) = 1\n\t\t\t) dismiss\n\t\t\ton tu.teamuser_id = dismiss.teamuser_id\n\t\twhere d.distance_hide = 0 \n\t\t and dismiss.teamuser_id is null\n\t\t and COALESCE(t.team_dismiss, 0) = 0\n\t\t and tu.teamuser_hide = 0\n\t\t and t.team_hide = 0 \n\t\t and COALESCE(t.team_outofrange, 0) = 0\n\t\t and d.raid_id <= {$maxRaidId}\n\t\tgroup by tu.user_id\n\t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_minraidid = a.minraidid, u.user_maxraidid = a.maxraidid\n "; $rs = MySqlQuery($sql); // теперь считаем максимальный ключ ММБ по всем пользователям по невыходу на старт $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, \n\t\t\tMAX(d.raid_id) as maxnotstartraidid \n\t from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t\tselect tld.teamuser_id\n\t\t\t\tfrom TeamLevelDismiss tld\n\t\t\t\t\tinner join LevelPoints lp\n\t\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t\tgroup by tld.teamuser_id\n\t\t\t\thaving MIN(lp.levelpoint_order) = 1\n\t\t\t) dismiss\n\t\t\ton tu.teamuser_id = dismiss.teamuser_id\n\t\twhere d.distance_hide = 0 \n\t\t and tu.teamuser_hide = 0\n\t\t and t.team_hide = 0 \n\t\t and COALESCE(t.team_outofrange, 0) = 0\n\t\t and d.raid_id <= {$maxRaidId}\n\t \t and (dismiss.teamuser_id is not null or COALESCE(t.team_dismiss, 0) = 1)\n\t\tgroup by tu.user_id\n\t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_maxnotstartraidid = a.maxnotstartraidid\n "; $rs = MySqlQuery($sql); // теперь считаем флаг у тех кто не вышел (?!) или дисквалифицирован $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, dismiss.teamuser_id as dismissteamuser, \n\t\t\tCOALESCE(disq.disqualification, 0) as disqualification, \n\t\t\tCOALESCE(t.team_dismiss, 0) as dismissteam\n\t from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t \t\tselect tlp.team_id, count(*) as disqualification\n\t\t \t\tfrom TeamLevelPoints tlp\n\t\t\t\twhere COALESCE(tlp.error_id, 0) = 15 \n\t\t\t\tgroup by tlp.team_id\n ) disq\n on t.team_id = disq.team_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t\tselect tld.teamuser_id\n\t\t\t\tfrom TeamLevelDismiss tld\n\t\t\t\t\tinner join LevelPoints lp\n\t\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t\tgroup by tld.teamuser_id\n\t\t\t\thaving MIN(lp.levelpoint_order) = 1\n\t\t\t) dismiss\n\t\t\ton tu.teamuser_id = dismiss.teamuser_id\n \t\twhere d.distance_hide = 0 \n\t\t and tu.teamuser_hide = 0\n\t\t and t.team_hide = 0 \n\t\t and COALESCE(t.team_outofrange, 0) = 0\n\t\t and d.raid_id = {$maxRaidId}\n\t\tgroup by tu.user_id\n\t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_noinvitation = 1\n\t\tWHERE a.dismissteamuser is not null\n\t \t\tor COALESCE(a.disqualification, 0) > 1 \n\t \t\tor COALESCE(a.dismissteam, 0) = 1\n "; $rs = MySqlQuery($sql); // теперь ставим флаг у тех кто не участоввал в последних 8 ммб $sql = "\n\t\tupdate Users u\n\t\tSET u.user_noinvitation = 1\n\t\tWHERE {$maxRaidId} - 8 \n\t\t\t- (select count(*) \n\t\t\t\tfrom RaidDevelopers rd \n\t\t\t\twhere rd.raiddeveloper_hide = 0\n\t\t\t\t\tand rd.user_id = u.user_id\n\t\t\t ) >= COALESCE(u.user_maxraidid, 0)\n\t\t and u.user_maxraidid is not null\n "; $rs = MySqlQuery($sql); return 1; }
public static function canViewRaidResult($userId, $raidId) { $Super = CSql::userAdmin($userId) || CSql::userModerator($userId, $raidId); $raidStage = CSql::raidStage($raidId); // Администратору или модератору можно всегда или после снятия флага "не показывать результаты" return $Super or $raidStage > 5; }
/* echo '-1 '; echo $UserId; echo '-2 '; echo $RaidId; echo '0 '; echo !CSql::userTeamId($UserId, $RaidId); echo '1 '; echo CSql::userAdmin($UserId); echo '2 '; echo CSql::userModerator($UserId, $RaidId); echo '3 '; echo CSql::raidStage($RaidId); echo '4 '; */ if ($UserId and $RaidId and (!CSql::userTeamId($UserId, $RaidId) or CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::raidStage($RaidId) >= 1 and CSql::raidStage($RaidId) < 7) { print '<tr><td><a href="javascript:NewTeam();" title="Регистрация новой команды на выбранный выше ММБ">Новая команда</a></td></tr>' . "\r\n"; } // !! реализовать показ ссылки на свою команду, если она существует !! if (CSql::userTeamId($UserId, $RaidId)) { print '<tr><td><a href="' . $MyPHPScript . '?TeamId=' . CSql::userTeamId($UserId, $RaidId) . '" title="Просмотр карточки Вашей команды">Моя команда</a></td></tr>' . "\r\n"; } // Команды print '<tr><td><a href="?RaidId=' . $RaidId . '" title="Список зарегистрированных команд для выбранного выше ММБ">Команды</a></td></tr>' . "\r\n"; // Файлы print '<tr><td><a href="?files&RaidId=' . $RaidId . '" title="Ссылки на карты, легенды и т.п. для выбранного выше ММБ">Файлы</a></td></tr>' . "\r\n"; // Впечатления print '<tr><td><a href="?links&RaidId=' . $RaidId . '" title="Список впечатлений для выбранного выше ММБ">Впечатления</a></td></tr>' . "\r\n"; // Ввод/Правка марш-броска if ($Administrator) { print '<tr><td><a href="javascript:NewRaid();" title="Создание марш-броска">Новый марш-бросок</a></td></tr>' . "\r\n";
} 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");*/ $sql = " select MAX(r.raid_id) as maxraidid\n\t from Raids r \n\t "; $maxRaidId = CSql::singleValue($sql, 'maxraidid'); $raidStage = CSql::raidStage($maxRaidId); $ShowAllRaids = 0; if ($raidStage > 6) { $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 года сход участников не отражён в данных - можно сообщать о неточностях на общий адрес или в сообщество (ЖЖ) <br/>R6 считается с уценкой каждого предыдущего ММБ на 0.9: последний марш-бросок берётся с весом 1, следующий 0.9, затем 0.9*0.9 и так далее. Рейтинг пересчитывается при пересчете результатов очередного марш-броска.
if ($viewmode != "Add" && !CanEditTeam($Administrator, $Moderator, $TeamUser, $OldMmb, $RaidStage, $TeamOutOfRange)) { CMmb::setMessage('Изменения в команде запрещены'); return; } // Определяем ключ предыдущего марш-броска, в который данный пользователь заявлялся, но не участвовал $NotStartPreviousRaidId = 0; if ($NewUserId > 0) { $NotStartPreviousRaidId = CheckNotStart($NewUserId, $RaidId); } $OutOfRaidLimit = IsOutOfRaidLimit($RaidId); $WaitTeamId = FindFirstTeamInWaitList($RaidId); // Добавляем/изменяем команду в базе $TeamActionTextForEmail = ""; if ($action == "AddTeam") { // Дополнительная проверка на флаг. Если регистрация закончена, то if (CSql::raidStage($RaidId) >= 2 or $OutOfRaidLimit > 0 or $WaitTeamId > 0) { $TeamOutOfRange = 1; } else { $TeamOutOfRange = 0; } $sql = "insert into Teams (team_num, team_name, team_usegps, team_mapscount, distance_id,\n\t\t\tteam_registerdt, team_greenpeace, team_outofrange, team_waitdt)\n\t\t\tvalues ("; // Номер команды if ($OldMmb) { $sql = $sql . $pTeamNum; } else { $sql = $sql . "(select COALESCE(MAX(t.team_num), 0) + 1\n\t\t\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.raid_id = {$RaidId})"; } // Все остальное $sql .= ", '{$pTeamName}', {$pTeamUseGPS}, {$pTeamMapsCount}, {$pDistanceId}, NOW(),\n\t\t\t{$pTeamGreenPeace}, {$TeamOutOfRange}"; // Если превышен лимит команл или есть команда в списке ожидания, то не регистрируем в зачет if ($OutOfRaidLimit > 0 or $WaitTeamId > 0) {
return; } // конец первичной проверки входных данных $UserId = CMmbAuth::getUserId($Login, $Password); CMmbLogger::i('Login', "'{$Login}';" . $_SERVER['REMOTE_ADDR'] . ";{$UserId}"); if ($UserId <= 0) { //.$login." не найден!"; // CSql::closeConnection(); CMmb::setErrorMessage('Неверный email или пароль.'); return; } //Конец проверки пользователя и пароля $SessionId = StartSession($UserId); // echo cSql::raidStage($RaidId); // Если есть откртытй марш-бросок, то открываем список команд, а не список всех ММБ if (isset($RaidId) and CSql::raidStage($RaidId) < 7 and CSql::raidStage($RaidId) > 0) { CMmb::setViews('ViewRaidTeams', ''); } else { CMmb::setViews('MainPage', ''); } //$statustext = "ua Пользователь: ".$UserId.", сессия: ".$SessionId; } elseif ($action == "UserInfo") { // Действие вызывается ссылкой под имененм пользователя CMmb::setViews('ViewUserData', ''); } elseif ($action == "ViewNewUserForm") { // Действие вызывается ссылкой Новый пользователь CMmb::setViews('ViewUserData', 'Add'); } elseif ($action == "UserChangeData" or $action == "AddUser") { // Действие вызывается либо при регистрации нового пользователя лиюо при сменен данных старого $view = "ViewUserData"; $pUserEmail = trim(mmb_validate($_POST, 'UserEmail'));