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);
93 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
94 'en' => 'back standing' ),
95 'btn_close' => array( 'it' => 'chiudi',
98 'tit_all' => array( 'it' => 'tutti',
101 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
102 'en' => '<br>You are being idle for ' ),
103 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
104 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
105 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
106 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
107 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
108 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
109 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
110 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
111 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
112 'en' => '<br>The entered password is not correct.<br><br>'),
113 'alarret' => array( 'it' => 'Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>.',
114 'en' => 'Alarm \\"<b>%s</b>\\" sent to <b>%s</b>.'),
115 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
116 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
117 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
118 'en' => '<b>To send a message you have to be authenticated.</b>'),
119 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
120 'en' => 'The nickname have to contain at least one letter or one number.'),
121 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
122 'en' => 'The nickname <b>%s</b> is already in use.'),
123 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
124 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
125 '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>',
126 '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 ???
127 'statunkn' => array( 'it' => 'Questo stato non esiste.',
128 'en' => 'This state don\'t exists.'),
129 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
130 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
131 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
132 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
134 'tit_onauth'=>array( 'it' => '(solo aut.)',
135 'en' => '(only aut.)'),
136 'tit_onisol'=>array( 'it' => '(isolam.to)',
137 'en' => '(isolation)'),
138 '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.',
139 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
141 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
142 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
143 'gua_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
144 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
145 'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
146 'en' => 'EN <b>%s</b> si è auto-garantito.'),
147 'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
148 'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
149 'gua_err' => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i><login></i></b>.',
150 'en' => 'Error %d. Usage: <b>/guar <i><login></i></b>.')
153 $G_lng = langtolng($G_lang);
155 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
156 $G_brisk_version = "4.17.0";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: gestione accessi da sistemi di anonimizzazione, nuovi termini di utilizzo.',
160 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
161 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: engine refactoring and logout message.',
162 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
164 $G_room_help = array( 'it' => '
165 <div style=\\"text-align: left; padding: 8px;\\">
166 <b>Descrizione</b><br>
167 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
168 <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>
169 <b>Configurazione del browser.</b><br>
170 Occorre abilitare i cookies.<br>
172 <b>Uso del sito</b><br>
173 Potete sedervi a un tavolo o rimanere in piedi.<br>
174 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
177 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>
178 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
179 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
180 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
181 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
182 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.
184 <dt><b>Comandi della chat</b>
185 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
186 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
187 <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\\"
188 <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
189 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
190 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
191 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
192 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
198 <div style=\\"text-align: left; padding: 8px;\\">
199 <b>EN Descrizione</b><br>
200 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
201 <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>
202 <b>Configurazione del browser.</b><br>
203 Occorre abilitare i cookies.<br>
205 <b>Uso del sito</b><br>
206 Potete sedervi a un tavolo o rimanere in piedi.<br>
207 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
210 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>
211 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
212 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
213 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
214 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
215 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.
217 <dt><b>Comandi della chat</b>
218 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
219 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
220 <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\\"
221 <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
222 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
223 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
224 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
225 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
231 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
232 <div style=\\"text-align: left; padding: 8px;\\">
233 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
235 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
236 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
238 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
239 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
240 <li>Smart card di InfoCamere
243 <b>Per auto-garantisi occorre possedere:</b><br><br>
245 <li>il codice PIN della propria carta
246 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
249 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
251 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
252 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
253 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
254 diretta dell\' utente da parte dell\' amministratore.
259 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
260 <div style=\\"text-align: left; padding: 8px;\\">
261 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
263 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
264 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
266 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
267 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
270 <b>Per auto-garantisi occorre possedere:</b><br><br>
272 <li>il codice PIN della propria carta
273 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
276 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
278 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
279 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
280 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
281 diretta dell\' utente da parte dell\' amministratore.
288 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
292 $G_room_about = array( 'it' => '<br>
293 <div id=\\"header\\" class=\\"header\\">
294 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
295 briscola chiamata in salsa ajax
297 <br><b>version '.$G_brisk_version.'</b><br><br>
298 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
300 <div id=\\"header\\" class=\\"header\\">
301 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
302 declaration briscola in ajax sauce <b>(Beta)</b>
304 <br><b>version '.$G_brisk_version.'</b><br><br>
305 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
308 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
311 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
312 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
313 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
314 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
315 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
316 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
317 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
318 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
319 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
320 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
321 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
322 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
323 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
324 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
325 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
326 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
327 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
328 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
329 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
331 // $G_PG_cons_n = count($G_PG_cons);
332 // printf("N CONS: %d\n", $G_PG_cons_n);
334 /* printf("%d %d\n", count($voc), count($cons)); */
335 /* for ($i = 0 ; $i < 26 ; $i++) { */
336 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
338 /* printf(' "%s", ', chr(ord('a') + $i)); */
339 /* for ($e = 0 ; $e < 26 ; $e++) { */
340 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
342 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
347 function nickserv_msg($dt, $msg) {
348 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
351 function passwd_gen($seed = NULL)
353 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
362 for ($sil = 0 ; $sil < 7 ; $sil++) {
363 if (($sil % 2) == 0) {
365 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
367 $old = mt_rand(0, $G_PG_vow_n-1);
368 $pw .= $G_PG_vow[$old];
371 $new = mt_rand(0, $G_PG_vow_n-1);
373 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
374 $pw .= $G_PG_vow[$new];
380 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
387 function cmd_return($val, $desc)
389 return array('val' => $val, 'desc' => $desc);
392 function cmd_serialize($attrs)
397 foreach ($attrs as $key => $value) {
398 $ret .= $sep . $key . '=' . urlencode($value);
404 function cmd_deserialize($cmd)
407 $a = explode('&', $cmd);
409 while ($i < count($a)) {
410 $b = split('=', $a[$i]);
411 $ret[urldecode($b[0])] = urldecode($b[1]);
422 function versions_cmp($v1, $v2)
424 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
428 $v1_ar = split('\.', $v1);
429 $v2_ar = split('\.', $v2);
431 $v2_ct = count($v2_ar);
433 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
434 if (($v2_ct - 1) < $i) {
437 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
438 if ($v1_ar[$i] != $v2_ar[$i]) {
439 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
448 function addrtoipv4($addr)
450 $ipv4addr_arr = explode(':' , $addr);
451 if (isset($ipv4addr_arr[3])) {
452 $ipv4addr = $ipv4addr_arr[3];
462 for ($i = 0; $i < ob_get_level(); $i++)
464 ob_implicit_flush(1);
468 function force_no_cache(&$header_out)
470 $header_out['Pragma'] = 'no-cache, must-revalidate';
471 $header_out['Cache-Control'] = 'no-cache';
472 $header_out['Expires'] = '-1';
475 function file_lock($fname, $is_exclusive)
477 if (($res = @fopen($fname, "r+")) == FALSE) {
481 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
489 function file_unlock($res)
492 flock($res, LOCK_UN);
497 $escpush_from = array("\\", "\"");
498 $escpush_to = array("\\\\", "\\\"");
501 GLOBAL $escpush_from, $escpush_to;
503 return str_replace($escpush_from, $escpush_to, $s);
506 $escinp_from = array( "\"" );
507 $escinp_to = array( """ );
509 function escinput($s)
511 GLOBAL $escinp_from, $escinp_to;
513 return str_replace($escinp_from, $escinp_to, $s);
518 return htmlentities($s, ENT_COMPAT, "UTF-8");
521 function esclfhtml($s)
523 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
526 function langtolng($lang)
530 return ($G_lang == 'en' ? '-en' : '');
533 function csplitter($in, $sep)
539 for ($i = 0 ; $i < strlen($in) ; $i++) {
540 $ini = substr($in, $i, 1);
544 else if ($ini == $sep) {
563 $from = array ( '\\', '@', '|' );
564 $to = array ( '\\\\', '@', '¦' );
566 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
571 $from = array ( '\\', '|', "\t", "\n");
572 $to = array ( '\\\\', '\\|', "\\t", "\\n");
574 return (str_replace($from, $to, $s));
577 function xcapemesg($s)
579 $from = array ( "\n");
580 $to = array ( "\\n");
582 return (str_replace($from, $to, $s));
590 function IPClass($ipset)
593 $elem = split("/", $ipset, 2);
595 $mask = (int)$elem[1];
599 $this->mask = ((1<<($mask))-1) << (32 - $mask);
600 $this->addr = ip2long($addr) & $this->mask;
602 fprintf(STDERR, "New ipclass: %x (%x)\n", $this->addr, $this->mask);
607 fprintf(STDERR, "IP: %x, ADDR: %x, MASK: %x -> (%d)\n",
608 $ip, $this->addr, $this->mask, ((ip2long($ip) & $this->mask) == $this->addr));
609 return (($ip & $this->mask) == $this->addr);
619 function getbyid($idx)
621 return ($this->el[$idx]);
624 function setbyid($idx, $v)
626 $this->el[$idx] = $v;
630 define('TABLE_AUTH_TY_PUBL', 0);
631 define('TABLE_AUTH_TY_AUTH', 1);
632 define('TABLE_AUTH_TY_CERT', 2);
640 var $auth_type; // required authorization to sit down
647 var $table_start; // information field
655 function create($idx)
657 if (($thiz = new Table()) == FALSE)
661 $thiz->player = array();
664 if ($idx < TABLES_CERT_N)
665 $thiz->auth_type = TABLE_AUTH_TY_CERT;
666 else if ($idx < TABLES_AUTH_N)
667 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
669 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
675 $thiz->table_token = "";
676 $thiz->table_start = 0;
678 $thiz->wakeup_time = 0;
685 $this->idx = $from->idx;
686 $this->player = array();
687 for ($i = 0 ; $i < $from->player_n ; $i++)
688 $this->player[$i] = $from->player[$i];
689 $this->player_n = $from->player_n;
691 log_main("PLAYER_N - parent::copy.".$this->player_n);
693 $this->auth_type = $from->auth_type;
695 $this->wag_own = $from->wag_own;
696 $this->wag_com = $from->wag_com;
697 $this->wag_tout = $from->wag_tout;
699 $this->table_token = $from->table_token;
700 $this->table_start = $from->table_start;
702 $this->wakeup_time = $from->wakeup_time;
705 function myclone($from)
707 if (($thiz = new Table()) == FALSE)
715 function spawn($from)
717 if (($thiz = new Table()) == FALSE)
720 $thiz->idx = $from->idx;
721 $thiz->player = array();
722 for ($i = 0 ; $i < $from->player_n ; $i++)
723 $thiz->player[$i] = $i;
724 $thiz->player_n = $from->player_n;
726 $thiz->auth_type = $from->auth_type;
728 $thiz->wag_own = $from->wag_own;
729 $thiz->wag_com = $from->wag_com;
730 $thiz->wag_tout = $from->wag_tout;
732 $thiz->table_token = $from->table_token;
733 $thiz->table_start = $from->table_start;
735 $thiz->wakeup_time = $from->wakeup_time;
740 function wag_set($user_idx, $mesg)
744 $this->wag_own = $user_idx;
745 $this->wag_com = $mesg;
749 function wag_reset($timeout)
751 log_main("WAG_RESET");
753 unset($this->wag_own);
756 $this->wag_tout = $timeout;
759 function player_get($idx)
761 return ($this->player[$idx]);
764 function player_set($idx, $player)
766 $this->player[$idx] = $player;
769 function user_add($idx)
771 $this->player[$this->player_n] = $idx;
774 return ($this->player_n - 1);
777 function user_rem($brisk, $user)
779 $tabpos = $user->table_pos;
781 /* verifico la consistenza dei dati */
782 if ($brisk->user[$this->player[$tabpos]] == $user) {
784 /* aggiorna l'array dei giocatori al tavolo. */
785 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
786 $this->player[$i] = $this->player[$i+1];
787 $user_cur = $brisk->user[$this->player[$i]];
788 $user_cur->table_pos = $i;
793 log_main("INCONSISTENCY ON TABLE.");
797 // Table->act_content - return 'id' of type of output required for table button
798 function act_content($user)
801 $isstanding = ($user->subst == 'standup');
802 $sitted = $this->player_n;
804 $cur_table = $user->table;
808 if ($sitted < PLAYERS_N) {
809 switch ($this->auth_type) {
810 case TABLE_AUTH_TY_CERT:
811 if ($user->is_cert())
816 case TABLE_AUTH_TY_AUTH:
817 if ($user->is_auth())
832 if ($table == $cur_table)
839 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
852 function Delay_Manager($triglevel)
854 $this->triglevel = $triglevel;
855 $this->delta = array();
856 $this->lastcheck = 0;
859 function delta_get($curtime)
861 // clean too old delta items
862 for ($i = 0 ; $i < count($this->delta) ; $i++) {
863 if ($this->delta[$i][0] < $curtime) {
864 array_splice($this->delta, $i, 1);
869 // add new delta items if delay exceeded $this->triglevel sec
870 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
871 $delta = $curtime - $this->lastcheck - $this->triglevel;
872 array_push($this->delta, array($curtime + $delta , $delta));
873 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
876 // extract the maximum valid delta
878 for ($i = 0 ; $i < count($this->delta) ; $i++) {
879 $delta_cur = $this->delta[$i][1];
880 if ($delta_max < $delta_cur)
881 $delta_max = $delta_cur;
884 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
889 function lastcheck_set($curtime)
891 $this->lastcheck = $curtime;
899 function Client_prefs()
903 static function from_user($user)
905 $thiz = new Client_prefs();
906 $thiz->user_load($user);
911 static function from_json($json)
913 $thiz = new Client_prefs();
914 if ($thiz->json_load($json) == FALSE) {
922 function user_load($user)
924 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
925 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
926 if ($user->rec != FALSE) {
927 $this->supp_comp = $user->rec->supp_comp_get();
930 $this->supp_comp = "000000000000";
933 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
936 function json_load($json_s)
941 if (gettype($json_s) == "string") {
942 if (($json = json_decode($json_s)) == FALSE)
948 if ($this->listen < 0 || $this->listen > 2)
950 $this->listen = $json->listen;
952 if (mb_strlen($json->supp_comp, "ASCII") != 12)
955 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
956 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
957 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
963 $this->supp_comp = $json->supp_comp;
970 function store($user, $is_save)
973 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
974 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
975 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
976 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
978 if ($user->is_supp_custom()) {
979 $user->rec->supp_comp_set($this->supp_comp);
982 $user->prefs_store();
986 define('GHOST_SESS_TOUT', 1800);
987 define('GHOST_SESS_REAS_LOUT', 1); // logout
988 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
989 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
990 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
991 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
999 function GhostSessEl($time, $sess, $reas)
1001 $this->time = $time + GHOST_SESS_TOUT;
1002 $this->sess = $sess;
1003 $this->reas = $reas;
1011 function GhostSess()
1013 $this->gs = array();
1016 // push or update for this session
1017 function push($time, $sess, $reas)
1019 foreach($this->gs as $el) {
1020 if ($el->sess == "$sess") {
1022 $el->time = $time + GHOST_SESS_TOUT;
1027 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1033 foreach($this->gs as $key => $el) {
1034 if ($el->sess == "$sess") {
1035 $ret = $this->gs[$key];
1036 unset($this->gs[$key]);
1043 function garbage_manager($curtime)
1045 foreach($this->gs as $key => $el) {
1046 if ($el->time < $curtime) {
1047 unset($this->gs[$key]);
1057 var $crystal_filename;
1061 var $comm; // commands for many people
1062 var $step; // current step of the comm array
1063 var $garbage_timeout;
1066 var $ban_list; // ban list (authized allowed)
1067 var $black_list; // black list (anti-dos, noone allowed)
1073 public static $sess_cur;
1081 static function create($crystal_filename, $ban_list, $black_list) {
1082 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1083 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1084 fprintf(STDERR, "ROOM FROM FILE\n");
1085 rename($crystal_filename, $crystal_filename.".old");
1087 $brisk->reload(TRUE, $ban_list, $black_list);
1093 fprintf(STDERR, "NEW ROOM\n");
1094 $thiz = new Brisk();
1096 $thiz->crystal_filename = $crystal_filename;
1097 $thiz->user = array();
1098 $thiz->table = array();
1099 $thiz->match = array();
1101 $thiz->ban_list = NULL;
1102 $thiz->black_list = NULL;
1103 $thiz->ghost_sess = new GhostSess();
1105 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1106 $thiz->user[$i] = User::create($thiz, $i, "", "");
1109 for ($i = 0 ; $i < TABLES_N ; $i++) {
1110 $thiz->table[$i] = Table::create($i);
1112 $thiz->garbage_timeout = 0;
1113 $thiz->shm_sz = SHM_DIMS_MIN;
1115 $thiz->delay_mgr = new Delay_Manager(1.5);
1117 static::$sess_cur = FALSE;
1119 $thiz->reload(TRUE, $ban_list, $black_list);
1124 function ipclass_update($ip_out_s, $ip_in)
1126 fprintf(STDERR, "N_IN: %d\n", count($ip_in));
1128 $ip_out = &$this->$ip_out_s;
1130 // if already set clean the ban_list property
1132 $ct = count($ip_out);
1133 for ($i = 0 ; $i < $ct ; $i++) {
1140 for ($i = 0 ; $i < count($ip_in) ; $i++) {
1141 $ip_out[$i] = new IPClass($ip_in[$i]);
1145 function reload($is_first, $ban_list, $black_list)
1147 fprintf(STDERR, "RELOAD STUFF (%d)(%d)\n", count($ban_list), count($black_list));
1149 if (defined('CURL_DE_SAC_VERS')) {
1150 if (brisk_cds_reload($this) == FALSE) {
1154 $this->ipclass_update("ban_list", $ban_list);
1155 $this->ipclass_update("black_list", $black_list);
1158 $this->banned_kickoff();
1159 $this->garbage_manager(TRUE);
1163 function banned_kickoff()
1167 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1168 $table_cur = $this->table[$table_idx];
1169 // if the table is complete and exists we check users IP
1171 if ($table_cur->player_n == PLAYERS_N) {
1172 if (isset($this->match[$table_idx]) &&
1173 $table_cur->table_token == $bin5->table_token) {
1174 log_main("PLAYERS == N TABLE ".$table_idx);
1176 $bin5 = $this->match[$table_idx];
1178 $is_ban |= $bin5->banned_kickoff();
1183 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1184 $user_cur = $this->user[$i];
1186 if ($user_cur->is_active() == FALSE)
1189 // check if the IP is blacklisted
1190 if ($this->black_check($user_cur->ip)) {
1191 $user_cur->lacc = 0;
1196 // if authorized not check if banlisted
1197 if ($user_cur->is_auth()) {
1201 if ($this->ban_check($user_cur->ip)) {
1202 $user_cur->lacc = 0;
1210 function ban_check($ip_str)
1212 $ip = ip2long($ip_str);
1213 fprintf(STDERR, "Brisk::ban_check %d\n", count($this->ban_list));
1214 for ($i = 0 ; $i < count($this->ban_list) ; $i++) {
1215 fprintf(STDERR, "ban_list[%d] = %x (%x)\n", $i,
1216 $this->ban_list[$i]->addr, $this->ban_list[$i]->mask);
1217 if ($this->ban_list[$i]->match($ip)) {
1218 fprintf(STDERR, "\n\nMATCHA!\n\n");
1225 function black_check($ip_str)
1227 $ip = ip2long($ip_str);
1228 fprintf(STDERR, "Brisk::black_check %d\n", count($this->black_list));
1229 for ($i = 0 ; $i < count($this->black_list) ; $i++) {
1230 fprintf(STDERR, "black_list[%d] = %x (%x)\n", $i,
1231 $this->black_list[$i]->addr, $this->black_list[$i]->mask);
1232 if ($this->black_list[$i]->match($ip)) {
1233 fprintf(STDERR, "\n\nMATCHA!\n\n");
1240 function users_cleanup()
1242 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1243 $user_cur = $this->user[$i];
1245 if ($user_cur->the_end) {
1246 $user_cur->reset(); // users_cleanup, OK
1251 function garbage_manager($force)
1253 GLOBAL $G_lang, $mlang_brisk, $G_base;
1257 log_rd2("garbage_manager START");
1259 /* Garbage collector degli utenti in timeout */
1260 $curtime = microtime(TRUE);
1262 $delta = $this->delay_mgr->delta_get($curtime);
1264 if (!$force && !($this->garbage_timeout < $curtime)) {
1265 $this->delay_mgr->lastcheck_set($curtime);
1269 // Before all align times with table timeout
1270 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1271 $table_cur = $this->table[$table_idx];
1272 // if the table is complete and exists its shared mem we get the info about users lacc
1274 if ($table_cur->player_n == PLAYERS_N) {
1275 log_main("PLAYERS == N TABLE ".$table_idx);
1278 $no_recovery = FALSE;
1279 if (isset($this->match[$table_idx])) {
1280 $bin5 = $this->match[$table_idx];
1282 if ($table_cur->table_token != $bin5->table_token) {
1283 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1284 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1285 $no_recovery = TRUE;
1289 if ($bin5 != FALSE) {
1293 log_main("garbage_manager: bri loaded successfully.");
1294 $bin5->garbage_manager(TRUE);
1296 $bin5_table = $bin5->table[0];
1298 // is the end of the table
1300 if ($bin5->the_end == TRUE) {
1302 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1304 log_main("garbage_manager: INSIDE THE END.");
1306 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1307 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1308 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1311 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1312 // stat must be "table" by definition
1313 $user_cur = $this->user[$table_cur->player[$i]];
1314 $bin5_user = $bin5->user[$i];
1316 $user_cur->subst = $bin5_user->subst;
1317 $user_cur->rd_step = $bin5_user->rd_step;
1318 $user_cur->step = $bin5_user->step;
1319 $user_cur->lacc = $bin5_user->lacc;
1320 $user_cur->laccwr = $bin5_user->lacc;
1321 $user_cur->bantime = $bin5_user->bantime;
1322 $user_cur->the_end = $bin5_user->the_end;
1323 if ($user_cur->the_end) {
1324 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1328 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1330 $this->room_join_wakeup($user_cur, FALSE, 0);
1331 $table_cur->table_token = "";
1332 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1334 $this->match_del($table_idx);
1337 log_main("gm:: save_data");
1339 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1340 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1343 } // if ($bin5 == FALSE
1344 else if ($no_recovery == FALSE) {
1345 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1347 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1348 $user_cur = $this->user[$table_cur->player[$i]];
1349 $user_cur->subst = "shutdowner";
1350 $user_cur->step_inc();
1352 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1353 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1354 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1355 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1356 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1357 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1358 $user_cur->step_inc();
1361 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1362 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1363 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1365 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1367 $this->room_join_wakeup($user_cur, TRUE, -2);
1368 $table_cur->table_token = "";
1371 } // if ($table_cur->player_n == PLAYERS_N) {
1372 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1374 log_rd2("out new loop.");
1376 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1377 $user_cur = $this->user[$i];
1379 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1381 if ($user_cur->is_active() == FALSE)
1384 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1385 // Auto logout dell'utente
1386 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1388 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1389 $user_cur->the_end = TRUE;
1391 log_rd2("AUTO LOGOUT.");
1392 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1393 log_auth($user_cur->sess, "Autologout session.");
1395 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1396 $this->room_wakeup($user_cur);
1397 else if ($user_cur->subst == 'standup')
1398 $this->room_outstandup($user_cur);
1400 log_rd2("LOGOUT FROM WHAT ???");
1404 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1405 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1406 $this->room_wakeup($user_cur);
1407 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1408 /* 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" */
1409 $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);
1410 $user_cur->step_inc();
1414 log_rd2("GARBAGE UPDATED!");
1416 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1419 $this->ghost_sess->garbage_manager($curtime);
1421 $this->delay_mgr->lastcheck_set($curtime);
1425 function show_room($user_step, $user)
1427 GLOBAL $G_lang, $mlang_brisk;
1428 log_main("show_room: username: ".$user->name);
1430 $ret = sprintf('gst.st = %d; ', $user_step);
1432 $prefs = Client_prefs::from_user($user);
1433 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1436 if ($user->flags & USER_FLAG_ISOLAUTH) {
1437 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1439 else if ($user->flags & USER_FLAG_LISTAUTH) {
1440 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1443 $ret .= 'list_set(\'all\', false, \'\' ); ';
1447 if ($user->subst == 'standup')
1448 $ret .= "tra.show(); ";
1450 $ret .= "tra.hide(); ";
1452 $ret .= sprintf('stat = "%s";', $user->stat);
1454 $ret .= root_welcome($user);
1455 if ($user->flags & USER_FLAG_DBFAILED) {
1456 $ret .= "gst.st = ".($user->step+1)."; ";
1457 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1460 $ret .= sprintf('subst = "%s";', $user->subst);
1461 $ret .= $user->myname_innerHTML();
1463 for ($i = 0 ; $i < TABLES_N ; $i++) {
1465 $ret .= $this->table_content($user, $i);
1467 $ret .= $this->table[$i]->act_content($user);
1468 if ($this->table[$i]->wag_own != -1)
1469 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1471 $ret .= sprintf('tra.rem(%d); ', $i);
1473 $ret .= $this->standup_content($user);
1474 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1480 function room_wakeup($user)
1482 $table_idx = $user->table;
1483 $table = $this->table[$table_idx];
1485 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1489 $from_table = ($user->stat == "table");
1491 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1493 for ($i = 0 ; $i < $table->player_n ; $i++) {
1494 $user_cur = $this->user[$table->player[$i]];
1495 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1497 if ($user->idx_get() != $table->player[$i]) {
1498 $user_cur->stat_set("room");
1499 $user_cur->subst = "sitdown";
1500 $user_cur->laccwr = $curtime;
1502 else if ($user->is_active()) {
1503 $user_cur->stat_set("room");
1504 $user_cur->subst = "standup";
1505 $user_cur->laccwr = $curtime;
1506 $user_cur->table = -1;
1511 $user->stat_set("room");
1512 $user->subst = "standup";
1513 $user->laccwr = $curtime;
1516 $remove_wagon = FALSE;
1517 if($table->wag_own == $user->idx_get()) {
1518 $table->wag_reset($curtime);
1519 $remove_wagon = TRUE;
1523 /* aggiorna l'array dei giocatori al tavolo. */
1524 $table->user_rem($this, $user);
1526 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1527 $user_cur = $this->user[$i];
1528 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1531 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1533 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1534 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1535 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1536 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1537 log_main("DOCUMENT.index.php: from table");
1539 else if ($user_cur->stat == "room") {
1540 log_main("DOCUMENT.index.php: from table");
1542 $ret .= $this->table_content($user_cur, $table_idx);
1543 $ret .= $this->standup_content($user_cur);
1545 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1546 $ret .= $table->act_content($user);
1548 if ($user->idx_get() == $i) {
1549 // set the new status
1550 $ret .= 'subst = "standup"; tra.show(); ';
1551 // clean the action buttons in other tables
1552 for ($e = 0 ; $e < TABLES_N ; $e++) {
1553 if ($this->table[$e]->player_n < PLAYERS_N) {
1554 $ret .= $this->table[$e]->act_content($user);
1559 $ret .= $table->act_content($user_cur);
1562 log_wr("ROOM_WAKEUP: ".$ret);
1563 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1564 $user_cur->step_inc();
1568 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1570 $table_idx = $user->table;
1571 $table = $this->table[$table_idx];
1573 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1576 $user_wup = array();
1578 $user_tab = array();
1580 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1582 for ($i = 0 ; $i < $table->player_n ; $i++) {
1583 $user_cur = $this->user[$table->player[$i]];
1584 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1585 if ($user_cur->is_empty()) {
1588 if ($update_lacc == TRUE) {
1589 $user_cur->laccwr = $curtime;
1591 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1592 if ($user_cur->subst == "shutdowned") {
1593 $user_cur->stat_set("room");
1594 $user_cur->subst = "sitdown";
1596 else if ($user_cur->subst == "shutdowner") {
1597 $user_cur->stat_set("room");
1598 $user_cur->subst = "standup";
1599 $user_cur->table = -1;
1600 $user_wup[$user_wup_n++] = $user_cur;
1602 $remove_wagon = FALSE;
1603 if($table->wag_own == $table->player[$i]) {
1604 $remove_wagon = TRUE;
1605 $table->wag_reset($curtime);
1608 $user_tab[$user_tab_n++] = $table->player[$i];
1611 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1612 $table->user_rem($this, $user_wup[$wup_idx]);
1614 /* aggiorna l'array dei giocatori al tavolo. */
1616 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1617 log_main("START LOOP");
1618 $user_cur = $this->user[$i];
1619 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1620 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1625 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1627 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1628 if ($user_cur->stat == "room") {
1629 log_main("DOCUMENT.index.php from table");
1631 $ret .= $this->table_content($user_cur, $table_idx);
1632 $ret .= $this->standup_content($user_cur);
1634 $ret .= $table->act_content($user_cur);
1637 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1638 if ($user_tab[$tab_idx] == $i)
1641 // for users that wakeup the room will be reconstructed by index_rd.php
1642 if ($tab_idx < $user_tab_n) {
1643 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1645 // ARRAY_POP DISABLED
1646 // if ($trans_delta == 0)
1647 // while (array_pop($user_cur->comm) != NULL);
1649 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1650 $user_cur->comm[$user_cur->step % COMM_N] = "";
1651 $user_cur->step_inc();
1652 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1653 $user_cur->step_inc();
1654 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1658 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1660 log_main("JOIN_WAKEUP more");
1662 $ret .= $table->act_content($user_cur);
1664 log_main("JOIN_WAKEUP end more");
1666 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1667 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1668 $user_cur->step_inc();
1672 function guarantee_show($user, $user_login, $dt)
1674 GLOBAL $G_lang, $mlang_brisk, $G_base;
1680 if ($user_login == "") {
1684 if (($bdb = BriskDB::create()) == FALSE) {
1688 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1692 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1693 $guar_login = $guar_item->login_get();
1698 $user_tos_vers = $user_item->tos_vers_get();
1700 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1701 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1703 else if ($guar_login == "") {
1704 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1706 else if ($guar_login == $user_login) {
1707 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1710 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1711 xcape($user_login), xcape($guar_login)));
1716 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1719 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1725 function room_outstandup($user)
1727 $this->room_sitdown($user, -1);
1730 function table_update($user)
1732 log_main("table_update: pre - USER: ".$user->name);
1734 $table_idx = $user->table;
1736 if ($table_idx > -1)
1737 $table = $this->table[$table_idx];
1739 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1741 $user_cur = $this->user[$i];
1742 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1745 $ret = "gst.st = ".($user_cur->step+1)."; ";
1746 if ($table_idx > -1)
1747 $ret .= $this->table_content($user_cur, $table_idx);
1749 if ($user->idx_get() == $i) {
1750 $ret .= $user->myname_innerHTML();
1752 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1753 $user_cur->step_inc();
1756 log_main("table_update: post");
1759 function room_sitdown($user, $table_idx)
1761 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1765 if ($table_idx > -1 && $table_idx < TABLES_N) {
1766 $table = $this->table[$table_idx];
1769 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1770 for ($i = 0 ; $i < TABLES_N ; $i++) {
1771 if ($table->wag_own == $table->player[$i]) {
1772 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1773 $table->wag_reset(time());
1780 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1782 $user_cur = $this->user[$i];
1783 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1786 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1787 if ($table_idx > -1)
1788 $ret .= $this->table_content($user_cur, $table_idx);
1789 $ret .= $this->standup_content($user_cur);
1791 if ($user->idx_get() == $i) {
1792 $ret .= 'subst = "sitdown"; tra.hide(); ';
1793 // clean the action buttons in other tables
1794 for ($e = 0 ; $e < TABLES_N ; $e++) {
1795 $ret .= $this->table[$e]->act_content($user_cur);
1798 else if ($table_idx > -1) {
1799 if ($table->player_n == PLAYERS_N) {
1801 $ret .= $table->act_content($user_cur);
1804 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1805 $user_cur->step_inc();
1809 function kickuser($user, $out_reas)
1813 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1815 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1817 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1818 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1819 $bin5 = &$this->match[$user->table];
1820 $user_bin5 = &$bin5->user[$user->table_pos];
1821 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1822 $bin5->table_wakeup($user_bin5);
1823 $user->the_end = TRUE;
1824 $this->room_wakeup($user);
1828 if ($user->stat == 'table' || $user->stat == 'room') {
1829 $user->the_end = TRUE;
1830 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1831 $this->room_wakeup($user);
1833 else if ($user->subst == 'standup') {
1834 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1835 $this->room_outstandup($user);
1838 log_rd2("LOGOUT FROM WHAT ???");
1843 function kickuser_by_name($name, $out_reas)
1845 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1846 $user_out = $this->user[$i];
1847 if (strcmp($user_out->name, $name) == 0) {
1848 return ($this->kickuser($user_out, $out_reas));
1854 function kickuser_by_sess($sess, $out_reas)
1856 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1857 $user_out = $this->user[$i];
1858 if (strcmp($user_out->sess, $sess) == 0) {
1859 return ($this->kickuser($user_out, $out_reas));
1865 function kickuser_by_idx($idx, $out_reas)
1867 $user_out = $this->user[$idx];
1868 return ($this->kickuser($user_out, $out_reas));
1871 function chatt_send($user, $mesg)
1873 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1877 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1879 $dt = date("H:i ", $curtime);
1890 $is_normchat = FALSE;
1891 /* for old isolation management $is_ticker = FALSE; */
1892 $update_room = FALSE;
1894 if (strcmp($msg, "/tav") == 0 ||
1895 strncmp($msg, "/tav ", 5) == 0) {
1897 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1898 /* 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>" */
1899 $msg = $mlang_brisk['tickmust'][$G_lang];
1900 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1905 $table = $this->table[$user->table];
1907 if ($table->wag_own != -1) {
1908 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1909 $msg = $mlang_brisk['tickjust'][$G_lang];
1910 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1915 $dtime = $curtime - $table->wag_tout;
1916 if ($dtime < EXPIRE_TIME_WAG) {
1917 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1918 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1919 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1920 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1925 $msg = substr($msg, 5);
1927 $table->wag_set($user->idx_get(), $msg);
1928 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1929 $to_room = $to_user;
1930 /* for old isolation management $is_ticker = TRUE; */
1932 } // /tav chat command
1933 // just for development use currently
1934 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1935 fprintf(STDERR, "MOP OUT\n");
1936 $target = substr($msg, 5);
1937 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1939 else if (strncmp($msg, "/alarm ", 7) == 0) {
1940 if (strncmp($msg, "/alarm to ", 10) == 0) {
1941 $sp_pos = strpos($msg, " ", 10);
1942 $target = substr($msg, 10, $sp_pos - 10);
1943 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1947 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1950 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1951 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1952 $msg = $mlang_brisk['alarpass'][$G_lang];
1953 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1958 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1959 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1960 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1961 $to_user = nickserv_msg($dt, $prestr);
1963 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1964 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1965 /* MLANG: "chiudi" */
1966 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1968 } // /alarm chat command
1969 else if (strncmp($msg, "/listen ", 8) == 0) {
1970 $arg = substr($msg, 8);
1972 if (strcasecmp($arg, "isolation") == 0) {
1974 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1975 $user->table >= TABLES_AUTH_N) {
1976 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1980 $user->flags &= ~USER_FLAG_MAP_AUTH;
1981 $user->flags |= USER_FLAG_ISOLAUTH;
1982 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1985 else if (strcasecmp($arg, "auth") == 0) {
1986 $flags_old = $user->flags;
1987 $user->flags &= ~USER_FLAG_MAP_AUTH;
1988 $user->flags |= USER_FLAG_LISTAUTH;
1989 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1992 $flags_old = $user->flags;
1993 $user->flags &= ~USER_FLAG_MAP_AUTH;
1994 $to_user = 'list_set(\'all\', true, \'\'); ';
1997 // if from isolation redraw standup area
1998 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1999 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
2003 else if (strcmp($msg, "/authreq") == 0) {
2004 if ($user->is_cert()) {
2005 $to_user = sprintf('authbox(300,200);');
2008 /* 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." */
2009 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
2012 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
2013 if ($user->is_auth()) {
2014 $to_user = sprintf('mesgtoadmbox(500,300);');
2017 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
2018 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
2021 else if (strncmp($msg, "/nick ", 6) == 0) {
2022 log_main("chatt_send BEGIN");
2025 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2026 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2030 $msg = "COMMAND ".$msg;
2031 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2032 $user_cur = $this->user[$i];
2034 if ($user_cur->is_active() == FALSE)
2036 if (strcasecmp($user_cur->name,$name_new) == 0)
2039 if ($i < MAX_PLAYERS) {
2040 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2041 $to_user = nickserv_msg($dt, $prestr);
2045 /* 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>" */
2046 if ($user->is_auth()) {
2047 if (strcasecmp($user->name,$name_new) != 0) {
2048 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2049 ($user->subst == 'standup' ||
2050 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2053 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2054 for ($i = 0 ; $i < TABLES_N ; $i++) {
2055 $to_user .= $this->table[$i]->act_content($user);
2059 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2064 $user->name = $name_new; // OK - nick changed
2065 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2066 if ( ! $user->is_auth() ) {
2067 if (($bdb = BriskDB::create()) != FALSE) {
2069 /* 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>" */
2070 if ($bdb->login_exists($name_new)) {
2071 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2072 $to_user .= nickserv_msg($dt, $prestr);
2077 log_main("chatt_send start set");
2079 $update_room = TRUE;
2081 } // nick chat command
2082 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2083 $guar_user = substr($msg, 6);
2085 $this->guarantee_show($user, $guar_user, $dt);
2087 else if (strncmp($msg, "/st ", 4) == 0) {
2088 log_main("chatt_send BEGIN");
2091 $st_str = substr($msg, 4);
2093 if (strcasecmp($st_str, "normale") == 0) {
2094 $st = USER_FLAG_S_NORM;
2096 else if (strcasecmp($st_str, "pausa") == 0) {
2097 $st = USER_FLAG_S_PAU;
2099 else if (strcasecmp($st_str, "fuori") == 0) {
2100 $st = USER_FLAG_S_OUT;
2102 else if (strcasecmp($st_str, "cane") == 0) {
2103 $st = USER_FLAG_S_DOG;
2105 else if (strcasecmp($st_str, "cibo") == 0) {
2106 $st = USER_FLAG_S_EAT;
2108 else if (strcasecmp($st_str, "lavoro") == 0) {
2109 $st = USER_FLAG_S_WRK;
2111 else if (strcasecmp($st_str, "sigaretta") == 0) {
2112 $st = USER_FLAG_S_SMK;
2114 else if (strcasecmp($st_str, "presente") == 0) {
2115 $st = USER_FLAG_S_EYE;
2117 else if (strcasecmp($st_str, "coniglio") == 0) {
2118 $st = USER_FLAG_S_RABB;
2120 else if (strcasecmp($st_str, "calcio") == 0) {
2121 $st = USER_FLAG_S_SOCC;
2123 else if (strcasecmp($st_str, "pupo") == 0) {
2124 $st = USER_FLAG_S_BABY;
2126 else if (strcasecmp($st_str, "pulizie") == 0) {
2127 $st = USER_FLAG_S_MOP;
2129 else if (strcasecmp($st_str, "babbo") == 0) {
2130 $st = USER_FLAG_S_BABBO;
2132 else if (strcasecmp($st_str, "renna") == 0) {
2133 $st = USER_FLAG_S_RENNA;
2135 else if (strcasecmp($st_str, "pupazzo") == 0) {
2136 $st = USER_FLAG_S_PUPAZ;
2138 else if (strcasecmp($st_str, "vischio") == 0) {
2139 $st = USER_FLAG_S_VISCH;
2142 /* MLANG: "Questo stato non esiste." */
2143 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2147 log_main("chatt_send start set");
2148 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2149 $update_room = TRUE;
2150 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2153 } // nick chat command
2155 else { // normal chat line
2156 $is_normchat = TRUE;
2157 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2159 $user->chat_dlt = $user->chat_dlt * 2;
2160 if ($user->chat_dlt > 120)
2161 $user->chat_dlt = 120;
2163 else if ($user->chat_lst == $msg)
2165 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2166 $user->chat_ban = $curtime;
2167 $user->chat_dlt = 5;
2171 $user->chat_ban = 0;
2172 $user->chat_dlt = 0;
2176 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2179 if ( TRUE && (! $user->is_auth()) ) {
2180 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2181 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2182 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2183 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2184 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2186 $auguri = sprintf("%s auguri %s %s.",
2187 $aug_head[mt_rand(0, count($aug_head)-1)],
2188 $aug_body[mt_rand(0, count($aug_body)-1)],
2189 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2191 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2195 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2196 // temporary silentiation for troll (will became array check)
2197 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2198 $to_room = $to_user;
2202 log_legal($curtime, $user->ip, $user,
2203 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2205 $user->chat_lst = "$msg";
2206 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2216 // Output to clients
2219 if ($to_user != FALSE) {
2220 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2221 $user->comm[$user->step % COMM_N] .= $to_user;
2225 if ($to_room != FALSE) {
2226 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2227 $user_cur = $this->user[$i];
2228 if ($target != "" && $user_cur->name != $target)
2230 if ($user_cur->is_active() == FALSE // is not active user
2231 || $user_cur->stat == 'table' // or stat is 'table'
2232 || $user->idx_get() == $i) // or the $user idx is equal to current var
2235 if ($is_normchat == TRUE) {
2236 // use MAP_AUTH to check if auth or isolation
2237 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2238 if ( ! $user->is_auth() ) {
2244 else if ($is_ticker) {
2245 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2246 if ($user->table >= TABLES_AUTH_N)
2251 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2252 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2253 $user_cur->step_inc();
2258 // FIXME BRISK4: include for each kind of table
2259 require_once("${G_base}briskin5/Obj/briskin5.phh");
2260 // Before all align times with table timeout
2261 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2262 if (isset($this->match[$table_idx])) {
2263 $bin5 = $this->match[$table_idx];
2265 $bin5_table = $bin5->table[0];
2266 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2267 // stat must be "table" by definition
2268 $bin5_user = $bin5->user[$i];
2270 if ($target != "" && $bin5_user->name != $target)
2272 log_main("writa: ".$user_mesg);
2273 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2274 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2275 $bin5_user->step_inc();
2277 } // if (isset($this->match
2278 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2279 } // if ($to_tabl == true ...
2282 if ($user->stat == 'room' && $user->subst == 'standup') {
2283 $this->standup_update($user);
2285 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2286 log_main("chatt_send pre table update");
2287 $this->table_update($user);
2288 log_main("chatt_send post table update");
2290 } // if ($update_room ...
2293 } // function chatt_send( ...
2295 function get_user($sess, &$idx)
2299 if (validate_sess($sess)) {
2300 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2301 if ($this->user[$i]->is_empty())
2303 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2306 $ret = $this->user[$i];
2310 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2311 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2312 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2315 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2322 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2325 * if ($idx > -1 && ret == FALSE) => duplicated nick
2326 * if ($idx == -2 && ret == FALSE) => invalid name
2327 * if ($idx == -3 && ret == FALSE) => wrong password
2328 * if ($idx == -1 && ret == FALSE) => no space left
2329 * if ($idx == 0 && ret == user) => SUCCESS
2330 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2333 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2339 $authenticate = FALSE;
2341 $login_exists = FALSE;
2343 $ghost_auth = FALSE;
2348 if (($name_new = validate_name($name)) == FALSE) {
2353 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2354 if (validate_sess($sess) == FALSE)
2357 /* if pass != FALSE verify the login with pass */
2358 log_auth("XXX", "auth1");
2360 if (($bdb = BriskDB::create()) != FALSE) {
2362 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2363 log_auth("XXX", "auth2");
2364 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2365 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2367 if ($authenticate != FALSE) {
2368 $user_type = $authenticate->type_get();
2376 $login_exists = $bdb->login_exists($name_new);
2380 // if db is down, send a warning and verify only current users
2381 // no actions at this moment
2383 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2385 if ($this->user[$i]->is_empty()) {
2386 if ($idfree == -1) {
2391 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2396 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2397 if ($authenticate != FALSE) {
2399 $ghost_auth = $this->user[$i]->is_auth();
2410 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2412 /* there is another user logged with your account and you and him have authenticated => new user
2413 get the session of the old user */
2414 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2417 $ghost_user = $this->user[$ghost];
2419 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2420 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2421 $ghost_user->step_inc();
2424 $ghost_user->sess = $sess;
2427 $ghost_user->sess = $sess;
2430 // If user at the table we need to update the table data too
2431 $table_idx = $ghost_user->table;
2432 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2433 require_once("${G_base}briskin5/Obj/briskin5.phh");
2434 if (isset($this->match[$table_idx])) {
2435 $bin5 = $this->match[$table_idx];
2437 if ($bin5->the_end != TRUE) {
2438 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2439 $bin5->user[$ghost_user->table_pos]->step_inc();
2440 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2446 if (defined('CURL_DE_SAC_VERS')) {
2447 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2449 return ($this->user[$ghost]);
2451 else if ($idx != -1 && $i == MAX_PLAYERS) {
2456 $this->user[$idx]->sess = $sess;
2459 $this->user[$idx]->sess = $sess;
2461 $this->user[$idx]->name = $name_new; // OK - add new user
2462 $this->user[$idx]->stat_set("room");
2463 $this->user[$idx]->step_set(0);
2464 while (array_pop($this->user[$idx]->comm) != NULL);
2465 $this->user[$idx]->subst = "standup";
2466 $this->user[$idx]->lacc = $curtime;
2467 $this->user[$idx]->laccwr = $curtime;
2468 $this->user[$idx]->bantime = 0;
2469 $this->user[$idx]->ip = $ip;
2471 $this->user[$idx]->rec = $authenticate;
2472 $this->user[$idx]->flags = $user_type;
2473 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2474 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2475 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2477 if ($authenticate != FALSE) {
2478 $this->user[$idx]->code = $authenticate->code_get();
2480 // all this part is included in the db server
2481 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2483 if (isset($cookie['CO_list'])) {
2484 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2485 if (strcmp($cookie['CO_list'], "auth") == 0) {
2486 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2487 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2489 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2490 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2491 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2494 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2499 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2502 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2504 log_main("ghost: rename!");
2505 $ghost_user = $this->user[$ghost];
2507 if ($ghost_auth == FALSE) {
2508 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2509 $ghostname = 'ghost'.$sfx;
2510 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2511 if (strcmp("", $this->user[$i]->sess) == 0)
2514 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2519 if ($ghostname != '')
2523 $ghost_user->name = $ghostname;
2525 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2526 $this->standup_update($ghost_user);
2529 log_main("chatt_send pre table update");
2530 $this->table_update($ghost_user);
2531 log_main("chatt_send post table update");
2533 } // if ($ghost_auth == FALSE
2535 // FIXME: cacciare il vecchio utente room && table (if needed)
2536 $ghost_user->the_end = TRUE;
2537 $ghost_user->lacc = 0;
2538 $this->garbage_manager(TRUE);
2540 } // if ($ghost > -1) {
2545 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));
2547 $ret = $this->user[$real_idx];
2548 if (defined('CURL_DE_SAC_VERS')) {
2549 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2557 function standup_update($user)
2559 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2560 $user_cur = $this->user[$i];
2561 if ($user_cur->is_active() == FALSE)
2564 log_main("STANDUP START: ".$user_cur->stat);
2566 if ($user_cur->stat == 'room') {
2567 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2568 if ($user->idx_get() == $i) {
2569 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2571 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2573 $user_cur->step_inc();
2578 function dump_data()
2580 $brisk_ser = serialize($this);
2581 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2582 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2589 function standup_content($user)
2593 if ($user->stat != 'room')
2596 $content = ' j_stand_cont( [ ';
2598 $user_cur_id = $user->idx_get();
2599 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2600 if ($this->user[$i]->is_active() == FALSE // is not active user
2601 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2602 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2605 $flags = $this->user[$i]->flags;
2607 // sql record exists AND last donate > 2013-01-01
2608 if ($this->user[$i]->is_supp_custom()) {
2609 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2615 if ($this->user[$i]->subst == "standup") {
2616 if ($user_cur_id == $i) {
2620 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2621 xcape($this->user[$i]->name), $supp_comp_s);
2630 function table_content($user, $table_idx)
2636 // Si possono usare i dati nella classe table
2639 $sess = $user->sess;
2640 $table = $this->table[$table_idx];
2642 if ($user->stat != 'room')
2645 $user_cur_id = $user->idx_get();
2647 for ($i = 0 ; $i < $table->player_n ; $i++) {
2648 $user_cur = $this->user[$table->player[$i]];
2650 $flags = $user_cur->flags;
2652 if ($user_cur_id == $table->player[$i])
2655 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2656 if ($user_cur->is_supp_custom())
2657 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2661 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2662 xcape($user_cur->name), $supp_comp_s);
2667 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2672 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2674 GLOBAL $G_ban_list, $G_black_list;
2676 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2677 $remote_addr = addrtoipv4($addr);
2679 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2680 if ($this->black_check($remote_addr)) {
2681 // TODO: waiting async 5 sec before close
2682 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2686 $enc = get_encoding($header);
2687 if (isset($header['User-Agent'])) {
2688 if (strstr($header['User-Agent'], "MSIE")) {
2689 $transp_type = "htmlfile";
2692 $transp_type = "xhr";
2696 $transp_type = "iframe";
2698 force_no_cache($header_out);
2704 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2705 $content = ob_get_contents();
2708 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2709 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2713 case "index_wr.php":
2715 // Enhance required: in the POST case, after the header you must get content
2716 // from the socket, waiting if necessary
2720 index_wr_main($this, $addr, $get, $post, $cookie);
2721 $content = ob_get_contents();
2724 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2728 case "index_rd.php":
2729 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2731 if ($transp == 'websocket')
2735 if (!isset($cookie['sess'])
2736 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2738 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2740 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2745 $this->sess_cur_set($user->sess);
2746 // close a previous opened index_read_ifra socket, if exists
2747 if (($prev = $user->rd_socket_get()) != NULL) {
2748 $s_a_p->socks_unset($user->rd_socket_get());
2749 fclose($user->rd_socket_get());
2750 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2751 $user->rd_socket_set(NULL);
2755 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2756 $response = headers_render($header_out, -1).$user->chunked_content($content);
2757 $response_l = mb_strlen($response, "ASCII");
2759 $wret = @fwrite($new_socket, $response, $response_l);
2760 if ($wret < $response_l) {
2761 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2762 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2765 $user->rd_cache_set("");
2767 fflush($new_socket);
2770 $s_a_p->socks_set($new_socket, $user, NULL);
2771 $user->rd_socket_set($new_socket);
2772 printf(" - qui ci siamo - ");
2779 if (!(BRISK_DEBUG & DBG_ENGI))
2781 fprintf(STDERR, "TEST.PHP running\n");
2782 if (isset($post['data'])) {
2783 $content = $post['data'];
2786 $content = "NO DATA AVAILABLE";
2788 $header_out['Content-Type'] = 'text/plain';
2789 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2793 /* FAR TODO: move all into an array of registered sub-apps */
2794 $subs = "briskin5/";
2795 $subs_l = strlen($subs);
2796 if (!strncmp($path, $subs, $subs_l)) {
2797 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2806 function match_add($idx, $match)
2808 $this->match[$idx] = $match;
2811 function match_del($idx)
2813 unset($this->match[$idx]);
2816 function match_get($idx, $token)
2818 if (isset($this->match[$idx])) {
2820 || $token == $this->match[$idx]->table_token) {
2821 return ($this->match[$idx]);
2826 function sess_cur_set($sess)
2828 static::$sess_cur = $sess;
2831 static function sess_cur_get()
2833 return(static::$sess_cur);
2835 } // end class Brisk
2837 function make_seed()
2839 list($usec, $sec) = explode(' ', microtime());
2840 return (float) $sec + ((float) $usec * 100000);
2843 function btrace_line($ar)
2845 GLOBAL $G_btrace_pref_sub;
2848 for ($i = 0 ; $i < count($ar) ; $i++) {
2849 $with_class = isset($ar[$i]['class']);
2850 $with_file = isset($ar[$i]['file']);
2851 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2852 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2853 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2854 ($with_file ? $ar[$i]['line'] : ""));
2860 function trace_ftok($id, $add)
2862 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2863 $tok=@ftok($id, $add);
2865 log_shme($tok.": ".$id." + ".$add);
2870 function log_mop($step, $log)
2874 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2877 $sess = Brisk::sess_cur_get();
2878 if (isset($sess) == FALSE)
2883 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2886 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2887 $btrace = btrace_line(debug_backtrace());
2890 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2891 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2896 function log_step($log)
2900 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2903 $sess = Brisk::sess_cur_get();
2904 if (isset($sess) == FALSE)
2909 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2912 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2913 $btrace = btrace_line(debug_backtrace());
2916 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2917 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2924 function log_cds($log)
2928 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2931 $sess = Brisk::sess_cur_get();
2932 if (isset($sess) == FALSE)
2937 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2940 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2941 $btrace = btrace_line(debug_backtrace());
2944 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2945 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2951 function log_only2($log)
2955 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2958 $sess = Brisk::sess_cur_get();
2959 if (isset($sess) == FALSE)
2964 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2967 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2968 $btrace = btrace_line(debug_backtrace());
2971 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2972 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2977 function log_crit($log)
2981 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2984 $sess = Brisk::sess_cur_get();
2985 if (isset($sess) == FALSE)
2990 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2993 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2994 $btrace = btrace_line(debug_backtrace());
2997 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2998 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3003 function log_only($log)
3007 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
3010 $sess = Brisk::sess_cur_get();
3011 if (isset($sess) == FALSE)
3016 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3019 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3020 $btrace = btrace_line(debug_backtrace());
3023 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3024 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3029 function log_main($log)
3033 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3036 $sess = Brisk::sess_cur_get();
3037 if (isset($sess) == FALSE)
3042 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3045 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3046 $btrace = btrace_line(debug_backtrace());
3049 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3050 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3055 function log_rd($log)
3059 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3062 $sess = Brisk::sess_cur_get();
3063 if (isset($sess) == FALSE)
3068 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3071 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3072 $btrace = btrace_line(debug_backtrace());
3075 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3076 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3081 function log_rd2($log)
3085 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3088 $sess = Brisk::sess_cur_get();
3089 if (isset($sess) == FALSE)
3094 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3097 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3098 $btrace = btrace_line(debug_backtrace());
3102 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3103 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3108 function log_send($log)
3112 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3115 $sess = Brisk::sess_cur_get();
3116 if (isset($sess) == FALSE)
3121 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3124 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3125 $btrace = btrace_line(debug_backtrace());
3128 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3129 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3134 function log_lock($log)
3138 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3141 $sess = Brisk::sess_cur_get();
3142 if (isset($sess) == FALSE)
3147 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3150 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3151 $btrace = btrace_line(debug_backtrace());
3154 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3155 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3160 function log_wr($log)
3164 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3167 $sess = Brisk::sess_cur_get();
3168 if (isset($sess) == FALSE)
3173 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3176 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3177 $btrace = btrace_line(debug_backtrace());
3180 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3181 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3186 function log_load($log)
3190 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3193 $sess = Brisk::sess_cur_get();
3194 if (isset($sess) == FALSE)
3199 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3202 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3203 $btrace = btrace_line(debug_backtrace());
3206 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3207 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3212 function log_auth($sess, $log)
3216 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3219 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3222 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3223 $btrace = btrace_line(debug_backtrace());
3226 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3227 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3232 function log_shme($log)
3236 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3239 $sess = Brisk::sess_cur_get();
3240 if (isset($sess) == FALSE)
3245 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3248 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3249 $btrace = btrace_line(debug_backtrace());
3252 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3253 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3260 // function log_legal($curtime, $sess, $name, $where, $mesg)
3261 function log_legal($curtime, $addr, $user, $where, $mesg)
3264 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3265 /* Unix time | session | nickname | IP | where was | mesg */
3266 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3267 ($user->is_auth() ? 'A' : 'N'),
3268 $user->name, $addr, $where , $mesg));
3273 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3278 if ($sitted < PLAYERS_N) {
3286 if ($table == $cur_table)
3293 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3298 function show_notify($text, $tout, $butt, $w, $h)
3300 log_main("SHOW_NOTIFY: ".$text);
3301 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3304 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3306 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3307 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);
3310 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3312 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3315 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3316 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3319 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3320 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);
3324 function root_welcome($user)
3326 GLOBAL $root_wellarr, $G_lang;
3330 $dt = date("H:i ", $curtime);
3332 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3333 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3340 function validate_sess($sess)
3342 if (strlen($sess) == SESS_LEN)
3348 function validate_name($name)
3350 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3352 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3354 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3361 function playsound($filename)
3363 return (sprintf('playsound("flasou", "%s");', $filename));
3366 function secstoword($secs)
3372 $mins = floor($secs / 60);
3374 if ($G_lang == 'en') {
3376 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3379 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3383 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3386 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3391 function sharedmem_sz($tok)
3393 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3394 log_main("shmop_open failed");
3397 $shm_sz = shmop_size($shm_id);
3398 shmop_close($shm_id);
3400 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3407 static function lock_data($is_exclusive)
3409 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3410 self::$delta_t = microtime(TRUE);
3411 log_lock("LOCK warrant [".self::$delta_t."]");
3419 static function unlock_data($res)
3423 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3432 static function lock_data($is_exclusive)
3434 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3435 self::$delta_t = microtime(TRUE);
3436 log_lock("LOCK poll [".self::$delta_t."]");
3444 static function unlock_data($res)
3448 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3454 function carousel_top()
3459 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));
3462 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>'));