* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.shipsimu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class UserPoints extends BaseFrameworkSystem implements Registerable, BookablePoints { /** * Amount of points */ private $amount = 0; /** * Protected constructor * * @return void */ protected function __construct () { // Call parent constructor parent::__construct(__CLASS__); } /** * Creates an instance of this points class * * @param $userInstance An instance of a user class * @return $pointsInstance An instance of this class */ public static final function createUserPoints (ManageableAccount $userInstance) { // Get a new instance $pointsInstance = new UserPoints(); // Set user instance $pointsInstance->setUserInstance($userInstance); // Get a critieria instance $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class'); // Add search criteria $searchInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS_UID, $userInstance->getUserId()); $searchInstance->setLimit(1); // Get a wrapper instance $wrapperInstance = DatabaseWrapperFactory::createWrapperByConfiguredName('user_points_db_wrapper_class'); // Get result back $resultInstance = $wrapperInstance->doSelectByCriteria($searchInstance); // Advance to first entry by default $resultInstance->next(); // Set it in this instance $pointsInstance->setResultInstance($resultInstance); // Return instance return $pointsInstance; } /** * Setter for amount * * @param $amount Amount of points to store * @return void */ public final function setAmount ($amount) { $this->amount = (float) $amount; } /** * Getter for amount * * @return $amount Amount of points to store */ public final function getAmount () { return $this->amount; } /** * Checks whether the user has the required amount of points left for the specified action * * @param $action The action or configuration entry plus prefix the user wants to perform * @return $hasRequired Whether the user has the required points * @todo Finish loading part of points */ public function ifUserHasRequiredPoints ($action) { // Default is that everyone is poor... ;-) $hasRequired = false; // Get the required points entry $requiredPoints = $this->getConfigInstance()->getConfigEntry($action . '_action_points'); // Rewind always $this->getResultInstance()->rewind(); // Do we have an entry? if ($this->getResultInstance()->next()) { // Get the entry $currEntry = $this->getResultInstance()->current(); // Has he enought points? $hasRequired = ($currEntry['points'] >= $requiredPoints); } // END - if // Return the result return $hasRequired; } /** * "Books" the given points amount on the current user's account * * @param $amount Amount of points we shall book * @return void */ public function bookPointsDirectly ($amount) { // Rewind always $this->getResultInstance()->rewind(); // Do we have an entry? if ($this->getResultInstance()->next()) { // Get the entry $entry = $this->getResultInstance()->current(); // Add the points $amount += $entry[UserPointsDatabaseWrapper::DB_COLUMN_POINTS]; // Now get another criteria $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class'); // And add our both entries $updateInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS, $amount); // Add the search criteria for searching for the right entry $updateInstance->setSearchInstance($searchInstance); // Set wrapper class name $updateInstance->setWrapperConfigEntry('user_points_db_wrapper_class'); // Remember the update in database result $this->getResultInstance()->add2UpdateQueue($updateInstance); } else { // Set the amount in class $this->setAmount($amount); // Create the new entry $wrapperInstance->insertUserPoints($this); } } /** * Adds registration elements to a given dataset instance * * @param $criteriaInstance An instance of a StoreableCriteria class * @return void * @todo $requestInstance is currently unused */ public function addElementsToDataSet (StoreableCriteria $criteriaInstance) { // Add user id $criteriaInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS_UID, $this->getUserInstance()->getUserId()); // Add amount $criteriaInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS, $this->getAmount()); } }