5 * Copyright (C) 2006-2013 Matteo Nastasi
6 * mailto: nastasi@alternativeoutput.it
7 * matteo.nastasi@milug.org
8 * web: http://www.alternativeoutput.it
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details. You should have received a
19 * copy of the GNU General Public License along with this program; if
20 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21 * Suite 330, Boston, MA 02111-1307, USA.
26 define('BRISK_CONF', "brisk.conf.pho");
27 define('FTOK_PATH', "/var/lib/brisk");
28 define('LEGAL_PATH', "/tmp/legal_brisk");
29 define('PROXY_PATH', "/var/lib/brisk_proxy");
30 define('TABLES_N', 36);
31 define('TABLES_AUTH_N', 8);
32 define('TABLES_CERT_N', 4);
33 define('PLAYERS_N', 3);
34 define('MAX_POINTS', 5);
35 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
36 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
37 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
38 define('SHM_DIMS_DLT', 65536);
40 define('SHM_DIMS_U_MIN', 4096);
41 define('SHM_DIMS_U_MAX', 65536);
42 define('SHM_DIMS_U_DLT', 4096);
45 define('COMM_GEN_N', 50);
48 define('CHAT_ILL_TIME', 6);
49 define('CHAT_ENABLED', TRUE);
51 define('SESS_LEN', 13);
52 define('STREAM_TIMEOUT', 60);
53 /* FIXME: move to sac-a-push .phh */
54 /* TIME_RD define the server-side timeout, after half of it a ping request
55 is sent to client, after this time the client is log out */
56 define('EXPIRE_TIME_RD', 180);
57 define('EXPIRE_TIME_SMAMMA', 360);
58 define('EXPIRE_TIME_WAG', 10);
59 define('WAKEUP_TIME', 12);
60 // BAN_TIME da allineare anche in commons.js
61 define('BAN_TIME', 3600);
62 define('GARBAGE_TIMEOUT', 5);
63 define('NICKSERV', "<i>BriskServ</i>");
65 define('LOCK_SHARE_MAX', 10000);
67 define('DBG_ONL2', 0x0001);
68 define('DBG_ONLY', 0x0002);
69 define('DBG_MAIN', 0x0004);
70 define('DBG_READ', 0x0008);
71 define('DBG_REA2', 0x0010);
72 define('DBG_SEND', 0x0020);
73 define('DBG_LOCK', 0x0040);
74 define('DBG_WRIT', 0x0080);
75 define('DBG_LOAD', 0x0100);
76 define('DBG_AUTH', 0x0200);
77 define('DBG_CRIT', 0x0400);
78 define('DBG_LMOP', 0x0800);
79 define('DBG_TRAC', 0x1000);
80 define('DBG_SHME', 0x2000);
81 define('DBG_ENGI', 0x4000);
82 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
83 define('BRISK_DEBUG', 0x0800);
85 define('BRISK_SINGLE_DEBUG',0);
86 define('BRISK_SINGLE_SESS', "");
87 define('DEBUGGING', "no-debugging");
89 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
91 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
92 'en' => 'back standing' ),
93 'btn_close' => array( 'it' => 'chiudi',
96 'tit_all' => array( 'it' => 'tutti',
99 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
100 'en' => '<br>You are being idle for ' ),
101 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
102 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
103 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
104 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
105 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
106 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
107 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
108 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
109 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
110 'en' => '<br>The entered password is not correct.<br><br>'),
111 'alarret' => array( 'it' => '"Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>."',
112 'en' => '"Alarm \\"<b>%s</b>\\" sent to <b>%s</b>."'),
113 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato.</b>',
114 'en' => '<b>To authenticate someone you have to be authenticated.</b>'), // on your turn
115 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
116 'en' => '<b>To send a message you have to be authenticated.</b>'),
117 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
118 'en' => 'The nickname have to contain at least one letter or one number.'),
119 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
120 'en' => 'The nickname <b>%s</b> is already in use.'),
121 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
122 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
123 'nickjust' => array( 'it' => 'Il nickname <b>\'%s\'</b> è già registrato, <b>se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghost<i>N</i>.</b>',
124 'en' => 'The nickname <b>\'%s\'</b> is already registered, <b>if its proprietary will authenticate you will named again officially ghost<i>N</i>.</b>'), // FIXME: him ???
125 'statunkn' => array( 'it' => 'Questo stato non esiste.',
126 'en' => 'This state don\'t exists.'),
127 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
128 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
129 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
130 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
132 'tit_onauth'=>array( 'it' => '(solo aut.)',
133 'en' => '(only aut.)'),
134 'tit_onisol'=>array( 'it' => '(isolam.to)',
135 'en' => '(isolation)'),
136 'db_failed' =>array('it' => '<br>Il collegamento al database è fallito.<br>Temporaneamente tutte le autenticazioni verranno sospese, accederai a Brisk come un utente normale.<br><br>Ci scusiamo per il disagio.',
137 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
139 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
140 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
141 'gua_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
142 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
143 'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
144 'en' => 'EN <b>%s</b> si è auto-garantito.'),
145 'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
146 'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
147 'gua_err' => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i><login></i></b>.',
148 'en' => 'Error %d. Usage: <b>/guar <i><login></i></b>.')
151 $G_lng = langtolng($G_lang);
153 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
154 $G_brisk_version = "4.14.2";
156 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
157 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: nuovo sistema di registrazione degli utenti, aggiunto reinvio dell\' email di verifica',
158 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
159 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: new users subscription system.',
160 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
162 $G_room_help = array( 'it' => '
163 <div style=\\"text-align: left; padding: 8px;\\">
164 <b>Descrizione</b><br>
165 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
166 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
167 <b>Configurazione del browser.</b><br>
168 Occorre abilitare i cookies.<br>
170 <b>Uso del sito</b><br>
171 Potete sedervi a un tavolo o rimanere in piedi.<br>
172 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
175 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
176 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
177 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
178 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
179 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
180 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
182 <dt><b>Comandi della chat</b>
183 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
184 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
185 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
186 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
187 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
188 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
189 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
190 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
196 <div style=\\"text-align: left; padding: 8px;\\">
197 <b>EN Descrizione</b><br>
198 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
199 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
200 <b>Configurazione del browser.</b><br>
201 Occorre abilitare i cookies.<br>
203 <b>Uso del sito</b><br>
204 Potete sedervi a un tavolo o rimanere in piedi.<br>
205 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
208 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
209 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
210 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
211 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
212 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
213 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
215 <dt><b>Comandi della chat</b>
216 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
217 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
218 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
219 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
220 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
221 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
222 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
223 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
229 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
230 <div style=\\"text-align: left; padding: 8px;\\">
231 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
233 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
234 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
236 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
237 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
238 <li>Smart card di InfoCamere
241 <b>Per auto-garantisi occorre possedere:</b><br><br>
243 <li>il codice PIN della propria carta
244 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
247 <b>Per effettuare la registrazione collegarsi al sito:</b><br><br>
249 <dd><a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
252 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
253 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.
258 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
259 <div style=\\"text-align: left; padding: 8px;\\">
260 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
262 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
263 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
265 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
266 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
269 <b>Per auto-garantisi occorre possedere:</b><br><br>
271 <li>il codice PIN della propria carta
272 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
275 <b>Per effettuare la registrazione collegarsi al sito:</b><br><br>
277 <dd><a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
280 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
281 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.
287 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
291 $G_room_about = array( 'it' => '<br>
292 <div id=\\"header\\" class=\\"header\\">
293 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
294 briscola chiamata in salsa ajax
296 <br><b>version '.$G_brisk_version.'</b><br><br>
297 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
299 <div id=\\"header\\" class=\\"header\\">
300 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
301 declaration briscola in ajax sauce <b>(Beta)</b>
303 <br><b>version '.$G_brisk_version.'</b><br><br>
304 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
307 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
310 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
311 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
312 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
313 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
314 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
315 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
316 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
317 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
318 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
319 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
320 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
321 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
322 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
323 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
324 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
325 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
326 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
327 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
328 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
330 // $G_PG_cons_n = count($G_PG_cons);
331 // printf("N CONS: %d\n", $G_PG_cons_n);
333 /* printf("%d %d\n", count($voc), count($cons)); */
334 /* for ($i = 0 ; $i < 26 ; $i++) { */
335 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
337 /* printf(' "%s", ', chr(ord('a') + $i)); */
338 /* for ($e = 0 ; $e < 26 ; $e++) { */
339 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
341 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
346 function passwd_gen($seed = NULL)
348 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
357 for ($sil = 0 ; $sil < 7 ; $sil++) {
358 if (($sil % 2) == 0) {
360 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
362 $old = mt_rand(0, $G_PG_vow_n-1);
363 $pw .= $G_PG_vow[$old];
366 $new = mt_rand(0, $G_PG_vow_n-1);
368 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
369 $pw .= $G_PG_vow[$new];
375 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
382 function cmd_return($val, $desc)
384 return array('val' => $val, 'desc' => $desc);
387 function cmd_serialize($attrs)
392 foreach ($attrs as $key => $value) {
393 $ret .= $sep . $key . '=' . urlencode($value);
399 function cmd_deserialize($cmd)
402 $a = explode('&', $cmd);
404 while ($i < count($a)) {
405 $b = split('=', $a[$i]);
406 $ret[urldecode($b[0])] = urldecode($b[1]);
417 function versions_cmp($v1, $v2)
419 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
423 $v1_ar = split('\.', $v1);
424 $v2_ar = split('\.', $v2);
426 $v2_ct = count($v2_ar);
428 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
429 if (($v2_ct - 1) < $i) {
432 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
433 if ($v1_ar[$i] != $v2_ar[$i]) {
434 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
443 function addrtoipv4($addr)
445 $ipv4addr_arr = explode(':' , $addr);
446 if (isset($ipv4addr_arr[3])) {
447 $ipv4addr = $ipv4addr_arr[3];
457 for ($i = 0; $i < ob_get_level(); $i++)
459 ob_implicit_flush(1);
463 function force_no_cache(&$header_out)
465 $header_out['Pragma'] = 'no-cache, must-revalidate';
466 $header_out['Cache-Control'] = 'no-cache';
467 $header_out['Expires'] = '-1';
470 function file_lock($fname, $is_exclusive)
472 if (($res = @fopen($fname, "r+")) == FALSE) {
476 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
484 function file_unlock($res)
487 flock($res, LOCK_UN);
492 $escpush_from = array("\\", "\"");
493 $escpush_to = array("\\\\", "\\\"");
496 GLOBAL $escpush_from, $escpush_to;
498 return str_replace($escpush_from, $escpush_to, $s);
501 $escinp_from = array( "\"" );
502 $escinp_to = array( """ );
504 function escinput($s)
506 GLOBAL $escinp_from, $escinp_to;
508 return str_replace($escinp_from, $escinp_to, $s);
513 return htmlentities($s, ENT_COMPAT, "UTF-8");
516 function esclfhtml($s)
518 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
521 function langtolng($lang)
525 return ($G_lang == 'en' ? '-en' : '');
528 function csplitter($in, $sep)
534 for ($i = 0 ; $i < strlen($in) ; $i++) {
535 $ini = substr($in, $i, 1);
539 else if ($ini == $sep) {
558 $from = array ( '\\', '@', '|' );
559 $to = array ( '\\\\', '@', '¦' );
561 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
566 $from = array ( '\\', '|', "\t", "\n");
567 $to = array ( '\\\\', '\\|', "\\t", "\\n");
569 return (str_replace($from, $to, $s));
572 function xcapemesg($s)
574 $from = array ( "\n");
575 $to = array ( "\\n");
577 return (str_replace($from, $to, $s));
587 function getbyid($idx)
589 return ($this->el[$idx]);
592 function setbyid($idx, $v)
594 $this->el[$idx] = $v;
603 var $auth_only; // se tavolo riservato o libero
610 var $table_start; // information field
618 function create($idx)
620 if (($thiz = new Table()) == FALSE)
624 $thiz->player = array();
626 $thiz->auth_only = FALSE;
632 $thiz->table_token = "";
633 $thiz->table_start = 0;
635 $thiz->wakeup_time = 0;
642 $this->idx = $from->idx;
643 $this->player = array();
644 for ($i = 0 ; $i < $from->player_n ; $i++)
645 $this->player[$i] = $from->player[$i];
646 $this->player_n = $from->player_n;
648 log_main("PLAYER_N - parent::copy.".$this->player_n);
650 $this->auth_only = $from->auth_only;
652 $this->wag_own = $from->wag_own;
653 $this->wag_com = $from->wag_com;
654 $this->wag_tout = $from->wag_tout;
656 $this->table_token = $from->table_token;
657 $this->table_start = $from->table_start;
659 $this->wakeup_time = $from->wakeup_time;
662 function myclone($from)
664 if (($thiz = new Table()) == FALSE)
672 function spawn($from)
674 if (($thiz = new Table()) == FALSE)
677 $thiz->idx = $from->idx;
678 $thiz->player = array();
679 for ($i = 0 ; $i < $from->player_n ; $i++)
680 $thiz->player[$i] = $i;
681 $thiz->player_n = $from->player_n;
683 $thiz->auth_only = $from->auth_only;
685 $thiz->wag_own = $from->wag_own;
686 $thiz->wag_com = $from->wag_com;
687 $thiz->wag_tout = $from->wag_tout;
689 $thiz->table_token = $from->table_token;
690 $thiz->table_start = $from->table_start;
692 $thiz->wakeup_time = $from->wakeup_time;
697 function wag_set($user_idx, $mesg)
701 $this->wag_own = $user_idx;
702 $this->wag_com = $mesg;
706 function wag_reset($timeout)
708 log_main("WAG_RESET");
710 unset($this->wag_own);
713 $this->wag_tout = $timeout;
716 function player_get($idx)
718 return ($this->player[$idx]);
721 function player_set($idx, $player)
723 $this->player[$idx] = $player;
726 function user_add($idx)
728 $this->player[$this->player_n] = $idx;
731 return ($this->player_n - 1);
734 function user_rem($brisk, $user)
736 $tabpos = $user->table_pos;
738 /* verifico la consistenza dei dati */
739 if ($brisk->user[$this->player[$tabpos]] == $user) {
741 /* aggiorna l'array dei giocatori al tavolo. */
742 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
743 $this->player[$i] = $this->player[$i+1];
744 $user_cur = $brisk->user[$this->player[$i]];
745 $user_cur->table_pos = $i;
750 log_main("INCONSISTENCY ON TABLE.");
754 // function act_content($isstanding, $sitted, $table, $cur_table, $allowed)
755 function act_content($user)
758 $isstanding = ($user->subst == 'standup');
759 $sitted = $this->player_n;
761 $cur_table = $user->table;
765 if ($sitted < PLAYERS_N) {
766 if ($this->auth_only) {
767 if ($user->flags & USER_FLAG_AUTH)
781 if ($table == $cur_table)
788 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
801 function Delay_Manager($triglevel)
803 $this->triglevel = $triglevel;
804 $this->delta = array();
805 $this->lastcheck = 0;
808 function delta_get($curtime)
810 // clean too old delta items
811 for ($i = 0 ; $i < count($this->delta) ; $i++) {
812 if ($this->delta[$i][0] < $curtime) {
813 array_splice($this->delta, $i, 1);
818 // add new delta items if delay exceeded $this->triglevel sec
819 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
820 $delta = $curtime - $this->lastcheck - $this->triglevel;
821 array_push($this->delta, array($curtime + $delta , $delta));
822 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
825 // extract the maximum valid delta
827 for ($i = 0 ; $i < count($this->delta) ; $i++) {
828 $delta_cur = $this->delta[$i][1];
829 if ($delta_max < $delta_cur)
830 $delta_max = $delta_cur;
833 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
838 function lastcheck_set($curtime)
840 $this->lastcheck = $curtime;
848 function Client_prefs()
852 static function from_user($user)
854 $thiz = new Client_prefs();
855 $thiz->user_load($user);
860 static function from_json($json)
862 $thiz = new Client_prefs();
863 if ($thiz->json_load($json) == FALSE) {
871 function user_load($user)
873 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
874 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
875 if ($user->rec != FALSE) {
876 $this->supp_comp = $user->rec->supp_comp_get();
879 $this->supp_comp = "000000000000";
882 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
885 function json_load($json_s)
890 if (gettype($json_s) == "string") {
891 if (($json = json_decode($json_s)) == FALSE)
897 if ($this->listen < 0 || $this->listen > 2)
899 $this->listen = $json->listen;
901 if (mb_strlen($json->supp_comp, "ASCII") != 12)
904 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
905 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
906 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
912 $this->supp_comp = $json->supp_comp;
919 function store($user, $is_save)
922 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
923 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
924 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
925 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
927 if ($user->is_supp_custom()) {
928 $user->rec->supp_comp_set($this->supp_comp);
931 $user->prefs_store();
940 var $crystal_filename;
944 var $comm; // commands for many people
945 var $step; // current step of the comm array
946 var $garbage_timeout;
951 public static $sess_cur;
953 function Brisk($crystal_filename) {
954 $this->crystal_filename = $crystal_filename;
955 $this->user = array();
956 $this->table = array();
957 $this->match = array();
959 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
960 $this->user[$i] = User::create($this, $i, "", "");
963 for ($i = 0 ; $i < TABLES_N ; $i++) {
964 $this->table[$i] = Table::create($i);
966 if ($i < TABLES_AUTH_N)
967 $this->table[$i]->auth_only = TRUE;
969 $this->table[$i]->auth_only = FALSE;
971 $this->garbage_timeout = 0;
972 $this->shm_sz = SHM_DIMS_MIN;
974 $this->delay_mgr = new Delay_Manager(1.5);
976 static::$sess_cur = FALSE;
979 function garbage_manager($force)
981 GLOBAL $G_lang, $mlang_brisk, $G_base;
985 log_rd2("garbage_manager START");
987 /* Garbage collector degli utenti in timeout */
988 $curtime = microtime(TRUE);
990 $delta = $this->delay_mgr->delta_get($curtime);
992 if (!$force && !($this->garbage_timeout < $curtime)) {
993 $this->delay_mgr->lastcheck_set($curtime);
997 // Before all align times with table timeout
998 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
999 $table_cur = $this->table[$table_idx];
1000 // if the table is complete and exists its shared mem we get the info about users lacc
1002 if ($table_cur->player_n == PLAYERS_N) {
1003 log_main("PLAYERS == N TABLE ".$table_idx);
1006 $no_recovery = FALSE;
1007 if (isset($this->match[$table_idx])) {
1008 $bin5 = $this->match[$table_idx];
1010 if ($table_cur->table_token != $bin5->table_token) {
1011 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1012 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1013 $no_recovery = TRUE;
1017 if ($bin5 != FALSE) {
1021 log_main("garbage_manager: bri loaded successfully.");
1022 $bin5->garbage_manager(TRUE);
1024 $bin5_table = $bin5->table[0];
1026 // is the end of the table
1028 if ($bin5->the_end == TRUE) {
1030 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1032 log_main("garbage_manager: INSIDE THE END.");
1034 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1035 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1036 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1039 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1040 // stat must be "table" by definition
1041 $user_cur = $this->user[$table_cur->player[$i]];
1042 $bin5_user = $bin5->user[$i];
1044 $user_cur->subst = $bin5_user->subst;
1045 $user_cur->step = $bin5_user->step;
1046 $user_cur->lacc = $bin5_user->lacc;
1047 $user_cur->laccwr = $bin5_user->lacc;
1048 $user_cur->bantime = $bin5_user->bantime;
1051 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1053 $this->room_join_wakeup($user_cur, FALSE, 0);
1054 $table_cur->table_token = "";
1055 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1057 $this->match_del($table_idx);
1060 log_main("gm:: save_data");
1062 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1063 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1066 } // if ($bin5 == FALSE
1067 else if ($no_recovery == FALSE) {
1068 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1070 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1071 $user_cur = $this->user[$table_cur->player[$i]];
1072 $user_cur->subst = "shutdowner";
1073 $user_cur->step_inc();
1075 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1076 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1077 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1078 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1079 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1080 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1081 $user_cur->step_inc();
1084 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1085 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1086 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1088 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1090 $this->room_join_wakeup($user_cur, TRUE, -2);
1091 $table_cur->table_token = "";
1094 } // if ($table_cur->player_n == PLAYERS_N) {
1095 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1097 log_rd2("out new loop.");
1099 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1100 $user_cur = $this->user[$i];
1102 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1104 if ($user_cur->sess == "")
1107 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1108 // Auto logout dell'utente
1109 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1111 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1112 log_auth($user_cur->sess, "Autologout session.");
1116 log_rd2("AUTO LOGOUT.");
1117 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1118 $this->room_wakeup($user_cur);
1119 else if ($user_cur->subst == 'standup')
1120 $this->room_outstandup($user_cur);
1122 log_rd2("LOGOUT FROM WHAT ???");
1126 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1127 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1128 $this->room_wakeup($user_cur);
1129 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1130 /* MLANG: <br>Sei stato inattivo per ".(EXPIRE_TIME_SMAMMA/60.0)." minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.", "torna ai tavoli" */
1131 $user_cur->comm[$user_cur->step % COMM_N] .= show_notify($mlang_brisk['tabtout_a'][$G_lang].(EXPIRE_TIME_SMAMMA/60.0).$mlang_brisk['tabtout_b'][$G_lang], 0, $mlang_brisk['btn_backstand'][$G_lang], 400, 100);
1132 $user_cur->step_inc();
1136 log_rd2("GARBAGE UPDATED!");
1138 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1141 $this->delay_mgr->lastcheck_set($curtime);
1145 function show_room($user_step, $user)
1147 GLOBAL $G_lang, $mlang_brisk;
1148 log_main("show_room: username: ".$user->name);
1150 $ret = sprintf('gst.st = %d; ', $user_step);
1152 $prefs = Client_prefs::from_user($user);
1153 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1156 if ($user->flags & USER_FLAG_ISOLAUTH) {
1157 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1159 else if ($user->flags & USER_FLAG_LISTAUTH) {
1160 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1163 $ret .= 'list_set(\'all\', false, \'\' ); ';
1167 if ($user->subst == 'standup')
1168 $ret .= "tra.show(); ";
1170 $ret .= "tra.hide(); ";
1172 $ret .= sprintf('stat = "%s";', $user->stat);
1174 $ret .= root_welcome($user);
1175 if ($user->flags & USER_FLAG_DBFAILED) {
1176 $ret .= "gst.st = ".($user->step+1)."; ";
1177 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1180 $ret .= sprintf('subst = "%s";', $user->subst);
1181 $ret .= $user->myname_innerHTML();
1183 for ($i = 0 ; $i < TABLES_N ; $i++) {
1185 $ret .= $this->table_content($user, $i);
1187 $ret .= $this->table[$i]->act_content($user);
1188 if ($this->table[$i]->wag_own != -1)
1189 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1191 $ret .= sprintf('tra.rem(%d); ', $i);
1193 $ret .= $this->standup_content($user);
1194 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1200 function room_wakeup($user)
1202 $table_idx = $user->table;
1203 $table = $this->table[$table_idx];
1205 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1209 $from_table = ($user->stat == "table");
1211 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1213 for ($i = 0 ; $i < $table->player_n ; $i++) {
1214 $user_cur = $this->user[$table->player[$i]];
1215 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1217 if ($user->idx_get() != $table->player[$i]) {
1218 $user_cur->stat_set("room");
1219 $user_cur->subst = "sitdown";
1220 $user_cur->laccwr = $curtime;
1222 else if ($user->sess != "") {
1223 $user_cur->stat_set("room");
1224 $user_cur->subst = "standup";
1225 $user_cur->laccwr = $curtime;
1226 $user_cur->table = -1;
1231 $user->stat_set("room");
1232 $user->subst = "standup";
1233 $user->laccwr = $curtime;
1236 $remove_wagon = FALSE;
1237 if($table->wag_own == $user->idx_get()) {
1238 $table->wag_reset($curtime);
1239 $remove_wagon = TRUE;
1243 /* aggiorna l'array dei giocatori al tavolo. */
1244 $table->user_rem($this, $user);
1246 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1247 $user_cur = $this->user[$i];
1248 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1251 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1253 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1254 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1255 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1256 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1257 log_main("DOCUMENT.index.php: from table");
1259 else if ($user_cur->stat == "room") {
1260 log_main("DOCUMENT.index.php: from table");
1262 $ret .= $this->table_content($user_cur, $table_idx);
1263 $ret .= $this->standup_content($user_cur);
1265 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1266 $ret .= $table->act_content($user);
1268 if ($user->idx_get() == $i) {
1269 // set the new status
1270 $ret .= 'subst = "standup"; tra.show(); ';
1271 // clean the action buttons in other tables
1272 for ($e = 0 ; $e < TABLES_N ; $e++) {
1273 if ($this->table[$e]->player_n < PLAYERS_N) {
1274 $ret .= $this->table[$e]->act_content($user);
1279 $ret .= $table->act_content($user_cur);
1282 log_wr("ROOM_WAKEUP: ".$ret);
1283 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1284 $user_cur->step_inc();
1288 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1290 $table_idx = $user->table;
1291 $table = $this->table[$table_idx];
1293 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1296 $user_wup = array();
1298 $user_tab = array();
1300 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1302 for ($i = 0 ; $i < $table->player_n ; $i++) {
1303 $user_cur = $this->user[$table->player[$i]];
1304 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1305 if ($user_cur->sess != "") {
1306 if ($update_lacc == TRUE) {
1307 $user_cur->laccwr = $curtime;
1309 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1310 if ($user_cur->subst == "shutdowned") {
1311 $user_cur->stat_set("room");
1312 $user_cur->subst = "sitdown";
1314 else if ($user_cur->subst == "shutdowner") {
1315 $user_cur->stat_set("room");
1316 $user_cur->subst = "standup";
1317 $user_cur->table = -1;
1318 $user_wup[$user_wup_n++] = $user_cur;
1320 $remove_wagon = FALSE;
1321 if($table->wag_own == $table->player[$i]) {
1322 $remove_wagon = TRUE;
1323 $table->wag_reset($curtime);
1326 $user_tab[$user_tab_n++] = $table->player[$i];
1330 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1331 $table->user_rem($this, $user_wup[$wup_idx]);
1333 /* aggiorna l'array dei giocatori al tavolo. */
1335 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1336 log_main("START LOOP");
1337 $user_cur = $this->user[$i];
1338 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1339 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1344 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1346 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1347 if ($user_cur->stat == "room") {
1348 log_main("DOCUMENT.index.php from table");
1350 $ret .= $this->table_content($user_cur, $table_idx);
1351 $ret .= $this->standup_content($user_cur);
1353 $ret .= $table->act_content($user_cur);
1356 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1357 if ($user_tab[$tab_idx] == $i)
1360 // for users that wakeup the room will be reconstructed by index_rd.php
1361 if ($tab_idx < $user_tab_n) {
1362 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1364 // ARRAY_POP DISABLED
1365 // if ($trans_delta == 0)
1366 // while (array_pop($user_cur->comm) != NULL);
1368 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1369 $user_cur->comm[$user_cur->step % COMM_N] = "";
1370 $user_cur->step_inc();
1371 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1372 $user_cur->step_inc();
1373 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1377 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1379 log_main("JOIN_WAKEUP more");
1381 $ret .= $table->act_content($user_cur);
1383 log_main("JOIN_WAKEUP end more");
1385 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1386 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1387 $user_cur->step_inc();
1391 function guarantee_show($user, $user_login, $dt)
1393 GLOBAL $G_lang, $mlang_brisk, $G_base;
1399 if ($user_login == "") {
1403 if (($bdb = BriskDB::create()) == FALSE) {
1407 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1411 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1412 $guar_login = $guar_item->login_get();
1417 $user_tos_vers = $user_item->tos_vers_get();
1419 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1420 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1421 $dt, NICKSERV, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1423 else if ($guar_login == "") {
1424 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1425 $dt, NICKSERV, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1427 else if ($guar_login == $user_login) {
1428 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1429 $dt, NICKSERV, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1432 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1433 $dt, NICKSERV, sprintf($mlang_brisk['gua_info'][$G_lang],
1434 xcape($user_login), xcape($guar_login)));
1439 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1442 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1448 function room_outstandup($user)
1450 $this->room_sitdown($user, -1);
1453 function table_update($user)
1455 log_main("table_update: pre - USER: ".$user->name);
1457 $table_idx = $user->table;
1459 if ($table_idx > -1)
1460 $table = $this->table[$table_idx];
1462 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1464 $user_cur = $this->user[$i];
1465 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1468 $ret = "gst.st = ".($user_cur->step+1)."; ";
1469 if ($table_idx > -1)
1470 $ret .= $this->table_content($user_cur, $table_idx);
1472 if ($user->idx_get() == $i) {
1473 $ret .= $user->myname_innerHTML();
1475 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1476 $user_cur->step_inc();
1479 log_main("table_update: post");
1482 function room_sitdown($user, $table_idx)
1484 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1488 if ($table_idx > -1 && $table_idx < TABLES_N) {
1489 $table = $this->table[$table_idx];
1492 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1493 for ($i = 0 ; $i < TABLES_N ; $i++) {
1494 if ($table->wag_own == $table->player[$i]) {
1495 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1496 $table->wag_reset(time());
1503 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1505 $user_cur = $this->user[$i];
1506 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1509 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1510 if ($table_idx > -1)
1511 $ret .= $this->table_content($user_cur, $table_idx);
1512 $ret .= $this->standup_content($user_cur);
1514 if ($user->idx_get() == $i) {
1515 $ret .= 'subst = "sitdown"; tra.hide(); ';
1516 // clean the action buttons in other tables
1517 for ($e = 0 ; $e < TABLES_N ; $e++) {
1518 $ret .= $this->table[$e]->act_content($user_cur);
1521 else if ($table_idx > -1) {
1522 if ($table->player_n == PLAYERS_N) {
1524 $ret .= $table->act_content($user_cur);
1527 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1528 $user_cur->step_inc();
1532 function chatt_send($user, $mesg)
1534 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1538 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1540 $dt = date("H:i ", $curtime);
1551 $is_normchat = FALSE;
1552 /* for old isolation management $is_ticker = FALSE; */
1553 $update_room = FALSE;
1555 if (strcmp($msg, "/tav") == 0 ||
1556 strncmp($msg, "/tav ", 5) == 0) {
1558 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1559 /* MLANG: "<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>", "<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>", "<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>" */
1560 $msg = $mlang_brisk['tickmust'][$G_lang];
1561 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1566 $table = $this->table[$user->table];
1568 if ($table->wag_own != -1) {
1569 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1570 $msg = $mlang_brisk['tickjust'][$G_lang];
1571 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1576 $dtime = $curtime - $table->wag_tout;
1577 if ($dtime < EXPIRE_TIME_WAG) {
1578 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1579 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1580 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1581 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1586 $msg = substr($msg, 5);
1588 $table->wag_set($user->idx_get(), $msg);
1589 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1590 $to_room = $to_user;
1591 /* for old isolation management $is_ticker = TRUE; */
1593 } // /tav chat command
1595 else if (strncmp($msg, "/alarm ", 7) == 0) {
1596 if (strncmp($msg, "/alarm to ", 10) == 0) {
1597 $sp_pos = strpos($msg, " ", 10);
1598 $target = substr($msg, 10, $sp_pos - 10);
1599 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1603 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1606 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1607 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1608 $msg = $mlang_brisk['alarpass'][$G_lang];
1609 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1614 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1615 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1616 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1617 $to_user = sprintf('chatt_sub("%s", [2, "%s"],%s);',
1618 $dt, NICKSERV, $prestr);
1620 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1621 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1622 /* MLANG: "chiudi" */
1623 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1625 } // /alarm chat command
1626 else if (strncmp($msg, "/listen ", 8) == 0) {
1627 $arg = substr($msg, 8);
1629 if (strcasecmp($arg, "isolation") == 0) {
1631 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1632 $user->table >= TABLES_AUTH_N) {
1633 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]);
1637 $user->flags &= ~USER_FLAG_MAP_AUTH;
1638 $user->flags |= USER_FLAG_ISOLAUTH;
1639 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1642 else if (strcasecmp($arg, "auth") == 0) {
1643 $flags_old = $user->flags;
1644 $user->flags &= ~USER_FLAG_MAP_AUTH;
1645 $user->flags |= USER_FLAG_LISTAUTH;
1646 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1649 $flags_old = $user->flags;
1650 $user->flags &= ~USER_FLAG_MAP_AUTH;
1651 $to_user = 'list_set(\'all\', true, \'\'); ';
1654 // if from isolation redraw standup area
1655 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1656 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1660 else if (strcmp($msg, "/authreq") == 0) {
1661 if ($user->flags & USER_FLAG_AUTH) {
1662 $to_user = sprintf('authbox(300,200);');
1665 /* MLANG: "<b>Per autenticare qualcuno devi a tua volta essere autenticato.</b>", "Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.", "Nickname <b>%s</b> già in uso." */
1666 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]);
1669 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1670 if ($user->flags & USER_FLAG_AUTH) {
1671 $to_user = sprintf('mesgtoadmbox(500,300);');
1674 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1675 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]);
1678 else if (strncmp($msg, "/nick ", 6) == 0) {
1679 log_main("chatt_send BEGIN");
1682 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1683 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
1687 $msg = "COMMAND ".$msg;
1688 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1689 $user_cur = $this->user[$i];
1691 if ($user_cur->sess == '')
1693 if (strcasecmp($user_cur->name,$name_new) == 0)
1696 if ($i < MAX_PLAYERS) {
1697 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1698 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1702 /* MLANG: "<b>Non puoi cambiare nick a un tavolo per soli autenticati.</b>", "Il nickname <b>\'%s\'</b> è già registrato, <b>se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghost<i>N</i>.</b>" */
1703 if ($user->flags & USER_FLAG_AUTH) {
1704 if (strcasecmp($user->name,$name_new) != 0) {
1705 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1706 ($user->subst == 'standup' ||
1707 ($user->subst != 'standup' && $this->table[$user->table]->auth_only == FALSE)
1710 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1711 for ($i = 0 ; $i < TABLES_N ; $i++) {
1712 $to_user .= $this->table[$i]->act_content($user);
1716 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
1721 $user->name = $name_new; // OK - nick changed
1722 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1723 if (($user->flags & USER_FLAG_AUTH) == 0) {
1724 if (($bdb = BriskDB::create()) != FALSE) {
1726 /* MLANG: "Il nickname <b>\'%s\'</b> è già registrato, <b>se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghost<i>N</i>.</b>" */
1727 if ($bdb->login_exists($name_new)) {
1728 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1729 $to_user .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1734 log_main("chatt_send start set");
1736 $update_room = TRUE;
1738 } // nick chat command
1739 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1740 $guar_user = substr($msg, 6);
1742 $this->guarantee_show($user, $guar_user, $dt);
1744 else if (strncmp($msg, "/st ", 4) == 0) {
1745 log_main("chatt_send BEGIN");
1748 $st_str = substr($msg, 4);
1750 if (strcasecmp($st_str, "normale") == 0) {
1751 $st = USER_FLAG_S_NORM;
1753 else if (strcasecmp($st_str, "pausa") == 0) {
1754 $st = USER_FLAG_S_PAU;
1756 else if (strcasecmp($st_str, "fuori") == 0) {
1757 $st = USER_FLAG_S_OUT;
1759 else if (strcasecmp($st_str, "cane") == 0) {
1760 $st = USER_FLAG_S_DOG;
1762 else if (strcasecmp($st_str, "cibo") == 0) {
1763 $st = USER_FLAG_S_EAT;
1765 else if (strcasecmp($st_str, "lavoro") == 0) {
1766 $st = USER_FLAG_S_WRK;
1768 else if (strcasecmp($st_str, "sigaretta") == 0) {
1769 $st = USER_FLAG_S_SMK;
1771 else if (strcasecmp($st_str, "presente") == 0) {
1772 $st = USER_FLAG_S_EYE;
1774 else if (strcasecmp($st_str, "coniglio") == 0) {
1775 $st = USER_FLAG_S_RABB;
1777 else if (strcasecmp($st_str, "calcio") == 0) {
1778 $st = USER_FLAG_S_SOCC;
1780 else if (strcasecmp($st_str, "pupo") == 0) {
1781 $st = USER_FLAG_S_BABY;
1783 else if (strcasecmp($st_str, "pulizie") == 0) {
1784 $st = USER_FLAG_S_MOP;
1786 else if (strcasecmp($st_str, "babbo") == 0) {
1787 $st = USER_FLAG_S_BABBO;
1789 else if (strcasecmp($st_str, "renna") == 0) {
1790 $st = USER_FLAG_S_RENNA;
1792 else if (strcasecmp($st_str, "pupazzo") == 0) {
1793 $st = USER_FLAG_S_PUPAZ;
1795 else if (strcasecmp($st_str, "vischio") == 0) {
1796 $st = USER_FLAG_S_VISCH;
1799 /* MLANG: "Questo stato non esiste." */
1800 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]);
1804 log_main("chatt_send start set");
1805 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1806 $update_room = TRUE;
1807 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1810 } // nick chat command
1812 else { // normal chat line
1813 $is_normchat = TRUE;
1814 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1816 $user->chat_dlt = $user->chat_dlt * 2;
1817 if ($user->chat_dlt > 120)
1818 $user->chat_dlt = 120;
1820 else if ($user->chat_lst == $msg)
1822 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
1823 $user->chat_ban = $curtime;
1824 $user->chat_dlt = 5;
1828 $user->chat_ban = 0;
1829 $user->chat_dlt = 0;
1833 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
1836 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
1837 // temporary silentiation for troll (will became array check)
1838 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
1839 $to_room = $to_user;
1842 log_legal($curtime, $user->ip, $user,
1843 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
1845 $user->chat_lst = "$msg";
1846 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
1856 // Output to clients
1859 if ($to_user != FALSE) {
1860 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
1861 $user->comm[$user->step % COMM_N] .= $to_user;
1865 if ($to_room != FALSE) {
1866 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1867 $user_cur = $this->user[$i];
1868 if ($target != "" && $user_cur->name != $target)
1870 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
1873 if ($is_normchat == TRUE) {
1874 // use MAP_AUTH to check if auth or isolation
1875 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
1876 if (($user->flags & USER_FLAG_AUTH) == 0) {
1882 else if ($is_ticker) {
1883 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
1884 if ($user->table >= TABLES_AUTH_N)
1889 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1890 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
1891 $user_cur->step_inc();
1896 // FIXME BRISK4: include for each kind of table
1897 require_once("${G_base}briskin5/Obj/briskin5.phh");
1898 // Before all align times with table timeout
1899 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1900 if (isset($this->match[$table_idx])) {
1901 $bin5 = $this->match[$table_idx];
1903 $bin5_table = $bin5->table[0];
1904 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1905 // stat must be "table" by definition
1906 $bin5_user = $bin5->user[$i];
1908 if ($target != "" && $bin5_user->name != $target)
1910 log_main("writa: ".$user_mesg);
1911 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
1912 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
1913 $bin5_user->step_inc();
1915 } // if (isset($this->match
1916 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1917 } // if ($to_tabl == true ...
1920 if ($user->stat == 'room' && $user->subst == 'standup') {
1921 $this->standup_update($user);
1923 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
1924 log_main("chatt_send pre table update");
1925 $this->table_update($user);
1926 log_main("chatt_send post table update");
1928 } // if ($update_room ...
1931 } // function chatt_send( ...
1933 function get_user($sess, &$idx)
1937 if (validate_sess($sess)) {
1938 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1939 if (strcmp($sess, $this->user[$i]->sess) == 0) {
1942 $ret = $this->user[$i];
1946 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
1947 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
1948 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
1951 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
1958 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
1961 * if ($idx > -1 && ret == FALSE) => duplicated nick
1962 * if ($idx == -2 && ret == FALSE) => invalid name
1963 * if ($idx == -3 && ret == FALSE) => wrong password
1964 * if ($idx == -1 && ret == FALSE) => no space left
1965 * if ($idx == 0 && ret == user) => SUCCESS
1966 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
1969 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
1975 $authenticate = FALSE;
1977 $login_exists = FALSE;
1979 $ghost_auth = FALSE;
1984 if (($name_new = validate_name($name)) == FALSE) {
1989 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
1990 if (validate_sess($sess) == FALSE)
1993 /* if pass != FALSE verify the login with pass */
1994 log_auth("XXX", "auth1");
1996 if (($bdb = BriskDB::create()) != FALSE) {
1998 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
1999 log_auth("XXX", "auth2");
2000 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2001 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2003 if ($authenticate != FALSE) {
2004 $user_type = $authenticate->type_get();
2012 $login_exists = $bdb->login_exists($name_new);
2016 // if db is down, send a warning and verify only current users
2017 // no actions at this moment
2019 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2021 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2025 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2027 continue; // NOTE: CHECK IT !!
2029 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2030 if ($authenticate != FALSE) {
2032 $ghost_auth = ($this->user[$i]->flags & USER_FLAG_AUTH);
2043 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2045 /* there is another user logged with your account and you and him have authenticated => new user
2046 get the session of the old user */
2047 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2050 $ghost_user = $this->user[$ghost];
2052 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2053 $ghost_user->step_inc();
2056 $ghost_user->sess = $sess;
2059 $ghost_user->sess = $sess;
2062 // If user at the table we need to update the table data too
2063 $table_idx = $ghost_user->table;
2064 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2065 require_once("${G_base}briskin5/Obj/briskin5.phh");
2066 if (isset($this->match[$table_idx])) {
2067 $bin5 = $this->match[$table_idx];
2069 if ($bin5->the_end != TRUE) {
2070 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2071 $bin5->user[$ghost_user->table_pos]->step_inc();
2072 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2078 return ($this->user[$ghost]);
2080 else if ($idx != -1 && $i == MAX_PLAYERS) {
2085 $this->user[$idx]->sess = $sess;
2088 $this->user[$idx]->sess = $sess;
2090 $this->user[$idx]->name = $name_new; // OK - add new user
2091 $this->user[$idx]->stat_set("room");
2092 $this->user[$idx]->step_set(0);
2093 while (array_pop($this->user[$idx]->comm) != NULL);
2094 $this->user[$idx]->subst = "standup";
2095 $this->user[$idx]->lacc = $curtime;
2096 $this->user[$idx]->laccwr = $curtime;
2097 $this->user[$idx]->bantime = 0;
2098 $this->user[$idx]->ip = $ip;
2100 $this->user[$idx]->rec = $authenticate;
2101 fprintf(STDERR, "MOP: [%s]\n", $authenticate->supp_comp);
2102 $this->user[$idx]->flags = $user_type;
2103 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2104 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2105 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2107 if ($authenticate != FALSE) {
2108 $this->user[$idx]->code = $authenticate->code_get();
2110 // all this part is included in the db server
2111 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2113 if (isset($cookie['CO_list'])) {
2114 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2115 if (strcmp($cookie['CO_list'], "auth") == 0) {
2116 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2117 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2119 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2120 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2121 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2124 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2129 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2132 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2134 log_main("ghost: rename!");
2135 $ghost_user = $this->user[$ghost];
2137 if ($ghost_auth == FALSE) {
2138 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2139 $ghostname = 'ghost'.$sfx;
2140 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2141 if (strcmp("", $this->user[$i]->sess) == 0)
2144 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2149 if ($ghostname != '')
2153 $ghost_user->name = $ghostname;
2155 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2156 $this->standup_update($ghost_user);
2159 log_main("chatt_send pre table update");
2160 $this->table_update($ghost_user);
2161 log_main("chatt_send post table update");
2163 } // if ($ghost_auth == FALSE
2165 // FIXME: cacciare il vecchio utente room && table (if needed)
2166 $ghost_user->the_end = TRUE;
2167 $ghost_user->lacc = 0;
2168 $this->garbage_manager(TRUE);
2170 } // if ($ghost > -1) {
2175 log_main(sprintf("TROVATO LIBERO A [%d] sess [%s] name [%s] count [%d] name [%s] code [%s]", $idx, $sess, $name_new, count($this->user),$this->user[$real_idx]->name, $this->user[$real_idx]->code));
2177 $ret = $this->user[$real_idx];
2184 function standup_update($user)
2186 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2187 $user_cur = $this->user[$i];
2188 if ($user_cur->sess == '')
2191 log_main("STANDUP START: ".$user_cur->stat);
2193 if ($user_cur->stat == 'room') {
2194 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2195 if ($user->idx_get() == $i) {
2196 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2198 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2200 $user_cur->step_inc();
2206 static function create($crystal_filename)
2208 if (($brisk_ser = @file_get_contents($crystal_filename)) == FALSE ||
2209 ($brisk = unserialize($brisk_ser)) == FALSE) {
2210 fprintf(STDERR, "NEW ROOM\n");
2211 $brisk = new Brisk($crystal_filename);
2214 fprintf(STDERR, "ROOM FROM FILE\n");
2215 rename($crystal_filename, $crystal_filename.".old");
2222 function load_data()
2227 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) {
2228 log_main("ftok failed");
2232 if (($shm_sz = sharedmem_sz($tok)) == -1) {
2233 log_main("shmop_open failed");
2237 $shm_sz = SHM_DIMS_MIN;
2239 if ($shm = shm_attach($tok, $shm_sz)) {
2240 $brisk = @shm_get_var($shm, $tok); // CHECKED BELOW
2242 log_only("bri == ".($brisk == FALSE ? "FALSE" : "TRUE")." bri === ".($brisk === FALSE ? "FALSE" : "TRUE")." bri isset ".(isset($brisk) ? "TRUE" : "FALSE"));
2244 log_only("bri count ".count($brisk));
2246 if ($brisk == FALSE) {
2247 log_only("INIT MAIN DATA");
2250 $brisk = Brisk::create();
2252 log_shme("Brisk::create");
2254 if (Brisk::save_data($brisk) == FALSE)
2259 $brisk->shm_sz = $shm_sz;
2263 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2264 if (($brisk->user[$i] = User::load_data($i, FALSE)) == FALSE) {
2265 log_crit("User::load_data failed");
2269 if ($i < MAX_PLAYERS) {
2275 // SHSPLIT: load users from the shared memory
2284 function save_data_orig($brisk)
2290 // var_dump($brisk);
2292 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2295 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2296 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2299 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2300 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2304 if (shm_remove($shm) === FALSE) {
2305 log_only("REMOVE FALLITA");
2309 $brisk->shm_sz += SHM_DIMS_DLT;
2317 function dump_data()
2319 $brisk_ser = serialize($this);
2320 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2321 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2328 function save_data($brisk)
2335 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2338 // SHSPLIT: before save the $brisk you must save users,
2339 // detach from main struct and (then) reattach
2340 $user_park = array();
2341 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2342 $user_park[$i] = $brisk->user[$i];
2343 $brisk->user[$i] = FALSE;
2346 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2347 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2350 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2351 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2352 log_shme("Brisk::save_data");
2356 if (shm_remove($shm) === FALSE) {
2357 log_only("REMOVE FALLITA");
2361 $brisk->shm_sz += SHM_DIMS_DLT;
2367 // SHSPLIT: reattach users to the room class
2368 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2369 User::save_data($user_park[$i], $i);
2370 $brisk->user[$i] = $user_park[$i];
2372 log_load("FINISH: ".($ret == TRUE ? "TRUE" : "FALSE"));
2377 static function lock_data($is_exclusive)
2379 if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) {
2380 self::$delta_t = microtime(TRUE);
2381 log_lock("LOCK room [".self::$delta_t."]");
2389 static function unlock_data($res)
2393 log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]");
2399 function standup_content($user)
2404 if ($user->stat != 'room')
2407 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2408 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2413 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2415 $content = ' j_stand_cont( [ ';
2417 $user_cur_id = $user->idx_get();
2418 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2419 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2422 $flags = $this->user[$i]->flags;
2424 // sql record exists AND last donate > 2013-01-01
2425 if ($this->user[$i]->is_supp_custom()) {
2426 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2432 if ($this->user[$i]->subst == "standup") {
2433 if ($user_cur_id == $i) {
2437 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2438 xcape($this->user[$i]->name), $supp_comp_s);
2447 function table_content($user, $table_idx)
2453 // Si possono usare i dati nella classe table
2456 $sess = $user->sess;
2457 $table = $this->table[$table_idx];
2459 if ($user->stat != 'room')
2462 $user_cur_id = $user->idx_get();
2464 for ($i = 0 ; $i < $table->player_n ; $i++) {
2465 $user_cur = $this->user[$table->player[$i]];
2467 $flags = $user_cur->flags;
2469 if ($user_cur_id == $table->player[$i])
2472 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2473 if ($user_cur->is_supp_custom())
2474 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2478 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2479 xcape($user_cur->name), $supp_comp_s);
2484 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2489 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2491 GLOBAL $G_black_list;
2493 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2495 $enc = get_encoding($header);
2496 if (isset($header['User-Agent'])) {
2497 if (strstr($header['User-Agent'], "MSIE")) {
2498 $transp_type = "htmlfile";
2501 $transp_type = "xhr";
2505 $transp_type = "iframe";
2507 force_no_cache($header_out);
2513 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2514 $content = ob_get_contents();
2517 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2518 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2522 case "index_wr.php":
2524 // Enhance required: in the POST case, after the header you must get content
2525 // from the socket, waiting if necessary
2529 index_wr_main($this, $addr, $get, $post, $cookie);
2530 $content = ob_get_contents();
2533 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2537 case "index_rd.php":
2538 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2540 if ($transp == 'websocket')
2544 if (!isset($cookie['sess'])
2545 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2547 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2549 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2554 $this->sess_cur_set($user->sess);
2555 // close a previous opened index_read_ifra socket, if exists
2556 if (($prev = $user->rd_socket_get()) != NULL) {
2557 $s_a_p->socks_unset($user->rd_socket_get());
2558 fclose($user->rd_socket_get());
2559 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2560 $user->rd_socket_set(NULL);
2564 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2565 $response = headers_render($header_out, -1).$user->chunked_content($content);
2566 $response_l = mb_strlen($response, "ASCII");
2568 $wret = @fwrite($new_socket, $response, $response_l);
2569 if ($wret < $response_l) {
2570 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2571 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2574 $user->rd_cache_set("");
2576 fflush($new_socket);
2579 $s_a_p->socks_set($new_socket, $user, NULL);
2580 $user->rd_socket_set($new_socket);
2581 printf(" - qui ci siamo - ");
2588 if (!(BRISK_DEBUG & DBG_ENGI))
2590 fprintf(STDERR, "TEST.PHP running\n");
2591 if (isset($post['data'])) {
2592 $content = $post['data'];
2595 $content = "NO DATA AVAILABLE";
2597 $header_out['Content-Type'] = 'text/plain';
2598 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2602 /* FAR TODO: move all into an array of registered sub-apps */
2603 $subs = "briskin5/";
2604 $subs_l = strlen($subs);
2605 if (!strncmp($path, $subs, $subs_l)) {
2606 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2615 function match_add($idx, $match)
2617 $this->match[$idx] = $match;
2620 function match_del($idx)
2622 unset($this->match[$idx]);
2625 function match_get($idx, $token)
2627 if (isset($this->match[$idx])) {
2629 || $token == $this->match[$idx]->table_token) {
2630 return ($this->match[$idx]);
2635 function sess_cur_set($sess)
2637 static::$sess_cur = $sess;
2640 static function sess_cur_get()
2642 return(static::$sess_cur);
2644 } // end class Brisk
2646 function make_seed()
2648 list($usec, $sec) = explode(' ', microtime());
2649 return (float) $sec + ((float) $usec * 100000);
2652 function btrace_line($ar)
2654 GLOBAL $G_btrace_pref_sub;
2657 for ($i = 0 ; $i < count($ar) ; $i++) {
2658 $with_class = isset($ar[$i]['class']);
2659 $with_file = isset($ar[$i]['file']);
2660 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2661 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2662 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2663 ($with_file ? $ar[$i]['line'] : ""));
2669 function trace_ftok($id, $add)
2671 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2672 $tok=@ftok($id, $add);
2674 log_shme($tok.": ".$id." + ".$add);
2679 function log_mop($step, $log)
2683 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2686 $sess = Brisk::sess_cur_get();
2687 if (isset($sess) == FALSE)
2692 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2695 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2696 $btrace = btrace_line(debug_backtrace());
2699 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2700 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2706 function log_only2($log)
2710 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2713 $sess = Brisk::sess_cur_get();
2714 if (isset($sess) == FALSE)
2719 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2722 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2723 $btrace = btrace_line(debug_backtrace());
2726 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2727 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2732 function log_crit($log)
2736 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2739 $sess = Brisk::sess_cur_get();
2740 if (isset($sess) == FALSE)
2745 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2748 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2749 $btrace = btrace_line(debug_backtrace());
2752 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2753 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2758 function log_only($log)
2762 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2765 $sess = Brisk::sess_cur_get();
2766 if (isset($sess) == FALSE)
2771 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2774 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2775 $btrace = btrace_line(debug_backtrace());
2778 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2779 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2784 function log_main($log)
2788 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2791 $sess = Brisk::sess_cur_get();
2792 if (isset($sess) == FALSE)
2797 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2800 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2801 $btrace = btrace_line(debug_backtrace());
2804 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2805 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2810 function log_rd($log)
2814 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2817 $sess = Brisk::sess_cur_get();
2818 if (isset($sess) == FALSE)
2823 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2826 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2827 $btrace = btrace_line(debug_backtrace());
2830 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2831 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2836 function log_rd2($log)
2840 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2843 $sess = Brisk::sess_cur_get();
2844 if (isset($sess) == FALSE)
2849 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2852 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2853 $btrace = btrace_line(debug_backtrace());
2857 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2858 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2863 function log_send($log)
2867 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2870 $sess = Brisk::sess_cur_get();
2871 if (isset($sess) == FALSE)
2876 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2879 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2880 $btrace = btrace_line(debug_backtrace());
2883 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2884 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2889 function log_lock($log)
2893 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2896 $sess = Brisk::sess_cur_get();
2897 if (isset($sess) == FALSE)
2902 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2905 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2906 $btrace = btrace_line(debug_backtrace());
2909 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2910 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2915 function log_wr($log)
2919 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2922 $sess = Brisk::sess_cur_get();
2923 if (isset($sess) == FALSE)
2928 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2931 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2932 $btrace = btrace_line(debug_backtrace());
2935 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2936 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2941 function log_load($log)
2945 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2948 $sess = Brisk::sess_cur_get();
2949 if (isset($sess) == FALSE)
2954 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2957 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2958 $btrace = btrace_line(debug_backtrace());
2961 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2962 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2967 function log_auth($sess, $log)
2971 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2974 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
2977 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2978 $btrace = btrace_line(debug_backtrace());
2981 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2982 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
2987 function log_shme($log)
2991 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
2994 $sess = Brisk::sess_cur_get();
2995 if (isset($sess) == FALSE)
3000 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3003 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3004 $btrace = btrace_line(debug_backtrace());
3007 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3008 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3015 // function log_legal($curtime, $sess, $name, $where, $mesg)
3016 function log_legal($curtime, $addr, $user, $where, $mesg)
3019 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3020 /* Unix time | session | nickname | IP | where was | mesg */
3021 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3022 ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'),
3023 $user->name, $addr, $where , $mesg));
3028 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3033 if ($sitted < PLAYERS_N) {
3041 if ($table == $cur_table)
3048 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3053 function show_notify($text, $tout, $butt, $w, $h)
3055 log_main("SHOW_NOTIFY: ".$text);
3056 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3059 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3061 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3062 return sprintf('var noti = new notify_ex(gst,"%s",%d,"%s",%d,%d, %s, %d);', $text, $tout, $butt, $w, $h, ($is_opaque ? "true" : "false"), $block_time);
3065 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3067 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3070 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3071 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3074 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3075 escpush($text), $tout, $butts, ($confirm_func == NULL ? "null" : $confirm_func), (($confirm_func == NULL|| $confirm_func_args == NULL) ? "[]" : $confirm_func_args), $w, $h, ($is_opaque ? "true" : "false"), $block_time);
3079 function root_welcome($user)
3081 GLOBAL $root_wellarr, $G_lang;
3085 $dt = date("H:i ", $curtime);
3087 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3088 $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3095 function validate_sess($sess)
3097 if (strlen($sess) == SESS_LEN)
3103 function validate_name($name)
3105 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3107 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3109 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3116 function playsound($filename)
3118 return (sprintf('playsound("flasou", "%s");', $filename));
3121 function secstoword($secs)
3127 $mins = floor($secs / 60);
3129 if ($G_lang == 'en') {
3131 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3134 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3138 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3141 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3146 function sharedmem_sz($tok)
3148 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3149 log_main("shmop_open failed");
3152 $shm_sz = shmop_size($shm_id);
3153 shmop_close($shm_id);
3155 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3162 static function lock_data($is_exclusive)
3164 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3165 self::$delta_t = microtime(TRUE);
3166 log_lock("LOCK warrant [".self::$delta_t."]");
3174 static function unlock_data($res)
3178 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3187 static function lock_data($is_exclusive)
3189 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3190 self::$delta_t = microtime(TRUE);
3191 log_lock("LOCK poll [".self::$delta_t."]");
3199 static function unlock_data($res)
3203 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3209 function carousel_top()
3214 return (sprintf('<a target="_blank" href="http://shop.alternativeoutput.it"><img class="nobo" style="display: inline; border: 1px solid #808080;" alt="il negozio virtuale di Brisk" title="il negozio virtuale di Brisk" src="img/briskshop%d.gif"></a>', $rn));
3217 return (sprintf('<a target="_blank" href="http://www.alternativeoutput.it/briskblog"><img class="nobo" alt="il nuovo blog di Brisk" title="il nuovo blog di Brisk" style="display: inline; border: 1px solid #808080;" src="img/briskblog_bannersmall.png"></a>'));