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 function addrtoipv4($addr)
452 $ipv4addr_arr = explode(':' , $addr);
453 if (isset($ipv4addr_arr[3])) {
454 $ipv4addr = $ipv4addr_arr[3];
464 for ($i = 0; $i < ob_get_level(); $i++)
466 ob_implicit_flush(1);
470 function force_no_cache(&$header_out)
472 $header_out['Pragma'] = 'no-cache, must-revalidate';
473 $header_out['Cache-Control'] = 'no-cache';
474 $header_out['Expires'] = '-1';
477 function file_lock($fname, $is_exclusive)
479 if (($res = @fopen($fname, "r+")) == FALSE) {
483 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
491 function file_unlock($res)
494 flock($res, LOCK_UN);
499 $escpush_from = array("\\", "\"");
500 $escpush_to = array("\\\\", "\\\"");
503 GLOBAL $escpush_from, $escpush_to;
505 return str_replace($escpush_from, $escpush_to, $s);
508 $escinp_from = array( "\"" );
509 $escinp_to = array( """ );
511 function escinput($s)
513 GLOBAL $escinp_from, $escinp_to;
515 return str_replace($escinp_from, $escinp_to, $s);
520 return htmlentities($s, ENT_COMPAT, "UTF-8");
523 function esclfhtml($s)
525 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
528 function langtolng($lang)
532 return ($G_lang == 'en' ? '-en' : '');
535 function csplitter($in, $sep)
541 for ($i = 0 ; $i < strlen($in) ; $i++) {
542 $ini = substr($in, $i, 1);
546 else if ($ini == $sep) {
565 $from = array ( '\\', '@', '|' );
566 $to = array ( '\\\\', '@', '¦' );
568 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
573 $from = array ( '\\', '|', "\t", "\n");
574 $to = array ( '\\\\', '\\|', "\\t", "\\n");
576 return (str_replace($from, $to, $s));
579 function xcapemesg($s)
581 $from = array ( "\n");
582 $to = array ( "\\n");
584 return (str_replace($from, $to, $s));
594 function getbyid($idx)
596 return ($this->el[$idx]);
599 function setbyid($idx, $v)
601 $this->el[$idx] = $v;
605 define('TABLE_AUTH_TY_PUBL', 0);
606 define('TABLE_AUTH_TY_AUTH', 1);
607 define('TABLE_AUTH_TY_CERT', 2);
615 var $auth_type; // required authorization to sit down
622 var $table_start; // information field
630 function create($idx)
632 if (($thiz = new Table()) == FALSE)
636 $thiz->player = array();
639 if ($idx < TABLES_CERT_N)
640 $thiz->auth_type = TABLE_AUTH_TY_CERT;
641 else if ($idx < TABLES_AUTH_N)
642 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
644 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
650 $thiz->table_token = "";
651 $thiz->table_start = 0;
653 $thiz->wakeup_time = 0;
660 $this->idx = $from->idx;
661 $this->player = array();
662 for ($i = 0 ; $i < $from->player_n ; $i++)
663 $this->player[$i] = $from->player[$i];
664 $this->player_n = $from->player_n;
666 log_main("PLAYER_N - parent::copy.".$this->player_n);
668 $this->auth_type = $from->auth_type;
670 $this->wag_own = $from->wag_own;
671 $this->wag_com = $from->wag_com;
672 $this->wag_tout = $from->wag_tout;
674 $this->table_token = $from->table_token;
675 $this->table_start = $from->table_start;
677 $this->wakeup_time = $from->wakeup_time;
680 function myclone($from)
682 if (($thiz = new Table()) == FALSE)
690 function spawn($from)
692 if (($thiz = new Table()) == FALSE)
695 $thiz->idx = $from->idx;
696 $thiz->player = array();
697 for ($i = 0 ; $i < $from->player_n ; $i++)
698 $thiz->player[$i] = $i;
699 $thiz->player_n = $from->player_n;
701 $thiz->auth_type = $from->auth_type;
703 $thiz->wag_own = $from->wag_own;
704 $thiz->wag_com = $from->wag_com;
705 $thiz->wag_tout = $from->wag_tout;
707 $thiz->table_token = $from->table_token;
708 $thiz->table_start = $from->table_start;
710 $thiz->wakeup_time = $from->wakeup_time;
715 function wag_set($user_idx, $mesg)
719 $this->wag_own = $user_idx;
720 $this->wag_com = $mesg;
724 function wag_reset($timeout)
726 log_main("WAG_RESET");
728 unset($this->wag_own);
731 $this->wag_tout = $timeout;
734 function player_get($idx)
736 return ($this->player[$idx]);
739 function player_set($idx, $player)
741 $this->player[$idx] = $player;
744 function user_add($idx)
746 $this->player[$this->player_n] = $idx;
749 return ($this->player_n - 1);
752 function user_rem($brisk, $user)
754 $tabpos = $user->table_pos;
756 /* verifico la consistenza dei dati */
757 if ($brisk->user[$this->player[$tabpos]] == $user) {
759 /* aggiorna l'array dei giocatori al tavolo. */
760 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
761 $this->player[$i] = $this->player[$i+1];
762 $user_cur = $brisk->user[$this->player[$i]];
763 $user_cur->table_pos = $i;
768 log_main("INCONSISTENCY ON TABLE.");
772 // Table->act_content - return 'id' of type of output required for table button
773 function act_content($user)
776 $isstanding = ($user->subst == 'standup');
777 $sitted = $this->player_n;
779 $cur_table = $user->table;
783 if ($sitted < PLAYERS_N) {
784 switch ($this->auth_type) {
785 case TABLE_AUTH_TY_CERT:
786 if ($user->is_cert())
791 case TABLE_AUTH_TY_AUTH:
792 if ($user->is_auth())
807 if ($table == $cur_table)
814 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
827 function Delay_Manager($triglevel)
829 $this->triglevel = $triglevel;
830 $this->delta = array();
831 $this->lastcheck = 0;
834 function delta_get($curtime)
836 // clean too old delta items
837 for ($i = 0 ; $i < count($this->delta) ; $i++) {
838 if ($this->delta[$i][0] < $curtime) {
839 array_splice($this->delta, $i, 1);
844 // add new delta items if delay exceeded $this->triglevel sec
845 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
846 $delta = $curtime - $this->lastcheck - $this->triglevel;
847 array_push($this->delta, array($curtime + $delta , $delta));
848 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
851 // extract the maximum valid delta
853 for ($i = 0 ; $i < count($this->delta) ; $i++) {
854 $delta_cur = $this->delta[$i][1];
855 if ($delta_max < $delta_cur)
856 $delta_max = $delta_cur;
859 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
864 function lastcheck_set($curtime)
866 $this->lastcheck = $curtime;
874 function Client_prefs()
878 static function from_user($user)
880 $thiz = new Client_prefs();
881 $thiz->user_load($user);
886 static function from_json($json)
888 $thiz = new Client_prefs();
889 if ($thiz->json_load($json) == FALSE) {
897 function user_load($user)
899 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
900 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
901 if ($user->rec != FALSE) {
902 $this->supp_comp = $user->rec->supp_comp_get();
905 $this->supp_comp = "000000000000";
908 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
911 function json_load($json_s)
916 if (gettype($json_s) == "string") {
917 if (($json = json_decode($json_s)) == FALSE)
923 if ($this->listen < 0 || $this->listen > 2)
925 $this->listen = $json->listen;
927 if (mb_strlen($json->supp_comp, "ASCII") != 12)
930 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
931 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
932 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
938 $this->supp_comp = $json->supp_comp;
945 function store($user, $is_save)
948 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
949 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
950 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
951 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
953 if ($user->is_supp_custom()) {
954 $user->rec->supp_comp_set($this->supp_comp);
957 $user->prefs_store();
961 define('GHOST_SESS_TOUT', 1800);
962 define('GHOST_SESS_REAS_LOUT', 1); // logout
963 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
964 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
965 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
966 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
974 function GhostSessEl($time, $sess, $reas)
976 $this->time = $time + GHOST_SESS_TOUT;
991 // push or update for this session
992 function push($time, $sess, $reas)
994 foreach($this->gs as $el) {
995 if ($el->sess == "$sess") {
997 $el->time = $time + GHOST_SESS_TOUT;
1002 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1008 foreach($this->gs as $key => $el) {
1009 if ($el->sess == "$sess") {
1010 $ret = $this->gs[$key];
1011 unset($this->gs[$key]);
1018 function garbage_manager($curtime)
1020 foreach($this->gs as $key => $el) {
1021 if ($el->time < $curtime) {
1022 unset($this->gs[$key]);
1032 var $crystal_filename;
1036 var $comm; // commands for many people
1037 var $step; // current step of the comm array
1038 var $garbage_timeout;
1041 var $ban_list; // ban list (authized allowed)
1042 var $black_list; // black list (anti-dos, noone allowed)
1043 var $provider_proxy; // list of provider/browser that offer proxy service
1049 public static $sess_cur;
1057 static function create($crystal_filename, $ban_list, $black_list, $prov_proxy) {
1058 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1059 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1060 fprintf(STDERR, "ROOM FROM FILE\n");
1061 rename($crystal_filename, $crystal_filename.".old");
1063 $brisk->reload(TRUE, $ban_list, $black_list, $prov_proxy);
1069 fprintf(STDERR, "NEW ROOM\n");
1070 $thiz = new Brisk();
1072 $thiz->crystal_filename = $crystal_filename;
1073 $thiz->user = array();
1074 $thiz->table = array();
1075 $thiz->match = array();
1077 $thiz->ban_list = IpClass::create();
1078 $thiz->black_list = IpClass::create();
1079 $thiz->provider_proxy = ProviderProxy::create();
1080 $thiz->ghost_sess = new GhostSess();
1082 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1083 $thiz->user[$i] = User::create($thiz, $i, "", "");
1086 for ($i = 0 ; $i < TABLES_N ; $i++) {
1087 $thiz->table[$i] = Table::create($i);
1089 $thiz->garbage_timeout = 0;
1090 $thiz->shm_sz = SHM_DIMS_MIN;
1092 $thiz->delay_mgr = new Delay_Manager(1.5);
1094 static::$sess_cur = FALSE;
1096 $thiz->reload(TRUE, $ban_list, $black_list, $prov_proxy);
1101 function reload($is_first, $ban_list, $black_list, $prov_proxy)
1103 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n", count($ban_list), count($black_list), count($prov_proxy));
1105 if (defined('CURL_DE_SAC_VERS')) {
1106 if (brisk_cds_reload($this) == FALSE) {
1110 $this->ban_list->update($ban_list);
1111 $this->black_list->update($black_list);
1112 $this->provider_proxy->update($prov_proxy);
1115 $this->banned_kickoff();
1116 $this->garbage_manager(TRUE);
1120 function banned_kickoff()
1124 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1125 $table_cur = $this->table[$table_idx];
1126 // if the table is complete and exists we check users IP
1128 if ($table_cur->player_n == PLAYERS_N) {
1129 if (isset($this->match[$table_idx]) &&
1130 $table_cur->table_token == $bin5->table_token) {
1131 log_main("PLAYERS == N TABLE ".$table_idx);
1133 $bin5 = $this->match[$table_idx];
1135 $is_ban |= $bin5->banned_kickoff();
1140 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1141 $user_cur = $this->user[$i];
1143 if ($user_cur->is_active() == FALSE)
1146 // check if the IP is blacklisted
1147 if ($this->black_check($user_cur->ip)) {
1148 $user_cur->lacc = 0;
1153 // if authorized not check if banlisted
1154 if ($user_cur->is_auth()) {
1158 if ($this->ban_check($user_cur->ip)) {
1159 $user_cur->lacc = 0;
1167 function ban_check($ip_str)
1169 return ($this->ban_list->check($ip_str));
1172 function black_check($ip_str)
1174 return ($this->black_list->check($ip_str));
1177 function pproxy_realip($ip_str)
1179 return ($this->provider_proxy->realip($ip_str));
1182 function users_cleanup()
1184 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1185 $user_cur = $this->user[$i];
1187 if ($user_cur->the_end) {
1188 $user_cur->reset(); // users_cleanup, OK
1193 function garbage_manager($force)
1195 GLOBAL $G_lang, $mlang_brisk, $G_base;
1199 log_rd2("garbage_manager START");
1201 /* Garbage collector degli utenti in timeout */
1202 $curtime = microtime(TRUE);
1204 $delta = $this->delay_mgr->delta_get($curtime);
1206 if (!$force && !($this->garbage_timeout < $curtime)) {
1207 $this->delay_mgr->lastcheck_set($curtime);
1211 // Before all align times with table timeout
1212 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1213 $table_cur = $this->table[$table_idx];
1214 // if the table is complete and exists its shared mem we get the info about users lacc
1216 if ($table_cur->player_n == PLAYERS_N) {
1217 log_main("PLAYERS == N TABLE ".$table_idx);
1220 $no_recovery = FALSE;
1221 if (isset($this->match[$table_idx])) {
1222 $bin5 = $this->match[$table_idx];
1224 if ($table_cur->table_token != $bin5->table_token) {
1225 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1226 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1227 $no_recovery = TRUE;
1231 if ($bin5 != FALSE) {
1235 log_main("garbage_manager: bri loaded successfully.");
1236 $bin5->garbage_manager(TRUE);
1238 $bin5_table = $bin5->table[0];
1240 // is the end of the table
1242 if ($bin5->the_end == TRUE) {
1244 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1246 log_main("garbage_manager: INSIDE THE END.");
1248 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1249 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1250 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1253 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1254 // stat must be "table" by definition
1255 $user_cur = $this->user[$table_cur->player[$i]];
1256 $bin5_user = $bin5->user[$i];
1258 $user_cur->subst = $bin5_user->subst;
1259 $user_cur->rd_step = $bin5_user->rd_step;
1260 $user_cur->step = $bin5_user->step;
1261 $user_cur->lacc = $bin5_user->lacc;
1262 $user_cur->laccwr = $bin5_user->lacc;
1263 $user_cur->bantime = $bin5_user->bantime;
1264 $user_cur->the_end = $bin5_user->the_end;
1265 if ($user_cur->the_end) {
1266 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1270 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1272 $this->room_join_wakeup($user_cur, FALSE, 0);
1273 $table_cur->table_token = "";
1274 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1276 $this->match_del($table_idx);
1279 log_main("gm:: save_data");
1281 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1282 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1285 } // if ($bin5 == FALSE
1286 else if ($no_recovery == FALSE) {
1287 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1289 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1290 $user_cur = $this->user[$table_cur->player[$i]];
1291 $user_cur->subst = "shutdowner";
1292 $user_cur->step_inc();
1294 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1295 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1296 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1297 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1298 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1299 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1300 $user_cur->step_inc();
1303 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1304 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1305 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1307 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1309 $this->room_join_wakeup($user_cur, TRUE, -2);
1310 $table_cur->table_token = "";
1313 } // if ($table_cur->player_n == PLAYERS_N) {
1314 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1316 log_rd2("out new loop.");
1318 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1319 $user_cur = $this->user[$i];
1321 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1323 if ($user_cur->is_active() == FALSE)
1326 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1327 // Auto logout dell'utente
1328 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1330 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1331 $user_cur->the_end = TRUE;
1333 log_rd2("AUTO LOGOUT.");
1334 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1335 log_auth($user_cur->sess, "Autologout session.");
1337 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1338 $this->room_wakeup($user_cur);
1339 else if ($user_cur->subst == 'standup')
1340 $this->room_outstandup($user_cur);
1342 log_rd2("LOGOUT FROM WHAT ???");
1346 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1347 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1348 $this->room_wakeup($user_cur);
1349 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1350 /* 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" */
1351 $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);
1352 $user_cur->step_inc();
1356 log_rd2("GARBAGE UPDATED!");
1358 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1361 $this->ghost_sess->garbage_manager($curtime);
1363 $this->delay_mgr->lastcheck_set($curtime);
1367 function show_room($user_step, $user)
1369 GLOBAL $G_lang, $mlang_brisk;
1370 log_main("show_room: username: ".$user->name);
1372 $ret = sprintf('gst.st = %d; ', $user_step);
1374 $prefs = Client_prefs::from_user($user);
1375 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1378 if ($user->flags & USER_FLAG_ISOLAUTH) {
1379 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1381 else if ($user->flags & USER_FLAG_LISTAUTH) {
1382 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1385 $ret .= 'list_set(\'all\', false, \'\' ); ';
1389 if ($user->subst == 'standup')
1390 $ret .= "tra.show(); ";
1392 $ret .= "tra.hide(); ";
1394 $ret .= sprintf('stat = "%s";', $user->stat);
1396 $ret .= root_welcome($user);
1397 if ($user->flags & USER_FLAG_DBFAILED) {
1398 $ret .= "gst.st = ".($user->step+1)."; ";
1399 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1402 $ret .= sprintf('subst = "%s";', $user->subst);
1403 $ret .= $user->myname_innerHTML();
1405 for ($i = 0 ; $i < TABLES_N ; $i++) {
1407 $ret .= $this->table_content($user, $i);
1409 $ret .= $this->table[$i]->act_content($user);
1410 if ($this->table[$i]->wag_own != -1)
1411 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1413 $ret .= sprintf('tra.rem(%d); ', $i);
1415 $ret .= $this->standup_content($user);
1416 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1422 function room_wakeup($user)
1424 $table_idx = $user->table;
1425 $table = $this->table[$table_idx];
1427 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1431 $from_table = ($user->stat == "table");
1433 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1435 for ($i = 0 ; $i < $table->player_n ; $i++) {
1436 $user_cur = $this->user[$table->player[$i]];
1437 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1439 if ($user->idx_get() != $table->player[$i]) {
1440 $user_cur->stat_set("room");
1441 $user_cur->subst = "sitdown";
1442 $user_cur->laccwr = $curtime;
1444 else if ($user->is_active()) {
1445 $user_cur->stat_set("room");
1446 $user_cur->subst = "standup";
1447 $user_cur->laccwr = $curtime;
1448 $user_cur->table = -1;
1453 $user->stat_set("room");
1454 $user->subst = "standup";
1455 $user->laccwr = $curtime;
1458 $remove_wagon = FALSE;
1459 if($table->wag_own == $user->idx_get()) {
1460 $table->wag_reset($curtime);
1461 $remove_wagon = TRUE;
1465 /* aggiorna l'array dei giocatori al tavolo. */
1466 $table->user_rem($this, $user);
1468 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1469 $user_cur = $this->user[$i];
1470 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1473 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1475 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1476 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1477 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1478 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1479 log_main("DOCUMENT.index.php: from table");
1481 else if ($user_cur->stat == "room") {
1482 log_main("DOCUMENT.index.php: from table");
1484 $ret .= $this->table_content($user_cur, $table_idx);
1485 $ret .= $this->standup_content($user_cur);
1487 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1488 $ret .= $table->act_content($user);
1490 if ($user->idx_get() == $i) {
1491 // set the new status
1492 $ret .= 'subst = "standup"; tra.show(); ';
1493 // clean the action buttons in other tables
1494 for ($e = 0 ; $e < TABLES_N ; $e++) {
1495 if ($this->table[$e]->player_n < PLAYERS_N) {
1496 $ret .= $this->table[$e]->act_content($user);
1501 $ret .= $table->act_content($user_cur);
1504 log_wr("ROOM_WAKEUP: ".$ret);
1505 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1506 $user_cur->step_inc();
1510 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1512 $table_idx = $user->table;
1513 $table = $this->table[$table_idx];
1515 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1518 $user_wup = array();
1520 $user_tab = array();
1522 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1524 for ($i = 0 ; $i < $table->player_n ; $i++) {
1525 $user_cur = $this->user[$table->player[$i]];
1526 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1527 if ($user_cur->is_empty()) {
1530 if ($update_lacc == TRUE) {
1531 $user_cur->laccwr = $curtime;
1533 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1534 if ($user_cur->subst == "shutdowned") {
1535 $user_cur->stat_set("room");
1536 $user_cur->subst = "sitdown";
1538 else if ($user_cur->subst == "shutdowner") {
1539 $user_cur->stat_set("room");
1540 $user_cur->subst = "standup";
1541 $user_cur->table = -1;
1542 $user_wup[$user_wup_n++] = $user_cur;
1544 $remove_wagon = FALSE;
1545 if($table->wag_own == $table->player[$i]) {
1546 $remove_wagon = TRUE;
1547 $table->wag_reset($curtime);
1550 $user_tab[$user_tab_n++] = $table->player[$i];
1553 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1554 $table->user_rem($this, $user_wup[$wup_idx]);
1556 /* aggiorna l'array dei giocatori al tavolo. */
1558 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1559 log_main("START LOOP");
1560 $user_cur = $this->user[$i];
1561 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1562 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1567 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1569 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1570 if ($user_cur->stat == "room") {
1571 log_main("DOCUMENT.index.php from table");
1573 $ret .= $this->table_content($user_cur, $table_idx);
1574 $ret .= $this->standup_content($user_cur);
1576 $ret .= $table->act_content($user_cur);
1579 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1580 if ($user_tab[$tab_idx] == $i)
1583 // for users that wakeup the room will be reconstructed by index_rd.php
1584 if ($tab_idx < $user_tab_n) {
1585 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1587 // ARRAY_POP DISABLED
1588 // if ($trans_delta == 0)
1589 // while (array_pop($user_cur->comm) != NULL);
1591 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1592 $user_cur->comm[$user_cur->step % COMM_N] = "";
1593 $user_cur->step_inc();
1594 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1595 $user_cur->step_inc();
1596 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1600 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1602 log_main("JOIN_WAKEUP more");
1604 $ret .= $table->act_content($user_cur);
1606 log_main("JOIN_WAKEUP end more");
1608 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1609 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1610 $user_cur->step_inc();
1614 function guarantee_show($user, $user_login, $dt)
1616 GLOBAL $G_lang, $mlang_brisk, $G_base;
1622 if ($user_login == "") {
1626 if (($bdb = BriskDB::create()) == FALSE) {
1630 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1634 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1635 $guar_login = $guar_item->login_get();
1640 $user_tos_vers = $user_item->tos_vers_get();
1642 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1643 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1645 else if ($guar_login == "") {
1646 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1648 else if ($guar_login == $user_login) {
1649 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1652 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1653 xcape($user_login), xcape($guar_login)));
1658 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1661 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1667 function room_outstandup($user)
1669 $this->room_sitdown($user, -1);
1672 function table_update($user)
1674 log_main("table_update: pre - USER: ".$user->name);
1676 $table_idx = $user->table;
1678 if ($table_idx > -1)
1679 $table = $this->table[$table_idx];
1681 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1683 $user_cur = $this->user[$i];
1684 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1687 $ret = "gst.st = ".($user_cur->step+1)."; ";
1688 if ($table_idx > -1)
1689 $ret .= $this->table_content($user_cur, $table_idx);
1691 if ($user->idx_get() == $i) {
1692 $ret .= $user->myname_innerHTML();
1694 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1695 $user_cur->step_inc();
1698 log_main("table_update: post");
1701 function room_sitdown($user, $table_idx)
1703 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1707 if ($table_idx > -1 && $table_idx < TABLES_N) {
1708 $table = $this->table[$table_idx];
1711 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1712 for ($i = 0 ; $i < TABLES_N ; $i++) {
1713 if ($table->wag_own == $table->player[$i]) {
1714 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1715 $table->wag_reset(time());
1722 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1724 $user_cur = $this->user[$i];
1725 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1728 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1729 if ($table_idx > -1)
1730 $ret .= $this->table_content($user_cur, $table_idx);
1731 $ret .= $this->standup_content($user_cur);
1733 if ($user->idx_get() == $i) {
1734 $ret .= 'subst = "sitdown"; tra.hide(); ';
1735 // clean the action buttons in other tables
1736 for ($e = 0 ; $e < TABLES_N ; $e++) {
1737 $ret .= $this->table[$e]->act_content($user_cur);
1740 else if ($table_idx > -1) {
1741 if ($table->player_n == PLAYERS_N) {
1743 $ret .= $table->act_content($user_cur);
1746 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1747 $user_cur->step_inc();
1751 function kickuser($user, $out_reas)
1755 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1757 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1759 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1760 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1761 $bin5 = &$this->match[$user->table];
1762 $user_bin5 = &$bin5->user[$user->table_pos];
1763 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1764 $bin5->table_wakeup($user_bin5);
1765 $user->the_end = TRUE;
1766 $this->room_wakeup($user);
1770 if ($user->stat == 'table' || $user->stat == 'room') {
1771 $user->the_end = TRUE;
1772 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1773 $this->room_wakeup($user);
1775 else if ($user->subst == 'standup') {
1776 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1777 $this->room_outstandup($user);
1780 log_rd2("LOGOUT FROM WHAT ???");
1785 function kickuser_by_name($name, $out_reas)
1787 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1788 $user_out = $this->user[$i];
1789 if (strcmp($user_out->name, $name) == 0) {
1790 return ($this->kickuser($user_out, $out_reas));
1796 function kickuser_by_sess($sess, $out_reas)
1798 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1799 $user_out = $this->user[$i];
1800 if (strcmp($user_out->sess, $sess) == 0) {
1801 return ($this->kickuser($user_out, $out_reas));
1807 function kickuser_by_idx($idx, $out_reas)
1809 $user_out = $this->user[$idx];
1810 return ($this->kickuser($user_out, $out_reas));
1813 function chatt_send($user, $mesg)
1815 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1819 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1821 $dt = date("H:i ", $curtime);
1832 $is_normchat = FALSE;
1833 /* for old isolation management $is_ticker = FALSE; */
1834 $update_room = FALSE;
1836 if (strcmp($msg, "/tav") == 0 ||
1837 strncmp($msg, "/tav ", 5) == 0) {
1839 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1840 /* 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>" */
1841 $msg = $mlang_brisk['tickmust'][$G_lang];
1842 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1847 $table = $this->table[$user->table];
1849 if ($table->wag_own != -1) {
1850 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1851 $msg = $mlang_brisk['tickjust'][$G_lang];
1852 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1857 $dtime = $curtime - $table->wag_tout;
1858 if ($dtime < EXPIRE_TIME_WAG) {
1859 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1860 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1861 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1862 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1867 $msg = substr($msg, 5);
1869 $table->wag_set($user->idx_get(), $msg);
1870 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1871 $to_room = $to_user;
1872 /* for old isolation management $is_ticker = TRUE; */
1874 } // /tav chat command
1875 // just for development use currently
1876 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1877 fprintf(STDERR, "MOP OUT\n");
1878 $target = substr($msg, 5);
1879 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1881 else if (strncmp($msg, "/alarm ", 7) == 0) {
1882 if (strncmp($msg, "/alarm to ", 10) == 0) {
1883 $sp_pos = strpos($msg, " ", 10);
1884 $target = substr($msg, 10, $sp_pos - 10);
1885 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1889 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1892 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1893 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1894 $msg = $mlang_brisk['alarpass'][$G_lang];
1895 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1900 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1901 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1902 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1903 $to_user = nickserv_msg($dt, $prestr);
1905 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1906 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1907 /* MLANG: "chiudi" */
1908 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1910 } // /alarm chat command
1911 else if (strncmp($msg, "/listen ", 8) == 0) {
1912 $arg = substr($msg, 8);
1914 if (strcasecmp($arg, "isolation") == 0) {
1916 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1917 $user->table >= TABLES_AUTH_N) {
1918 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1922 $user->flags &= ~USER_FLAG_MAP_AUTH;
1923 $user->flags |= USER_FLAG_ISOLAUTH;
1924 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1927 else if (strcasecmp($arg, "auth") == 0) {
1928 $flags_old = $user->flags;
1929 $user->flags &= ~USER_FLAG_MAP_AUTH;
1930 $user->flags |= USER_FLAG_LISTAUTH;
1931 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1934 $flags_old = $user->flags;
1935 $user->flags &= ~USER_FLAG_MAP_AUTH;
1936 $to_user = 'list_set(\'all\', true, \'\'); ';
1939 // if from isolation redraw standup area
1940 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1941 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1945 else if (strcmp($msg, "/authreq") == 0) {
1946 if ($user->is_cert()) {
1947 $to_user = sprintf('authbox(300,200);');
1950 /* 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." */
1951 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1954 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1955 if ($user->is_auth()) {
1956 $to_user = sprintf('mesgtoadmbox(500,300);');
1959 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1960 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1963 else if (strncmp($msg, "/nick ", 6) == 0) {
1964 log_main("chatt_send BEGIN");
1967 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1968 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1972 $msg = "COMMAND ".$msg;
1973 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1974 $user_cur = $this->user[$i];
1976 if ($user_cur->is_active() == FALSE)
1978 if (strcasecmp($user_cur->name,$name_new) == 0)
1981 if ($i < MAX_PLAYERS) {
1982 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1983 $to_user = nickserv_msg($dt, $prestr);
1987 /* 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>" */
1988 if ($user->is_auth()) {
1989 if (strcasecmp($user->name,$name_new) != 0) {
1990 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1991 ($user->subst == 'standup' ||
1992 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
1995 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1996 for ($i = 0 ; $i < TABLES_N ; $i++) {
1997 $to_user .= $this->table[$i]->act_content($user);
2001 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2006 $user->name = $name_new; // OK - nick changed
2007 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2008 if ( ! $user->is_auth() ) {
2009 if (($bdb = BriskDB::create()) != FALSE) {
2011 /* 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>" */
2012 if ($bdb->login_exists($name_new)) {
2013 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2014 $to_user .= nickserv_msg($dt, $prestr);
2019 log_main("chatt_send start set");
2021 $update_room = TRUE;
2023 } // nick chat command
2024 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2025 $guar_user = substr($msg, 6);
2027 $this->guarantee_show($user, $guar_user, $dt);
2029 else if (strncmp($msg, "/st ", 4) == 0) {
2030 log_main("chatt_send BEGIN");
2033 $st_str = substr($msg, 4);
2035 if (strcasecmp($st_str, "normale") == 0) {
2036 $st = USER_FLAG_S_NORM;
2038 else if (strcasecmp($st_str, "pausa") == 0) {
2039 $st = USER_FLAG_S_PAU;
2041 else if (strcasecmp($st_str, "fuori") == 0) {
2042 $st = USER_FLAG_S_OUT;
2044 else if (strcasecmp($st_str, "cane") == 0) {
2045 $st = USER_FLAG_S_DOG;
2047 else if (strcasecmp($st_str, "cibo") == 0) {
2048 $st = USER_FLAG_S_EAT;
2050 else if (strcasecmp($st_str, "lavoro") == 0) {
2051 $st = USER_FLAG_S_WRK;
2053 else if (strcasecmp($st_str, "sigaretta") == 0) {
2054 $st = USER_FLAG_S_SMK;
2056 else if (strcasecmp($st_str, "presente") == 0) {
2057 $st = USER_FLAG_S_EYE;
2059 else if (strcasecmp($st_str, "coniglio") == 0) {
2060 $st = USER_FLAG_S_RABB;
2062 else if (strcasecmp($st_str, "calcio") == 0) {
2063 $st = USER_FLAG_S_SOCC;
2065 else if (strcasecmp($st_str, "pupo") == 0) {
2066 $st = USER_FLAG_S_BABY;
2068 else if (strcasecmp($st_str, "pulizie") == 0) {
2069 $st = USER_FLAG_S_MOP;
2071 else if (strcasecmp($st_str, "babbo") == 0) {
2072 $st = USER_FLAG_S_BABBO;
2074 else if (strcasecmp($st_str, "renna") == 0) {
2075 $st = USER_FLAG_S_RENNA;
2077 else if (strcasecmp($st_str, "pupazzo") == 0) {
2078 $st = USER_FLAG_S_PUPAZ;
2080 else if (strcasecmp($st_str, "vischio") == 0) {
2081 $st = USER_FLAG_S_VISCH;
2084 /* MLANG: "Questo stato non esiste." */
2085 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2089 log_main("chatt_send start set");
2090 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2091 $update_room = TRUE;
2092 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2095 } // nick chat command
2097 else { // normal chat line
2098 $is_normchat = TRUE;
2099 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2101 $user->chat_dlt = $user->chat_dlt * 2;
2102 if ($user->chat_dlt > 120)
2103 $user->chat_dlt = 120;
2105 else if ($user->chat_lst == $msg)
2107 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2108 $user->chat_ban = $curtime;
2109 $user->chat_dlt = 5;
2113 $user->chat_ban = 0;
2114 $user->chat_dlt = 0;
2118 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2121 if ( TRUE && (! $user->is_auth()) ) {
2122 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2123 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2124 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2125 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2126 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2128 $auguri = sprintf("%s auguri %s %s.",
2129 $aug_head[mt_rand(0, count($aug_head)-1)],
2130 $aug_body[mt_rand(0, count($aug_body)-1)],
2131 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2133 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2137 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2138 // temporary silentiation for troll (will became array check)
2139 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2140 $to_room = $to_user;
2144 log_legal($curtime, $user->ip, $user,
2145 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2147 $user->chat_lst = "$msg";
2148 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2158 // Output to clients
2161 if ($to_user != FALSE) {
2162 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2163 $user->comm[$user->step % COMM_N] .= $to_user;
2167 if ($to_room != FALSE) {
2168 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2169 $user_cur = $this->user[$i];
2170 if ($target != "" && $user_cur->name != $target)
2172 if ($user_cur->is_active() == FALSE // is not active user
2173 || $user_cur->stat == 'table' // or stat is 'table'
2174 || $user->idx_get() == $i) // or the $user idx is equal to current var
2177 if ($is_normchat == TRUE) {
2178 // use MAP_AUTH to check if auth or isolation
2179 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2180 if ( ! $user->is_auth() ) {
2186 else if ($is_ticker) {
2187 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2188 if ($user->table >= TABLES_AUTH_N)
2193 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2194 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2195 $user_cur->step_inc();
2200 // FIXME BRISK4: include for each kind of table
2201 require_once("${G_base}briskin5/Obj/briskin5.phh");
2202 // Before all align times with table timeout
2203 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2204 if (isset($this->match[$table_idx])) {
2205 $bin5 = $this->match[$table_idx];
2207 $bin5_table = $bin5->table[0];
2208 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2209 // stat must be "table" by definition
2210 $bin5_user = $bin5->user[$i];
2212 if ($target != "" && $bin5_user->name != $target)
2214 log_main("writa: ".$user_mesg);
2215 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2216 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2217 $bin5_user->step_inc();
2219 } // if (isset($this->match
2220 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2221 } // if ($to_tabl == true ...
2224 if ($user->stat == 'room' && $user->subst == 'standup') {
2225 $this->standup_update($user);
2227 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2228 log_main("chatt_send pre table update");
2229 $this->table_update($user);
2230 log_main("chatt_send post table update");
2232 } // if ($update_room ...
2235 } // function chatt_send( ...
2237 function get_user($sess, &$idx)
2241 if (validate_sess($sess)) {
2242 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2243 if ($this->user[$i]->is_empty())
2245 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2248 $ret = $this->user[$i];
2252 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2253 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2254 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2257 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2264 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2267 * if ($idx > -1 && ret == FALSE) => duplicated nick
2268 * if ($idx == -2 && ret == FALSE) => invalid name
2269 * if ($idx == -3 && ret == FALSE) => wrong password
2270 * if ($idx == -1 && ret == FALSE) => no space left
2271 * if ($idx == 0 && ret == user) => SUCCESS
2272 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2275 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2281 $authenticate = FALSE;
2283 $login_exists = FALSE;
2285 $ghost_auth = FALSE;
2290 if (($name_new = validate_name($name)) == FALSE) {
2295 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2296 if (validate_sess($sess) == FALSE)
2299 /* if pass != FALSE verify the login with pass */
2300 log_auth("XXX", "auth1");
2302 if (($bdb = BriskDB::create()) != FALSE) {
2304 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2305 log_auth("XXX", "auth2");
2306 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2307 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2309 if ($authenticate != FALSE) {
2310 $user_type = $authenticate->type_get();
2318 $login_exists = $bdb->login_exists($name_new);
2322 // if db is down, send a warning and verify only current users
2323 // no actions at this moment
2325 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2327 if ($this->user[$i]->is_empty()) {
2328 if ($idfree == -1) {
2333 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2338 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2339 if ($authenticate != FALSE) {
2341 $ghost_auth = $this->user[$i]->is_auth();
2352 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2354 /* there is another user logged with your account and you and him have authenticated => new user
2355 get the session of the old user */
2356 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2359 $ghost_user = $this->user[$ghost];
2361 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2362 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2363 $ghost_user->step_inc();
2366 $ghost_user->sess = $sess;
2369 $ghost_user->sess = $sess;
2372 // If user at the table we need to update the table data too
2373 $table_idx = $ghost_user->table;
2374 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2375 require_once("${G_base}briskin5/Obj/briskin5.phh");
2376 if (isset($this->match[$table_idx])) {
2377 $bin5 = $this->match[$table_idx];
2379 if ($bin5->the_end != TRUE) {
2380 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2381 $bin5->user[$ghost_user->table_pos]->step_inc();
2382 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2388 if (defined('CURL_DE_SAC_VERS')) {
2389 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2391 return ($this->user[$ghost]);
2393 else if ($idx != -1 && $i == MAX_PLAYERS) {
2398 $this->user[$idx]->sess = $sess;
2401 $this->user[$idx]->sess = $sess;
2403 $this->user[$idx]->name = $name_new; // OK - add new user
2404 $this->user[$idx]->stat_set("room");
2405 $this->user[$idx]->step_set(0);
2406 while (array_pop($this->user[$idx]->comm) != NULL);
2407 $this->user[$idx]->subst = "standup";
2408 $this->user[$idx]->lacc = $curtime;
2409 $this->user[$idx]->laccwr = $curtime;
2410 $this->user[$idx]->bantime = 0;
2411 $this->user[$idx]->ip = $ip;
2413 $this->user[$idx]->rec = $authenticate;
2414 $this->user[$idx]->flags = $user_type;
2415 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2416 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2417 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2419 if ($authenticate != FALSE) {
2420 $this->user[$idx]->code = $authenticate->code_get();
2422 // all this part is included in the db server
2423 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2425 if (isset($cookie['CO_list'])) {
2426 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2427 if (strcmp($cookie['CO_list'], "auth") == 0) {
2428 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2429 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2431 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2432 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2433 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2436 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2441 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2444 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2446 log_main("ghost: rename!");
2447 $ghost_user = $this->user[$ghost];
2449 if ($ghost_auth == FALSE) {
2450 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2451 $ghostname = 'ghost'.$sfx;
2452 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2453 if (strcmp("", $this->user[$i]->sess) == 0)
2456 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2461 if ($ghostname != '')
2465 $ghost_user->name = $ghostname;
2467 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2468 $this->standup_update($ghost_user);
2471 log_main("chatt_send pre table update");
2472 $this->table_update($ghost_user);
2473 log_main("chatt_send post table update");
2475 } // if ($ghost_auth == FALSE
2477 // FIXME: cacciare il vecchio utente room && table (if needed)
2478 $ghost_user->the_end = TRUE;
2479 $ghost_user->lacc = 0;
2480 $this->garbage_manager(TRUE);
2482 } // if ($ghost > -1) {
2487 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));
2489 $ret = $this->user[$real_idx];
2490 if (defined('CURL_DE_SAC_VERS')) {
2491 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2499 function standup_update($user)
2501 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2502 $user_cur = $this->user[$i];
2503 if ($user_cur->is_active() == FALSE)
2506 log_main("STANDUP START: ".$user_cur->stat);
2508 if ($user_cur->stat == 'room') {
2509 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2510 if ($user->idx_get() == $i) {
2511 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2513 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2515 $user_cur->step_inc();
2520 function dump_data()
2522 $brisk_ser = serialize($this);
2523 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2524 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2531 function standup_content($user)
2535 if ($user->stat != 'room')
2538 $content = ' j_stand_cont( [ ';
2540 $user_cur_id = $user->idx_get();
2541 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2542 if ($this->user[$i]->is_active() == FALSE // is not active user
2543 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2544 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2547 $flags = $this->user[$i]->flags;
2549 // sql record exists AND last donate > 2013-01-01
2550 if ($this->user[$i]->is_supp_custom()) {
2551 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2557 if ($this->user[$i]->subst == "standup") {
2558 if ($user_cur_id == $i) {
2562 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2563 xcape($this->user[$i]->name), $supp_comp_s);
2572 function table_content($user, $table_idx)
2578 // Si possono usare i dati nella classe table
2581 $sess = $user->sess;
2582 $table = $this->table[$table_idx];
2584 if ($user->stat != 'room')
2587 $user_cur_id = $user->idx_get();
2589 for ($i = 0 ; $i < $table->player_n ; $i++) {
2590 $user_cur = $this->user[$table->player[$i]];
2592 $flags = $user_cur->flags;
2594 if ($user_cur_id == $table->player[$i])
2597 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2598 if ($user_cur->is_supp_custom())
2599 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2603 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2604 xcape($user_cur->name), $supp_comp_s);
2609 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2614 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2616 GLOBAL $G_ban_list, $G_black_list;
2618 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2619 // $remote_addr = addrtoipv4($addr);
2620 $remote_addr = $this->pproxy_realip(addrtoipv4($addr));
2622 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2623 if ($this->black_check($remote_addr)) {
2624 // TODO: waiting async 5 sec before close
2625 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2629 $enc = get_encoding($header);
2630 if (isset($header['User-Agent'])) {
2631 if (strstr($header['User-Agent'], "MSIE")) {
2632 $transp_type = "htmlfile";
2635 $transp_type = "xhr";
2639 $transp_type = "iframe";
2641 force_no_cache($header_out);
2647 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2648 $content = ob_get_contents();
2651 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2652 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2656 case "index_wr.php":
2658 // Enhance required: in the POST case, after the header you must get content
2659 // from the socket, waiting if necessary
2663 index_wr_main($this, $addr, $get, $post, $cookie);
2664 $content = ob_get_contents();
2667 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2671 case "index_rd.php":
2672 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2674 if ($transp == 'websocket')
2678 if (!isset($cookie['sess'])
2679 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2681 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2683 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2688 $this->sess_cur_set($user->sess);
2689 // close a previous opened index_read_ifra socket, if exists
2690 if (($prev = $user->rd_socket_get()) != NULL) {
2691 $s_a_p->socks_unset($user->rd_socket_get());
2692 fclose($user->rd_socket_get());
2693 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2694 $user->rd_socket_set(NULL);
2698 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2699 $response = headers_render($header_out, -1).$user->chunked_content($content);
2700 $response_l = mb_strlen($response, "ASCII");
2702 $wret = @fwrite($new_socket, $response, $response_l);
2703 if ($wret < $response_l) {
2704 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2705 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2708 $user->rd_cache_set("");
2710 fflush($new_socket);
2713 $s_a_p->socks_set($new_socket, $user, NULL);
2714 $user->rd_socket_set($new_socket);
2715 printf(" - qui ci siamo - ");
2722 if (!(BRISK_DEBUG & DBG_ENGI))
2724 fprintf(STDERR, "TEST.PHP running\n");
2725 if (isset($post['data'])) {
2726 $content = $post['data'];
2729 $content = "NO DATA AVAILABLE";
2731 $header_out['Content-Type'] = 'text/plain';
2732 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2736 /* FAR TODO: move all into an array of registered sub-apps */
2737 $subs = "briskin5/";
2738 $subs_l = strlen($subs);
2739 if (!strncmp($path, $subs, $subs_l)) {
2740 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2749 function match_add($idx, $match)
2751 $this->match[$idx] = $match;
2754 function match_del($idx)
2756 unset($this->match[$idx]);
2759 function match_get($idx, $token)
2761 if (isset($this->match[$idx])) {
2763 || $token == $this->match[$idx]->table_token) {
2764 return ($this->match[$idx]);
2769 function sess_cur_set($sess)
2771 static::$sess_cur = $sess;
2774 static function sess_cur_get()
2776 return(static::$sess_cur);
2778 } // end class Brisk
2780 function make_seed()
2782 list($usec, $sec) = explode(' ', microtime());
2783 return (float) $sec + ((float) $usec * 100000);
2786 function btrace_line($ar)
2788 GLOBAL $G_btrace_pref_sub;
2791 for ($i = 0 ; $i < count($ar) ; $i++) {
2792 $with_class = isset($ar[$i]['class']);
2793 $with_file = isset($ar[$i]['file']);
2794 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2795 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2796 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2797 ($with_file ? $ar[$i]['line'] : ""));
2803 function trace_ftok($id, $add)
2805 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2806 $tok=@ftok($id, $add);
2808 log_shme($tok.": ".$id." + ".$add);
2813 function log_mop($step, $log)
2817 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2820 $sess = Brisk::sess_cur_get();
2821 if (isset($sess) == FALSE)
2826 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2829 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2830 $btrace = btrace_line(debug_backtrace());
2833 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2834 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2839 function log_step($log)
2843 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2846 $sess = Brisk::sess_cur_get();
2847 if (isset($sess) == FALSE)
2852 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2855 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2856 $btrace = btrace_line(debug_backtrace());
2859 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2860 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2867 function log_cds($log)
2871 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2874 $sess = Brisk::sess_cur_get();
2875 if (isset($sess) == FALSE)
2880 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2883 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2884 $btrace = btrace_line(debug_backtrace());
2887 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2888 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2894 function log_only2($log)
2898 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2901 $sess = Brisk::sess_cur_get();
2902 if (isset($sess) == FALSE)
2907 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2910 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2911 $btrace = btrace_line(debug_backtrace());
2914 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2915 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2920 function log_crit($log)
2924 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2927 $sess = Brisk::sess_cur_get();
2928 if (isset($sess) == FALSE)
2933 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2936 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2937 $btrace = btrace_line(debug_backtrace());
2940 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2941 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2946 function log_only($log)
2950 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2953 $sess = Brisk::sess_cur_get();
2954 if (isset($sess) == FALSE)
2959 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2962 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2963 $btrace = btrace_line(debug_backtrace());
2966 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2967 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2972 function log_main($log)
2976 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2979 $sess = Brisk::sess_cur_get();
2980 if (isset($sess) == FALSE)
2985 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2988 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2989 $btrace = btrace_line(debug_backtrace());
2992 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2993 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2998 function log_rd($log)
3002 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3005 $sess = Brisk::sess_cur_get();
3006 if (isset($sess) == FALSE)
3011 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3014 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3015 $btrace = btrace_line(debug_backtrace());
3018 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3019 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3024 function log_rd2($log)
3028 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3031 $sess = Brisk::sess_cur_get();
3032 if (isset($sess) == FALSE)
3037 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3040 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3041 $btrace = btrace_line(debug_backtrace());
3045 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3046 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3051 function log_send($log)
3055 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3058 $sess = Brisk::sess_cur_get();
3059 if (isset($sess) == FALSE)
3064 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3067 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3068 $btrace = btrace_line(debug_backtrace());
3071 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3072 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3077 function log_lock($log)
3081 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3084 $sess = Brisk::sess_cur_get();
3085 if (isset($sess) == FALSE)
3090 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3093 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3094 $btrace = btrace_line(debug_backtrace());
3097 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3098 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3103 function log_wr($log)
3107 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3110 $sess = Brisk::sess_cur_get();
3111 if (isset($sess) == FALSE)
3116 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3119 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3120 $btrace = btrace_line(debug_backtrace());
3123 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3124 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3129 function log_load($log)
3133 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3136 $sess = Brisk::sess_cur_get();
3137 if (isset($sess) == FALSE)
3142 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3145 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3146 $btrace = btrace_line(debug_backtrace());
3149 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3150 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3155 function log_auth($sess, $log)
3159 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3162 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3165 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3166 $btrace = btrace_line(debug_backtrace());
3169 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3170 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3175 function log_shme($log)
3179 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3182 $sess = Brisk::sess_cur_get();
3183 if (isset($sess) == FALSE)
3188 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3191 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3192 $btrace = btrace_line(debug_backtrace());
3195 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3196 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3203 // function log_legal($curtime, $sess, $name, $where, $mesg)
3204 function log_legal($curtime, $addr, $user, $where, $mesg)
3207 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3208 /* Unix time | session | nickname | IP | where was | mesg */
3209 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3210 ($user->is_auth() ? 'A' : 'N'),
3211 $user->name, $addr, $where , $mesg));
3216 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3221 if ($sitted < PLAYERS_N) {
3229 if ($table == $cur_table)
3236 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3241 function show_notify($text, $tout, $butt, $w, $h)
3243 log_main("SHOW_NOTIFY: ".$text);
3244 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3247 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3249 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3250 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);
3253 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3255 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3258 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3259 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3262 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3263 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);
3267 function root_welcome($user)
3269 GLOBAL $root_wellarr, $G_lang;
3273 $dt = date("H:i ", $curtime);
3275 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3276 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3283 function validate_sess($sess)
3285 if (strlen($sess) == SESS_LEN)
3291 function validate_name($name)
3293 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3295 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3297 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3304 function playsound($filename)
3306 return (sprintf('playsound("flasou", "%s");', $filename));
3309 function secstoword($secs)
3315 $mins = floor($secs / 60);
3317 if ($G_lang == 'en') {
3319 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3322 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3326 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3329 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3334 function sharedmem_sz($tok)
3336 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3337 log_main("shmop_open failed");
3340 $shm_sz = shmop_size($shm_id);
3341 shmop_close($shm_id);
3343 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3350 static function lock_data($is_exclusive)
3352 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3353 self::$delta_t = microtime(TRUE);
3354 log_lock("LOCK warrant [".self::$delta_t."]");
3362 static function unlock_data($res)
3366 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3375 static function lock_data($is_exclusive)
3377 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3378 self::$delta_t = microtime(TRUE);
3379 log_lock("LOCK poll [".self::$delta_t."]");
3387 static function unlock_data($res)
3391 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3397 function carousel_top()
3402 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));
3405 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>'));