5 * Copyright (C) 2006-2013 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', 0x0001);
68 define('DBG_ONLY', 0x0002);
69 define('DBG_MAIN', 0x0004);
70 define('DBG_READ', 0x0008);
71 define('DBG_REA2', 0x0010);
72 define('DBG_SEND', 0x0020);
73 define('DBG_LOCK', 0x0040);
74 define('DBG_WRIT', 0x0080);
75 define('DBG_LOAD', 0x0100);
76 define('DBG_AUTH', 0x0200);
77 define('DBG_CRIT', 0x0400);
78 define('DBG_LMOP', 0x0800);
79 define('DBG_TRAC', 0x1000);
80 define('DBG_SHME', 0x2000);
81 define('DBG_ENGI', 0x4000);
82 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
83 define('BRISK_DEBUG', 0x0800);
85 define('BRISK_SINGLE_DEBUG',0);
86 define('BRISK_SINGLE_SESS', "");
87 define('DEBUGGING', "no-debugging");
89 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
91 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
92 'en' => 'back standing' ),
93 'btn_close' => array( 'it' => 'chiudi',
96 'tit_all' => array( 'it' => 'tutti',
99 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
100 'en' => '<br>You are being idle for ' ),
101 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
102 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
103 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
104 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
105 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
106 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
107 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
108 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
109 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
110 'en' => '<br>The entered password is not correct.<br><br>'),
111 'alarret' => array( 'it' => '"Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>."',
112 'en' => '"Alarm \\"<b>%s</b>\\" sent to <b>%s</b>."'),
113 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
114 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
115 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
116 'en' => '<b>To send a message you have to be authenticated.</b>'),
117 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
118 'en' => 'The nickname have to contain at least one letter or one number.'),
119 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
120 'en' => 'The nickname <b>%s</b> is already in use.'),
121 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
122 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
123 '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>',
124 '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 ???
125 'statunkn' => array( 'it' => 'Questo stato non esiste.',
126 'en' => 'This state don\'t exists.'),
127 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
128 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
129 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
130 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
132 'tit_onauth'=>array( 'it' => '(solo aut.)',
133 'en' => '(only aut.)'),
134 'tit_onisol'=>array( 'it' => '(isolam.to)',
135 'en' => '(isolation)'),
136 '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.',
137 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
139 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
140 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
141 'gua_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
142 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
143 'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
144 'en' => 'EN <b>%s</b> si è auto-garantito.'),
145 'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
146 'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
147 'gua_err' => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i><login></i></b>.',
148 'en' => 'Error %d. Usage: <b>/guar <i><login></i></b>.')
151 $G_lng = langtolng($G_lang);
153 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
154 $G_brisk_version = "4.14.3";
156 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
157 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: nuovo sistema di registrazione degli utenti, aggiunto reinvio dell\' email di verifica, ban con classi di IP',
158 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
159 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: new users subscription system.',
160 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
162 $G_room_help = array( 'it' => '
163 <div style=\\"text-align: left; padding: 8px;\\">
164 <b>Descrizione</b><br>
165 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
166 <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>
167 <b>Configurazione del browser.</b><br>
168 Occorre abilitare i cookies.<br>
170 <b>Uso del sito</b><br>
171 Potete sedervi a un tavolo o rimanere in piedi.<br>
172 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
175 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>
176 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
177 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
178 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
179 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
180 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.
182 <dt><b>Comandi della chat</b>
183 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
184 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
185 <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\\"
186 <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
187 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
188 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
189 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
190 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
196 <div style=\\"text-align: left; padding: 8px;\\">
197 <b>EN Descrizione</b><br>
198 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
199 <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>
200 <b>Configurazione del browser.</b><br>
201 Occorre abilitare i cookies.<br>
203 <b>Uso del sito</b><br>
204 Potete sedervi a un tavolo o rimanere in piedi.<br>
205 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
208 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>
209 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
210 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
211 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
212 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
213 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.
215 <dt><b>Comandi della chat</b>
216 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
217 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
218 <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\\"
219 <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
220 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
221 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
222 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
223 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
229 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
230 <div style=\\"text-align: left; padding: 8px;\\">
231 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
233 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
234 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
236 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
237 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
238 <li>Smart card di InfoCamere
241 <b>Per auto-garantisi occorre possedere:</b><br><br>
243 <li>il codice PIN della propria carta
244 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
247 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
249 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
250 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
251 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
252 diretta dell\' utente da parte dell\' amministratore.
257 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
258 <div style=\\"text-align: left; padding: 8px;\\">
259 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
261 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
262 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
264 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
265 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
268 <b>Per auto-garantisi occorre possedere:</b><br><br>
270 <li>il codice PIN della propria carta
271 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
274 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
276 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
277 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
278 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
279 diretta dell\' utente da parte dell\' amministratore.
286 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
290 $G_room_about = array( 'it' => '<br>
291 <div id=\\"header\\" class=\\"header\\">
292 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
293 briscola chiamata in salsa ajax
295 <br><b>version '.$G_brisk_version.'</b><br><br>
296 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
298 <div id=\\"header\\" class=\\"header\\">
299 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
300 declaration briscola in ajax sauce <b>(Beta)</b>
302 <br><b>version '.$G_brisk_version.'</b><br><br>
303 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
306 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
309 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
310 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
311 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
312 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
313 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
314 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
315 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
316 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
317 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
318 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
319 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
320 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
321 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
322 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
323 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
324 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
325 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
326 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
327 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
329 // $G_PG_cons_n = count($G_PG_cons);
330 // printf("N CONS: %d\n", $G_PG_cons_n);
332 /* printf("%d %d\n", count($voc), count($cons)); */
333 /* for ($i = 0 ; $i < 26 ; $i++) { */
334 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
336 /* printf(' "%s", ', chr(ord('a') + $i)); */
337 /* for ($e = 0 ; $e < 26 ; $e++) { */
338 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
340 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
345 function nickserv_msg($dt, $msg) {
346 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
349 function passwd_gen($seed = NULL)
351 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
360 for ($sil = 0 ; $sil < 7 ; $sil++) {
361 if (($sil % 2) == 0) {
363 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
365 $old = mt_rand(0, $G_PG_vow_n-1);
366 $pw .= $G_PG_vow[$old];
369 $new = mt_rand(0, $G_PG_vow_n-1);
371 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
372 $pw .= $G_PG_vow[$new];
378 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
385 function cmd_return($val, $desc)
387 return array('val' => $val, 'desc' => $desc);
390 function cmd_serialize($attrs)
395 foreach ($attrs as $key => $value) {
396 $ret .= $sep . $key . '=' . urlencode($value);
402 function cmd_deserialize($cmd)
405 $a = explode('&', $cmd);
407 while ($i < count($a)) {
408 $b = split('=', $a[$i]);
409 $ret[urldecode($b[0])] = urldecode($b[1]);
420 function versions_cmp($v1, $v2)
422 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
426 $v1_ar = split('\.', $v1);
427 $v2_ar = split('\.', $v2);
429 $v2_ct = count($v2_ar);
431 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
432 if (($v2_ct - 1) < $i) {
435 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
436 if ($v1_ar[$i] != $v2_ar[$i]) {
437 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
446 function addrtoipv4($addr)
448 $ipv4addr_arr = explode(':' , $addr);
449 if (isset($ipv4addr_arr[3])) {
450 $ipv4addr = $ipv4addr_arr[3];
460 for ($i = 0; $i < ob_get_level(); $i++)
462 ob_implicit_flush(1);
466 function force_no_cache(&$header_out)
468 $header_out['Pragma'] = 'no-cache, must-revalidate';
469 $header_out['Cache-Control'] = 'no-cache';
470 $header_out['Expires'] = '-1';
473 function file_lock($fname, $is_exclusive)
475 if (($res = @fopen($fname, "r+")) == FALSE) {
479 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
487 function file_unlock($res)
490 flock($res, LOCK_UN);
495 $escpush_from = array("\\", "\"");
496 $escpush_to = array("\\\\", "\\\"");
499 GLOBAL $escpush_from, $escpush_to;
501 return str_replace($escpush_from, $escpush_to, $s);
504 $escinp_from = array( "\"" );
505 $escinp_to = array( """ );
507 function escinput($s)
509 GLOBAL $escinp_from, $escinp_to;
511 return str_replace($escinp_from, $escinp_to, $s);
516 return htmlentities($s, ENT_COMPAT, "UTF-8");
519 function esclfhtml($s)
521 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
524 function langtolng($lang)
528 return ($G_lang == 'en' ? '-en' : '');
531 function csplitter($in, $sep)
537 for ($i = 0 ; $i < strlen($in) ; $i++) {
538 $ini = substr($in, $i, 1);
542 else if ($ini == $sep) {
561 $from = array ( '\\', '@', '|' );
562 $to = array ( '\\\\', '@', '¦' );
564 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
569 $from = array ( '\\', '|', "\t", "\n");
570 $to = array ( '\\\\', '\\|', "\\t", "\\n");
572 return (str_replace($from, $to, $s));
575 function xcapemesg($s)
577 $from = array ( "\n");
578 $to = array ( "\\n");
580 return (str_replace($from, $to, $s));
588 function IPClass($ipset)
591 $elem = split("/", $ipset, 2);
593 $mask = (int)$elem[1];
597 $this->mask = ((1<<($mask))-1) << (32 - $mask);
598 $this->addr = ip2long($addr) & $this->mask;
600 fprintf(STDERR, "New ipclass: %x (%x)\n", $this->addr, $this->mask);
605 fprintf(STDERR, "IP: %x, ADDR: %x, MASK: %x -> (%d)\n",
606 $ip, $this->addr, $this->mask, ((ip2long($ip) & $this->mask) == $this->addr));
607 return (($ip & $this->mask) == $this->addr);
617 function getbyid($idx)
619 return ($this->el[$idx]);
622 function setbyid($idx, $v)
624 $this->el[$idx] = $v;
628 define('TABLE_AUTH_TY_PUBL', 0);
629 define('TABLE_AUTH_TY_AUTH', 1);
630 define('TABLE_AUTH_TY_CERT', 2);
638 var $auth_type; // required authorization to sit down
645 var $table_start; // information field
653 function create($idx)
655 if (($thiz = new Table()) == FALSE)
659 $thiz->player = array();
662 if ($idx < TABLES_CERT_N)
663 $thiz->auth_type = TABLE_AUTH_TY_CERT;
664 else if ($idx < TABLES_AUTH_N)
665 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
667 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
673 $thiz->table_token = "";
674 $thiz->table_start = 0;
676 $thiz->wakeup_time = 0;
683 $this->idx = $from->idx;
684 $this->player = array();
685 for ($i = 0 ; $i < $from->player_n ; $i++)
686 $this->player[$i] = $from->player[$i];
687 $this->player_n = $from->player_n;
689 log_main("PLAYER_N - parent::copy.".$this->player_n);
691 $this->auth_type = $from->auth_type;
693 $this->wag_own = $from->wag_own;
694 $this->wag_com = $from->wag_com;
695 $this->wag_tout = $from->wag_tout;
697 $this->table_token = $from->table_token;
698 $this->table_start = $from->table_start;
700 $this->wakeup_time = $from->wakeup_time;
703 function myclone($from)
705 if (($thiz = new Table()) == FALSE)
713 function spawn($from)
715 if (($thiz = new Table()) == FALSE)
718 $thiz->idx = $from->idx;
719 $thiz->player = array();
720 for ($i = 0 ; $i < $from->player_n ; $i++)
721 $thiz->player[$i] = $i;
722 $thiz->player_n = $from->player_n;
724 $thiz->auth_type = $from->auth_type;
726 $thiz->wag_own = $from->wag_own;
727 $thiz->wag_com = $from->wag_com;
728 $thiz->wag_tout = $from->wag_tout;
730 $thiz->table_token = $from->table_token;
731 $thiz->table_start = $from->table_start;
733 $thiz->wakeup_time = $from->wakeup_time;
738 function wag_set($user_idx, $mesg)
742 $this->wag_own = $user_idx;
743 $this->wag_com = $mesg;
747 function wag_reset($timeout)
749 log_main("WAG_RESET");
751 unset($this->wag_own);
754 $this->wag_tout = $timeout;
757 function player_get($idx)
759 return ($this->player[$idx]);
762 function player_set($idx, $player)
764 $this->player[$idx] = $player;
767 function user_add($idx)
769 $this->player[$this->player_n] = $idx;
772 return ($this->player_n - 1);
775 function user_rem($brisk, $user)
777 $tabpos = $user->table_pos;
779 /* verifico la consistenza dei dati */
780 if ($brisk->user[$this->player[$tabpos]] == $user) {
782 /* aggiorna l'array dei giocatori al tavolo. */
783 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
784 $this->player[$i] = $this->player[$i+1];
785 $user_cur = $brisk->user[$this->player[$i]];
786 $user_cur->table_pos = $i;
791 log_main("INCONSISTENCY ON TABLE.");
795 // Table->act_content - return 'id' of type of output required for table button
796 function act_content($user)
799 $isstanding = ($user->subst == 'standup');
800 $sitted = $this->player_n;
802 $cur_table = $user->table;
806 if ($sitted < PLAYERS_N) {
807 switch ($this->auth_type) {
808 case TABLE_AUTH_TY_CERT:
809 if ($user->is_cert())
814 case TABLE_AUTH_TY_AUTH:
815 if ($user->is_auth())
830 if ($table == $cur_table)
837 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
850 function Delay_Manager($triglevel)
852 $this->triglevel = $triglevel;
853 $this->delta = array();
854 $this->lastcheck = 0;
857 function delta_get($curtime)
859 // clean too old delta items
860 for ($i = 0 ; $i < count($this->delta) ; $i++) {
861 if ($this->delta[$i][0] < $curtime) {
862 array_splice($this->delta, $i, 1);
867 // add new delta items if delay exceeded $this->triglevel sec
868 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
869 $delta = $curtime - $this->lastcheck - $this->triglevel;
870 array_push($this->delta, array($curtime + $delta , $delta));
871 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
874 // extract the maximum valid delta
876 for ($i = 0 ; $i < count($this->delta) ; $i++) {
877 $delta_cur = $this->delta[$i][1];
878 if ($delta_max < $delta_cur)
879 $delta_max = $delta_cur;
882 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
887 function lastcheck_set($curtime)
889 $this->lastcheck = $curtime;
897 function Client_prefs()
901 static function from_user($user)
903 $thiz = new Client_prefs();
904 $thiz->user_load($user);
909 static function from_json($json)
911 $thiz = new Client_prefs();
912 if ($thiz->json_load($json) == FALSE) {
920 function user_load($user)
922 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
923 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
924 if ($user->rec != FALSE) {
925 $this->supp_comp = $user->rec->supp_comp_get();
928 $this->supp_comp = "000000000000";
931 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
934 function json_load($json_s)
939 if (gettype($json_s) == "string") {
940 if (($json = json_decode($json_s)) == FALSE)
946 if ($this->listen < 0 || $this->listen > 2)
948 $this->listen = $json->listen;
950 if (mb_strlen($json->supp_comp, "ASCII") != 12)
953 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
954 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
955 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
961 $this->supp_comp = $json->supp_comp;
968 function store($user, $is_save)
971 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
972 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
973 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
974 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
976 if ($user->is_supp_custom()) {
977 $user->rec->supp_comp_set($this->supp_comp);
980 $user->prefs_store();
989 var $crystal_filename;
993 var $comm; // commands for many people
994 var $step; // current step of the comm array
995 var $garbage_timeout;
998 var $ban_list; // ban list (authized allowed)
999 var $black_list; // black list (anti-dos, noone allowed)
1003 public static $sess_cur;
1010 static function create($crystal_filename, $ban_list, $black_list) {
1011 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1012 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1013 fprintf(STDERR, "ROOM FROM FILE\n");
1014 rename($crystal_filename, $crystal_filename.".old");
1016 $brisk->reload($ban_list, $black_list);
1022 fprintf(STDERR, "NEW ROOM\n");
1023 $thiz = new Brisk();
1025 $thiz->crystal_filename = $crystal_filename;
1026 $thiz->user = array();
1027 $thiz->table = array();
1028 $thiz->match = array();
1030 $thiz->ban_list = NULL;
1031 $thiz->black_list = NULL;
1033 fprintf(STDERR, "PRE IPCLASS_UPDATE (%d, %d)\n", count($ban_list), count($black_list));
1034 $thiz->ipclass_update('ban_list', $ban_list);
1035 $thiz->ipclass_update('black_list', $black_list);
1036 fprintf(STDERR, "POST IPCLASS_UPDATE %d %d\n", count($thiz->ban_list), count($thiz->black_list));
1038 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1039 $thiz->user[$i] = User::create($thiz, $i, "", "");
1042 for ($i = 0 ; $i < TABLES_N ; $i++) {
1043 $thiz->table[$i] = Table::create($i);
1045 $thiz->garbage_timeout = 0;
1046 $thiz->shm_sz = SHM_DIMS_MIN;
1048 $thiz->delay_mgr = new Delay_Manager(1.5);
1050 static::$sess_cur = FALSE;
1055 function ipclass_update($ip_out_s, $ip_in)
1057 fprintf(STDERR, "N_IN: %d\n", count($ip_in));
1059 $ip_out = &$this->$ip_out_s;
1061 // if already set clean the ban_list property
1063 $ct = count($ip_out);
1064 for ($i = 0 ; $i < $ct ; $i++) {
1071 for ($i = 0 ; $i < count($ip_in) ; $i++) {
1072 $ip_out[$i] = new IPClass($ip_in[$i]);
1076 function reload($ban_list, $black_list)
1078 fprintf(STDERR, "RELOAD STUFF (%d)(%d)\n", count($ban_list), count($black_list));
1080 $this->ipclass_update("ban_list", $ban_list);
1081 $this->ipclass_update("black_list", $black_list);
1083 $this->banned_kickoff();
1084 $this->garbage_manager(TRUE);
1087 function banned_kickoff()
1091 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1092 $table_cur = $this->table[$table_idx];
1093 // if the table is complete and exists we check users IP
1095 if ($table_cur->player_n == PLAYERS_N) {
1096 if (isset($this->match[$table_idx]) &&
1097 $table_cur->table_token == $bin5->table_token) {
1098 log_main("PLAYERS == N TABLE ".$table_idx);
1100 $bin5 = $this->match[$table_idx];
1102 $is_ban |= $bin5->banned_kickoff();
1107 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1108 $user_cur = $this->user[$i];
1110 if ($user_cur->sess == "")
1113 // check if the IP is blacklisted
1114 if ($this->black_check($user_cur->ip)) {
1115 $user_cur->lacc = 0;
1120 // if authorized not check if banlisted
1121 if ($user_cur->is_auth()) {
1125 if ($this->ban_check($user_cur->ip)) {
1126 $user_cur->lacc = 0;
1134 function ban_check($ip_str)
1136 $ip = ip2long($ip_str);
1137 fprintf(STDERR, "Brisk::ban_check %d\n", count($this->ban_list));
1138 for ($i = 0 ; $i < count($this->ban_list) ; $i++) {
1139 fprintf(STDERR, "ban_list[%d] = %x (%x)\n", $i,
1140 $this->ban_list[$i]->addr, $this->ban_list[$i]->mask);
1141 if ($this->ban_list[$i]->match($ip)) {
1142 fprintf(STDERR, "\n\nMATCHA!\n\n");
1149 function black_check($ip_str)
1151 $ip = ip2long($ip_str);
1152 fprintf(STDERR, "Brisk::black_check %d\n", count($this->black_list));
1153 for ($i = 0 ; $i < count($this->black_list) ; $i++) {
1154 fprintf(STDERR, "black_list[%d] = %x (%x)\n", $i,
1155 $this->black_list[$i]->addr, $this->black_list[$i]->mask);
1156 if ($this->black_list[$i]->match($ip)) {
1157 fprintf(STDERR, "\n\nMATCHA!\n\n");
1164 function garbage_manager($force)
1166 GLOBAL $G_lang, $mlang_brisk, $G_base;
1170 log_rd2("garbage_manager START");
1172 /* Garbage collector degli utenti in timeout */
1173 $curtime = microtime(TRUE);
1175 $delta = $this->delay_mgr->delta_get($curtime);
1177 if (!$force && !($this->garbage_timeout < $curtime)) {
1178 $this->delay_mgr->lastcheck_set($curtime);
1182 // Before all align times with table timeout
1183 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1184 $table_cur = $this->table[$table_idx];
1185 // if the table is complete and exists its shared mem we get the info about users lacc
1187 if ($table_cur->player_n == PLAYERS_N) {
1188 log_main("PLAYERS == N TABLE ".$table_idx);
1191 $no_recovery = FALSE;
1192 if (isset($this->match[$table_idx])) {
1193 $bin5 = $this->match[$table_idx];
1195 if ($table_cur->table_token != $bin5->table_token) {
1196 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1197 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1198 $no_recovery = TRUE;
1202 if ($bin5 != FALSE) {
1206 log_main("garbage_manager: bri loaded successfully.");
1207 $bin5->garbage_manager(TRUE);
1209 $bin5_table = $bin5->table[0];
1211 // is the end of the table
1213 if ($bin5->the_end == TRUE) {
1215 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1217 log_main("garbage_manager: INSIDE THE END.");
1219 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1220 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1221 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1224 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1225 // stat must be "table" by definition
1226 $user_cur = $this->user[$table_cur->player[$i]];
1227 $bin5_user = $bin5->user[$i];
1229 $user_cur->subst = $bin5_user->subst;
1230 $user_cur->step = $bin5_user->step;
1231 $user_cur->lacc = $bin5_user->lacc;
1232 $user_cur->laccwr = $bin5_user->lacc;
1233 $user_cur->bantime = $bin5_user->bantime;
1236 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1238 $this->room_join_wakeup($user_cur, FALSE, 0);
1239 $table_cur->table_token = "";
1240 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1242 $this->match_del($table_idx);
1245 log_main("gm:: save_data");
1247 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1248 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1251 } // if ($bin5 == FALSE
1252 else if ($no_recovery == FALSE) {
1253 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1255 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1256 $user_cur = $this->user[$table_cur->player[$i]];
1257 $user_cur->subst = "shutdowner";
1258 $user_cur->step_inc();
1260 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1261 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1262 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1263 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1264 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1265 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1266 $user_cur->step_inc();
1269 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1270 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1271 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1273 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1275 $this->room_join_wakeup($user_cur, TRUE, -2);
1276 $table_cur->table_token = "";
1279 } // if ($table_cur->player_n == PLAYERS_N) {
1280 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1282 log_rd2("out new loop.");
1284 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1285 $user_cur = $this->user[$i];
1287 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1289 if ($user_cur->sess == "")
1292 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1293 // Auto logout dell'utente
1294 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1296 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1297 log_auth($user_cur->sess, "Autologout session.");
1301 log_rd2("AUTO LOGOUT.");
1302 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1303 $this->room_wakeup($user_cur);
1304 else if ($user_cur->subst == 'standup')
1305 $this->room_outstandup($user_cur);
1307 log_rd2("LOGOUT FROM WHAT ???");
1311 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1312 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1313 $this->room_wakeup($user_cur);
1314 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1315 /* 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" */
1316 $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);
1317 $user_cur->step_inc();
1321 log_rd2("GARBAGE UPDATED!");
1323 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1326 $this->delay_mgr->lastcheck_set($curtime);
1330 function show_room($user_step, $user)
1332 GLOBAL $G_lang, $mlang_brisk;
1333 log_main("show_room: username: ".$user->name);
1335 $ret = sprintf('gst.st = %d; ', $user_step);
1337 $prefs = Client_prefs::from_user($user);
1338 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1341 if ($user->flags & USER_FLAG_ISOLAUTH) {
1342 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1344 else if ($user->flags & USER_FLAG_LISTAUTH) {
1345 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1348 $ret .= 'list_set(\'all\', false, \'\' ); ';
1352 if ($user->subst == 'standup')
1353 $ret .= "tra.show(); ";
1355 $ret .= "tra.hide(); ";
1357 $ret .= sprintf('stat = "%s";', $user->stat);
1359 $ret .= root_welcome($user);
1360 if ($user->flags & USER_FLAG_DBFAILED) {
1361 $ret .= "gst.st = ".($user->step+1)."; ";
1362 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1365 $ret .= sprintf('subst = "%s";', $user->subst);
1366 $ret .= $user->myname_innerHTML();
1368 for ($i = 0 ; $i < TABLES_N ; $i++) {
1370 $ret .= $this->table_content($user, $i);
1372 $ret .= $this->table[$i]->act_content($user);
1373 if ($this->table[$i]->wag_own != -1)
1374 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1376 $ret .= sprintf('tra.rem(%d); ', $i);
1378 $ret .= $this->standup_content($user);
1379 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1385 function room_wakeup($user)
1387 $table_idx = $user->table;
1388 $table = $this->table[$table_idx];
1390 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1394 $from_table = ($user->stat == "table");
1396 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1398 for ($i = 0 ; $i < $table->player_n ; $i++) {
1399 $user_cur = $this->user[$table->player[$i]];
1400 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1402 if ($user->idx_get() != $table->player[$i]) {
1403 $user_cur->stat_set("room");
1404 $user_cur->subst = "sitdown";
1405 $user_cur->laccwr = $curtime;
1407 else if ($user->sess != "") {
1408 $user_cur->stat_set("room");
1409 $user_cur->subst = "standup";
1410 $user_cur->laccwr = $curtime;
1411 $user_cur->table = -1;
1416 $user->stat_set("room");
1417 $user->subst = "standup";
1418 $user->laccwr = $curtime;
1421 $remove_wagon = FALSE;
1422 if($table->wag_own == $user->idx_get()) {
1423 $table->wag_reset($curtime);
1424 $remove_wagon = TRUE;
1428 /* aggiorna l'array dei giocatori al tavolo. */
1429 $table->user_rem($this, $user);
1431 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1432 $user_cur = $this->user[$i];
1433 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1436 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1438 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1439 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1440 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1441 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1442 log_main("DOCUMENT.index.php: from table");
1444 else if ($user_cur->stat == "room") {
1445 log_main("DOCUMENT.index.php: from table");
1447 $ret .= $this->table_content($user_cur, $table_idx);
1448 $ret .= $this->standup_content($user_cur);
1450 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1451 $ret .= $table->act_content($user);
1453 if ($user->idx_get() == $i) {
1454 // set the new status
1455 $ret .= 'subst = "standup"; tra.show(); ';
1456 // clean the action buttons in other tables
1457 for ($e = 0 ; $e < TABLES_N ; $e++) {
1458 if ($this->table[$e]->player_n < PLAYERS_N) {
1459 $ret .= $this->table[$e]->act_content($user);
1464 $ret .= $table->act_content($user_cur);
1467 log_wr("ROOM_WAKEUP: ".$ret);
1468 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1469 $user_cur->step_inc();
1473 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1475 $table_idx = $user->table;
1476 $table = $this->table[$table_idx];
1478 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1481 $user_wup = array();
1483 $user_tab = array();
1485 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1487 for ($i = 0 ; $i < $table->player_n ; $i++) {
1488 $user_cur = $this->user[$table->player[$i]];
1489 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1490 if ($user_cur->sess != "") {
1491 if ($update_lacc == TRUE) {
1492 $user_cur->laccwr = $curtime;
1494 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1495 if ($user_cur->subst == "shutdowned") {
1496 $user_cur->stat_set("room");
1497 $user_cur->subst = "sitdown";
1499 else if ($user_cur->subst == "shutdowner") {
1500 $user_cur->stat_set("room");
1501 $user_cur->subst = "standup";
1502 $user_cur->table = -1;
1503 $user_wup[$user_wup_n++] = $user_cur;
1505 $remove_wagon = FALSE;
1506 if($table->wag_own == $table->player[$i]) {
1507 $remove_wagon = TRUE;
1508 $table->wag_reset($curtime);
1511 $user_tab[$user_tab_n++] = $table->player[$i];
1515 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1516 $table->user_rem($this, $user_wup[$wup_idx]);
1518 /* aggiorna l'array dei giocatori al tavolo. */
1520 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1521 log_main("START LOOP");
1522 $user_cur = $this->user[$i];
1523 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1524 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1529 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1531 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1532 if ($user_cur->stat == "room") {
1533 log_main("DOCUMENT.index.php from table");
1535 $ret .= $this->table_content($user_cur, $table_idx);
1536 $ret .= $this->standup_content($user_cur);
1538 $ret .= $table->act_content($user_cur);
1541 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1542 if ($user_tab[$tab_idx] == $i)
1545 // for users that wakeup the room will be reconstructed by index_rd.php
1546 if ($tab_idx < $user_tab_n) {
1547 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1549 // ARRAY_POP DISABLED
1550 // if ($trans_delta == 0)
1551 // while (array_pop($user_cur->comm) != NULL);
1553 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1554 $user_cur->comm[$user_cur->step % COMM_N] = "";
1555 $user_cur->step_inc();
1556 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1557 $user_cur->step_inc();
1558 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1562 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1564 log_main("JOIN_WAKEUP more");
1566 $ret .= $table->act_content($user_cur);
1568 log_main("JOIN_WAKEUP end more");
1570 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1571 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1572 $user_cur->step_inc();
1576 function guarantee_show($user, $user_login, $dt)
1578 GLOBAL $G_lang, $mlang_brisk, $G_base;
1584 if ($user_login == "") {
1588 if (($bdb = BriskDB::create()) == FALSE) {
1592 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1596 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1597 $guar_login = $guar_item->login_get();
1602 $user_tos_vers = $user_item->tos_vers_get();
1604 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1605 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1607 else if ($guar_login == "") {
1608 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1610 else if ($guar_login == $user_login) {
1611 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1614 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1615 xcape($user_login), xcape($guar_login)));
1620 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1623 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1629 function room_outstandup($user)
1631 $this->room_sitdown($user, -1);
1634 function table_update($user)
1636 log_main("table_update: pre - USER: ".$user->name);
1638 $table_idx = $user->table;
1640 if ($table_idx > -1)
1641 $table = $this->table[$table_idx];
1643 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1645 $user_cur = $this->user[$i];
1646 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1649 $ret = "gst.st = ".($user_cur->step+1)."; ";
1650 if ($table_idx > -1)
1651 $ret .= $this->table_content($user_cur, $table_idx);
1653 if ($user->idx_get() == $i) {
1654 $ret .= $user->myname_innerHTML();
1656 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1657 $user_cur->step_inc();
1660 log_main("table_update: post");
1663 function room_sitdown($user, $table_idx)
1665 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1669 if ($table_idx > -1 && $table_idx < TABLES_N) {
1670 $table = $this->table[$table_idx];
1673 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1674 for ($i = 0 ; $i < TABLES_N ; $i++) {
1675 if ($table->wag_own == $table->player[$i]) {
1676 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1677 $table->wag_reset(time());
1684 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1686 $user_cur = $this->user[$i];
1687 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1690 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1691 if ($table_idx > -1)
1692 $ret .= $this->table_content($user_cur, $table_idx);
1693 $ret .= $this->standup_content($user_cur);
1695 if ($user->idx_get() == $i) {
1696 $ret .= 'subst = "sitdown"; tra.hide(); ';
1697 // clean the action buttons in other tables
1698 for ($e = 0 ; $e < TABLES_N ; $e++) {
1699 $ret .= $this->table[$e]->act_content($user_cur);
1702 else if ($table_idx > -1) {
1703 if ($table->player_n == PLAYERS_N) {
1705 $ret .= $table->act_content($user_cur);
1708 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1709 $user_cur->step_inc();
1713 function chatt_send($user, $mesg)
1715 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1719 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1721 $dt = date("H:i ", $curtime);
1732 $is_normchat = FALSE;
1733 /* for old isolation management $is_ticker = FALSE; */
1734 $update_room = FALSE;
1736 if (strcmp($msg, "/tav") == 0 ||
1737 strncmp($msg, "/tav ", 5) == 0) {
1739 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1740 /* 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>" */
1741 $msg = $mlang_brisk['tickmust'][$G_lang];
1742 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1747 $table = $this->table[$user->table];
1749 if ($table->wag_own != -1) {
1750 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1751 $msg = $mlang_brisk['tickjust'][$G_lang];
1752 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1757 $dtime = $curtime - $table->wag_tout;
1758 if ($dtime < EXPIRE_TIME_WAG) {
1759 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1760 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1761 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1762 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1767 $msg = substr($msg, 5);
1769 $table->wag_set($user->idx_get(), $msg);
1770 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1771 $to_room = $to_user;
1772 /* for old isolation management $is_ticker = TRUE; */
1774 } // /tav chat command
1776 else if (strncmp($msg, "/alarm ", 7) == 0) {
1777 if (strncmp($msg, "/alarm to ", 10) == 0) {
1778 $sp_pos = strpos($msg, " ", 10);
1779 $target = substr($msg, 10, $sp_pos - 10);
1780 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1784 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1787 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1788 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1789 $msg = $mlang_brisk['alarpass'][$G_lang];
1790 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1795 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1796 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1797 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1798 $to_user = nickserv_msg($dt, $prestr);
1800 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1801 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1802 /* MLANG: "chiudi" */
1803 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1805 } // /alarm chat command
1806 else if (strncmp($msg, "/listen ", 8) == 0) {
1807 $arg = substr($msg, 8);
1809 if (strcasecmp($arg, "isolation") == 0) {
1811 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1812 $user->table >= TABLES_AUTH_N) {
1813 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1817 $user->flags &= ~USER_FLAG_MAP_AUTH;
1818 $user->flags |= USER_FLAG_ISOLAUTH;
1819 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1822 else if (strcasecmp($arg, "auth") == 0) {
1823 $flags_old = $user->flags;
1824 $user->flags &= ~USER_FLAG_MAP_AUTH;
1825 $user->flags |= USER_FLAG_LISTAUTH;
1826 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1829 $flags_old = $user->flags;
1830 $user->flags &= ~USER_FLAG_MAP_AUTH;
1831 $to_user = 'list_set(\'all\', true, \'\'); ';
1834 // if from isolation redraw standup area
1835 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1836 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1840 else if (strcmp($msg, "/authreq") == 0) {
1841 if ($user->is_cert()) {
1842 $to_user = sprintf('authbox(300,200);');
1845 /* 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." */
1846 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1849 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1850 if ($user->is_auth()) {
1851 $to_user = sprintf('mesgtoadmbox(500,300);');
1854 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1855 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1858 else if (strncmp($msg, "/nick ", 6) == 0) {
1859 log_main("chatt_send BEGIN");
1862 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1863 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1867 $msg = "COMMAND ".$msg;
1868 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1869 $user_cur = $this->user[$i];
1871 if ($user_cur->sess == '')
1873 if (strcasecmp($user_cur->name,$name_new) == 0)
1876 if ($i < MAX_PLAYERS) {
1877 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1878 $to_user = nickserv_msg($dt, $prestr);
1882 /* 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>" */
1883 if ($user->is_auth()) {
1884 if (strcasecmp($user->name,$name_new) != 0) {
1885 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1886 ($user->subst == 'standup' ||
1887 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
1890 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1891 for ($i = 0 ; $i < TABLES_N ; $i++) {
1892 $to_user .= $this->table[$i]->act_content($user);
1896 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
1901 $user->name = $name_new; // OK - nick changed
1902 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1903 if ( ! $user->is_auth() ) {
1904 if (($bdb = BriskDB::create()) != FALSE) {
1906 /* 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>" */
1907 if ($bdb->login_exists($name_new)) {
1908 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1909 $to_user .= nickserv_msg($dt, $prestr);
1914 log_main("chatt_send start set");
1916 $update_room = TRUE;
1918 } // nick chat command
1919 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1920 $guar_user = substr($msg, 6);
1922 $this->guarantee_show($user, $guar_user, $dt);
1924 else if (strncmp($msg, "/st ", 4) == 0) {
1925 log_main("chatt_send BEGIN");
1928 $st_str = substr($msg, 4);
1930 if (strcasecmp($st_str, "normale") == 0) {
1931 $st = USER_FLAG_S_NORM;
1933 else if (strcasecmp($st_str, "pausa") == 0) {
1934 $st = USER_FLAG_S_PAU;
1936 else if (strcasecmp($st_str, "fuori") == 0) {
1937 $st = USER_FLAG_S_OUT;
1939 else if (strcasecmp($st_str, "cane") == 0) {
1940 $st = USER_FLAG_S_DOG;
1942 else if (strcasecmp($st_str, "cibo") == 0) {
1943 $st = USER_FLAG_S_EAT;
1945 else if (strcasecmp($st_str, "lavoro") == 0) {
1946 $st = USER_FLAG_S_WRK;
1948 else if (strcasecmp($st_str, "sigaretta") == 0) {
1949 $st = USER_FLAG_S_SMK;
1951 else if (strcasecmp($st_str, "presente") == 0) {
1952 $st = USER_FLAG_S_EYE;
1954 else if (strcasecmp($st_str, "coniglio") == 0) {
1955 $st = USER_FLAG_S_RABB;
1957 else if (strcasecmp($st_str, "calcio") == 0) {
1958 $st = USER_FLAG_S_SOCC;
1960 else if (strcasecmp($st_str, "pupo") == 0) {
1961 $st = USER_FLAG_S_BABY;
1963 else if (strcasecmp($st_str, "pulizie") == 0) {
1964 $st = USER_FLAG_S_MOP;
1966 else if (strcasecmp($st_str, "babbo") == 0) {
1967 $st = USER_FLAG_S_BABBO;
1969 else if (strcasecmp($st_str, "renna") == 0) {
1970 $st = USER_FLAG_S_RENNA;
1972 else if (strcasecmp($st_str, "pupazzo") == 0) {
1973 $st = USER_FLAG_S_PUPAZ;
1975 else if (strcasecmp($st_str, "vischio") == 0) {
1976 $st = USER_FLAG_S_VISCH;
1979 /* MLANG: "Questo stato non esiste." */
1980 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
1984 log_main("chatt_send start set");
1985 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1986 $update_room = TRUE;
1987 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1990 } // nick chat command
1992 else { // normal chat line
1993 $is_normchat = TRUE;
1994 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1996 $user->chat_dlt = $user->chat_dlt * 2;
1997 if ($user->chat_dlt > 120)
1998 $user->chat_dlt = 120;
2000 else if ($user->chat_lst == $msg)
2002 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2003 $user->chat_ban = $curtime;
2004 $user->chat_dlt = 5;
2008 $user->chat_ban = 0;
2009 $user->chat_dlt = 0;
2013 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2016 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2017 // temporary silentiation for troll (will became array check)
2018 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2019 $to_room = $to_user;
2022 log_legal($curtime, $user->ip, $user,
2023 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2025 $user->chat_lst = "$msg";
2026 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2036 // Output to clients
2039 if ($to_user != FALSE) {
2040 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2041 $user->comm[$user->step % COMM_N] .= $to_user;
2045 if ($to_room != FALSE) {
2046 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2047 $user_cur = $this->user[$i];
2048 if ($target != "" && $user_cur->name != $target)
2050 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
2053 if ($is_normchat == TRUE) {
2054 // use MAP_AUTH to check if auth or isolation
2055 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2056 if ( ! $user->is_auth() ) {
2062 else if ($is_ticker) {
2063 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2064 if ($user->table >= TABLES_AUTH_N)
2069 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2070 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2071 $user_cur->step_inc();
2076 // FIXME BRISK4: include for each kind of table
2077 require_once("${G_base}briskin5/Obj/briskin5.phh");
2078 // Before all align times with table timeout
2079 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2080 if (isset($this->match[$table_idx])) {
2081 $bin5 = $this->match[$table_idx];
2083 $bin5_table = $bin5->table[0];
2084 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2085 // stat must be "table" by definition
2086 $bin5_user = $bin5->user[$i];
2088 if ($target != "" && $bin5_user->name != $target)
2090 log_main("writa: ".$user_mesg);
2091 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2092 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2093 $bin5_user->step_inc();
2095 } // if (isset($this->match
2096 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2097 } // if ($to_tabl == true ...
2100 if ($user->stat == 'room' && $user->subst == 'standup') {
2101 $this->standup_update($user);
2103 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2104 log_main("chatt_send pre table update");
2105 $this->table_update($user);
2106 log_main("chatt_send post table update");
2108 } // if ($update_room ...
2111 } // function chatt_send( ...
2113 function get_user($sess, &$idx)
2117 if (validate_sess($sess)) {
2118 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2119 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2122 $ret = $this->user[$i];
2126 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2127 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2128 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2131 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2138 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
2141 * if ($idx > -1 && ret == FALSE) => duplicated nick
2142 * if ($idx == -2 && ret == FALSE) => invalid name
2143 * if ($idx == -3 && ret == FALSE) => wrong password
2144 * if ($idx == -1 && ret == FALSE) => no space left
2145 * if ($idx == 0 && ret == user) => SUCCESS
2146 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
2149 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
2155 $authenticate = FALSE;
2157 $login_exists = FALSE;
2159 $ghost_auth = FALSE;
2164 if (($name_new = validate_name($name)) == FALSE) {
2169 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2170 if (validate_sess($sess) == FALSE)
2173 /* if pass != FALSE verify the login with pass */
2174 log_auth("XXX", "auth1");
2176 if (($bdb = BriskDB::create()) != FALSE) {
2178 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2179 log_auth("XXX", "auth2");
2180 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2181 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2183 if ($authenticate != FALSE) {
2184 $user_type = $authenticate->type_get();
2192 $login_exists = $bdb->login_exists($name_new);
2196 // if db is down, send a warning and verify only current users
2197 // no actions at this moment
2199 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2201 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2205 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2207 continue; // NOTE: CHECK IT !!
2209 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2210 if ($authenticate != FALSE) {
2212 $ghost_auth = $this->user[$i]->is_auth();
2223 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2225 /* there is another user logged with your account and you and him have authenticated => new user
2226 get the session of the old user */
2227 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2230 $ghost_user = $this->user[$ghost];
2232 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2233 $ghost_user->step_inc();
2236 $ghost_user->sess = $sess;
2239 $ghost_user->sess = $sess;
2242 // If user at the table we need to update the table data too
2243 $table_idx = $ghost_user->table;
2244 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2245 require_once("${G_base}briskin5/Obj/briskin5.phh");
2246 if (isset($this->match[$table_idx])) {
2247 $bin5 = $this->match[$table_idx];
2249 if ($bin5->the_end != TRUE) {
2250 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2251 $bin5->user[$ghost_user->table_pos]->step_inc();
2252 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2258 return ($this->user[$ghost]);
2260 else if ($idx != -1 && $i == MAX_PLAYERS) {
2265 $this->user[$idx]->sess = $sess;
2268 $this->user[$idx]->sess = $sess;
2270 $this->user[$idx]->name = $name_new; // OK - add new user
2271 $this->user[$idx]->stat_set("room");
2272 $this->user[$idx]->step_set(0);
2273 while (array_pop($this->user[$idx]->comm) != NULL);
2274 $this->user[$idx]->subst = "standup";
2275 $this->user[$idx]->lacc = $curtime;
2276 $this->user[$idx]->laccwr = $curtime;
2277 $this->user[$idx]->bantime = 0;
2278 $this->user[$idx]->ip = $ip;
2280 $this->user[$idx]->rec = $authenticate;
2281 $this->user[$idx]->flags = $user_type;
2282 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2283 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2284 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2286 if ($authenticate != FALSE) {
2287 $this->user[$idx]->code = $authenticate->code_get();
2289 // all this part is included in the db server
2290 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2292 if (isset($cookie['CO_list'])) {
2293 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2294 if (strcmp($cookie['CO_list'], "auth") == 0) {
2295 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2296 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2298 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2299 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2300 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2303 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2308 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2311 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2313 log_main("ghost: rename!");
2314 $ghost_user = $this->user[$ghost];
2316 if ($ghost_auth == FALSE) {
2317 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2318 $ghostname = 'ghost'.$sfx;
2319 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2320 if (strcmp("", $this->user[$i]->sess) == 0)
2323 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2328 if ($ghostname != '')
2332 $ghost_user->name = $ghostname;
2334 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2335 $this->standup_update($ghost_user);
2338 log_main("chatt_send pre table update");
2339 $this->table_update($ghost_user);
2340 log_main("chatt_send post table update");
2342 } // if ($ghost_auth == FALSE
2344 // FIXME: cacciare il vecchio utente room && table (if needed)
2345 $ghost_user->the_end = TRUE;
2346 $ghost_user->lacc = 0;
2347 $this->garbage_manager(TRUE);
2349 } // if ($ghost > -1) {
2354 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));
2356 $ret = $this->user[$real_idx];
2363 function standup_update($user)
2365 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2366 $user_cur = $this->user[$i];
2367 if ($user_cur->sess == '')
2370 log_main("STANDUP START: ".$user_cur->stat);
2372 if ($user_cur->stat == 'room') {
2373 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2374 if ($user->idx_get() == $i) {
2375 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2377 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2379 $user_cur->step_inc();
2384 function dump_data()
2386 $brisk_ser = serialize($this);
2387 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2388 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2395 function standup_content($user)
2400 if ($user->stat != 'room')
2403 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2404 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2409 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2411 $content = ' j_stand_cont( [ ';
2413 $user_cur_id = $user->idx_get();
2414 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2415 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2418 $flags = $this->user[$i]->flags;
2420 // sql record exists AND last donate > 2013-01-01
2421 if ($this->user[$i]->is_supp_custom()) {
2422 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2428 if ($this->user[$i]->subst == "standup") {
2429 if ($user_cur_id == $i) {
2433 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2434 xcape($this->user[$i]->name), $supp_comp_s);
2443 function table_content($user, $table_idx)
2449 // Si possono usare i dati nella classe table
2452 $sess = $user->sess;
2453 $table = $this->table[$table_idx];
2455 if ($user->stat != 'room')
2458 $user_cur_id = $user->idx_get();
2460 for ($i = 0 ; $i < $table->player_n ; $i++) {
2461 $user_cur = $this->user[$table->player[$i]];
2463 $flags = $user_cur->flags;
2465 if ($user_cur_id == $table->player[$i])
2468 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2469 if ($user_cur->is_supp_custom())
2470 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2474 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2475 xcape($user_cur->name), $supp_comp_s);
2480 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2485 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2487 GLOBAL $G_ban_list, $G_black_list;
2489 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2490 $remote_addr = addrtoipv4($addr);
2492 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2493 if ($this->black_check($remote_addr)) {
2494 // TODO: waiting async 5 sec before close
2495 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2499 $enc = get_encoding($header);
2500 if (isset($header['User-Agent'])) {
2501 if (strstr($header['User-Agent'], "MSIE")) {
2502 $transp_type = "htmlfile";
2505 $transp_type = "xhr";
2509 $transp_type = "iframe";
2511 force_no_cache($header_out);
2517 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2518 $content = ob_get_contents();
2521 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2522 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2526 case "index_wr.php":
2528 // Enhance required: in the POST case, after the header you must get content
2529 // from the socket, waiting if necessary
2533 index_wr_main($this, $addr, $get, $post, $cookie);
2534 $content = ob_get_contents();
2537 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2541 case "index_rd.php":
2542 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2544 if ($transp == 'websocket')
2548 if (!isset($cookie['sess'])
2549 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2551 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2553 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2558 $this->sess_cur_set($user->sess);
2559 // close a previous opened index_read_ifra socket, if exists
2560 if (($prev = $user->rd_socket_get()) != NULL) {
2561 $s_a_p->socks_unset($user->rd_socket_get());
2562 fclose($user->rd_socket_get());
2563 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2564 $user->rd_socket_set(NULL);
2568 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2569 $response = headers_render($header_out, -1).$user->chunked_content($content);
2570 $response_l = mb_strlen($response, "ASCII");
2572 $wret = @fwrite($new_socket, $response, $response_l);
2573 if ($wret < $response_l) {
2574 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2575 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2578 $user->rd_cache_set("");
2580 fflush($new_socket);
2583 $s_a_p->socks_set($new_socket, $user, NULL);
2584 $user->rd_socket_set($new_socket);
2585 printf(" - qui ci siamo - ");
2592 if (!(BRISK_DEBUG & DBG_ENGI))
2594 fprintf(STDERR, "TEST.PHP running\n");
2595 if (isset($post['data'])) {
2596 $content = $post['data'];
2599 $content = "NO DATA AVAILABLE";
2601 $header_out['Content-Type'] = 'text/plain';
2602 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2606 /* FAR TODO: move all into an array of registered sub-apps */
2607 $subs = "briskin5/";
2608 $subs_l = strlen($subs);
2609 if (!strncmp($path, $subs, $subs_l)) {
2610 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2619 function match_add($idx, $match)
2621 $this->match[$idx] = $match;
2624 function match_del($idx)
2626 unset($this->match[$idx]);
2629 function match_get($idx, $token)
2631 if (isset($this->match[$idx])) {
2633 || $token == $this->match[$idx]->table_token) {
2634 return ($this->match[$idx]);
2639 function sess_cur_set($sess)
2641 static::$sess_cur = $sess;
2644 static function sess_cur_get()
2646 return(static::$sess_cur);
2648 } // end class Brisk
2650 function make_seed()
2652 list($usec, $sec) = explode(' ', microtime());
2653 return (float) $sec + ((float) $usec * 100000);
2656 function btrace_line($ar)
2658 GLOBAL $G_btrace_pref_sub;
2661 for ($i = 0 ; $i < count($ar) ; $i++) {
2662 $with_class = isset($ar[$i]['class']);
2663 $with_file = isset($ar[$i]['file']);
2664 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2665 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2666 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2667 ($with_file ? $ar[$i]['line'] : ""));
2673 function trace_ftok($id, $add)
2675 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2676 $tok=@ftok($id, $add);
2678 log_shme($tok.": ".$id." + ".$add);
2683 function log_mop($step, $log)
2687 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2690 $sess = Brisk::sess_cur_get();
2691 if (isset($sess) == FALSE)
2696 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2699 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2700 $btrace = btrace_line(debug_backtrace());
2703 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2704 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2710 function log_only2($log)
2714 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2717 $sess = Brisk::sess_cur_get();
2718 if (isset($sess) == FALSE)
2723 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2726 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2727 $btrace = btrace_line(debug_backtrace());
2730 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2731 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2736 function log_crit($log)
2740 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2743 $sess = Brisk::sess_cur_get();
2744 if (isset($sess) == FALSE)
2749 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2752 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2753 $btrace = btrace_line(debug_backtrace());
2756 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2757 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2762 function log_only($log)
2766 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2769 $sess = Brisk::sess_cur_get();
2770 if (isset($sess) == FALSE)
2775 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2778 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2779 $btrace = btrace_line(debug_backtrace());
2782 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2783 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2788 function log_main($log)
2792 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2795 $sess = Brisk::sess_cur_get();
2796 if (isset($sess) == FALSE)
2801 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2804 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2805 $btrace = btrace_line(debug_backtrace());
2808 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2809 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2814 function log_rd($log)
2818 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2821 $sess = Brisk::sess_cur_get();
2822 if (isset($sess) == FALSE)
2827 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2830 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2831 $btrace = btrace_line(debug_backtrace());
2834 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2835 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2840 function log_rd2($log)
2844 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2847 $sess = Brisk::sess_cur_get();
2848 if (isset($sess) == FALSE)
2853 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2856 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2857 $btrace = btrace_line(debug_backtrace());
2861 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2862 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2867 function log_send($log)
2871 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2874 $sess = Brisk::sess_cur_get();
2875 if (isset($sess) == FALSE)
2880 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2883 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2884 $btrace = btrace_line(debug_backtrace());
2887 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2888 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2893 function log_lock($log)
2897 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2900 $sess = Brisk::sess_cur_get();
2901 if (isset($sess) == FALSE)
2906 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2909 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2910 $btrace = btrace_line(debug_backtrace());
2913 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2914 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2919 function log_wr($log)
2923 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2926 $sess = Brisk::sess_cur_get();
2927 if (isset($sess) == FALSE)
2932 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2935 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2936 $btrace = btrace_line(debug_backtrace());
2939 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2940 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2945 function log_load($log)
2949 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2952 $sess = Brisk::sess_cur_get();
2953 if (isset($sess) == FALSE)
2958 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2961 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2962 $btrace = btrace_line(debug_backtrace());
2965 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2966 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2971 function log_auth($sess, $log)
2975 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2978 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
2981 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2982 $btrace = btrace_line(debug_backtrace());
2985 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2986 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
2991 function log_shme($log)
2995 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
2998 $sess = Brisk::sess_cur_get();
2999 if (isset($sess) == FALSE)
3004 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3007 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3008 $btrace = btrace_line(debug_backtrace());
3011 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3012 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3019 // function log_legal($curtime, $sess, $name, $where, $mesg)
3020 function log_legal($curtime, $addr, $user, $where, $mesg)
3023 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3024 /* Unix time | session | nickname | IP | where was | mesg */
3025 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3026 ($user->is_auth() ? 'A' : 'N'),
3027 $user->name, $addr, $where , $mesg));
3032 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3037 if ($sitted < PLAYERS_N) {
3045 if ($table == $cur_table)
3052 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3057 function show_notify($text, $tout, $butt, $w, $h)
3059 log_main("SHOW_NOTIFY: ".$text);
3060 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3063 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3065 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3066 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);
3069 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3071 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3074 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3075 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3078 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3079 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);
3083 function root_welcome($user)
3085 GLOBAL $root_wellarr, $G_lang;
3089 $dt = date("H:i ", $curtime);
3091 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3092 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3099 function validate_sess($sess)
3101 if (strlen($sess) == SESS_LEN)
3107 function validate_name($name)
3109 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3111 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3113 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3120 function playsound($filename)
3122 return (sprintf('playsound("flasou", "%s");', $filename));
3125 function secstoword($secs)
3131 $mins = floor($secs / 60);
3133 if ($G_lang == 'en') {
3135 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3138 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3142 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3145 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3150 function sharedmem_sz($tok)
3152 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3153 log_main("shmop_open failed");
3156 $shm_sz = shmop_size($shm_id);
3157 shmop_close($shm_id);
3159 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3166 static function lock_data($is_exclusive)
3168 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3169 self::$delta_t = microtime(TRUE);
3170 log_lock("LOCK warrant [".self::$delta_t."]");
3178 static function unlock_data($res)
3182 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3191 static function lock_data($is_exclusive)
3193 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3194 self::$delta_t = microtime(TRUE);
3195 log_lock("LOCK poll [".self::$delta_t."]");
3203 static function unlock_data($res)
3207 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3213 function carousel_top()
3218 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));
3221 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>'));