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 dump_data()
2249 $brisk_ser = serialize($this);
2250 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2251 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2258 static function lock_data($is_exclusive)
2260 if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) {
2261 self::$delta_t = microtime(TRUE);
2262 log_lock("LOCK room [".self::$delta_t."]");
2270 static function unlock_data($res)
2274 log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]");
2280 function standup_content($user)
2285 if ($user->stat != 'room')
2288 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2289 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2294 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2296 $content = ' j_stand_cont( [ ';
2298 $user_cur_id = $user->idx_get();
2299 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2300 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2303 $flags = $this->user[$i]->flags;
2305 // sql record exists AND last donate > 2013-01-01
2306 if ($this->user[$i]->is_supp_custom()) {
2307 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2313 if ($this->user[$i]->subst == "standup") {
2314 if ($user_cur_id == $i) {
2318 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2319 xcape($this->user[$i]->name), $supp_comp_s);
2328 function table_content($user, $table_idx)
2334 // Si possono usare i dati nella classe table
2337 $sess = $user->sess;
2338 $table = $this->table[$table_idx];
2340 if ($user->stat != 'room')
2343 $user_cur_id = $user->idx_get();
2345 for ($i = 0 ; $i < $table->player_n ; $i++) {
2346 $user_cur = $this->user[$table->player[$i]];
2348 $flags = $user_cur->flags;
2350 if ($user_cur_id == $table->player[$i])
2353 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2354 if ($user_cur->is_supp_custom())
2355 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2359 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2360 xcape($user_cur->name), $supp_comp_s);
2365 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2370 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2372 GLOBAL $G_black_list;
2374 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2376 $enc = get_encoding($header);
2377 if (isset($header['User-Agent'])) {
2378 if (strstr($header['User-Agent'], "MSIE")) {
2379 $transp_type = "htmlfile";
2382 $transp_type = "xhr";
2386 $transp_type = "iframe";
2388 force_no_cache($header_out);
2394 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2395 $content = ob_get_contents();
2398 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2399 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2403 case "index_wr.php":
2405 // Enhance required: in the POST case, after the header you must get content
2406 // from the socket, waiting if necessary
2410 index_wr_main($this, $addr, $get, $post, $cookie);
2411 $content = ob_get_contents();
2414 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2418 case "index_rd.php":
2419 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2421 if ($transp == 'websocket')
2425 if (!isset($cookie['sess'])
2426 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2428 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2430 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2435 $this->sess_cur_set($user->sess);
2436 // close a previous opened index_read_ifra socket, if exists
2437 if (($prev = $user->rd_socket_get()) != NULL) {
2438 $s_a_p->socks_unset($user->rd_socket_get());
2439 fclose($user->rd_socket_get());
2440 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2441 $user->rd_socket_set(NULL);
2445 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2446 $response = headers_render($header_out, -1).$user->chunked_content($content);
2447 $response_l = mb_strlen($response, "ASCII");
2449 $wret = @fwrite($new_socket, $response, $response_l);
2450 if ($wret < $response_l) {
2451 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2452 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2455 $user->rd_cache_set("");
2457 fflush($new_socket);
2460 $s_a_p->socks_set($new_socket, $user, NULL);
2461 $user->rd_socket_set($new_socket);
2462 printf(" - qui ci siamo - ");
2469 if (!(BRISK_DEBUG & DBG_ENGI))
2471 fprintf(STDERR, "TEST.PHP running\n");
2472 if (isset($post['data'])) {
2473 $content = $post['data'];
2476 $content = "NO DATA AVAILABLE";
2478 $header_out['Content-Type'] = 'text/plain';
2479 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2483 /* FAR TODO: move all into an array of registered sub-apps */
2484 $subs = "briskin5/";
2485 $subs_l = strlen($subs);
2486 if (!strncmp($path, $subs, $subs_l)) {
2487 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2496 function match_add($idx, $match)
2498 $this->match[$idx] = $match;
2501 function match_del($idx)
2503 unset($this->match[$idx]);
2506 function match_get($idx, $token)
2508 if (isset($this->match[$idx])) {
2510 || $token == $this->match[$idx]->table_token) {
2511 return ($this->match[$idx]);
2516 function sess_cur_set($sess)
2518 static::$sess_cur = $sess;
2521 static function sess_cur_get()
2523 return(static::$sess_cur);
2525 } // end class Brisk
2527 function make_seed()
2529 list($usec, $sec) = explode(' ', microtime());
2530 return (float) $sec + ((float) $usec * 100000);
2533 function btrace_line($ar)
2535 GLOBAL $G_btrace_pref_sub;
2538 for ($i = 0 ; $i < count($ar) ; $i++) {
2539 $with_class = isset($ar[$i]['class']);
2540 $with_file = isset($ar[$i]['file']);
2541 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2542 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2543 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2544 ($with_file ? $ar[$i]['line'] : ""));
2550 function trace_ftok($id, $add)
2552 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2553 $tok=@ftok($id, $add);
2555 log_shme($tok.": ".$id." + ".$add);
2560 function log_mop($step, $log)
2564 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2567 $sess = Brisk::sess_cur_get();
2568 if (isset($sess) == FALSE)
2573 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2576 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2577 $btrace = btrace_line(debug_backtrace());
2580 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2581 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2587 function log_only2($log)
2591 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2594 $sess = Brisk::sess_cur_get();
2595 if (isset($sess) == FALSE)
2600 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2603 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2604 $btrace = btrace_line(debug_backtrace());
2607 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2608 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2613 function log_crit($log)
2617 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2620 $sess = Brisk::sess_cur_get();
2621 if (isset($sess) == FALSE)
2626 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2629 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2630 $btrace = btrace_line(debug_backtrace());
2633 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2634 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2639 function log_only($log)
2643 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2646 $sess = Brisk::sess_cur_get();
2647 if (isset($sess) == FALSE)
2652 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2655 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2656 $btrace = btrace_line(debug_backtrace());
2659 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2660 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2665 function log_main($log)
2669 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2672 $sess = Brisk::sess_cur_get();
2673 if (isset($sess) == FALSE)
2678 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2681 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2682 $btrace = btrace_line(debug_backtrace());
2685 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2686 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2691 function log_rd($log)
2695 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2698 $sess = Brisk::sess_cur_get();
2699 if (isset($sess) == FALSE)
2704 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2707 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2708 $btrace = btrace_line(debug_backtrace());
2711 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2712 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2717 function log_rd2($log)
2721 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2724 $sess = Brisk::sess_cur_get();
2725 if (isset($sess) == FALSE)
2730 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2733 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2734 $btrace = btrace_line(debug_backtrace());
2738 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2739 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2744 function log_send($log)
2748 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2751 $sess = Brisk::sess_cur_get();
2752 if (isset($sess) == FALSE)
2757 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2760 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2761 $btrace = btrace_line(debug_backtrace());
2764 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2765 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2770 function log_lock($log)
2774 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2777 $sess = Brisk::sess_cur_get();
2778 if (isset($sess) == FALSE)
2783 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2786 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2787 $btrace = btrace_line(debug_backtrace());
2790 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2791 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2796 function log_wr($log)
2800 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2803 $sess = Brisk::sess_cur_get();
2804 if (isset($sess) == FALSE)
2809 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2812 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2813 $btrace = btrace_line(debug_backtrace());
2816 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2817 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2822 function log_load($log)
2826 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2829 $sess = Brisk::sess_cur_get();
2830 if (isset($sess) == FALSE)
2835 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2838 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2839 $btrace = btrace_line(debug_backtrace());
2842 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2843 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2848 function log_auth($sess, $log)
2852 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2855 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
2858 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2859 $btrace = btrace_line(debug_backtrace());
2862 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2863 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
2868 function log_shme($log)
2872 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
2875 $sess = Brisk::sess_cur_get();
2876 if (isset($sess) == FALSE)
2881 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
2884 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2885 $btrace = btrace_line(debug_backtrace());
2888 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2889 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2896 // function log_legal($curtime, $sess, $name, $where, $mesg)
2897 function log_legal($curtime, $addr, $user, $where, $mesg)
2900 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
2901 /* Unix time | session | nickname | IP | where was | mesg */
2902 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
2903 ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'),
2904 $user->name, $addr, $where , $mesg));
2909 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
2914 if ($sitted < PLAYERS_N) {
2922 if ($table == $cur_table)
2929 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
2934 function show_notify($text, $tout, $butt, $w, $h)
2936 log_main("SHOW_NOTIFY: ".$text);
2937 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
2940 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
2942 log_main("SHOW_NOTIFY OPAQUE: ".$text);
2943 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);
2946 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
2948 log_main("SHOW_NOTIFY OPAQUE: ".$text);
2951 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
2952 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
2955 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
2956 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);
2960 function root_welcome($user)
2962 GLOBAL $root_wellarr, $G_lang;
2966 $dt = date("H:i ", $curtime);
2968 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
2969 $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
2976 function validate_sess($sess)
2978 if (strlen($sess) == SESS_LEN)
2984 function validate_name($name)
2986 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
2988 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
2990 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
2997 function playsound($filename)
2999 return (sprintf('playsound("flasou", "%s");', $filename));
3002 function secstoword($secs)
3008 $mins = floor($secs / 60);
3010 if ($G_lang == 'en') {
3012 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3015 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3019 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3022 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3027 function sharedmem_sz($tok)
3029 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3030 log_main("shmop_open failed");
3033 $shm_sz = shmop_size($shm_id);
3034 shmop_close($shm_id);
3036 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3043 static function lock_data($is_exclusive)
3045 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3046 self::$delta_t = microtime(TRUE);
3047 log_lock("LOCK warrant [".self::$delta_t."]");
3055 static function unlock_data($res)
3059 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3068 static function lock_data($is_exclusive)
3070 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3071 self::$delta_t = microtime(TRUE);
3072 log_lock("LOCK poll [".self::$delta_t."]");
3080 static function unlock_data($res)
3084 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3090 function carousel_top()
3095 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));
3098 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>'));