/** * Регистрирует решение задачи * * @return bool - признак, был ли ответ привязан к авторизованному пользователю */ public function registerSolution($taskIdent, $matchesStr) { $task = $this->taskByIdent($taskIdent); $matchesStr = normalize_string($matchesStr, true); $mCnt = $task['m']; $sCnt = $task['s']; $cols = $task['c']; $rows = $task['r']; $excluded = $this->strToArray($matchesStr, $mCnt, $cols, $rows); ksort($excluded); //Вычисляем оставшиеся спички (пробегаем по всем точкам и берём правую и верхнюю спичку) $matches = array(); for ($x = 0; $x <= $cols; $x++) { for ($y = 0; $y <= $rows; $y++) { $matchId = $this->matchId($x, $y, $x + 1, $y); if (!array_key_exists($matchId, $excluded) && $x + 1 <= $cols) { $matches[$matchId] = true; } $matchId = $this->matchId($x, $y, $x, $y + 1); if (!array_key_exists($matchId, $excluded) && $y + 1 <= $rows) { $matches[$matchId] = true; } } } $sqCnt = 0; //Скопируем массив $badMatches = $matches; //Вычисляем координаты всех квадратов for ($x = 0; $x < $cols; $x++) { for ($y = 0; $y < $rows; $y++) { //Проверяем точку $endX = $x; $endY = $y; while (++$endX <= $cols && ++$endY <= $rows) { $bounds = $this->isFullSquare($x, $y, $endX, $endY, $matches); if ($bounds) { ++$sqCnt; foreach ($bounds as $key => $val) { unset($badMatches[$key]); } } } } } $badMatches = empty($badMatches) ? false : concat(array_keys($badMatches)); check_condition(!$badMatches, "Bad matches left: [{$badMatches}]"); check_condition($sqCnt == $sCnt, "Invalid squares cnt: [{$sqCnt}], required: [{$sCnt}]."); //Сохраняем в базу $userId = AuthManager::getUserIdOrNull(); //Склеим строку из отсартированных спичек $matchesStr = $this->arrToStr($excluded); //Регистрируем ответ пользователя $ansBindedToUser = MatchesBean::inst()->registerAnswer($taskIdent, $matchesStr, $userId); //Если зарегистрировали, попробуем дать очки if ($ansBindedToUser && $userId) { PL_matches::inst()->givePoints(PsUser::inst()); } //Возвратим признак выданных очков return $ansBindedToUser; }
/** * Даёт очки пользователю */ public final function givePoints2Users($userId = null, $cnt = 15) { $users = TESTBean::inst()->getUserIds($userId); foreach ($users as $uid) { UP_fromadmin::inst()->givePoints(PsUser::inst($uid), $cnt, getRandomString()); } }
protected function executeImpl(ArrayAdapter $params) { $unique = $params->str(DiscussionController::JS_DATA_UNIQUE); $upDown = $params->bool(DiscussionController::JS_DATA_UPDOWN); $entity = $params->str(DiscussionController::JS_DATA_THREAD); $theme = $params->str(self::JS_PARAM_THEME); $comment = $params->str(self::JS_PARAM_COMMENT); $parentId = $params->int(self::JS_PARAM_PARENT_ID); $controller = Handlers::getInstance()->getDiscussionController($unique); //Валидируем тему if (!$parentId && $controller->getDiscussionSettings()->isThemed()) { if (!$theme) { return 'Введите тему'; } $error = UserInputValidator::validateShortText($theme); if ($error) { return $error; } $theme = UserInputTools::safeShortText($theme); } //Валидируем комментарий if (!$comment) { return 'Введите комментарий'; } $error = UserInputValidator::validateLongText($comment); if ($error) { return $error; } $comment = UserInputTools::safeLongText($comment); $msgObj = $controller->saveMessage($entity, $parentId, $comment, $theme, PsUser::inst()); if (!$msgObj instanceof DiscussionMsg) { return 'Ошибка добавления сообщения'; } return new AjaxSuccess($controller->buildLeaf($msgObj)); }
public function registerSolution($hodes) { if (is_string($hodes)) { $hodes = $this->strToArray($hodes); } if (!is_array($hodes) || count($hodes) != 64) { return false; } $hodesDone = array(); $hodesAllowed = null; $hodesString = ''; foreach ($hodes as $hod) { $x = $hod[0]; $y = $hod[1]; $hodesString .= "{$x}{$y}"; $hodId = $this->hodId($x, $y); if ($x > 0 && $x < 9 && $y > 0 && $y < 9 && !array_key_exists($hodId, $hodesDone) && (!$hodesAllowed || array_key_exists($hodId, $hodesAllowed))) { $hodesDone[$hodId] = true; $hodesAllowed = $this->getNextAllowedHodes($x, $y); continue; } return false; } //Пользователь может быть и не авторизован $userId = AuthManager::getUserIdOrNull(); $answerBinded = ChessKnightBean::inst()->registerAnswer($hodesString, $userId); if ($userId && $answerBinded) { //Дадим очки PL_chessknight::inst()->givePoints(PsUser::inst()); } return true; }
protected function processRequest(ArrayAdapter $params) { $UPM = UserPointsManager::inst(); //При открытии страницы отмечаем, что пользователь знает обо всех очках $UPM->markUserPointsShown(PsUser::inst()); //Получим все очки, выданные пользователю return new IdentPageFilling(array('points' => $UPM->getAllUserPoints(PsUser::inst()))); }
/** @return DateTimeZone */ public function getCurrentDateTimeZone() { if (!isset($this->curTZ)) { $tzName = AuthManager::isAuthorized() ? PsUser::inst()->getTimezone() : null; $this->curTZ = $tzName ? $this->getDateTimeZone($tzName) : $this->getDateTimeZone(); } return $this->curTZ; }
public function getClients() { $result = array(); foreach ($this->getIds('select id_user as id from users where b_admin=0 order by id_user asc') as $userId) { $result[] = PsUser::inst($userId); } return $result; }
protected function executeImpl(ArrayAdapter $params) { $testingId = $params->int('id'); $tasks = $params->arr('tasks'); $time = $params->int('time'); TestingManager::getInstance()->updateTestingResults($testingId, $time, $tasks); $pointsGiven = PL_testing::inst()->givePoints(PsUser::inst(), $testingId); return new AjaxSuccess($pointsGiven); }
protected function processImpl(PostArrayAdapter $adapter, $button) { $FEEDBACK = FeedbackManager::inst(); /* * Тема */ $theme = $adapter->str(FORM_PARAM_THEME); $error = UserInputValidator::validateShortText($theme); if ($error) { return array(FORM_PARAM_THEME => $error); } $theme = UserInputTools::safeShortText($theme); /* * Комментарий */ $text = $adapter->str(FORM_PARAM_COMMENT); $error = UserInputValidator::validateLongText($text); if ($error) { return array(FORM_PARAM_COMMENT => $error); } $text = UserInputTools::safeLongText($text); /* * АВТОРИЗОВАН - пользуемся стандартным механизмом добавления сообщения в тред. * Кодом треда, при этом, является сам пользователь. */ if (AuthManager::isAuthorized()) { $msg = $FEEDBACK->saveMessage(PsUser::inst()->getId(), null, $text, $theme, PsUser::inst()); return new AjaxSuccess($FEEDBACK->buildLeaf($msg)); } /* * НЕ АВТОРИЗОВАН - сохраняем сообщение в таблицу анонимных пользователей. */ if (!AuthManager::isAuthorized()) { /* * Имя пользователя */ $name = $adapter->str(FORM_PARAM_NAME); $error = UserInputValidator::validateShortText($name); if ($error) { return array(FORM_PARAM_NAME => $error); } $name = UserInputTools::safeShortText($name); /* * Контакты */ $contacts = $adapter->str(FORM_PARAM_REG_CONTACTS); if ($contacts) { $error = UserInputValidator::validateShortText($contacts, false); if ($error) { return array(FORM_PARAM_REG_CONTACTS => $error); } $contacts = UserInputTools::safeShortText($contacts); } $FEEDBACK->saveAnonimousFeedback($name, $contacts, $theme, $text); return new AjaxSuccess(); } }
public static function validateOldPass($oldPass) { if (isEmpty($oldPass)) { return 'required'; } if (!PsUser::inst()->checkPassword($oldPass)) { return 'remote'; } return false; }
protected function processImpl(PostArrayAdapter $adapter, $button) { $tzName = $adapter->str(FORM_PARAM_TIMEZONE); if (!$tzName) { return array(FORM_PARAM_TIMEZONE => 'required'); } if (!PsTimeZone::inst()->isTimeZoneExists($tzName)) { return array(FORM_PARAM_TIMEZONE => "Временная зона [{$tzName}] не существует"); } PsUser::inst()->updateTimezone($tzName); return new AjaxSuccess(); }
protected function executeImpl(ArrayAdapter $params) { $avatarId = $params->int('id'); //Может быть передан и PsConstJs::AVATAR_NO_SUFFIX, а значит - null $action = $params->str('action'); $USER = PsUser::inst(); switch ($action) { case 'set': check_condition($USER->setAvatar($avatarId), 'Ошибка установки текущего аватара.'); break; case 'del': check_condition($USER->deteleAvatar($avatarId), 'Ошибка удаления аватара.'); break; default: raise_error("Неизвестное действие [{$action}]."); } $result['id'] = $USER->hasAvatar() ? $USER->getAvatarId() : PsConstJs::AVATAR_NO_SUFFIX; $result['src_big'] = $USER->getAvatarRelPath(PsUser::ID_CARD_AVATAR_DIM); return new AjaxSuccess($result); }
protected function processImpl(PostArrayAdapter $adapter, $button) { $oldPass = $adapter->str(FORM_PARAM_REG_OLD_PASS); $newPass = $adapter->str(FORM_PARAM_REG_PASS); $newPassConfirm = $adapter->str(FORM_PARAM_REG_PASS_CONF); $error = UserInputValidator::validateOldPass($oldPass); if ($error) { return array(FORM_PARAM_REG_OLD_PASS => $error); } $error = UserInputValidator::validatePass($newPass, $newPassConfirm); if ($error) { return array(FORM_PARAM_REG_PASS => $error); } $error = UserInputValidator::validatePassConfirm($newPass, $newPassConfirm); if ($error) { return array(FORM_PARAM_REG_PASS_CONF => $error); } PsUser::inst()->changePassword($oldPass, $newPass); return new AjaxSuccess(); }
/** * Имплементация метода, создающего сообщение * * @return DiscussionMsg созданное сообщение */ public final function saveMessageImpl($threadId, $parentId, $text, $theme, $templateId, $templateData, PsUser $author) { $threadId = $this->validateThreadId($threadId); $unique = $this->SETTINGS->getUnique(); check_condition($templateId === null || is_integer($templateId), "Код шаблона [{$templateId}] должен быть целочисленным"); check_condition($templateId === null || $this->SETTINGS->isTemplatable(), "Дискуссия [{$unique}] не работает с шаблонными сообщениями"); /* @var $parent DiscussionMsg */ $parent = is_numeric($parentId) ? $this->getMsgById($parentId) : null; $checkThreadId = $parent ? $this->validateThreadId($parent->getThreadId()) : $threadId; check_condition($threadId === $checkThreadId, "Не совпадают коды тредов: [{$threadId}]!=[{$checkThreadId}]"); if ($parent) { check_condition(!$parent->isDeleted(), 'Родительское сообщение удалено.'); check_condition(!$parent->isMaxDeepLevel(), 'Достигнут максимальный уровень вложенности.'); } $this->assertCanSaveDiscussionMsg($author, $parent, $threadId); $idUserTo = $parent ? $parent->getUser()->getId() : AuthManager::validateUserIdOrNull($this->getIdUserTo4Root($author, $threadId)); $userTo = is_integer($idUserTo) ? PsUser::inst($idUserTo, true) : null; return $this->BEAN->saveMsg($threadId, $text, $theme, $templateId, $templateData, $author, $userTo, $parent); }
/** * Генерация комментариев к постам. * rootCount - кол-во root комментариев * childCount - кол-во дочерних комментариев, при этом они привязываются случайным образом * postType - если передан, то комментарии будут сгенерированы только к постам этого типа * postId - для генерации комменариев к конкретному посту * takeTextFromPost - признак, брать ли текст комментариев из тела поста */ public final function generateComments($rootCount = 20, $childCount = 50, $postType = null, $postId = null, $takeTextFromPost = true) { $cproc = $this->getCommentsProcessor($postType); /* @var $proc PostsProcessor */ foreach ($cproc as $proc) { $this->LOGGER->info("<<<CREATING COMMENTS FOR POSTS OF TYPE [" . $proc->getPostType() . "]>>>"); if ($postId) { $posts[] = $proc->getPost($postId); } else { $posts = $proc->getPosts(); } /* @var $post AbstractPost */ foreach ($posts as $post) { $this->LOGGER->info("Creating comments for post " . $post->getPostType() . '|' . $post->getName()); for ($i = 1; $i <= $rootCount; $i++) { $proc->getDiscussionController()->saveMessage($post->getId(), null, $this->getText($proc, $post->getId(), $takeTextFromPost), null, PsUser::inst(TESTBean::inst()->getRandomUserId())); } for ($i = 1; $i <= $childCount; $i++) { $commentsTable = $proc->dbBean()->getCommentsTable(); $parentId = TESTBean::inst()->getRandomCommentId($commentsTable, $post->getId()); $proc->getDiscussionController()->saveMessage($post->getId(), $parentId, $this->getText($proc, $post->getId(), $takeTextFromPost), null, PsUser::inst(TESTBean::inst()->getRandomUserId())); } } } }
/** * Метод возвращает пользователя, для которого был сгенерирован код. * @return PsUser */ public function getUser() { $userId = $this->getUserId(); return $userId ? PsUser::inst($userId) : null; }
/** @return PsUser */ public function getUserTo() { return is_numeric($this->id_user_to) ? PsUser::inst($this->id_user_to) : null; }
public function getJsParams() { $params['curAvatar'] = PsUser::inst()->hasAvatar() ? PsUser::inst()->getAvatarId() : PsConstJs::AVATAR_NO_SUFFIX; return $params; }
<?php require_once 'AjaxTools.php'; $pass = RequestArrayAdapter::inst()->str(FORM_PARAM_REG_OLD_PASS); echo $pass && PsUser::inst()->checkPassword($pass) ? 'true' : 'false';
protected function assertValidDiscussionEntityId($threadId) { //Проверим существование пользователя PsUser::inst($threadId, true); }
/** * Возвращает пользователей, у которых есть ячейки в мозайке */ public function getImgUsers($imgId) { $usersArr = $this->getArray('select * from users where id_user in (select distinct id_user from ps_img_mosaic_parts where id_img=? and id_user is not null and owned=1)', $imgId); $users = array(); foreach ($usersArr as $user) { $users[$user['id_user']] = PsUser::inst($user); } return $users; }
protected function processImpl(PostArrayAdapter $adapter, $button) { $data = new RegFormData(); /* * Имя пользователя */ $name = $adapter->str(FORM_PARAM_REG_NAME); $error = UserInputValidator::validateShortText($name); if ($error) { return array(FORM_PARAM_REG_NAME => $error); } $name = UserInputTools::safeShortText($name); $data->setUserName($name); /* * Пол */ $sex = $adapter->int(FORM_PARAM_REG_SEX); $error = UserInputValidator::validateSex($sex); if ($error) { return array(FORM_PARAM_REG_SEX => $error); } $data->setSex($sex); /* * Обо мне */ $about = $adapter->str(FORM_PARAM_REG_ABOUT); if ($about) { $error = UserInputValidator::validateLongText($about, false); if ($error) { return array(FORM_PARAM_REG_ABOUT => $error); } $data->setAboutSrc($about); $data->setAbout(UserInputTools::safeLongText($about)); } /* * Контакты */ $contacts = $adapter->str(FORM_PARAM_REG_CONTACTS); if ($contacts) { $error = UserInputValidator::validateLongText($contacts, false); if ($error) { return array(FORM_PARAM_REG_CONTACTS => $error); } $data->setContactsSrc($contacts); $data->setContacts(UserInputTools::safeLongText($contacts)); } /* * Цитата */ $msg = $adapter->str(FORM_PARAM_REG_MSG); if ($msg) { $error = UserInputValidator::validateLongText($msg, false); if ($error) { return array(FORM_PARAM_REG_MSG => $error); } $data->setMsgSrc($msg); $data->setMsg(UserInputTools::safeLongText($msg)); } PsUser::inst()->updateInfo($data); return new AjaxSuccess(); }
function smarty_function_html_input($params, Smarty_Internal_Template &$smarty) { $adapter = ArrayAdapter::inst($params); $fieldId = $adapter->get('id'); $label = $adapter->get('label'); $value = $adapter->get('val'); $inputType = $adapter->str('type'); $help = $adapter->str('help'); $RQ = PostArrayAdapter::inst(); $attrs = array(); switch ($inputType) { case 'hidden': echo PsHtml::hidden($fieldId, $value); break; case 'text': echo PsHtmlForm::text($label, $fieldId, $RQ->str($fieldId, $value), $attrs, $help); break; case 'datetime': $attrs['class'][] = 'ps-datetime-picker'; echo PsHtmlForm::text($label, $fieldId, $RQ->str($fieldId, $value), $attrs, $help); break; case 'pass': echo PsHtmlForm::password($label, $fieldId, $RQ->str($fieldId)); break; case 'file': $label = $adapter->get('label', 'Файл'); $fieldId = $fieldId ? $fieldId : FORM_PARAM_FILE; echo PsHtmlForm::file($label, $fieldId, $help); break; case 'user': $label = $adapter->get('label', 'Ваше имя'); if (AuthManager::isAuthorized()) { echo PsHtmlForm::textInfo($label, PsUser::inst()->getName()); } else { $fieldId = $fieldId ? $fieldId : FORM_PARAM_NAME; echo PsHtmlForm::text($label, $fieldId, $RQ->str($fieldId), $attrs, $help); } break; case 'textarea': $label = $adapter->get('label', 'Текст сообщения'); $fieldId = $fieldId ? $fieldId : FORM_PARAM_COMMENT; $value = $value ? $value : $RQ->str($fieldId, $value); $maxlen = $adapter->str(array('maxlen', 'maxlength')); $manual = $adapter->bool('manual'); $codemirror = $adapter->str('codemirror'); echo PsHtmlForm::textarea($label, $fieldId, $value, $maxlen, $manual, $codemirror, $attrs, $help); break; case 'submit': $buttons[] = $label ? $label : 'Отправить'; for ($idx = 0; $idx <= 10; $idx++) { $button = $adapter->get("label{$idx}"); if ($button) { $buttons[] = $button; } } $canReset = $adapter->bool('reset'); echo PsHtmlForm::submit($buttons, $canReset); break; case 'yesno': $fieldId = $fieldId ? $fieldId : 'yesno'; $options[] = PsHtml::comboOption(0, 'Нет'); $options[] = PsHtml::comboOption(1, 'Да'); echo PsHtmlForm::select($label, $fieldId, $attrs, $options, 0); break; case 'sex': $value = $value ? $value : $RQ->int($fieldId); $options[] = PsHtml::comboOption(SEX_GIRL, 'Женский'); $options[] = PsHtml::comboOption(SEX_BOY, 'Мужской'); echo PsHtmlForm::select($label, $fieldId, $attrs, $options, $value); break; case 'posttype': $label = $label ? $label : 'Тип поста'; $fieldId = $fieldId ? $fieldId : FORM_PARAM_POST_TYPE; $options = array(); /* @var $pr PostsProcessor */ foreach (Handlers::getInstance()->getPostsProcessors() as $type => $pr) { $title = $pr->postTitle(); $options[] = PsHtml::comboOption($type, "{$title} ({$type})"); } echo PsHtmlForm::select($label, $fieldId, $attrs, $options); break; case 'select': echo PsHtmlForm::select($label, $fieldId, $attrs, $adapter->arr('options'), $adapter->str('curVal'), $adapter->bool('hasEmpty'), $help); break; case 'timezone': $label = $label ? $label : 'Выберите временную зону'; $tzSelect = PsTimeZone::inst()->zonesSelectHtml(); echo PsHtmlForm::field($label, $tzSelect, $help); break; default: raise_error("Unsupported html input type: [{$inputType}]"); } }
protected function executeImpl(ArrayAdapter $params) { return new AjaxSuccess(PsUser::inst()->getAvatarsList()); }
/** * Метод выполняет логаут пользователя */ public static function logout() { if (self::isAuthorized()) { //Оповещаем слушатель о разлогинивании пользователя. ApplicationListener::beforeLogout(PsUser::inst()); //Сбросим код пользователя в сессии SessionArrayHelper::reset(SESSION_USER_PARAM); } }
/** * Основной метод авторизации пользователей в системе */ private static final function loginImpl($login, $passwd, UserLoadType $userType, $afterRegistration = false) { self::logout(); $userId = UserBean::inst()->getUserIdByMailPass($login, $passwd, $userType); if (is_integer($userId)) { /* * Пользователь авторизован! */ SessionArrayHelper::setInt(SESSION_USER_PARAM, $userId); } if (self::isAuthorized()) { //Убедимся в наличии пользователя $user = PsUser::inst($userId, true); try { if ($afterRegistration) { //ApplicationListener::afterUserRegistered($user); } //Оповещаем слушатель об успешной авторизации пользователя. //ApplicationListener::afterLogin($user); } catch (Exception $ex) { //Сделаем дамп ошибки ExceptionHandler::dumpError($ex); } } else { check_condition(!$afterRegistration, 'Не удалось авторизоваться после создания пользователя'); } return self::isAuthorized(); }
protected function executeImpl(ArrayAdapter $params) { return new AjaxSuccess(UserPointsManager::inst()->givePointsByRequest(PsUser::inst(), $params)); }
protected function executeImpl(ArrayAdapter $params) { return new AjaxSuccess(PsUser::inst($params->int('id'))->getIdCardContent()); }