5 * Copyright (C) 2006-2014 Matteo Nastasi
6 * mailto: nastasi@alternativeoutput.it
7 * matteo.nastasi@milug.org
8 * web: http://www.alternativeoutput.it
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details. You should have received a
19 * copy of the GNU General Public License along with this program; if
20 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21 * Suite 330, Boston, MA 02111-1307, USA.
26 define('BRISK_CONF', "brisk.conf.pho");
27 define('FTOK_PATH', "/var/lib/brisk");
28 define('LEGAL_PATH', "/tmp/legal_brisk");
29 define('PROXY_PATH', "/var/lib/brisk_proxy");
30 define('TABLES_N', 36);
31 define('TABLES_AUTH_N', 8);
32 define('TABLES_CERT_N', 4);
33 define('PLAYERS_N', 3);
34 define('MAX_POINTS', 5);
35 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
36 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
37 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
38 define('SHM_DIMS_DLT', 65536);
40 define('SHM_DIMS_U_MIN', 4096);
41 define('SHM_DIMS_U_MAX', 65536);
42 define('SHM_DIMS_U_DLT', 4096);
45 define('COMM_GEN_N', 50);
48 define('CHAT_ILL_TIME', 6);
49 define('CHAT_ENABLED', TRUE);
51 define('SESS_LEN', 13);
52 define('STREAM_TIMEOUT', 60);
53 /* FIXME: move to sac-a-push .phh */
54 /* TIME_RD define the server-side timeout, after half of it a ping request
55 is sent to client, after this time the client is log out */
56 define('EXPIRE_TIME_RD', 180);
57 define('EXPIRE_TIME_SMAMMA', 360);
58 define('EXPIRE_TIME_WAG', 10);
59 define('WAKEUP_TIME', 12);
60 // BAN_TIME da allineare anche in commons.js
61 define('BAN_TIME', 3600);
62 define('GARBAGE_TIMEOUT', 5);
63 define('NICKSERV', "BriskServ");
65 define('LOCK_SHARE_MAX', 10000);
67 define('DBG_ONL2', 0x000001);
68 define('DBG_ONLY', 0x000002);
69 define('DBG_MAIN', 0x000004);
70 define('DBG_READ', 0x000008);
71 define('DBG_REA2', 0x000010);
72 define('DBG_SEND', 0x000020);
73 define('DBG_LOCK', 0x000040);
74 define('DBG_WRIT', 0x000080);
75 define('DBG_LOAD', 0x000100);
76 define('DBG_AUTH', 0x000200);
77 define('DBG_CRIT', 0x000400);
78 define('DBG_LMOP', 0x000800);
79 define('DBG_TRAC', 0x001000);
80 define('DBG_SHME', 0x002000);
81 define('DBG_ENGI', 0x004000);
82 define('DBG_CDS', 0x008000);
83 define('DBG_STEP', 0x010000);
84 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
85 define('BRISK_DEBUG', 0x0800);
87 define('BRISK_SINGLE_DEBUG',0);
88 define('BRISK_SINGLE_SESS', "");
89 define('DEBUGGING', "no-debugging");
91 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
92 require_once("${G_base}Obj/ipclass.phh");
93 require_once("${G_base}Obj/provider_proxy.phh");
95 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
96 'en' => 'back standing' ),
97 'btn_close' => array( 'it' => 'chiudi',
100 'tit_all' => array( 'it' => 'tutti',
103 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
104 'en' => '<br>You are being idle for ' ),
105 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
106 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
107 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
108 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
109 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
110 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
111 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
112 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
113 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
114 'en' => '<br>The entered password is not correct.<br><br>'),
115 'alarret' => array( 'it' => 'Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>.',
116 'en' => 'Alarm \\"<b>%s</b>\\" sent to <b>%s</b>.'),
117 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
118 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
119 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
120 'en' => '<b>To send a message you have to be authenticated.</b>'),
121 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
122 'en' => 'The nickname have to contain at least one letter or one number.'),
123 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
124 'en' => 'The nickname <b>%s</b> is already in use.'),
125 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
126 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
127 '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>',
128 '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 ???
129 'statunkn' => array( 'it' => 'Questo stato non esiste.',
130 'en' => 'This state don\'t exists.'),
131 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
132 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
133 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
134 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
136 'tit_onauth'=>array( 'it' => '(solo aut.)',
137 'en' => '(only aut.)'),
138 'tit_onisol'=>array( 'it' => '(isolam.to)',
139 'en' => '(isolation)'),
140 '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.',
141 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
143 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
144 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
145 'gua_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
146 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
147 'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
148 'en' => 'EN <b>%s</b> si è auto-garantito.'),
149 'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
150 'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
151 'gua_err' => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i><login></i></b>.',
152 'en' => 'Error %d. Usage: <b>/guar <i><login></i></b>.')
155 $G_lng = langtolng($G_lang);
157 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
158 $G_brisk_version = "4.17.0";
160 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
161 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: gestione accessi da sistemi di anonimizzazione, nuovi termini di utilizzo.',
162 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
163 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: engine refactoring and logout message.',
164 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
166 $G_room_help = array( 'it' => '
167 <div style=\\"text-align: left; padding: 8px;\\">
168 <b>Descrizione</b><br>
169 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
170 <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>
171 <b>Configurazione del browser.</b><br>
172 Occorre abilitare i cookies.<br>
174 <b>Uso del sito</b><br>
175 Potete sedervi a un tavolo o rimanere in piedi.<br>
176 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
179 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>
180 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
181 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
182 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
183 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
184 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.
186 <dt><b>Comandi della chat</b>
187 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
188 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
189 <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\\"
190 <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
191 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
192 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
193 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
194 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
200 <div style=\\"text-align: left; padding: 8px;\\">
201 <b>EN Descrizione</b><br>
202 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
203 <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>
204 <b>Configurazione del browser.</b><br>
205 Occorre abilitare i cookies.<br>
207 <b>Uso del sito</b><br>
208 Potete sedervi a un tavolo o rimanere in piedi.<br>
209 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
212 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>
213 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
214 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
215 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
216 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
217 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.
219 <dt><b>Comandi della chat</b>
220 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
221 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
222 <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\\"
223 <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
224 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
225 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
226 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
227 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
233 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
234 <div style=\\"text-align: left; padding: 8px;\\">
235 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
237 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
238 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
240 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
241 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
242 <li>Smart card di InfoCamere
245 <b>Per auto-garantisi occorre possedere:</b><br><br>
247 <li>il codice PIN della propria carta
248 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
251 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
253 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
254 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
255 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
256 diretta dell\' utente da parte dell\' amministratore.
261 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
262 <div style=\\"text-align: left; padding: 8px;\\">
263 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
265 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
266 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
268 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
269 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
272 <b>Per auto-garantisi occorre possedere:</b><br><br>
274 <li>il codice PIN della propria carta
275 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
278 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
280 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
281 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
282 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
283 diretta dell\' utente da parte dell\' amministratore.
290 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
294 $G_room_about = array( 'it' => '<br>
295 <div id=\\"header\\" class=\\"header\\">
296 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
297 briscola chiamata in salsa ajax
299 <br><b>version '.$G_brisk_version.'</b><br><br>
300 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
302 <div id=\\"header\\" class=\\"header\\">
303 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
304 declaration briscola in ajax sauce <b>(Beta)</b>
306 <br><b>version '.$G_brisk_version.'</b><br><br>
307 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
310 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
313 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
314 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
315 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
316 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
317 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
318 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
319 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
320 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
321 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
322 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
323 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
324 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
325 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
326 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
327 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
328 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
329 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
330 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
331 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
333 // $G_PG_cons_n = count($G_PG_cons);
334 // printf("N CONS: %d\n", $G_PG_cons_n);
336 /* printf("%d %d\n", count($voc), count($cons)); */
337 /* for ($i = 0 ; $i < 26 ; $i++) { */
338 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
340 /* printf(' "%s", ', chr(ord('a') + $i)); */
341 /* for ($e = 0 ; $e < 26 ; $e++) { */
342 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
344 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
349 function nickserv_msg($dt, $msg) {
350 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
353 function passwd_gen($seed = NULL)
355 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
364 for ($sil = 0 ; $sil < 7 ; $sil++) {
365 if (($sil % 2) == 0) {
367 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
369 $old = mt_rand(0, $G_PG_vow_n-1);
370 $pw .= $G_PG_vow[$old];
373 $new = mt_rand(0, $G_PG_vow_n-1);
375 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
376 $pw .= $G_PG_vow[$new];
382 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
389 function cmd_return($val, $desc)
391 return array('val' => $val, 'desc' => $desc);
394 function cmd_serialize($attrs)
399 foreach ($attrs as $key => $value) {
400 $ret .= $sep . $key . '=' . urlencode($value);
406 function cmd_deserialize($cmd)
409 $a = explode('&', $cmd);
411 while ($i < count($a)) {
412 $b = split('=', $a[$i]);
413 $ret[urldecode($b[0])] = urldecode($b[1]);
424 function versions_cmp($v1, $v2)
426 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
430 $v1_ar = split('\.', $v1);
431 $v2_ar = split('\.', $v2);
433 $v2_ct = count($v2_ar);
435 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
436 if (($v2_ct - 1) < $i) {
439 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
440 if ($v1_ar[$i] != $v2_ar[$i]) {
441 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
450 // return string with IPV4 address
451 function addrtoipv4($addr)
453 $ipv4addr_arr = explode(':' , $addr);
454 if (isset($ipv4addr_arr[3])) {
455 $ipv4addr = $ipv4addr_arr[3];
465 for ($i = 0; $i < ob_get_level(); $i++)
467 ob_implicit_flush(1);
471 function force_no_cache(&$header_out)
473 $header_out['Pragma'] = 'no-cache, must-revalidate';
474 $header_out['Cache-Control'] = 'no-cache';
475 $header_out['Expires'] = '-1';
478 function file_lock($fname, $is_exclusive)
480 if (($res = @fopen($fname, "r+")) == FALSE) {
484 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
492 function file_unlock($res)
495 flock($res, LOCK_UN);
500 $escpush_from = array("\\", "\"");
501 $escpush_to = array("\\\\", "\\\"");
504 GLOBAL $escpush_from, $escpush_to;
506 return str_replace($escpush_from, $escpush_to, $s);
509 $escinp_from = array( "\"" );
510 $escinp_to = array( """ );
512 function escinput($s)
514 GLOBAL $escinp_from, $escinp_to;
516 return str_replace($escinp_from, $escinp_to, $s);
521 return htmlentities($s, ENT_COMPAT, "UTF-8");
524 function esclfhtml($s)
526 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
529 function langtolng($lang)
533 return ($G_lang == 'en' ? '-en' : '');
536 function csplitter($in, $sep)
542 for ($i = 0 ; $i < strlen($in) ; $i++) {
543 $ini = substr($in, $i, 1);
547 else if ($ini == $sep) {
566 $from = array ( '\\', '@', '|' );
567 $to = array ( '\\\\', '@', '¦' );
569 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
574 $from = array ( '\\', '|', "\t", "\n");
575 $to = array ( '\\\\', '\\|', "\\t", "\\n");
577 return (str_replace($from, $to, $s));
580 function xcapemesg($s)
582 $from = array ( "\n");
583 $to = array ( "\\n");
585 return (str_replace($from, $to, $s));
595 function getbyid($idx)
597 return ($this->el[$idx]);
600 function setbyid($idx, $v)
602 $this->el[$idx] = $v;
606 define('TABLE_AUTH_TY_PUBL', 0);
607 define('TABLE_AUTH_TY_AUTH', 1);
608 define('TABLE_AUTH_TY_CERT', 2);
616 var $auth_type; // required authorization to sit down
623 var $table_start; // information field
631 function create($idx)
633 if (($thiz = new Table()) == FALSE)
637 $thiz->player = array();
640 if ($idx < TABLES_CERT_N)
641 $thiz->auth_type = TABLE_AUTH_TY_CERT;
642 else if ($idx < TABLES_AUTH_N)
643 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
645 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
651 $thiz->table_token = "";
652 $thiz->table_start = 0;
654 $thiz->wakeup_time = 0;
661 $this->idx = $from->idx;
662 $this->player = array();
663 for ($i = 0 ; $i < $from->player_n ; $i++)
664 $this->player[$i] = $from->player[$i];
665 $this->player_n = $from->player_n;
667 log_main("PLAYER_N - parent::copy.".$this->player_n);
669 $this->auth_type = $from->auth_type;
671 $this->wag_own = $from->wag_own;
672 $this->wag_com = $from->wag_com;
673 $this->wag_tout = $from->wag_tout;
675 $this->table_token = $from->table_token;
676 $this->table_start = $from->table_start;
678 $this->wakeup_time = $from->wakeup_time;
681 function myclone($from)
683 if (($thiz = new Table()) == FALSE)
691 function spawn($from)
693 if (($thiz = new Table()) == FALSE)
696 $thiz->idx = $from->idx;
697 $thiz->player = array();
698 for ($i = 0 ; $i < $from->player_n ; $i++)
699 $thiz->player[$i] = $i;
700 $thiz->player_n = $from->player_n;
702 $thiz->auth_type = $from->auth_type;
704 $thiz->wag_own = $from->wag_own;
705 $thiz->wag_com = $from->wag_com;
706 $thiz->wag_tout = $from->wag_tout;
708 $thiz->table_token = $from->table_token;
709 $thiz->table_start = $from->table_start;
711 $thiz->wakeup_time = $from->wakeup_time;
716 function wag_set($user_idx, $mesg)
720 $this->wag_own = $user_idx;
721 $this->wag_com = $mesg;
725 function wag_reset($timeout)
727 log_main("WAG_RESET");
729 unset($this->wag_own);
732 $this->wag_tout = $timeout;
735 function player_get($idx)
737 return ($this->player[$idx]);
740 function player_set($idx, $player)
742 $this->player[$idx] = $player;
745 function user_add($idx)
747 $this->player[$this->player_n] = $idx;
750 return ($this->player_n - 1);
753 function user_rem($brisk, $user)
755 $tabpos = $user->table_pos;
757 /* verifico la consistenza dei dati */
758 if ($brisk->user[$this->player[$tabpos]] == $user) {
760 /* aggiorna l'array dei giocatori al tavolo. */
761 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
762 $this->player[$i] = $this->player[$i+1];
763 $user_cur = $brisk->user[$this->player[$i]];
764 $user_cur->table_pos = $i;
769 log_main("INCONSISTENCY ON TABLE.");
773 // Table->act_content - return 'id' of type of output required for table button
774 function act_content($user)
777 $isstanding = ($user->subst == 'standup');
778 $sitted = $this->player_n;
780 $cur_table = $user->table;
784 if ($sitted < PLAYERS_N) {
785 switch ($this->auth_type) {
786 case TABLE_AUTH_TY_CERT:
787 if ($user->is_cert())
792 case TABLE_AUTH_TY_AUTH:
793 if ($user->is_auth())
808 if ($table == $cur_table)
815 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
828 function Delay_Manager($triglevel)
830 $this->triglevel = $triglevel;
831 $this->delta = array();
832 $this->lastcheck = 0;
835 function delta_get($curtime)
837 // clean too old delta items
838 for ($i = 0 ; $i < count($this->delta) ; $i++) {
839 if ($this->delta[$i][0] < $curtime) {
840 array_splice($this->delta, $i, 1);
845 // add new delta items if delay exceeded $this->triglevel sec
846 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
847 $delta = $curtime - $this->lastcheck - $this->triglevel;
848 array_push($this->delta, array($curtime + $delta , $delta));
849 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
852 // extract the maximum valid delta
854 for ($i = 0 ; $i < count($this->delta) ; $i++) {
855 $delta_cur = $this->delta[$i][1];
856 if ($delta_max < $delta_cur)
857 $delta_max = $delta_cur;
860 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
865 function lastcheck_set($curtime)
867 $this->lastcheck = $curtime;
875 function Client_prefs()
879 static function from_user($user)
881 $thiz = new Client_prefs();
882 $thiz->user_load($user);
887 static function from_json($json)
889 $thiz = new Client_prefs();
890 if ($thiz->json_load($json) == FALSE) {
898 function user_load($user)
900 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
901 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
902 if ($user->rec != FALSE) {
903 $this->supp_comp = $user->rec->supp_comp_get();
906 $this->supp_comp = "000000000000";
909 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
912 function json_load($json_s)
917 if (gettype($json_s) == "string") {
918 if (($json = json_decode($json_s)) == FALSE)
924 if ($this->listen < 0 || $this->listen > 2)
926 $this->listen = $json->listen;
928 if (mb_strlen($json->supp_comp, "ASCII") != 12)
931 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
932 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
933 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
939 $this->supp_comp = $json->supp_comp;
946 function store($user, $is_save)
949 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
950 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
951 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
952 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
954 if ($user->is_supp_custom()) {
955 $user->rec->supp_comp_set($this->supp_comp);
958 $user->prefs_store();
962 define('GHOST_SESS_TOUT', 1800);
963 define('GHOST_SESS_REAS_LOUT', 1); // logout
964 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
965 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
966 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
967 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
975 function GhostSessEl($time, $sess, $reas)
977 $this->time = $time + GHOST_SESS_TOUT;
992 // push or update for this session
993 function push($time, $sess, $reas)
995 foreach($this->gs as $el) {
996 if ($el->sess == "$sess") {
998 $el->time = $time + GHOST_SESS_TOUT;
1003 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1009 foreach($this->gs as $key => $el) {
1010 if ($el->sess == "$sess") {
1011 $ret = $this->gs[$key];
1012 unset($this->gs[$key]);
1019 function garbage_manager($curtime)
1021 foreach($this->gs as $key => $el) {
1022 if ($el->time < $curtime) {
1023 unset($this->gs[$key]);
1033 var $crystal_filename;
1037 var $comm; // commands for many people
1038 var $step; // current step of the comm array
1039 var $garbage_timeout;
1042 var $ban_list; // ban list (authized allowed)
1043 var $black_list; // black list (anti-dos, noone allowed)
1044 var $provider_proxy; // list of provider/browser that offer proxy service
1050 public static $sess_cur;
1058 static function create($crystal_filename, $ban_list, $black_list, $prov_proxy) {
1059 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1060 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1061 fprintf(STDERR, "ROOM FROM FILE\n");
1062 rename($crystal_filename, $crystal_filename.".old");
1064 $brisk->reload(TRUE, $ban_list, $black_list, $prov_proxy);
1070 fprintf(STDERR, "NEW ROOM\n");
1071 $thiz = new Brisk();
1073 $thiz->crystal_filename = $crystal_filename;
1074 $thiz->user = array();
1075 $thiz->table = array();
1076 $thiz->match = array();
1078 $thiz->ban_list = IpClass::create();
1079 $thiz->black_list = IpClass::create();
1080 $thiz->provider_proxy = ProviderProxy::create();
1081 $thiz->ghost_sess = new GhostSess();
1083 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1084 $thiz->user[$i] = User::create($thiz, $i, "", "");
1087 for ($i = 0 ; $i < TABLES_N ; $i++) {
1088 $thiz->table[$i] = Table::create($i);
1090 $thiz->garbage_timeout = 0;
1091 $thiz->shm_sz = SHM_DIMS_MIN;
1093 $thiz->delay_mgr = new Delay_Manager(1.5);
1095 static::$sess_cur = FALSE;
1097 $thiz->reload(TRUE, $ban_list, $black_list, $prov_proxy);
1102 function reload($is_first, $ban_list, $black_list, $prov_proxy)
1104 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n", count($ban_list), count($black_list), count($prov_proxy));
1106 if (defined('CURL_DE_SAC_VERS')) {
1107 if (brisk_cds_reload($this) == FALSE) {
1111 $this->ban_list->update($ban_list);
1112 $this->black_list->update($black_list);
1113 $this->provider_proxy->update($prov_proxy);
1116 $this->banned_kickoff();
1117 $this->garbage_manager(TRUE);
1121 function banned_kickoff()
1125 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1126 $table_cur = $this->table[$table_idx];
1127 // if the table is complete and exists we check users IP
1129 if ($table_cur->player_n == PLAYERS_N) {
1130 if (isset($this->match[$table_idx]) &&
1131 $table_cur->table_token == $bin5->table_token) {
1132 log_main("PLAYERS == N TABLE ".$table_idx);
1134 $bin5 = $this->match[$table_idx];
1136 $is_ban |= $bin5->banned_kickoff();
1141 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1142 $user_cur = $this->user[$i];
1144 if ($user_cur->is_active() == FALSE)
1147 // check if the IP is blacklisted
1148 if ($this->black_check($user_cur->ip)) {
1149 $user_cur->lacc = 0;
1154 // if authorized not check if banlisted
1155 if ($user_cur->is_auth()) {
1159 if ($this->ban_check($user_cur->ip)) {
1160 $user_cur->lacc = 0;
1168 function ban_check($ip_str)
1170 return ($this->ban_list->check($ip_str));
1173 function black_check($ip_str)
1175 return ($this->black_list->check($ip_str));
1178 function pproxy_realip($header, $ip_str)
1180 return ($this->provider_proxy->realip($header, $ip_str));
1183 function users_cleanup()
1185 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1186 $user_cur = $this->user[$i];
1188 if ($user_cur->the_end) {
1189 $user_cur->reset(); // users_cleanup, OK
1194 function garbage_manager($force)
1196 GLOBAL $G_lang, $mlang_brisk, $G_base;
1200 log_rd2("garbage_manager START");
1202 /* Garbage collector degli utenti in timeout */
1203 $curtime = microtime(TRUE);
1205 $delta = $this->delay_mgr->delta_get($curtime);
1207 if (!$force && !($this->garbage_timeout < $curtime)) {
1208 $this->delay_mgr->lastcheck_set($curtime);
1212 // Before all align times with table timeout
1213 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1214 $table_cur = $this->table[$table_idx];
1215 // if the table is complete and exists its shared mem we get the info about users lacc
1217 if ($table_cur->player_n == PLAYERS_N) {
1218 log_main("PLAYERS == N TABLE ".$table_idx);
1221 $no_recovery = FALSE;
1222 if (isset($this->match[$table_idx])) {
1223 $bin5 = $this->match[$table_idx];
1225 if ($table_cur->table_token != $bin5->table_token) {
1226 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1227 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1228 $no_recovery = TRUE;
1232 if ($bin5 != FALSE) {
1236 log_main("garbage_manager: bri loaded successfully.");
1237 $bin5->garbage_manager(TRUE);
1239 $bin5_table = $bin5->table[0];
1241 // is the end of the table
1243 if ($bin5->the_end == TRUE) {
1245 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1247 log_main("garbage_manager: INSIDE THE END.");
1249 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1250 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1251 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1254 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1255 // stat must be "table" by definition
1256 $user_cur = $this->user[$table_cur->player[$i]];
1257 $bin5_user = $bin5->user[$i];
1259 $user_cur->subst = $bin5_user->subst;
1260 $user_cur->rd_step = $bin5_user->rd_step;
1261 $user_cur->step = $bin5_user->step;
1262 $user_cur->lacc = $bin5_user->lacc;
1263 $user_cur->laccwr = $bin5_user->lacc;
1264 $user_cur->bantime = $bin5_user->bantime;
1265 $user_cur->the_end = $bin5_user->the_end;
1266 if ($user_cur->the_end) {
1267 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1271 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1273 $this->room_join_wakeup($user_cur, FALSE, 0);
1274 $table_cur->table_token = "";
1275 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1277 $this->match_del($table_idx);
1280 log_main("gm:: save_data");
1282 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1283 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1286 } // if ($bin5 == FALSE
1287 else if ($no_recovery == FALSE) {
1288 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1290 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1291 $user_cur = $this->user[$table_cur->player[$i]];
1292 $user_cur->subst = "shutdowner";
1293 $user_cur->step_inc();
1295 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1296 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1297 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1298 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1299 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1300 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1301 $user_cur->step_inc();
1304 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1305 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1306 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1308 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1310 $this->room_join_wakeup($user_cur, TRUE, -2);
1311 $table_cur->table_token = "";
1314 } // if ($table_cur->player_n == PLAYERS_N) {
1315 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1317 log_rd2("out new loop.");
1319 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1320 $user_cur = $this->user[$i];
1322 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1324 if ($user_cur->is_active() == FALSE)
1327 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1328 // Auto logout dell'utente
1329 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1331 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1332 $user_cur->the_end = TRUE;
1334 log_rd2("AUTO LOGOUT.");
1335 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1336 log_auth($user_cur->sess, "Autologout session.");
1338 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1339 $this->room_wakeup($user_cur);
1340 else if ($user_cur->subst == 'standup')
1341 $this->room_outstandup($user_cur);
1343 log_rd2("LOGOUT FROM WHAT ???");
1347 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1348 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1349 $this->room_wakeup($user_cur);
1350 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1351 /* 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" */
1352 $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);
1353 $user_cur->step_inc();
1357 log_rd2("GARBAGE UPDATED!");
1359 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1362 $this->ghost_sess->garbage_manager($curtime);
1364 $this->delay_mgr->lastcheck_set($curtime);
1368 function show_room($user_step, $user)
1370 GLOBAL $G_lang, $mlang_brisk;
1371 log_main("show_room: username: ".$user->name);
1373 $ret = sprintf('gst.st = %d; ', $user_step);
1375 $prefs = Client_prefs::from_user($user);
1376 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1379 if ($user->flags & USER_FLAG_ISOLAUTH) {
1380 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1382 else if ($user->flags & USER_FLAG_LISTAUTH) {
1383 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1386 $ret .= 'list_set(\'all\', false, \'\' ); ';
1390 if ($user->subst == 'standup')
1391 $ret .= "tra.show(); ";
1393 $ret .= "tra.hide(); ";
1395 $ret .= sprintf('stat = "%s";', $user->stat);
1397 $ret .= root_welcome($user);
1398 if ($user->flags & USER_FLAG_DBFAILED) {
1399 $ret .= "gst.st = ".($user->step+1)."; ";
1400 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1403 $ret .= sprintf('subst = "%s";', $user->subst);
1404 $ret .= $user->myname_innerHTML();
1406 for ($i = 0 ; $i < TABLES_N ; $i++) {
1408 $ret .= $this->table_content($user, $i);
1410 $ret .= $this->table[$i]->act_content($user);
1411 if ($this->table[$i]->wag_own != -1)
1412 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1414 $ret .= sprintf('tra.rem(%d); ', $i);
1416 $ret .= $this->standup_content($user);
1417 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1423 function room_wakeup($user)
1425 $table_idx = $user->table;
1426 $table = $this->table[$table_idx];
1428 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1432 $from_table = ($user->stat == "table");
1434 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1436 for ($i = 0 ; $i < $table->player_n ; $i++) {
1437 $user_cur = $this->user[$table->player[$i]];
1438 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1440 if ($user->idx_get() != $table->player[$i]) {
1441 $user_cur->stat_set("room");
1442 $user_cur->subst = "sitdown";
1443 $user_cur->laccwr = $curtime;
1445 else if ($user->is_active()) {
1446 $user_cur->stat_set("room");
1447 $user_cur->subst = "standup";
1448 $user_cur->laccwr = $curtime;
1449 $user_cur->table = -1;
1454 $user->stat_set("room");
1455 $user->subst = "standup";
1456 $user->laccwr = $curtime;
1459 $remove_wagon = FALSE;
1460 if($table->wag_own == $user->idx_get()) {
1461 $table->wag_reset($curtime);
1462 $remove_wagon = TRUE;
1466 /* aggiorna l'array dei giocatori al tavolo. */
1467 $table->user_rem($this, $user);
1469 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1470 $user_cur = $this->user[$i];
1471 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1474 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1476 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1477 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1478 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1479 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1480 log_main("DOCUMENT.index.php: from table");
1482 else if ($user_cur->stat == "room") {
1483 log_main("DOCUMENT.index.php: from table");
1485 $ret .= $this->table_content($user_cur, $table_idx);
1486 $ret .= $this->standup_content($user_cur);
1488 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1489 $ret .= $table->act_content($user);
1491 if ($user->idx_get() == $i) {
1492 // set the new status
1493 $ret .= 'subst = "standup"; tra.show(); ';
1494 // clean the action buttons in other tables
1495 for ($e = 0 ; $e < TABLES_N ; $e++) {
1496 if ($this->table[$e]->player_n < PLAYERS_N) {
1497 $ret .= $this->table[$e]->act_content($user);
1502 $ret .= $table->act_content($user_cur);
1505 log_wr("ROOM_WAKEUP: ".$ret);
1506 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1507 $user_cur->step_inc();
1511 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1513 $table_idx = $user->table;
1514 $table = $this->table[$table_idx];
1516 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1519 $user_wup = array();
1521 $user_tab = array();
1523 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1525 for ($i = 0 ; $i < $table->player_n ; $i++) {
1526 $user_cur = $this->user[$table->player[$i]];
1527 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1528 if ($user_cur->is_empty()) {
1531 if ($update_lacc == TRUE) {
1532 $user_cur->laccwr = $curtime;
1534 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1535 if ($user_cur->subst == "shutdowned") {
1536 $user_cur->stat_set("room");
1537 $user_cur->subst = "sitdown";
1539 else if ($user_cur->subst == "shutdowner") {
1540 $user_cur->stat_set("room");
1541 $user_cur->subst = "standup";
1542 $user_cur->table = -1;
1543 $user_wup[$user_wup_n++] = $user_cur;
1545 $remove_wagon = FALSE;
1546 if($table->wag_own == $table->player[$i]) {
1547 $remove_wagon = TRUE;
1548 $table->wag_reset($curtime);
1551 $user_tab[$user_tab_n++] = $table->player[$i];
1554 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1555 $table->user_rem($this, $user_wup[$wup_idx]);
1557 /* aggiorna l'array dei giocatori al tavolo. */
1559 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1560 log_main("START LOOP");
1561 $user_cur = $this->user[$i];
1562 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1563 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1568 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1570 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1571 if ($user_cur->stat == "room") {
1572 log_main("DOCUMENT.index.php from table");
1574 $ret .= $this->table_content($user_cur, $table_idx);
1575 $ret .= $this->standup_content($user_cur);
1577 $ret .= $table->act_content($user_cur);
1580 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1581 if ($user_tab[$tab_idx] == $i)
1584 // for users that wakeup the room will be reconstructed by index_rd.php
1585 if ($tab_idx < $user_tab_n) {
1586 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1588 // ARRAY_POP DISABLED
1589 // if ($trans_delta == 0)
1590 // while (array_pop($user_cur->comm) != NULL);
1592 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1593 $user_cur->comm[$user_cur->step % COMM_N] = "";
1594 $user_cur->step_inc();
1595 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1596 $user_cur->step_inc();
1597 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1601 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1603 log_main("JOIN_WAKEUP more");
1605 $ret .= $table->act_content($user_cur);
1607 log_main("JOIN_WAKEUP end more");
1609 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1610 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1611 $user_cur->step_inc();
1615 function guarantee_show($user, $user_login, $dt)
1617 GLOBAL $G_lang, $mlang_brisk, $G_base;
1623 if ($user_login == "") {
1627 if (($bdb = BriskDB::create()) == FALSE) {
1631 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1635 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1636 $guar_login = $guar_item->login_get();
1641 $user_tos_vers = $user_item->tos_vers_get();
1643 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1644 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1646 else if ($guar_login == "") {
1647 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1649 else if ($guar_login == $user_login) {
1650 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1653 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1654 xcape($user_login), xcape($guar_login)));
1659 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1662 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1668 function room_outstandup($user)
1670 $this->room_sitdown($user, -1);
1673 function table_update($user)
1675 log_main("table_update: pre - USER: ".$user->name);
1677 $table_idx = $user->table;
1679 if ($table_idx > -1)
1680 $table = $this->table[$table_idx];
1682 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1684 $user_cur = $this->user[$i];
1685 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1688 $ret = "gst.st = ".($user_cur->step+1)."; ";
1689 if ($table_idx > -1)
1690 $ret .= $this->table_content($user_cur, $table_idx);
1692 if ($user->idx_get() == $i) {
1693 $ret .= $user->myname_innerHTML();
1695 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1696 $user_cur->step_inc();
1699 log_main("table_update: post");
1702 function room_sitdown($user, $table_idx)
1704 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1708 if ($table_idx > -1 && $table_idx < TABLES_N) {
1709 $table = $this->table[$table_idx];
1712 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1713 for ($i = 0 ; $i < TABLES_N ; $i++) {
1714 if ($table->wag_own == $table->player[$i]) {
1715 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1716 $table->wag_reset(time());
1723 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1725 $user_cur = $this->user[$i];
1726 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1729 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1730 if ($table_idx > -1)
1731 $ret .= $this->table_content($user_cur, $table_idx);
1732 $ret .= $this->standup_content($user_cur);
1734 if ($user->idx_get() == $i) {
1735 $ret .= 'subst = "sitdown"; tra.hide(); ';
1736 // clean the action buttons in other tables
1737 for ($e = 0 ; $e < TABLES_N ; $e++) {
1738 $ret .= $this->table[$e]->act_content($user_cur);
1741 else if ($table_idx > -1) {
1742 if ($table->player_n == PLAYERS_N) {
1744 $ret .= $table->act_content($user_cur);
1747 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1748 $user_cur->step_inc();
1752 function kickuser($user, $out_reas)
1756 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1758 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1760 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1761 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1762 $bin5 = &$this->match[$user->table];
1763 $user_bin5 = &$bin5->user[$user->table_pos];
1764 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1765 $bin5->table_wakeup($user_bin5);
1766 $user->the_end = TRUE;
1767 $this->room_wakeup($user);
1771 if ($user->stat == 'table' || $user->stat == 'room') {
1772 $user->the_end = TRUE;
1773 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1774 $this->room_wakeup($user);
1776 else if ($user->subst == 'standup') {
1777 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1778 $this->room_outstandup($user);
1781 log_rd2("LOGOUT FROM WHAT ???");
1786 function kickuser_by_name($name, $out_reas)
1788 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1789 $user_out = $this->user[$i];
1790 if (strcmp($user_out->name, $name) == 0) {
1791 return ($this->kickuser($user_out, $out_reas));
1797 function kickuser_by_sess($sess, $out_reas)
1799 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1800 $user_out = $this->user[$i];
1801 if (strcmp($user_out->sess, $sess) == 0) {
1802 return ($this->kickuser($user_out, $out_reas));
1808 function kickuser_by_idx($idx, $out_reas)
1810 $user_out = $this->user[$idx];
1811 return ($this->kickuser($user_out, $out_reas));
1814 function chatt_send($user, $mesg)
1816 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1820 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1822 $dt = date("H:i ", $curtime);
1833 $is_normchat = FALSE;
1834 /* for old isolation management $is_ticker = FALSE; */
1835 $update_room = FALSE;
1837 if (strcmp($msg, "/tav") == 0 ||
1838 strncmp($msg, "/tav ", 5) == 0) {
1840 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1841 /* 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>" */
1842 $msg = $mlang_brisk['tickmust'][$G_lang];
1843 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1848 $table = $this->table[$user->table];
1850 if ($table->wag_own != -1) {
1851 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1852 $msg = $mlang_brisk['tickjust'][$G_lang];
1853 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1858 $dtime = $curtime - $table->wag_tout;
1859 if ($dtime < EXPIRE_TIME_WAG) {
1860 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1861 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1862 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1863 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1868 $msg = substr($msg, 5);
1870 $table->wag_set($user->idx_get(), $msg);
1871 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1872 $to_room = $to_user;
1873 /* for old isolation management $is_ticker = TRUE; */
1875 } // /tav chat command
1876 // just for development use currently
1877 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1878 fprintf(STDERR, "MOP OUT\n");
1879 $target = substr($msg, 5);
1880 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1882 else if (strncmp($msg, "/alarm ", 7) == 0) {
1883 if (strncmp($msg, "/alarm to ", 10) == 0) {
1884 $sp_pos = strpos($msg, " ", 10);
1885 $target = substr($msg, 10, $sp_pos - 10);
1886 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1890 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1893 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1894 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1895 $msg = $mlang_brisk['alarpass'][$G_lang];
1896 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1901 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1902 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1903 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1904 $to_user = nickserv_msg($dt, $prestr);
1906 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1907 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1908 /* MLANG: "chiudi" */
1909 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1911 } // /alarm chat command
1912 else if (strncmp($msg, "/listen ", 8) == 0) {
1913 $arg = substr($msg, 8);
1915 if (strcasecmp($arg, "isolation") == 0) {
1917 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1918 $user->table >= TABLES_AUTH_N) {
1919 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1923 $user->flags &= ~USER_FLAG_MAP_AUTH;
1924 $user->flags |= USER_FLAG_ISOLAUTH;
1925 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1928 else if (strcasecmp($arg, "auth") == 0) {
1929 $flags_old = $user->flags;
1930 $user->flags &= ~USER_FLAG_MAP_AUTH;
1931 $user->flags |= USER_FLAG_LISTAUTH;
1932 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1935 $flags_old = $user->flags;
1936 $user->flags &= ~USER_FLAG_MAP_AUTH;
1937 $to_user = 'list_set(\'all\', true, \'\'); ';
1940 // if from isolation redraw standup area
1941 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1942 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1946 else if (strcmp($msg, "/authreq") == 0) {
1947 if ($user->is_cert()) {
1948 $to_user = sprintf('authbox(300,200);');
1951 /* 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." */
1952 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1955 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1956 if ($user->is_auth()) {
1957 $to_user = sprintf('mesgtoadmbox(500,300);');
1960 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1961 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1964 else if (strncmp($msg, "/nick ", 6) == 0) {
1965 log_main("chatt_send BEGIN");
1968 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1969 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1973 $msg = "COMMAND ".$msg;
1974 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1975 $user_cur = $this->user[$i];
1977 if ($user_cur->is_active() == FALSE)
1979 if (strcasecmp($user_cur->name,$name_new) == 0)
1982 if ($i < MAX_PLAYERS) {
1983 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1984 $to_user = nickserv_msg($dt, $prestr);
1988 /* 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>" */
1989 if ($user->is_auth()) {
1990 if (strcasecmp($user->name,$name_new) != 0) {
1991 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1992 ($user->subst == 'standup' ||
1993 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
1996 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1997 for ($i = 0 ; $i < TABLES_N ; $i++) {
1998 $to_user .= $this->table[$i]->act_content($user);
2002 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2007 $user->name = $name_new; // OK - nick changed
2008 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2009 if ( ! $user->is_auth() ) {
2010 if (($bdb = BriskDB::create()) != FALSE) {
2012 /* 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>" */
2013 if ($bdb->login_exists($name_new)) {
2014 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2015 $to_user .= nickserv_msg($dt, $prestr);
2020 log_main("chatt_send start set");
2022 $update_room = TRUE;
2024 } // nick chat command
2025 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2026 $guar_user = substr($msg, 6);
2028 $this->guarantee_show($user, $guar_user, $dt);
2030 else if (strncmp($msg, "/st ", 4) == 0) {
2031 log_main("chatt_send BEGIN");
2034 $st_str = substr($msg, 4);
2036 if (strcasecmp($st_str, "normale") == 0) {
2037 $st = USER_FLAG_S_NORM;
2039 else if (strcasecmp($st_str, "pausa") == 0) {
2040 $st = USER_FLAG_S_PAU;
2042 else if (strcasecmp($st_str, "fuori") == 0) {
2043 $st = USER_FLAG_S_OUT;
2045 else if (strcasecmp($st_str, "cane") == 0) {
2046 $st = USER_FLAG_S_DOG;
2048 else if (strcasecmp($st_str, "cibo") == 0) {
2049 $st = USER_FLAG_S_EAT;
2051 else if (strcasecmp($st_str, "lavoro") == 0) {
2052 $st = USER_FLAG_S_WRK;
2054 else if (strcasecmp($st_str, "sigaretta") == 0) {
2055 $st = USER_FLAG_S_SMK;
2057 else if (strcasecmp($st_str, "presente") == 0) {
2058 $st = USER_FLAG_S_EYE;
2060 else if (strcasecmp($st_str, "coniglio") == 0) {
2061 $st = USER_FLAG_S_RABB;
2063 else if (strcasecmp($st_str, "calcio") == 0) {
2064 $st = USER_FLAG_S_SOCC;
2066 else if (strcasecmp($st_str, "pupo") == 0) {
2067 $st = USER_FLAG_S_BABY;
2069 else if (strcasecmp($st_str, "pulizie") == 0) {
2070 $st = USER_FLAG_S_MOP;
2072 else if (strcasecmp($st_str, "babbo") == 0) {
2073 $st = USER_FLAG_S_BABBO;
2075 else if (strcasecmp($st_str, "renna") == 0) {
2076 $st = USER_FLAG_S_RENNA;
2078 else if (strcasecmp($st_str, "pupazzo") == 0) {
2079 $st = USER_FLAG_S_PUPAZ;
2081 else if (strcasecmp($st_str, "vischio") == 0) {
2082 $st = USER_FLAG_S_VISCH;
2085 /* MLANG: "Questo stato non esiste." */
2086 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2090 log_main("chatt_send start set");
2091 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2092 $update_room = TRUE;
2093 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2096 } // nick chat command
2098 else { // normal chat line
2099 $is_normchat = TRUE;
2100 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2102 $user->chat_dlt = $user->chat_dlt * 2;
2103 if ($user->chat_dlt > 120)
2104 $user->chat_dlt = 120;
2106 else if ($user->chat_lst == $msg)
2108 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2109 $user->chat_ban = $curtime;
2110 $user->chat_dlt = 5;
2114 $user->chat_ban = 0;
2115 $user->chat_dlt = 0;
2119 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2122 if ( TRUE && (! $user->is_auth()) ) {
2123 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2124 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2125 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2126 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2127 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2129 $auguri = sprintf("%s auguri %s %s.",
2130 $aug_head[mt_rand(0, count($aug_head)-1)],
2131 $aug_body[mt_rand(0, count($aug_body)-1)],
2132 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2134 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2138 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2139 // temporary silentiation for troll (will became array check)
2140 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2141 $to_room = $to_user;
2145 log_legal($curtime, $user->ip, $user,
2146 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2148 $user->chat_lst = "$msg";
2149 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2159 // Output to clients
2162 if ($to_user != FALSE) {
2163 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2164 $user->comm[$user->step % COMM_N] .= $to_user;
2168 if ($to_room != FALSE) {
2169 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2170 $user_cur = $this->user[$i];
2171 if ($target != "" && $user_cur->name != $target)
2173 if ($user_cur->is_active() == FALSE // is not active user
2174 || $user_cur->stat == 'table' // or stat is 'table'
2175 || $user->idx_get() == $i) // or the $user idx is equal to current var
2178 if ($is_normchat == TRUE) {
2179 // use MAP_AUTH to check if auth or isolation
2180 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2181 if ( ! $user->is_auth() ) {
2187 else if ($is_ticker) {
2188 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2189 if ($user->table >= TABLES_AUTH_N)
2194 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2195 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2196 $user_cur->step_inc();
2201 // FIXME BRISK4: include for each kind of table
2202 require_once("${G_base}briskin5/Obj/briskin5.phh");
2203 // Before all align times with table timeout
2204 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2205 if (isset($this->match[$table_idx])) {
2206 $bin5 = $this->match[$table_idx];
2208 $bin5_table = $bin5->table[0];
2209 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2210 // stat must be "table" by definition
2211 $bin5_user = $bin5->user[$i];
2213 if ($target != "" && $bin5_user->name != $target)
2215 log_main("writa: ".$user_mesg);
2216 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2217 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2218 $bin5_user->step_inc();
2220 } // if (isset($this->match
2221 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2222 } // if ($to_tabl == true ...
2225 if ($user->stat == 'room' && $user->subst == 'standup') {
2226 $this->standup_update($user);
2228 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2229 log_main("chatt_send pre table update");
2230 $this->table_update($user);
2231 log_main("chatt_send post table update");
2233 } // if ($update_room ...
2236 } // function chatt_send( ...
2238 function get_user($sess, &$idx)
2242 if (validate_sess($sess)) {
2243 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2244 if ($this->user[$i]->is_empty())
2246 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2249 $ret = $this->user[$i];
2253 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2254 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2255 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2258 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2265 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2268 * if ($idx > -1 && ret == FALSE) => duplicated nick
2269 * if ($idx == -2 && ret == FALSE) => invalid name
2270 * if ($idx == -3 && ret == FALSE) => wrong password
2271 * if ($idx == -1 && ret == FALSE) => no space left
2272 * if ($idx == 0 && ret == user) => SUCCESS
2273 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2276 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2282 $authenticate = FALSE;
2284 $login_exists = FALSE;
2286 $ghost_auth = FALSE;
2291 if (($name_new = validate_name($name)) == FALSE) {
2296 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2297 if (validate_sess($sess) == FALSE)
2300 /* if pass != FALSE verify the login with pass */
2301 log_auth("XXX", "auth1");
2303 if (($bdb = BriskDB::create()) != FALSE) {
2305 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2306 log_auth("XXX", "auth2");
2307 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2308 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2310 if ($authenticate != FALSE) {
2311 $user_type = $authenticate->type_get();
2319 $login_exists = $bdb->login_exists($name_new);
2323 // if db is down, send a warning and verify only current users
2324 // no actions at this moment
2326 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2328 if ($this->user[$i]->is_empty()) {
2329 if ($idfree == -1) {
2334 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2339 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2340 if ($authenticate != FALSE) {
2342 $ghost_auth = $this->user[$i]->is_auth();
2353 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2355 /* there is another user logged with your account and you and him have authenticated => new user
2356 get the session of the old user */
2357 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2360 $ghost_user = $this->user[$ghost];
2362 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2363 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2364 $ghost_user->step_inc();
2367 $ghost_user->sess = $sess;
2370 $ghost_user->sess = $sess;
2373 // If user at the table we need to update the table data too
2374 $table_idx = $ghost_user->table;
2375 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2376 require_once("${G_base}briskin5/Obj/briskin5.phh");
2377 if (isset($this->match[$table_idx])) {
2378 $bin5 = $this->match[$table_idx];
2380 if ($bin5->the_end != TRUE) {
2381 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2382 $bin5->user[$ghost_user->table_pos]->step_inc();
2383 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2389 if (defined('CURL_DE_SAC_VERS')) {
2390 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2392 return ($this->user[$ghost]);
2394 else if ($idx != -1 && $i == MAX_PLAYERS) {
2399 $this->user[$idx]->sess = $sess;
2402 $this->user[$idx]->sess = $sess;
2404 $this->user[$idx]->name = $name_new; // OK - add new user
2405 $this->user[$idx]->stat_set("room");
2406 $this->user[$idx]->step_set(0);
2407 while (array_pop($this->user[$idx]->comm) != NULL);
2408 $this->user[$idx]->subst = "standup";
2409 $this->user[$idx]->lacc = $curtime;
2410 $this->user[$idx]->laccwr = $curtime;
2411 $this->user[$idx]->bantime = 0;
2412 $this->user[$idx]->ip = $ip;
2414 $this->user[$idx]->rec = $authenticate;
2415 $this->user[$idx]->flags = $user_type;
2416 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2417 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2418 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2420 if ($authenticate != FALSE) {
2421 $this->user[$idx]->code = $authenticate->code_get();
2423 // all this part is included in the db server
2424 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2426 if (isset($cookie['CO_list'])) {
2427 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2428 if (strcmp($cookie['CO_list'], "auth") == 0) {
2429 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2430 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2432 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2433 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2434 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2437 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2442 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2445 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2447 log_main("ghost: rename!");
2448 $ghost_user = $this->user[$ghost];
2450 if ($ghost_auth == FALSE) {
2451 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2452 $ghostname = 'ghost'.$sfx;
2453 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2454 if (strcmp("", $this->user[$i]->sess) == 0)
2457 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2462 if ($ghostname != '')
2466 $ghost_user->name = $ghostname;
2468 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2469 $this->standup_update($ghost_user);
2472 log_main("chatt_send pre table update");
2473 $this->table_update($ghost_user);
2474 log_main("chatt_send post table update");
2476 } // if ($ghost_auth == FALSE
2478 // FIXME: cacciare il vecchio utente room && table (if needed)
2479 $ghost_user->the_end = TRUE;
2480 $ghost_user->lacc = 0;
2481 $this->garbage_manager(TRUE);
2483 } // if ($ghost > -1) {
2488 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));
2490 $ret = $this->user[$real_idx];
2491 if (defined('CURL_DE_SAC_VERS')) {
2492 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2500 function standup_update($user)
2502 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2503 $user_cur = $this->user[$i];
2504 if ($user_cur->is_active() == FALSE)
2507 log_main("STANDUP START: ".$user_cur->stat);
2509 if ($user_cur->stat == 'room') {
2510 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2511 if ($user->idx_get() == $i) {
2512 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2514 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2516 $user_cur->step_inc();
2521 function dump_data()
2523 $brisk_ser = serialize($this);
2524 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2525 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2532 function standup_content($user)
2536 if ($user->stat != 'room')
2539 $content = ' j_stand_cont( [ ';
2541 $user_cur_id = $user->idx_get();
2542 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2543 if ($this->user[$i]->is_active() == FALSE // is not active user
2544 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2545 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2548 $flags = $this->user[$i]->flags;
2550 // sql record exists AND last donate > 2013-01-01
2551 if ($this->user[$i]->is_supp_custom()) {
2552 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2558 if ($this->user[$i]->subst == "standup") {
2559 if ($user_cur_id == $i) {
2563 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2564 xcape($this->user[$i]->name), $supp_comp_s);
2573 function table_content($user, $table_idx)
2579 // Si possono usare i dati nella classe table
2582 $sess = $user->sess;
2583 $table = $this->table[$table_idx];
2585 if ($user->stat != 'room')
2588 $user_cur_id = $user->idx_get();
2590 for ($i = 0 ; $i < $table->player_n ; $i++) {
2591 $user_cur = $this->user[$table->player[$i]];
2593 $flags = $user_cur->flags;
2595 if ($user_cur_id == $table->player[$i])
2598 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2599 if ($user_cur->is_supp_custom())
2600 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2604 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2605 xcape($user_cur->name), $supp_comp_s);
2610 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2615 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2617 GLOBAL $G_ban_list, $G_black_list, $G_provider_proxy;
2619 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2620 // $remote_addr = addrtoipv4($addr);
2621 $remote_addr = $this->pproxy_realip($header, addrtoipv4($addr));
2623 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2624 if ($this->black_check($remote_addr)) {
2625 // TODO: waiting async 5 sec before close
2626 fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2630 $enc = get_encoding($header);
2631 if (isset($header['User-Agent'])) {
2632 if (strstr($header['User-Agent'], "MSIE")) {
2633 $transp_type = "htmlfile";
2636 $transp_type = "xhr";
2640 $transp_type = "iframe";
2642 force_no_cache($header_out);
2648 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2649 $content = ob_get_contents();
2652 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2653 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2657 case "index_wr.php":
2659 // Enhance required: in the POST case, after the header you must get content
2660 // from the socket, waiting if necessary
2664 index_wr_main($this, $addr, $get, $post, $cookie);
2665 $content = ob_get_contents();
2668 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2672 case "index_rd.php":
2673 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2675 if ($transp == 'websocket')
2679 if (!isset($cookie['sess'])
2680 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2682 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2684 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2689 $this->sess_cur_set($user->sess);
2690 // close a previous opened index_read_ifra socket, if exists
2691 if (($prev = $user->rd_socket_get()) != NULL) {
2692 $s_a_p->socks_unset($user->rd_socket_get());
2693 fclose($user->rd_socket_get());
2694 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2695 $user->rd_socket_set(NULL);
2699 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2700 $response = headers_render($header_out, -1).$user->chunked_content($content);
2701 $response_l = mb_strlen($response, "ASCII");
2703 $wret = @fwrite($new_socket, $response, $response_l);
2704 if ($wret < $response_l) {
2705 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2706 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2709 $user->rd_cache_set("");
2711 fflush($new_socket);
2714 $s_a_p->socks_set($new_socket, $user, NULL);
2715 $user->rd_socket_set($new_socket);
2716 printf(" - qui ci siamo - ");
2723 if (!(BRISK_DEBUG & DBG_ENGI))
2725 fprintf(STDERR, "TEST.PHP running\n");
2726 if (isset($post['data'])) {
2727 $content = $post['data'];
2730 $content = "NO DATA AVAILABLE";
2732 $header_out['Content-Type'] = 'text/plain';
2733 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2737 /* FAR TODO: move all into an array of registered sub-apps */
2738 $subs = "briskin5/";
2739 $subs_l = strlen($subs);
2740 if (!strncmp($path, $subs, $subs_l)) {
2741 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2750 function match_add($idx, $match)
2752 $this->match[$idx] = $match;
2755 function match_del($idx)
2757 unset($this->match[$idx]);
2760 function match_get($idx, $token)
2762 if (isset($this->match[$idx])) {
2764 || $token == $this->match[$idx]->table_token) {
2765 return ($this->match[$idx]);
2770 function sess_cur_set($sess)
2772 static::$sess_cur = $sess;
2775 static function sess_cur_get()
2777 return(static::$sess_cur);
2779 } // end class Brisk
2781 function make_seed()
2783 list($usec, $sec) = explode(' ', microtime());
2784 return (float) $sec + ((float) $usec * 100000);
2787 function btrace_line($ar)
2789 GLOBAL $G_btrace_pref_sub;
2792 for ($i = 0 ; $i < count($ar) ; $i++) {
2793 $with_class = isset($ar[$i]['class']);
2794 $with_file = isset($ar[$i]['file']);
2795 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2796 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2797 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2798 ($with_file ? $ar[$i]['line'] : ""));
2804 function trace_ftok($id, $add)
2806 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2807 $tok=@ftok($id, $add);
2809 log_shme($tok.": ".$id." + ".$add);
2814 function log_mop($step, $log)
2818 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2821 $sess = Brisk::sess_cur_get();
2822 if (isset($sess) == FALSE)
2827 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2830 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2831 $btrace = btrace_line(debug_backtrace());
2834 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2835 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2840 function log_step($log)
2844 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2847 $sess = Brisk::sess_cur_get();
2848 if (isset($sess) == FALSE)
2853 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2856 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2857 $btrace = btrace_line(debug_backtrace());
2860 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2861 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2868 function log_cds($log)
2872 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 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_CDS) == 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."/cds.log", 'a')) != FALSE) {
2889 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2895 function log_only2($log)
2899 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2902 $sess = Brisk::sess_cur_get();
2903 if (isset($sess) == FALSE)
2908 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2911 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2912 $btrace = btrace_line(debug_backtrace());
2915 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2916 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2921 function log_crit($log)
2925 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2928 $sess = Brisk::sess_cur_get();
2929 if (isset($sess) == FALSE)
2934 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2937 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2938 $btrace = btrace_line(debug_backtrace());
2941 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2942 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2947 function log_only($log)
2951 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2954 $sess = Brisk::sess_cur_get();
2955 if (isset($sess) == FALSE)
2960 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2963 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2964 $btrace = btrace_line(debug_backtrace());
2967 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2968 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2973 function log_main($log)
2977 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2980 $sess = Brisk::sess_cur_get();
2981 if (isset($sess) == FALSE)
2986 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2989 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2990 $btrace = btrace_line(debug_backtrace());
2993 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2994 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2999 function log_rd($log)
3003 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3006 $sess = Brisk::sess_cur_get();
3007 if (isset($sess) == FALSE)
3012 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3015 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3016 $btrace = btrace_line(debug_backtrace());
3019 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3020 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3025 function log_rd2($log)
3029 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3032 $sess = Brisk::sess_cur_get();
3033 if (isset($sess) == FALSE)
3038 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3041 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3042 $btrace = btrace_line(debug_backtrace());
3046 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3047 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3052 function log_send($log)
3056 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3059 $sess = Brisk::sess_cur_get();
3060 if (isset($sess) == FALSE)
3065 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3068 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3069 $btrace = btrace_line(debug_backtrace());
3072 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3073 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3078 function log_lock($log)
3082 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3085 $sess = Brisk::sess_cur_get();
3086 if (isset($sess) == FALSE)
3091 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3094 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3095 $btrace = btrace_line(debug_backtrace());
3098 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3099 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3104 function log_wr($log)
3108 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3111 $sess = Brisk::sess_cur_get();
3112 if (isset($sess) == FALSE)
3117 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3120 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3121 $btrace = btrace_line(debug_backtrace());
3124 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3125 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3130 function log_load($log)
3134 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3137 $sess = Brisk::sess_cur_get();
3138 if (isset($sess) == FALSE)
3143 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3146 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3147 $btrace = btrace_line(debug_backtrace());
3150 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3151 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3156 function log_auth($sess, $log)
3160 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3163 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3166 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3167 $btrace = btrace_line(debug_backtrace());
3170 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3171 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3176 function log_shme($log)
3180 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3183 $sess = Brisk::sess_cur_get();
3184 if (isset($sess) == FALSE)
3189 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3192 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3193 $btrace = btrace_line(debug_backtrace());
3196 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3197 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3204 // function log_legal($curtime, $sess, $name, $where, $mesg)
3205 function log_legal($curtime, $addr, $user, $where, $mesg)
3208 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3209 /* Unix time | session | nickname | IP | where was | mesg */
3210 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3211 ($user->is_auth() ? 'A' : 'N'),
3212 $user->name, $addr, $where , $mesg));
3217 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3222 if ($sitted < PLAYERS_N) {
3230 if ($table == $cur_table)
3237 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3242 function show_notify($text, $tout, $butt, $w, $h)
3244 log_main("SHOW_NOTIFY: ".$text);
3245 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3248 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3250 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3251 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);
3254 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3256 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3259 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3260 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3263 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3264 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);
3268 function root_welcome($user)
3270 GLOBAL $root_wellarr, $G_lang;
3274 $dt = date("H:i ", $curtime);
3276 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3277 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3284 function validate_sess($sess)
3286 if (strlen($sess) == SESS_LEN)
3292 function validate_name($name)
3294 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3296 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3298 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3305 function playsound($filename)
3307 return (sprintf('playsound("flasou", "%s");', $filename));
3310 function secstoword($secs)
3316 $mins = floor($secs / 60);
3318 if ($G_lang == 'en') {
3320 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3323 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3327 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3330 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3335 function sharedmem_sz($tok)
3337 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3338 log_main("shmop_open failed");
3341 $shm_sz = shmop_size($shm_id);
3342 shmop_close($shm_id);
3344 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3351 static function lock_data($is_exclusive)
3353 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3354 self::$delta_t = microtime(TRUE);
3355 log_lock("LOCK warrant [".self::$delta_t."]");
3363 static function unlock_data($res)
3367 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3376 static function lock_data($is_exclusive)
3378 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3379 self::$delta_t = microtime(TRUE);
3380 log_lock("LOCK poll [".self::$delta_t."]");
3388 static function unlock_data($res)
3392 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3398 function carousel_top()
3403 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));
3406 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>'));