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.15.0";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: primo passo per rendere più robusto il sistema di notifica.',
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>: new users subscription system, refactored sidebanner system.',
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', 300);
987 define('GHOST_SESS_REAS_ANOT', 1);
994 function GhostSessEl($time, $sess, $reas)
996 $this->time = $time + GHOST_SESS_TOUT;
1006 function GhostSess()
1008 $this->gs = array();
1011 // push or update for this session
1012 function push($time, $sess, $reas)
1014 foreach($this->gs as $el) {
1015 if ($el->sess == "$sess") {
1017 $el->time = $time + GHOST_SESS_TOUT;
1022 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1028 foreach($this->gs as $key => $el) {
1029 if ($el->sess == "$sess") {
1030 $ret = $this->gs[$key];
1031 unset($this->gs[$key]);
1038 function garbage_manager($curtime)
1040 foreach($this->gs as $key => $el) {
1041 if ($el->time < $curtime) {
1042 unset($this->gs[$key]);
1052 var $crystal_filename;
1056 var $comm; // commands for many people
1057 var $step; // current step of the comm array
1058 var $garbage_timeout;
1061 var $ban_list; // ban list (authized allowed)
1062 var $black_list; // black list (anti-dos, noone allowed)
1068 public static $sess_cur;
1076 static function create($crystal_filename, $ban_list, $black_list) {
1077 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1078 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1079 fprintf(STDERR, "ROOM FROM FILE\n");
1080 rename($crystal_filename, $crystal_filename.".old");
1082 $brisk->reload(TRUE, $ban_list, $black_list);
1088 fprintf(STDERR, "NEW ROOM\n");
1089 $thiz = new Brisk();
1091 $thiz->crystal_filename = $crystal_filename;
1092 $thiz->user = array();
1093 $thiz->table = array();
1094 $thiz->match = array();
1096 $thiz->ban_list = NULL;
1097 $thiz->black_list = NULL;
1098 $thiz->ghost_sess = new GhostSess();
1100 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1101 $thiz->user[$i] = User::create($thiz, $i, "", "");
1104 for ($i = 0 ; $i < TABLES_N ; $i++) {
1105 $thiz->table[$i] = Table::create($i);
1107 $thiz->garbage_timeout = 0;
1108 $thiz->shm_sz = SHM_DIMS_MIN;
1110 $thiz->delay_mgr = new Delay_Manager(1.5);
1112 static::$sess_cur = FALSE;
1114 $thiz->reload(TRUE, $ban_list, $black_list);
1119 function ipclass_update($ip_out_s, $ip_in)
1121 fprintf(STDERR, "N_IN: %d\n", count($ip_in));
1123 $ip_out = &$this->$ip_out_s;
1125 // if already set clean the ban_list property
1127 $ct = count($ip_out);
1128 for ($i = 0 ; $i < $ct ; $i++) {
1135 for ($i = 0 ; $i < count($ip_in) ; $i++) {
1136 $ip_out[$i] = new IPClass($ip_in[$i]);
1140 function reload($is_first, $ban_list, $black_list)
1142 fprintf(STDERR, "RELOAD STUFF (%d)(%d)\n", count($ban_list), count($black_list));
1144 if (defined('CURL_DE_SAC_VERS')) {
1145 if (brisk_cds_reload($this) == FALSE) {
1149 $this->ipclass_update("ban_list", $ban_list);
1150 $this->ipclass_update("black_list", $black_list);
1153 $this->banned_kickoff();
1154 $this->garbage_manager(TRUE);
1158 function banned_kickoff()
1162 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1163 $table_cur = $this->table[$table_idx];
1164 // if the table is complete and exists we check users IP
1166 if ($table_cur->player_n == PLAYERS_N) {
1167 if (isset($this->match[$table_idx]) &&
1168 $table_cur->table_token == $bin5->table_token) {
1169 log_main("PLAYERS == N TABLE ".$table_idx);
1171 $bin5 = $this->match[$table_idx];
1173 $is_ban |= $bin5->banned_kickoff();
1178 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1179 $user_cur = $this->user[$i];
1181 if ($user_cur->is_active() == FALSE)
1184 // check if the IP is blacklisted
1185 if ($this->black_check($user_cur->ip)) {
1186 $user_cur->lacc = 0;
1191 // if authorized not check if banlisted
1192 if ($user_cur->is_auth()) {
1196 if ($this->ban_check($user_cur->ip)) {
1197 $user_cur->lacc = 0;
1205 function ban_check($ip_str)
1207 $ip = ip2long($ip_str);
1208 fprintf(STDERR, "Brisk::ban_check %d\n", count($this->ban_list));
1209 for ($i = 0 ; $i < count($this->ban_list) ; $i++) {
1210 fprintf(STDERR, "ban_list[%d] = %x (%x)\n", $i,
1211 $this->ban_list[$i]->addr, $this->ban_list[$i]->mask);
1212 if ($this->ban_list[$i]->match($ip)) {
1213 fprintf(STDERR, "\n\nMATCHA!\n\n");
1220 function black_check($ip_str)
1222 $ip = ip2long($ip_str);
1223 fprintf(STDERR, "Brisk::black_check %d\n", count($this->black_list));
1224 for ($i = 0 ; $i < count($this->black_list) ; $i++) {
1225 fprintf(STDERR, "black_list[%d] = %x (%x)\n", $i,
1226 $this->black_list[$i]->addr, $this->black_list[$i]->mask);
1227 if ($this->black_list[$i]->match($ip)) {
1228 fprintf(STDERR, "\n\nMATCHA!\n\n");
1235 function users_cleanup()
1237 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1238 $user_cur = $this->user[$i];
1240 if ($user_cur->the_end) {
1241 $user_cur->reset(); // users_cleanup, OK
1246 function garbage_manager($force)
1248 GLOBAL $G_lang, $mlang_brisk, $G_base;
1252 log_rd2("garbage_manager START");
1254 /* Garbage collector degli utenti in timeout */
1255 $curtime = microtime(TRUE);
1257 $delta = $this->delay_mgr->delta_get($curtime);
1259 if (!$force && !($this->garbage_timeout < $curtime)) {
1260 $this->delay_mgr->lastcheck_set($curtime);
1264 // Before all align times with table timeout
1265 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1266 $table_cur = $this->table[$table_idx];
1267 // if the table is complete and exists its shared mem we get the info about users lacc
1269 if ($table_cur->player_n == PLAYERS_N) {
1270 log_main("PLAYERS == N TABLE ".$table_idx);
1273 $no_recovery = FALSE;
1274 if (isset($this->match[$table_idx])) {
1275 $bin5 = $this->match[$table_idx];
1277 if ($table_cur->table_token != $bin5->table_token) {
1278 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1279 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1280 $no_recovery = TRUE;
1284 if ($bin5 != FALSE) {
1288 log_main("garbage_manager: bri loaded successfully.");
1289 $bin5->garbage_manager(TRUE);
1291 $bin5_table = $bin5->table[0];
1293 // is the end of the table
1295 if ($bin5->the_end == TRUE) {
1297 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1299 log_main("garbage_manager: INSIDE THE END.");
1301 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1302 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1303 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1306 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1307 // stat must be "table" by definition
1308 $user_cur = $this->user[$table_cur->player[$i]];
1309 $bin5_user = $bin5->user[$i];
1311 $user_cur->subst = $bin5_user->subst;
1312 $user_cur->rd_step = $bin5_user->rd_step;
1313 $user_cur->step = $bin5_user->step;
1314 $user_cur->lacc = $bin5_user->lacc;
1315 $user_cur->laccwr = $bin5_user->lacc;
1316 $user_cur->bantime = $bin5_user->bantime;
1317 $user_cur->the_end = $bin5_user->the_end;
1320 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1322 $this->room_join_wakeup($user_cur, FALSE, 0);
1323 $table_cur->table_token = "";
1324 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1326 $this->match_del($table_idx);
1329 log_main("gm:: save_data");
1331 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1332 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1335 } // if ($bin5 == FALSE
1336 else if ($no_recovery == FALSE) {
1337 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1339 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1340 $user_cur = $this->user[$table_cur->player[$i]];
1341 $user_cur->subst = "shutdowner";
1342 $user_cur->step_inc();
1344 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1345 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1346 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1347 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1348 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1349 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1350 $user_cur->step_inc();
1353 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1354 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1355 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1357 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1359 $this->room_join_wakeup($user_cur, TRUE, -2);
1360 $table_cur->table_token = "";
1363 } // if ($table_cur->player_n == PLAYERS_N) {
1364 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1366 log_rd2("out new loop.");
1368 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1369 $user_cur = $this->user[$i];
1371 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1373 if ($user_cur->is_active() == FALSE)
1376 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1377 // Auto logout dell'utente
1378 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1380 $user_cur->the_end = TRUE;
1382 log_rd2("AUTO LOGOUT.");
1383 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1384 log_auth($user_cur->sess, "Autologout session.");
1386 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1387 $this->room_wakeup($user_cur);
1388 else if ($user_cur->subst == 'standup')
1389 $this->room_outstandup($user_cur);
1391 log_rd2("LOGOUT FROM WHAT ???");
1395 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1396 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1397 $this->room_wakeup($user_cur);
1398 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1399 /* 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" */
1400 $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);
1401 $user_cur->step_inc();
1405 log_rd2("GARBAGE UPDATED!");
1407 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1410 $this->ghost_sess->garbage_manager($curtime);
1412 $this->delay_mgr->lastcheck_set($curtime);
1416 function show_room($user_step, $user)
1418 GLOBAL $G_lang, $mlang_brisk;
1419 log_main("show_room: username: ".$user->name);
1421 $ret = sprintf('gst.st = %d; ', $user_step);
1423 $prefs = Client_prefs::from_user($user);
1424 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1427 if ($user->flags & USER_FLAG_ISOLAUTH) {
1428 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1430 else if ($user->flags & USER_FLAG_LISTAUTH) {
1431 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1434 $ret .= 'list_set(\'all\', false, \'\' ); ';
1438 if ($user->subst == 'standup')
1439 $ret .= "tra.show(); ";
1441 $ret .= "tra.hide(); ";
1443 $ret .= sprintf('stat = "%s";', $user->stat);
1445 $ret .= root_welcome($user);
1446 if ($user->flags & USER_FLAG_DBFAILED) {
1447 $ret .= "gst.st = ".($user->step+1)."; ";
1448 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1451 $ret .= sprintf('subst = "%s";', $user->subst);
1452 $ret .= $user->myname_innerHTML();
1454 for ($i = 0 ; $i < TABLES_N ; $i++) {
1456 $ret .= $this->table_content($user, $i);
1458 $ret .= $this->table[$i]->act_content($user);
1459 if ($this->table[$i]->wag_own != -1)
1460 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1462 $ret .= sprintf('tra.rem(%d); ', $i);
1464 $ret .= $this->standup_content($user);
1465 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1471 function room_wakeup($user)
1473 $table_idx = $user->table;
1474 $table = $this->table[$table_idx];
1476 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1480 $from_table = ($user->stat == "table");
1482 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1484 for ($i = 0 ; $i < $table->player_n ; $i++) {
1485 $user_cur = $this->user[$table->player[$i]];
1486 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1488 if ($user->idx_get() != $table->player[$i]) {
1489 $user_cur->stat_set("room");
1490 $user_cur->subst = "sitdown";
1491 $user_cur->laccwr = $curtime;
1493 else if ($user->is_active()) {
1494 $user_cur->stat_set("room");
1495 $user_cur->subst = "standup";
1496 $user_cur->laccwr = $curtime;
1497 $user_cur->table = -1;
1502 $user->stat_set("room");
1503 $user->subst = "standup";
1504 $user->laccwr = $curtime;
1507 $remove_wagon = FALSE;
1508 if($table->wag_own == $user->idx_get()) {
1509 $table->wag_reset($curtime);
1510 $remove_wagon = TRUE;
1514 /* aggiorna l'array dei giocatori al tavolo. */
1515 $table->user_rem($this, $user);
1517 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1518 $user_cur = $this->user[$i];
1519 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1522 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1524 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1525 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1526 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1527 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1528 log_main("DOCUMENT.index.php: from table");
1530 else if ($user_cur->stat == "room") {
1531 log_main("DOCUMENT.index.php: from table");
1533 $ret .= $this->table_content($user_cur, $table_idx);
1534 $ret .= $this->standup_content($user_cur);
1536 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1537 $ret .= $table->act_content($user);
1539 if ($user->idx_get() == $i) {
1540 // set the new status
1541 $ret .= 'subst = "standup"; tra.show(); ';
1542 // clean the action buttons in other tables
1543 for ($e = 0 ; $e < TABLES_N ; $e++) {
1544 if ($this->table[$e]->player_n < PLAYERS_N) {
1545 $ret .= $this->table[$e]->act_content($user);
1550 $ret .= $table->act_content($user_cur);
1553 log_wr("ROOM_WAKEUP: ".$ret);
1554 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1555 $user_cur->step_inc();
1559 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1561 $table_idx = $user->table;
1562 $table = $this->table[$table_idx];
1564 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1567 $user_wup = array();
1569 $user_tab = array();
1571 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1573 for ($i = 0 ; $i < $table->player_n ; $i++) {
1574 $user_cur = $this->user[$table->player[$i]];
1575 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1576 if ($user_cur->is_empty()) {
1579 if ($update_lacc == TRUE) {
1580 $user_cur->laccwr = $curtime;
1582 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1583 if ($user_cur->subst == "shutdowned") {
1584 $user_cur->stat_set("room");
1585 $user_cur->subst = "sitdown";
1587 else if ($user_cur->subst == "shutdowner") {
1588 $user_cur->stat_set("room");
1589 $user_cur->subst = "standup";
1590 $user_cur->table = -1;
1591 $user_wup[$user_wup_n++] = $user_cur;
1593 $remove_wagon = FALSE;
1594 if($table->wag_own == $table->player[$i]) {
1595 $remove_wagon = TRUE;
1596 $table->wag_reset($curtime);
1599 $user_tab[$user_tab_n++] = $table->player[$i];
1602 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1603 $table->user_rem($this, $user_wup[$wup_idx]);
1605 /* aggiorna l'array dei giocatori al tavolo. */
1607 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1608 log_main("START LOOP");
1609 $user_cur = $this->user[$i];
1610 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1611 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1616 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1618 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1619 if ($user_cur->stat == "room") {
1620 log_main("DOCUMENT.index.php from table");
1622 $ret .= $this->table_content($user_cur, $table_idx);
1623 $ret .= $this->standup_content($user_cur);
1625 $ret .= $table->act_content($user_cur);
1628 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1629 if ($user_tab[$tab_idx] == $i)
1632 // for users that wakeup the room will be reconstructed by index_rd.php
1633 if ($tab_idx < $user_tab_n) {
1634 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1636 // ARRAY_POP DISABLED
1637 // if ($trans_delta == 0)
1638 // while (array_pop($user_cur->comm) != NULL);
1640 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1641 $user_cur->comm[$user_cur->step % COMM_N] = "";
1642 $user_cur->step_inc();
1643 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1644 $user_cur->step_inc();
1645 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1649 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1651 log_main("JOIN_WAKEUP more");
1653 $ret .= $table->act_content($user_cur);
1655 log_main("JOIN_WAKEUP end more");
1657 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1658 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1659 $user_cur->step_inc();
1663 function guarantee_show($user, $user_login, $dt)
1665 GLOBAL $G_lang, $mlang_brisk, $G_base;
1671 if ($user_login == "") {
1675 if (($bdb = BriskDB::create()) == FALSE) {
1679 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1683 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1684 $guar_login = $guar_item->login_get();
1689 $user_tos_vers = $user_item->tos_vers_get();
1691 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1692 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1694 else if ($guar_login == "") {
1695 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1697 else if ($guar_login == $user_login) {
1698 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1701 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1702 xcape($user_login), xcape($guar_login)));
1707 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1710 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1716 function room_outstandup($user)
1718 $this->room_sitdown($user, -1);
1721 function table_update($user)
1723 log_main("table_update: pre - USER: ".$user->name);
1725 $table_idx = $user->table;
1727 if ($table_idx > -1)
1728 $table = $this->table[$table_idx];
1730 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1732 $user_cur = $this->user[$i];
1733 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1736 $ret = "gst.st = ".($user_cur->step+1)."; ";
1737 if ($table_idx > -1)
1738 $ret .= $this->table_content($user_cur, $table_idx);
1740 if ($user->idx_get() == $i) {
1741 $ret .= $user->myname_innerHTML();
1743 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1744 $user_cur->step_inc();
1747 log_main("table_update: post");
1750 function room_sitdown($user, $table_idx)
1752 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1756 if ($table_idx > -1 && $table_idx < TABLES_N) {
1757 $table = $this->table[$table_idx];
1760 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1761 for ($i = 0 ; $i < TABLES_N ; $i++) {
1762 if ($table->wag_own == $table->player[$i]) {
1763 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1764 $table->wag_reset(time());
1771 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1773 $user_cur = $this->user[$i];
1774 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1777 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1778 if ($table_idx > -1)
1779 $ret .= $this->table_content($user_cur, $table_idx);
1780 $ret .= $this->standup_content($user_cur);
1782 if ($user->idx_get() == $i) {
1783 $ret .= 'subst = "sitdown"; tra.hide(); ';
1784 // clean the action buttons in other tables
1785 for ($e = 0 ; $e < TABLES_N ; $e++) {
1786 $ret .= $this->table[$e]->act_content($user_cur);
1789 else if ($table_idx > -1) {
1790 if ($table->player_n == PLAYERS_N) {
1792 $ret .= $table->act_content($user_cur);
1795 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1796 $user_cur->step_inc();
1800 function chatt_send($user, $mesg)
1802 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1806 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1808 $dt = date("H:i ", $curtime);
1819 $is_normchat = FALSE;
1820 /* for old isolation management $is_ticker = FALSE; */
1821 $update_room = FALSE;
1823 if (strcmp($msg, "/tav") == 0 ||
1824 strncmp($msg, "/tav ", 5) == 0) {
1826 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1827 /* 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>" */
1828 $msg = $mlang_brisk['tickmust'][$G_lang];
1829 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1834 $table = $this->table[$user->table];
1836 if ($table->wag_own != -1) {
1837 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1838 $msg = $mlang_brisk['tickjust'][$G_lang];
1839 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1844 $dtime = $curtime - $table->wag_tout;
1845 if ($dtime < EXPIRE_TIME_WAG) {
1846 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1847 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1848 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1849 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1854 $msg = substr($msg, 5);
1856 $table->wag_set($user->idx_get(), $msg);
1857 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1858 $to_room = $to_user;
1859 /* for old isolation management $is_ticker = TRUE; */
1861 } // /tav chat command
1863 else if (strncmp($msg, "/alarm ", 7) == 0) {
1864 if (strncmp($msg, "/alarm to ", 10) == 0) {
1865 $sp_pos = strpos($msg, " ", 10);
1866 $target = substr($msg, 10, $sp_pos - 10);
1867 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1871 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1874 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1875 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1876 $msg = $mlang_brisk['alarpass'][$G_lang];
1877 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1882 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1883 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1884 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1885 $to_user = nickserv_msg($dt, $prestr);
1887 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1888 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1889 /* MLANG: "chiudi" */
1890 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1892 } // /alarm chat command
1893 else if (strncmp($msg, "/listen ", 8) == 0) {
1894 $arg = substr($msg, 8);
1896 if (strcasecmp($arg, "isolation") == 0) {
1898 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1899 $user->table >= TABLES_AUTH_N) {
1900 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1904 $user->flags &= ~USER_FLAG_MAP_AUTH;
1905 $user->flags |= USER_FLAG_ISOLAUTH;
1906 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1909 else if (strcasecmp($arg, "auth") == 0) {
1910 $flags_old = $user->flags;
1911 $user->flags &= ~USER_FLAG_MAP_AUTH;
1912 $user->flags |= USER_FLAG_LISTAUTH;
1913 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1916 $flags_old = $user->flags;
1917 $user->flags &= ~USER_FLAG_MAP_AUTH;
1918 $to_user = 'list_set(\'all\', true, \'\'); ';
1921 // if from isolation redraw standup area
1922 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1923 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1927 else if (strcmp($msg, "/authreq") == 0) {
1928 if ($user->is_cert()) {
1929 $to_user = sprintf('authbox(300,200);');
1932 /* 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." */
1933 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1936 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1937 if ($user->is_auth()) {
1938 $to_user = sprintf('mesgtoadmbox(500,300);');
1941 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1942 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1945 else if (strncmp($msg, "/nick ", 6) == 0) {
1946 log_main("chatt_send BEGIN");
1949 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1950 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1954 $msg = "COMMAND ".$msg;
1955 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1956 $user_cur = $this->user[$i];
1958 if ($user_cur->is_active() == FALSE)
1960 if (strcasecmp($user_cur->name,$name_new) == 0)
1963 if ($i < MAX_PLAYERS) {
1964 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1965 $to_user = nickserv_msg($dt, $prestr);
1969 /* 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>" */
1970 if ($user->is_auth()) {
1971 if (strcasecmp($user->name,$name_new) != 0) {
1972 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1973 ($user->subst == 'standup' ||
1974 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
1977 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1978 for ($i = 0 ; $i < TABLES_N ; $i++) {
1979 $to_user .= $this->table[$i]->act_content($user);
1983 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
1988 $user->name = $name_new; // OK - nick changed
1989 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1990 if ( ! $user->is_auth() ) {
1991 if (($bdb = BriskDB::create()) != FALSE) {
1993 /* 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>" */
1994 if ($bdb->login_exists($name_new)) {
1995 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1996 $to_user .= nickserv_msg($dt, $prestr);
2001 log_main("chatt_send start set");
2003 $update_room = TRUE;
2005 } // nick chat command
2006 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2007 $guar_user = substr($msg, 6);
2009 $this->guarantee_show($user, $guar_user, $dt);
2011 else if (strncmp($msg, "/st ", 4) == 0) {
2012 log_main("chatt_send BEGIN");
2015 $st_str = substr($msg, 4);
2017 if (strcasecmp($st_str, "normale") == 0) {
2018 $st = USER_FLAG_S_NORM;
2020 else if (strcasecmp($st_str, "pausa") == 0) {
2021 $st = USER_FLAG_S_PAU;
2023 else if (strcasecmp($st_str, "fuori") == 0) {
2024 $st = USER_FLAG_S_OUT;
2026 else if (strcasecmp($st_str, "cane") == 0) {
2027 $st = USER_FLAG_S_DOG;
2029 else if (strcasecmp($st_str, "cibo") == 0) {
2030 $st = USER_FLAG_S_EAT;
2032 else if (strcasecmp($st_str, "lavoro") == 0) {
2033 $st = USER_FLAG_S_WRK;
2035 else if (strcasecmp($st_str, "sigaretta") == 0) {
2036 $st = USER_FLAG_S_SMK;
2038 else if (strcasecmp($st_str, "presente") == 0) {
2039 $st = USER_FLAG_S_EYE;
2041 else if (strcasecmp($st_str, "coniglio") == 0) {
2042 $st = USER_FLAG_S_RABB;
2044 else if (strcasecmp($st_str, "calcio") == 0) {
2045 $st = USER_FLAG_S_SOCC;
2047 else if (strcasecmp($st_str, "pupo") == 0) {
2048 $st = USER_FLAG_S_BABY;
2050 else if (strcasecmp($st_str, "pulizie") == 0) {
2051 $st = USER_FLAG_S_MOP;
2053 else if (strcasecmp($st_str, "babbo") == 0) {
2054 $st = USER_FLAG_S_BABBO;
2056 else if (strcasecmp($st_str, "renna") == 0) {
2057 $st = USER_FLAG_S_RENNA;
2059 else if (strcasecmp($st_str, "pupazzo") == 0) {
2060 $st = USER_FLAG_S_PUPAZ;
2062 else if (strcasecmp($st_str, "vischio") == 0) {
2063 $st = USER_FLAG_S_VISCH;
2066 /* MLANG: "Questo stato non esiste." */
2067 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2071 log_main("chatt_send start set");
2072 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2073 $update_room = TRUE;
2074 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2077 } // nick chat command
2079 else { // normal chat line
2080 $is_normchat = TRUE;
2081 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2083 $user->chat_dlt = $user->chat_dlt * 2;
2084 if ($user->chat_dlt > 120)
2085 $user->chat_dlt = 120;
2087 else if ($user->chat_lst == $msg)
2089 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2090 $user->chat_ban = $curtime;
2091 $user->chat_dlt = 5;
2095 $user->chat_ban = 0;
2096 $user->chat_dlt = 0;
2100 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2103 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2104 // temporary silentiation for troll (will became array check)
2105 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2106 $to_room = $to_user;
2109 log_legal($curtime, $user->ip, $user,
2110 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2112 $user->chat_lst = "$msg";
2113 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2123 // Output to clients
2126 if ($to_user != FALSE) {
2127 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2128 $user->comm[$user->step % COMM_N] .= $to_user;
2132 if ($to_room != FALSE) {
2133 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2134 $user_cur = $this->user[$i];
2135 if ($target != "" && $user_cur->name != $target)
2137 if ($user_cur->is_active() == FALSE // is not active user
2138 || $user_cur->stat == 'table' // or stat is 'table'
2139 || $user->idx_get() == $i) // or the $user idx is equal to current var
2142 if ($is_normchat == TRUE) {
2143 // use MAP_AUTH to check if auth or isolation
2144 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2145 if ( ! $user->is_auth() ) {
2151 else if ($is_ticker) {
2152 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2153 if ($user->table >= TABLES_AUTH_N)
2158 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2159 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2160 $user_cur->step_inc();
2165 // FIXME BRISK4: include for each kind of table
2166 require_once("${G_base}briskin5/Obj/briskin5.phh");
2167 // Before all align times with table timeout
2168 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2169 if (isset($this->match[$table_idx])) {
2170 $bin5 = $this->match[$table_idx];
2172 $bin5_table = $bin5->table[0];
2173 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2174 // stat must be "table" by definition
2175 $bin5_user = $bin5->user[$i];
2177 if ($target != "" && $bin5_user->name != $target)
2179 log_main("writa: ".$user_mesg);
2180 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2181 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2182 $bin5_user->step_inc();
2184 } // if (isset($this->match
2185 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2186 } // if ($to_tabl == true ...
2189 if ($user->stat == 'room' && $user->subst == 'standup') {
2190 $this->standup_update($user);
2192 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2193 log_main("chatt_send pre table update");
2194 $this->table_update($user);
2195 log_main("chatt_send post table update");
2197 } // if ($update_room ...
2200 } // function chatt_send( ...
2202 function get_user($sess, &$idx)
2206 if (validate_sess($sess)) {
2207 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2208 if ($this->user[$i]->is_empty())
2210 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2213 $ret = $this->user[$i];
2217 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2218 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2219 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2222 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2229 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2232 * if ($idx > -1 && ret == FALSE) => duplicated nick
2233 * if ($idx == -2 && ret == FALSE) => invalid name
2234 * if ($idx == -3 && ret == FALSE) => wrong password
2235 * if ($idx == -1 && ret == FALSE) => no space left
2236 * if ($idx == 0 && ret == user) => SUCCESS
2237 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
2240 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2246 $authenticate = FALSE;
2248 $login_exists = FALSE;
2250 $ghost_auth = FALSE;
2255 if (($name_new = validate_name($name)) == FALSE) {
2260 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2261 if (validate_sess($sess) == FALSE)
2264 /* if pass != FALSE verify the login with pass */
2265 log_auth("XXX", "auth1");
2267 if (($bdb = BriskDB::create()) != FALSE) {
2269 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2270 log_auth("XXX", "auth2");
2271 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2272 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2274 if ($authenticate != FALSE) {
2275 $user_type = $authenticate->type_get();
2283 $login_exists = $bdb->login_exists($name_new);
2287 // if db is down, send a warning and verify only current users
2288 // no actions at this moment
2290 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2292 if ($this->user[$i]->is_empty()) {
2293 if ($idfree == -1) {
2298 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2303 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2304 if ($authenticate != FALSE) {
2306 $ghost_auth = $this->user[$i]->is_auth();
2317 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2319 /* there is another user logged with your account and you and him have authenticated => new user
2320 get the session of the old user */
2321 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2324 $ghost_user = $this->user[$ghost];
2326 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2327 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2328 $ghost_user->step_inc();
2331 $ghost_user->sess = $sess;
2334 $ghost_user->sess = $sess;
2337 // If user at the table we need to update the table data too
2338 $table_idx = $ghost_user->table;
2339 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2340 require_once("${G_base}briskin5/Obj/briskin5.phh");
2341 if (isset($this->match[$table_idx])) {
2342 $bin5 = $this->match[$table_idx];
2344 if ($bin5->the_end != TRUE) {
2345 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2346 $bin5->user[$ghost_user->table_pos]->step_inc();
2347 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2353 if (defined('CURL_DE_SAC_VERS')) {
2354 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2356 return ($this->user[$ghost]);
2358 else if ($idx != -1 && $i == MAX_PLAYERS) {
2363 $this->user[$idx]->sess = $sess;
2366 $this->user[$idx]->sess = $sess;
2368 $this->user[$idx]->name = $name_new; // OK - add new user
2369 $this->user[$idx]->stat_set("room");
2370 $this->user[$idx]->step_set(0);
2371 while (array_pop($this->user[$idx]->comm) != NULL);
2372 $this->user[$idx]->subst = "standup";
2373 $this->user[$idx]->lacc = $curtime;
2374 $this->user[$idx]->laccwr = $curtime;
2375 $this->user[$idx]->bantime = 0;
2376 $this->user[$idx]->ip = $ip;
2378 $this->user[$idx]->rec = $authenticate;
2379 $this->user[$idx]->flags = $user_type;
2380 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2381 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2382 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2384 if ($authenticate != FALSE) {
2385 $this->user[$idx]->code = $authenticate->code_get();
2387 // all this part is included in the db server
2388 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2390 if (isset($cookie['CO_list'])) {
2391 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2392 if (strcmp($cookie['CO_list'], "auth") == 0) {
2393 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2394 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2396 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2397 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2398 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2401 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2406 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2409 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2411 log_main("ghost: rename!");
2412 $ghost_user = $this->user[$ghost];
2414 if ($ghost_auth == FALSE) {
2415 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2416 $ghostname = 'ghost'.$sfx;
2417 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2418 if (strcmp("", $this->user[$i]->sess) == 0)
2421 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2426 if ($ghostname != '')
2430 $ghost_user->name = $ghostname;
2432 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2433 $this->standup_update($ghost_user);
2436 log_main("chatt_send pre table update");
2437 $this->table_update($ghost_user);
2438 log_main("chatt_send post table update");
2440 } // if ($ghost_auth == FALSE
2442 // FIXME: cacciare il vecchio utente room && table (if needed)
2443 $ghost_user->the_end = TRUE;
2444 $ghost_user->lacc = 0;
2445 $this->garbage_manager(TRUE);
2447 } // if ($ghost > -1) {
2452 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));
2454 $ret = $this->user[$real_idx];
2455 if (defined('CURL_DE_SAC_VERS')) {
2456 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2464 function standup_update($user)
2466 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2467 $user_cur = $this->user[$i];
2468 if ($user_cur->is_active() == FALSE)
2471 log_main("STANDUP START: ".$user_cur->stat);
2473 if ($user_cur->stat == 'room') {
2474 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2475 if ($user->idx_get() == $i) {
2476 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2478 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2480 $user_cur->step_inc();
2485 function dump_data()
2487 $brisk_ser = serialize($this);
2488 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2489 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2496 function standup_content($user)
2500 if ($user->stat != 'room')
2503 $content = ' j_stand_cont( [ ';
2505 $user_cur_id = $user->idx_get();
2506 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2507 if ($this->user[$i]->is_active() == FALSE // is not active user
2508 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2509 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2512 $flags = $this->user[$i]->flags;
2514 // sql record exists AND last donate > 2013-01-01
2515 if ($this->user[$i]->is_supp_custom()) {
2516 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2522 if ($this->user[$i]->subst == "standup") {
2523 if ($user_cur_id == $i) {
2527 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2528 xcape($this->user[$i]->name), $supp_comp_s);
2537 function table_content($user, $table_idx)
2543 // Si possono usare i dati nella classe table
2546 $sess = $user->sess;
2547 $table = $this->table[$table_idx];
2549 if ($user->stat != 'room')
2552 $user_cur_id = $user->idx_get();
2554 for ($i = 0 ; $i < $table->player_n ; $i++) {
2555 $user_cur = $this->user[$table->player[$i]];
2557 $flags = $user_cur->flags;
2559 if ($user_cur_id == $table->player[$i])
2562 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2563 if ($user_cur->is_supp_custom())
2564 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2568 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2569 xcape($user_cur->name), $supp_comp_s);
2574 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2579 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2581 GLOBAL $G_ban_list, $G_black_list;
2583 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2584 $remote_addr = addrtoipv4($addr);
2586 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2587 if ($this->black_check($remote_addr)) {
2588 // TODO: waiting async 5 sec before close
2589 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2593 $enc = get_encoding($header);
2594 if (isset($header['User-Agent'])) {
2595 if (strstr($header['User-Agent'], "MSIE")) {
2596 $transp_type = "htmlfile";
2599 $transp_type = "xhr";
2603 $transp_type = "iframe";
2605 force_no_cache($header_out);
2611 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2612 $content = ob_get_contents();
2615 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2616 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2620 case "index_wr.php":
2622 // Enhance required: in the POST case, after the header you must get content
2623 // from the socket, waiting if necessary
2627 index_wr_main($this, $addr, $get, $post, $cookie);
2628 $content = ob_get_contents();
2631 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2635 case "index_rd.php":
2636 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2638 if ($transp == 'websocket')
2642 if (!isset($cookie['sess'])
2643 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2645 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2647 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2652 $this->sess_cur_set($user->sess);
2653 // close a previous opened index_read_ifra socket, if exists
2654 if (($prev = $user->rd_socket_get()) != NULL) {
2655 $s_a_p->socks_unset($user->rd_socket_get());
2656 fclose($user->rd_socket_get());
2657 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2658 $user->rd_socket_set(NULL);
2662 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2663 $response = headers_render($header_out, -1).$user->chunked_content($content);
2664 $response_l = mb_strlen($response, "ASCII");
2666 $wret = @fwrite($new_socket, $response, $response_l);
2667 if ($wret < $response_l) {
2668 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2669 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2672 $user->rd_cache_set("");
2674 fflush($new_socket);
2677 $s_a_p->socks_set($new_socket, $user, NULL);
2678 $user->rd_socket_set($new_socket);
2679 printf(" - qui ci siamo - ");
2686 if (!(BRISK_DEBUG & DBG_ENGI))
2688 fprintf(STDERR, "TEST.PHP running\n");
2689 if (isset($post['data'])) {
2690 $content = $post['data'];
2693 $content = "NO DATA AVAILABLE";
2695 $header_out['Content-Type'] = 'text/plain';
2696 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2700 /* FAR TODO: move all into an array of registered sub-apps */
2701 $subs = "briskin5/";
2702 $subs_l = strlen($subs);
2703 if (!strncmp($path, $subs, $subs_l)) {
2704 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2713 function match_add($idx, $match)
2715 $this->match[$idx] = $match;
2718 function match_del($idx)
2720 unset($this->match[$idx]);
2723 function match_get($idx, $token)
2725 if (isset($this->match[$idx])) {
2727 || $token == $this->match[$idx]->table_token) {
2728 return ($this->match[$idx]);
2733 function sess_cur_set($sess)
2735 static::$sess_cur = $sess;
2738 static function sess_cur_get()
2740 return(static::$sess_cur);
2742 } // end class Brisk
2744 function make_seed()
2746 list($usec, $sec) = explode(' ', microtime());
2747 return (float) $sec + ((float) $usec * 100000);
2750 function btrace_line($ar)
2752 GLOBAL $G_btrace_pref_sub;
2755 for ($i = 0 ; $i < count($ar) ; $i++) {
2756 $with_class = isset($ar[$i]['class']);
2757 $with_file = isset($ar[$i]['file']);
2758 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2759 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2760 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2761 ($with_file ? $ar[$i]['line'] : ""));
2767 function trace_ftok($id, $add)
2769 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2770 $tok=@ftok($id, $add);
2772 log_shme($tok.": ".$id." + ".$add);
2777 function log_mop($step, $log)
2781 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2784 $sess = Brisk::sess_cur_get();
2785 if (isset($sess) == FALSE)
2790 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2793 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2794 $btrace = btrace_line(debug_backtrace());
2797 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2798 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2803 function log_step($log)
2807 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2810 $sess = Brisk::sess_cur_get();
2811 if (isset($sess) == FALSE)
2816 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2819 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2820 $btrace = btrace_line(debug_backtrace());
2823 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2824 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2831 function log_cds($log)
2835 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2838 $sess = Brisk::sess_cur_get();
2839 if (isset($sess) == FALSE)
2844 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2847 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2848 $btrace = btrace_line(debug_backtrace());
2851 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2852 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2858 function log_only2($log)
2862 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2865 $sess = Brisk::sess_cur_get();
2866 if (isset($sess) == FALSE)
2871 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2874 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2875 $btrace = btrace_line(debug_backtrace());
2878 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2879 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2884 function log_crit($log)
2888 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2891 $sess = Brisk::sess_cur_get();
2892 if (isset($sess) == FALSE)
2897 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2900 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2901 $btrace = btrace_line(debug_backtrace());
2904 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2905 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2910 function log_only($log)
2914 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2917 $sess = Brisk::sess_cur_get();
2918 if (isset($sess) == FALSE)
2923 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2926 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2927 $btrace = btrace_line(debug_backtrace());
2930 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2931 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2936 function log_main($log)
2940 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2943 $sess = Brisk::sess_cur_get();
2944 if (isset($sess) == FALSE)
2949 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2952 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2953 $btrace = btrace_line(debug_backtrace());
2956 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2957 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2962 function log_rd($log)
2966 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2969 $sess = Brisk::sess_cur_get();
2970 if (isset($sess) == FALSE)
2975 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2978 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2979 $btrace = btrace_line(debug_backtrace());
2982 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2983 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2988 function log_rd2($log)
2992 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2995 $sess = Brisk::sess_cur_get();
2996 if (isset($sess) == FALSE)
3001 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3004 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3005 $btrace = btrace_line(debug_backtrace());
3009 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3010 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3015 function log_send($log)
3019 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3022 $sess = Brisk::sess_cur_get();
3023 if (isset($sess) == FALSE)
3028 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3031 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3032 $btrace = btrace_line(debug_backtrace());
3035 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3036 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3041 function log_lock($log)
3045 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3048 $sess = Brisk::sess_cur_get();
3049 if (isset($sess) == FALSE)
3054 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3057 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3058 $btrace = btrace_line(debug_backtrace());
3061 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3062 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3067 function log_wr($log)
3071 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3074 $sess = Brisk::sess_cur_get();
3075 if (isset($sess) == FALSE)
3080 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3083 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3084 $btrace = btrace_line(debug_backtrace());
3087 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3088 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3093 function log_load($log)
3097 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3100 $sess = Brisk::sess_cur_get();
3101 if (isset($sess) == FALSE)
3106 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3109 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3110 $btrace = btrace_line(debug_backtrace());
3113 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3114 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3119 function log_auth($sess, $log)
3123 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3126 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3129 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3130 $btrace = btrace_line(debug_backtrace());
3133 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3134 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3139 function log_shme($log)
3143 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3146 $sess = Brisk::sess_cur_get();
3147 if (isset($sess) == FALSE)
3152 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3155 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3156 $btrace = btrace_line(debug_backtrace());
3159 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3160 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3167 // function log_legal($curtime, $sess, $name, $where, $mesg)
3168 function log_legal($curtime, $addr, $user, $where, $mesg)
3171 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3172 /* Unix time | session | nickname | IP | where was | mesg */
3173 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3174 ($user->is_auth() ? 'A' : 'N'),
3175 $user->name, $addr, $where , $mesg));
3180 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3185 if ($sitted < PLAYERS_N) {
3193 if ($table == $cur_table)
3200 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3205 function show_notify($text, $tout, $butt, $w, $h)
3207 log_main("SHOW_NOTIFY: ".$text);
3208 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3211 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3213 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3214 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);
3217 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3219 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3222 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3223 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3226 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3227 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);
3231 function root_welcome($user)
3233 GLOBAL $root_wellarr, $G_lang;
3237 $dt = date("H:i ", $curtime);
3239 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3240 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3247 function validate_sess($sess)
3249 if (strlen($sess) == SESS_LEN)
3255 function validate_name($name)
3257 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3259 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3261 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3268 function playsound($filename)
3270 return (sprintf('playsound("flasou", "%s");', $filename));
3273 function secstoword($secs)
3279 $mins = floor($secs / 60);
3281 if ($G_lang == 'en') {
3283 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3286 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3290 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3293 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3298 function sharedmem_sz($tok)
3300 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3301 log_main("shmop_open failed");
3304 $shm_sz = shmop_size($shm_id);
3305 shmop_close($shm_id);
3307 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3314 static function lock_data($is_exclusive)
3316 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3317 self::$delta_t = microtime(TRUE);
3318 log_lock("LOCK warrant [".self::$delta_t."]");
3326 static function unlock_data($res)
3330 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3339 static function lock_data($is_exclusive)
3341 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3342 self::$delta_t = microtime(TRUE);
3343 log_lock("LOCK poll [".self::$delta_t."]");
3351 static function unlock_data($res)
3355 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3361 function carousel_top()
3366 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));
3369 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>'));