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.16.0";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: rifattorizzazione del motore di Brisk e messaggio di uscita.',
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
998 function GhostSessEl($time, $sess, $reas)
1000 $this->time = $time + GHOST_SESS_TOUT;
1001 $this->sess = $sess;
1002 $this->reas = $reas;
1010 function GhostSess()
1012 $this->gs = array();
1015 // push or update for this session
1016 function push($time, $sess, $reas)
1018 foreach($this->gs as $el) {
1019 if ($el->sess == "$sess") {
1021 $el->time = $time + GHOST_SESS_TOUT;
1026 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1032 foreach($this->gs as $key => $el) {
1033 if ($el->sess == "$sess") {
1034 $ret = $this->gs[$key];
1035 unset($this->gs[$key]);
1042 function garbage_manager($curtime)
1044 foreach($this->gs as $key => $el) {
1045 if ($el->time < $curtime) {
1046 unset($this->gs[$key]);
1056 var $crystal_filename;
1060 var $comm; // commands for many people
1061 var $step; // current step of the comm array
1062 var $garbage_timeout;
1065 var $ban_list; // ban list (authized allowed)
1066 var $black_list; // black list (anti-dos, noone allowed)
1072 public static $sess_cur;
1080 static function create($crystal_filename, $ban_list, $black_list) {
1081 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1082 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1083 fprintf(STDERR, "ROOM FROM FILE\n");
1084 rename($crystal_filename, $crystal_filename.".old");
1086 $brisk->reload(TRUE, $ban_list, $black_list);
1092 fprintf(STDERR, "NEW ROOM\n");
1093 $thiz = new Brisk();
1095 $thiz->crystal_filename = $crystal_filename;
1096 $thiz->user = array();
1097 $thiz->table = array();
1098 $thiz->match = array();
1100 $thiz->ban_list = NULL;
1101 $thiz->black_list = NULL;
1102 $thiz->ghost_sess = new GhostSess();
1104 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1105 $thiz->user[$i] = User::create($thiz, $i, "", "");
1108 for ($i = 0 ; $i < TABLES_N ; $i++) {
1109 $thiz->table[$i] = Table::create($i);
1111 $thiz->garbage_timeout = 0;
1112 $thiz->shm_sz = SHM_DIMS_MIN;
1114 $thiz->delay_mgr = new Delay_Manager(1.5);
1116 static::$sess_cur = FALSE;
1118 $thiz->reload(TRUE, $ban_list, $black_list);
1123 function ipclass_update($ip_out_s, $ip_in)
1125 fprintf(STDERR, "N_IN: %d\n", count($ip_in));
1127 $ip_out = &$this->$ip_out_s;
1129 // if already set clean the ban_list property
1131 $ct = count($ip_out);
1132 for ($i = 0 ; $i < $ct ; $i++) {
1139 for ($i = 0 ; $i < count($ip_in) ; $i++) {
1140 $ip_out[$i] = new IPClass($ip_in[$i]);
1144 function reload($is_first, $ban_list, $black_list)
1146 fprintf(STDERR, "RELOAD STUFF (%d)(%d)\n", count($ban_list), count($black_list));
1148 if (defined('CURL_DE_SAC_VERS')) {
1149 if (brisk_cds_reload($this) == FALSE) {
1153 $this->ipclass_update("ban_list", $ban_list);
1154 $this->ipclass_update("black_list", $black_list);
1157 $this->banned_kickoff();
1158 $this->garbage_manager(TRUE);
1162 function banned_kickoff()
1166 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1167 $table_cur = $this->table[$table_idx];
1168 // if the table is complete and exists we check users IP
1170 if ($table_cur->player_n == PLAYERS_N) {
1171 if (isset($this->match[$table_idx]) &&
1172 $table_cur->table_token == $bin5->table_token) {
1173 log_main("PLAYERS == N TABLE ".$table_idx);
1175 $bin5 = $this->match[$table_idx];
1177 $is_ban |= $bin5->banned_kickoff();
1182 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1183 $user_cur = $this->user[$i];
1185 if ($user_cur->is_active() == FALSE)
1188 // check if the IP is blacklisted
1189 if ($this->black_check($user_cur->ip)) {
1190 $user_cur->lacc = 0;
1195 // if authorized not check if banlisted
1196 if ($user_cur->is_auth()) {
1200 if ($this->ban_check($user_cur->ip)) {
1201 $user_cur->lacc = 0;
1209 function ban_check($ip_str)
1211 $ip = ip2long($ip_str);
1212 fprintf(STDERR, "Brisk::ban_check %d\n", count($this->ban_list));
1213 for ($i = 0 ; $i < count($this->ban_list) ; $i++) {
1214 fprintf(STDERR, "ban_list[%d] = %x (%x)\n", $i,
1215 $this->ban_list[$i]->addr, $this->ban_list[$i]->mask);
1216 if ($this->ban_list[$i]->match($ip)) {
1217 fprintf(STDERR, "\n\nMATCHA!\n\n");
1224 function black_check($ip_str)
1226 $ip = ip2long($ip_str);
1227 fprintf(STDERR, "Brisk::black_check %d\n", count($this->black_list));
1228 for ($i = 0 ; $i < count($this->black_list) ; $i++) {
1229 fprintf(STDERR, "black_list[%d] = %x (%x)\n", $i,
1230 $this->black_list[$i]->addr, $this->black_list[$i]->mask);
1231 if ($this->black_list[$i]->match($ip)) {
1232 fprintf(STDERR, "\n\nMATCHA!\n\n");
1239 function users_cleanup()
1241 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1242 $user_cur = $this->user[$i];
1244 if ($user_cur->the_end) {
1245 $user_cur->reset(); // users_cleanup, OK
1250 function garbage_manager($force)
1252 GLOBAL $G_lang, $mlang_brisk, $G_base;
1256 log_rd2("garbage_manager START");
1258 /* Garbage collector degli utenti in timeout */
1259 $curtime = microtime(TRUE);
1261 $delta = $this->delay_mgr->delta_get($curtime);
1263 if (!$force && !($this->garbage_timeout < $curtime)) {
1264 $this->delay_mgr->lastcheck_set($curtime);
1268 // Before all align times with table timeout
1269 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1270 $table_cur = $this->table[$table_idx];
1271 // if the table is complete and exists its shared mem we get the info about users lacc
1273 if ($table_cur->player_n == PLAYERS_N) {
1274 log_main("PLAYERS == N TABLE ".$table_idx);
1277 $no_recovery = FALSE;
1278 if (isset($this->match[$table_idx])) {
1279 $bin5 = $this->match[$table_idx];
1281 if ($table_cur->table_token != $bin5->table_token) {
1282 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1283 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1284 $no_recovery = TRUE;
1288 if ($bin5 != FALSE) {
1292 log_main("garbage_manager: bri loaded successfully.");
1293 $bin5->garbage_manager(TRUE);
1295 $bin5_table = $bin5->table[0];
1297 // is the end of the table
1299 if ($bin5->the_end == TRUE) {
1301 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1303 log_main("garbage_manager: INSIDE THE END.");
1305 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1306 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1307 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1310 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1311 // stat must be "table" by definition
1312 $user_cur = $this->user[$table_cur->player[$i]];
1313 $bin5_user = $bin5->user[$i];
1315 $user_cur->subst = $bin5_user->subst;
1316 $user_cur->rd_step = $bin5_user->rd_step;
1317 $user_cur->step = $bin5_user->step;
1318 $user_cur->lacc = $bin5_user->lacc;
1319 $user_cur->laccwr = $bin5_user->lacc;
1320 $user_cur->bantime = $bin5_user->bantime;
1321 $user_cur->the_end = $bin5_user->the_end;
1322 if ($user_cur->the_end) {
1323 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1327 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1329 $this->room_join_wakeup($user_cur, FALSE, 0);
1330 $table_cur->table_token = "";
1331 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1333 $this->match_del($table_idx);
1336 log_main("gm:: save_data");
1338 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1339 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1342 } // if ($bin5 == FALSE
1343 else if ($no_recovery == FALSE) {
1344 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1346 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1347 $user_cur = $this->user[$table_cur->player[$i]];
1348 $user_cur->subst = "shutdowner";
1349 $user_cur->step_inc();
1351 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1352 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1353 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1354 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1355 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1356 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1357 $user_cur->step_inc();
1360 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1361 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1362 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1364 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1366 $this->room_join_wakeup($user_cur, TRUE, -2);
1367 $table_cur->table_token = "";
1370 } // if ($table_cur->player_n == PLAYERS_N) {
1371 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1373 log_rd2("out new loop.");
1375 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1376 $user_cur = $this->user[$i];
1378 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1380 if ($user_cur->is_active() == FALSE)
1383 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1384 // Auto logout dell'utente
1385 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1387 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1388 $user_cur->the_end = TRUE;
1390 log_rd2("AUTO LOGOUT.");
1391 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1392 log_auth($user_cur->sess, "Autologout session.");
1394 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1395 $this->room_wakeup($user_cur);
1396 else if ($user_cur->subst == 'standup')
1397 $this->room_outstandup($user_cur);
1399 log_rd2("LOGOUT FROM WHAT ???");
1403 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1404 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1405 $this->room_wakeup($user_cur);
1406 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1407 /* 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" */
1408 $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);
1409 $user_cur->step_inc();
1413 log_rd2("GARBAGE UPDATED!");
1415 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1418 $this->ghost_sess->garbage_manager($curtime);
1420 $this->delay_mgr->lastcheck_set($curtime);
1424 function show_room($user_step, $user)
1426 GLOBAL $G_lang, $mlang_brisk;
1427 log_main("show_room: username: ".$user->name);
1429 $ret = sprintf('gst.st = %d; ', $user_step);
1431 $prefs = Client_prefs::from_user($user);
1432 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1435 if ($user->flags & USER_FLAG_ISOLAUTH) {
1436 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1438 else if ($user->flags & USER_FLAG_LISTAUTH) {
1439 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1442 $ret .= 'list_set(\'all\', false, \'\' ); ';
1446 if ($user->subst == 'standup')
1447 $ret .= "tra.show(); ";
1449 $ret .= "tra.hide(); ";
1451 $ret .= sprintf('stat = "%s";', $user->stat);
1453 $ret .= root_welcome($user);
1454 if ($user->flags & USER_FLAG_DBFAILED) {
1455 $ret .= "gst.st = ".($user->step+1)."; ";
1456 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1459 $ret .= sprintf('subst = "%s";', $user->subst);
1460 $ret .= $user->myname_innerHTML();
1462 for ($i = 0 ; $i < TABLES_N ; $i++) {
1464 $ret .= $this->table_content($user, $i);
1466 $ret .= $this->table[$i]->act_content($user);
1467 if ($this->table[$i]->wag_own != -1)
1468 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1470 $ret .= sprintf('tra.rem(%d); ', $i);
1472 $ret .= $this->standup_content($user);
1473 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1479 function room_wakeup($user)
1481 $table_idx = $user->table;
1482 $table = $this->table[$table_idx];
1484 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1488 $from_table = ($user->stat == "table");
1490 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1492 for ($i = 0 ; $i < $table->player_n ; $i++) {
1493 $user_cur = $this->user[$table->player[$i]];
1494 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1496 if ($user->idx_get() != $table->player[$i]) {
1497 $user_cur->stat_set("room");
1498 $user_cur->subst = "sitdown";
1499 $user_cur->laccwr = $curtime;
1501 else if ($user->is_active()) {
1502 $user_cur->stat_set("room");
1503 $user_cur->subst = "standup";
1504 $user_cur->laccwr = $curtime;
1505 $user_cur->table = -1;
1510 $user->stat_set("room");
1511 $user->subst = "standup";
1512 $user->laccwr = $curtime;
1515 $remove_wagon = FALSE;
1516 if($table->wag_own == $user->idx_get()) {
1517 $table->wag_reset($curtime);
1518 $remove_wagon = TRUE;
1522 /* aggiorna l'array dei giocatori al tavolo. */
1523 $table->user_rem($this, $user);
1525 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1526 $user_cur = $this->user[$i];
1527 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1530 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1532 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1533 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1534 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1535 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1536 log_main("DOCUMENT.index.php: from table");
1538 else if ($user_cur->stat == "room") {
1539 log_main("DOCUMENT.index.php: from table");
1541 $ret .= $this->table_content($user_cur, $table_idx);
1542 $ret .= $this->standup_content($user_cur);
1544 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1545 $ret .= $table->act_content($user);
1547 if ($user->idx_get() == $i) {
1548 // set the new status
1549 $ret .= 'subst = "standup"; tra.show(); ';
1550 // clean the action buttons in other tables
1551 for ($e = 0 ; $e < TABLES_N ; $e++) {
1552 if ($this->table[$e]->player_n < PLAYERS_N) {
1553 $ret .= $this->table[$e]->act_content($user);
1558 $ret .= $table->act_content($user_cur);
1561 log_wr("ROOM_WAKEUP: ".$ret);
1562 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1563 $user_cur->step_inc();
1567 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1569 $table_idx = $user->table;
1570 $table = $this->table[$table_idx];
1572 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1575 $user_wup = array();
1577 $user_tab = array();
1579 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1581 for ($i = 0 ; $i < $table->player_n ; $i++) {
1582 $user_cur = $this->user[$table->player[$i]];
1583 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1584 if ($user_cur->is_empty()) {
1587 if ($update_lacc == TRUE) {
1588 $user_cur->laccwr = $curtime;
1590 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1591 if ($user_cur->subst == "shutdowned") {
1592 $user_cur->stat_set("room");
1593 $user_cur->subst = "sitdown";
1595 else if ($user_cur->subst == "shutdowner") {
1596 $user_cur->stat_set("room");
1597 $user_cur->subst = "standup";
1598 $user_cur->table = -1;
1599 $user_wup[$user_wup_n++] = $user_cur;
1601 $remove_wagon = FALSE;
1602 if($table->wag_own == $table->player[$i]) {
1603 $remove_wagon = TRUE;
1604 $table->wag_reset($curtime);
1607 $user_tab[$user_tab_n++] = $table->player[$i];
1610 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1611 $table->user_rem($this, $user_wup[$wup_idx]);
1613 /* aggiorna l'array dei giocatori al tavolo. */
1615 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1616 log_main("START LOOP");
1617 $user_cur = $this->user[$i];
1618 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1619 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1624 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1626 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1627 if ($user_cur->stat == "room") {
1628 log_main("DOCUMENT.index.php from table");
1630 $ret .= $this->table_content($user_cur, $table_idx);
1631 $ret .= $this->standup_content($user_cur);
1633 $ret .= $table->act_content($user_cur);
1636 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1637 if ($user_tab[$tab_idx] == $i)
1640 // for users that wakeup the room will be reconstructed by index_rd.php
1641 if ($tab_idx < $user_tab_n) {
1642 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1644 // ARRAY_POP DISABLED
1645 // if ($trans_delta == 0)
1646 // while (array_pop($user_cur->comm) != NULL);
1648 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1649 $user_cur->comm[$user_cur->step % COMM_N] = "";
1650 $user_cur->step_inc();
1651 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1652 $user_cur->step_inc();
1653 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1657 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1659 log_main("JOIN_WAKEUP more");
1661 $ret .= $table->act_content($user_cur);
1663 log_main("JOIN_WAKEUP end more");
1665 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1666 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1667 $user_cur->step_inc();
1671 function guarantee_show($user, $user_login, $dt)
1673 GLOBAL $G_lang, $mlang_brisk, $G_base;
1679 if ($user_login == "") {
1683 if (($bdb = BriskDB::create()) == FALSE) {
1687 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1691 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1692 $guar_login = $guar_item->login_get();
1697 $user_tos_vers = $user_item->tos_vers_get();
1699 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1700 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1702 else if ($guar_login == "") {
1703 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1705 else if ($guar_login == $user_login) {
1706 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1709 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1710 xcape($user_login), xcape($guar_login)));
1715 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1718 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1724 function room_outstandup($user)
1726 $this->room_sitdown($user, -1);
1729 function table_update($user)
1731 log_main("table_update: pre - USER: ".$user->name);
1733 $table_idx = $user->table;
1735 if ($table_idx > -1)
1736 $table = $this->table[$table_idx];
1738 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1740 $user_cur = $this->user[$i];
1741 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1744 $ret = "gst.st = ".($user_cur->step+1)."; ";
1745 if ($table_idx > -1)
1746 $ret .= $this->table_content($user_cur, $table_idx);
1748 if ($user->idx_get() == $i) {
1749 $ret .= $user->myname_innerHTML();
1751 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1752 $user_cur->step_inc();
1755 log_main("table_update: post");
1758 function room_sitdown($user, $table_idx)
1760 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1764 if ($table_idx > -1 && $table_idx < TABLES_N) {
1765 $table = $this->table[$table_idx];
1768 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1769 for ($i = 0 ; $i < TABLES_N ; $i++) {
1770 if ($table->wag_own == $table->player[$i]) {
1771 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1772 $table->wag_reset(time());
1779 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1781 $user_cur = $this->user[$i];
1782 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1785 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1786 if ($table_idx > -1)
1787 $ret .= $this->table_content($user_cur, $table_idx);
1788 $ret .= $this->standup_content($user_cur);
1790 if ($user->idx_get() == $i) {
1791 $ret .= 'subst = "sitdown"; tra.hide(); ';
1792 // clean the action buttons in other tables
1793 for ($e = 0 ; $e < TABLES_N ; $e++) {
1794 $ret .= $this->table[$e]->act_content($user_cur);
1797 else if ($table_idx > -1) {
1798 if ($table->player_n == PLAYERS_N) {
1800 $ret .= $table->act_content($user_cur);
1803 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1804 $user_cur->step_inc();
1808 function chatt_send($user, $mesg)
1810 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1814 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1816 $dt = date("H:i ", $curtime);
1827 $is_normchat = FALSE;
1828 /* for old isolation management $is_ticker = FALSE; */
1829 $update_room = FALSE;
1831 if (strcmp($msg, "/tav") == 0 ||
1832 strncmp($msg, "/tav ", 5) == 0) {
1834 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1835 /* 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>" */
1836 $msg = $mlang_brisk['tickmust'][$G_lang];
1837 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1842 $table = $this->table[$user->table];
1844 if ($table->wag_own != -1) {
1845 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1846 $msg = $mlang_brisk['tickjust'][$G_lang];
1847 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1852 $dtime = $curtime - $table->wag_tout;
1853 if ($dtime < EXPIRE_TIME_WAG) {
1854 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1855 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1856 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1857 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1862 $msg = substr($msg, 5);
1864 $table->wag_set($user->idx_get(), $msg);
1865 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1866 $to_room = $to_user;
1867 /* for old isolation management $is_ticker = TRUE; */
1869 } // /tav chat command
1870 // just for development use currently
1871 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1872 fprintf(STDERR, "MOP OUT\n");
1873 $target = substr($msg, 5);
1874 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1875 $user_out = $this->user[$i];
1876 if (!strcmp($user_out->name, $target)) {
1878 $user_out->the_end = TRUE;
1879 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", GHOST_SESS_REAS_LOUT);
1880 $this->ghost_sess->push($curtime, $user_out->sess, GHOST_SESS_REAS_LOUT);
1882 if ($user_out->stat == 'table' || $user_out->stat == 'room') {
1883 if ($user_out->subst == 'sitdown' || $user_out->stat == 'table') {
1884 $this->room_wakeup($user_out);
1886 else if ($user_out->subst == 'standup') {
1887 $this->room_outstandup($user_out);
1890 log_rd2("LOGOUT FROM WHAT ???");
1894 fprintf(STDERR, "MOP: OUT FIND [%s] step %d rd_step %d\n", $target, $user_out->step, $user_out->rd_step);
1902 else if (strncmp($msg, "/alarm ", 7) == 0) {
1903 if (strncmp($msg, "/alarm to ", 10) == 0) {
1904 $sp_pos = strpos($msg, " ", 10);
1905 $target = substr($msg, 10, $sp_pos - 10);
1906 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1910 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1913 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1914 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1915 $msg = $mlang_brisk['alarpass'][$G_lang];
1916 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1921 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1922 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1923 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1924 $to_user = nickserv_msg($dt, $prestr);
1926 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1927 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1928 /* MLANG: "chiudi" */
1929 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1931 } // /alarm chat command
1932 else if (strncmp($msg, "/listen ", 8) == 0) {
1933 $arg = substr($msg, 8);
1935 if (strcasecmp($arg, "isolation") == 0) {
1937 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1938 $user->table >= TABLES_AUTH_N) {
1939 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1943 $user->flags &= ~USER_FLAG_MAP_AUTH;
1944 $user->flags |= USER_FLAG_ISOLAUTH;
1945 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1948 else if (strcasecmp($arg, "auth") == 0) {
1949 $flags_old = $user->flags;
1950 $user->flags &= ~USER_FLAG_MAP_AUTH;
1951 $user->flags |= USER_FLAG_LISTAUTH;
1952 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1955 $flags_old = $user->flags;
1956 $user->flags &= ~USER_FLAG_MAP_AUTH;
1957 $to_user = 'list_set(\'all\', true, \'\'); ';
1960 // if from isolation redraw standup area
1961 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1962 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1966 else if (strcmp($msg, "/authreq") == 0) {
1967 if ($user->is_cert()) {
1968 $to_user = sprintf('authbox(300,200);');
1971 /* 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." */
1972 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1975 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1976 if ($user->is_auth()) {
1977 $to_user = sprintf('mesgtoadmbox(500,300);');
1980 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1981 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1984 else if (strncmp($msg, "/nick ", 6) == 0) {
1985 log_main("chatt_send BEGIN");
1988 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1989 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1993 $msg = "COMMAND ".$msg;
1994 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1995 $user_cur = $this->user[$i];
1997 if ($user_cur->is_active() == FALSE)
1999 if (strcasecmp($user_cur->name,$name_new) == 0)
2002 if ($i < MAX_PLAYERS) {
2003 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2004 $to_user = nickserv_msg($dt, $prestr);
2008 /* 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>" */
2009 if ($user->is_auth()) {
2010 if (strcasecmp($user->name,$name_new) != 0) {
2011 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2012 ($user->subst == 'standup' ||
2013 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2016 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2017 for ($i = 0 ; $i < TABLES_N ; $i++) {
2018 $to_user .= $this->table[$i]->act_content($user);
2022 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2027 $user->name = $name_new; // OK - nick changed
2028 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2029 if ( ! $user->is_auth() ) {
2030 if (($bdb = BriskDB::create()) != FALSE) {
2032 /* 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>" */
2033 if ($bdb->login_exists($name_new)) {
2034 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2035 $to_user .= nickserv_msg($dt, $prestr);
2040 log_main("chatt_send start set");
2042 $update_room = TRUE;
2044 } // nick chat command
2045 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2046 $guar_user = substr($msg, 6);
2048 $this->guarantee_show($user, $guar_user, $dt);
2050 else if (strncmp($msg, "/st ", 4) == 0) {
2051 log_main("chatt_send BEGIN");
2054 $st_str = substr($msg, 4);
2056 if (strcasecmp($st_str, "normale") == 0) {
2057 $st = USER_FLAG_S_NORM;
2059 else if (strcasecmp($st_str, "pausa") == 0) {
2060 $st = USER_FLAG_S_PAU;
2062 else if (strcasecmp($st_str, "fuori") == 0) {
2063 $st = USER_FLAG_S_OUT;
2065 else if (strcasecmp($st_str, "cane") == 0) {
2066 $st = USER_FLAG_S_DOG;
2068 else if (strcasecmp($st_str, "cibo") == 0) {
2069 $st = USER_FLAG_S_EAT;
2071 else if (strcasecmp($st_str, "lavoro") == 0) {
2072 $st = USER_FLAG_S_WRK;
2074 else if (strcasecmp($st_str, "sigaretta") == 0) {
2075 $st = USER_FLAG_S_SMK;
2077 else if (strcasecmp($st_str, "presente") == 0) {
2078 $st = USER_FLAG_S_EYE;
2080 else if (strcasecmp($st_str, "coniglio") == 0) {
2081 $st = USER_FLAG_S_RABB;
2083 else if (strcasecmp($st_str, "calcio") == 0) {
2084 $st = USER_FLAG_S_SOCC;
2086 else if (strcasecmp($st_str, "pupo") == 0) {
2087 $st = USER_FLAG_S_BABY;
2089 else if (strcasecmp($st_str, "pulizie") == 0) {
2090 $st = USER_FLAG_S_MOP;
2092 else if (strcasecmp($st_str, "babbo") == 0) {
2093 $st = USER_FLAG_S_BABBO;
2095 else if (strcasecmp($st_str, "renna") == 0) {
2096 $st = USER_FLAG_S_RENNA;
2098 else if (strcasecmp($st_str, "pupazzo") == 0) {
2099 $st = USER_FLAG_S_PUPAZ;
2101 else if (strcasecmp($st_str, "vischio") == 0) {
2102 $st = USER_FLAG_S_VISCH;
2105 /* MLANG: "Questo stato non esiste." */
2106 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2110 log_main("chatt_send start set");
2111 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2112 $update_room = TRUE;
2113 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2116 } // nick chat command
2118 else { // normal chat line
2119 $is_normchat = TRUE;
2120 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2122 $user->chat_dlt = $user->chat_dlt * 2;
2123 if ($user->chat_dlt > 120)
2124 $user->chat_dlt = 120;
2126 else if ($user->chat_lst == $msg)
2128 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2129 $user->chat_ban = $curtime;
2130 $user->chat_dlt = 5;
2134 $user->chat_ban = 0;
2135 $user->chat_dlt = 0;
2139 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2142 if ( TRUE && (! $user->is_auth()) ) {
2143 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2144 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2145 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2146 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2147 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2149 $auguri = sprintf("%s auguri %s %s.",
2150 $aug_head[mt_rand(0, count($aug_head)-1)],
2151 $aug_body[mt_rand(0, count($aug_body)-1)],
2152 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2154 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2158 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2159 // temporary silentiation for troll (will became array check)
2160 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2161 $to_room = $to_user;
2165 log_legal($curtime, $user->ip, $user,
2166 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2168 $user->chat_lst = "$msg";
2169 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2179 // Output to clients
2182 if ($to_user != FALSE) {
2183 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2184 $user->comm[$user->step % COMM_N] .= $to_user;
2188 if ($to_room != FALSE) {
2189 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2190 $user_cur = $this->user[$i];
2191 if ($target != "" && $user_cur->name != $target)
2193 if ($user_cur->is_active() == FALSE // is not active user
2194 || $user_cur->stat == 'table' // or stat is 'table'
2195 || $user->idx_get() == $i) // or the $user idx is equal to current var
2198 if ($is_normchat == TRUE) {
2199 // use MAP_AUTH to check if auth or isolation
2200 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2201 if ( ! $user->is_auth() ) {
2207 else if ($is_ticker) {
2208 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2209 if ($user->table >= TABLES_AUTH_N)
2214 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2215 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2216 $user_cur->step_inc();
2221 // FIXME BRISK4: include for each kind of table
2222 require_once("${G_base}briskin5/Obj/briskin5.phh");
2223 // Before all align times with table timeout
2224 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2225 if (isset($this->match[$table_idx])) {
2226 $bin5 = $this->match[$table_idx];
2228 $bin5_table = $bin5->table[0];
2229 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2230 // stat must be "table" by definition
2231 $bin5_user = $bin5->user[$i];
2233 if ($target != "" && $bin5_user->name != $target)
2235 log_main("writa: ".$user_mesg);
2236 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2237 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2238 $bin5_user->step_inc();
2240 } // if (isset($this->match
2241 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2242 } // if ($to_tabl == true ...
2245 if ($user->stat == 'room' && $user->subst == 'standup') {
2246 $this->standup_update($user);
2248 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2249 log_main("chatt_send pre table update");
2250 $this->table_update($user);
2251 log_main("chatt_send post table update");
2253 } // if ($update_room ...
2256 } // function chatt_send( ...
2258 function get_user($sess, &$idx)
2262 if (validate_sess($sess)) {
2263 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2264 if ($this->user[$i]->is_empty())
2266 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2269 $ret = $this->user[$i];
2273 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2274 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2275 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2278 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2285 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2288 * if ($idx > -1 && ret == FALSE) => duplicated nick
2289 * if ($idx == -2 && ret == FALSE) => invalid name
2290 * if ($idx == -3 && ret == FALSE) => wrong password
2291 * if ($idx == -1 && ret == FALSE) => no space left
2292 * if ($idx == 0 && ret == user) => SUCCESS
2293 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
2296 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2302 $authenticate = FALSE;
2304 $login_exists = FALSE;
2306 $ghost_auth = FALSE;
2311 if (($name_new = validate_name($name)) == FALSE) {
2316 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2317 if (validate_sess($sess) == FALSE)
2320 /* if pass != FALSE verify the login with pass */
2321 log_auth("XXX", "auth1");
2323 if (($bdb = BriskDB::create()) != FALSE) {
2325 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2326 log_auth("XXX", "auth2");
2327 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2328 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2330 if ($authenticate != FALSE) {
2331 $user_type = $authenticate->type_get();
2339 $login_exists = $bdb->login_exists($name_new);
2343 // if db is down, send a warning and verify only current users
2344 // no actions at this moment
2346 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2348 if ($this->user[$i]->is_empty()) {
2349 if ($idfree == -1) {
2354 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2359 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2360 if ($authenticate != FALSE) {
2362 $ghost_auth = $this->user[$i]->is_auth();
2373 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2375 /* there is another user logged with your account and you and him have authenticated => new user
2376 get the session of the old user */
2377 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2380 $ghost_user = $this->user[$ghost];
2382 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2383 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2384 $ghost_user->step_inc();
2387 $ghost_user->sess = $sess;
2390 $ghost_user->sess = $sess;
2393 // If user at the table we need to update the table data too
2394 $table_idx = $ghost_user->table;
2395 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2396 require_once("${G_base}briskin5/Obj/briskin5.phh");
2397 if (isset($this->match[$table_idx])) {
2398 $bin5 = $this->match[$table_idx];
2400 if ($bin5->the_end != TRUE) {
2401 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2402 $bin5->user[$ghost_user->table_pos]->step_inc();
2403 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2409 if (defined('CURL_DE_SAC_VERS')) {
2410 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2412 return ($this->user[$ghost]);
2414 else if ($idx != -1 && $i == MAX_PLAYERS) {
2419 $this->user[$idx]->sess = $sess;
2422 $this->user[$idx]->sess = $sess;
2424 $this->user[$idx]->name = $name_new; // OK - add new user
2425 $this->user[$idx]->stat_set("room");
2426 $this->user[$idx]->step_set(0);
2427 while (array_pop($this->user[$idx]->comm) != NULL);
2428 $this->user[$idx]->subst = "standup";
2429 $this->user[$idx]->lacc = $curtime;
2430 $this->user[$idx]->laccwr = $curtime;
2431 $this->user[$idx]->bantime = 0;
2432 $this->user[$idx]->ip = $ip;
2434 $this->user[$idx]->rec = $authenticate;
2435 $this->user[$idx]->flags = $user_type;
2436 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2437 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2438 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2440 if ($authenticate != FALSE) {
2441 $this->user[$idx]->code = $authenticate->code_get();
2443 // all this part is included in the db server
2444 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2446 if (isset($cookie['CO_list'])) {
2447 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2448 if (strcmp($cookie['CO_list'], "auth") == 0) {
2449 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2450 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2452 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2453 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2454 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2457 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2462 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2465 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2467 log_main("ghost: rename!");
2468 $ghost_user = $this->user[$ghost];
2470 if ($ghost_auth == FALSE) {
2471 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2472 $ghostname = 'ghost'.$sfx;
2473 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2474 if (strcmp("", $this->user[$i]->sess) == 0)
2477 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2482 if ($ghostname != '')
2486 $ghost_user->name = $ghostname;
2488 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2489 $this->standup_update($ghost_user);
2492 log_main("chatt_send pre table update");
2493 $this->table_update($ghost_user);
2494 log_main("chatt_send post table update");
2496 } // if ($ghost_auth == FALSE
2498 // FIXME: cacciare il vecchio utente room && table (if needed)
2499 $ghost_user->the_end = TRUE;
2500 $ghost_user->lacc = 0;
2501 $this->garbage_manager(TRUE);
2503 } // if ($ghost > -1) {
2508 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));
2510 $ret = $this->user[$real_idx];
2511 if (defined('CURL_DE_SAC_VERS')) {
2512 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2520 function standup_update($user)
2522 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2523 $user_cur = $this->user[$i];
2524 if ($user_cur->is_active() == FALSE)
2527 log_main("STANDUP START: ".$user_cur->stat);
2529 if ($user_cur->stat == 'room') {
2530 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2531 if ($user->idx_get() == $i) {
2532 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2534 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2536 $user_cur->step_inc();
2541 function dump_data()
2543 $brisk_ser = serialize($this);
2544 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2545 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2552 function standup_content($user)
2556 if ($user->stat != 'room')
2559 $content = ' j_stand_cont( [ ';
2561 $user_cur_id = $user->idx_get();
2562 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2563 if ($this->user[$i]->is_active() == FALSE // is not active user
2564 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2565 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2568 $flags = $this->user[$i]->flags;
2570 // sql record exists AND last donate > 2013-01-01
2571 if ($this->user[$i]->is_supp_custom()) {
2572 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2578 if ($this->user[$i]->subst == "standup") {
2579 if ($user_cur_id == $i) {
2583 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2584 xcape($this->user[$i]->name), $supp_comp_s);
2593 function table_content($user, $table_idx)
2599 // Si possono usare i dati nella classe table
2602 $sess = $user->sess;
2603 $table = $this->table[$table_idx];
2605 if ($user->stat != 'room')
2608 $user_cur_id = $user->idx_get();
2610 for ($i = 0 ; $i < $table->player_n ; $i++) {
2611 $user_cur = $this->user[$table->player[$i]];
2613 $flags = $user_cur->flags;
2615 if ($user_cur_id == $table->player[$i])
2618 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2619 if ($user_cur->is_supp_custom())
2620 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2624 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2625 xcape($user_cur->name), $supp_comp_s);
2630 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2635 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2637 GLOBAL $G_ban_list, $G_black_list;
2639 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2640 $remote_addr = addrtoipv4($addr);
2642 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2643 if ($this->black_check($remote_addr)) {
2644 // TODO: waiting async 5 sec before close
2645 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2649 $enc = get_encoding($header);
2650 if (isset($header['User-Agent'])) {
2651 if (strstr($header['User-Agent'], "MSIE")) {
2652 $transp_type = "htmlfile";
2655 $transp_type = "xhr";
2659 $transp_type = "iframe";
2661 force_no_cache($header_out);
2667 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2668 $content = ob_get_contents();
2671 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2672 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2676 case "index_wr.php":
2678 // Enhance required: in the POST case, after the header you must get content
2679 // from the socket, waiting if necessary
2683 index_wr_main($this, $addr, $get, $post, $cookie);
2684 $content = ob_get_contents();
2687 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2691 case "index_rd.php":
2692 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2694 if ($transp == 'websocket')
2698 if (!isset($cookie['sess'])
2699 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2701 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2703 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2708 $this->sess_cur_set($user->sess);
2709 // close a previous opened index_read_ifra socket, if exists
2710 if (($prev = $user->rd_socket_get()) != NULL) {
2711 $s_a_p->socks_unset($user->rd_socket_get());
2712 fclose($user->rd_socket_get());
2713 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2714 $user->rd_socket_set(NULL);
2718 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2719 $response = headers_render($header_out, -1).$user->chunked_content($content);
2720 $response_l = mb_strlen($response, "ASCII");
2722 $wret = @fwrite($new_socket, $response, $response_l);
2723 if ($wret < $response_l) {
2724 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2725 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2728 $user->rd_cache_set("");
2730 fflush($new_socket);
2733 $s_a_p->socks_set($new_socket, $user, NULL);
2734 $user->rd_socket_set($new_socket);
2735 printf(" - qui ci siamo - ");
2742 if (!(BRISK_DEBUG & DBG_ENGI))
2744 fprintf(STDERR, "TEST.PHP running\n");
2745 if (isset($post['data'])) {
2746 $content = $post['data'];
2749 $content = "NO DATA AVAILABLE";
2751 $header_out['Content-Type'] = 'text/plain';
2752 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2756 /* FAR TODO: move all into an array of registered sub-apps */
2757 $subs = "briskin5/";
2758 $subs_l = strlen($subs);
2759 if (!strncmp($path, $subs, $subs_l)) {
2760 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2769 function match_add($idx, $match)
2771 $this->match[$idx] = $match;
2774 function match_del($idx)
2776 unset($this->match[$idx]);
2779 function match_get($idx, $token)
2781 if (isset($this->match[$idx])) {
2783 || $token == $this->match[$idx]->table_token) {
2784 return ($this->match[$idx]);
2789 function sess_cur_set($sess)
2791 static::$sess_cur = $sess;
2794 static function sess_cur_get()
2796 return(static::$sess_cur);
2798 } // end class Brisk
2800 function make_seed()
2802 list($usec, $sec) = explode(' ', microtime());
2803 return (float) $sec + ((float) $usec * 100000);
2806 function btrace_line($ar)
2808 GLOBAL $G_btrace_pref_sub;
2811 for ($i = 0 ; $i < count($ar) ; $i++) {
2812 $with_class = isset($ar[$i]['class']);
2813 $with_file = isset($ar[$i]['file']);
2814 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2815 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2816 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2817 ($with_file ? $ar[$i]['line'] : ""));
2823 function trace_ftok($id, $add)
2825 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2826 $tok=@ftok($id, $add);
2828 log_shme($tok.": ".$id." + ".$add);
2833 function log_mop($step, $log)
2837 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2840 $sess = Brisk::sess_cur_get();
2841 if (isset($sess) == FALSE)
2846 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2849 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2850 $btrace = btrace_line(debug_backtrace());
2853 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2854 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2859 function log_step($log)
2863 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2866 $sess = Brisk::sess_cur_get();
2867 if (isset($sess) == FALSE)
2872 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2875 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2876 $btrace = btrace_line(debug_backtrace());
2879 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2880 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2887 function log_cds($log)
2891 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2894 $sess = Brisk::sess_cur_get();
2895 if (isset($sess) == FALSE)
2900 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2903 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2904 $btrace = btrace_line(debug_backtrace());
2907 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2908 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2914 function log_only2($log)
2918 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2921 $sess = Brisk::sess_cur_get();
2922 if (isset($sess) == FALSE)
2927 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2930 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2931 $btrace = btrace_line(debug_backtrace());
2934 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2935 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2940 function log_crit($log)
2944 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2947 $sess = Brisk::sess_cur_get();
2948 if (isset($sess) == FALSE)
2953 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2956 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2957 $btrace = btrace_line(debug_backtrace());
2960 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2961 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2966 function log_only($log)
2970 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2973 $sess = Brisk::sess_cur_get();
2974 if (isset($sess) == FALSE)
2979 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2982 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2983 $btrace = btrace_line(debug_backtrace());
2986 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2987 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2992 function log_main($log)
2996 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2999 $sess = Brisk::sess_cur_get();
3000 if (isset($sess) == FALSE)
3005 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3008 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3009 $btrace = btrace_line(debug_backtrace());
3012 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3013 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3018 function log_rd($log)
3022 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3025 $sess = Brisk::sess_cur_get();
3026 if (isset($sess) == FALSE)
3031 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3034 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3035 $btrace = btrace_line(debug_backtrace());
3038 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3039 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3044 function log_rd2($log)
3048 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3051 $sess = Brisk::sess_cur_get();
3052 if (isset($sess) == FALSE)
3057 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3060 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3061 $btrace = btrace_line(debug_backtrace());
3065 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3066 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3071 function log_send($log)
3075 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3078 $sess = Brisk::sess_cur_get();
3079 if (isset($sess) == FALSE)
3084 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3087 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3088 $btrace = btrace_line(debug_backtrace());
3091 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3092 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3097 function log_lock($log)
3101 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3104 $sess = Brisk::sess_cur_get();
3105 if (isset($sess) == FALSE)
3110 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3113 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3114 $btrace = btrace_line(debug_backtrace());
3117 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3118 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3123 function log_wr($log)
3127 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3130 $sess = Brisk::sess_cur_get();
3131 if (isset($sess) == FALSE)
3136 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3139 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3140 $btrace = btrace_line(debug_backtrace());
3143 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3144 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3149 function log_load($log)
3153 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3156 $sess = Brisk::sess_cur_get();
3157 if (isset($sess) == FALSE)
3162 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3165 if ((BRISK_DEBUG | ($ssess == 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] [%s] [%s]\n", $ssess, $log, $btrace));
3175 function log_auth($sess, $log)
3179 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3182 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3185 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3186 $btrace = btrace_line(debug_backtrace());
3189 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3190 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3195 function log_shme($log)
3199 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3202 $sess = Brisk::sess_cur_get();
3203 if (isset($sess) == FALSE)
3208 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3211 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3212 $btrace = btrace_line(debug_backtrace());
3215 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3216 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3223 // function log_legal($curtime, $sess, $name, $where, $mesg)
3224 function log_legal($curtime, $addr, $user, $where, $mesg)
3227 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3228 /* Unix time | session | nickname | IP | where was | mesg */
3229 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3230 ($user->is_auth() ? 'A' : 'N'),
3231 $user->name, $addr, $where , $mesg));
3236 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3241 if ($sitted < PLAYERS_N) {
3249 if ($table == $cur_table)
3256 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3261 function show_notify($text, $tout, $butt, $w, $h)
3263 log_main("SHOW_NOTIFY: ".$text);
3264 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3267 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3269 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3270 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);
3273 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3275 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3278 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3279 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3282 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3283 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);
3287 function root_welcome($user)
3289 GLOBAL $root_wellarr, $G_lang;
3293 $dt = date("H:i ", $curtime);
3295 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3296 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3303 function validate_sess($sess)
3305 if (strlen($sess) == SESS_LEN)
3311 function validate_name($name)
3313 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3315 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3317 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3324 function playsound($filename)
3326 return (sprintf('playsound("flasou", "%s");', $filename));
3329 function secstoword($secs)
3335 $mins = floor($secs / 60);
3337 if ($G_lang == 'en') {
3339 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3342 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3346 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3349 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3354 function sharedmem_sz($tok)
3356 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3357 log_main("shmop_open failed");
3360 $shm_sz = shmop_size($shm_id);
3361 shmop_close($shm_id);
3363 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3370 static function lock_data($is_exclusive)
3372 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3373 self::$delta_t = microtime(TRUE);
3374 log_lock("LOCK warrant [".self::$delta_t."]");
3382 static function unlock_data($res)
3386 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3395 static function lock_data($is_exclusive)
3397 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3398 self::$delta_t = microtime(TRUE);
3399 log_lock("LOCK poll [".self::$delta_t."]");
3407 static function unlock_data($res)
3411 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3417 function carousel_top()
3422 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));
3425 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>'));