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', "<i>BriskServ</i>");
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.</b>',
114 'en' => '<b>To authenticate someone you have to be authenticated.</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 già possidede una password</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><br><br>
249 <dd><a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
252 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
253 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.
258 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
259 <div style=\\"text-align: left; padding: 8px;\\">
260 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
262 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
263 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
265 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
266 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
269 <b>Per auto-garantisi occorre possedere:</b><br><br>
271 <li>il codice PIN della propria carta
272 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
275 <b>Per effettuare la registrazione collegarsi al sito:</b><br><br>
277 <dd><a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
280 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
281 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.
287 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
291 $G_room_about = array( 'it' => '<br>
292 <div id=\\"header\\" class=\\"header\\">
293 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
294 briscola chiamata in salsa ajax
296 <br><b>version '.$G_brisk_version.'</b><br><br>
297 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
299 <div id=\\"header\\" class=\\"header\\">
300 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
301 declaration briscola in ajax sauce <b>(Beta)</b>
303 <br><b>version '.$G_brisk_version.'</b><br><br>
304 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
307 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
310 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
311 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
312 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
313 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
314 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
315 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
316 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
317 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
318 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
319 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
320 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
321 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
322 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
323 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
324 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
325 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
326 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
327 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
328 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
330 // $G_PG_cons_n = count($G_PG_cons);
331 // printf("N CONS: %d\n", $G_PG_cons_n);
333 /* printf("%d %d\n", count($voc), count($cons)); */
334 /* for ($i = 0 ; $i < 26 ; $i++) { */
335 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
337 /* printf(' "%s", ', chr(ord('a') + $i)); */
338 /* for ($e = 0 ; $e < 26 ; $e++) { */
339 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
341 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
346 function passwd_gen($seed = NULL)
348 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
357 for ($sil = 0 ; $sil < 7 ; $sil++) {
358 if (($sil % 2) == 0) {
360 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
362 $old = mt_rand(0, $G_PG_vow_n-1);
363 $pw .= $G_PG_vow[$old];
366 $new = mt_rand(0, $G_PG_vow_n-1);
368 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
369 $pw .= $G_PG_vow[$new];
375 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
382 function cmd_return($val, $desc)
384 return array('val' => $val, 'desc' => $desc);
387 function cmd_serialize($attrs)
392 foreach ($attrs as $key => $value) {
393 $ret .= $sep . $key . '=' . urlencode($value);
399 function cmd_deserialize($cmd)
402 $a = explode('&', $cmd);
404 while ($i < count($a)) {
405 $b = split('=', $a[$i]);
406 $ret[urldecode($b[0])] = urldecode($b[1]);
417 function versions_cmp($v1, $v2)
419 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
423 $v1_ar = split('\.', $v1);
424 $v2_ar = split('\.', $v2);
426 $v2_ct = count($v2_ar);
428 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
429 if (($v2_ct - 1) < $i) {
432 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
433 if ($v1_ar[$i] != $v2_ar[$i]) {
434 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
443 function addrtoipv4($addr)
445 $ipv4addr_arr = explode(':' , $addr);
446 if (isset($ipv4addr_arr[3])) {
447 $ipv4addr = $ipv4addr_arr[3];
457 for ($i = 0; $i < ob_get_level(); $i++)
459 ob_implicit_flush(1);
463 function force_no_cache(&$header_out)
465 $header_out['Pragma'] = 'no-cache, must-revalidate';
466 $header_out['Cache-Control'] = 'no-cache';
467 $header_out['Expires'] = '-1';
470 function file_lock($fname, $is_exclusive)
472 if (($res = @fopen($fname, "r+")) == FALSE) {
476 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
484 function file_unlock($res)
487 flock($res, LOCK_UN);
492 $escpush_from = array("\\", "\"");
493 $escpush_to = array("\\\\", "\\\"");
496 GLOBAL $escpush_from, $escpush_to;
498 return str_replace($escpush_from, $escpush_to, $s);
501 $escinp_from = array( "\"" );
502 $escinp_to = array( """ );
504 function escinput($s)
506 GLOBAL $escinp_from, $escinp_to;
508 return str_replace($escinp_from, $escinp_to, $s);
513 return htmlentities($s, ENT_COMPAT, "UTF-8");
516 function esclfhtml($s)
518 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
521 function langtolng($lang)
525 return ($G_lang == 'en' ? '-en' : '');
528 function csplitter($in, $sep)
534 for ($i = 0 ; $i < strlen($in) ; $i++) {
535 $ini = substr($in, $i, 1);
539 else if ($ini == $sep) {
558 $from = array ( '\\', '@', '|' );
559 $to = array ( '\\\\', '@', '¦' );
561 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
566 $from = array ( '\\', '|', "\t", "\n");
567 $to = array ( '\\\\', '\\|', "\\t", "\\n");
569 return (str_replace($from, $to, $s));
572 function xcapemesg($s)
574 $from = array ( "\n");
575 $to = array ( "\\n");
577 return (str_replace($from, $to, $s));
585 function IPClass($ipset)
588 $elem = split("/", $ipset, 2);
590 $mask = (int)$elem[1];
594 $this->mask = ((1<<($mask))-1) << (32 - $mask);
595 $this->addr = ip2long($addr) & $this->mask;
597 fprintf(STDERR, "New ipclass: %x (%x)\n", $this->addr, $this->mask);
602 fprintf(STDERR, "IP: %x, ADDR: %x, MASK: %x -> (%d)\n",
603 $ip, $this->addr, $this->mask, ((ip2long($ip) & $this->mask) == $this->addr));
604 return (($ip & $this->mask) == $this->addr);
614 function getbyid($idx)
616 return ($this->el[$idx]);
619 function setbyid($idx, $v)
621 $this->el[$idx] = $v;
630 var $auth_only; // se tavolo riservato o libero
637 var $table_start; // information field
645 function create($idx)
647 if (($thiz = new Table()) == FALSE)
651 $thiz->player = array();
653 $thiz->auth_only = FALSE;
659 $thiz->table_token = "";
660 $thiz->table_start = 0;
662 $thiz->wakeup_time = 0;
669 $this->idx = $from->idx;
670 $this->player = array();
671 for ($i = 0 ; $i < $from->player_n ; $i++)
672 $this->player[$i] = $from->player[$i];
673 $this->player_n = $from->player_n;
675 log_main("PLAYER_N - parent::copy.".$this->player_n);
677 $this->auth_only = $from->auth_only;
679 $this->wag_own = $from->wag_own;
680 $this->wag_com = $from->wag_com;
681 $this->wag_tout = $from->wag_tout;
683 $this->table_token = $from->table_token;
684 $this->table_start = $from->table_start;
686 $this->wakeup_time = $from->wakeup_time;
689 function myclone($from)
691 if (($thiz = new Table()) == FALSE)
699 function spawn($from)
701 if (($thiz = new Table()) == FALSE)
704 $thiz->idx = $from->idx;
705 $thiz->player = array();
706 for ($i = 0 ; $i < $from->player_n ; $i++)
707 $thiz->player[$i] = $i;
708 $thiz->player_n = $from->player_n;
710 $thiz->auth_only = $from->auth_only;
712 $thiz->wag_own = $from->wag_own;
713 $thiz->wag_com = $from->wag_com;
714 $thiz->wag_tout = $from->wag_tout;
716 $thiz->table_token = $from->table_token;
717 $thiz->table_start = $from->table_start;
719 $thiz->wakeup_time = $from->wakeup_time;
724 function wag_set($user_idx, $mesg)
728 $this->wag_own = $user_idx;
729 $this->wag_com = $mesg;
733 function wag_reset($timeout)
735 log_main("WAG_RESET");
737 unset($this->wag_own);
740 $this->wag_tout = $timeout;
743 function player_get($idx)
745 return ($this->player[$idx]);
748 function player_set($idx, $player)
750 $this->player[$idx] = $player;
753 function user_add($idx)
755 $this->player[$this->player_n] = $idx;
758 return ($this->player_n - 1);
761 function user_rem($brisk, $user)
763 $tabpos = $user->table_pos;
765 /* verifico la consistenza dei dati */
766 if ($brisk->user[$this->player[$tabpos]] == $user) {
768 /* aggiorna l'array dei giocatori al tavolo. */
769 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
770 $this->player[$i] = $this->player[$i+1];
771 $user_cur = $brisk->user[$this->player[$i]];
772 $user_cur->table_pos = $i;
777 log_main("INCONSISTENCY ON TABLE.");
781 // function act_content($isstanding, $sitted, $table, $cur_table, $allowed)
782 function act_content($user)
785 $isstanding = ($user->subst == 'standup');
786 $sitted = $this->player_n;
788 $cur_table = $user->table;
792 if ($sitted < PLAYERS_N) {
793 if ($this->auth_only) {
794 if ($user->flags & USER_FLAG_AUTH)
808 if ($table == $cur_table)
815 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
828 function Delay_Manager($triglevel)
830 $this->triglevel = $triglevel;
831 $this->delta = array();
832 $this->lastcheck = 0;
835 function delta_get($curtime)
837 // clean too old delta items
838 for ($i = 0 ; $i < count($this->delta) ; $i++) {
839 if ($this->delta[$i][0] < $curtime) {
840 array_splice($this->delta, $i, 1);
845 // add new delta items if delay exceeded $this->triglevel sec
846 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
847 $delta = $curtime - $this->lastcheck - $this->triglevel;
848 array_push($this->delta, array($curtime + $delta , $delta));
849 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
852 // extract the maximum valid delta
854 for ($i = 0 ; $i < count($this->delta) ; $i++) {
855 $delta_cur = $this->delta[$i][1];
856 if ($delta_max < $delta_cur)
857 $delta_max = $delta_cur;
860 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
865 function lastcheck_set($curtime)
867 $this->lastcheck = $curtime;
875 function Client_prefs()
879 static function from_user($user)
881 $thiz = new Client_prefs();
882 $thiz->user_load($user);
887 static function from_json($json)
889 $thiz = new Client_prefs();
890 if ($thiz->json_load($json) == FALSE) {
898 function user_load($user)
900 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
901 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
902 if ($user->rec != FALSE) {
903 $this->supp_comp = $user->rec->supp_comp_get();
906 $this->supp_comp = "000000000000";
909 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
912 function json_load($json_s)
917 if (gettype($json_s) == "string") {
918 if (($json = json_decode($json_s)) == FALSE)
924 if ($this->listen < 0 || $this->listen > 2)
926 $this->listen = $json->listen;
928 if (mb_strlen($json->supp_comp, "ASCII") != 12)
931 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
932 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
933 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
939 $this->supp_comp = $json->supp_comp;
946 function store($user, $is_save)
949 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
950 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
951 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
952 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
954 if ($user->is_supp_custom()) {
955 $user->rec->supp_comp_set($this->supp_comp);
958 $user->prefs_store();
967 var $crystal_filename;
971 var $comm; // commands for many people
972 var $step; // current step of the comm array
973 var $garbage_timeout;
976 var $ban_list; // ban list (authized allowed)
977 var $black_list; // black list (anti-dos, noone allowed)
981 public static $sess_cur;
988 static function create($crystal_filename, $ban_list, $black_list) {
989 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
990 if (($brisk = unserialize($brisk_ser)) != FALSE) {
991 fprintf(STDERR, "ROOM FROM FILE\n");
992 rename($crystal_filename, $crystal_filename.".old");
1000 fprintf(STDERR, "NEW ROOM\n");
1001 $thiz = new Brisk();
1003 $thiz->crystal_filename = $crystal_filename;
1004 $thiz->user = array();
1005 $thiz->table = array();
1006 $thiz->match = array();
1008 $thiz->ban_list = NULL;
1009 $thiz->black_list = NULL;
1011 fprintf(STDERR, "PRE IPCLASS_UPDATE (%d, %d)\n", count($ban_list), count($black_list));
1012 $thiz->ipclass_update('ban_list', $ban_list);
1013 $thiz->ipclass_update('black_list', $black_list);
1014 fprintf(STDERR, "POST IPCLASS_UPDATE %d %d\n", count($thiz->ban_list), count($thiz->black_list));
1016 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1017 $thiz->user[$i] = User::create($thiz, $i, "", "");
1020 for ($i = 0 ; $i < TABLES_N ; $i++) {
1021 $thiz->table[$i] = Table::create($i);
1024 $row = ( (((int)($i / 4)) % 2) == 0 );
1025 $col = ($i % 2 == 0);
1026 $thiz->table[$i]->auth_only = (($row && $col) || (!$row && !$col));
1029 $thiz->table[$i]->auth_only = FALSE;
1032 if ($i < TABLES_AUTH_N)
1033 $thiz->table[$i]->auth_only = TRUE;
1035 $thiz->table[$i]->auth_only = FALSE;
1037 $thiz->garbage_timeout = 0;
1038 $thiz->shm_sz = SHM_DIMS_MIN;
1040 $thiz->delay_mgr = new Delay_Manager(1.5);
1042 static::$sess_cur = FALSE;
1047 function ipclass_update($ip_out_s, $ip_in)
1049 fprintf(STDERR, "N_IN: %d\n", count($ip_in));
1051 $ip_out = &$this->$ip_out_s;
1053 // if already set clean the ban_list property
1055 $ct = count($ip_out);
1056 for ($i = 0 ; $i < $ct ; $i++) {
1063 for ($i = 0 ; $i < count($ip_in) ; $i++) {
1064 $ip_out[$i] = new IPClass($ip_in[$i]);
1068 function reload($ban_list, $black_list)
1070 fprintf(STDERR, "RELOAD STUFF (%d)(%d)\n", count($ban_list), count($black_list));
1072 $this->ipclass_update("ban_list", $ban_list);
1073 $this->ipclass_update("black_list", $black_list);
1075 $this->banned_kickoff();
1076 $this->garbage_manager(TRUE);
1079 function banned_kickoff()
1083 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1084 $table_cur = $this->table[$table_idx];
1085 // if the table is complete and exists we check users IP
1087 if ($table_cur->player_n == PLAYERS_N) {
1088 if (isset($this->match[$table_idx]) &&
1089 $table_cur->table_token == $bin5->table_token) {
1090 log_main("PLAYERS == N TABLE ".$table_idx);
1092 $bin5 = $this->match[$table_idx];
1094 $is_ban |= $bin5->banned_kickoff();
1099 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1100 $user_cur = $this->user[$i];
1102 if ($user_cur->sess == "")
1105 // check if the IP is blacklisted
1106 if ($this->black_check($user_cur->ip)) {
1107 $user_cur->lacc = 0;
1112 // if authorized not check if banlisted
1113 if ($user_cur->flags & USER_FLAG_AUTH) {
1117 if ($this->ban_check($user_cur->ip)) {
1118 $user_cur->lacc = 0;
1126 function ban_check($ip_str)
1128 $ip = ip2long($ip_str);
1129 fprintf(STDERR, "Brisk::ban_check %d\n", count($this->ban_list));
1130 for ($i = 0 ; $i < count($this->ban_list) ; $i++) {
1131 fprintf(STDERR, "ban_list[%d] = %x (%x)\n", $i,
1132 $this->ban_list[$i]->addr, $this->ban_list[$i]->mask);
1133 if ($this->ban_list[$i]->match($ip)) {
1134 fprintf(STDERR, "\n\nMATCHA!\n\n");
1141 function black_check($ip_str)
1143 $ip = ip2long($ip_str);
1144 fprintf(STDERR, "Brisk::black_check %d\n", count($this->black_list));
1145 for ($i = 0 ; $i < count($this->black_list) ; $i++) {
1146 fprintf(STDERR, "black_list[%d] = %x (%x)\n", $i,
1147 $this->black_list[$i]->addr, $this->black_list[$i]->mask);
1148 if ($this->black_list[$i]->match($ip)) {
1149 fprintf(STDERR, "\n\nMATCHA!\n\n");
1156 function garbage_manager($force)
1158 GLOBAL $G_lang, $mlang_brisk, $G_base;
1162 log_rd2("garbage_manager START");
1164 /* Garbage collector degli utenti in timeout */
1165 $curtime = microtime(TRUE);
1167 $delta = $this->delay_mgr->delta_get($curtime);
1169 if (!$force && !($this->garbage_timeout < $curtime)) {
1170 $this->delay_mgr->lastcheck_set($curtime);
1174 // Before all align times with table timeout
1175 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1176 $table_cur = $this->table[$table_idx];
1177 // if the table is complete and exists its shared mem we get the info about users lacc
1179 if ($table_cur->player_n == PLAYERS_N) {
1180 log_main("PLAYERS == N TABLE ".$table_idx);
1183 $no_recovery = FALSE;
1184 if (isset($this->match[$table_idx])) {
1185 $bin5 = $this->match[$table_idx];
1187 if ($table_cur->table_token != $bin5->table_token) {
1188 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1189 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1190 $no_recovery = TRUE;
1194 if ($bin5 != FALSE) {
1198 log_main("garbage_manager: bri loaded successfully.");
1199 $bin5->garbage_manager(TRUE);
1201 $bin5_table = $bin5->table[0];
1203 // is the end of the table
1205 if ($bin5->the_end == TRUE) {
1207 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1209 log_main("garbage_manager: INSIDE THE END.");
1211 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1212 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1213 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1216 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1217 // stat must be "table" by definition
1218 $user_cur = $this->user[$table_cur->player[$i]];
1219 $bin5_user = $bin5->user[$i];
1221 $user_cur->subst = $bin5_user->subst;
1222 $user_cur->step = $bin5_user->step;
1223 $user_cur->lacc = $bin5_user->lacc;
1224 $user_cur->laccwr = $bin5_user->lacc;
1225 $user_cur->bantime = $bin5_user->bantime;
1228 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1230 $this->room_join_wakeup($user_cur, FALSE, 0);
1231 $table_cur->table_token = "";
1232 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1234 $this->match_del($table_idx);
1237 log_main("gm:: save_data");
1239 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1240 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1243 } // if ($bin5 == FALSE
1244 else if ($no_recovery == FALSE) {
1245 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1247 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1248 $user_cur = $this->user[$table_cur->player[$i]];
1249 $user_cur->subst = "shutdowner";
1250 $user_cur->step_inc();
1252 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1253 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1254 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1255 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1256 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1257 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1258 $user_cur->step_inc();
1261 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1262 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1263 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1265 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1267 $this->room_join_wakeup($user_cur, TRUE, -2);
1268 $table_cur->table_token = "";
1271 } // if ($table_cur->player_n == PLAYERS_N) {
1272 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1274 log_rd2("out new loop.");
1276 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1277 $user_cur = $this->user[$i];
1279 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1281 if ($user_cur->sess == "")
1284 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1285 // Auto logout dell'utente
1286 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1288 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1289 log_auth($user_cur->sess, "Autologout session.");
1293 log_rd2("AUTO LOGOUT.");
1294 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1295 $this->room_wakeup($user_cur);
1296 else if ($user_cur->subst == 'standup')
1297 $this->room_outstandup($user_cur);
1299 log_rd2("LOGOUT FROM WHAT ???");
1303 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1304 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1305 $this->room_wakeup($user_cur);
1306 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1307 /* 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" */
1308 $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);
1309 $user_cur->step_inc();
1313 log_rd2("GARBAGE UPDATED!");
1315 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1318 $this->delay_mgr->lastcheck_set($curtime);
1322 function show_room($user_step, $user)
1324 GLOBAL $G_lang, $mlang_brisk;
1325 log_main("show_room: username: ".$user->name);
1327 $ret = sprintf('gst.st = %d; ', $user_step);
1329 $prefs = Client_prefs::from_user($user);
1330 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1333 if ($user->flags & USER_FLAG_ISOLAUTH) {
1334 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1336 else if ($user->flags & USER_FLAG_LISTAUTH) {
1337 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1340 $ret .= 'list_set(\'all\', false, \'\' ); ';
1344 if ($user->subst == 'standup')
1345 $ret .= "tra.show(); ";
1347 $ret .= "tra.hide(); ";
1349 $ret .= sprintf('stat = "%s";', $user->stat);
1351 $ret .= root_welcome($user);
1352 if ($user->flags & USER_FLAG_DBFAILED) {
1353 $ret .= "gst.st = ".($user->step+1)."; ";
1354 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1357 $ret .= sprintf('subst = "%s";', $user->subst);
1358 $ret .= $user->myname_innerHTML();
1360 for ($i = 0 ; $i < TABLES_N ; $i++) {
1362 $ret .= $this->table_content($user, $i);
1364 $ret .= $this->table[$i]->act_content($user);
1365 if ($this->table[$i]->wag_own != -1)
1366 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1368 $ret .= sprintf('tra.rem(%d); ', $i);
1370 $ret .= $this->standup_content($user);
1371 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1377 function room_wakeup($user)
1379 $table_idx = $user->table;
1380 $table = $this->table[$table_idx];
1382 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1386 $from_table = ($user->stat == "table");
1388 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1390 for ($i = 0 ; $i < $table->player_n ; $i++) {
1391 $user_cur = $this->user[$table->player[$i]];
1392 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1394 if ($user->idx_get() != $table->player[$i]) {
1395 $user_cur->stat_set("room");
1396 $user_cur->subst = "sitdown";
1397 $user_cur->laccwr = $curtime;
1399 else if ($user->sess != "") {
1400 $user_cur->stat_set("room");
1401 $user_cur->subst = "standup";
1402 $user_cur->laccwr = $curtime;
1403 $user_cur->table = -1;
1408 $user->stat_set("room");
1409 $user->subst = "standup";
1410 $user->laccwr = $curtime;
1413 $remove_wagon = FALSE;
1414 if($table->wag_own == $user->idx_get()) {
1415 $table->wag_reset($curtime);
1416 $remove_wagon = TRUE;
1420 /* aggiorna l'array dei giocatori al tavolo. */
1421 $table->user_rem($this, $user);
1423 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1424 $user_cur = $this->user[$i];
1425 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1428 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1430 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1431 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1432 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1433 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1434 log_main("DOCUMENT.index.php: from table");
1436 else if ($user_cur->stat == "room") {
1437 log_main("DOCUMENT.index.php: from table");
1439 $ret .= $this->table_content($user_cur, $table_idx);
1440 $ret .= $this->standup_content($user_cur);
1442 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1443 $ret .= $table->act_content($user);
1445 if ($user->idx_get() == $i) {
1446 // set the new status
1447 $ret .= 'subst = "standup"; tra.show(); ';
1448 // clean the action buttons in other tables
1449 for ($e = 0 ; $e < TABLES_N ; $e++) {
1450 if ($this->table[$e]->player_n < PLAYERS_N) {
1451 $ret .= $this->table[$e]->act_content($user);
1456 $ret .= $table->act_content($user_cur);
1459 log_wr("ROOM_WAKEUP: ".$ret);
1460 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1461 $user_cur->step_inc();
1465 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1467 $table_idx = $user->table;
1468 $table = $this->table[$table_idx];
1470 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1473 $user_wup = array();
1475 $user_tab = array();
1477 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1479 for ($i = 0 ; $i < $table->player_n ; $i++) {
1480 $user_cur = $this->user[$table->player[$i]];
1481 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1482 if ($user_cur->sess != "") {
1483 if ($update_lacc == TRUE) {
1484 $user_cur->laccwr = $curtime;
1486 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1487 if ($user_cur->subst == "shutdowned") {
1488 $user_cur->stat_set("room");
1489 $user_cur->subst = "sitdown";
1491 else if ($user_cur->subst == "shutdowner") {
1492 $user_cur->stat_set("room");
1493 $user_cur->subst = "standup";
1494 $user_cur->table = -1;
1495 $user_wup[$user_wup_n++] = $user_cur;
1497 $remove_wagon = FALSE;
1498 if($table->wag_own == $table->player[$i]) {
1499 $remove_wagon = TRUE;
1500 $table->wag_reset($curtime);
1503 $user_tab[$user_tab_n++] = $table->player[$i];
1507 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1508 $table->user_rem($this, $user_wup[$wup_idx]);
1510 /* aggiorna l'array dei giocatori al tavolo. */
1512 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1513 log_main("START LOOP");
1514 $user_cur = $this->user[$i];
1515 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1516 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1521 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1523 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1524 if ($user_cur->stat == "room") {
1525 log_main("DOCUMENT.index.php from table");
1527 $ret .= $this->table_content($user_cur, $table_idx);
1528 $ret .= $this->standup_content($user_cur);
1530 $ret .= $table->act_content($user_cur);
1533 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1534 if ($user_tab[$tab_idx] == $i)
1537 // for users that wakeup the room will be reconstructed by index_rd.php
1538 if ($tab_idx < $user_tab_n) {
1539 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1541 // ARRAY_POP DISABLED
1542 // if ($trans_delta == 0)
1543 // while (array_pop($user_cur->comm) != NULL);
1545 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1546 $user_cur->comm[$user_cur->step % COMM_N] = "";
1547 $user_cur->step_inc();
1548 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1549 $user_cur->step_inc();
1550 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1554 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1556 log_main("JOIN_WAKEUP more");
1558 $ret .= $table->act_content($user_cur);
1560 log_main("JOIN_WAKEUP end more");
1562 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1563 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1564 $user_cur->step_inc();
1568 function guarantee_show($user, $user_login, $dt)
1570 GLOBAL $G_lang, $mlang_brisk, $G_base;
1576 if ($user_login == "") {
1580 if (($bdb = BriskDB::create()) == FALSE) {
1584 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1588 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1589 $guar_login = $guar_item->login_get();
1594 $user_tos_vers = $user_item->tos_vers_get();
1596 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1597 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1598 $dt, NICKSERV, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1600 else if ($guar_login == "") {
1601 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1602 $dt, NICKSERV, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1604 else if ($guar_login == $user_login) {
1605 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1606 $dt, NICKSERV, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1609 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1610 $dt, NICKSERV, sprintf($mlang_brisk['gua_info'][$G_lang],
1611 xcape($user_login), xcape($guar_login)));
1616 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1619 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1625 function room_outstandup($user)
1627 $this->room_sitdown($user, -1);
1630 function table_update($user)
1632 log_main("table_update: pre - USER: ".$user->name);
1634 $table_idx = $user->table;
1636 if ($table_idx > -1)
1637 $table = $this->table[$table_idx];
1639 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1641 $user_cur = $this->user[$i];
1642 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1645 $ret = "gst.st = ".($user_cur->step+1)."; ";
1646 if ($table_idx > -1)
1647 $ret .= $this->table_content($user_cur, $table_idx);
1649 if ($user->idx_get() == $i) {
1650 $ret .= $user->myname_innerHTML();
1652 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1653 $user_cur->step_inc();
1656 log_main("table_update: post");
1659 function room_sitdown($user, $table_idx)
1661 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1665 if ($table_idx > -1 && $table_idx < TABLES_N) {
1666 $table = $this->table[$table_idx];
1669 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1670 for ($i = 0 ; $i < TABLES_N ; $i++) {
1671 if ($table->wag_own == $table->player[$i]) {
1672 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1673 $table->wag_reset(time());
1680 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1682 $user_cur = $this->user[$i];
1683 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1686 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1687 if ($table_idx > -1)
1688 $ret .= $this->table_content($user_cur, $table_idx);
1689 $ret .= $this->standup_content($user_cur);
1691 if ($user->idx_get() == $i) {
1692 $ret .= 'subst = "sitdown"; tra.hide(); ';
1693 // clean the action buttons in other tables
1694 for ($e = 0 ; $e < TABLES_N ; $e++) {
1695 $ret .= $this->table[$e]->act_content($user_cur);
1698 else if ($table_idx > -1) {
1699 if ($table->player_n == PLAYERS_N) {
1701 $ret .= $table->act_content($user_cur);
1704 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1705 $user_cur->step_inc();
1709 function chatt_send($user, $mesg)
1711 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1715 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1717 $dt = date("H:i ", $curtime);
1728 $is_normchat = FALSE;
1729 /* for old isolation management $is_ticker = FALSE; */
1730 $update_room = FALSE;
1732 if (strcmp($msg, "/tav") == 0 ||
1733 strncmp($msg, "/tav ", 5) == 0) {
1735 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1736 /* 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>" */
1737 $msg = $mlang_brisk['tickmust'][$G_lang];
1738 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1743 $table = $this->table[$user->table];
1745 if ($table->wag_own != -1) {
1746 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1747 $msg = $mlang_brisk['tickjust'][$G_lang];
1748 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1753 $dtime = $curtime - $table->wag_tout;
1754 if ($dtime < EXPIRE_TIME_WAG) {
1755 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1756 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1757 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1758 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1763 $msg = substr($msg, 5);
1765 $table->wag_set($user->idx_get(), $msg);
1766 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1767 $to_room = $to_user;
1768 /* for old isolation management $is_ticker = TRUE; */
1770 } // /tav chat command
1772 else if (strncmp($msg, "/alarm ", 7) == 0) {
1773 if (strncmp($msg, "/alarm to ", 10) == 0) {
1774 $sp_pos = strpos($msg, " ", 10);
1775 $target = substr($msg, 10, $sp_pos - 10);
1776 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1780 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1783 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1784 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1785 $msg = $mlang_brisk['alarpass'][$G_lang];
1786 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1791 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1792 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1793 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1794 $to_user = sprintf('chatt_sub("%s", [2, "%s"],%s);',
1795 $dt, NICKSERV, $prestr);
1797 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1798 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1799 /* MLANG: "chiudi" */
1800 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1802 } // /alarm chat command
1803 else if (strncmp($msg, "/listen ", 8) == 0) {
1804 $arg = substr($msg, 8);
1806 if (strcasecmp($arg, "isolation") == 0) {
1808 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1809 $user->table >= TABLES_AUTH_N) {
1810 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]);
1814 $user->flags &= ~USER_FLAG_MAP_AUTH;
1815 $user->flags |= USER_FLAG_ISOLAUTH;
1816 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1819 else if (strcasecmp($arg, "auth") == 0) {
1820 $flags_old = $user->flags;
1821 $user->flags &= ~USER_FLAG_MAP_AUTH;
1822 $user->flags |= USER_FLAG_LISTAUTH;
1823 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1826 $flags_old = $user->flags;
1827 $user->flags &= ~USER_FLAG_MAP_AUTH;
1828 $to_user = 'list_set(\'all\', true, \'\'); ';
1831 // if from isolation redraw standup area
1832 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1833 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1837 else if (strcmp($msg, "/authreq") == 0) {
1838 if ($user->flags & USER_FLAG_AUTH) {
1839 $to_user = sprintf('authbox(300,200);');
1842 /* 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." */
1843 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]);
1846 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1847 if ($user->flags & USER_FLAG_AUTH) {
1848 $to_user = sprintf('mesgtoadmbox(500,300);');
1851 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1852 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]);
1855 else if (strncmp($msg, "/nick ", 6) == 0) {
1856 log_main("chatt_send BEGIN");
1859 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1860 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
1864 $msg = "COMMAND ".$msg;
1865 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1866 $user_cur = $this->user[$i];
1868 if ($user_cur->sess == '')
1870 if (strcasecmp($user_cur->name,$name_new) == 0)
1873 if ($i < MAX_PLAYERS) {
1874 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1875 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1879 /* 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>" */
1880 if ($user->flags & USER_FLAG_AUTH) {
1881 if (strcasecmp($user->name,$name_new) != 0) {
1882 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1883 ($user->subst == 'standup' ||
1884 ($user->subst != 'standup' && $this->table[$user->table]->auth_only == FALSE)
1887 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1888 for ($i = 0 ; $i < TABLES_N ; $i++) {
1889 $to_user .= $this->table[$i]->act_content($user);
1893 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
1898 $user->name = $name_new; // OK - nick changed
1899 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1900 if (($user->flags & USER_FLAG_AUTH) == 0) {
1901 if (($bdb = BriskDB::create()) != FALSE) {
1903 /* 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>" */
1904 if ($bdb->login_exists($name_new)) {
1905 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1906 $to_user .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1911 log_main("chatt_send start set");
1913 $update_room = TRUE;
1915 } // nick chat command
1916 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1917 $guar_user = substr($msg, 6);
1919 $this->guarantee_show($user, $guar_user, $dt);
1921 else if (strncmp($msg, "/st ", 4) == 0) {
1922 log_main("chatt_send BEGIN");
1925 $st_str = substr($msg, 4);
1927 if (strcasecmp($st_str, "normale") == 0) {
1928 $st = USER_FLAG_S_NORM;
1930 else if (strcasecmp($st_str, "pausa") == 0) {
1931 $st = USER_FLAG_S_PAU;
1933 else if (strcasecmp($st_str, "fuori") == 0) {
1934 $st = USER_FLAG_S_OUT;
1936 else if (strcasecmp($st_str, "cane") == 0) {
1937 $st = USER_FLAG_S_DOG;
1939 else if (strcasecmp($st_str, "cibo") == 0) {
1940 $st = USER_FLAG_S_EAT;
1942 else if (strcasecmp($st_str, "lavoro") == 0) {
1943 $st = USER_FLAG_S_WRK;
1945 else if (strcasecmp($st_str, "sigaretta") == 0) {
1946 $st = USER_FLAG_S_SMK;
1948 else if (strcasecmp($st_str, "presente") == 0) {
1949 $st = USER_FLAG_S_EYE;
1951 else if (strcasecmp($st_str, "coniglio") == 0) {
1952 $st = USER_FLAG_S_RABB;
1954 else if (strcasecmp($st_str, "calcio") == 0) {
1955 $st = USER_FLAG_S_SOCC;
1957 else if (strcasecmp($st_str, "pupo") == 0) {
1958 $st = USER_FLAG_S_BABY;
1960 else if (strcasecmp($st_str, "pulizie") == 0) {
1961 $st = USER_FLAG_S_MOP;
1963 else if (strcasecmp($st_str, "babbo") == 0) {
1964 $st = USER_FLAG_S_BABBO;
1966 else if (strcasecmp($st_str, "renna") == 0) {
1967 $st = USER_FLAG_S_RENNA;
1969 else if (strcasecmp($st_str, "pupazzo") == 0) {
1970 $st = USER_FLAG_S_PUPAZ;
1972 else if (strcasecmp($st_str, "vischio") == 0) {
1973 $st = USER_FLAG_S_VISCH;
1976 /* MLANG: "Questo stato non esiste." */
1977 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]);
1981 log_main("chatt_send start set");
1982 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1983 $update_room = TRUE;
1984 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1987 } // nick chat command
1989 else { // normal chat line
1990 $is_normchat = TRUE;
1991 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1993 $user->chat_dlt = $user->chat_dlt * 2;
1994 if ($user->chat_dlt > 120)
1995 $user->chat_dlt = 120;
1997 else if ($user->chat_lst == $msg)
1999 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2000 $user->chat_ban = $curtime;
2001 $user->chat_dlt = 5;
2005 $user->chat_ban = 0;
2006 $user->chat_dlt = 0;
2010 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2013 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2014 // temporary silentiation for troll (will became array check)
2015 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2016 $to_room = $to_user;
2019 log_legal($curtime, $user->ip, $user,
2020 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2022 $user->chat_lst = "$msg";
2023 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2033 // Output to clients
2036 if ($to_user != FALSE) {
2037 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2038 $user->comm[$user->step % COMM_N] .= $to_user;
2042 if ($to_room != FALSE) {
2043 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2044 $user_cur = $this->user[$i];
2045 if ($target != "" && $user_cur->name != $target)
2047 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
2050 if ($is_normchat == TRUE) {
2051 // use MAP_AUTH to check if auth or isolation
2052 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2053 if (($user->flags & USER_FLAG_AUTH) == 0) {
2059 else if ($is_ticker) {
2060 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2061 if ($user->table >= TABLES_AUTH_N)
2066 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2067 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2068 $user_cur->step_inc();
2073 // FIXME BRISK4: include for each kind of table
2074 require_once("${G_base}briskin5/Obj/briskin5.phh");
2075 // Before all align times with table timeout
2076 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2077 if (isset($this->match[$table_idx])) {
2078 $bin5 = $this->match[$table_idx];
2080 $bin5_table = $bin5->table[0];
2081 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2082 // stat must be "table" by definition
2083 $bin5_user = $bin5->user[$i];
2085 if ($target != "" && $bin5_user->name != $target)
2087 log_main("writa: ".$user_mesg);
2088 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2089 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2090 $bin5_user->step_inc();
2092 } // if (isset($this->match
2093 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2094 } // if ($to_tabl == true ...
2097 if ($user->stat == 'room' && $user->subst == 'standup') {
2098 $this->standup_update($user);
2100 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2101 log_main("chatt_send pre table update");
2102 $this->table_update($user);
2103 log_main("chatt_send post table update");
2105 } // if ($update_room ...
2108 } // function chatt_send( ...
2110 function get_user($sess, &$idx)
2114 if (validate_sess($sess)) {
2115 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2116 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2119 $ret = $this->user[$i];
2123 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2124 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2125 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2128 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2135 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
2138 * if ($idx > -1 && ret == FALSE) => duplicated nick
2139 * if ($idx == -2 && ret == FALSE) => invalid name
2140 * if ($idx == -3 && ret == FALSE) => wrong password
2141 * if ($idx == -1 && ret == FALSE) => no space left
2142 * if ($idx == 0 && ret == user) => SUCCESS
2143 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
2146 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
2152 $authenticate = FALSE;
2154 $login_exists = FALSE;
2156 $ghost_auth = FALSE;
2161 if (($name_new = validate_name($name)) == FALSE) {
2166 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2167 if (validate_sess($sess) == FALSE)
2170 /* if pass != FALSE verify the login with pass */
2171 log_auth("XXX", "auth1");
2173 if (($bdb = BriskDB::create()) != FALSE) {
2175 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2176 log_auth("XXX", "auth2");
2177 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2178 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2180 if ($authenticate != FALSE) {
2181 $user_type = $authenticate->type_get();
2189 $login_exists = $bdb->login_exists($name_new);
2193 // if db is down, send a warning and verify only current users
2194 // no actions at this moment
2196 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2198 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2202 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2204 continue; // NOTE: CHECK IT !!
2206 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2207 if ($authenticate != FALSE) {
2209 $ghost_auth = ($this->user[$i]->flags & USER_FLAG_AUTH);
2220 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2222 /* there is another user logged with your account and you and him have authenticated => new user
2223 get the session of the old user */
2224 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2227 $ghost_user = $this->user[$ghost];
2229 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2230 $ghost_user->step_inc();
2233 $ghost_user->sess = $sess;
2236 $ghost_user->sess = $sess;
2239 // If user at the table we need to update the table data too
2240 $table_idx = $ghost_user->table;
2241 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2242 require_once("${G_base}briskin5/Obj/briskin5.phh");
2243 if (isset($this->match[$table_idx])) {
2244 $bin5 = $this->match[$table_idx];
2246 if ($bin5->the_end != TRUE) {
2247 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2248 $bin5->user[$ghost_user->table_pos]->step_inc();
2249 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2255 return ($this->user[$ghost]);
2257 else if ($idx != -1 && $i == MAX_PLAYERS) {
2262 $this->user[$idx]->sess = $sess;
2265 $this->user[$idx]->sess = $sess;
2267 $this->user[$idx]->name = $name_new; // OK - add new user
2268 $this->user[$idx]->stat_set("room");
2269 $this->user[$idx]->step_set(0);
2270 while (array_pop($this->user[$idx]->comm) != NULL);
2271 $this->user[$idx]->subst = "standup";
2272 $this->user[$idx]->lacc = $curtime;
2273 $this->user[$idx]->laccwr = $curtime;
2274 $this->user[$idx]->bantime = 0;
2275 $this->user[$idx]->ip = $ip;
2277 $this->user[$idx]->rec = $authenticate;
2278 $this->user[$idx]->flags = $user_type;
2279 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2280 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2281 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2283 if ($authenticate != FALSE) {
2284 $this->user[$idx]->code = $authenticate->code_get();
2286 // all this part is included in the db server
2287 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2289 if (isset($cookie['CO_list'])) {
2290 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2291 if (strcmp($cookie['CO_list'], "auth") == 0) {
2292 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2293 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2295 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2296 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2297 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2300 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2305 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2308 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2310 log_main("ghost: rename!");
2311 $ghost_user = $this->user[$ghost];
2313 if ($ghost_auth == FALSE) {
2314 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2315 $ghostname = 'ghost'.$sfx;
2316 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2317 if (strcmp("", $this->user[$i]->sess) == 0)
2320 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2325 if ($ghostname != '')
2329 $ghost_user->name = $ghostname;
2331 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2332 $this->standup_update($ghost_user);
2335 log_main("chatt_send pre table update");
2336 $this->table_update($ghost_user);
2337 log_main("chatt_send post table update");
2339 } // if ($ghost_auth == FALSE
2341 // FIXME: cacciare il vecchio utente room && table (if needed)
2342 $ghost_user->the_end = TRUE;
2343 $ghost_user->lacc = 0;
2344 $this->garbage_manager(TRUE);
2346 } // if ($ghost > -1) {
2351 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));
2353 $ret = $this->user[$real_idx];
2360 function standup_update($user)
2362 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2363 $user_cur = $this->user[$i];
2364 if ($user_cur->sess == '')
2367 log_main("STANDUP START: ".$user_cur->stat);
2369 if ($user_cur->stat == 'room') {
2370 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2371 if ($user->idx_get() == $i) {
2372 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2374 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2376 $user_cur->step_inc();
2381 function dump_data()
2383 $brisk_ser = serialize($this);
2384 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2385 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2392 function standup_content($user)
2397 if ($user->stat != 'room')
2400 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2401 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2406 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2408 $content = ' j_stand_cont( [ ';
2410 $user_cur_id = $user->idx_get();
2411 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2412 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2415 $flags = $this->user[$i]->flags;
2417 // sql record exists AND last donate > 2013-01-01
2418 if ($this->user[$i]->is_supp_custom()) {
2419 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2425 if ($this->user[$i]->subst == "standup") {
2426 if ($user_cur_id == $i) {
2430 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2431 xcape($this->user[$i]->name), $supp_comp_s);
2440 function table_content($user, $table_idx)
2446 // Si possono usare i dati nella classe table
2449 $sess = $user->sess;
2450 $table = $this->table[$table_idx];
2452 if ($user->stat != 'room')
2455 $user_cur_id = $user->idx_get();
2457 for ($i = 0 ; $i < $table->player_n ; $i++) {
2458 $user_cur = $this->user[$table->player[$i]];
2460 $flags = $user_cur->flags;
2462 if ($user_cur_id == $table->player[$i])
2465 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2466 if ($user_cur->is_supp_custom())
2467 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2471 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2472 xcape($user_cur->name), $supp_comp_s);
2477 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2482 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2484 GLOBAL $G_ban_list, $G_black_list;
2486 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2487 $remote_addr = addrtoipv4($addr);
2489 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2490 if ($this->black_check($remote_addr)) {
2491 // TODO: waiting async 5 sec before close
2492 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2496 $enc = get_encoding($header);
2497 if (isset($header['User-Agent'])) {
2498 if (strstr($header['User-Agent'], "MSIE")) {
2499 $transp_type = "htmlfile";
2502 $transp_type = "xhr";
2506 $transp_type = "iframe";
2508 force_no_cache($header_out);
2514 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2515 $content = ob_get_contents();
2518 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2519 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2523 case "index_wr.php":
2525 // Enhance required: in the POST case, after the header you must get content
2526 // from the socket, waiting if necessary
2530 index_wr_main($this, $addr, $get, $post, $cookie);
2531 $content = ob_get_contents();
2534 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2538 case "index_rd.php":
2539 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2541 if ($transp == 'websocket')
2545 if (!isset($cookie['sess'])
2546 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2548 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2550 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2555 $this->sess_cur_set($user->sess);
2556 // close a previous opened index_read_ifra socket, if exists
2557 if (($prev = $user->rd_socket_get()) != NULL) {
2558 $s_a_p->socks_unset($user->rd_socket_get());
2559 fclose($user->rd_socket_get());
2560 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2561 $user->rd_socket_set(NULL);
2565 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2566 $response = headers_render($header_out, -1).$user->chunked_content($content);
2567 $response_l = mb_strlen($response, "ASCII");
2569 $wret = @fwrite($new_socket, $response, $response_l);
2570 if ($wret < $response_l) {
2571 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2572 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2575 $user->rd_cache_set("");
2577 fflush($new_socket);
2580 $s_a_p->socks_set($new_socket, $user, NULL);
2581 $user->rd_socket_set($new_socket);
2582 printf(" - qui ci siamo - ");
2589 if (!(BRISK_DEBUG & DBG_ENGI))
2591 fprintf(STDERR, "TEST.PHP running\n");
2592 if (isset($post['data'])) {
2593 $content = $post['data'];
2596 $content = "NO DATA AVAILABLE";
2598 $header_out['Content-Type'] = 'text/plain';
2599 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2603 /* FAR TODO: move all into an array of registered sub-apps */
2604 $subs = "briskin5/";
2605 $subs_l = strlen($subs);
2606 if (!strncmp($path, $subs, $subs_l)) {
2607 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2616 function match_add($idx, $match)
2618 $this->match[$idx] = $match;
2621 function match_del($idx)
2623 unset($this->match[$idx]);
2626 function match_get($idx, $token)
2628 if (isset($this->match[$idx])) {
2630 || $token == $this->match[$idx]->table_token) {
2631 return ($this->match[$idx]);
2636 function sess_cur_set($sess)
2638 static::$sess_cur = $sess;
2641 static function sess_cur_get()
2643 return(static::$sess_cur);
2645 } // end class Brisk
2647 function make_seed()
2649 list($usec, $sec) = explode(' ', microtime());
2650 return (float) $sec + ((float) $usec * 100000);
2653 function btrace_line($ar)
2655 GLOBAL $G_btrace_pref_sub;
2658 for ($i = 0 ; $i < count($ar) ; $i++) {
2659 $with_class = isset($ar[$i]['class']);
2660 $with_file = isset($ar[$i]['file']);
2661 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2662 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2663 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2664 ($with_file ? $ar[$i]['line'] : ""));
2670 function trace_ftok($id, $add)
2672 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2673 $tok=@ftok($id, $add);
2675 log_shme($tok.": ".$id." + ".$add);
2680 function log_mop($step, $log)
2684 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2687 $sess = Brisk::sess_cur_get();
2688 if (isset($sess) == FALSE)
2693 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2696 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2697 $btrace = btrace_line(debug_backtrace());
2700 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2701 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2707 function log_only2($log)
2711 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2714 $sess = Brisk::sess_cur_get();
2715 if (isset($sess) == FALSE)
2720 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2723 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2724 $btrace = btrace_line(debug_backtrace());
2727 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2728 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2733 function log_crit($log)
2737 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2740 $sess = Brisk::sess_cur_get();
2741 if (isset($sess) == FALSE)
2746 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2749 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2750 $btrace = btrace_line(debug_backtrace());
2753 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2754 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2759 function log_only($log)
2763 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2766 $sess = Brisk::sess_cur_get();
2767 if (isset($sess) == FALSE)
2772 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2775 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2776 $btrace = btrace_line(debug_backtrace());
2779 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2780 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2785 function log_main($log)
2789 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2792 $sess = Brisk::sess_cur_get();
2793 if (isset($sess) == FALSE)
2798 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2801 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2802 $btrace = btrace_line(debug_backtrace());
2805 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2806 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2811 function log_rd($log)
2815 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2818 $sess = Brisk::sess_cur_get();
2819 if (isset($sess) == FALSE)
2824 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2827 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2828 $btrace = btrace_line(debug_backtrace());
2831 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2832 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2837 function log_rd2($log)
2841 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2844 $sess = Brisk::sess_cur_get();
2845 if (isset($sess) == FALSE)
2850 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2853 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2854 $btrace = btrace_line(debug_backtrace());
2858 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2859 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2864 function log_send($log)
2868 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2871 $sess = Brisk::sess_cur_get();
2872 if (isset($sess) == FALSE)
2877 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2880 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2881 $btrace = btrace_line(debug_backtrace());
2884 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2885 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2890 function log_lock($log)
2894 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2897 $sess = Brisk::sess_cur_get();
2898 if (isset($sess) == FALSE)
2903 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2906 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2907 $btrace = btrace_line(debug_backtrace());
2910 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2911 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2916 function log_wr($log)
2920 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2923 $sess = Brisk::sess_cur_get();
2924 if (isset($sess) == FALSE)
2929 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2932 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2933 $btrace = btrace_line(debug_backtrace());
2936 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2937 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2942 function log_load($log)
2946 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2949 $sess = Brisk::sess_cur_get();
2950 if (isset($sess) == FALSE)
2955 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2958 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2959 $btrace = btrace_line(debug_backtrace());
2962 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2963 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2968 function log_auth($sess, $log)
2972 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2975 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
2978 if ((BRISK_DEBUG | ($sess == 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("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
2988 function log_shme($log)
2992 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 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_SHME) == 0)
3004 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3005 $btrace = btrace_line(debug_backtrace());
3008 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3009 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3016 // function log_legal($curtime, $sess, $name, $where, $mesg)
3017 function log_legal($curtime, $addr, $user, $where, $mesg)
3020 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3021 /* Unix time | session | nickname | IP | where was | mesg */
3022 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3023 ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'),
3024 $user->name, $addr, $where , $mesg));
3029 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3034 if ($sitted < PLAYERS_N) {
3042 if ($table == $cur_table)
3049 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3054 function show_notify($text, $tout, $butt, $w, $h)
3056 log_main("SHOW_NOTIFY: ".$text);
3057 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3060 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3062 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3063 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);
3066 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3068 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3071 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3072 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3075 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3076 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);
3080 function root_welcome($user)
3082 GLOBAL $root_wellarr, $G_lang;
3086 $dt = date("H:i ", $curtime);
3088 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3089 $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3096 function validate_sess($sess)
3098 if (strlen($sess) == SESS_LEN)
3104 function validate_name($name)
3106 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3108 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3110 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3117 function playsound($filename)
3119 return (sprintf('playsound("flasou", "%s");', $filename));
3122 function secstoword($secs)
3128 $mins = floor($secs / 60);
3130 if ($G_lang == 'en') {
3132 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3135 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3139 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3142 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3147 function sharedmem_sz($tok)
3149 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3150 log_main("shmop_open failed");
3153 $shm_sz = shmop_size($shm_id);
3154 shmop_close($shm_id);
3156 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3163 static function lock_data($is_exclusive)
3165 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3166 self::$delta_t = microtime(TRUE);
3167 log_lock("LOCK warrant [".self::$delta_t."]");
3175 static function unlock_data($res)
3179 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3188 static function lock_data($is_exclusive)
3190 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3191 self::$delta_t = microtime(TRUE);
3192 log_lock("LOCK poll [".self::$delta_t."]");
3200 static function unlock_data($res)
3204 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3210 function carousel_top()
3215 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));
3218 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>'));