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', 4);
32 define('PLAYERS_N', 3);
33 define('MAX_POINTS', 5);
34 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
35 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
36 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
37 define('SHM_DIMS_DLT', 65536);
39 define('SHM_DIMS_U_MIN', 4096);
40 define('SHM_DIMS_U_MAX', 65536);
41 define('SHM_DIMS_U_DLT', 4096);
44 define('COMM_GEN_N', 50);
47 define('CHAT_ILL_TIME', 6);
48 define('CHAT_ENABLED', TRUE);
50 define('SESS_LEN', 13);
51 define('STREAM_TIMEOUT', 60);
52 /* FIXME: move to sac-a-push .phh */
53 /* TIME_RD define the server-side timeout, after half of it a ping request
54 is sent to client, after this time the client is log out */
55 define('EXPIRE_TIME_RD', 180);
56 define('EXPIRE_TIME_SMAMMA', 360);
57 define('EXPIRE_TIME_WAG', 10);
58 define('WAKEUP_TIME', 12);
59 // BAN_TIME da allineare anche in commons.js
60 define('BAN_TIME', 3600);
61 define('GARBAGE_TIMEOUT', 5);
62 define('NICKSERV', "<i>BriskServ</i>");
64 define('LOCK_SHARE_MAX', 10000);
66 define('DBG_ONL2', 0x0001);
67 define('DBG_ONLY', 0x0002);
68 define('DBG_MAIN', 0x0004);
69 define('DBG_READ', 0x0008);
70 define('DBG_REA2', 0x0010);
71 define('DBG_SEND', 0x0020);
72 define('DBG_LOCK', 0x0040);
73 define('DBG_WRIT', 0x0080);
74 define('DBG_LOAD', 0x0100);
75 define('DBG_AUTH', 0x0200);
76 define('DBG_CRIT', 0x0400);
77 define('DBG_LMOP', 0x0800);
78 define('DBG_TRAC', 0x1000);
79 define('DBG_SHME', 0x2000);
80 define('DBG_ENGI', 0x4000);
81 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
82 define('BRISK_DEBUG', 0x0800);
84 define('BRISK_SINGLE_DEBUG',0);
85 define('BRISK_SINGLE_SESS', "");
86 define('DEBUGGING', "no-debugging");
88 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
90 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
91 'en' => 'back standing' ),
92 'btn_close' => array( 'it' => 'chiudi',
95 'tit_all' => array( 'it' => 'tutti',
98 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
99 'en' => '<br>You are being idle for ' ),
100 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
101 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
102 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
103 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
104 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
105 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
106 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
107 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
108 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
109 'en' => '<br>The entered password is not correct.<br><br>'),
110 'alarret' => array( 'it' => '"Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>."',
111 'en' => '"Alarm \\"<b>%s</b>\\" sent to <b>%s</b>."'),
112 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato.</b>',
113 'en' => '<b>To authenticate someone you have to be authenticated.</b>'), // on your turn
114 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
115 'en' => '<b>To send a message you have to be authenticated.</b>'),
116 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
117 'en' => 'The nickname have to contain at least one letter or one number.'),
118 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
119 'en' => 'The nickname <b>%s</b> is already in use.'),
120 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
121 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
122 '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>',
123 '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 ???
124 'statunkn' => array( 'it' => 'Questo stato non esiste.',
125 'en' => 'This state don\'t exists.'),
126 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
127 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
128 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
129 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
131 'tit_onauth'=>array( 'it' => '(solo aut.)',
132 'en' => '(only aut.)'),
133 'tit_onisol'=>array( 'it' => '(isolam.to)',
134 'en' => '(isolation)'),
135 '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.',
136 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
138 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
139 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
140 'gua_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
141 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
142 'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
143 'en' => 'EN <b>%s</b> si è auto-garantito.'),
144 'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
145 'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
146 'gua_err' => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i><login></i></b>.',
147 'en' => 'Error %d. Usage: <b>/guar <i><login></i></b>.')
150 $G_lng = langtolng($G_lang);
152 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
153 $G_brisk_version = "4.14.2";
155 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
156 $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',
157 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
158 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: new users subscription system.',
159 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
161 $G_room_help = array( 'it' => '
162 <div style=\\"text-align: left; padding: 8px;\\">
163 <b>Descrizione</b><br>
164 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
165 <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>
166 <b>Configurazione del browser.</b><br>
167 Occorre abilitare i cookies.<br>
169 <b>Uso del sito</b><br>
170 Potete sedervi a un tavolo o rimanere in piedi.<br>
171 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
174 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>
175 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
176 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
177 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
178 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
179 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.
181 <dt><b>Comandi della chat</b>
182 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
183 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
184 <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\\"
185 <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
186 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
187 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
188 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
189 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
195 <div style=\\"text-align: left; padding: 8px;\\">
196 <b>EN Descrizione</b><br>
197 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
198 <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>
199 <b>Configurazione del browser.</b><br>
200 Occorre abilitare i cookies.<br>
202 <b>Uso del sito</b><br>
203 Potete sedervi a un tavolo o rimanere in piedi.<br>
204 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
207 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>
208 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
209 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
210 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
211 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
212 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.
214 <dt><b>Comandi della chat</b>
215 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
216 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
217 <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\\"
218 <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
219 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
220 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
221 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
222 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
228 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
229 <div style=\\"text-align: left; padding: 8px;\\">
230 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
232 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
233 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
235 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
236 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
237 <li>Smart card di InfoCamere
240 <b>Per auto-garantisi occorre possedere:</b><br><br>
242 <li>il codice PIN della propria carta
243 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
246 <b>Per effettuare la registrazione collegarsi al sito:</b><br><br>
248 <dd><a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
251 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
252 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.
257 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
258 <div style=\\"text-align: left; padding: 8px;\\">
259 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
261 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
262 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
264 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
265 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
268 <b>Per auto-garantisi occorre possedere:</b><br><br>
270 <li>il codice PIN della propria carta
271 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
274 <b>Per effettuare la registrazione collegarsi al sito:</b><br><br>
276 <dd><a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
279 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
280 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.
286 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
290 $G_room_about = array( 'it' => '<br>
291 <div id=\\"header\\" class=\\"header\\">
292 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
293 briscola chiamata in salsa ajax
295 <br><b>version '.$G_brisk_version.'</b><br><br>
296 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
298 <div id=\\"header\\" class=\\"header\\">
299 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
300 declaration briscola in ajax sauce <b>(Beta)</b>
302 <br><b>version '.$G_brisk_version.'</b><br><br>
303 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
306 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
309 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
310 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
311 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
312 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
313 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
314 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
315 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
316 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
317 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
318 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
319 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
320 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
321 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
322 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
323 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
324 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
325 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
326 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
327 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
329 // $G_PG_cons_n = count($G_PG_cons);
330 // printf("N CONS: %d\n", $G_PG_cons_n);
332 /* printf("%d %d\n", count($voc), count($cons)); */
333 /* for ($i = 0 ; $i < 26 ; $i++) { */
334 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
336 /* printf(' "%s", ', chr(ord('a') + $i)); */
337 /* for ($e = 0 ; $e < 26 ; $e++) { */
338 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
340 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
345 function passwd_gen($seed = NULL)
347 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
356 for ($sil = 0 ; $sil < 7 ; $sil++) {
357 if (($sil % 2) == 0) {
359 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
361 $old = mt_rand(0, $G_PG_vow_n-1);
362 $pw .= $G_PG_vow[$old];
365 $new = mt_rand(0, $G_PG_vow_n-1);
367 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
368 $pw .= $G_PG_vow[$new];
374 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
381 function cmd_return($val, $desc)
383 return array('val' => $val, 'desc' => $desc);
386 function cmd_serialize($attrs)
391 foreach ($attrs as $key => $value) {
392 $ret .= $sep . $key . '=' . urlencode($value);
398 function cmd_deserialize($cmd)
401 $a = explode('&', $cmd);
403 while ($i < count($a)) {
404 $b = split('=', $a[$i]);
405 $ret[urldecode($b[0])] = urldecode($b[1]);
416 function versions_cmp($v1, $v2)
418 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
422 $v1_ar = split('\.', $v1);
423 $v2_ar = split('\.', $v2);
425 $v2_ct = count($v2_ar);
427 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
428 if (($v2_ct - 1) < $i) {
431 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
432 if ($v1_ar[$i] != $v2_ar[$i]) {
433 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
442 function addrtoipv4($addr)
444 $ipv4addr_arr = explode(':' , $addr);
445 if (isset($ipv4addr_arr[3])) {
446 $ipv4addr = $ipv4addr_arr[3];
456 for ($i = 0; $i < ob_get_level(); $i++)
458 ob_implicit_flush(1);
462 function force_no_cache(&$header_out)
464 $header_out['Pragma'] = 'no-cache, must-revalidate';
465 $header_out['Cache-Control'] = 'no-cache';
466 $header_out['Expires'] = '-1';
469 function file_lock($fname, $is_exclusive)
471 if (($res = @fopen($fname, "r+")) == FALSE) {
475 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
483 function file_unlock($res)
486 flock($res, LOCK_UN);
491 $escpush_from = array("\\", "\"");
492 $escpush_to = array("\\\\", "\\\"");
495 GLOBAL $escpush_from, $escpush_to;
497 return str_replace($escpush_from, $escpush_to, $s);
500 $escinp_from = array( "\"" );
501 $escinp_to = array( """ );
503 function escinput($s)
505 GLOBAL $escinp_from, $escinp_to;
507 return str_replace($escinp_from, $escinp_to, $s);
512 return htmlentities($s, ENT_COMPAT, "UTF-8");
515 function esclfhtml($s)
517 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
520 function langtolng($lang)
524 return ($G_lang == 'en' ? '-en' : '');
527 function csplitter($in, $sep)
533 for ($i = 0 ; $i < strlen($in) ; $i++) {
534 $ini = substr($in, $i, 1);
538 else if ($ini == $sep) {
557 $from = array ( '\\', '@', '|' );
558 $to = array ( '\\\\', '@', '¦' );
560 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
565 $from = array ( '\\', '|', "\t", "\n");
566 $to = array ( '\\\\', '\\|', "\\t", "\\n");
568 return (str_replace($from, $to, $s));
571 function xcapemesg($s)
573 $from = array ( "\n");
574 $to = array ( "\\n");
576 return (str_replace($from, $to, $s));
586 function getbyid($idx)
588 return ($this->el[$idx]);
591 function setbyid($idx, $v)
593 $this->el[$idx] = $v;
602 var $auth_only; // se tavolo riservato o libero
609 var $table_start; // information field
617 function create($idx)
619 if (($thiz = new Table()) == FALSE)
623 $thiz->player = array();
625 $thiz->auth_only = FALSE;
631 $thiz->table_token = "";
632 $thiz->table_start = 0;
634 $thiz->wakeup_time = 0;
641 $this->idx = $from->idx;
642 $this->player = array();
643 for ($i = 0 ; $i < $from->player_n ; $i++)
644 $this->player[$i] = $from->player[$i];
645 $this->player_n = $from->player_n;
647 log_main("PLAYER_N - parent::copy.".$this->player_n);
649 $this->auth_only = $from->auth_only;
651 $this->wag_own = $from->wag_own;
652 $this->wag_com = $from->wag_com;
653 $this->wag_tout = $from->wag_tout;
655 $this->table_token = $from->table_token;
656 $this->table_start = $from->table_start;
658 $this->wakeup_time = $from->wakeup_time;
661 function myclone($from)
663 if (($thiz = new Table()) == FALSE)
671 function spawn($from)
673 if (($thiz = new Table()) == FALSE)
676 $thiz->idx = $from->idx;
677 $thiz->player = array();
678 for ($i = 0 ; $i < $from->player_n ; $i++)
679 $thiz->player[$i] = $i;
680 $thiz->player_n = $from->player_n;
682 $thiz->auth_only = $from->auth_only;
684 $thiz->wag_own = $from->wag_own;
685 $thiz->wag_com = $from->wag_com;
686 $thiz->wag_tout = $from->wag_tout;
688 $thiz->table_token = $from->table_token;
689 $thiz->table_start = $from->table_start;
691 $thiz->wakeup_time = $from->wakeup_time;
696 function wag_set($user_idx, $mesg)
700 $this->wag_own = $user_idx;
701 $this->wag_com = $mesg;
705 function wag_reset($timeout)
707 log_main("WAG_RESET");
709 unset($this->wag_own);
712 $this->wag_tout = $timeout;
715 function player_get($idx)
717 return ($this->player[$idx]);
720 function player_set($idx, $player)
722 $this->player[$idx] = $player;
725 function user_add($idx)
727 $this->player[$this->player_n] = $idx;
730 return ($this->player_n - 1);
733 function user_rem($brisk, $user)
735 $tabpos = $user->table_pos;
737 /* verifico la consistenza dei dati */
738 if ($brisk->user[$this->player[$tabpos]] == $user) {
740 /* aggiorna l'array dei giocatori al tavolo. */
741 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
742 $this->player[$i] = $this->player[$i+1];
743 $user_cur = $brisk->user[$this->player[$i]];
744 $user_cur->table_pos = $i;
749 log_main("INCONSISTENCY ON TABLE.");
755 // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table,
756 // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
758 // function act_content($isstanding, $sitted, $table, $cur_table, $allowed)
759 function act_content($user)
762 $isstanding = ($user->subst == 'standup');
763 $sitted = $this->player_n;
765 $cur_table = $user->table;
769 if ($sitted < PLAYERS_N) {
770 if ($this->auth_only) {
771 if ($user->flags & USER_FLAG_AUTH)
785 if ($table == $cur_table)
792 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
805 function Delay_Manager($triglevel)
807 $this->triglevel = $triglevel;
808 $this->delta = array();
809 $this->lastcheck = 0;
812 function delta_get($curtime)
814 // clean too old delta items
815 for ($i = 0 ; $i < count($this->delta) ; $i++) {
816 if ($this->delta[$i][0] < $curtime) {
817 array_splice($this->delta, $i, 1);
822 // add new delta items if delay exceeded $this->triglevel sec
823 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
824 $delta = $curtime - $this->lastcheck - $this->triglevel;
825 array_push($this->delta, array($curtime + $delta , $delta));
826 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
829 // extract the maximum valid delta
831 for ($i = 0 ; $i < count($this->delta) ; $i++) {
832 $delta_cur = $this->delta[$i][1];
833 if ($delta_max < $delta_cur)
834 $delta_max = $delta_cur;
837 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
842 function lastcheck_set($curtime)
844 $this->lastcheck = $curtime;
852 function Client_prefs()
856 static function from_user($user)
858 $thiz = new Client_prefs();
859 $thiz->user_load($user);
864 static function from_json($json)
866 $thiz = new Client_prefs();
867 if ($thiz->json_load($json) == FALSE) {
875 function user_load($user)
877 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
878 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
879 if ($user->rec != FALSE) {
880 $this->supp_comp = $user->rec->supp_comp_get();
883 $this->supp_comp = "000000000000";
886 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
889 function json_load($json_s)
894 if (gettype($json_s) == "string") {
895 if (($json = json_decode($json_s)) == FALSE)
901 if ($this->listen < 0 || $this->listen > 2)
903 $this->listen = $json->listen;
905 if (mb_strlen($json->supp_comp, "ASCII") != 12)
908 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
909 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
910 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
916 $this->supp_comp = $json->supp_comp;
923 function store($user, $is_save)
926 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
927 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
928 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
929 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
931 if ($user->is_supp_custom()) {
932 $user->rec->supp_comp_set($this->supp_comp);
935 $user->prefs_store();
944 var $crystal_filename;
948 var $comm; // commands for many people
949 var $step; // current step of the comm array
950 var $garbage_timeout;
955 public static $sess_cur;
962 static function create($crystal_filename)
964 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
965 if (($brisk = unserialize($brisk_ser)) != FALSE) {
966 fprintf(STDERR, "ROOM FROM FILE\n");
967 rename($crystal_filename, $crystal_filename.".old");
973 fprintf(STDERR, "NEW ROOM\n");
976 $thiz->crystal_filename = $crystal_filename;
977 $thiz->user = array();
978 $thiz->table = array();
979 $thiz->match = array();
981 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
982 $thiz->user[$i] = User::create($thiz, $i, "", "");
985 for ($i = 0 ; $i < TABLES_N ; $i++) {
986 $thiz->table[$i] = Table::create($i);
989 $row = ( (((int)($i / 4)) % 2) == 0 );
990 $col = ($i % 2 == 0);
991 $thiz->table[$i]->auth_only = (($row && $col) || (!$row && !$col));
994 $thiz->table[$i]->auth_only = FALSE;
997 if ($i < TABLES_AUTH_N)
998 $thiz->table[$i]->auth_only = TRUE;
1000 $thiz->table[$i]->auth_only = FALSE;
1002 $thiz->garbage_timeout = 0;
1003 $thiz->shm_sz = SHM_DIMS_MIN;
1005 $thiz->delay_mgr = new Delay_Manager(1.5);
1007 static::$sess_cur = FALSE;
1012 function garbage_manager($force)
1014 GLOBAL $G_lang, $mlang_brisk, $G_base;
1018 log_rd2("garbage_manager START");
1020 /* Garbage collector degli utenti in timeout */
1021 $curtime = microtime(TRUE);
1023 $delta = $this->delay_mgr->delta_get($curtime);
1025 if (!$force && !($this->garbage_timeout < $curtime)) {
1026 $this->delay_mgr->lastcheck_set($curtime);
1030 // Before all align times with table timeout
1031 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1032 $table_cur = $this->table[$table_idx];
1033 // if the table is complete and exists its shared mem we get the info about users lacc
1035 if ($table_cur->player_n == PLAYERS_N) {
1036 log_main("PLAYERS == N TABLE ".$table_idx);
1039 $no_recovery = FALSE;
1040 if (isset($this->match[$table_idx])) {
1041 $bin5 = $this->match[$table_idx];
1043 if ($table_cur->table_token != $bin5->table_token) {
1044 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1045 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1046 $no_recovery = TRUE;
1050 if ($bin5 != FALSE) {
1054 log_main("garbage_manager: bri loaded successfully.");
1055 $bin5->garbage_manager(TRUE);
1057 $bin5_table = $bin5->table[0];
1059 // is the end of the table
1061 if ($bin5->the_end == TRUE) {
1063 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1065 log_main("garbage_manager: INSIDE THE END.");
1067 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1068 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1069 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1072 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1073 // stat must be "table" by definition
1074 $user_cur = $this->user[$table_cur->player[$i]];
1075 $bin5_user = $bin5->user[$i];
1077 $user_cur->subst = $bin5_user->subst;
1078 $user_cur->step = $bin5_user->step;
1079 $user_cur->lacc = $bin5_user->lacc;
1080 $user_cur->laccwr = $bin5_user->lacc;
1081 $user_cur->bantime = $bin5_user->bantime;
1084 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1086 $this->room_join_wakeup($user_cur, FALSE, 0);
1087 $table_cur->table_token = "";
1088 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1090 $this->match_del($table_idx);
1093 log_main("gm:: save_data");
1095 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1096 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1099 } // if ($bin5 == FALSE
1100 else if ($no_recovery == FALSE) {
1101 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1103 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1104 $user_cur = $this->user[$table_cur->player[$i]];
1105 $user_cur->subst = "shutdowner";
1106 $user_cur->step_inc();
1108 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1109 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1110 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1111 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1112 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1113 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1114 $user_cur->step_inc();
1117 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1118 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1119 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1121 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1123 $this->room_join_wakeup($user_cur, TRUE, -2);
1124 $table_cur->table_token = "";
1127 } // if ($table_cur->player_n == PLAYERS_N) {
1128 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1130 log_rd2("out new loop.");
1132 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1133 $user_cur = $this->user[$i];
1135 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1137 if ($user_cur->sess == "")
1140 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1141 // Auto logout dell'utente
1142 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1144 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1145 log_auth($user_cur->sess, "Autologout session.");
1149 log_rd2("AUTO LOGOUT.");
1150 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1151 $this->room_wakeup($user_cur);
1152 else if ($user_cur->subst == 'standup')
1153 $this->room_outstandup($user_cur);
1155 log_rd2("LOGOUT FROM WHAT ???");
1159 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1160 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1161 $this->room_wakeup($user_cur);
1162 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1163 /* 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" */
1164 $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);
1165 $user_cur->step_inc();
1169 log_rd2("GARBAGE UPDATED!");
1171 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1174 $this->delay_mgr->lastcheck_set($curtime);
1178 function show_room($user_step, $user)
1180 GLOBAL $G_lang, $mlang_brisk;
1181 log_main("show_room: username: ".$user->name);
1183 $ret = sprintf('gst.st = %d; ', $user_step);
1185 $prefs = Client_prefs::from_user($user);
1186 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1189 if ($user->flags & USER_FLAG_ISOLAUTH) {
1190 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1192 else if ($user->flags & USER_FLAG_LISTAUTH) {
1193 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1196 $ret .= 'list_set(\'all\', false, \'\' ); ';
1200 if ($user->subst == 'standup')
1201 $ret .= "tra.show(); ";
1203 $ret .= "tra.hide(); ";
1205 $ret .= sprintf('stat = "%s";', $user->stat);
1207 $ret .= root_welcome($user);
1208 if ($user->flags & USER_FLAG_DBFAILED) {
1209 $ret .= "gst.st = ".($user->step+1)."; ";
1210 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1213 $ret .= sprintf('subst = "%s";', $user->subst);
1214 $ret .= $user->myname_innerHTML();
1216 for ($i = 0 ; $i < TABLES_N ; $i++) {
1218 $ret .= $this->table_content($user, $i);
1219 // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table,
1220 // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
1221 $ret .= $this->table[$i]->act_content($user);
1222 if ($this->table[$i]->wag_own != -1)
1223 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1225 $ret .= sprintf('tra.rem(%d); ', $i);
1227 $ret .= $this->standup_content($user);
1228 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1234 function room_wakeup($user)
1236 $table_idx = $user->table;
1237 $table = $this->table[$table_idx];
1239 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1243 $from_table = ($user->stat == "table");
1245 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1247 for ($i = 0 ; $i < $table->player_n ; $i++) {
1248 $user_cur = $this->user[$table->player[$i]];
1249 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1251 if ($user->idx_get() != $table->player[$i]) {
1252 $user_cur->stat_set("room");
1253 $user_cur->subst = "sitdown";
1254 $user_cur->laccwr = $curtime;
1256 else if ($user->sess != "") {
1257 $user_cur->stat_set("room");
1258 $user_cur->subst = "standup";
1259 $user_cur->laccwr = $curtime;
1260 $user_cur->table = -1;
1265 $user->stat_set("room");
1266 $user->subst = "standup";
1267 $user->laccwr = $curtime;
1270 $remove_wagon = FALSE;
1271 if($table->wag_own == $user->idx_get()) {
1272 $table->wag_reset($curtime);
1273 $remove_wagon = TRUE;
1277 /* aggiorna l'array dei giocatori al tavolo. */
1278 $table->user_rem($this, $user);
1280 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1281 $user_cur = $this->user[$i];
1282 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1285 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1287 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1288 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1289 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1290 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1291 log_main("DOCUMENT.index.php: from table");
1293 else if ($user_cur->stat == "room") {
1294 log_main("DOCUMENT.index.php: from table");
1296 $ret .= $this->table_content($user_cur, $table_idx);
1297 $ret .= $this->standup_content($user_cur);
1299 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1300 $ret .= $table->act_content($user);
1302 if ($user->idx_get() == $i) {
1303 // set the new status
1304 $ret .= 'subst = "standup"; tra.show(); ';
1305 // clean the action buttons in other tables
1306 for ($e = 0 ; $e < TABLES_N ; $e++) {
1307 if ($this->table[$e]->player_n < PLAYERS_N) {
1308 // $ret .= table_act_content(TRUE, 0, $e, $user->table,
1309 // ($this->table[$e]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
1310 $ret .= $this->table[$e]->act_content($user);
1315 // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table,
1316 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1317 $ret .= $table->act_content($user_cur);
1320 log_wr("ROOM_WAKEUP: ".$ret);
1321 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1322 $user_cur->step_inc();
1326 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1328 $table_idx = $user->table;
1329 $table = $this->table[$table_idx];
1331 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1334 $user_wup = array();
1336 $user_tab = array();
1338 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1340 for ($i = 0 ; $i < $table->player_n ; $i++) {
1341 $user_cur = $this->user[$table->player[$i]];
1342 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1343 if ($user_cur->sess != "") {
1344 if ($update_lacc == TRUE) {
1345 $user_cur->laccwr = $curtime;
1347 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1348 if ($user_cur->subst == "shutdowned") {
1349 $user_cur->stat_set("room");
1350 $user_cur->subst = "sitdown";
1352 else if ($user_cur->subst == "shutdowner") {
1353 $user_cur->stat_set("room");
1354 $user_cur->subst = "standup";
1355 $user_cur->table = -1;
1356 $user_wup[$user_wup_n++] = $user_cur;
1358 $remove_wagon = FALSE;
1359 if($table->wag_own == $table->player[$i]) {
1360 $remove_wagon = TRUE;
1361 $table->wag_reset($curtime);
1364 $user_tab[$user_tab_n++] = $table->player[$i];
1368 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1369 $table->user_rem($this, $user_wup[$wup_idx]);
1371 /* aggiorna l'array dei giocatori al tavolo. */
1373 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1374 log_main("START LOOP");
1375 $user_cur = $this->user[$i];
1376 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1377 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1382 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1384 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1385 if ($user_cur->stat == "room") {
1386 log_main("DOCUMENT.index.php from table");
1388 $ret .= $this->table_content($user_cur, $table_idx);
1389 $ret .= $this->standup_content($user_cur);
1391 // $ret .= table_act_content(FALSE, 0, $table_idx, $user_cur->table,
1392 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1393 $ret .= $table->act_content($user_cur);
1396 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1397 if ($user_tab[$tab_idx] == $i)
1400 // for users that wakeup the room will be reconstructed by index_rd.php
1401 if ($tab_idx < $user_tab_n) {
1402 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1404 // ARRAY_POP DISABLED
1405 // if ($trans_delta == 0)
1406 // while (array_pop($user_cur->comm) != NULL);
1408 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1409 $user_cur->comm[$user_cur->step % COMM_N] = "";
1410 $user_cur->step_inc();
1411 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1412 $user_cur->step_inc();
1413 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1417 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1419 log_main("JOIN_WAKEUP more");
1420 // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table,
1421 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1422 $ret .= $table->act_content($user_cur);
1424 log_main("JOIN_WAKEUP end more");
1426 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1427 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1428 $user_cur->step_inc();
1432 function guarantee_show($user, $user_login, $dt)
1434 GLOBAL $G_lang, $mlang_brisk, $G_base;
1440 if ($user_login == "") {
1444 if (($bdb = BriskDB::create()) == FALSE) {
1448 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1452 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1453 $guar_login = $guar_item->login_get();
1458 $user_tos_vers = $user_item->tos_vers_get();
1460 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1461 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1462 $dt, NICKSERV, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1464 else if ($guar_login == "") {
1465 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1466 $dt, NICKSERV, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1468 else if ($guar_login == $user_login) {
1469 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1470 $dt, NICKSERV, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1473 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1474 $dt, NICKSERV, sprintf($mlang_brisk['gua_info'][$G_lang],
1475 xcape($user_login), xcape($guar_login)));
1480 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1483 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1489 function room_outstandup($user)
1491 $this->room_sitdown($user, -1);
1494 function table_update($user)
1496 log_main("table_update: pre - USER: ".$user->name);
1498 $table_idx = $user->table;
1500 if ($table_idx > -1)
1501 $table = $this->table[$table_idx];
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)."; ";
1510 if ($table_idx > -1)
1511 $ret .= $this->table_content($user_cur, $table_idx);
1513 if ($user->idx_get() == $i) {
1514 $ret .= $user->myname_innerHTML();
1516 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1517 $user_cur->step_inc();
1520 log_main("table_update: post");
1523 function room_sitdown($user, $table_idx)
1525 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1529 if ($table_idx > -1 && $table_idx < TABLES_N) {
1530 $table = $this->table[$table_idx];
1533 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1534 for ($i = 0 ; $i < TABLES_N ; $i++) {
1535 if ($table->wag_own == $table->player[$i]) {
1536 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1537 $table->wag_reset(time());
1544 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1546 $user_cur = $this->user[$i];
1547 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1550 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1551 if ($table_idx > -1)
1552 $ret .= $this->table_content($user_cur, $table_idx);
1553 $ret .= $this->standup_content($user_cur);
1555 if ($user->idx_get() == $i) {
1556 $ret .= 'subst = "sitdown"; tra.hide(); ';
1557 // clean the action buttons in other tables
1558 for ($e = 0 ; $e < TABLES_N ; $e++) {
1559 $ret .= $this->table[$e]->act_content($user_cur);
1562 else if ($table_idx > -1) {
1563 if ($table->player_n == PLAYERS_N) {
1564 // $ret .= table_act_content(($user_cur->subst == 'standup'), PLAYERS_N, $table_idx, $user_cur->table,
1565 /// ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1566 $ret .= $table->act_content($user_cur);
1569 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1570 $user_cur->step_inc();
1574 function chatt_send($user, $mesg)
1576 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1580 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1582 $dt = date("H:i ", $curtime);
1593 $is_normchat = FALSE;
1594 /* for old isolation management $is_ticker = FALSE; */
1595 $update_room = FALSE;
1597 if (strcmp($msg, "/tav") == 0 ||
1598 strncmp($msg, "/tav ", 5) == 0) {
1600 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1601 /* 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>" */
1602 $msg = $mlang_brisk['tickmust'][$G_lang];
1603 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1608 $table = $this->table[$user->table];
1610 if ($table->wag_own != -1) {
1611 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1612 $msg = $mlang_brisk['tickjust'][$G_lang];
1613 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1618 $dtime = $curtime - $table->wag_tout;
1619 if ($dtime < EXPIRE_TIME_WAG) {
1620 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1621 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1622 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1623 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1628 $msg = substr($msg, 5);
1630 $table->wag_set($user->idx_get(), $msg);
1631 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1632 $to_room = $to_user;
1633 /* for old isolation management $is_ticker = TRUE; */
1635 } // /tav chat command
1637 else if (strncmp($msg, "/alarm ", 7) == 0) {
1638 if (strncmp($msg, "/alarm to ", 10) == 0) {
1639 $sp_pos = strpos($msg, " ", 10);
1640 $target = substr($msg, 10, $sp_pos - 10);
1641 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1645 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1648 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1649 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1650 $msg = $mlang_brisk['alarpass'][$G_lang];
1651 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1656 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1657 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1658 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1659 $to_user = sprintf('chatt_sub("%s", [2, "%s"],%s);',
1660 $dt, NICKSERV, $prestr);
1662 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1663 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1664 /* MLANG: "chiudi" */
1665 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1667 } // /alarm chat command
1668 else if (strncmp($msg, "/listen ", 8) == 0) {
1669 $arg = substr($msg, 8);
1671 if (strcasecmp($arg, "isolation") == 0) {
1673 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1674 $user->table >= TABLES_AUTH_N) {
1675 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]);
1679 $user->flags &= ~USER_FLAG_MAP_AUTH;
1680 $user->flags |= USER_FLAG_ISOLAUTH;
1681 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1684 else if (strcasecmp($arg, "auth") == 0) {
1685 $flags_old = $user->flags;
1686 $user->flags &= ~USER_FLAG_MAP_AUTH;
1687 $user->flags |= USER_FLAG_LISTAUTH;
1688 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1691 $flags_old = $user->flags;
1692 $user->flags &= ~USER_FLAG_MAP_AUTH;
1693 $to_user = 'list_set(\'all\', true, \'\'); ';
1696 // if from isolation redraw standup area
1697 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1698 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1702 else if (strcmp($msg, "/authreq") == 0) {
1703 if ($user->flags & USER_FLAG_AUTH) {
1704 $to_user = sprintf('authbox(300,200);');
1707 /* 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." */
1708 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]);
1711 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1712 if ($user->flags & USER_FLAG_AUTH) {
1713 $to_user = sprintf('mesgtoadmbox(500,300);');
1716 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1717 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]);
1720 else if (strncmp($msg, "/nick ", 6) == 0) {
1721 log_main("chatt_send BEGIN");
1724 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1725 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
1729 $msg = "COMMAND ".$msg;
1730 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1731 $user_cur = $this->user[$i];
1733 if ($user_cur->sess == '')
1735 if (strcasecmp($user_cur->name,$name_new) == 0)
1738 if ($i < MAX_PLAYERS) {
1739 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1740 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1744 /* 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>" */
1745 if ($user->flags & USER_FLAG_AUTH) {
1746 if (strcasecmp($user->name,$name_new) != 0) {
1747 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1748 ($user->subst == 'standup' ||
1749 ($user->subst != 'standup' && $this->table[$user->table]->auth_only == FALSE)
1752 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1753 for ($i = 0 ; $i < TABLES_N ; $i++) {
1754 $to_user .= $this->table[$i]->act_content($user);
1758 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
1763 $user->name = $name_new; // OK - nick changed
1764 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1765 if (($user->flags & USER_FLAG_AUTH) == 0) {
1766 if (($bdb = BriskDB::create()) != FALSE) {
1768 /* 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>" */
1769 if ($bdb->login_exists($name_new)) {
1770 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1771 $to_user .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1776 log_main("chatt_send start set");
1778 $update_room = TRUE;
1780 } // nick chat command
1781 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1782 $guar_user = substr($msg, 6);
1784 $this->guarantee_show($user, $guar_user, $dt);
1786 else if (strncmp($msg, "/st ", 4) == 0) {
1787 log_main("chatt_send BEGIN");
1790 $st_str = substr($msg, 4);
1792 if (strcasecmp($st_str, "normale") == 0) {
1793 $st = USER_FLAG_S_NORM;
1795 else if (strcasecmp($st_str, "pausa") == 0) {
1796 $st = USER_FLAG_S_PAU;
1798 else if (strcasecmp($st_str, "fuori") == 0) {
1799 $st = USER_FLAG_S_OUT;
1801 else if (strcasecmp($st_str, "cane") == 0) {
1802 $st = USER_FLAG_S_DOG;
1804 else if (strcasecmp($st_str, "cibo") == 0) {
1805 $st = USER_FLAG_S_EAT;
1807 else if (strcasecmp($st_str, "lavoro") == 0) {
1808 $st = USER_FLAG_S_WRK;
1810 else if (strcasecmp($st_str, "sigaretta") == 0) {
1811 $st = USER_FLAG_S_SMK;
1813 else if (strcasecmp($st_str, "presente") == 0) {
1814 $st = USER_FLAG_S_EYE;
1816 else if (strcasecmp($st_str, "coniglio") == 0) {
1817 $st = USER_FLAG_S_RABB;
1819 else if (strcasecmp($st_str, "calcio") == 0) {
1820 $st = USER_FLAG_S_SOCC;
1822 else if (strcasecmp($st_str, "pupo") == 0) {
1823 $st = USER_FLAG_S_BABY;
1825 else if (strcasecmp($st_str, "pulizie") == 0) {
1826 $st = USER_FLAG_S_MOP;
1828 else if (strcasecmp($st_str, "babbo") == 0) {
1829 $st = USER_FLAG_S_BABBO;
1831 else if (strcasecmp($st_str, "renna") == 0) {
1832 $st = USER_FLAG_S_RENNA;
1834 else if (strcasecmp($st_str, "pupazzo") == 0) {
1835 $st = USER_FLAG_S_PUPAZ;
1837 else if (strcasecmp($st_str, "vischio") == 0) {
1838 $st = USER_FLAG_S_VISCH;
1841 /* MLANG: "Questo stato non esiste." */
1842 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]);
1846 log_main("chatt_send start set");
1847 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1848 $update_room = TRUE;
1849 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1852 } // nick chat command
1854 else { // normal chat line
1855 $is_normchat = TRUE;
1856 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1858 $user->chat_dlt = $user->chat_dlt * 2;
1859 if ($user->chat_dlt > 120)
1860 $user->chat_dlt = 120;
1862 else if ($user->chat_lst == $msg)
1864 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
1865 $user->chat_ban = $curtime;
1866 $user->chat_dlt = 5;
1870 $user->chat_ban = 0;
1871 $user->chat_dlt = 0;
1875 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
1878 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
1879 // temporary silentiation for troll (will became array check)
1880 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
1881 $to_room = $to_user;
1884 log_legal($curtime, $user->ip, $user,
1885 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
1887 $user->chat_lst = "$msg";
1888 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
1898 // Output to clients
1901 if ($to_user != FALSE) {
1902 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
1903 $user->comm[$user->step % COMM_N] .= $to_user;
1907 if ($to_room != FALSE) {
1908 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1909 $user_cur = $this->user[$i];
1910 if ($target != "" && $user_cur->name != $target)
1912 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
1915 if ($is_normchat == TRUE) {
1916 // use MAP_AUTH to check if auth or isolation
1917 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
1918 if (($user->flags & USER_FLAG_AUTH) == 0) {
1924 else if ($is_ticker) {
1925 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
1926 if ($user->table >= TABLES_AUTH_N)
1931 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1932 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
1933 $user_cur->step_inc();
1938 // FIXME BRISK4: include for each kind of table
1939 require_once("${G_base}briskin5/Obj/briskin5.phh");
1940 // Before all align times with table timeout
1941 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1942 if (isset($this->match[$table_idx])) {
1943 $bin5 = $this->match[$table_idx];
1945 $bin5_table = $bin5->table[0];
1946 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1947 // stat must be "table" by definition
1948 $bin5_user = $bin5->user[$i];
1950 if ($target != "" && $bin5_user->name != $target)
1952 log_main("writa: ".$user_mesg);
1953 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
1954 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
1955 $bin5_user->step_inc();
1957 } // if (isset($this->match
1958 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1959 } // if ($to_tabl == true ...
1962 if ($user->stat == 'room' && $user->subst == 'standup') {
1963 $this->standup_update($user);
1965 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
1966 log_main("chatt_send pre table update");
1967 $this->table_update($user);
1968 log_main("chatt_send post table update");
1970 } // if ($update_room ...
1973 } // function chatt_send( ...
1975 function get_user($sess, &$idx)
1979 if (validate_sess($sess)) {
1980 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1981 if (strcmp($sess, $this->user[$i]->sess) == 0) {
1984 $ret = $this->user[$i];
1988 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
1989 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
1990 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
1993 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2000 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
2003 * if ($idx > -1 && ret == FALSE) => duplicated nick
2004 * if ($idx == -2 && ret == FALSE) => invalid name
2005 * if ($idx == -3 && ret == FALSE) => wrong password
2006 * if ($idx == -1 && ret == FALSE) => no space left
2007 * if ($idx == 0 && ret == user) => SUCCESS
2008 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
2011 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
2017 $authenticate = FALSE;
2019 $login_exists = FALSE;
2021 $ghost_auth = FALSE;
2026 if (($name_new = validate_name($name)) == FALSE) {
2031 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2032 if (validate_sess($sess) == FALSE)
2035 /* if pass != FALSE verify the login with pass */
2036 log_auth("XXX", "auth1");
2038 if (($bdb = BriskDB::create()) != FALSE) {
2040 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2041 log_auth("XXX", "auth2");
2042 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2043 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2045 if ($authenticate != FALSE) {
2046 $user_type = $authenticate->type_get();
2054 $login_exists = $bdb->login_exists($name_new);
2058 // if db is down, send a warning and verify only current users
2059 // no actions at this moment
2061 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2063 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2067 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2069 continue; // NOTE: CHECK IT !!
2071 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2072 if ($authenticate != FALSE) {
2074 $ghost_auth = ($this->user[$i]->flags & USER_FLAG_AUTH);
2085 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2087 /* there is another user logged with your account and you and him have authenticated => new user
2088 get the session of the old user */
2089 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2092 $ghost_user = $this->user[$ghost];
2094 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2095 $ghost_user->step_inc();
2098 $ghost_user->sess = $sess;
2101 $ghost_user->sess = $sess;
2104 // If user at the table we need to update the table data too
2105 $table_idx = $ghost_user->table;
2106 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2107 require_once("${G_base}briskin5/Obj/briskin5.phh");
2108 if (isset($this->match[$table_idx])) {
2109 $bin5 = $this->match[$table_idx];
2111 if ($bin5->the_end != TRUE) {
2112 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2113 $bin5->user[$ghost_user->table_pos]->step_inc();
2114 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2120 return ($this->user[$ghost]);
2122 else if ($idx != -1 && $i == MAX_PLAYERS) {
2127 $this->user[$idx]->sess = $sess;
2130 $this->user[$idx]->sess = $sess;
2132 $this->user[$idx]->name = $name_new; // OK - add new user
2133 $this->user[$idx]->stat_set("room");
2134 $this->user[$idx]->step_set(0);
2135 while (array_pop($this->user[$idx]->comm) != NULL);
2136 $this->user[$idx]->subst = "standup";
2137 $this->user[$idx]->lacc = $curtime;
2138 $this->user[$idx]->laccwr = $curtime;
2139 $this->user[$idx]->bantime = 0;
2140 $this->user[$idx]->ip = $ip;
2142 $this->user[$idx]->rec = $authenticate;
2143 fprintf(STDERR, "MOP: [%s]\n", $authenticate->supp_comp);
2144 $this->user[$idx]->flags = $user_type;
2145 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2146 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2147 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2149 if ($authenticate != FALSE) {
2150 $this->user[$idx]->code = $authenticate->code_get();
2152 // all this part is included in the db server
2153 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2155 if (isset($cookie['CO_list'])) {
2156 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2157 if (strcmp($cookie['CO_list'], "auth") == 0) {
2158 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2159 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2161 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2162 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2163 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2166 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2171 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2174 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2176 log_main("ghost: rename!");
2177 $ghost_user = $this->user[$ghost];
2179 if ($ghost_auth == FALSE) {
2180 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2181 $ghostname = 'ghost'.$sfx;
2182 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2183 if (strcmp("", $this->user[$i]->sess) == 0)
2186 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2191 if ($ghostname != '')
2195 $ghost_user->name = $ghostname;
2197 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2198 $this->standup_update($ghost_user);
2201 log_main("chatt_send pre table update");
2202 $this->table_update($ghost_user);
2203 log_main("chatt_send post table update");
2205 } // if ($ghost_auth == FALSE
2207 // FIXME: cacciare il vecchio utente room && table (if needed)
2208 $ghost_user->the_end = TRUE;
2209 $ghost_user->lacc = 0;
2210 $this->garbage_manager(TRUE);
2212 } // if ($ghost > -1) {
2217 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));
2219 $ret = $this->user[$real_idx];
2226 function standup_update($user)
2228 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2229 $user_cur = $this->user[$i];
2230 if ($user_cur->sess == '')
2233 log_main("STANDUP START: ".$user_cur->stat);
2235 if ($user_cur->stat == 'room') {
2236 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2237 if ($user->idx_get() == $i) {
2238 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2240 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2242 $user_cur->step_inc();
2247 function load_data()
2252 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) {
2253 log_main("ftok failed");
2257 if (($shm_sz = sharedmem_sz($tok)) == -1) {
2258 log_main("shmop_open failed");
2262 $shm_sz = SHM_DIMS_MIN;
2264 if ($shm = shm_attach($tok, $shm_sz)) {
2265 $brisk = @shm_get_var($shm, $tok); // CHECKED BELOW
2267 log_only("bri == ".($brisk == FALSE ? "FALSE" : "TRUE")." bri === ".($brisk === FALSE ? "FALSE" : "TRUE")." bri isset ".(isset($brisk) ? "TRUE" : "FALSE"));
2269 log_only("bri count ".count($brisk));
2271 if ($brisk == FALSE) {
2272 log_only("INIT MAIN DATA");
2275 $brisk = Brisk::create();
2277 log_shme("Brisk::create");
2279 if (Brisk::save_data($brisk) == FALSE)
2284 $brisk->shm_sz = $shm_sz;
2288 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2289 if (($brisk->user[$i] = User::load_data($i, FALSE)) == FALSE) {
2290 log_crit("User::load_data failed");
2294 if ($i < MAX_PLAYERS) {
2300 // SHSPLIT: load users from the shared memory
2309 function save_data_orig($brisk)
2315 // var_dump($brisk);
2317 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2320 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2321 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2324 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2325 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2329 if (shm_remove($shm) === FALSE) {
2330 log_only("REMOVE FALLITA");
2334 $brisk->shm_sz += SHM_DIMS_DLT;
2342 function dump_data()
2344 $brisk_ser = serialize($this);
2345 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2346 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2353 function save_data($brisk)
2360 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2363 // SHSPLIT: before save the $brisk you must save users,
2364 // detach from main struct and (then) reattach
2365 $user_park = array();
2366 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2367 $user_park[$i] = $brisk->user[$i];
2368 $brisk->user[$i] = FALSE;
2371 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2372 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2375 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2376 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2377 log_shme("Brisk::save_data");
2381 if (shm_remove($shm) === FALSE) {
2382 log_only("REMOVE FALLITA");
2386 $brisk->shm_sz += SHM_DIMS_DLT;
2392 // SHSPLIT: reattach users to the room class
2393 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2394 User::save_data($user_park[$i], $i);
2395 $brisk->user[$i] = $user_park[$i];
2397 log_load("FINISH: ".($ret == TRUE ? "TRUE" : "FALSE"));
2402 static function lock_data($is_exclusive)
2404 if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) {
2405 self::$delta_t = microtime(TRUE);
2406 log_lock("LOCK room [".self::$delta_t."]");
2414 static function unlock_data($res)
2418 log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]");
2424 function standup_content($user)
2429 if ($user->stat != 'room')
2432 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2433 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2438 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2440 $content = ' j_stand_cont( [ ';
2442 $user_cur_id = $user->idx_get();
2443 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2444 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2447 $flags = $this->user[$i]->flags;
2449 // sql record exists AND last donate > 2013-01-01
2450 if ($this->user[$i]->is_supp_custom()) {
2451 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2457 if ($this->user[$i]->subst == "standup") {
2458 if ($user_cur_id == $i) {
2462 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2463 xcape($this->user[$i]->name), $supp_comp_s);
2472 function table_content($user, $table_idx)
2478 // Si possono usare i dati nella classe table
2481 $sess = $user->sess;
2482 $table = $this->table[$table_idx];
2484 if ($user->stat != 'room')
2487 $user_cur_id = $user->idx_get();
2489 for ($i = 0 ; $i < $table->player_n ; $i++) {
2490 $user_cur = $this->user[$table->player[$i]];
2492 $flags = $user_cur->flags;
2494 if ($user_cur_id == $table->player[$i])
2497 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2498 if ($user_cur->is_supp_custom())
2499 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2503 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2504 xcape($user_cur->name), $supp_comp_s);
2509 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2514 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2516 GLOBAL $G_black_list;
2518 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2520 $enc = get_encoding($header);
2521 if (isset($header['User-Agent'])) {
2522 if (strstr($header['User-Agent'], "MSIE")) {
2523 $transp_type = "htmlfile";
2526 $transp_type = "xhr";
2530 $transp_type = "iframe";
2532 force_no_cache($header_out);
2538 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2539 $content = ob_get_contents();
2542 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2543 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2547 case "index_wr.php":
2549 // Enhance required: in the POST case, after the header you must get content
2550 // from the socket, waiting if necessary
2554 index_wr_main($this, $addr, $get, $post, $cookie);
2555 $content = ob_get_contents();
2558 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2562 case "index_rd.php":
2563 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2565 if ($transp == 'websocket')
2569 if (!isset($cookie['sess'])
2570 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2572 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2574 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2579 $this->sess_cur_set($user->sess);
2580 // close a previous opened index_read_ifra socket, if exists
2581 if (($prev = $user->rd_socket_get()) != NULL) {
2582 $s_a_p->socks_unset($user->rd_socket_get());
2583 fclose($user->rd_socket_get());
2584 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2585 $user->rd_socket_set(NULL);
2589 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2590 $response = headers_render($header_out, -1).$user->chunked_content($content);
2591 $response_l = mb_strlen($response, "ASCII");
2593 $wret = @fwrite($new_socket, $response, $response_l);
2594 if ($wret < $response_l) {
2595 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2596 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2599 $user->rd_cache_set("");
2601 fflush($new_socket);
2604 $s_a_p->socks_set($new_socket, $user, NULL);
2605 $user->rd_socket_set($new_socket);
2606 printf(" - qui ci siamo - ");
2613 if (!(BRISK_DEBUG & DBG_ENGI))
2615 fprintf(STDERR, "TEST.PHP running\n");
2616 if (isset($post['data'])) {
2617 $content = $post['data'];
2620 $content = "NO DATA AVAILABLE";
2622 $header_out['Content-Type'] = 'text/plain';
2623 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2627 /* FAR TODO: move all into an array of registered sub-apps */
2628 $subs = "briskin5/";
2629 $subs_l = strlen($subs);
2630 if (!strncmp($path, $subs, $subs_l)) {
2631 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2640 function match_add($idx, $match)
2642 $this->match[$idx] = $match;
2645 function match_del($idx)
2647 unset($this->match[$idx]);
2650 function match_get($idx, $token)
2652 if (isset($this->match[$idx])) {
2654 || $token == $this->match[$idx]->table_token) {
2655 return ($this->match[$idx]);
2660 function sess_cur_set($sess)
2662 static::$sess_cur = $sess;
2665 static function sess_cur_get()
2667 return(static::$sess_cur);
2669 } // end class Brisk
2671 function make_seed()
2673 list($usec, $sec) = explode(' ', microtime());
2674 return (float) $sec + ((float) $usec * 100000);
2677 function btrace_line($ar)
2679 GLOBAL $G_btrace_pref_sub;
2682 for ($i = 0 ; $i < count($ar) ; $i++) {
2683 $with_class = isset($ar[$i]['class']);
2684 $with_file = isset($ar[$i]['file']);
2685 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2686 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2687 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2688 ($with_file ? $ar[$i]['line'] : ""));
2694 function trace_ftok($id, $add)
2696 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2697 $tok=@ftok($id, $add);
2699 log_shme($tok.": ".$id." + ".$add);
2704 function log_mop($step, $log)
2708 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2711 $sess = Brisk::sess_cur_get();
2712 if (isset($sess) == FALSE)
2717 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2720 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2721 $btrace = btrace_line(debug_backtrace());
2724 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2725 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2731 function log_only2($log)
2735 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2738 $sess = Brisk::sess_cur_get();
2739 if (isset($sess) == FALSE)
2744 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2747 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2748 $btrace = btrace_line(debug_backtrace());
2751 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2752 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2757 function log_crit($log)
2761 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2764 $sess = Brisk::sess_cur_get();
2765 if (isset($sess) == FALSE)
2770 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2773 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2774 $btrace = btrace_line(debug_backtrace());
2777 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2778 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2783 function log_only($log)
2787 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2790 $sess = Brisk::sess_cur_get();
2791 if (isset($sess) == FALSE)
2796 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2799 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2800 $btrace = btrace_line(debug_backtrace());
2803 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2804 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2809 function log_main($log)
2813 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2816 $sess = Brisk::sess_cur_get();
2817 if (isset($sess) == FALSE)
2822 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2825 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2826 $btrace = btrace_line(debug_backtrace());
2829 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2830 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2835 function log_rd($log)
2839 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2842 $sess = Brisk::sess_cur_get();
2843 if (isset($sess) == FALSE)
2848 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2851 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2852 $btrace = btrace_line(debug_backtrace());
2855 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2856 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2861 function log_rd2($log)
2865 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2868 $sess = Brisk::sess_cur_get();
2869 if (isset($sess) == FALSE)
2874 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2877 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2878 $btrace = btrace_line(debug_backtrace());
2882 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2883 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2888 function log_send($log)
2892 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2895 $sess = Brisk::sess_cur_get();
2896 if (isset($sess) == FALSE)
2901 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2904 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2905 $btrace = btrace_line(debug_backtrace());
2908 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2909 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2914 function log_lock($log)
2918 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2921 $sess = Brisk::sess_cur_get();
2922 if (isset($sess) == FALSE)
2927 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2930 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2931 $btrace = btrace_line(debug_backtrace());
2934 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2935 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2940 function log_wr($log)
2944 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2947 $sess = Brisk::sess_cur_get();
2948 if (isset($sess) == FALSE)
2953 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2956 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2957 $btrace = btrace_line(debug_backtrace());
2960 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2961 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2966 function log_load($log)
2970 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2973 $sess = Brisk::sess_cur_get();
2974 if (isset($sess) == FALSE)
2979 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2982 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2983 $btrace = btrace_line(debug_backtrace());
2986 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2987 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2992 function log_auth($sess, $log)
2996 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2999 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3002 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3003 $btrace = btrace_line(debug_backtrace());
3006 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3007 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3012 function log_shme($log)
3016 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3019 $sess = Brisk::sess_cur_get();
3020 if (isset($sess) == FALSE)
3025 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3028 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3029 $btrace = btrace_line(debug_backtrace());
3032 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3033 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3040 // function log_legal($curtime, $sess, $name, $where, $mesg)
3041 function log_legal($curtime, $addr, $user, $where, $mesg)
3044 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3045 /* Unix time | session | nickname | IP | where was | mesg */
3046 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3047 ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'),
3048 $user->name, $addr, $where , $mesg));
3053 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3058 if ($sitted < PLAYERS_N) {
3066 if ($table == $cur_table)
3073 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3078 function show_notify($text, $tout, $butt, $w, $h)
3080 log_main("SHOW_NOTIFY: ".$text);
3081 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3084 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3086 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3087 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);
3090 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3092 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3095 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3096 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3099 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3100 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);
3104 function root_welcome($user)
3106 GLOBAL $root_wellarr, $G_lang;
3110 $dt = date("H:i ", $curtime);
3112 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3113 $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3120 function validate_sess($sess)
3122 if (strlen($sess) == SESS_LEN)
3128 function validate_name($name)
3130 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3132 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3134 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3141 function playsound($filename)
3143 return (sprintf('playsound("flasou", "%s");', $filename));
3146 function secstoword($secs)
3152 $mins = floor($secs / 60);
3154 if ($G_lang == 'en') {
3156 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3159 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3163 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3166 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3171 function sharedmem_sz($tok)
3173 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3174 log_main("shmop_open failed");
3177 $shm_sz = shmop_size($shm_id);
3178 shmop_close($shm_id);
3180 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3187 static function lock_data($is_exclusive)
3189 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3190 self::$delta_t = microtime(TRUE);
3191 log_lock("LOCK warrant [".self::$delta_t."]");
3199 static function unlock_data($res)
3203 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3212 static function lock_data($is_exclusive)
3214 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3215 self::$delta_t = microtime(TRUE);
3216 log_lock("LOCK poll [".self::$delta_t."]");
3224 static function unlock_data($res)
3228 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3234 function carousel_top()
3239 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));
3242 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>'));