/** * Регистрирует решение задачи * * @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; }
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 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) { $url = $params->str('url'); $text = $params->str('text'); $note = $params->str('note'); if (!$url || !$text) { return 'Не передан url или текст'; } /* * Если пользователь не просматривал эту страницу и это не администратор - игнорируем. */ $wasOpened = PageOpenWatcher::isPageOpenedByUser($url, PsUser::instOrNull()); if (!$wasOpened && !AuthManager::isAuthorizedAsAdmin()) { return 'Пользователь не открывал страницу'; //--- } $text = UserInputTools::safeShortText($text); $note = $note ? UserInputTools::safeLongText($note) : $note; $saved = UtilsBean::inst()->saveMisprint($url, $text, $note, AuthManager::getUserIdOrNull()); if (!$saved) { return 'Запись не была сохранена'; //--- } return new AjaxSuccess(); }
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()))); }
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; }
/** @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; }
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(); }
public function send($email) { //Загружаем код пользователя по e-mail $userId = PsUser::instByMail($email)->getId(); //Генерируем код $CODE = PsUserCode::passRecover()->generateAndSave($userId); //Отправляем письмо try { $content = $this->foldedEntity->fetchTpl(array('code' => $CODE->getCode())); PsMailSender::fastSend('Восстановление пароля на ' . ServerArrayAdapter::HTTP_HOST(), $content, $email); } catch (Exception $ex) { //Коды, высланные пользователю, нужно удалить $CODE->dropUnusedCodes($userId); throw $ex; } }
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(); }
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); }
public static function beforeLogout(PsUser $user) { //Аудит UserAudit::inst()->beforeLogout($user->getId()); }
protected function executeImpl(ArrayAdapter $params) { return new AjaxSuccess(PsUser::inst()->getAvatarsList()); }
/** * Имплементация метода, создающего сообщение * * @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); }
/** * Функция, отправляющая сообщение от имени системного администратора. * Нужна для отправки всяких уведомлений. */ public final function sendSystemMsg(PsUser $receiver, $param1 = null, $param2 = null) { $arguments = func_get_args(); array_unshift($arguments, PsUser::defaultAdmin()); call_user_func_array(array($this, 'sendMsg'), $arguments); }
/** * Основной метод сохранения сообщения в базу * * @return DiscussionMsg */ public function saveMsg($threadId, $text, $theme, $templateId, $templateData, PsUser $author, PsUser $userTo = null, DiscussionMsg $parent = null) { //Строим запрос $insert = array(); $params = array(); //Код родителя if ($parent) { $insert['id_parent'] = '?'; $params[] = $parent->getId(); } //Пользователь, написавший сообщение $insert['id_user'] = '******'; $params[] = $author->getId(); //Пользователь, которому предназначено это сообщение $insert['id_user_to'] = '?'; $params[] = $userTo ? $userTo->getId() : null; //Глубина сообщения $insert['n_deep'] = '?'; $params[] = $parent ? $parent->getDeep() + 1 : 1; //Известен ли комментарий пользователю $insert['b_known'] = '?'; $params[] = $userTo && !$userTo->isIt($author) ? 0 : 1; //Подтверждён ли комментарий админом (только если сообщение пишет админ или сообщение написано от имени дефолтного администратора) $insert['b_confirmed'] = '?'; $params[] = $author->isAuthorisedAsAdmin() || PsUser::defaultAdmin()->isIt($author) ? 1 : 0; if (is_integer($templateId)) { $insert['id_template'] = '?'; $params[] = $templateId; $insert['v_template'] = '?'; $params[] = $templateData; } else { //Тема. Если есть предок - тема не нужна if (!$parent && $this->themeColumn) { $insert[$this->themeColumn] = '?'; $params[] = $theme; } //Содержимое $insert['content'] = '?'; $params[] = $text; } //entityId if ($this->threadIdColumn) { $insert[$this->threadIdColumn] = '?'; $params[] = $threadId; } //date $insert['dt_event'] = 'UNIX_TIMESTAMP()'; //Ссылка на root $msgId = null; if ($parent) { $insert['id_root'] = '?'; $params[] = $parent->getRootId(); } else { $msgId = $this->getNextRootId(); $insert['id_root'] = '?'; $params[] = $msgId; $insert[$this->idColumn] = '?'; $params[] = $msgId; } $query = 'insert into ' . $this->table . ' (' . implode(', ', array_keys($insert)) . ') values (' . implode(', ', $insert) . ')'; if ($msgId) { $this->update($query, $params); } else { $msgId = $this->insert($query, $params); } //Если мы писали ответ на сообщение, написанное нам - отметим, что мы знаем об этом сообщении if ($parent && !$parent->isKnown() && $parent->isToUser($author)) { $this->update("update {$this->table} set b_known=1 where {$this->idColumn}=? and id_user_to=?", array($parent->getId(), $author->getId())); } //Если админ отвечает на какое-то сообщение, то оно считается подтверждённым if ($parent && !$parent->isConfirmed() && $author->isAuthorisedAsAdmin()) { $this->update("update {$this->table} set b_confirmed=1 where {$this->idColumn}=?", $parent->getId()); } return $this->getMsgById($msgId); }
/** * Метод возвращает пользователя, для которого был сгенерирован код. * @return PsUser */ public function getUser() { $userId = $this->getUserId(); return $userId ? PsUser::inst($userId) : null; }
public function getJsParams() { $params['curAvatar'] = PsUser::inst()->hasAvatar() ? PsUser::inst()->getAvatarId() : PsConstJs::AVATAR_NO_SUFFIX; return $params; }
/** * Метод вовзращает ссылку на DirItem аватара по умолчанию. * Если задан пользователь, то будет возвращён его аватар по умолчанию, иначе - anonymous. * * @return DirItem */ public static function getDefaultAvatarDi(PsUser $user = null, $dim = null) { return $user ? $user->getDefaultAvatarDi($dim) : null; }
protected function getIdUserTo4Root(PsUser $author, $threadId) { //Если пользователь сам пишетв ленту, то это сообщение - админу, в противном случае все сообщения идут самому пользователю return $author->isIt($threadId) ? DEFAULT_ADMIN_USER : $threadId; }
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($params->int('id'))->getIdCardContent()); }
public function send($templateData = null) { FeedbackManager::inst()->saveTemplatedMessage($this->receiver->getId(), null, $this->templateId, $templateData, $this->author); }
/** * Метод загружает все очки, выданные пользователю */ public function getAllUserPoints(PsUser $user) { return UserPointsBean::inst()->getAllUserPoints($user->getId()); }
protected function executeImpl(ArrayAdapter $params) { return new AjaxSuccess(UserPointsManager::inst()->givePointsByRequest(PsUser::inst(), $params)); }
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(); }