]> git.llucax.com Git - z.facultad/75.43/tp1.git/blob - src/lib/file.creditos.php
Nueva función para validar (muy livianamente) una fecha.
[z.facultad/75.43/tp1.git] / src / lib / file.creditos.php
1 <?php
2 // vim: set binary noeol et sw=4 sts=4 :
3 // Grupo 10
4 //
5 // Lucarella, Schein, Arena
6 //
7 // Creado: Leandro Lucarella (lun may  2 20:00:07 ART 2005)
8 //
9 // $Id$
10
11 require_once 'lib/file.php';
12
13 /**
14  * Actualiza el archivo de créditos al loguearse.
15  * Calcula si hay que restar créditos por días sin preguntar.
16  *
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).
21  *
22  * @return false si hay error
23  */
24 function file_creditos_login($user)
25 {
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);
30     $dias2 %= 30;
31     if ($dias2 != $dias or $creditos2 != $creditos)
32     {
33         return (bool)file_creditos_write($user, $creditos2, $bonus, $dias2);
34     }
35     return true;
36 }
37
38 /**
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
41  * días sin preguntar.
42  *
43  * @return Array con los nuevos valores de créditos.
44  */
45 function file_creditos_preguntar($user)
46 {
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);
50 }
51
52 /**
53  * Actualiza el archivo de créditos al evaluar una respuesta.
54  * Calcula si hay que agregar créditos por bonus.
55  *
56  * @return Array con los nuevos valores de créditos.
57  */
58 function file_creditos_evaluar($user, $es_bonus = false, $bonus_cant = 5)
59 {
60     if (!($row = file_creditos_get($user))) return false;
61     list($fecha, $creditos, $bonus, $dias) = $row;
62     $bonus2 = $bonus;
63     $creditos2 = $creditos;
64     if ($es_bonus) $bonus2++;
65     if ($bonus2 >= $bonus_cant)
66     {
67         $creditos2 += intval($bonus2 / $bonus_cant) * $bonus_cant;
68         $bonus2 %= $bonus_cant;
69     }
70     if ($bonus2 != $bonus or $creditos2 != $creditos)
71     {
72         return (bool)file_creditos_write($user, $creditos2, $bonus2, $dias);
73     }
74     return true;
75 }
76
77 /**
78  * Obtiene los datos de la última entrada del archivo de créditos.
79  */
80 function file_creditos_get($user)
81 {
82     if (($f = fopen("data/creditos.$user.csv", 'r')) === false) return false;
83     $seek = intval(trim(fgets($f, 11)));
84     fseek($f, $seek);
85     $row = fgetcsv($f, 4096);
86     fclose($f);
87     return $row;
88 }
89
90 /**
91  * Escribe una nueva entrada en el archivo de créditos (actualiza el 'índice').
92  *
93  * @returns array con los campos escritos.
94  */
95 function file_creditos_write($user, $creditos, $bonus, $dias)
96 {
97     if (($f = fopen("data/creditos.$user.csv", 'r+')) === false) return false;
98     fseek($f, 0, SEEK_END);
99     $seek = ftell($f);
100     $fecha = time();
101     fputcsv($f, array($fecha, $creditos, $bonus, $dias));
102     rewind($f);
103     fwrite($f, sprintf("%010d\n", $seek), 11);
104     fclose($f);
105     return array($fecha, $creditos, $bonus, $dias);
106 }
107
108 /**
109  * Crea el archivo de créditos para el usuario.
110  */
111 function file_creditos_crear($user)
112 {
113     if (($f = fopen("data/creditos.$user.csv", 'w')) === false) return false;
114     fwrite($f, sprintf("%010d\n", 11), 11);
115     fputcsv($f, array(time(), 1, 0, 0));
116     fclose($f);
117     return true;
118 }
119
120 /**
121  * Convierte segundos a días.
122  */
123 function secs2dias($secs)
124 {
125     return intval($secs / 86400);
126 }
127
128 ?>