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.18.0";
160 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
161 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: Puffin riattivato, accessi da cloud disattivati.',
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>: Puffin re-enabled, cloud accesses disabled.',
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 $cloud_smasher; // list of cloud ip ranges to be rejected
1045 var $provider_proxy; // list of provider/browser that offer proxy service
1051 public static $sess_cur;
1059 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher, $prov_proxy) {
1060 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1061 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1062 fprintf(STDERR, "ROOM FROM FILE\n");
1063 rename($crystal_filename, $crystal_filename.".old");
1065 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher, $prov_proxy);
1071 fprintf(STDERR, "NEW ROOM\n");
1072 $thiz = new Brisk();
1074 $thiz->crystal_filename = $crystal_filename;
1075 $thiz->user = array();
1076 $thiz->table = array();
1077 $thiz->match = array();
1079 $thiz->ban_list = IpClass::create();
1080 $thiz->black_list = IpClass::create();
1081 $thiz->cloud_smasher = IpClass::create();
1082 $thiz->provider_proxy = ProviderProxy::create();
1083 $thiz->ghost_sess = new GhostSess();
1085 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1086 $thiz->user[$i] = User::create($thiz, $i, "", "");
1089 for ($i = 0 ; $i < TABLES_N ; $i++) {
1090 $thiz->table[$i] = Table::create($i);
1092 $thiz->garbage_timeout = 0;
1093 $thiz->shm_sz = SHM_DIMS_MIN;
1095 $thiz->delay_mgr = new Delay_Manager(1.5);
1097 static::$sess_cur = FALSE;
1099 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher, $prov_proxy);
1104 function reload($is_first, $ban_list, $black_list, $cloud_smasher, $prov_proxy)
1106 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)(%d)\n",
1107 count($ban_list), count($black_list), count($cloud_smasher), count($prov_proxy));
1109 if (defined('CURL_DE_SAC_VERS')) {
1110 if (brisk_cds_reload($this) == FALSE) {
1114 $this->ban_list->update($ban_list);
1115 $this->black_list->update($black_list);
1116 $this->cloud_smasher->update($cloud_smasher);
1117 $this->provider_proxy->update($prov_proxy);
1120 $this->banned_kickoff();
1121 $this->garbage_manager(TRUE);
1125 function banned_kickoff()
1129 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1130 $table_cur = $this->table[$table_idx];
1131 // if the table is complete and exists we check users IP
1133 if ($table_cur->player_n == PLAYERS_N) {
1134 if (isset($this->match[$table_idx]) &&
1135 $table_cur->table_token == $bin5->table_token) {
1136 log_main("PLAYERS == N TABLE ".$table_idx);
1138 $bin5 = $this->match[$table_idx];
1140 $is_ban |= $bin5->banned_kickoff();
1145 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1146 $user_cur = $this->user[$i];
1148 if ($user_cur->is_active() == FALSE)
1151 // check if the IP is blacklisted
1152 if ($this->black_check($user_cur->ip) ||
1153 $this->cloud_check($user_cur->ip)) {
1154 $user_cur->lacc = 0;
1159 // if authorized not check if banlisted
1160 if ($user_cur->is_auth()) {
1164 if ($this->ban_check($user_cur->ip)) {
1165 $user_cur->lacc = 0;
1173 function ban_check($ip_str)
1175 return ($this->ban_list->check($ip_str));
1178 function black_check($ip_str)
1180 return ($this->black_list->check($ip_str));
1183 function cloud_check($ip_str)
1185 return ($this->cloud_smasher->check($ip_str));
1188 function pproxy_realip($header, $ip_str)
1190 return ($this->provider_proxy->realip($header, $ip_str));
1193 function users_cleanup()
1195 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1196 $user_cur = $this->user[$i];
1198 if ($user_cur->the_end) {
1199 $user_cur->reset(); // users_cleanup, OK
1204 function garbage_manager($force)
1206 GLOBAL $G_lang, $mlang_brisk, $G_base;
1210 log_rd2("garbage_manager START");
1212 /* Garbage collector degli utenti in timeout */
1213 $curtime = microtime(TRUE);
1215 $delta = $this->delay_mgr->delta_get($curtime);
1217 if (!$force && !($this->garbage_timeout < $curtime)) {
1218 $this->delay_mgr->lastcheck_set($curtime);
1222 // Before all align times with table timeout
1223 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1224 $table_cur = $this->table[$table_idx];
1225 // if the table is complete and exists its shared mem we get the info about users lacc
1227 if ($table_cur->player_n == PLAYERS_N) {
1228 log_main("PLAYERS == N TABLE ".$table_idx);
1231 $no_recovery = FALSE;
1232 if (isset($this->match[$table_idx])) {
1233 $bin5 = $this->match[$table_idx];
1235 if ($table_cur->table_token != $bin5->table_token) {
1236 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1237 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1238 $no_recovery = TRUE;
1242 if ($bin5 != FALSE) {
1246 log_main("garbage_manager: bri loaded successfully.");
1247 $bin5->garbage_manager(TRUE);
1249 $bin5_table = $bin5->table[0];
1251 // is the end of the table
1253 if ($bin5->the_end == TRUE) {
1255 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1257 log_main("garbage_manager: INSIDE THE END.");
1259 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1260 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1261 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1264 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1265 // stat must be "table" by definition
1266 $user_cur = $this->user[$table_cur->player[$i]];
1267 $bin5_user = $bin5->user[$i];
1269 $user_cur->subst = $bin5_user->subst;
1270 $user_cur->rd_step = $bin5_user->rd_step;
1271 $user_cur->step = $bin5_user->step;
1272 $user_cur->lacc = $bin5_user->lacc;
1273 $user_cur->laccwr = $bin5_user->lacc;
1274 $user_cur->bantime = $bin5_user->bantime;
1275 $user_cur->the_end = $bin5_user->the_end;
1276 if ($user_cur->the_end) {
1277 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1281 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1283 $this->room_join_wakeup($user_cur, FALSE, 0);
1284 $table_cur->table_token = "";
1285 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1287 $this->match_del($table_idx);
1290 log_main("gm:: save_data");
1292 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1293 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1296 } // if ($bin5 == FALSE
1297 else if ($no_recovery == FALSE) {
1298 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1300 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1301 $user_cur = $this->user[$table_cur->player[$i]];
1302 $user_cur->subst = "shutdowner";
1303 $user_cur->step_inc();
1305 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1306 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1307 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1308 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1309 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1310 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1311 $user_cur->step_inc();
1314 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1315 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1316 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1318 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1320 $this->room_join_wakeup($user_cur, TRUE, -2);
1321 $table_cur->table_token = "";
1324 } // if ($table_cur->player_n == PLAYERS_N) {
1325 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1327 log_rd2("out new loop.");
1329 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1330 $user_cur = $this->user[$i];
1332 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1334 if ($user_cur->is_active() == FALSE)
1337 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1338 // Auto logout dell'utente
1339 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1341 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1342 $user_cur->the_end = TRUE;
1344 log_rd2("AUTO LOGOUT.");
1345 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1346 log_auth($user_cur->sess, "Autologout session.");
1348 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1349 $this->room_wakeup($user_cur);
1350 else if ($user_cur->subst == 'standup')
1351 $this->room_outstandup($user_cur);
1353 log_rd2("LOGOUT FROM WHAT ???");
1357 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1358 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1359 $this->room_wakeup($user_cur);
1360 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1361 /* 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" */
1362 $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);
1363 $user_cur->step_inc();
1367 log_rd2("GARBAGE UPDATED!");
1369 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1372 $this->ghost_sess->garbage_manager($curtime);
1374 $this->delay_mgr->lastcheck_set($curtime);
1378 function show_room($user_step, $user)
1380 GLOBAL $G_lang, $mlang_brisk;
1381 log_main("show_room: username: ".$user->name);
1383 $ret = sprintf('gst.st = %d; ', $user_step);
1385 $prefs = Client_prefs::from_user($user);
1386 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1389 if ($user->flags & USER_FLAG_ISOLAUTH) {
1390 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1392 else if ($user->flags & USER_FLAG_LISTAUTH) {
1393 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1396 $ret .= 'list_set(\'all\', false, \'\' ); ';
1400 if ($user->subst == 'standup')
1401 $ret .= "tra.show(); ";
1403 $ret .= "tra.hide(); ";
1405 $ret .= sprintf('stat = "%s";', $user->stat);
1407 $ret .= root_welcome($user);
1408 if ($user->flags & USER_FLAG_DBFAILED) {
1409 $ret .= "gst.st = ".($user->step+1)."; ";
1410 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1413 $ret .= sprintf('subst = "%s";', $user->subst);
1414 $ret .= $user->myname_innerHTML();
1416 for ($i = 0 ; $i < TABLES_N ; $i++) {
1418 $ret .= $this->table_content($user, $i);
1420 $ret .= $this->table[$i]->act_content($user);
1421 if ($this->table[$i]->wag_own != -1)
1422 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1424 $ret .= sprintf('tra.rem(%d); ', $i);
1426 $ret .= $this->standup_content($user);
1427 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1433 function room_wakeup($user)
1435 $table_idx = $user->table;
1436 $table = $this->table[$table_idx];
1438 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1442 $from_table = ($user->stat == "table");
1444 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1446 for ($i = 0 ; $i < $table->player_n ; $i++) {
1447 $user_cur = $this->user[$table->player[$i]];
1448 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1450 if ($user->idx_get() != $table->player[$i]) {
1451 $user_cur->stat_set("room");
1452 $user_cur->subst = "sitdown";
1453 $user_cur->laccwr = $curtime;
1455 else if ($user->is_active()) {
1456 $user_cur->stat_set("room");
1457 $user_cur->subst = "standup";
1458 $user_cur->laccwr = $curtime;
1459 $user_cur->table = -1;
1464 $user->stat_set("room");
1465 $user->subst = "standup";
1466 $user->laccwr = $curtime;
1469 $remove_wagon = FALSE;
1470 if($table->wag_own == $user->idx_get()) {
1471 $table->wag_reset($curtime);
1472 $remove_wagon = TRUE;
1476 /* aggiorna l'array dei giocatori al tavolo. */
1477 $table->user_rem($this, $user);
1479 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1480 $user_cur = $this->user[$i];
1481 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1484 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1486 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1487 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1488 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1489 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1490 log_main("DOCUMENT.index.php: from table");
1492 else if ($user_cur->stat == "room") {
1493 log_main("DOCUMENT.index.php: from table");
1495 $ret .= $this->table_content($user_cur, $table_idx);
1496 $ret .= $this->standup_content($user_cur);
1498 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1499 $ret .= $table->act_content($user);
1501 if ($user->idx_get() == $i) {
1502 // set the new status
1503 $ret .= 'subst = "standup"; tra.show(); ';
1504 // clean the action buttons in other tables
1505 for ($e = 0 ; $e < TABLES_N ; $e++) {
1506 if ($this->table[$e]->player_n < PLAYERS_N) {
1507 $ret .= $this->table[$e]->act_content($user);
1512 $ret .= $table->act_content($user_cur);
1515 log_wr("ROOM_WAKEUP: ".$ret);
1516 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1517 $user_cur->step_inc();
1521 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1523 $table_idx = $user->table;
1524 $table = $this->table[$table_idx];
1526 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1529 $user_wup = array();
1531 $user_tab = array();
1533 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1535 for ($i = 0 ; $i < $table->player_n ; $i++) {
1536 $user_cur = $this->user[$table->player[$i]];
1537 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1538 if ($user_cur->is_empty()) {
1541 if ($update_lacc == TRUE) {
1542 $user_cur->laccwr = $curtime;
1544 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1545 if ($user_cur->subst == "shutdowned") {
1546 $user_cur->stat_set("room");
1547 $user_cur->subst = "sitdown";
1549 else if ($user_cur->subst == "shutdowner") {
1550 $user_cur->stat_set("room");
1551 $user_cur->subst = "standup";
1552 $user_cur->table = -1;
1553 $user_wup[$user_wup_n++] = $user_cur;
1555 $remove_wagon = FALSE;
1556 if($table->wag_own == $table->player[$i]) {
1557 $remove_wagon = TRUE;
1558 $table->wag_reset($curtime);
1561 $user_tab[$user_tab_n++] = $table->player[$i];
1564 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1565 $table->user_rem($this, $user_wup[$wup_idx]);
1567 /* aggiorna l'array dei giocatori al tavolo. */
1569 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1570 log_main("START LOOP");
1571 $user_cur = $this->user[$i];
1572 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1573 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1578 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1580 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1581 if ($user_cur->stat == "room") {
1582 log_main("DOCUMENT.index.php from table");
1584 $ret .= $this->table_content($user_cur, $table_idx);
1585 $ret .= $this->standup_content($user_cur);
1587 $ret .= $table->act_content($user_cur);
1590 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1591 if ($user_tab[$tab_idx] == $i)
1594 // for users that wakeup the room will be reconstructed by index_rd.php
1595 if ($tab_idx < $user_tab_n) {
1596 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1598 // ARRAY_POP DISABLED
1599 // if ($trans_delta == 0)
1600 // while (array_pop($user_cur->comm) != NULL);
1602 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1603 $user_cur->comm[$user_cur->step % COMM_N] = "";
1604 $user_cur->step_inc();
1605 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1606 $user_cur->step_inc();
1607 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1611 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1613 log_main("JOIN_WAKEUP more");
1615 $ret .= $table->act_content($user_cur);
1617 log_main("JOIN_WAKEUP end more");
1619 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1620 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1621 $user_cur->step_inc();
1625 function guarantee_show($user, $user_login, $dt)
1627 GLOBAL $G_lang, $mlang_brisk, $G_base;
1633 if ($user_login == "") {
1637 if (($bdb = BriskDB::create()) == FALSE) {
1641 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1645 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1646 $guar_login = $guar_item->login_get();
1651 $user_tos_vers = $user_item->tos_vers_get();
1653 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1654 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1656 else if ($guar_login == "") {
1657 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1659 else if ($guar_login == $user_login) {
1660 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1663 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1664 xcape($user_login), xcape($guar_login)));
1669 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1672 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1678 function room_outstandup($user)
1680 $this->room_sitdown($user, -1);
1683 function table_update($user)
1685 log_main("table_update: pre - USER: ".$user->name);
1687 $table_idx = $user->table;
1689 if ($table_idx > -1)
1690 $table = $this->table[$table_idx];
1692 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1694 $user_cur = $this->user[$i];
1695 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1698 $ret = "gst.st = ".($user_cur->step+1)."; ";
1699 if ($table_idx > -1)
1700 $ret .= $this->table_content($user_cur, $table_idx);
1702 if ($user->idx_get() == $i) {
1703 $ret .= $user->myname_innerHTML();
1705 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1706 $user_cur->step_inc();
1709 log_main("table_update: post");
1712 function room_sitdown($user, $table_idx)
1714 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1718 if ($table_idx > -1 && $table_idx < TABLES_N) {
1719 $table = $this->table[$table_idx];
1722 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1723 for ($i = 0 ; $i < TABLES_N ; $i++) {
1724 if ($table->wag_own == $table->player[$i]) {
1725 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1726 $table->wag_reset(time());
1733 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1735 $user_cur = $this->user[$i];
1736 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1739 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1740 if ($table_idx > -1)
1741 $ret .= $this->table_content($user_cur, $table_idx);
1742 $ret .= $this->standup_content($user_cur);
1744 if ($user->idx_get() == $i) {
1745 $ret .= 'subst = "sitdown"; tra.hide(); ';
1746 // clean the action buttons in other tables
1747 for ($e = 0 ; $e < TABLES_N ; $e++) {
1748 $ret .= $this->table[$e]->act_content($user_cur);
1751 else if ($table_idx > -1) {
1752 if ($table->player_n == PLAYERS_N) {
1754 $ret .= $table->act_content($user_cur);
1757 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1758 $user_cur->step_inc();
1762 function kickuser($user, $out_reas)
1766 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1768 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1770 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1771 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1772 $bin5 = &$this->match[$user->table];
1773 $user_bin5 = &$bin5->user[$user->table_pos];
1774 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1775 $bin5->table_wakeup($user_bin5);
1776 $user->the_end = TRUE;
1777 $this->room_wakeup($user);
1781 if ($user->stat == 'table' || $user->stat == 'room') {
1782 $user->the_end = TRUE;
1783 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1784 $this->room_wakeup($user);
1786 else if ($user->subst == 'standup') {
1787 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1788 $this->room_outstandup($user);
1791 log_rd2("LOGOUT FROM WHAT ???");
1796 function kickuser_by_name($name, $out_reas)
1798 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1799 $user_out = $this->user[$i];
1800 if (strcmp($user_out->name, $name) == 0) {
1801 return ($this->kickuser($user_out, $out_reas));
1807 function kickuser_by_sess($sess, $out_reas)
1809 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1810 $user_out = $this->user[$i];
1811 if (strcmp($user_out->sess, $sess) == 0) {
1812 return ($this->kickuser($user_out, $out_reas));
1818 function kickuser_by_idx($idx, $out_reas)
1820 $user_out = $this->user[$idx];
1821 return ($this->kickuser($user_out, $out_reas));
1824 function chatt_send($user, $mesg)
1826 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1830 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1832 $dt = date("H:i ", $curtime);
1843 $is_normchat = FALSE;
1844 /* for old isolation management $is_ticker = FALSE; */
1845 $update_room = FALSE;
1847 if (strcmp($msg, "/tav") == 0 ||
1848 strncmp($msg, "/tav ", 5) == 0) {
1850 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1851 /* 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>" */
1852 $msg = $mlang_brisk['tickmust'][$G_lang];
1853 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1858 $table = $this->table[$user->table];
1860 if ($table->wag_own != -1) {
1861 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1862 $msg = $mlang_brisk['tickjust'][$G_lang];
1863 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1868 $dtime = $curtime - $table->wag_tout;
1869 if ($dtime < EXPIRE_TIME_WAG) {
1870 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1871 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1872 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1873 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1878 $msg = substr($msg, 5);
1880 $table->wag_set($user->idx_get(), $msg);
1881 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1882 $to_room = $to_user;
1883 /* for old isolation management $is_ticker = TRUE; */
1885 } // /tav chat command
1886 // just for development use currently
1887 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1888 fprintf(STDERR, "MOP OUT\n");
1889 $target = substr($msg, 5);
1890 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1892 else if (strncmp($msg, "/alarm ", 7) == 0) {
1893 if (strncmp($msg, "/alarm to ", 10) == 0) {
1894 $sp_pos = strpos($msg, " ", 10);
1895 $target = substr($msg, 10, $sp_pos - 10);
1896 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1900 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1903 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1904 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1905 $msg = $mlang_brisk['alarpass'][$G_lang];
1906 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1911 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1912 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1913 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1914 $to_user = nickserv_msg($dt, $prestr);
1916 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1917 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1918 /* MLANG: "chiudi" */
1919 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1921 } // /alarm chat command
1922 else if (strncmp($msg, "/listen ", 8) == 0) {
1923 $arg = substr($msg, 8);
1925 if (strcasecmp($arg, "isolation") == 0) {
1927 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1928 $user->table >= TABLES_AUTH_N) {
1929 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1933 $user->flags &= ~USER_FLAG_MAP_AUTH;
1934 $user->flags |= USER_FLAG_ISOLAUTH;
1935 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1938 else if (strcasecmp($arg, "auth") == 0) {
1939 $flags_old = $user->flags;
1940 $user->flags &= ~USER_FLAG_MAP_AUTH;
1941 $user->flags |= USER_FLAG_LISTAUTH;
1942 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1945 $flags_old = $user->flags;
1946 $user->flags &= ~USER_FLAG_MAP_AUTH;
1947 $to_user = 'list_set(\'all\', true, \'\'); ';
1950 // if from isolation redraw standup area
1951 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1952 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1956 else if (strcmp($msg, "/authreq") == 0) {
1957 if ($user->is_cert()) {
1958 $to_user = sprintf('authbox(300,200);');
1961 /* 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." */
1962 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1965 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1966 if ($user->is_auth()) {
1967 $to_user = sprintf('mesgtoadmbox(500,300);');
1970 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1971 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1974 else if (strncmp($msg, "/nick ", 6) == 0) {
1975 log_main("chatt_send BEGIN");
1978 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1979 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1983 $msg = "COMMAND ".$msg;
1984 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1985 $user_cur = $this->user[$i];
1987 if ($user_cur->is_active() == FALSE)
1989 if (strcasecmp($user_cur->name,$name_new) == 0)
1992 if ($i < MAX_PLAYERS) {
1993 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1994 $to_user = nickserv_msg($dt, $prestr);
1998 /* 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>" */
1999 if ($user->is_auth()) {
2000 if (strcasecmp($user->name,$name_new) != 0) {
2001 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2002 ($user->subst == 'standup' ||
2003 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2006 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2007 for ($i = 0 ; $i < TABLES_N ; $i++) {
2008 $to_user .= $this->table[$i]->act_content($user);
2012 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2017 $user->name = $name_new; // OK - nick changed
2018 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2019 if ( ! $user->is_auth() ) {
2020 if (($bdb = BriskDB::create()) != FALSE) {
2022 /* 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>" */
2023 if ($bdb->login_exists($name_new)) {
2024 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2025 $to_user .= nickserv_msg($dt, $prestr);
2030 log_main("chatt_send start set");
2032 $update_room = TRUE;
2034 } // nick chat command
2035 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2036 $guar_user = substr($msg, 6);
2038 $this->guarantee_show($user, $guar_user, $dt);
2040 else if (strncmp($msg, "/st ", 4) == 0) {
2041 log_main("chatt_send BEGIN");
2044 $st_str = substr($msg, 4);
2046 if (strcasecmp($st_str, "normale") == 0) {
2047 $st = USER_FLAG_S_NORM;
2049 else if (strcasecmp($st_str, "pausa") == 0) {
2050 $st = USER_FLAG_S_PAU;
2052 else if (strcasecmp($st_str, "fuori") == 0) {
2053 $st = USER_FLAG_S_OUT;
2055 else if (strcasecmp($st_str, "cane") == 0) {
2056 $st = USER_FLAG_S_DOG;
2058 else if (strcasecmp($st_str, "cibo") == 0) {
2059 $st = USER_FLAG_S_EAT;
2061 else if (strcasecmp($st_str, "lavoro") == 0) {
2062 $st = USER_FLAG_S_WRK;
2064 else if (strcasecmp($st_str, "sigaretta") == 0) {
2065 $st = USER_FLAG_S_SMK;
2067 else if (strcasecmp($st_str, "presente") == 0) {
2068 $st = USER_FLAG_S_EYE;
2070 else if (strcasecmp($st_str, "coniglio") == 0) {
2071 $st = USER_FLAG_S_RABB;
2073 else if (strcasecmp($st_str, "calcio") == 0) {
2074 $st = USER_FLAG_S_SOCC;
2076 else if (strcasecmp($st_str, "pupo") == 0) {
2077 $st = USER_FLAG_S_BABY;
2079 else if (strcasecmp($st_str, "pulizie") == 0) {
2080 $st = USER_FLAG_S_MOP;
2082 else if (strcasecmp($st_str, "babbo") == 0) {
2083 $st = USER_FLAG_S_BABBO;
2085 else if (strcasecmp($st_str, "renna") == 0) {
2086 $st = USER_FLAG_S_RENNA;
2088 else if (strcasecmp($st_str, "pupazzo") == 0) {
2089 $st = USER_FLAG_S_PUPAZ;
2091 else if (strcasecmp($st_str, "vischio") == 0) {
2092 $st = USER_FLAG_S_VISCH;
2095 /* MLANG: "Questo stato non esiste." */
2096 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2100 log_main("chatt_send start set");
2101 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2102 $update_room = TRUE;
2103 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2106 } // nick chat command
2108 else { // normal chat line
2109 $is_normchat = TRUE;
2110 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2112 $user->chat_dlt = $user->chat_dlt * 2;
2113 if ($user->chat_dlt > 120)
2114 $user->chat_dlt = 120;
2116 else if ($user->chat_lst == $msg)
2118 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2119 $user->chat_ban = $curtime;
2120 $user->chat_dlt = 5;
2124 $user->chat_ban = 0;
2125 $user->chat_dlt = 0;
2129 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2132 if ( TRUE && (! $user->is_auth()) ) {
2133 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2134 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2135 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2136 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2137 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2139 $auguri = sprintf("%s auguri %s %s.",
2140 $aug_head[mt_rand(0, count($aug_head)-1)],
2141 $aug_body[mt_rand(0, count($aug_body)-1)],
2142 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2144 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2148 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2149 // temporary silentiation for troll (will became array check)
2150 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2151 $to_room = $to_user;
2155 log_legal($curtime, $user->ip, $user,
2156 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2158 $user->chat_lst = "$msg";
2159 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2169 // Output to clients
2172 if ($to_user != FALSE) {
2173 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2174 $user->comm[$user->step % COMM_N] .= $to_user;
2178 if ($to_room != FALSE) {
2179 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2180 $user_cur = $this->user[$i];
2181 if ($target != "" && $user_cur->name != $target)
2183 if ($user_cur->is_active() == FALSE // is not active user
2184 || $user_cur->stat == 'table' // or stat is 'table'
2185 || $user->idx_get() == $i) // or the $user idx is equal to current var
2188 if ($is_normchat == TRUE) {
2189 // use MAP_AUTH to check if auth or isolation
2190 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2191 if ( ! $user->is_auth() ) {
2197 else if ($is_ticker) {
2198 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2199 if ($user->table >= TABLES_AUTH_N)
2204 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2205 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2206 $user_cur->step_inc();
2211 // FIXME BRISK4: include for each kind of table
2212 require_once("${G_base}briskin5/Obj/briskin5.phh");
2213 // Before all align times with table timeout
2214 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2215 if (isset($this->match[$table_idx])) {
2216 $bin5 = $this->match[$table_idx];
2218 $bin5_table = $bin5->table[0];
2219 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2220 // stat must be "table" by definition
2221 $bin5_user = $bin5->user[$i];
2223 if ($target != "" && $bin5_user->name != $target)
2225 log_main("writa: ".$user_mesg);
2226 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2227 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2228 $bin5_user->step_inc();
2230 } // if (isset($this->match
2231 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2232 } // if ($to_tabl == true ...
2235 if ($user->stat == 'room' && $user->subst == 'standup') {
2236 $this->standup_update($user);
2238 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2239 log_main("chatt_send pre table update");
2240 $this->table_update($user);
2241 log_main("chatt_send post table update");
2243 } // if ($update_room ...
2246 } // function chatt_send( ...
2248 function get_user($sess, &$idx)
2252 if (validate_sess($sess)) {
2253 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2254 if ($this->user[$i]->is_empty())
2256 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2259 $ret = $this->user[$i];
2263 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2264 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2265 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2268 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2275 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2278 * if ($idx > -1 && ret == FALSE) => duplicated nick
2279 * if ($idx == -2 && ret == FALSE) => invalid name
2280 * if ($idx == -3 && ret == FALSE) => wrong password
2281 * if ($idx == -1 && ret == FALSE) => no space left
2282 * if ($idx == 0 && ret == user) => SUCCESS
2283 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2286 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2292 $authenticate = FALSE;
2294 $login_exists = FALSE;
2296 $ghost_auth = FALSE;
2301 if (($name_new = validate_name($name)) == FALSE) {
2306 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2307 if (validate_sess($sess) == FALSE)
2310 /* if pass != FALSE verify the login with pass */
2311 log_auth("XXX", "auth1");
2313 if (($bdb = BriskDB::create()) != FALSE) {
2315 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2316 log_auth("XXX", "auth2");
2317 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2318 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2320 if ($authenticate != FALSE) {
2321 $user_type = $authenticate->type_get();
2329 $login_exists = $bdb->login_exists($name_new);
2333 // if db is down, send a warning and verify only current users
2334 // no actions at this moment
2336 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2338 if ($this->user[$i]->is_empty()) {
2339 if ($idfree == -1) {
2344 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2349 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2350 if ($authenticate != FALSE) {
2352 $ghost_auth = $this->user[$i]->is_auth();
2363 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2365 /* there is another user logged with your account and you and him have authenticated => new user
2366 get the session of the old user */
2367 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2370 $ghost_user = $this->user[$ghost];
2372 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2373 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2374 $ghost_user->step_inc();
2377 $ghost_user->sess = $sess;
2380 $ghost_user->sess = $sess;
2383 // If user at the table we need to update the table data too
2384 $table_idx = $ghost_user->table;
2385 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2386 require_once("${G_base}briskin5/Obj/briskin5.phh");
2387 if (isset($this->match[$table_idx])) {
2388 $bin5 = $this->match[$table_idx];
2390 if ($bin5->the_end != TRUE) {
2391 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2392 $bin5->user[$ghost_user->table_pos]->step_inc();
2393 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2399 if (defined('CURL_DE_SAC_VERS')) {
2400 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2402 return ($this->user[$ghost]);
2404 else if ($idx != -1 && $i == MAX_PLAYERS) {
2409 $this->user[$idx]->sess = $sess;
2412 $this->user[$idx]->sess = $sess;
2414 $this->user[$idx]->name = $name_new; // OK - add new user
2415 $this->user[$idx]->stat_set("room");
2416 $this->user[$idx]->step_set(0);
2417 while (array_pop($this->user[$idx]->comm) != NULL);
2418 $this->user[$idx]->subst = "standup";
2419 $this->user[$idx]->lacc = $curtime;
2420 $this->user[$idx]->laccwr = $curtime;
2421 $this->user[$idx]->bantime = 0;
2422 $this->user[$idx]->ip = $ip;
2424 $this->user[$idx]->rec = $authenticate;
2425 $this->user[$idx]->flags = $user_type;
2426 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2427 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2428 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2430 if ($authenticate != FALSE) {
2431 $this->user[$idx]->code = $authenticate->code_get();
2433 // all this part is included in the db server
2434 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2436 if (isset($cookie['CO_list'])) {
2437 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2438 if (strcmp($cookie['CO_list'], "auth") == 0) {
2439 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2440 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2442 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2443 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2444 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2447 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2452 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2455 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2457 log_main("ghost: rename!");
2458 $ghost_user = $this->user[$ghost];
2460 if ($ghost_auth == FALSE) {
2461 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2462 $ghostname = 'ghost'.$sfx;
2463 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2464 if (strcmp("", $this->user[$i]->sess) == 0)
2467 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2472 if ($ghostname != '')
2476 $ghost_user->name = $ghostname;
2478 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2479 $this->standup_update($ghost_user);
2482 log_main("chatt_send pre table update");
2483 $this->table_update($ghost_user);
2484 log_main("chatt_send post table update");
2486 } // if ($ghost_auth == FALSE
2488 // FIXME: cacciare il vecchio utente room && table (if needed)
2489 $ghost_user->the_end = TRUE;
2490 $ghost_user->lacc = 0;
2491 $this->garbage_manager(TRUE);
2493 } // if ($ghost > -1) {
2498 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));
2500 $ret = $this->user[$real_idx];
2501 if (defined('CURL_DE_SAC_VERS')) {
2502 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2510 function standup_update($user)
2512 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2513 $user_cur = $this->user[$i];
2514 if ($user_cur->is_active() == FALSE)
2517 log_main("STANDUP START: ".$user_cur->stat);
2519 if ($user_cur->stat == 'room') {
2520 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2521 if ($user->idx_get() == $i) {
2522 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2524 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2526 $user_cur->step_inc();
2531 function dump_data()
2533 $brisk_ser = serialize($this);
2534 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2535 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2542 function standup_content($user)
2546 if ($user->stat != 'room')
2549 $content = ' j_stand_cont( [ ';
2551 $user_cur_id = $user->idx_get();
2552 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2553 if ($this->user[$i]->is_active() == FALSE // is not active user
2554 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2555 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2558 $flags = $this->user[$i]->flags;
2560 // sql record exists AND last donate > 2013-01-01
2561 if ($this->user[$i]->is_supp_custom()) {
2562 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2568 if ($this->user[$i]->subst == "standup") {
2569 if ($user_cur_id == $i) {
2573 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2574 xcape($this->user[$i]->name), $supp_comp_s);
2583 function table_content($user, $table_idx)
2589 // Si possono usare i dati nella classe table
2592 $sess = $user->sess;
2593 $table = $this->table[$table_idx];
2595 if ($user->stat != 'room')
2598 $user_cur_id = $user->idx_get();
2600 for ($i = 0 ; $i < $table->player_n ; $i++) {
2601 $user_cur = $this->user[$table->player[$i]];
2603 $flags = $user_cur->flags;
2605 if ($user_cur_id == $table->player[$i])
2608 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2609 if ($user_cur->is_supp_custom())
2610 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2614 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2615 xcape($user_cur->name), $supp_comp_s);
2620 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2625 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2627 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher, $G_provider_proxy;
2629 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2630 // $remote_addr = addrtoipv4($addr);
2631 $remote_addr = $this->pproxy_realip($header, addrtoipv4($addr));
2633 fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $remote_addr);
2634 if ($this->black_check($remote_addr)) {
2635 // TODO: waiting async 5 sec before close
2636 fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2639 if ($path != "" && $path != "index.php") {
2640 if ($this->cloud_check($remote_addr)) {
2641 // TODO: waiting async 5 sec before close
2646 $enc = get_encoding($header);
2647 if (isset($header['User-Agent'])) {
2648 if (strstr($header['User-Agent'], "MSIE")) {
2649 $transp_type = "htmlfile";
2652 $transp_type = "xhr";
2656 $transp_type = "iframe";
2658 force_no_cache($header_out);
2664 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2665 $content = ob_get_contents();
2668 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2669 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2673 case "index_wr.php":
2675 // Enhance required: in the POST case, after the header you must get content
2676 // from the socket, waiting if necessary
2680 index_wr_main($this, $addr, $get, $post, $cookie);
2681 $content = ob_get_contents();
2684 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2688 case "index_rd.php":
2689 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2691 if ($transp == 'websocket')
2695 if (!isset($cookie['sess'])
2696 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2698 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2700 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2705 $this->sess_cur_set($user->sess);
2706 // close a previous opened index_read_ifra socket, if exists
2707 if (($prev = $user->rd_socket_get()) != NULL) {
2708 $s_a_p->socks_unset($user->rd_socket_get());
2709 fclose($user->rd_socket_get());
2710 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2711 $user->rd_socket_set(NULL);
2715 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2716 $response = headers_render($header_out, -1).$user->chunked_content($content);
2717 $response_l = mb_strlen($response, "ASCII");
2719 $wret = @fwrite($new_socket, $response, $response_l);
2720 if ($wret < $response_l) {
2721 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2722 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2725 $user->rd_cache_set("");
2727 fflush($new_socket);
2730 $s_a_p->socks_set($new_socket, $user, NULL);
2731 $user->rd_socket_set($new_socket);
2732 printf(" - qui ci siamo - ");
2739 if (!(BRISK_DEBUG & DBG_ENGI))
2741 fprintf(STDERR, "TEST.PHP running\n");
2742 if (isset($post['data'])) {
2743 $content = $post['data'];
2746 $content = "NO DATA AVAILABLE";
2748 $header_out['Content-Type'] = 'text/plain';
2749 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2753 /* FAR TODO: move all into an array of registered sub-apps */
2754 $subs = "briskin5/";
2755 $subs_l = strlen($subs);
2756 if (!strncmp($path, $subs, $subs_l)) {
2757 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2766 function match_add($idx, $match)
2768 $this->match[$idx] = $match;
2771 function match_del($idx)
2773 unset($this->match[$idx]);
2776 function match_get($idx, $token)
2778 if (isset($this->match[$idx])) {
2780 || $token == $this->match[$idx]->table_token) {
2781 return ($this->match[$idx]);
2786 function sess_cur_set($sess)
2788 static::$sess_cur = $sess;
2791 static function sess_cur_get()
2793 return(static::$sess_cur);
2795 } // end class Brisk
2797 function make_seed()
2799 list($usec, $sec) = explode(' ', microtime());
2800 return (float) $sec + ((float) $usec * 100000);
2803 function btrace_line($ar)
2805 GLOBAL $G_btrace_pref_sub;
2808 for ($i = 0 ; $i < count($ar) ; $i++) {
2809 $with_class = isset($ar[$i]['class']);
2810 $with_file = isset($ar[$i]['file']);
2811 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2812 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2813 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2814 ($with_file ? $ar[$i]['line'] : ""));
2820 function trace_ftok($id, $add)
2822 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2823 $tok=@ftok($id, $add);
2825 log_shme($tok.": ".$id." + ".$add);
2830 function log_mop($step, $log)
2834 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2837 $sess = Brisk::sess_cur_get();
2838 if (isset($sess) == FALSE)
2843 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2846 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2847 $btrace = btrace_line(debug_backtrace());
2850 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2851 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2856 function log_step($log)
2860 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2863 $sess = Brisk::sess_cur_get();
2864 if (isset($sess) == FALSE)
2869 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2872 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2873 $btrace = btrace_line(debug_backtrace());
2876 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2877 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2884 function log_cds($log)
2888 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2891 $sess = Brisk::sess_cur_get();
2892 if (isset($sess) == FALSE)
2897 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2900 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2901 $btrace = btrace_line(debug_backtrace());
2904 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2905 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2911 function log_only2($log)
2915 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 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_ONL2) == 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("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2937 function log_crit($log)
2941 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 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_CRIT) == 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("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2963 function log_only($log)
2967 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 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_ONLY) == 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("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2989 function log_main($log)
2993 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2996 $sess = Brisk::sess_cur_get();
2997 if (isset($sess) == FALSE)
3002 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3005 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3006 $btrace = btrace_line(debug_backtrace());
3009 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3010 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3015 function log_rd($log)
3019 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3022 $sess = Brisk::sess_cur_get();
3023 if (isset($sess) == FALSE)
3028 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3031 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3032 $btrace = btrace_line(debug_backtrace());
3035 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3036 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3041 function log_rd2($log)
3045 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3048 $sess = Brisk::sess_cur_get();
3049 if (isset($sess) == FALSE)
3054 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3057 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3058 $btrace = btrace_line(debug_backtrace());
3062 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3063 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3068 function log_send($log)
3072 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3075 $sess = Brisk::sess_cur_get();
3076 if (isset($sess) == FALSE)
3081 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3084 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3085 $btrace = btrace_line(debug_backtrace());
3088 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3089 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3094 function log_lock($log)
3098 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3101 $sess = Brisk::sess_cur_get();
3102 if (isset($sess) == FALSE)
3107 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3110 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3111 $btrace = btrace_line(debug_backtrace());
3114 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3115 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3120 function log_wr($log)
3124 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3127 $sess = Brisk::sess_cur_get();
3128 if (isset($sess) == FALSE)
3133 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3136 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3137 $btrace = btrace_line(debug_backtrace());
3140 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3141 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3146 function log_load($log)
3150 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3153 $sess = Brisk::sess_cur_get();
3154 if (isset($sess) == FALSE)
3159 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3162 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3163 $btrace = btrace_line(debug_backtrace());
3166 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3167 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3172 function log_auth($sess, $log)
3176 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3179 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3182 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3183 $btrace = btrace_line(debug_backtrace());
3186 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3187 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3192 function log_shme($log)
3196 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3199 $sess = Brisk::sess_cur_get();
3200 if (isset($sess) == FALSE)
3205 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3208 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3209 $btrace = btrace_line(debug_backtrace());
3212 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3213 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3220 // function log_legal($curtime, $sess, $name, $where, $mesg)
3221 function log_legal($curtime, $addr, $user, $where, $mesg)
3224 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3225 /* Unix time | session | nickname | IP | where was | mesg */
3226 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3227 ($user->is_auth() ? 'A' : 'N'),
3228 $user->name, $addr, $where , $mesg));
3233 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3238 if ($sitted < PLAYERS_N) {
3246 if ($table == $cur_table)
3253 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3258 function show_notify($text, $tout, $butt, $w, $h)
3260 log_main("SHOW_NOTIFY: ".$text);
3261 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3264 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3266 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3267 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);
3270 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3272 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3275 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3276 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3279 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3280 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);
3284 function root_welcome($user)
3286 GLOBAL $root_wellarr, $G_lang;
3290 $dt = date("H:i ", $curtime);
3292 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3293 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3300 function validate_sess($sess)
3302 if (strlen($sess) == SESS_LEN)
3308 function validate_name($name)
3310 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3312 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3314 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3321 function playsound($filename)
3323 return (sprintf('playsound("flasou", "%s");', $filename));
3326 function secstoword($secs)
3332 $mins = floor($secs / 60);
3334 if ($G_lang == 'en') {
3336 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3339 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3343 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3346 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3351 function sharedmem_sz($tok)
3353 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3354 log_main("shmop_open failed");
3357 $shm_sz = shmop_size($shm_id);
3358 shmop_close($shm_id);
3360 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3367 static function lock_data($is_exclusive)
3369 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3370 self::$delta_t = microtime(TRUE);
3371 log_lock("LOCK warrant [".self::$delta_t."]");
3379 static function unlock_data($res)
3383 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3392 static function lock_data($is_exclusive)
3394 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3395 self::$delta_t = microtime(TRUE);
3396 log_lock("LOCK poll [".self::$delta_t."]");
3404 static function unlock_data($res)
3408 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3414 function carousel_top()
3419 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));
3422 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>'));