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 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;
625 define('TABLE_AUTH_TY_PUBL', 0);
626 define('TABLE_AUTH_TY_AUTH', 1);
627 define('TABLE_AUTH_TY_CERT', 2);
635 var $auth_type; // required authorization to sit down
642 var $table_start; // information field
650 function create($idx)
652 if (($thiz = new Table()) == FALSE)
656 $thiz->player = array();
659 if ($idx < TABLES_CERT_N)
660 $thiz->auth_type = TABLE_AUTH_TY_CERT;
661 else if ($idx < TABLES_AUTH_N)
662 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
664 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
670 $thiz->table_token = "";
671 $thiz->table_start = 0;
673 $thiz->wakeup_time = 0;
680 $this->idx = $from->idx;
681 $this->player = array();
682 for ($i = 0 ; $i < $from->player_n ; $i++)
683 $this->player[$i] = $from->player[$i];
684 $this->player_n = $from->player_n;
686 log_main("PLAYER_N - parent::copy.".$this->player_n);
688 $this->auth_type = $from->auth_type;
690 $this->wag_own = $from->wag_own;
691 $this->wag_com = $from->wag_com;
692 $this->wag_tout = $from->wag_tout;
694 $this->table_token = $from->table_token;
695 $this->table_start = $from->table_start;
697 $this->wakeup_time = $from->wakeup_time;
700 function myclone($from)
702 if (($thiz = new Table()) == FALSE)
710 function spawn($from)
712 if (($thiz = new Table()) == FALSE)
715 $thiz->idx = $from->idx;
716 $thiz->player = array();
717 for ($i = 0 ; $i < $from->player_n ; $i++)
718 $thiz->player[$i] = $i;
719 $thiz->player_n = $from->player_n;
721 $thiz->auth_type = $from->auth_type;
723 $thiz->wag_own = $from->wag_own;
724 $thiz->wag_com = $from->wag_com;
725 $thiz->wag_tout = $from->wag_tout;
727 $thiz->table_token = $from->table_token;
728 $thiz->table_start = $from->table_start;
730 $thiz->wakeup_time = $from->wakeup_time;
735 function wag_set($user_idx, $mesg)
739 $this->wag_own = $user_idx;
740 $this->wag_com = $mesg;
744 function wag_reset($timeout)
746 log_main("WAG_RESET");
748 unset($this->wag_own);
751 $this->wag_tout = $timeout;
754 function player_get($idx)
756 return ($this->player[$idx]);
759 function player_set($idx, $player)
761 $this->player[$idx] = $player;
764 function user_add($idx)
766 $this->player[$this->player_n] = $idx;
769 return ($this->player_n - 1);
772 function user_rem($brisk, $user)
774 $tabpos = $user->table_pos;
776 /* verifico la consistenza dei dati */
777 if ($brisk->user[$this->player[$tabpos]] == $user) {
779 /* aggiorna l'array dei giocatori al tavolo. */
780 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
781 $this->player[$i] = $this->player[$i+1];
782 $user_cur = $brisk->user[$this->player[$i]];
783 $user_cur->table_pos = $i;
788 log_main("INCONSISTENCY ON TABLE.");
792 // Table->act_content - return 'id' of type of output required for table button
793 function act_content($user)
796 $isstanding = ($user->subst == 'standup');
797 $sitted = $this->player_n;
799 $cur_table = $user->table;
803 if ($sitted < PLAYERS_N) {
804 switch ($this->auth_type) {
805 case TABLE_AUTH_TY_CERT:
806 if ($user->is_cert())
811 case TABLE_AUTH_TY_AUTH:
812 if ($user->is_auth())
827 if ($table == $cur_table)
834 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
847 function Delay_Manager($triglevel)
849 $this->triglevel = $triglevel;
850 $this->delta = array();
851 $this->lastcheck = 0;
854 function delta_get($curtime)
856 // clean too old delta items
857 for ($i = 0 ; $i < count($this->delta) ; $i++) {
858 if ($this->delta[$i][0] < $curtime) {
859 array_splice($this->delta, $i, 1);
864 // add new delta items if delay exceeded $this->triglevel sec
865 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
866 $delta = $curtime - $this->lastcheck - $this->triglevel;
867 array_push($this->delta, array($curtime + $delta , $delta));
868 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
871 // extract the maximum valid delta
873 for ($i = 0 ; $i < count($this->delta) ; $i++) {
874 $delta_cur = $this->delta[$i][1];
875 if ($delta_max < $delta_cur)
876 $delta_max = $delta_cur;
879 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
884 function lastcheck_set($curtime)
886 $this->lastcheck = $curtime;
894 function Client_prefs()
898 static function from_user($user)
900 $thiz = new Client_prefs();
901 $thiz->user_load($user);
906 static function from_json($json)
908 $thiz = new Client_prefs();
909 if ($thiz->json_load($json) == FALSE) {
917 function user_load($user)
919 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
920 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
921 if ($user->rec != FALSE) {
922 $this->supp_comp = $user->rec->supp_comp_get();
925 $this->supp_comp = "000000000000";
928 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
931 function json_load($json_s)
936 if (gettype($json_s) == "string") {
937 if (($json = json_decode($json_s)) == FALSE)
943 if ($this->listen < 0 || $this->listen > 2)
945 $this->listen = $json->listen;
947 if (mb_strlen($json->supp_comp, "ASCII") != 12)
950 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
951 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
952 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
958 $this->supp_comp = $json->supp_comp;
965 function store($user, $is_save)
968 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
969 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
970 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
971 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
973 if ($user->is_supp_custom()) {
974 $user->rec->supp_comp_set($this->supp_comp);
977 $user->prefs_store();
986 var $crystal_filename;
990 var $comm; // commands for many people
991 var $step; // current step of the comm array
992 var $garbage_timeout;
995 var $ban_list; // ban list (authized allowed)
996 var $black_list; // black list (anti-dos, noone allowed)
1000 public static $sess_cur;
1007 static function create($crystal_filename, $ban_list, $black_list) {
1008 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1009 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1010 fprintf(STDERR, "ROOM FROM FILE\n");
1011 rename($crystal_filename, $crystal_filename.".old");
1013 $brisk->reload($ban_list, $black_list);
1019 fprintf(STDERR, "NEW ROOM\n");
1020 $thiz = new Brisk();
1022 $thiz->crystal_filename = $crystal_filename;
1023 $thiz->user = array();
1024 $thiz->table = array();
1025 $thiz->match = array();
1027 $thiz->ban_list = NULL;
1028 $thiz->black_list = NULL;
1030 fprintf(STDERR, "PRE IPCLASS_UPDATE (%d, %d)\n", count($ban_list), count($black_list));
1031 $thiz->ipclass_update('ban_list', $ban_list);
1032 $thiz->ipclass_update('black_list', $black_list);
1033 fprintf(STDERR, "POST IPCLASS_UPDATE %d %d\n", count($thiz->ban_list), count($thiz->black_list));
1035 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1036 $thiz->user[$i] = User::create($thiz, $i, "", "");
1039 for ($i = 0 ; $i < TABLES_N ; $i++) {
1040 $thiz->table[$i] = Table::create($i);
1042 $thiz->garbage_timeout = 0;
1043 $thiz->shm_sz = SHM_DIMS_MIN;
1045 $thiz->delay_mgr = new Delay_Manager(1.5);
1047 static::$sess_cur = FALSE;
1052 function ipclass_update($ip_out_s, $ip_in)
1054 fprintf(STDERR, "N_IN: %d\n", count($ip_in));
1056 $ip_out = &$this->$ip_out_s;
1058 // if already set clean the ban_list property
1060 $ct = count($ip_out);
1061 for ($i = 0 ; $i < $ct ; $i++) {
1068 for ($i = 0 ; $i < count($ip_in) ; $i++) {
1069 $ip_out[$i] = new IPClass($ip_in[$i]);
1073 function reload($ban_list, $black_list)
1075 fprintf(STDERR, "RELOAD STUFF (%d)(%d)\n", count($ban_list), count($black_list));
1077 $this->ipclass_update("ban_list", $ban_list);
1078 $this->ipclass_update("black_list", $black_list);
1080 $this->banned_kickoff();
1081 $this->garbage_manager(TRUE);
1084 function banned_kickoff()
1088 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1089 $table_cur = $this->table[$table_idx];
1090 // if the table is complete and exists we check users IP
1092 if ($table_cur->player_n == PLAYERS_N) {
1093 if (isset($this->match[$table_idx]) &&
1094 $table_cur->table_token == $bin5->table_token) {
1095 log_main("PLAYERS == N TABLE ".$table_idx);
1097 $bin5 = $this->match[$table_idx];
1099 $is_ban |= $bin5->banned_kickoff();
1104 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1105 $user_cur = $this->user[$i];
1107 if ($user_cur->sess == "")
1110 // check if the IP is blacklisted
1111 if ($this->black_check($user_cur->ip)) {
1112 $user_cur->lacc = 0;
1117 // if authorized not check if banlisted
1118 if ($user_cur->is_auth()) {
1122 if ($this->ban_check($user_cur->ip)) {
1123 $user_cur->lacc = 0;
1131 function ban_check($ip_str)
1133 $ip = ip2long($ip_str);
1134 fprintf(STDERR, "Brisk::ban_check %d\n", count($this->ban_list));
1135 for ($i = 0 ; $i < count($this->ban_list) ; $i++) {
1136 fprintf(STDERR, "ban_list[%d] = %x (%x)\n", $i,
1137 $this->ban_list[$i]->addr, $this->ban_list[$i]->mask);
1138 if ($this->ban_list[$i]->match($ip)) {
1139 fprintf(STDERR, "\n\nMATCHA!\n\n");
1146 function black_check($ip_str)
1148 $ip = ip2long($ip_str);
1149 fprintf(STDERR, "Brisk::black_check %d\n", count($this->black_list));
1150 for ($i = 0 ; $i < count($this->black_list) ; $i++) {
1151 fprintf(STDERR, "black_list[%d] = %x (%x)\n", $i,
1152 $this->black_list[$i]->addr, $this->black_list[$i]->mask);
1153 if ($this->black_list[$i]->match($ip)) {
1154 fprintf(STDERR, "\n\nMATCHA!\n\n");
1161 function garbage_manager($force)
1163 GLOBAL $G_lang, $mlang_brisk, $G_base;
1167 log_rd2("garbage_manager START");
1169 /* Garbage collector degli utenti in timeout */
1170 $curtime = microtime(TRUE);
1172 $delta = $this->delay_mgr->delta_get($curtime);
1174 if (!$force && !($this->garbage_timeout < $curtime)) {
1175 $this->delay_mgr->lastcheck_set($curtime);
1179 // Before all align times with table timeout
1180 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1181 $table_cur = $this->table[$table_idx];
1182 // if the table is complete and exists its shared mem we get the info about users lacc
1184 if ($table_cur->player_n == PLAYERS_N) {
1185 log_main("PLAYERS == N TABLE ".$table_idx);
1188 $no_recovery = FALSE;
1189 if (isset($this->match[$table_idx])) {
1190 $bin5 = $this->match[$table_idx];
1192 if ($table_cur->table_token != $bin5->table_token) {
1193 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1194 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1195 $no_recovery = TRUE;
1199 if ($bin5 != FALSE) {
1203 log_main("garbage_manager: bri loaded successfully.");
1204 $bin5->garbage_manager(TRUE);
1206 $bin5_table = $bin5->table[0];
1208 // is the end of the table
1210 if ($bin5->the_end == TRUE) {
1212 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1214 log_main("garbage_manager: INSIDE THE END.");
1216 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1217 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1218 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1221 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1222 // stat must be "table" by definition
1223 $user_cur = $this->user[$table_cur->player[$i]];
1224 $bin5_user = $bin5->user[$i];
1226 $user_cur->subst = $bin5_user->subst;
1227 $user_cur->step = $bin5_user->step;
1228 $user_cur->lacc = $bin5_user->lacc;
1229 $user_cur->laccwr = $bin5_user->lacc;
1230 $user_cur->bantime = $bin5_user->bantime;
1233 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1235 $this->room_join_wakeup($user_cur, FALSE, 0);
1236 $table_cur->table_token = "";
1237 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1239 $this->match_del($table_idx);
1242 log_main("gm:: save_data");
1244 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1245 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1248 } // if ($bin5 == FALSE
1249 else if ($no_recovery == FALSE) {
1250 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1252 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1253 $user_cur = $this->user[$table_cur->player[$i]];
1254 $user_cur->subst = "shutdowner";
1255 $user_cur->step_inc();
1257 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1258 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1259 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1260 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1261 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1262 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1263 $user_cur->step_inc();
1266 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1267 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1268 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1270 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1272 $this->room_join_wakeup($user_cur, TRUE, -2);
1273 $table_cur->table_token = "";
1276 } // if ($table_cur->player_n == PLAYERS_N) {
1277 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1279 log_rd2("out new loop.");
1281 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1282 $user_cur = $this->user[$i];
1284 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1286 if ($user_cur->sess == "")
1289 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1290 // Auto logout dell'utente
1291 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1293 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1294 log_auth($user_cur->sess, "Autologout session.");
1298 log_rd2("AUTO LOGOUT.");
1299 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1300 $this->room_wakeup($user_cur);
1301 else if ($user_cur->subst == 'standup')
1302 $this->room_outstandup($user_cur);
1304 log_rd2("LOGOUT FROM WHAT ???");
1308 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1309 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1310 $this->room_wakeup($user_cur);
1311 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1312 /* 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" */
1313 $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);
1314 $user_cur->step_inc();
1318 log_rd2("GARBAGE UPDATED!");
1320 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1323 $this->delay_mgr->lastcheck_set($curtime);
1327 function show_room($user_step, $user)
1329 GLOBAL $G_lang, $mlang_brisk;
1330 log_main("show_room: username: ".$user->name);
1332 $ret = sprintf('gst.st = %d; ', $user_step);
1334 $prefs = Client_prefs::from_user($user);
1335 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1338 if ($user->flags & USER_FLAG_ISOLAUTH) {
1339 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1341 else if ($user->flags & USER_FLAG_LISTAUTH) {
1342 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1345 $ret .= 'list_set(\'all\', false, \'\' ); ';
1349 if ($user->subst == 'standup')
1350 $ret .= "tra.show(); ";
1352 $ret .= "tra.hide(); ";
1354 $ret .= sprintf('stat = "%s";', $user->stat);
1356 $ret .= root_welcome($user);
1357 if ($user->flags & USER_FLAG_DBFAILED) {
1358 $ret .= "gst.st = ".($user->step+1)."; ";
1359 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1362 $ret .= sprintf('subst = "%s";', $user->subst);
1363 $ret .= $user->myname_innerHTML();
1365 for ($i = 0 ; $i < TABLES_N ; $i++) {
1367 $ret .= $this->table_content($user, $i);
1369 $ret .= $this->table[$i]->act_content($user);
1370 if ($this->table[$i]->wag_own != -1)
1371 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1373 $ret .= sprintf('tra.rem(%d); ', $i);
1375 $ret .= $this->standup_content($user);
1376 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1382 function room_wakeup($user)
1384 $table_idx = $user->table;
1385 $table = $this->table[$table_idx];
1387 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1391 $from_table = ($user->stat == "table");
1393 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1395 for ($i = 0 ; $i < $table->player_n ; $i++) {
1396 $user_cur = $this->user[$table->player[$i]];
1397 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1399 if ($user->idx_get() != $table->player[$i]) {
1400 $user_cur->stat_set("room");
1401 $user_cur->subst = "sitdown";
1402 $user_cur->laccwr = $curtime;
1404 else if ($user->sess != "") {
1405 $user_cur->stat_set("room");
1406 $user_cur->subst = "standup";
1407 $user_cur->laccwr = $curtime;
1408 $user_cur->table = -1;
1413 $user->stat_set("room");
1414 $user->subst = "standup";
1415 $user->laccwr = $curtime;
1418 $remove_wagon = FALSE;
1419 if($table->wag_own == $user->idx_get()) {
1420 $table->wag_reset($curtime);
1421 $remove_wagon = TRUE;
1425 /* aggiorna l'array dei giocatori al tavolo. */
1426 $table->user_rem($this, $user);
1428 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1429 $user_cur = $this->user[$i];
1430 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1433 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1435 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1436 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1437 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1438 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1439 log_main("DOCUMENT.index.php: from table");
1441 else if ($user_cur->stat == "room") {
1442 log_main("DOCUMENT.index.php: from table");
1444 $ret .= $this->table_content($user_cur, $table_idx);
1445 $ret .= $this->standup_content($user_cur);
1447 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1448 $ret .= $table->act_content($user);
1450 if ($user->idx_get() == $i) {
1451 // set the new status
1452 $ret .= 'subst = "standup"; tra.show(); ';
1453 // clean the action buttons in other tables
1454 for ($e = 0 ; $e < TABLES_N ; $e++) {
1455 if ($this->table[$e]->player_n < PLAYERS_N) {
1456 $ret .= $this->table[$e]->act_content($user);
1461 $ret .= $table->act_content($user_cur);
1464 log_wr("ROOM_WAKEUP: ".$ret);
1465 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1466 $user_cur->step_inc();
1470 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1472 $table_idx = $user->table;
1473 $table = $this->table[$table_idx];
1475 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1478 $user_wup = array();
1480 $user_tab = array();
1482 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1484 for ($i = 0 ; $i < $table->player_n ; $i++) {
1485 $user_cur = $this->user[$table->player[$i]];
1486 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1487 if ($user_cur->sess != "") {
1488 if ($update_lacc == TRUE) {
1489 $user_cur->laccwr = $curtime;
1491 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1492 if ($user_cur->subst == "shutdowned") {
1493 $user_cur->stat_set("room");
1494 $user_cur->subst = "sitdown";
1496 else if ($user_cur->subst == "shutdowner") {
1497 $user_cur->stat_set("room");
1498 $user_cur->subst = "standup";
1499 $user_cur->table = -1;
1500 $user_wup[$user_wup_n++] = $user_cur;
1502 $remove_wagon = FALSE;
1503 if($table->wag_own == $table->player[$i]) {
1504 $remove_wagon = TRUE;
1505 $table->wag_reset($curtime);
1508 $user_tab[$user_tab_n++] = $table->player[$i];
1512 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1513 $table->user_rem($this, $user_wup[$wup_idx]);
1515 /* aggiorna l'array dei giocatori al tavolo. */
1517 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1518 log_main("START LOOP");
1519 $user_cur = $this->user[$i];
1520 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1521 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1526 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1528 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1529 if ($user_cur->stat == "room") {
1530 log_main("DOCUMENT.index.php from table");
1532 $ret .= $this->table_content($user_cur, $table_idx);
1533 $ret .= $this->standup_content($user_cur);
1535 $ret .= $table->act_content($user_cur);
1538 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1539 if ($user_tab[$tab_idx] == $i)
1542 // for users that wakeup the room will be reconstructed by index_rd.php
1543 if ($tab_idx < $user_tab_n) {
1544 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1546 // ARRAY_POP DISABLED
1547 // if ($trans_delta == 0)
1548 // while (array_pop($user_cur->comm) != NULL);
1550 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1551 $user_cur->comm[$user_cur->step % COMM_N] = "";
1552 $user_cur->step_inc();
1553 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1554 $user_cur->step_inc();
1555 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1559 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1561 log_main("JOIN_WAKEUP more");
1563 $ret .= $table->act_content($user_cur);
1565 log_main("JOIN_WAKEUP end more");
1567 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1568 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1569 $user_cur->step_inc();
1573 function guarantee_show($user, $user_login, $dt)
1575 GLOBAL $G_lang, $mlang_brisk, $G_base;
1581 if ($user_login == "") {
1585 if (($bdb = BriskDB::create()) == FALSE) {
1589 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1593 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1594 $guar_login = $guar_item->login_get();
1599 $user_tos_vers = $user_item->tos_vers_get();
1601 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1602 $mesg = sprintf('chatt_sub("%s",[2,"%s"],"%s");',
1603 $dt, NICKSERV, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1605 else if ($guar_login == "") {
1606 $mesg = sprintf('chatt_sub("%s",[2,"%s"],"%s");',
1607 $dt, NICKSERV, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1609 else if ($guar_login == $user_login) {
1610 $mesg = sprintf('chatt_sub("%s",[2,"%s"],"%s");',
1611 $dt, NICKSERV, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1614 $mesg = sprintf('chatt_sub("%s",[2,"%s"],"%s");',
1615 $dt, NICKSERV, sprintf($mlang_brisk['gua_info'][$G_lang],
1616 xcape($user_login), xcape($guar_login)));
1621 $mesg = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1624 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1630 function room_outstandup($user)
1632 $this->room_sitdown($user, -1);
1635 function table_update($user)
1637 log_main("table_update: pre - USER: ".$user->name);
1639 $table_idx = $user->table;
1641 if ($table_idx > -1)
1642 $table = $this->table[$table_idx];
1644 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1646 $user_cur = $this->user[$i];
1647 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1650 $ret = "gst.st = ".($user_cur->step+1)."; ";
1651 if ($table_idx > -1)
1652 $ret .= $this->table_content($user_cur, $table_idx);
1654 if ($user->idx_get() == $i) {
1655 $ret .= $user->myname_innerHTML();
1657 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1658 $user_cur->step_inc();
1661 log_main("table_update: post");
1664 function room_sitdown($user, $table_idx)
1666 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1670 if ($table_idx > -1 && $table_idx < TABLES_N) {
1671 $table = $this->table[$table_idx];
1674 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1675 for ($i = 0 ; $i < TABLES_N ; $i++) {
1676 if ($table->wag_own == $table->player[$i]) {
1677 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1678 $table->wag_reset(time());
1685 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1687 $user_cur = $this->user[$i];
1688 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1691 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1692 if ($table_idx > -1)
1693 $ret .= $this->table_content($user_cur, $table_idx);
1694 $ret .= $this->standup_content($user_cur);
1696 if ($user->idx_get() == $i) {
1697 $ret .= 'subst = "sitdown"; tra.hide(); ';
1698 // clean the action buttons in other tables
1699 for ($e = 0 ; $e < TABLES_N ; $e++) {
1700 $ret .= $this->table[$e]->act_content($user_cur);
1703 else if ($table_idx > -1) {
1704 if ($table->player_n == PLAYERS_N) {
1706 $ret .= $table->act_content($user_cur);
1709 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1710 $user_cur->step_inc();
1714 function chatt_send($user, $mesg)
1716 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1720 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1722 $dt = date("H:i ", $curtime);
1733 $is_normchat = FALSE;
1734 /* for old isolation management $is_ticker = FALSE; */
1735 $update_room = FALSE;
1737 if (strcmp($msg, "/tav") == 0 ||
1738 strncmp($msg, "/tav ", 5) == 0) {
1740 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1741 /* 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>" */
1742 $msg = $mlang_brisk['tickmust'][$G_lang];
1743 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1748 $table = $this->table[$user->table];
1750 if ($table->wag_own != -1) {
1751 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1752 $msg = $mlang_brisk['tickjust'][$G_lang];
1753 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1758 $dtime = $curtime - $table->wag_tout;
1759 if ($dtime < EXPIRE_TIME_WAG) {
1760 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1761 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1762 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1763 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1768 $msg = substr($msg, 5);
1770 $table->wag_set($user->idx_get(), $msg);
1771 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1772 $to_room = $to_user;
1773 /* for old isolation management $is_ticker = TRUE; */
1775 } // /tav chat command
1777 else if (strncmp($msg, "/alarm ", 7) == 0) {
1778 if (strncmp($msg, "/alarm to ", 10) == 0) {
1779 $sp_pos = strpos($msg, " ", 10);
1780 $target = substr($msg, 10, $sp_pos - 10);
1781 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1785 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1788 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1789 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1790 $msg = $mlang_brisk['alarpass'][$G_lang];
1791 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1796 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1797 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1798 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1799 $to_user = sprintf('chatt_sub("%s",[2,"%s"],%s);',
1800 $dt, NICKSERV, $prestr);
1802 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1803 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1804 /* MLANG: "chiudi" */
1805 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1807 } // /alarm chat command
1808 else if (strncmp($msg, "/listen ", 8) == 0) {
1809 $arg = substr($msg, 8);
1811 if (strcasecmp($arg, "isolation") == 0) {
1813 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1814 $user->table >= TABLES_AUTH_N) {
1815 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]);
1819 $user->flags &= ~USER_FLAG_MAP_AUTH;
1820 $user->flags |= USER_FLAG_ISOLAUTH;
1821 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1824 else if (strcasecmp($arg, "auth") == 0) {
1825 $flags_old = $user->flags;
1826 $user->flags &= ~USER_FLAG_MAP_AUTH;
1827 $user->flags |= USER_FLAG_LISTAUTH;
1828 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1831 $flags_old = $user->flags;
1832 $user->flags &= ~USER_FLAG_MAP_AUTH;
1833 $to_user = 'list_set(\'all\', true, \'\'); ';
1836 // if from isolation redraw standup area
1837 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1838 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1842 else if (strcmp($msg, "/authreq") == 0) {
1843 if ($user->is_cert()) {
1844 $to_user = sprintf('authbox(300,200);');
1847 /* 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." */
1848 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]);
1851 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1852 if ($user->is_auth()) {
1853 $to_user = sprintf('mesgtoadmbox(500,300);');
1856 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1857 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]);
1860 else if (strncmp($msg, "/nick ", 6) == 0) {
1861 log_main("chatt_send BEGIN");
1864 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1865 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
1869 $msg = "COMMAND ".$msg;
1870 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1871 $user_cur = $this->user[$i];
1873 if ($user_cur->sess == '')
1875 if (strcasecmp($user_cur->name,$name_new) == 0)
1878 if ($i < MAX_PLAYERS) {
1879 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1880 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $prestr);
1884 /* 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>" */
1885 if ($user->is_auth()) {
1886 if (strcasecmp($user->name,$name_new) != 0) {
1887 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1888 ($user->subst == 'standup' ||
1889 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
1892 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1893 for ($i = 0 ; $i < TABLES_N ; $i++) {
1894 $to_user .= $this->table[$i]->act_content($user);
1898 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
1903 $user->name = $name_new; // OK - nick changed
1904 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1905 if ( ! $user->is_auth() ) {
1906 if (($bdb = BriskDB::create()) != FALSE) {
1908 /* 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>" */
1909 if ($bdb->login_exists($name_new)) {
1910 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1911 $to_user .= sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $prestr);
1916 log_main("chatt_send start set");
1918 $update_room = TRUE;
1920 } // nick chat command
1921 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1922 $guar_user = substr($msg, 6);
1924 $this->guarantee_show($user, $guar_user, $dt);
1926 else if (strncmp($msg, "/st ", 4) == 0) {
1927 log_main("chatt_send BEGIN");
1930 $st_str = substr($msg, 4);
1932 if (strcasecmp($st_str, "normale") == 0) {
1933 $st = USER_FLAG_S_NORM;
1935 else if (strcasecmp($st_str, "pausa") == 0) {
1936 $st = USER_FLAG_S_PAU;
1938 else if (strcasecmp($st_str, "fuori") == 0) {
1939 $st = USER_FLAG_S_OUT;
1941 else if (strcasecmp($st_str, "cane") == 0) {
1942 $st = USER_FLAG_S_DOG;
1944 else if (strcasecmp($st_str, "cibo") == 0) {
1945 $st = USER_FLAG_S_EAT;
1947 else if (strcasecmp($st_str, "lavoro") == 0) {
1948 $st = USER_FLAG_S_WRK;
1950 else if (strcasecmp($st_str, "sigaretta") == 0) {
1951 $st = USER_FLAG_S_SMK;
1953 else if (strcasecmp($st_str, "presente") == 0) {
1954 $st = USER_FLAG_S_EYE;
1956 else if (strcasecmp($st_str, "coniglio") == 0) {
1957 $st = USER_FLAG_S_RABB;
1959 else if (strcasecmp($st_str, "calcio") == 0) {
1960 $st = USER_FLAG_S_SOCC;
1962 else if (strcasecmp($st_str, "pupo") == 0) {
1963 $st = USER_FLAG_S_BABY;
1965 else if (strcasecmp($st_str, "pulizie") == 0) {
1966 $st = USER_FLAG_S_MOP;
1968 else if (strcasecmp($st_str, "babbo") == 0) {
1969 $st = USER_FLAG_S_BABBO;
1971 else if (strcasecmp($st_str, "renna") == 0) {
1972 $st = USER_FLAG_S_RENNA;
1974 else if (strcasecmp($st_str, "pupazzo") == 0) {
1975 $st = USER_FLAG_S_PUPAZ;
1977 else if (strcasecmp($st_str, "vischio") == 0) {
1978 $st = USER_FLAG_S_VISCH;
1981 /* MLANG: "Questo stato non esiste." */
1982 $to_user = sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]);
1986 log_main("chatt_send start set");
1987 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1988 $update_room = TRUE;
1989 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1992 } // nick chat command
1994 else { // normal chat line
1995 $is_normchat = TRUE;
1996 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1998 $user->chat_dlt = $user->chat_dlt * 2;
1999 if ($user->chat_dlt > 120)
2000 $user->chat_dlt = 120;
2002 else if ($user->chat_lst == $msg)
2004 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2005 $user->chat_ban = $curtime;
2006 $user->chat_dlt = 5;
2010 $user->chat_ban = 0;
2011 $user->chat_dlt = 0;
2015 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2018 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2019 // temporary silentiation for troll (will became array check)
2020 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2021 $to_room = $to_user;
2024 log_legal($curtime, $user->ip, $user,
2025 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2027 $user->chat_lst = "$msg";
2028 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2038 // Output to clients
2041 if ($to_user != FALSE) {
2042 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2043 $user->comm[$user->step % COMM_N] .= $to_user;
2047 if ($to_room != FALSE) {
2048 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2049 $user_cur = $this->user[$i];
2050 if ($target != "" && $user_cur->name != $target)
2052 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
2055 if ($is_normchat == TRUE) {
2056 // use MAP_AUTH to check if auth or isolation
2057 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2058 if ( ! $user->is_auth() ) {
2064 else if ($is_ticker) {
2065 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2066 if ($user->table >= TABLES_AUTH_N)
2071 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2072 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2073 $user_cur->step_inc();
2078 // FIXME BRISK4: include for each kind of table
2079 require_once("${G_base}briskin5/Obj/briskin5.phh");
2080 // Before all align times with table timeout
2081 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2082 if (isset($this->match[$table_idx])) {
2083 $bin5 = $this->match[$table_idx];
2085 $bin5_table = $bin5->table[0];
2086 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2087 // stat must be "table" by definition
2088 $bin5_user = $bin5->user[$i];
2090 if ($target != "" && $bin5_user->name != $target)
2092 log_main("writa: ".$user_mesg);
2093 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2094 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2095 $bin5_user->step_inc();
2097 } // if (isset($this->match
2098 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2099 } // if ($to_tabl == true ...
2102 if ($user->stat == 'room' && $user->subst == 'standup') {
2103 $this->standup_update($user);
2105 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2106 log_main("chatt_send pre table update");
2107 $this->table_update($user);
2108 log_main("chatt_send post table update");
2110 } // if ($update_room ...
2113 } // function chatt_send( ...
2115 function get_user($sess, &$idx)
2119 if (validate_sess($sess)) {
2120 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2121 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2124 $ret = $this->user[$i];
2128 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2129 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2130 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2133 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2140 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
2143 * if ($idx > -1 && ret == FALSE) => duplicated nick
2144 * if ($idx == -2 && ret == FALSE) => invalid name
2145 * if ($idx == -3 && ret == FALSE) => wrong password
2146 * if ($idx == -1 && ret == FALSE) => no space left
2147 * if ($idx == 0 && ret == user) => SUCCESS
2148 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
2151 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
2157 $authenticate = FALSE;
2159 $login_exists = FALSE;
2161 $ghost_auth = FALSE;
2166 if (($name_new = validate_name($name)) == FALSE) {
2171 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2172 if (validate_sess($sess) == FALSE)
2175 /* if pass != FALSE verify the login with pass */
2176 log_auth("XXX", "auth1");
2178 if (($bdb = BriskDB::create()) != FALSE) {
2180 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2181 log_auth("XXX", "auth2");
2182 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2183 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2185 if ($authenticate != FALSE) {
2186 $user_type = $authenticate->type_get();
2194 $login_exists = $bdb->login_exists($name_new);
2198 // if db is down, send a warning and verify only current users
2199 // no actions at this moment
2201 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2203 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2207 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2209 continue; // NOTE: CHECK IT !!
2211 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2212 if ($authenticate != FALSE) {
2214 $ghost_auth = $this->user[$i]->is_auth();
2225 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2227 /* there is another user logged with your account and you and him have authenticated => new user
2228 get the session of the old user */
2229 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2232 $ghost_user = $this->user[$ghost];
2234 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2235 $ghost_user->step_inc();
2238 $ghost_user->sess = $sess;
2241 $ghost_user->sess = $sess;
2244 // If user at the table we need to update the table data too
2245 $table_idx = $ghost_user->table;
2246 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2247 require_once("${G_base}briskin5/Obj/briskin5.phh");
2248 if (isset($this->match[$table_idx])) {
2249 $bin5 = $this->match[$table_idx];
2251 if ($bin5->the_end != TRUE) {
2252 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2253 $bin5->user[$ghost_user->table_pos]->step_inc();
2254 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2260 return ($this->user[$ghost]);
2262 else if ($idx != -1 && $i == MAX_PLAYERS) {
2267 $this->user[$idx]->sess = $sess;
2270 $this->user[$idx]->sess = $sess;
2272 $this->user[$idx]->name = $name_new; // OK - add new user
2273 $this->user[$idx]->stat_set("room");
2274 $this->user[$idx]->step_set(0);
2275 while (array_pop($this->user[$idx]->comm) != NULL);
2276 $this->user[$idx]->subst = "standup";
2277 $this->user[$idx]->lacc = $curtime;
2278 $this->user[$idx]->laccwr = $curtime;
2279 $this->user[$idx]->bantime = 0;
2280 $this->user[$idx]->ip = $ip;
2282 $this->user[$idx]->rec = $authenticate;
2283 $this->user[$idx]->flags = $user_type;
2284 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2285 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2286 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2288 if ($authenticate != FALSE) {
2289 $this->user[$idx]->code = $authenticate->code_get();
2291 // all this part is included in the db server
2292 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2294 if (isset($cookie['CO_list'])) {
2295 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2296 if (strcmp($cookie['CO_list'], "auth") == 0) {
2297 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2298 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2300 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2301 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2302 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2305 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2310 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2313 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2315 log_main("ghost: rename!");
2316 $ghost_user = $this->user[$ghost];
2318 if ($ghost_auth == FALSE) {
2319 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2320 $ghostname = 'ghost'.$sfx;
2321 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2322 if (strcmp("", $this->user[$i]->sess) == 0)
2325 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2330 if ($ghostname != '')
2334 $ghost_user->name = $ghostname;
2336 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2337 $this->standup_update($ghost_user);
2340 log_main("chatt_send pre table update");
2341 $this->table_update($ghost_user);
2342 log_main("chatt_send post table update");
2344 } // if ($ghost_auth == FALSE
2346 // FIXME: cacciare il vecchio utente room && table (if needed)
2347 $ghost_user->the_end = TRUE;
2348 $ghost_user->lacc = 0;
2349 $this->garbage_manager(TRUE);
2351 } // if ($ghost > -1) {
2356 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));
2358 $ret = $this->user[$real_idx];
2365 function standup_update($user)
2367 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2368 $user_cur = $this->user[$i];
2369 if ($user_cur->sess == '')
2372 log_main("STANDUP START: ".$user_cur->stat);
2374 if ($user_cur->stat == 'room') {
2375 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2376 if ($user->idx_get() == $i) {
2377 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2379 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2381 $user_cur->step_inc();
2386 function dump_data()
2388 $brisk_ser = serialize($this);
2389 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2390 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2397 function standup_content($user)
2402 if ($user->stat != 'room')
2405 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2406 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2411 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2413 $content = ' j_stand_cont( [ ';
2415 $user_cur_id = $user->idx_get();
2416 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2417 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2420 $flags = $this->user[$i]->flags;
2422 // sql record exists AND last donate > 2013-01-01
2423 if ($this->user[$i]->is_supp_custom()) {
2424 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2430 if ($this->user[$i]->subst == "standup") {
2431 if ($user_cur_id == $i) {
2435 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2436 xcape($this->user[$i]->name), $supp_comp_s);
2445 function table_content($user, $table_idx)
2451 // Si possono usare i dati nella classe table
2454 $sess = $user->sess;
2455 $table = $this->table[$table_idx];
2457 if ($user->stat != 'room')
2460 $user_cur_id = $user->idx_get();
2462 for ($i = 0 ; $i < $table->player_n ; $i++) {
2463 $user_cur = $this->user[$table->player[$i]];
2465 $flags = $user_cur->flags;
2467 if ($user_cur_id == $table->player[$i])
2470 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2471 if ($user_cur->is_supp_custom())
2472 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2476 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2477 xcape($user_cur->name), $supp_comp_s);
2482 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2487 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2489 GLOBAL $G_ban_list, $G_black_list;
2491 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2492 $remote_addr = addrtoipv4($addr);
2494 fprintf(STDERR, "\n\n\n PRE_BLACK_CHECK \n\n\n");
2495 if ($this->black_check($remote_addr)) {
2496 // TODO: waiting async 5 sec before close
2497 fprintf(STDERR, "\n\n\n BLACK_CHECK \n\n\n");
2501 $enc = get_encoding($header);
2502 if (isset($header['User-Agent'])) {
2503 if (strstr($header['User-Agent'], "MSIE")) {
2504 $transp_type = "htmlfile";
2507 $transp_type = "xhr";
2511 $transp_type = "iframe";
2513 force_no_cache($header_out);
2519 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2520 $content = ob_get_contents();
2523 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2524 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2528 case "index_wr.php":
2530 // Enhance required: in the POST case, after the header you must get content
2531 // from the socket, waiting if necessary
2535 index_wr_main($this, $addr, $get, $post, $cookie);
2536 $content = ob_get_contents();
2539 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2543 case "index_rd.php":
2544 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2546 if ($transp == 'websocket')
2550 if (!isset($cookie['sess'])
2551 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2553 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2555 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2560 $this->sess_cur_set($user->sess);
2561 // close a previous opened index_read_ifra socket, if exists
2562 if (($prev = $user->rd_socket_get()) != NULL) {
2563 $s_a_p->socks_unset($user->rd_socket_get());
2564 fclose($user->rd_socket_get());
2565 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2566 $user->rd_socket_set(NULL);
2570 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2571 $response = headers_render($header_out, -1).$user->chunked_content($content);
2572 $response_l = mb_strlen($response, "ASCII");
2574 $wret = @fwrite($new_socket, $response, $response_l);
2575 if ($wret < $response_l) {
2576 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2577 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2580 $user->rd_cache_set("");
2582 fflush($new_socket);
2585 $s_a_p->socks_set($new_socket, $user, NULL);
2586 $user->rd_socket_set($new_socket);
2587 printf(" - qui ci siamo - ");
2594 if (!(BRISK_DEBUG & DBG_ENGI))
2596 fprintf(STDERR, "TEST.PHP running\n");
2597 if (isset($post['data'])) {
2598 $content = $post['data'];
2601 $content = "NO DATA AVAILABLE";
2603 $header_out['Content-Type'] = 'text/plain';
2604 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2608 /* FAR TODO: move all into an array of registered sub-apps */
2609 $subs = "briskin5/";
2610 $subs_l = strlen($subs);
2611 if (!strncmp($path, $subs, $subs_l)) {
2612 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2621 function match_add($idx, $match)
2623 $this->match[$idx] = $match;
2626 function match_del($idx)
2628 unset($this->match[$idx]);
2631 function match_get($idx, $token)
2633 if (isset($this->match[$idx])) {
2635 || $token == $this->match[$idx]->table_token) {
2636 return ($this->match[$idx]);
2641 function sess_cur_set($sess)
2643 static::$sess_cur = $sess;
2646 static function sess_cur_get()
2648 return(static::$sess_cur);
2650 } // end class Brisk
2652 function make_seed()
2654 list($usec, $sec) = explode(' ', microtime());
2655 return (float) $sec + ((float) $usec * 100000);
2658 function btrace_line($ar)
2660 GLOBAL $G_btrace_pref_sub;
2663 for ($i = 0 ; $i < count($ar) ; $i++) {
2664 $with_class = isset($ar[$i]['class']);
2665 $with_file = isset($ar[$i]['file']);
2666 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2667 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2668 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2669 ($with_file ? $ar[$i]['line'] : ""));
2675 function trace_ftok($id, $add)
2677 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2678 $tok=@ftok($id, $add);
2680 log_shme($tok.": ".$id." + ".$add);
2685 function log_mop($step, $log)
2689 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2692 $sess = Brisk::sess_cur_get();
2693 if (isset($sess) == FALSE)
2698 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2701 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2702 $btrace = btrace_line(debug_backtrace());
2705 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2706 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2712 function log_only2($log)
2716 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2719 $sess = Brisk::sess_cur_get();
2720 if (isset($sess) == FALSE)
2725 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2728 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2729 $btrace = btrace_line(debug_backtrace());
2732 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2733 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2738 function log_crit($log)
2742 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2745 $sess = Brisk::sess_cur_get();
2746 if (isset($sess) == FALSE)
2751 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2754 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2755 $btrace = btrace_line(debug_backtrace());
2758 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2759 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2764 function log_only($log)
2768 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2771 $sess = Brisk::sess_cur_get();
2772 if (isset($sess) == FALSE)
2777 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2780 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2781 $btrace = btrace_line(debug_backtrace());
2784 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2785 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2790 function log_main($log)
2794 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2797 $sess = Brisk::sess_cur_get();
2798 if (isset($sess) == FALSE)
2803 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2806 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2807 $btrace = btrace_line(debug_backtrace());
2810 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2811 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2816 function log_rd($log)
2820 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2823 $sess = Brisk::sess_cur_get();
2824 if (isset($sess) == FALSE)
2829 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2832 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2833 $btrace = btrace_line(debug_backtrace());
2836 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2837 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2842 function log_rd2($log)
2846 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2849 $sess = Brisk::sess_cur_get();
2850 if (isset($sess) == FALSE)
2855 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2858 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2859 $btrace = btrace_line(debug_backtrace());
2863 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2864 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2869 function log_send($log)
2873 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2876 $sess = Brisk::sess_cur_get();
2877 if (isset($sess) == FALSE)
2882 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2885 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2886 $btrace = btrace_line(debug_backtrace());
2889 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2890 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2895 function log_lock($log)
2899 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2902 $sess = Brisk::sess_cur_get();
2903 if (isset($sess) == FALSE)
2908 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2911 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2912 $btrace = btrace_line(debug_backtrace());
2915 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2916 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2921 function log_wr($log)
2925 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2928 $sess = Brisk::sess_cur_get();
2929 if (isset($sess) == FALSE)
2934 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2937 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2938 $btrace = btrace_line(debug_backtrace());
2941 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2942 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2947 function log_load($log)
2951 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2954 $sess = Brisk::sess_cur_get();
2955 if (isset($sess) == FALSE)
2960 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2963 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2964 $btrace = btrace_line(debug_backtrace());
2967 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2968 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2973 function log_auth($sess, $log)
2977 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2980 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
2983 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2984 $btrace = btrace_line(debug_backtrace());
2987 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2988 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
2993 function log_shme($log)
2997 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3000 $sess = Brisk::sess_cur_get();
3001 if (isset($sess) == FALSE)
3006 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3009 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3010 $btrace = btrace_line(debug_backtrace());
3013 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3014 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3021 // function log_legal($curtime, $sess, $name, $where, $mesg)
3022 function log_legal($curtime, $addr, $user, $where, $mesg)
3025 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3026 /* Unix time | session | nickname | IP | where was | mesg */
3027 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3028 ($user->is_auth() ? 'A' : 'N'),
3029 $user->name, $addr, $where , $mesg));
3034 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3039 if ($sitted < PLAYERS_N) {
3047 if ($table == $cur_table)
3054 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3059 function show_notify($text, $tout, $butt, $w, $h)
3061 log_main("SHOW_NOTIFY: ".$text);
3062 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3065 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3067 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3068 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);
3071 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3073 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3076 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3077 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3080 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3081 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);
3085 function root_welcome($user)
3087 GLOBAL $root_wellarr, $G_lang;
3091 $dt = date("H:i ", $curtime);
3093 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3094 $ret .= sprintf('chatt_sub("%s",[2,"%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3101 function validate_sess($sess)
3103 if (strlen($sess) == SESS_LEN)
3109 function validate_name($name)
3111 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3113 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3115 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3122 function playsound($filename)
3124 return (sprintf('playsound("flasou", "%s");', $filename));
3127 function secstoword($secs)
3133 $mins = floor($secs / 60);
3135 if ($G_lang == 'en') {
3137 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3140 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3144 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3147 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3152 function sharedmem_sz($tok)
3154 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3155 log_main("shmop_open failed");
3158 $shm_sz = shmop_size($shm_id);
3159 shmop_close($shm_id);
3161 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3168 static function lock_data($is_exclusive)
3170 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3171 self::$delta_t = microtime(TRUE);
3172 log_lock("LOCK warrant [".self::$delta_t."]");
3180 static function unlock_data($res)
3184 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3193 static function lock_data($is_exclusive)
3195 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3196 self::$delta_t = microtime(TRUE);
3197 log_lock("LOCK poll [".self::$delta_t."]");
3205 static function unlock_data($res)
3209 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3215 function carousel_top()
3220 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));
3223 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>'));