public function collect($params)
 {
     $userId = self::getUserIdByToken($params['token']);
     if (!$userId) {
         return Utils::formatErrorMessage(ERROR_BAD_TOKEN, "Bad Token");
     }
     $sql = "SELECT id\n\t\t\t\tFROM users\n\t\t\t\tWHERE username = '******'author_name'] . "'";
     $result = $GLOBALS['app']['db']->fetchAll($sql);
     echo $result;
     if (count($result) == 0) {
         return Utils::formatErrorMessage(ERROR_BAD_USERNAME, "Bad username");
     }
     $author_id = $result[0]['id'];
     $gifts = file_get_contents(__DIR__ . "./../../../assets/json/giftsSettings.json", FILE_USE_INCLUDE_PATH);
     $gifts = json_decode($gifts, true);
     $sql = "UPDATE gift_users\n\t\t\t\tSET is_collected = true\n\t\t\t\tWHERE user_id = " . $userId . "\n                    AND author_users_id = " . $author_id . "\n\t\t\t\t\tAND name = '" . $params['name'] . "'\n\t\t\t\t\tAND is_collected = false\n\t\t\t\t\tLIMIT 1";
     $result = $GLOBALS['app']['db']->exec($sql);
     if ($result == 0) {
         return Utils::formatErrorMessage(ERROR_NO_GIFT, "No gifts");
     }
     if (!array_key_exists($params['name'], $gifts)) {
         return Utils::formatErrorMessage(ERROR_BAD_GIFTS, "Bad gift name");
     }
     $gifts = $gifts[$params['name']];
     $resourceId = ResourcesController::getResourceIdByName($gifts['resource_name']);
     ResourcesController::addResource($resourceId, $gifts['resource_amount'], $userId);
     return ResourcesController::getResource($userId);
 }
 public function collect($params)
 {
     $userId = self::getUserIdByToken(addslashes($params['token']));
     if (!$userId) {
         return Utils::formatErrorMessage(ERROR_BAD_TOKEN, "Bad token");
     }
     //initialisation
     $building = self::getBuildingByPosition(addslashes($params['x']), addslashes($params['y']), $userId);
     $buildingName = BuildingModel::getBuildingNameByTypeId($building['building_type_id']);
     $settings = self::getSettings();
     $buildingDetails = self::getBuildingDetails($buildingName, $building['building_id'], $userId);
     //Vérifie si le batiment est collectable
     if (!array_key_exists("last_recolt_at", $buildingDetails)) {
         return Utils::formatErrorMessage(ERROR_BUILDING, "Le batiment n'est pas collectable");
     }
     //Recupéré le paramétrage
     $buildingJson = $settings[$buildingName];
     if (array_key_exists("1", $settings[$buildingName])) {
         $buildingJson = $settings[$buildingName][$buildingDetails['lvl']];
     }
     //recupère la dernière date de recolte
     $dateLastRecolt = $buildingDetails['last_recolt_at'];
     if (strtotime($buildingDetails['last_recolt_at']) < strtotime($building['construct_end_at'])) {
         $dateLastRecolt = $building['construct_end_at'];
     }
     //Récupère le temps en heure
     $hourDetails = BuildingModel::getTimeLeft($dateLastRecolt);
     //Calcule du gain de ressource
     $gainPerHour = $buildingJson['production'];
     $maxCapacity = $buildingJson['capacity'];
     $gainResource = $gainPerHour * $hourDetails;
     $housesInRadius = 0;
     //récupère dans le .json le resource_boost et le radius
     $boost = $settings['house']['resource_multiplier'];
     $radius = $settings['house']['action_radius'];
     //récupère tous les house du joueur
     $houseID = BuildingModel::getBuildingTypeIdByName('house');
     $sql = "SELECT x, y\n\t\t\t\tFROM building_users\n\t\t\t\tWHERE user_id =" . $userId . " AND building_type_id = " . $houseID;
     $result = $GLOBALS['app']['db']->fetchAll($sql);
     foreach ($result as $house) {
         $AB = sqrt(pow($house['x'] - $params['x'], 2) + pow($house['y'] - $params['y'], 2));
         if ($AB < $radius) {
             $housesInRadius++;
         }
     }
     //savoir si un batiment est dans le radius : AB = \sqrt{(x_B-x_A)^2 + (y_B-y_A)^2}.
     //multiplier $gain resource par le %
     $bonusResource = $gainResource * (1 + $housesInRadius * $boost);
     $gainResource = $bonusResource > 0 ? $bonusResource : $gainResource;
     if ($gainResource > $maxCapacity) {
         $gainResource = $maxCapacity;
     }
     if ($gainResource < 1) {
         return ResourcesController::getResource($userId);
     }
     $resourceId = ResourcesController::getResourceIdByName($buildingJson['resource_production']);
     ResourcesController::addResource($resourceId, $gainResource, $userId);
     $sql = "UPDATE building_" . $buildingName . "\n\t\t\tSET last_recolt_at = '" . date("Y-m-d H:i:s") . "'\n\t\t\tWHERE id = " . $buildingDetails['id'] . "\n\t\t\t\tAND user_id = " . $userId;
     $result = $GLOBALS['app']['db']->exec($sql);
     return ResourcesController::getResource($userId);
 }
 public function paradeUpdate($params)
 {
     $userId = self::getUserIdByToken(addslashes($params['token']));
     if (!$userId) {
         return Utils::formatErrorMessage(ERROR_BAD_TOKEN, "Bad token");
     }
     $params['hardPurchase'] = $params['hardPurchase'] == 'true';
     $paradeSettings = file_get_contents(__DIR__ . "./../../../assets/json/paradeSettings.json", FILE_USE_INCLUDE_PATH);
     $paradeSettings = json_decode($paradeSettings, true);
     $lanterns = LanternsController::getLanterns($userId);
     $maxBonus = $paradeSettings['generatedBonusCountPerLanterns'] * count($lanterns);
     if ($params['bonusHarvested'] > $maxBonus) {
         return Utils::formatErrorMessage(ERROR_BONUS_SENT_TOO_BIG, "Bonus sent is too big");
     }
     $offeringResourceId = ResourcesController::getResourceIdByName("offering");
     if (!$params['hardPurchase']) {
         $sql = "SELECT last_parade_at FROM users WHERE id = '" . $userId . "'";
         $result = $GLOBALS['app']['db']->fetchAll($sql);
         $lastParadeAt = new DateTime($result[0]['last_parade_at']);
         $now = new DateTime();
         // Verification de si la parade n'a pas eu lieu aujourd'hui
         if ($lastParadeAt->format('d') != $now->format('d') || $now->getTimestamp() - $lastParadeAt->getTimestamp() >= 86400) {
             $sql = "UPDATE users\n\t\t\t\t\t\tSET last_parade_at = NOW()\n\t\t\t\t\t\tWHERE id = '" . $userId . "'";
             $result = $GLOBALS['app']['db']->exec($sql);
             $goldGained = $this->convertBonusToGold($params['bonusHarvested'], $paradeSettings, $userId);
             ResourcesController::addResource($offeringResourceId, $goldGained, $userId);
         } else {
             return Utils::formatErrorMessage(ERROR_PARADE_ALREADY_LAUNCH, "Parade already launched today");
         }
     } else {
         $resourceId = ResourcesController::getResourceIdByName("spice");
         if (ResourcesController::spendResource($resourceId, $paradeSettings['paradeHardPrice'], $userId)) {
             $goldGained = $this->convertBonusToGold($params['bonusHarvested'], $paradeSettings, $userId);
             ResourcesController::addResource($offeringResourceId, $goldGained, $userId);
         } else {
             return Utils::formatErrorMessage(ERROR_NO_MONEY, "Not enought spice");
         }
     }
     return ResourcesController::getResource($userId);
 }