]> git.llucax.com Git - z.facultad/75.43/tp1.git/blob - src/lib/file.creditos.php
Aca esta mi bugfixing, para que le llevemos algo que le guste mas.
[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 array con los campos escritos.
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         $ret = file_creditos_write($user, $creditos2, $bonus, $dias2);
34         if ($ret === false) return false;
35         else return array_slice($ret, 1);
36     }
37     return true;
38 }
39
40 /**
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
43  * días sin preguntar.
44  *
45  * @return Array con los nuevos valores de créditos.
46  */
47 function file_creditos_preguntar($user)
48 {
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);
52 }
53
54 /**
55  * Actualiza el archivo de créditos al evaluar una respuesta.
56  * Calcula si hay que agregar créditos por bonus.
57  *
58  * @return Array con los nuevos valores de créditos.
59  */
60 function file_creditos_evaluar($user, $rank, $es_bonus = false, $bonus_cant = 5)
61 {
62     if (!($row = file_creditos_get($user))) return false;
63     list($fecha, $creditos, $bonus, $dias) = $row;
64     $bonus2 = $bonus;
65     $creditos2 = $creditos + $rank;
66     if ($es_bonus) $bonus2++;
67     if ($bonus2 >= $bonus_cant)
68     {
69         $creditos2 += intval($bonus2 / $bonus_cant) * $bonus_cant;
70         $bonus2 %= $bonus_cant;
71     }
72     if ($bonus2 != $bonus or $creditos2 != $creditos)
73     {
74         return (bool)file_creditos_write($user, $creditos2, $bonus2, $dias);
75     }
76     return true;
77 }
78
79 /**
80  * Obtiene los datos de la última entrada del archivo de créditos.
81  */
82 function file_creditos_get($user)
83 {
84     if (($f = fopen("data/creditos.$user.csv", 'r')) === false) return false;
85     $seek = intval(trim(fgets($f, 11)));
86     fseek($f, $seek);
87     $row = fgetcsv($f, 4096);
88     fclose($f);
89     return $row;
90 }
91
92 /**
93  * Agrega $n créditos al usuario $user (false si hay error).
94  */
95 function file_creditos_add($user, $n)
96 {
97     if (!($row = file_creditos_get($user))) return false;
98     list($fecha, $creditos, $bonus, $dias) = $row;
99     $creditos += $n;
100     return (bool)file_creditos_write($user, $creditos, $bonus, $dias);
101 }
102
103 /**
104  * Escribe una nueva entrada en el archivo de créditos (actualiza el 'índice').
105  *
106  * @return array con los campos escritos.
107  */
108 function file_creditos_write($user, $creditos, $bonus, $dias)
109 {
110     if (($f = fopen("data/creditos.$user.csv", 'r+')) === false) return false;
111     fseek($f, 0, SEEK_END);
112     $seek = ftell($f);
113     $fecha = time();
114     fputcsv($f, array($fecha, $creditos, $bonus, $dias));
115     rewind($f);
116     fwrite($f, sprintf("%010d\n", $seek), 11);
117     fclose($f);
118     return array($fecha, $creditos, $bonus, $dias);
119 }
120
121 /**
122  * Crea el archivo de créditos para el usuario.
123  */
124 function file_creditos_crear($user)
125 {
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));
129     fclose($f);
130     return true;
131 }
132
133 /**
134  * Convierte segundos a días.
135  */
136 function secs2dias($secs)
137 {
138     return intval($secs / 86400);
139 }
140
141 ?>