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 array con los campos escritos.
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 $ret = file_creditos_write($user, $creditos2, $bonus, $dias2);
34 if ($ret === false) return false;
35 else return array_slice($ret, 1);
41 * Actualiza el archivo de créditos al hacer una pregunta.
42 * Se resta un crédito por hacer la pregunta y se resetea la cantidad de
45 * @return Array con los nuevos valores de créditos.
47 function file_creditos_preguntar($user)
49 if (!($row = file_creditos_get($user))) return false;
50 list($fecha, $creditos, $bonus, $dias) = $row;
51 return file_creditos_write($user, $creditos - 1, $bonus, 0);
55 * Actualiza el archivo de créditos al evaluar una respuesta.
56 * Calcula si hay que agregar créditos por bonus.
58 * @return Array con los nuevos valores de créditos.
60 function file_creditos_evaluar($user, $rank, $es_bonus = false, $bonus_cant = 5)
62 if (!($row = file_creditos_get($user))) return false;
63 list($fecha, $creditos, $bonus, $dias) = $row;
65 $creditos2 = $creditos + $rank;
66 if ($es_bonus) $bonus2++;
67 if ($bonus2 >= $bonus_cant)
69 $creditos2 += intval($bonus2 / $bonus_cant) * $bonus_cant;
70 $bonus2 %= $bonus_cant;
72 if ($bonus2 != $bonus or $creditos2 != $creditos)
74 return (bool)file_creditos_write($user, $creditos2, $bonus2, $dias);
80 * Obtiene los datos de la última entrada del archivo de créditos.
82 function file_creditos_get($user)
84 if (($f = fopen("data/creditos.$user.csv", 'r')) === false) return false;
85 $seek = intval(trim(fgets($f, 11)));
87 $row = fgetcsv($f, 4096);
93 * Agrega $n créditos al usuario $user (false si hay error).
95 function file_creditos_add($user, $n)
97 if (!($row = file_creditos_get($user))) return false;
98 list($fecha, $creditos, $bonus, $dias) = $row;
100 return (bool)file_creditos_write($user, $creditos, $bonus, $dias);
104 * Escribe una nueva entrada en el archivo de créditos (actualiza el 'índice').
106 * @return array con los campos escritos.
108 function file_creditos_write($user, $creditos, $bonus, $dias)
110 if (($f = fopen("data/creditos.$user.csv", 'r+')) === false) return false;
111 fseek($f, 0, SEEK_END);
114 fputcsv($f, array($fecha, $creditos, $bonus, $dias));
116 fwrite($f, sprintf("%010d\n", $seek), 11);
118 return array($fecha, $creditos, $bonus, $dias);
122 * Crea el archivo de créditos para el usuario.
124 function file_creditos_crear($user)
126 if (($f = fopen("data/creditos.$user.csv", 'w')) === false) return false;
127 fwrite($f, sprintf("%010d\n", 11), 11);
128 fputcsv($f, array(time(), 1, 0, 0));
134 * Convierte segundos a días.
136 function secs2dias($secs)
138 return intval($secs / 86400);