X-Git-Url: https://git.llucax.com/z.facultad/75.43/tp1.git/blobdiff_plain/748dad7dcb2fea29ca8b4b021f93fe0f9373e793..765b3c57f081d3863ff59951a67da5874554db42:/src/lib/file.creditos.php diff --git a/src/lib/file.creditos.php b/src/lib/file.creditos.php index 3b4db65..d4d4cc1 100644 --- a/src/lib/file.creditos.php +++ b/src/lib/file.creditos.php @@ -14,16 +14,27 @@ require_once 'lib/file.php'; * Actualiza el archivo de créditos al loguearse. * Calcula si hay que restar créditos por días sin preguntar. * - * @return Array con los nuevos valores de crétigos. + * TODO ver si anda por el tema de las preguntas, que se pueden actualizar los + * creditos sin que pregunte. Probablemente haya que agregar una fecha de + * último chequeo para diferenciar entragas por login de entradas por + * evaluar o preguntas (me parece que con 'dias' no alcanza). + * + * @return array con los campos escritos. */ function file_creditos_login($user) { - $row = file_creditos_get($user); - if (!$row) return false; + if (!($row = file_creditos_get($user))) return false; list($fecha, $creditos, $bonus, $dias) = $row; - $dias = $dias + secs2dias(time() - $fecha); - return file_creditos_write($user, $creditos - intval($dias / 30), $bonus, - $dias % 30); + $dias2 = $dias + secs2dias(time() - $fecha); + $creditos2 = $creditos - intval($dias2 / 30); + $dias2 %= 30; + if ($dias2 != $dias or $creditos2 != $creditos) + { + $ret = file_creditos_write($user, $creditos2, $bonus, $dias2); + if ($ret === false) return false; + else return array_slice($ret, 1); + } + return true; } /** @@ -35,8 +46,7 @@ function file_creditos_login($user) */ function file_creditos_preguntar($user) { - $row = file_creditos_get($user); - if (!$row) return false; + if (!($row = file_creditos_get($user))) return false; list($fecha, $creditos, $bonus, $dias) = $row; return file_creditos_write($user, $creditos - 1, $bonus, 0); } @@ -47,18 +57,23 @@ function file_creditos_preguntar($user) * * @return Array con los nuevos valores de créditos. */ -function file_creditos_evaluar($user, $es_bonus = false, $bonus_cant = 5) +function file_creditos_evaluar($user, $rank, $es_bonus = false, $bonus_cant = 5) { - $row = file_creditos_get($user); - if (!$row) return false; + if (!($row = file_creditos_get($user))) return false; list($fecha, $creditos, $bonus, $dias) = $row; - if ($es_bonus) $bonus++; - if ($bonus >= $bonus_cant) + $bonus2 = $bonus; + $creditos2 = $creditos + $rank; + if ($es_bonus) $bonus2++; + if ($bonus2 >= $bonus_cant) + { + $creditos2 += intval($bonus2 / $bonus_cant) * $bonus_cant; + $bonus2 %= $bonus_cant; + } + if ($bonus2 != $bonus or $creditos2 != $creditos) { - $creditos += intval($bonus / $bonus_cant) * $bonus_cant; - $bonus %= $bonus_cant; + return (bool)file_creditos_write($user, $creditos2, $bonus2, $dias); } - return file_creditos_write($user, $creditos, $bonus, $dias); + return true; } /** @@ -66,23 +81,52 @@ function file_creditos_evaluar($user, $es_bonus = false, $bonus_cant = 5) */ function file_creditos_get($user) { - if (($f = fopen("data/$user.creditos.csv", 'r')) === false) return false; + if (($f = fopen("data/creditos.$user.csv", 'r')) === false) return false; $seek = intval(trim(fgets($f, 11))); fseek($f, $seek); - return fgetcsv($f, 4096); + $row = fgetcsv($f, 4096); + fclose($f); + return $row; +} + +/** + * Agrega $n créditos al usuario $user (false si hay error). + */ +function file_creditos_add($user, $n) +{ + if (!($row = file_creditos_get($user))) return false; + list($fecha, $creditos, $bonus, $dias) = $row; + $creditos += $n; + return (bool)file_creditos_write($user, $creditos, $bonus, $dias); } /** * Escribe una nueva entrada en el archivo de créditos (actualiza el 'índice'). + * + * @return array con los campos escritos. */ function file_creditos_write($user, $creditos, $bonus, $dias) { - if (($f = fopen("data/$user.creditos.csv", 'a+')) === false) return false; + if (($f = fopen("data/creditos.$user.csv", 'r+')) === false) return false; + fseek($f, 0, SEEK_END); $seek = ftell($f); $fecha = time(); fputcsv($f, array($fecha, $creditos, $bonus, $dias)); - fseek($f, 0); + rewind($f); fwrite($f, sprintf("%010d\n", $seek), 11); + fclose($f); + return array($fecha, $creditos, $bonus, $dias); +} + +/** + * Crea el archivo de créditos para el usuario. + */ +function file_creditos_crear($user) +{ + if (($f = fopen("data/creditos.$user.csv", 'w')) === false) return false; + fwrite($f, sprintf("%010d\n", 11), 11); + fputcsv($f, array(time(), 1, 0, 0)); + fclose($f); return true; }