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.1";
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',
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);
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;
957 function Brisk($crystal_filename) {
958 $this->crystal_filename = $crystal_filename;
959 $this->user = array();
960 $this->table = array();
961 $this->match = array();
963 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
964 $this->user[$i] = User::create($this, $i, "", "");
967 for ($i = 0 ; $i < TABLES_N ; $i++) {
968 $this->table[$i] = Table::create($i);
971 $row = ( (((int)($i / 4)) % 2) == 0 );
972 $col = ($i % 2 == 0);
973 $this->table[$i]->auth_only = (($row && $col) || (!$row && !$col));
976 $this->table[$i]->auth_only = FALSE;
979 if ($i < TABLES_AUTH_N)
980 $this->table[$i]->auth_only = TRUE;
982 $this->table[$i]->auth_only = FALSE;
984 $this->garbage_timeout = 0;
985 $this->shm_sz = SHM_DIMS_MIN;
987 $this->delay_mgr = new Delay_Manager(1.5);
989 static::$sess_cur = FALSE;
992 function garbage_manager($force)
994 GLOBAL $G_lang, $mlang_brisk, $G_base;
998 log_rd2("garbage_manager START");
1000 /* Garbage collector degli utenti in timeout */
1001 $curtime = microtime(TRUE);
1003 $delta = $this->delay_mgr->delta_get($curtime);
1005 if (!$force && !($this->garbage_timeout < $curtime)) {
1006 $this->delay_mgr->lastcheck_set($curtime);
1010 // Before all align times with table timeout
1011 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1012 $table_cur = $this->table[$table_idx];
1013 // if the table is complete and exists its shared mem we get the info about users lacc
1015 if ($table_cur->player_n == PLAYERS_N) {
1016 log_main("PLAYERS == N TABLE ".$table_idx);
1019 $no_recovery = FALSE;
1020 if (isset($this->match[$table_idx])) {
1021 $bin5 = $this->match[$table_idx];
1023 if ($table_cur->table_token != $bin5->table_token) {
1024 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1025 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1026 $no_recovery = TRUE;
1030 if ($bin5 != FALSE) {
1034 log_main("garbage_manager: bri loaded successfully.");
1035 $bin5->garbage_manager(TRUE);
1037 $bin5_table = $bin5->table[0];
1039 // is the end of the table
1041 if ($bin5->the_end == TRUE) {
1043 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1045 log_main("garbage_manager: INSIDE THE END.");
1047 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1048 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1049 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1052 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1053 // stat must be "table" by definition
1054 $user_cur = $this->user[$table_cur->player[$i]];
1055 $bin5_user = $bin5->user[$i];
1057 $user_cur->subst = $bin5_user->subst;
1058 $user_cur->step = $bin5_user->step;
1059 $user_cur->lacc = $bin5_user->lacc;
1060 $user_cur->laccwr = $bin5_user->lacc;
1061 $user_cur->bantime = $bin5_user->bantime;
1064 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1066 $this->room_join_wakeup($user_cur, FALSE, 0);
1067 $table_cur->table_token = "";
1068 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1070 $this->match_del($table_idx);
1073 log_main("gm:: save_data");
1075 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1076 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1079 } // if ($bin5 == FALSE
1080 else if ($no_recovery == FALSE) {
1081 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1083 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1084 $user_cur = $this->user[$table_cur->player[$i]];
1085 $user_cur->subst = "shutdowner";
1086 $user_cur->step_inc();
1088 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1089 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1090 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1091 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1092 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1093 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1094 $user_cur->step_inc();
1097 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1098 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1099 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1101 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1103 $this->room_join_wakeup($user_cur, TRUE, -2);
1104 $table_cur->table_token = "";
1107 } // if ($table_cur->player_n == PLAYERS_N) {
1108 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1110 log_rd2("out new loop.");
1112 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1113 $user_cur = $this->user[$i];
1115 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1117 if ($user_cur->sess == "")
1120 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1121 // Auto logout dell'utente
1122 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1124 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1125 log_auth($user_cur->sess, "Autologout session.");
1129 log_rd2("AUTO LOGOUT.");
1130 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1131 $this->room_wakeup($user_cur);
1132 else if ($user_cur->subst == 'standup')
1133 $this->room_outstandup($user_cur);
1135 log_rd2("LOGOUT FROM WHAT ???");
1139 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1140 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1141 $this->room_wakeup($user_cur);
1142 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1143 /* 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" */
1144 $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);
1145 $user_cur->step_inc();
1149 log_rd2("GARBAGE UPDATED!");
1151 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1154 $this->delay_mgr->lastcheck_set($curtime);
1158 function show_room($user_step, $user)
1160 GLOBAL $G_lang, $mlang_brisk;
1161 log_main("show_room: username: ".$user->name);
1163 $ret = sprintf('gst.st = %d; ', $user_step);
1165 $prefs = Client_prefs::from_user($user);
1166 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1169 if ($user->flags & USER_FLAG_ISOLAUTH) {
1170 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1172 else if ($user->flags & USER_FLAG_LISTAUTH) {
1173 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1176 $ret .= 'list_set(\'all\', false, \'\' ); ';
1180 if ($user->subst == 'standup')
1181 $ret .= "tra.show(); ";
1183 $ret .= "tra.hide(); ";
1185 $ret .= sprintf('stat = "%s";', $user->stat);
1187 $ret .= root_welcome($user);
1188 if ($user->flags & USER_FLAG_DBFAILED) {
1189 $ret .= "gst.st = ".($user->step+1)."; ";
1190 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1193 $ret .= sprintf('subst = "%s";', $user->subst);
1194 $ret .= $user->myname_innerHTML();
1196 for ($i = 0 ; $i < TABLES_N ; $i++) {
1198 $ret .= $this->table_content($user, $i);
1199 // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table,
1200 // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
1201 $ret .= $this->table[$i]->act_content($user);
1202 if ($this->table[$i]->wag_own != -1)
1203 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1205 $ret .= sprintf('tra.rem(%d); ', $i);
1207 $ret .= $this->standup_content($user);
1208 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1214 function room_wakeup($user)
1216 $table_idx = $user->table;
1217 $table = $this->table[$table_idx];
1219 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1223 $from_table = ($user->stat == "table");
1225 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1227 for ($i = 0 ; $i < $table->player_n ; $i++) {
1228 $user_cur = $this->user[$table->player[$i]];
1229 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1231 if ($user->idx_get() != $table->player[$i]) {
1232 $user_cur->stat_set("room");
1233 $user_cur->subst = "sitdown";
1234 $user_cur->laccwr = $curtime;
1236 else if ($user->sess != "") {
1237 $user_cur->stat_set("room");
1238 $user_cur->subst = "standup";
1239 $user_cur->laccwr = $curtime;
1240 $user_cur->table = -1;
1245 $user->stat_set("room");
1246 $user->subst = "standup";
1247 $user->laccwr = $curtime;
1250 $remove_wagon = FALSE;
1251 if($table->wag_own == $user->idx_get()) {
1252 $table->wag_reset($curtime);
1253 $remove_wagon = TRUE;
1257 /* aggiorna l'array dei giocatori al tavolo. */
1258 $table->user_rem($this, $user);
1260 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1261 $user_cur = $this->user[$i];
1262 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1265 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1267 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1268 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1269 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1270 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1271 log_main("DOCUMENT.index.php: from table");
1273 else if ($user_cur->stat == "room") {
1274 log_main("DOCUMENT.index.php: from table");
1276 $ret .= $this->table_content($user_cur, $table_idx);
1277 $ret .= $this->standup_content($user_cur);
1279 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1280 $ret .= $table->act_content($user);
1282 if ($user->idx_get() == $i) {
1283 // set the new status
1284 $ret .= 'subst = "standup"; tra.show(); ';
1285 // clean the action buttons in other tables
1286 for ($e = 0 ; $e < TABLES_N ; $e++) {
1287 if ($this->table[$e]->player_n < PLAYERS_N) {
1288 // $ret .= table_act_content(TRUE, 0, $e, $user->table,
1289 // ($this->table[$e]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
1290 $ret .= $this->table[$e]->act_content($user);
1295 // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table,
1296 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1297 $ret .= $table->act_content($user_cur);
1300 log_wr("ROOM_WAKEUP: ".$ret);
1301 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1302 $user_cur->step_inc();
1306 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1308 $table_idx = $user->table;
1309 $table = $this->table[$table_idx];
1311 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1314 $user_wup = array();
1316 $user_tab = array();
1318 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1320 for ($i = 0 ; $i < $table->player_n ; $i++) {
1321 $user_cur = $this->user[$table->player[$i]];
1322 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1323 if ($user_cur->sess != "") {
1324 if ($update_lacc == TRUE) {
1325 $user_cur->laccwr = $curtime;
1327 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1328 if ($user_cur->subst == "shutdowned") {
1329 $user_cur->stat_set("room");
1330 $user_cur->subst = "sitdown";
1332 else if ($user_cur->subst == "shutdowner") {
1333 $user_cur->stat_set("room");
1334 $user_cur->subst = "standup";
1335 $user_cur->table = -1;
1336 $user_wup[$user_wup_n++] = $user_cur;
1338 $remove_wagon = FALSE;
1339 if($table->wag_own == $table->player[$i]) {
1340 $remove_wagon = TRUE;
1341 $table->wag_reset($curtime);
1344 $user_tab[$user_tab_n++] = $table->player[$i];
1348 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1349 $table->user_rem($this, $user_wup[$wup_idx]);
1351 /* aggiorna l'array dei giocatori al tavolo. */
1353 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1354 log_main("START LOOP");
1355 $user_cur = $this->user[$i];
1356 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1357 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1362 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1364 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1365 if ($user_cur->stat == "room") {
1366 log_main("DOCUMENT.index.php from table");
1368 $ret .= $this->table_content($user_cur, $table_idx);
1369 $ret .= $this->standup_content($user_cur);
1371 // $ret .= table_act_content(FALSE, 0, $table_idx, $user_cur->table,
1372 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1373 $ret .= $table->act_content($user_cur);
1376 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1377 if ($user_tab[$tab_idx] == $i)
1380 // for users that wakeup the room will be reconstructed by index_rd.php
1381 if ($tab_idx < $user_tab_n) {
1382 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1384 // ARRAY_POP DISABLED
1385 // if ($trans_delta == 0)
1386 // while (array_pop($user_cur->comm) != NULL);
1388 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1389 $user_cur->comm[$user_cur->step % COMM_N] = "";
1390 $user_cur->step_inc();
1391 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1392 $user_cur->step_inc();
1393 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1397 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1399 log_main("JOIN_WAKEUP more");
1400 // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table,
1401 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1402 $ret .= $table->act_content($user_cur);
1404 log_main("JOIN_WAKEUP end more");
1406 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1407 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1408 $user_cur->step_inc();
1412 function guarantee_show($user, $user_login, $dt)
1414 GLOBAL $G_lang, $mlang_brisk, $G_base;
1420 if ($user_login == "") {
1424 if (($bdb = BriskDB::create()) == FALSE) {
1428 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1432 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1433 $guar_login = $guar_item->login_get();
1438 $user_tos_vers = $user_item->tos_vers_get();
1440 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1441 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1442 $dt, NICKSERV, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1444 else if ($guar_login == "") {
1445 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1446 $dt, NICKSERV, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1448 else if ($guar_login == $user_login) {
1449 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1450 $dt, NICKSERV, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1453 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1454 $dt, NICKSERV, sprintf($mlang_brisk['gua_info'][$G_lang],
1455 xcape($user_login), xcape($guar_login)));
1460 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1463 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1469 function room_outstandup($user)
1471 $this->room_sitdown($user, -1);
1474 function table_update($user)
1476 log_main("table_update: pre - USER: ".$user->name);
1478 $table_idx = $user->table;
1480 if ($table_idx > -1)
1481 $table = $this->table[$table_idx];
1483 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1485 $user_cur = $this->user[$i];
1486 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1489 $ret = "gst.st = ".($user_cur->step+1)."; ";
1490 if ($table_idx > -1)
1491 $ret .= $this->table_content($user_cur, $table_idx);
1493 if ($user->idx_get() == $i) {
1494 $ret .= $user->myname_innerHTML();
1496 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1497 $user_cur->step_inc();
1500 log_main("table_update: post");
1503 function room_sitdown($user, $table_idx)
1505 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1509 if ($table_idx > -1 && $table_idx < TABLES_N) {
1510 $table = $this->table[$table_idx];
1513 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1514 for ($i = 0 ; $i < TABLES_N ; $i++) {
1515 if ($table->wag_own == $table->player[$i]) {
1516 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1517 $table->wag_reset(time());
1524 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1526 $user_cur = $this->user[$i];
1527 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1530 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1531 if ($table_idx > -1)
1532 $ret .= $this->table_content($user_cur, $table_idx);
1533 $ret .= $this->standup_content($user_cur);
1535 if ($user->idx_get() == $i) {
1536 $ret .= 'subst = "sitdown"; tra.hide(); ';
1537 // clean the action buttons in other tables
1538 for ($e = 0 ; $e < TABLES_N ; $e++) {
1539 $ret .= $this->table[$e]->act_content($user_cur);
1542 else if ($table_idx > -1) {
1543 if ($table->player_n == PLAYERS_N) {
1544 // $ret .= table_act_content(($user_cur->subst == 'standup'), PLAYERS_N, $table_idx, $user_cur->table,
1545 /// ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1546 $ret .= $table->act_content($user_cur);
1549 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1550 $user_cur->step_inc();
1554 function chatt_send($user, $mesg)
1556 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1560 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1562 $dt = date("H:i ", $curtime);
1573 $is_normchat = FALSE;
1574 /* for old isolation management $is_ticker = FALSE; */
1575 $update_room = FALSE;
1577 if (strcmp($msg, "/tav") == 0 ||
1578 strncmp($msg, "/tav ", 5) == 0) {
1580 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1581 /* 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>" */
1582 $msg = $mlang_brisk['tickmust'][$G_lang];
1583 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1588 $table = $this->table[$user->table];
1590 if ($table->wag_own != -1) {
1591 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1592 $msg = $mlang_brisk['tickjust'][$G_lang];
1593 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1598 $dtime = $curtime - $table->wag_tout;
1599 if ($dtime < EXPIRE_TIME_WAG) {
1600 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1601 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1602 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1603 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1608 $msg = substr($msg, 5);
1610 $table->wag_set($user->idx_get(), $msg);
1611 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1612 $to_room = $to_user;
1613 /* for old isolation management $is_ticker = TRUE; */
1615 } // /tav chat command
1617 else if (strncmp($msg, "/alarm ", 7) == 0) {
1618 if (strncmp($msg, "/alarm to ", 10) == 0) {
1619 $sp_pos = strpos($msg, " ", 10);
1620 $target = substr($msg, 10, $sp_pos - 10);
1621 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1625 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1628 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1629 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1630 $msg = $mlang_brisk['alarpass'][$G_lang];
1631 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1636 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1637 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1638 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1639 $to_user = sprintf('chatt_sub("%s", [2, "%s"],%s);',
1640 $dt, NICKSERV, $prestr);
1642 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1643 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1644 /* MLANG: "chiudi" */
1645 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1647 } // /alarm chat command
1648 else if (strncmp($msg, "/listen ", 8) == 0) {
1649 $arg = substr($msg, 8);
1651 if (strcasecmp($arg, "isolation") == 0) {
1653 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1654 $user->table >= TABLES_AUTH_N) {
1655 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]);
1659 $user->flags &= ~USER_FLAG_MAP_AUTH;
1660 $user->flags |= USER_FLAG_ISOLAUTH;
1661 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1664 else if (strcasecmp($arg, "auth") == 0) {
1665 $flags_old = $user->flags;
1666 $user->flags &= ~USER_FLAG_MAP_AUTH;
1667 $user->flags |= USER_FLAG_LISTAUTH;
1668 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1671 $flags_old = $user->flags;
1672 $user->flags &= ~USER_FLAG_MAP_AUTH;
1673 $to_user = 'list_set(\'all\', true, \'\'); ';
1676 // if from isolation redraw standup area
1677 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1678 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1682 else if (strcmp($msg, "/authreq") == 0) {
1683 if ($user->flags & USER_FLAG_AUTH) {
1684 $to_user = sprintf('authbox(300,200);');
1687 /* 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." */
1688 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]);
1691 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1692 if ($user->flags & USER_FLAG_AUTH) {
1693 $to_user = sprintf('mesgtoadmbox(500,300);');
1696 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1697 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]);
1700 else if (strncmp($msg, "/nick ", 6) == 0) {
1701 log_main("chatt_send BEGIN");
1704 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1705 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
1709 $msg = "COMMAND ".$msg;
1710 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1711 $user_cur = $this->user[$i];
1713 if ($user_cur->sess == '')
1715 if (strcasecmp($user_cur->name,$name_new) == 0)
1718 if ($i < MAX_PLAYERS) {
1719 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1720 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1724 /* 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>" */
1725 if ($user->flags & USER_FLAG_AUTH) {
1726 if (strcasecmp($user->name,$name_new) != 0) {
1727 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1728 ($user->subst == 'standup' ||
1729 ($user->subst != 'standup' && $this->table[$user->table]->auth_only == FALSE)
1732 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1733 for ($i = 0 ; $i < TABLES_N ; $i++) {
1734 $to_user .= $this->table[$i]->act_content($user);
1738 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
1743 $user->name = $name_new; // OK - nick changed
1744 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1745 if (($user->flags & USER_FLAG_AUTH) == 0) {
1746 if (($bdb = BriskDB::create()) != FALSE) {
1748 /* 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>" */
1749 if ($bdb->login_exists($name_new)) {
1750 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1751 $to_user .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1756 log_main("chatt_send start set");
1758 $update_room = TRUE;
1760 } // nick chat command
1761 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1762 $guar_user = substr($msg, 6);
1764 $this->guarantee_show($user, $guar_user, $dt);
1766 else if (strncmp($msg, "/st ", 4) == 0) {
1767 log_main("chatt_send BEGIN");
1770 $st_str = substr($msg, 4);
1772 if (strcasecmp($st_str, "normale") == 0) {
1773 $st = USER_FLAG_S_NORM;
1775 else if (strcasecmp($st_str, "pausa") == 0) {
1776 $st = USER_FLAG_S_PAU;
1778 else if (strcasecmp($st_str, "fuori") == 0) {
1779 $st = USER_FLAG_S_OUT;
1781 else if (strcasecmp($st_str, "cane") == 0) {
1782 $st = USER_FLAG_S_DOG;
1784 else if (strcasecmp($st_str, "cibo") == 0) {
1785 $st = USER_FLAG_S_EAT;
1787 else if (strcasecmp($st_str, "lavoro") == 0) {
1788 $st = USER_FLAG_S_WRK;
1790 else if (strcasecmp($st_str, "sigaretta") == 0) {
1791 $st = USER_FLAG_S_SMK;
1793 else if (strcasecmp($st_str, "presente") == 0) {
1794 $st = USER_FLAG_S_EYE;
1796 else if (strcasecmp($st_str, "coniglio") == 0) {
1797 $st = USER_FLAG_S_RABB;
1799 else if (strcasecmp($st_str, "calcio") == 0) {
1800 $st = USER_FLAG_S_SOCC;
1802 else if (strcasecmp($st_str, "pupo") == 0) {
1803 $st = USER_FLAG_S_BABY;
1805 else if (strcasecmp($st_str, "pulizie") == 0) {
1806 $st = USER_FLAG_S_MOP;
1808 else if (strcasecmp($st_str, "babbo") == 0) {
1809 $st = USER_FLAG_S_BABBO;
1811 else if (strcasecmp($st_str, "renna") == 0) {
1812 $st = USER_FLAG_S_RENNA;
1814 else if (strcasecmp($st_str, "pupazzo") == 0) {
1815 $st = USER_FLAG_S_PUPAZ;
1817 else if (strcasecmp($st_str, "vischio") == 0) {
1818 $st = USER_FLAG_S_VISCH;
1821 /* MLANG: "Questo stato non esiste." */
1822 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]);
1826 log_main("chatt_send start set");
1827 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1828 $update_room = TRUE;
1829 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1832 } // nick chat command
1834 else { // normal chat line
1835 $is_normchat = TRUE;
1836 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1838 $user->chat_dlt = $user->chat_dlt * 2;
1839 if ($user->chat_dlt > 120)
1840 $user->chat_dlt = 120;
1842 else if ($user->chat_lst == $msg)
1844 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
1845 $user->chat_ban = $curtime;
1846 $user->chat_dlt = 5;
1850 $user->chat_ban = 0;
1851 $user->chat_dlt = 0;
1855 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
1858 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
1859 // temporary silentiation for troll (will became array check)
1860 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
1861 $to_room = $to_user;
1864 log_legal($curtime, $user->ip, $user,
1865 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
1867 $user->chat_lst = "$msg";
1868 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
1878 // Output to clients
1881 if ($to_user != FALSE) {
1882 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
1883 $user->comm[$user->step % COMM_N] .= $to_user;
1887 if ($to_room != FALSE) {
1888 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1889 $user_cur = $this->user[$i];
1890 if ($target != "" && $user_cur->name != $target)
1892 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
1895 if ($is_normchat == TRUE) {
1896 // use MAP_AUTH to check if auth or isolation
1897 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
1898 if (($user->flags & USER_FLAG_AUTH) == 0) {
1904 else if ($is_ticker) {
1905 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
1906 if ($user->table >= TABLES_AUTH_N)
1911 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1912 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
1913 $user_cur->step_inc();
1918 // FIXME BRISK4: include for each kind of table
1919 require_once("${G_base}briskin5/Obj/briskin5.phh");
1920 // Before all align times with table timeout
1921 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1922 if (isset($this->match[$table_idx])) {
1923 $bin5 = $this->match[$table_idx];
1925 $bin5_table = $bin5->table[0];
1926 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1927 // stat must be "table" by definition
1928 $bin5_user = $bin5->user[$i];
1930 if ($target != "" && $bin5_user->name != $target)
1932 log_main("writa: ".$user_mesg);
1933 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
1934 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
1935 $bin5_user->step_inc();
1937 } // if (isset($this->match
1938 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1939 } // if ($to_tabl == true ...
1942 if ($user->stat == 'room' && $user->subst == 'standup') {
1943 $this->standup_update($user);
1945 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
1946 log_main("chatt_send pre table update");
1947 $this->table_update($user);
1948 log_main("chatt_send post table update");
1950 } // if ($update_room ...
1953 } // function chatt_send( ...
1955 function get_user($sess, &$idx)
1959 if (validate_sess($sess)) {
1960 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1961 if (strcmp($sess, $this->user[$i]->sess) == 0) {
1964 $ret = $this->user[$i];
1968 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
1969 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
1970 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
1973 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
1980 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
1983 * if ($idx > -1 && ret == FALSE) => duplicated nick
1984 * if ($idx == -2 && ret == FALSE) => invalid name
1985 * if ($idx == -3 && ret == FALSE) => wrong password
1986 * if ($idx == -1 && ret == FALSE) => no space left
1987 * if ($idx == 0 && ret == user) => SUCCESS
1988 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
1991 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
1997 $authenticate = FALSE;
1999 $login_exists = FALSE;
2001 $ghost_auth = FALSE;
2006 if (($name_new = validate_name($name)) == FALSE) {
2011 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2012 if (validate_sess($sess) == FALSE)
2015 /* if pass != FALSE verify the login with pass */
2016 log_auth("XXX", "auth1");
2018 if (($bdb = BriskDB::create()) != FALSE) {
2020 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2021 log_auth("XXX", "auth2");
2022 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2023 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2025 if ($authenticate != FALSE) {
2026 $user_type = $authenticate->type_get();
2034 $login_exists = $bdb->login_exists($name_new);
2038 // if db is down, send a warning and verify only current users
2039 // no actions at this moment
2041 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2043 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2047 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2049 continue; // NOTE: CHECK IT !!
2051 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2052 if ($authenticate != FALSE) {
2054 $ghost_auth = ($this->user[$i]->flags & USER_FLAG_AUTH);
2065 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2067 /* there is another user logged with your account and you and him have authenticated => new user
2068 get the session of the old user */
2069 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2072 $ghost_user = $this->user[$ghost];
2074 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2075 $ghost_user->step_inc();
2078 $ghost_user->sess = $sess;
2081 $ghost_user->sess = $sess;
2084 // If user at the table we need to update the table data too
2085 $table_idx = $ghost_user->table;
2086 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2087 require_once("${G_base}briskin5/Obj/briskin5.phh");
2088 if (isset($this->match[$table_idx])) {
2089 $bin5 = $this->match[$table_idx];
2091 if ($bin5->the_end != TRUE) {
2092 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2093 $bin5->user[$ghost_user->table_pos]->step_inc();
2094 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2100 return ($this->user[$ghost]);
2102 else if ($idx != -1 && $i == MAX_PLAYERS) {
2107 $this->user[$idx]->sess = $sess;
2110 $this->user[$idx]->sess = $sess;
2112 $this->user[$idx]->name = $name_new; // OK - add new user
2113 $this->user[$idx]->stat_set("room");
2114 $this->user[$idx]->step_set(0);
2115 while (array_pop($this->user[$idx]->comm) != NULL);
2116 $this->user[$idx]->subst = "standup";
2117 $this->user[$idx]->lacc = $curtime;
2118 $this->user[$idx]->laccwr = $curtime;
2119 $this->user[$idx]->bantime = 0;
2120 $this->user[$idx]->ip = $ip;
2122 $this->user[$idx]->rec = $authenticate;
2123 fprintf(STDERR, "MOP: [%s]\n", $authenticate->supp_comp);
2124 $this->user[$idx]->flags = $user_type;
2125 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2126 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2127 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2129 if ($authenticate != FALSE) {
2130 $this->user[$idx]->code = $authenticate->code_get();
2132 // all this part is included in the db server
2133 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2135 if (isset($cookie['CO_list'])) {
2136 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2137 if (strcmp($cookie['CO_list'], "auth") == 0) {
2138 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2139 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2141 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2142 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2143 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2146 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2151 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2154 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2156 log_main("ghost: rename!");
2157 $ghost_user = $this->user[$ghost];
2159 if ($ghost_auth == FALSE) {
2160 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2161 $ghostname = 'ghost'.$sfx;
2162 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2163 if (strcmp("", $this->user[$i]->sess) == 0)
2166 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2171 if ($ghostname != '')
2175 $ghost_user->name = $ghostname;
2177 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2178 $this->standup_update($ghost_user);
2181 log_main("chatt_send pre table update");
2182 $this->table_update($ghost_user);
2183 log_main("chatt_send post table update");
2185 } // if ($ghost_auth == FALSE
2187 // FIXME: cacciare il vecchio utente room && table (if needed)
2188 $ghost_user->the_end = TRUE;
2189 $ghost_user->lacc = 0;
2190 $this->garbage_manager(TRUE);
2192 } // if ($ghost > -1) {
2197 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));
2199 $ret = $this->user[$real_idx];
2206 function standup_update($user)
2208 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2209 $user_cur = $this->user[$i];
2210 if ($user_cur->sess == '')
2213 log_main("STANDUP START: ".$user_cur->stat);
2215 if ($user_cur->stat == 'room') {
2216 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2217 if ($user->idx_get() == $i) {
2218 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2220 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2222 $user_cur->step_inc();
2228 static function create($crystal_filename)
2230 if (($brisk_ser = @file_get_contents($crystal_filename)) == FALSE ||
2231 ($brisk = unserialize($brisk_ser)) == FALSE) {
2232 fprintf(STDERR, "NEW ROOM\n");
2233 $brisk = new Brisk($crystal_filename);
2236 fprintf(STDERR, "ROOM FROM FILE\n");
2237 rename($crystal_filename, $crystal_filename.".old");
2244 function load_data()
2249 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) {
2250 log_main("ftok failed");
2254 if (($shm_sz = sharedmem_sz($tok)) == -1) {
2255 log_main("shmop_open failed");
2259 $shm_sz = SHM_DIMS_MIN;
2261 if ($shm = shm_attach($tok, $shm_sz)) {
2262 $brisk = @shm_get_var($shm, $tok); // CHECKED BELOW
2264 log_only("bri == ".($brisk == FALSE ? "FALSE" : "TRUE")." bri === ".($brisk === FALSE ? "FALSE" : "TRUE")." bri isset ".(isset($brisk) ? "TRUE" : "FALSE"));
2266 log_only("bri count ".count($brisk));
2268 if ($brisk == FALSE) {
2269 log_only("INIT MAIN DATA");
2272 $brisk = Brisk::create();
2274 log_shme("Brisk::create");
2276 if (Brisk::save_data($brisk) == FALSE)
2281 $brisk->shm_sz = $shm_sz;
2285 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2286 if (($brisk->user[$i] = User::load_data($i, FALSE)) == FALSE) {
2287 log_crit("User::load_data failed");
2291 if ($i < MAX_PLAYERS) {
2297 // SHSPLIT: load users from the shared memory
2306 function save_data_orig($brisk)
2312 // var_dump($brisk);
2314 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2317 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2318 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2321 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2322 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2326 if (shm_remove($shm) === FALSE) {
2327 log_only("REMOVE FALLITA");
2331 $brisk->shm_sz += SHM_DIMS_DLT;
2339 function dump_data()
2341 $brisk_ser = serialize($this);
2342 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2343 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2350 function save_data($brisk)
2357 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2360 // SHSPLIT: before save the $brisk you must save users,
2361 // detach from main struct and (then) reattach
2362 $user_park = array();
2363 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2364 $user_park[$i] = $brisk->user[$i];
2365 $brisk->user[$i] = FALSE;
2368 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2369 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2372 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2373 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2374 log_shme("Brisk::save_data");
2378 if (shm_remove($shm) === FALSE) {
2379 log_only("REMOVE FALLITA");
2383 $brisk->shm_sz += SHM_DIMS_DLT;
2389 // SHSPLIT: reattach users to the room class
2390 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2391 User::save_data($user_park[$i], $i);
2392 $brisk->user[$i] = $user_park[$i];
2394 log_load("FINISH: ".($ret == TRUE ? "TRUE" : "FALSE"));
2399 static function lock_data($is_exclusive)
2401 if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) {
2402 self::$delta_t = microtime(TRUE);
2403 log_lock("LOCK room [".self::$delta_t."]");
2411 static function unlock_data($res)
2415 log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]");
2421 function standup_content($user)
2426 if ($user->stat != 'room')
2429 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2430 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2435 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2437 $content = ' j_stand_cont( [ ';
2439 $user_cur_id = $user->idx_get();
2440 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2441 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2444 $flags = $this->user[$i]->flags;
2446 // sql record exists AND last donate > 2013-01-01
2447 if ($this->user[$i]->is_supp_custom()) {
2448 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2454 if ($this->user[$i]->subst == "standup") {
2455 if ($user_cur_id == $i) {
2459 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2460 xcape($this->user[$i]->name), $supp_comp_s);
2469 function table_content($user, $table_idx)
2475 // Si possono usare i dati nella classe table
2478 $sess = $user->sess;
2479 $table = $this->table[$table_idx];
2481 if ($user->stat != 'room')
2484 $user_cur_id = $user->idx_get();
2486 for ($i = 0 ; $i < $table->player_n ; $i++) {
2487 $user_cur = $this->user[$table->player[$i]];
2489 $flags = $user_cur->flags;
2491 if ($user_cur_id == $table->player[$i])
2494 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2495 if ($user_cur->is_supp_custom())
2496 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2500 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2501 xcape($user_cur->name), $supp_comp_s);
2506 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2511 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2513 GLOBAL $G_black_list;
2515 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2517 $enc = get_encoding($header);
2518 if (isset($header['User-Agent'])) {
2519 if (strstr($header['User-Agent'], "MSIE")) {
2520 $transp_type = "htmlfile";
2523 $transp_type = "xhr";
2527 $transp_type = "iframe";
2529 force_no_cache($header_out);
2535 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2536 $content = ob_get_contents();
2539 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2540 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2544 case "index_wr.php":
2546 // Enhance required: in the POST case, after the header you must get content
2547 // from the socket, waiting if necessary
2551 index_wr_main($this, $addr, $get, $post, $cookie);
2552 $content = ob_get_contents();
2555 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2559 case "index_rd.php":
2560 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2562 if ($transp == 'websocket')
2566 if (!isset($cookie['sess'])
2567 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2569 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2571 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2576 $this->sess_cur_set($user->sess);
2577 // close a previous opened index_read_ifra socket, if exists
2578 if (($prev = $user->rd_socket_get()) != NULL) {
2579 $s_a_p->socks_unset($user->rd_socket_get());
2580 fclose($user->rd_socket_get());
2581 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2582 $user->rd_socket_set(NULL);
2586 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2587 $response = headers_render($header_out, -1).$user->chunked_content($content);
2588 $response_l = mb_strlen($response, "ASCII");
2590 $wret = @fwrite($new_socket, $response, $response_l);
2591 if ($wret < $response_l) {
2592 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2593 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2596 $user->rd_cache_set("");
2598 fflush($new_socket);
2601 $s_a_p->socks_set($new_socket, $user, NULL);
2602 $user->rd_socket_set($new_socket);
2603 printf(" - qui ci siamo - ");
2610 if (!(BRISK_DEBUG & DBG_ENGI))
2612 fprintf(STDERR, "TEST.PHP running\n");
2613 if (isset($post['data'])) {
2614 $content = $post['data'];
2617 $content = "NO DATA AVAILABLE";
2619 $header_out['Content-Type'] = 'text/plain';
2620 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2624 /* FAR TODO: move all into an array of registered sub-apps */
2625 $subs = "briskin5/";
2626 $subs_l = strlen($subs);
2627 if (!strncmp($path, $subs, $subs_l)) {
2628 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2637 function match_add($idx, $match)
2639 $this->match[$idx] = $match;
2642 function match_del($idx)
2644 unset($this->match[$idx]);
2647 function match_get($idx, $token)
2649 if (isset($this->match[$idx])) {
2651 || $token == $this->match[$idx]->table_token) {
2652 return ($this->match[$idx]);
2657 function sess_cur_set($sess)
2659 static::$sess_cur = $sess;
2662 static function sess_cur_get()
2664 return(static::$sess_cur);
2666 } // end class Brisk
2668 function make_seed()
2670 list($usec, $sec) = explode(' ', microtime());
2671 return (float) $sec + ((float) $usec * 100000);
2674 function btrace_line($ar)
2676 GLOBAL $G_btrace_pref_sub;
2679 for ($i = 0 ; $i < count($ar) ; $i++) {
2680 $with_class = isset($ar[$i]['class']);
2681 $with_file = isset($ar[$i]['file']);
2682 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2683 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2684 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2685 ($with_file ? $ar[$i]['line'] : ""));
2691 function trace_ftok($id, $add)
2693 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2694 $tok=@ftok($id, $add);
2696 log_shme($tok.": ".$id." + ".$add);
2701 function log_mop($step, $log)
2705 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2708 $sess = Brisk::sess_cur_get();
2709 if (isset($sess) == FALSE)
2714 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2717 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2718 $btrace = btrace_line(debug_backtrace());
2721 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2722 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2728 function log_only2($log)
2732 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2735 $sess = Brisk::sess_cur_get();
2736 if (isset($sess) == FALSE)
2741 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2744 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2745 $btrace = btrace_line(debug_backtrace());
2748 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2749 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2754 function log_crit($log)
2758 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2761 $sess = Brisk::sess_cur_get();
2762 if (isset($sess) == FALSE)
2767 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2770 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2771 $btrace = btrace_line(debug_backtrace());
2774 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2775 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2780 function log_only($log)
2784 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2787 $sess = Brisk::sess_cur_get();
2788 if (isset($sess) == FALSE)
2793 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2796 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2797 $btrace = btrace_line(debug_backtrace());
2800 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2801 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2806 function log_main($log)
2810 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2813 $sess = Brisk::sess_cur_get();
2814 if (isset($sess) == FALSE)
2819 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2822 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2823 $btrace = btrace_line(debug_backtrace());
2826 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2827 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2832 function log_rd($log)
2836 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2839 $sess = Brisk::sess_cur_get();
2840 if (isset($sess) == FALSE)
2845 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2848 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2849 $btrace = btrace_line(debug_backtrace());
2852 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2853 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2858 function log_rd2($log)
2862 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2865 $sess = Brisk::sess_cur_get();
2866 if (isset($sess) == FALSE)
2871 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2874 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2875 $btrace = btrace_line(debug_backtrace());
2879 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2880 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2885 function log_send($log)
2889 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2892 $sess = Brisk::sess_cur_get();
2893 if (isset($sess) == FALSE)
2898 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2901 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2902 $btrace = btrace_line(debug_backtrace());
2905 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2906 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2911 function log_lock($log)
2915 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2918 $sess = Brisk::sess_cur_get();
2919 if (isset($sess) == FALSE)
2924 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2927 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2928 $btrace = btrace_line(debug_backtrace());
2931 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2932 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2937 function log_wr($log)
2941 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2944 $sess = Brisk::sess_cur_get();
2945 if (isset($sess) == FALSE)
2950 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2953 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2954 $btrace = btrace_line(debug_backtrace());
2957 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2958 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2963 function log_load($log)
2967 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2970 $sess = Brisk::sess_cur_get();
2971 if (isset($sess) == FALSE)
2976 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2979 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2980 $btrace = btrace_line(debug_backtrace());
2983 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2984 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2989 function log_auth($sess, $log)
2993 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2996 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
2999 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3000 $btrace = btrace_line(debug_backtrace());
3003 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3004 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3009 function log_shme($log)
3013 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3016 $sess = Brisk::sess_cur_get();
3017 if (isset($sess) == FALSE)
3022 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3025 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3026 $btrace = btrace_line(debug_backtrace());
3029 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3030 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3037 // function log_legal($curtime, $sess, $name, $where, $mesg)
3038 function log_legal($curtime, $addr, $user, $where, $mesg)
3041 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3042 /* Unix time | session | nickname | IP | where was | mesg */
3043 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3044 ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'),
3045 $user->name, $addr, $where , $mesg));
3050 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3055 if ($sitted < PLAYERS_N) {
3063 if ($table == $cur_table)
3070 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3075 function show_notify($text, $tout, $butt, $w, $h)
3077 log_main("SHOW_NOTIFY: ".$text);
3078 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3081 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3083 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3084 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);
3087 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3089 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3092 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3093 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3096 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3097 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);
3101 function root_welcome($user)
3103 GLOBAL $root_wellarr, $G_lang;
3107 $dt = date("H:i ", $curtime);
3109 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3110 $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3117 function validate_sess($sess)
3119 if (strlen($sess) == SESS_LEN)
3125 function validate_name($name)
3127 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3129 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3131 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3138 function playsound($filename)
3140 return (sprintf('playsound("flasou", "%s");', $filename));
3143 function secstoword($secs)
3149 $mins = floor($secs / 60);
3151 if ($G_lang == 'en') {
3153 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3156 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3160 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3163 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3168 function sharedmem_sz($tok)
3170 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3171 log_main("shmop_open failed");
3174 $shm_sz = shmop_size($shm_id);
3175 shmop_close($shm_id);
3177 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3184 static function lock_data($is_exclusive)
3186 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3187 self::$delta_t = microtime(TRUE);
3188 log_lock("LOCK warrant [".self::$delta_t."]");
3196 static function unlock_data($res)
3200 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3209 static function lock_data($is_exclusive)
3211 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3212 self::$delta_t = microtime(TRUE);
3213 log_lock("LOCK poll [".self::$delta_t."]");
3221 static function unlock_data($res)
3225 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3231 function carousel_top()
3236 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));
3239 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>'));