2 // vim: set binary noeol et sw=4 sts=4 :
5 // Lucarella, Schein, Arena
7 // Creado: Leandro Lucarella (lun may 2 20:00:07 ART 2005)
11 require_once 'lib/file.php';
14 * Actualiza el archivo de créditos al loguearse.
15 * Calcula si hay que restar créditos por días sin preguntar.
17 * TODO ver si anda por el tema de las preguntas, que se pueden actualizar los
18 * creditos sin que pregunte. Probablemente haya que agregar una fecha de
19 * último chequeo para diferenciar entragas por login de entradas por
20 * evaluar o preguntas (me parece que con 'dias' no alcanza).
22 * @return false si hay error
24 function file_creditos_login($user)
26 if (!($row = file_creditos_get($user))) return false;
27 list($fecha, $creditos, $bonus, $dias) = $row;
28 $dias2 = $dias + secs2dias(time() - $fecha);
29 $creditos2 = $creditos - intval($dias2 / 30);
31 if ($dias2 != $dias or $creditos2 != $creditos)
33 return (bool)file_creditos_write($user, $creditos2, $bonus, $dias2);
39 * Actualiza el archivo de créditos al hacer una pregunta.
40 * Se resta un crédito por hacer la pregunta y se resetea la cantidad de
43 * @return Array con los nuevos valores de créditos.
45 function file_creditos_preguntar($user)
47 if (!($row = file_creditos_get($user))) return false;
48 list($fecha, $creditos, $bonus, $dias) = $row;
49 return file_creditos_write($user, $creditos - 1, $bonus, 0);
53 * Actualiza el archivo de créditos al evaluar una respuesta.
54 * Calcula si hay que agregar créditos por bonus.
56 * @return Array con los nuevos valores de créditos.
58 function file_creditos_evaluar($user, $es_bonus = false, $bonus_cant = 5)
60 if (!($row = file_creditos_get($user))) return false;
61 list($fecha, $creditos, $bonus, $dias) = $row;
63 $creditos2 = $creditos;
64 if ($es_bonus) $bonus2++;
65 if ($bonus2 >= $bonus_cant)
67 $creditos2 += intval($bonus2 / $bonus_cant) * $bonus_cant;
68 $bonus2 %= $bonus_cant;
70 if ($bonus2 != $bonus or $creditos2 != $creditos)
72 return (bool)file_creditos_write($user, $creditos2, $bonus2, $dias);
78 * Obtiene los datos de la última entrada del archivo de créditos.
80 function file_creditos_get($user)
82 if (($f = fopen("data/creditos.$user.csv", 'r')) === false) return false;
83 $seek = intval(trim(fgets($f, 11)));
85 $row = fgetcsv($f, 4096);
91 * Agrega $n créditos al usuario $user (false si hay error).
93 function file_creditos_add($user, $n)
95 if (!($row = file_creditos_get($user))) return false;
96 list($fecha, $creditos, $bonus, $dias) = $row;
98 return (bool)file_creditos_write($user, $creditos, $bonus, $dias);
102 * Escribe una nueva entrada en el archivo de créditos (actualiza el 'índice').
104 * @returns array con los campos escritos.
106 function file_creditos_write($user, $creditos, $bonus, $dias)
108 if (($f = fopen("data/creditos.$user.csv", 'r+')) === false) return false;
109 fseek($f, 0, SEEK_END);
112 fputcsv($f, array($fecha, $creditos, $bonus, $dias));
114 fwrite($f, sprintf("%010d\n", $seek), 11);
116 return array($fecha, $creditos, $bonus, $dias);
120 * Crea el archivo de créditos para el usuario.
122 function file_creditos_crear($user)
124 if (($f = fopen("data/creditos.$user.csv", 'w')) === false) return false;
125 fwrite($f, sprintf("%010d\n", 11), 11);
126 fputcsv($f, array(time(), 1, 0, 0));
132 * Convierte segundos a días.
134 function secs2dias($secs)
136 return intval($secs / 86400);