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.2";
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',
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));
587 function getbyid($idx)
589 return ($this->el[$idx]);
592 function setbyid($idx, $v)
594 $this->el[$idx] = $v;
603 var $auth_only; // se tavolo riservato o libero
610 var $table_start; // information field
618 function create($idx)
620 if (($thiz = new Table()) == FALSE)
624 $thiz->player = array();
626 $thiz->auth_only = FALSE;
632 $thiz->table_token = "";
633 $thiz->table_start = 0;
635 $thiz->wakeup_time = 0;
642 $this->idx = $from->idx;
643 $this->player = array();
644 for ($i = 0 ; $i < $from->player_n ; $i++)
645 $this->player[$i] = $from->player[$i];
646 $this->player_n = $from->player_n;
648 log_main("PLAYER_N - parent::copy.".$this->player_n);
650 $this->auth_only = $from->auth_only;
652 $this->wag_own = $from->wag_own;
653 $this->wag_com = $from->wag_com;
654 $this->wag_tout = $from->wag_tout;
656 $this->table_token = $from->table_token;
657 $this->table_start = $from->table_start;
659 $this->wakeup_time = $from->wakeup_time;
662 function myclone($from)
664 if (($thiz = new Table()) == FALSE)
672 function spawn($from)
674 if (($thiz = new Table()) == FALSE)
677 $thiz->idx = $from->idx;
678 $thiz->player = array();
679 for ($i = 0 ; $i < $from->player_n ; $i++)
680 $thiz->player[$i] = $i;
681 $thiz->player_n = $from->player_n;
683 $thiz->auth_only = $from->auth_only;
685 $thiz->wag_own = $from->wag_own;
686 $thiz->wag_com = $from->wag_com;
687 $thiz->wag_tout = $from->wag_tout;
689 $thiz->table_token = $from->table_token;
690 $thiz->table_start = $from->table_start;
692 $thiz->wakeup_time = $from->wakeup_time;
697 function wag_set($user_idx, $mesg)
701 $this->wag_own = $user_idx;
702 $this->wag_com = $mesg;
706 function wag_reset($timeout)
708 log_main("WAG_RESET");
710 unset($this->wag_own);
713 $this->wag_tout = $timeout;
716 function player_get($idx)
718 return ($this->player[$idx]);
721 function player_set($idx, $player)
723 $this->player[$idx] = $player;
726 function user_add($idx)
728 $this->player[$this->player_n] = $idx;
731 return ($this->player_n - 1);
734 function user_rem($brisk, $user)
736 $tabpos = $user->table_pos;
738 /* verifico la consistenza dei dati */
739 if ($brisk->user[$this->player[$tabpos]] == $user) {
741 /* aggiorna l'array dei giocatori al tavolo. */
742 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
743 $this->player[$i] = $this->player[$i+1];
744 $user_cur = $brisk->user[$this->player[$i]];
745 $user_cur->table_pos = $i;
750 log_main("INCONSISTENCY ON TABLE.");
756 // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table,
757 // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
759 // function act_content($isstanding, $sitted, $table, $cur_table, $allowed)
760 function act_content($user)
763 $isstanding = ($user->subst == 'standup');
764 $sitted = $this->player_n;
766 $cur_table = $user->table;
770 if ($sitted < PLAYERS_N) {
771 if ($this->auth_only) {
772 if ($user->flags & USER_FLAG_AUTH)
786 if ($table == $cur_table)
793 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
806 function Delay_Manager($triglevel)
808 $this->triglevel = $triglevel;
809 $this->delta = array();
810 $this->lastcheck = 0;
813 function delta_get($curtime)
815 // clean too old delta items
816 for ($i = 0 ; $i < count($this->delta) ; $i++) {
817 if ($this->delta[$i][0] < $curtime) {
818 array_splice($this->delta, $i, 1);
823 // add new delta items if delay exceeded $this->triglevel sec
824 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
825 $delta = $curtime - $this->lastcheck - $this->triglevel;
826 array_push($this->delta, array($curtime + $delta , $delta));
827 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
830 // extract the maximum valid delta
832 for ($i = 0 ; $i < count($this->delta) ; $i++) {
833 $delta_cur = $this->delta[$i][1];
834 if ($delta_max < $delta_cur)
835 $delta_max = $delta_cur;
838 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
843 function lastcheck_set($curtime)
845 $this->lastcheck = $curtime;
853 function Client_prefs()
857 static function from_user($user)
859 $thiz = new Client_prefs();
860 $thiz->user_load($user);
865 static function from_json($json)
867 $thiz = new Client_prefs();
868 if ($thiz->json_load($json) == FALSE) {
876 function user_load($user)
878 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
879 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
880 if ($user->rec != FALSE) {
881 $this->supp_comp = $user->rec->supp_comp_get();
884 $this->supp_comp = "000000000000";
887 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
890 function json_load($json_s)
895 if (gettype($json_s) == "string") {
896 if (($json = json_decode($json_s)) == FALSE)
902 if ($this->listen < 0 || $this->listen > 2)
904 $this->listen = $json->listen;
906 if (mb_strlen($json->supp_comp, "ASCII") != 12)
909 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
910 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
911 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
917 $this->supp_comp = $json->supp_comp;
924 function store($user, $is_save)
927 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
928 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
929 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
930 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
932 if ($user->is_supp_custom()) {
933 $user->rec->supp_comp_set($this->supp_comp);
936 $user->prefs_store();
945 var $crystal_filename;
949 var $comm; // commands for many people
950 var $step; // current step of the comm array
951 var $garbage_timeout;
956 public static $sess_cur;
958 function Brisk($crystal_filename) {
959 $this->crystal_filename = $crystal_filename;
960 $this->user = array();
961 $this->table = array();
962 $this->match = array();
964 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
965 $this->user[$i] = User::create($this, $i, "", "");
968 for ($i = 0 ; $i < TABLES_N ; $i++) {
969 $this->table[$i] = Table::create($i);
972 $row = ( (((int)($i / 4)) % 2) == 0 );
973 $col = ($i % 2 == 0);
974 $this->table[$i]->auth_only = (($row && $col) || (!$row && !$col));
977 $this->table[$i]->auth_only = FALSE;
980 if ($i < TABLES_AUTH_N)
981 $this->table[$i]->auth_only = TRUE;
983 $this->table[$i]->auth_only = FALSE;
985 $this->garbage_timeout = 0;
986 $this->shm_sz = SHM_DIMS_MIN;
988 $this->delay_mgr = new Delay_Manager(1.5);
990 static::$sess_cur = FALSE;
993 function garbage_manager($force)
995 GLOBAL $G_lang, $mlang_brisk, $G_base;
999 log_rd2("garbage_manager START");
1001 /* Garbage collector degli utenti in timeout */
1002 $curtime = microtime(TRUE);
1004 $delta = $this->delay_mgr->delta_get($curtime);
1006 if (!$force && !($this->garbage_timeout < $curtime)) {
1007 $this->delay_mgr->lastcheck_set($curtime);
1011 // Before all align times with table timeout
1012 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1013 $table_cur = $this->table[$table_idx];
1014 // if the table is complete and exists its shared mem we get the info about users lacc
1016 if ($table_cur->player_n == PLAYERS_N) {
1017 log_main("PLAYERS == N TABLE ".$table_idx);
1020 $no_recovery = FALSE;
1021 if (isset($this->match[$table_idx])) {
1022 $bin5 = $this->match[$table_idx];
1024 if ($table_cur->table_token != $bin5->table_token) {
1025 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1026 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1027 $no_recovery = TRUE;
1031 if ($bin5 != FALSE) {
1035 log_main("garbage_manager: bri loaded successfully.");
1036 $bin5->garbage_manager(TRUE);
1038 $bin5_table = $bin5->table[0];
1040 // is the end of the table
1042 if ($bin5->the_end == TRUE) {
1044 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1046 log_main("garbage_manager: INSIDE THE END.");
1048 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1049 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1050 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1053 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1054 // stat must be "table" by definition
1055 $user_cur = $this->user[$table_cur->player[$i]];
1056 $bin5_user = $bin5->user[$i];
1058 $user_cur->subst = $bin5_user->subst;
1059 $user_cur->step = $bin5_user->step;
1060 $user_cur->lacc = $bin5_user->lacc;
1061 $user_cur->laccwr = $bin5_user->lacc;
1062 $user_cur->bantime = $bin5_user->bantime;
1065 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1067 $this->room_join_wakeup($user_cur, FALSE, 0);
1068 $table_cur->table_token = "";
1069 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1071 $this->match_del($table_idx);
1074 log_main("gm:: save_data");
1076 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1077 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1080 } // if ($bin5 == FALSE
1081 else if ($no_recovery == FALSE) {
1082 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1084 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1085 $user_cur = $this->user[$table_cur->player[$i]];
1086 $user_cur->subst = "shutdowner";
1087 $user_cur->step_inc();
1089 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1090 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1091 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1092 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1093 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1094 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1095 $user_cur->step_inc();
1098 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1099 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1100 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1102 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1104 $this->room_join_wakeup($user_cur, TRUE, -2);
1105 $table_cur->table_token = "";
1108 } // if ($table_cur->player_n == PLAYERS_N) {
1109 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1111 log_rd2("out new loop.");
1113 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1114 $user_cur = $this->user[$i];
1116 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1118 if ($user_cur->sess == "")
1121 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1122 // Auto logout dell'utente
1123 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1125 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1126 log_auth($user_cur->sess, "Autologout session.");
1130 log_rd2("AUTO LOGOUT.");
1131 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1132 $this->room_wakeup($user_cur);
1133 else if ($user_cur->subst == 'standup')
1134 $this->room_outstandup($user_cur);
1136 log_rd2("LOGOUT FROM WHAT ???");
1140 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1141 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1142 $this->room_wakeup($user_cur);
1143 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1144 /* 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" */
1145 $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);
1146 $user_cur->step_inc();
1150 log_rd2("GARBAGE UPDATED!");
1152 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1155 $this->delay_mgr->lastcheck_set($curtime);
1159 function show_room($user_step, $user)
1161 GLOBAL $G_lang, $mlang_brisk;
1162 log_main("show_room: username: ".$user->name);
1164 $ret = sprintf('gst.st = %d; ', $user_step);
1166 $prefs = Client_prefs::from_user($user);
1167 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1170 if ($user->flags & USER_FLAG_ISOLAUTH) {
1171 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1173 else if ($user->flags & USER_FLAG_LISTAUTH) {
1174 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1177 $ret .= 'list_set(\'all\', false, \'\' ); ';
1181 if ($user->subst == 'standup')
1182 $ret .= "tra.show(); ";
1184 $ret .= "tra.hide(); ";
1186 $ret .= sprintf('stat = "%s";', $user->stat);
1188 $ret .= root_welcome($user);
1189 if ($user->flags & USER_FLAG_DBFAILED) {
1190 $ret .= "gst.st = ".($user->step+1)."; ";
1191 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1194 $ret .= sprintf('subst = "%s";', $user->subst);
1195 $ret .= $user->myname_innerHTML();
1197 for ($i = 0 ; $i < TABLES_N ; $i++) {
1199 $ret .= $this->table_content($user, $i);
1200 // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table,
1201 // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
1202 $ret .= $this->table[$i]->act_content($user);
1203 if ($this->table[$i]->wag_own != -1)
1204 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1206 $ret .= sprintf('tra.rem(%d); ', $i);
1208 $ret .= $this->standup_content($user);
1209 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1215 function room_wakeup($user)
1217 $table_idx = $user->table;
1218 $table = $this->table[$table_idx];
1220 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1224 $from_table = ($user->stat == "table");
1226 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1228 for ($i = 0 ; $i < $table->player_n ; $i++) {
1229 $user_cur = $this->user[$table->player[$i]];
1230 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1232 if ($user->idx_get() != $table->player[$i]) {
1233 $user_cur->stat_set("room");
1234 $user_cur->subst = "sitdown";
1235 $user_cur->laccwr = $curtime;
1237 else if ($user->sess != "") {
1238 $user_cur->stat_set("room");
1239 $user_cur->subst = "standup";
1240 $user_cur->laccwr = $curtime;
1241 $user_cur->table = -1;
1246 $user->stat_set("room");
1247 $user->subst = "standup";
1248 $user->laccwr = $curtime;
1251 $remove_wagon = FALSE;
1252 if($table->wag_own == $user->idx_get()) {
1253 $table->wag_reset($curtime);
1254 $remove_wagon = TRUE;
1258 /* aggiorna l'array dei giocatori al tavolo. */
1259 $table->user_rem($this, $user);
1261 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1262 $user_cur = $this->user[$i];
1263 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1266 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1268 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1269 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1270 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1271 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1272 log_main("DOCUMENT.index.php: from table");
1274 else if ($user_cur->stat == "room") {
1275 log_main("DOCUMENT.index.php: from table");
1277 $ret .= $this->table_content($user_cur, $table_idx);
1278 $ret .= $this->standup_content($user_cur);
1280 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1281 $ret .= $table->act_content($user);
1283 if ($user->idx_get() == $i) {
1284 // set the new status
1285 $ret .= 'subst = "standup"; tra.show(); ';
1286 // clean the action buttons in other tables
1287 for ($e = 0 ; $e < TABLES_N ; $e++) {
1288 if ($this->table[$e]->player_n < PLAYERS_N) {
1289 // $ret .= table_act_content(TRUE, 0, $e, $user->table,
1290 // ($this->table[$e]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH));
1291 $ret .= $this->table[$e]->act_content($user);
1296 // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table,
1297 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1298 $ret .= $table->act_content($user_cur);
1301 log_wr("ROOM_WAKEUP: ".$ret);
1302 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1303 $user_cur->step_inc();
1307 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1309 $table_idx = $user->table;
1310 $table = $this->table[$table_idx];
1312 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1315 $user_wup = array();
1317 $user_tab = array();
1319 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1321 for ($i = 0 ; $i < $table->player_n ; $i++) {
1322 $user_cur = $this->user[$table->player[$i]];
1323 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1324 if ($user_cur->sess != "") {
1325 if ($update_lacc == TRUE) {
1326 $user_cur->laccwr = $curtime;
1328 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1329 if ($user_cur->subst == "shutdowned") {
1330 $user_cur->stat_set("room");
1331 $user_cur->subst = "sitdown";
1333 else if ($user_cur->subst == "shutdowner") {
1334 $user_cur->stat_set("room");
1335 $user_cur->subst = "standup";
1336 $user_cur->table = -1;
1337 $user_wup[$user_wup_n++] = $user_cur;
1339 $remove_wagon = FALSE;
1340 if($table->wag_own == $table->player[$i]) {
1341 $remove_wagon = TRUE;
1342 $table->wag_reset($curtime);
1345 $user_tab[$user_tab_n++] = $table->player[$i];
1349 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1350 $table->user_rem($this, $user_wup[$wup_idx]);
1352 /* aggiorna l'array dei giocatori al tavolo. */
1354 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1355 log_main("START LOOP");
1356 $user_cur = $this->user[$i];
1357 if ($user_cur->sess == '' || $user_cur->stat != 'room') {
1358 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1363 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1365 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1366 if ($user_cur->stat == "room") {
1367 log_main("DOCUMENT.index.php from table");
1369 $ret .= $this->table_content($user_cur, $table_idx);
1370 $ret .= $this->standup_content($user_cur);
1372 // $ret .= table_act_content(FALSE, 0, $table_idx, $user_cur->table,
1373 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1374 $ret .= $table->act_content($user_cur);
1377 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1378 if ($user_tab[$tab_idx] == $i)
1381 // for users that wakeup the room will be reconstructed by index_rd.php
1382 if ($tab_idx < $user_tab_n) {
1383 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1385 // ARRAY_POP DISABLED
1386 // if ($trans_delta == 0)
1387 // while (array_pop($user_cur->comm) != NULL);
1389 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1390 $user_cur->comm[$user_cur->step % COMM_N] = "";
1391 $user_cur->step_inc();
1392 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1393 $user_cur->step_inc();
1394 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1398 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1400 log_main("JOIN_WAKEUP more");
1401 // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table,
1402 // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1403 $ret .= $table->act_content($user_cur);
1405 log_main("JOIN_WAKEUP end more");
1407 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1408 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1409 $user_cur->step_inc();
1413 function guarantee_show($user, $user_login, $dt)
1415 GLOBAL $G_lang, $mlang_brisk, $G_base;
1421 if ($user_login == "") {
1425 if (($bdb = BriskDB::create()) == FALSE) {
1429 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1433 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1434 $guar_login = $guar_item->login_get();
1439 $user_tos_vers = $user_item->tos_vers_get();
1441 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1442 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1443 $dt, NICKSERV, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1445 else if ($guar_login == "") {
1446 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1447 $dt, NICKSERV, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1449 else if ($guar_login == $user_login) {
1450 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1451 $dt, NICKSERV, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1454 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");',
1455 $dt, NICKSERV, sprintf($mlang_brisk['gua_info'][$G_lang],
1456 xcape($user_login), xcape($guar_login)));
1461 $mesg = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1464 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1470 function room_outstandup($user)
1472 $this->room_sitdown($user, -1);
1475 function table_update($user)
1477 log_main("table_update: pre - USER: ".$user->name);
1479 $table_idx = $user->table;
1481 if ($table_idx > -1)
1482 $table = $this->table[$table_idx];
1484 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1486 $user_cur = $this->user[$i];
1487 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1490 $ret = "gst.st = ".($user_cur->step+1)."; ";
1491 if ($table_idx > -1)
1492 $ret .= $this->table_content($user_cur, $table_idx);
1494 if ($user->idx_get() == $i) {
1495 $ret .= $user->myname_innerHTML();
1497 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1498 $user_cur->step_inc();
1501 log_main("table_update: post");
1504 function room_sitdown($user, $table_idx)
1506 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1510 if ($table_idx > -1 && $table_idx < TABLES_N) {
1511 $table = $this->table[$table_idx];
1514 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1515 for ($i = 0 ; $i < TABLES_N ; $i++) {
1516 if ($table->wag_own == $table->player[$i]) {
1517 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1518 $table->wag_reset(time());
1525 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1527 $user_cur = $this->user[$i];
1528 if ($user_cur->sess == '' || $user_cur->stat != 'room')
1531 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1532 if ($table_idx > -1)
1533 $ret .= $this->table_content($user_cur, $table_idx);
1534 $ret .= $this->standup_content($user_cur);
1536 if ($user->idx_get() == $i) {
1537 $ret .= 'subst = "sitdown"; tra.hide(); ';
1538 // clean the action buttons in other tables
1539 for ($e = 0 ; $e < TABLES_N ; $e++) {
1540 $ret .= $this->table[$e]->act_content($user_cur);
1543 else if ($table_idx > -1) {
1544 if ($table->player_n == PLAYERS_N) {
1545 // $ret .= table_act_content(($user_cur->subst == 'standup'), PLAYERS_N, $table_idx, $user_cur->table,
1546 /// ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH));
1547 $ret .= $table->act_content($user_cur);
1550 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1551 $user_cur->step_inc();
1555 function chatt_send($user, $mesg)
1557 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1561 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1563 $dt = date("H:i ", $curtime);
1574 $is_normchat = FALSE;
1575 /* for old isolation management $is_ticker = FALSE; */
1576 $update_room = FALSE;
1578 if (strcmp($msg, "/tav") == 0 ||
1579 strncmp($msg, "/tav ", 5) == 0) {
1581 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1582 /* 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>" */
1583 $msg = $mlang_brisk['tickmust'][$G_lang];
1584 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1589 $table = $this->table[$user->table];
1591 if ($table->wag_own != -1) {
1592 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1593 $msg = $mlang_brisk['tickjust'][$G_lang];
1594 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1599 $dtime = $curtime - $table->wag_tout;
1600 if ($dtime < EXPIRE_TIME_WAG) {
1601 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1602 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1603 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1604 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1609 $msg = substr($msg, 5);
1611 $table->wag_set($user->idx_get(), $msg);
1612 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1613 $to_room = $to_user;
1614 /* for old isolation management $is_ticker = TRUE; */
1616 } // /tav chat command
1618 else if (strncmp($msg, "/alarm ", 7) == 0) {
1619 if (strncmp($msg, "/alarm to ", 10) == 0) {
1620 $sp_pos = strpos($msg, " ", 10);
1621 $target = substr($msg, 10, $sp_pos - 10);
1622 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1626 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1629 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1630 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1631 $msg = $mlang_brisk['alarpass'][$G_lang];
1632 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1637 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1638 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1639 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1640 $to_user = sprintf('chatt_sub("%s", [2, "%s"],%s);',
1641 $dt, NICKSERV, $prestr);
1643 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1644 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1645 /* MLANG: "chiudi" */
1646 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1648 } // /alarm chat command
1649 else if (strncmp($msg, "/listen ", 8) == 0) {
1650 $arg = substr($msg, 8);
1652 if (strcasecmp($arg, "isolation") == 0) {
1654 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1655 $user->table >= TABLES_AUTH_N) {
1656 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]);
1660 $user->flags &= ~USER_FLAG_MAP_AUTH;
1661 $user->flags |= USER_FLAG_ISOLAUTH;
1662 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1665 else if (strcasecmp($arg, "auth") == 0) {
1666 $flags_old = $user->flags;
1667 $user->flags &= ~USER_FLAG_MAP_AUTH;
1668 $user->flags |= USER_FLAG_LISTAUTH;
1669 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1672 $flags_old = $user->flags;
1673 $user->flags &= ~USER_FLAG_MAP_AUTH;
1674 $to_user = 'list_set(\'all\', true, \'\'); ';
1677 // if from isolation redraw standup area
1678 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1679 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1683 else if (strcmp($msg, "/authreq") == 0) {
1684 if ($user->flags & USER_FLAG_AUTH) {
1685 $to_user = sprintf('authbox(300,200);');
1688 /* 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." */
1689 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]);
1692 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1693 if ($user->flags & USER_FLAG_AUTH) {
1694 $to_user = sprintf('mesgtoadmbox(500,300);');
1697 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1698 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]);
1701 else if (strncmp($msg, "/nick ", 6) == 0) {
1702 log_main("chatt_send BEGIN");
1705 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1706 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
1710 $msg = "COMMAND ".$msg;
1711 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1712 $user_cur = $this->user[$i];
1714 if ($user_cur->sess == '')
1716 if (strcasecmp($user_cur->name,$name_new) == 0)
1719 if ($i < MAX_PLAYERS) {
1720 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
1721 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1725 /* 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>" */
1726 if ($user->flags & USER_FLAG_AUTH) {
1727 if (strcasecmp($user->name,$name_new) != 0) {
1728 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
1729 ($user->subst == 'standup' ||
1730 ($user->subst != 'standup' && $this->table[$user->table]->auth_only == FALSE)
1733 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
1734 for ($i = 0 ; $i < TABLES_N ; $i++) {
1735 $to_user .= $this->table[$i]->act_content($user);
1739 $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
1744 $user->name = $name_new; // OK - nick changed
1745 /* se nome gia' in uso, segnala cosa potrebbe capitare */
1746 if (($user->flags & USER_FLAG_AUTH) == 0) {
1747 if (($bdb = BriskDB::create()) != FALSE) {
1749 /* 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>" */
1750 if ($bdb->login_exists($name_new)) {
1751 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
1752 $to_user .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr);
1757 log_main("chatt_send start set");
1759 $update_room = TRUE;
1761 } // nick chat command
1762 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
1763 $guar_user = substr($msg, 6);
1765 $this->guarantee_show($user, $guar_user, $dt);
1767 else if (strncmp($msg, "/st ", 4) == 0) {
1768 log_main("chatt_send BEGIN");
1771 $st_str = substr($msg, 4);
1773 if (strcasecmp($st_str, "normale") == 0) {
1774 $st = USER_FLAG_S_NORM;
1776 else if (strcasecmp($st_str, "pausa") == 0) {
1777 $st = USER_FLAG_S_PAU;
1779 else if (strcasecmp($st_str, "fuori") == 0) {
1780 $st = USER_FLAG_S_OUT;
1782 else if (strcasecmp($st_str, "cane") == 0) {
1783 $st = USER_FLAG_S_DOG;
1785 else if (strcasecmp($st_str, "cibo") == 0) {
1786 $st = USER_FLAG_S_EAT;
1788 else if (strcasecmp($st_str, "lavoro") == 0) {
1789 $st = USER_FLAG_S_WRK;
1791 else if (strcasecmp($st_str, "sigaretta") == 0) {
1792 $st = USER_FLAG_S_SMK;
1794 else if (strcasecmp($st_str, "presente") == 0) {
1795 $st = USER_FLAG_S_EYE;
1797 else if (strcasecmp($st_str, "coniglio") == 0) {
1798 $st = USER_FLAG_S_RABB;
1800 else if (strcasecmp($st_str, "calcio") == 0) {
1801 $st = USER_FLAG_S_SOCC;
1803 else if (strcasecmp($st_str, "pupo") == 0) {
1804 $st = USER_FLAG_S_BABY;
1806 else if (strcasecmp($st_str, "pulizie") == 0) {
1807 $st = USER_FLAG_S_MOP;
1809 else if (strcasecmp($st_str, "babbo") == 0) {
1810 $st = USER_FLAG_S_BABBO;
1812 else if (strcasecmp($st_str, "renna") == 0) {
1813 $st = USER_FLAG_S_RENNA;
1815 else if (strcasecmp($st_str, "pupazzo") == 0) {
1816 $st = USER_FLAG_S_PUPAZ;
1818 else if (strcasecmp($st_str, "vischio") == 0) {
1819 $st = USER_FLAG_S_VISCH;
1822 /* MLANG: "Questo stato non esiste." */
1823 $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]);
1827 log_main("chatt_send start set");
1828 if (($user->flags & USER_FLAG_S_ALL) != $st) {
1829 $update_room = TRUE;
1830 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
1833 } // nick chat command
1835 else { // normal chat line
1836 $is_normchat = TRUE;
1837 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
1839 $user->chat_dlt = $user->chat_dlt * 2;
1840 if ($user->chat_dlt > 120)
1841 $user->chat_dlt = 120;
1843 else if ($user->chat_lst == $msg)
1845 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
1846 $user->chat_ban = $curtime;
1847 $user->chat_dlt = 5;
1851 $user->chat_ban = 0;
1852 $user->chat_dlt = 0;
1856 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
1859 $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
1860 // temporary silentiation for troll (will became array check)
1861 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
1862 $to_room = $to_user;
1865 log_legal($curtime, $user->ip, $user,
1866 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
1868 $user->chat_lst = "$msg";
1869 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
1879 // Output to clients
1882 if ($to_user != FALSE) {
1883 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
1884 $user->comm[$user->step % COMM_N] .= $to_user;
1888 if ($to_room != FALSE) {
1889 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1890 $user_cur = $this->user[$i];
1891 if ($target != "" && $user_cur->name != $target)
1893 if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i)
1896 if ($is_normchat == TRUE) {
1897 // use MAP_AUTH to check if auth or isolation
1898 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
1899 if (($user->flags & USER_FLAG_AUTH) == 0) {
1905 else if ($is_ticker) {
1906 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
1907 if ($user->table >= TABLES_AUTH_N)
1912 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1913 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
1914 $user_cur->step_inc();
1919 // FIXME BRISK4: include for each kind of table
1920 require_once("${G_base}briskin5/Obj/briskin5.phh");
1921 // Before all align times with table timeout
1922 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1923 if (isset($this->match[$table_idx])) {
1924 $bin5 = $this->match[$table_idx];
1926 $bin5_table = $bin5->table[0];
1927 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1928 // stat must be "table" by definition
1929 $bin5_user = $bin5->user[$i];
1931 if ($target != "" && $bin5_user->name != $target)
1933 log_main("writa: ".$user_mesg);
1934 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
1935 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
1936 $bin5_user->step_inc();
1938 } // if (isset($this->match
1939 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1940 } // if ($to_tabl == true ...
1943 if ($user->stat == 'room' && $user->subst == 'standup') {
1944 $this->standup_update($user);
1946 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
1947 log_main("chatt_send pre table update");
1948 $this->table_update($user);
1949 log_main("chatt_send post table update");
1951 } // if ($update_room ...
1954 } // function chatt_send( ...
1956 function get_user($sess, &$idx)
1960 if (validate_sess($sess)) {
1961 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1962 if (strcmp($sess, $this->user[$i]->sess) == 0) {
1965 $ret = $this->user[$i];
1969 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
1970 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
1971 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
1974 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
1981 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip)
1984 * if ($idx > -1 && ret == FALSE) => duplicated nick
1985 * if ($idx == -2 && ret == FALSE) => invalid name
1986 * if ($idx == -3 && ret == FALSE) => wrong password
1987 * if ($idx == -1 && ret == FALSE) => no space left
1988 * if ($idx == 0 && ret == user) => SUCCESS
1989 * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db)
1992 function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie)
1998 $authenticate = FALSE;
2000 $login_exists = FALSE;
2002 $ghost_auth = FALSE;
2007 if (($name_new = validate_name($name)) == FALSE) {
2012 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2013 if (validate_sess($sess) == FALSE)
2016 /* if pass != FALSE verify the login with pass */
2017 log_auth("XXX", "auth1");
2019 if (($bdb = BriskDB::create()) != FALSE) {
2021 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2022 log_auth("XXX", "auth2");
2023 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2024 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2026 if ($authenticate != FALSE) {
2027 $user_type = $authenticate->type_get();
2035 $login_exists = $bdb->login_exists($name_new);
2039 // if db is down, send a warning and verify only current users
2040 // no actions at this moment
2042 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2044 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2048 if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) {
2050 continue; // NOTE: CHECK IT !!
2052 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2053 if ($authenticate != FALSE) {
2055 $ghost_auth = ($this->user[$i]->flags & USER_FLAG_AUTH);
2066 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2068 /* there is another user logged with your account and you and him have authenticated => new user
2069 get the session of the old user */
2070 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2073 $ghost_user = $this->user[$ghost];
2075 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2076 $ghost_user->step_inc();
2079 $ghost_user->sess = $sess;
2082 $ghost_user->sess = $sess;
2085 // If user at the table we need to update the table data too
2086 $table_idx = $ghost_user->table;
2087 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2088 require_once("${G_base}briskin5/Obj/briskin5.phh");
2089 if (isset($this->match[$table_idx])) {
2090 $bin5 = $this->match[$table_idx];
2092 if ($bin5->the_end != TRUE) {
2093 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2094 $bin5->user[$ghost_user->table_pos]->step_inc();
2095 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2101 return ($this->user[$ghost]);
2103 else if ($idx != -1 && $i == MAX_PLAYERS) {
2108 $this->user[$idx]->sess = $sess;
2111 $this->user[$idx]->sess = $sess;
2113 $this->user[$idx]->name = $name_new; // OK - add new user
2114 $this->user[$idx]->stat_set("room");
2115 $this->user[$idx]->step_set(0);
2116 while (array_pop($this->user[$idx]->comm) != NULL);
2117 $this->user[$idx]->subst = "standup";
2118 $this->user[$idx]->lacc = $curtime;
2119 $this->user[$idx]->laccwr = $curtime;
2120 $this->user[$idx]->bantime = 0;
2121 $this->user[$idx]->ip = $ip;
2123 $this->user[$idx]->rec = $authenticate;
2124 fprintf(STDERR, "MOP: [%s]\n", $authenticate->supp_comp);
2125 $this->user[$idx]->flags = $user_type;
2126 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2127 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2128 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2130 if ($authenticate != FALSE) {
2131 $this->user[$idx]->code = $authenticate->code_get();
2133 // all this part is included in the db server
2134 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2136 if (isset($cookie['CO_list'])) {
2137 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2138 if (strcmp($cookie['CO_list'], "auth") == 0) {
2139 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2140 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2142 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2143 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2144 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2147 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2152 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2155 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2157 log_main("ghost: rename!");
2158 $ghost_user = $this->user[$ghost];
2160 if ($ghost_auth == FALSE) {
2161 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2162 $ghostname = 'ghost'.$sfx;
2163 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2164 if (strcmp("", $this->user[$i]->sess) == 0)
2167 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2172 if ($ghostname != '')
2176 $ghost_user->name = $ghostname;
2178 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2179 $this->standup_update($ghost_user);
2182 log_main("chatt_send pre table update");
2183 $this->table_update($ghost_user);
2184 log_main("chatt_send post table update");
2186 } // if ($ghost_auth == FALSE
2188 // FIXME: cacciare il vecchio utente room && table (if needed)
2189 $ghost_user->the_end = TRUE;
2190 $ghost_user->lacc = 0;
2191 $this->garbage_manager(TRUE);
2193 } // if ($ghost > -1) {
2198 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));
2200 $ret = $this->user[$real_idx];
2207 function standup_update($user)
2209 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2210 $user_cur = $this->user[$i];
2211 if ($user_cur->sess == '')
2214 log_main("STANDUP START: ".$user_cur->stat);
2216 if ($user_cur->stat == 'room') {
2217 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2218 if ($user->idx_get() == $i) {
2219 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2221 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2223 $user_cur->step_inc();
2229 static function create($crystal_filename)
2231 if (($brisk_ser = @file_get_contents($crystal_filename)) == FALSE ||
2232 ($brisk = unserialize($brisk_ser)) == FALSE) {
2233 fprintf(STDERR, "NEW ROOM\n");
2234 $brisk = new Brisk($crystal_filename);
2237 fprintf(STDERR, "ROOM FROM FILE\n");
2238 rename($crystal_filename, $crystal_filename.".old");
2245 function load_data()
2250 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) {
2251 log_main("ftok failed");
2255 if (($shm_sz = sharedmem_sz($tok)) == -1) {
2256 log_main("shmop_open failed");
2260 $shm_sz = SHM_DIMS_MIN;
2262 if ($shm = shm_attach($tok, $shm_sz)) {
2263 $brisk = @shm_get_var($shm, $tok); // CHECKED BELOW
2265 log_only("bri == ".($brisk == FALSE ? "FALSE" : "TRUE")." bri === ".($brisk === FALSE ? "FALSE" : "TRUE")." bri isset ".(isset($brisk) ? "TRUE" : "FALSE"));
2267 log_only("bri count ".count($brisk));
2269 if ($brisk == FALSE) {
2270 log_only("INIT MAIN DATA");
2273 $brisk = Brisk::create();
2275 log_shme("Brisk::create");
2277 if (Brisk::save_data($brisk) == FALSE)
2282 $brisk->shm_sz = $shm_sz;
2286 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2287 if (($brisk->user[$i] = User::load_data($i, FALSE)) == FALSE) {
2288 log_crit("User::load_data failed");
2292 if ($i < MAX_PLAYERS) {
2298 // SHSPLIT: load users from the shared memory
2307 function save_data_orig($brisk)
2313 // var_dump($brisk);
2315 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2318 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2319 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2322 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2323 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2327 if (shm_remove($shm) === FALSE) {
2328 log_only("REMOVE FALLITA");
2332 $brisk->shm_sz += SHM_DIMS_DLT;
2340 function dump_data()
2342 $brisk_ser = serialize($this);
2343 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2344 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2351 function save_data($brisk)
2358 if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1)
2361 // SHSPLIT: before save the $brisk you must save users,
2362 // detach from main struct and (then) reattach
2363 $user_park = array();
2364 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2365 $user_park[$i] = $brisk->user[$i];
2366 $brisk->user[$i] = FALSE;
2369 while ($brisk->shm_sz < SHM_DIMS_MAX) {
2370 if (($shm = shm_attach($tok, $brisk->shm_sz)) == FALSE)
2373 // log_only("PUT_VAR DI ".strlen(serialize($brisk)));
2374 if (@shm_put_var($shm, $tok, $brisk) != FALSE) {
2375 log_shme("Brisk::save_data");
2379 if (shm_remove($shm) === FALSE) {
2380 log_only("REMOVE FALLITA");
2384 $brisk->shm_sz += SHM_DIMS_DLT;
2390 // SHSPLIT: reattach users to the room class
2391 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2392 User::save_data($user_park[$i], $i);
2393 $brisk->user[$i] = $user_park[$i];
2395 log_load("FINISH: ".($ret == TRUE ? "TRUE" : "FALSE"));
2400 static function lock_data($is_exclusive)
2402 if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) {
2403 self::$delta_t = microtime(TRUE);
2404 log_lock("LOCK room [".self::$delta_t."]");
2412 static function unlock_data($res)
2416 log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]");
2422 function standup_content($user)
2427 if ($user->stat != 'room')
2430 for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) {
2431 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2436 // $content .= sprintf('<table cols=\\"%d\\" class=\\"table_standup\\">', $ct);
2438 $content = ' j_stand_cont( [ ';
2440 $user_cur_id = $user->idx_get();
2441 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2442 if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "")
2445 $flags = $this->user[$i]->flags;
2447 // sql record exists AND last donate > 2013-01-01
2448 if ($this->user[$i]->is_supp_custom()) {
2449 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2455 if ($this->user[$i]->subst == "standup") {
2456 if ($user_cur_id == $i) {
2460 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2461 xcape($this->user[$i]->name), $supp_comp_s);
2470 function table_content($user, $table_idx)
2476 // Si possono usare i dati nella classe table
2479 $sess = $user->sess;
2480 $table = $this->table[$table_idx];
2482 if ($user->stat != 'room')
2485 $user_cur_id = $user->idx_get();
2487 for ($i = 0 ; $i < $table->player_n ; $i++) {
2488 $user_cur = $this->user[$table->player[$i]];
2490 $flags = $user_cur->flags;
2492 if ($user_cur_id == $table->player[$i])
2495 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2496 if ($user_cur->is_supp_custom())
2497 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2501 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2502 xcape($user_cur->name), $supp_comp_s);
2507 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2512 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2514 GLOBAL $G_black_list;
2516 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2518 $enc = get_encoding($header);
2519 if (isset($header['User-Agent'])) {
2520 if (strstr($header['User-Agent'], "MSIE")) {
2521 $transp_type = "htmlfile";
2524 $transp_type = "xhr";
2528 $transp_type = "iframe";
2530 force_no_cache($header_out);
2536 index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie);
2537 $content = ob_get_contents();
2540 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2541 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2545 case "index_wr.php":
2547 // Enhance required: in the POST case, after the header you must get content
2548 // from the socket, waiting if necessary
2552 index_wr_main($this, $addr, $get, $post, $cookie);
2553 $content = ob_get_contents();
2556 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2560 case "index_rd.php":
2561 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2563 if ($transp == 'websocket')
2567 if (!isset($cookie['sess'])
2568 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2570 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2572 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2577 $this->sess_cur_set($user->sess);
2578 // close a previous opened index_read_ifra socket, if exists
2579 if (($prev = $user->rd_socket_get()) != NULL) {
2580 $s_a_p->socks_unset($user->rd_socket_get());
2581 fclose($user->rd_socket_get());
2582 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2583 $user->rd_socket_set(NULL);
2587 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2588 $response = headers_render($header_out, -1).$user->chunked_content($content);
2589 $response_l = mb_strlen($response, "ASCII");
2591 $wret = @fwrite($new_socket, $response, $response_l);
2592 if ($wret < $response_l) {
2593 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2594 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2597 $user->rd_cache_set("");
2599 fflush($new_socket);
2602 $s_a_p->socks_set($new_socket, $user, NULL);
2603 $user->rd_socket_set($new_socket);
2604 printf(" - qui ci siamo - ");
2611 if (!(BRISK_DEBUG & DBG_ENGI))
2613 fprintf(STDERR, "TEST.PHP running\n");
2614 if (isset($post['data'])) {
2615 $content = $post['data'];
2618 $content = "NO DATA AVAILABLE";
2620 $header_out['Content-Type'] = 'text/plain';
2621 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2625 /* FAR TODO: move all into an array of registered sub-apps */
2626 $subs = "briskin5/";
2627 $subs_l = strlen($subs);
2628 if (!strncmp($path, $subs, $subs_l)) {
2629 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2638 function match_add($idx, $match)
2640 $this->match[$idx] = $match;
2643 function match_del($idx)
2645 unset($this->match[$idx]);
2648 function match_get($idx, $token)
2650 if (isset($this->match[$idx])) {
2652 || $token == $this->match[$idx]->table_token) {
2653 return ($this->match[$idx]);
2658 function sess_cur_set($sess)
2660 static::$sess_cur = $sess;
2663 static function sess_cur_get()
2665 return(static::$sess_cur);
2667 } // end class Brisk
2669 function make_seed()
2671 list($usec, $sec) = explode(' ', microtime());
2672 return (float) $sec + ((float) $usec * 100000);
2675 function btrace_line($ar)
2677 GLOBAL $G_btrace_pref_sub;
2680 for ($i = 0 ; $i < count($ar) ; $i++) {
2681 $with_class = isset($ar[$i]['class']);
2682 $with_file = isset($ar[$i]['file']);
2683 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2684 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2685 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2686 ($with_file ? $ar[$i]['line'] : ""));
2692 function trace_ftok($id, $add)
2694 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2695 $tok=@ftok($id, $add);
2697 log_shme($tok.": ".$id." + ".$add);
2702 function log_mop($step, $log)
2706 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2709 $sess = Brisk::sess_cur_get();
2710 if (isset($sess) == FALSE)
2715 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2718 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2719 $btrace = btrace_line(debug_backtrace());
2722 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2723 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2729 function log_only2($log)
2733 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2736 $sess = Brisk::sess_cur_get();
2737 if (isset($sess) == FALSE)
2742 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2745 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2746 $btrace = btrace_line(debug_backtrace());
2749 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2750 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2755 function log_crit($log)
2759 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2762 $sess = Brisk::sess_cur_get();
2763 if (isset($sess) == FALSE)
2768 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2771 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2772 $btrace = btrace_line(debug_backtrace());
2775 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2776 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2781 function log_only($log)
2785 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2788 $sess = Brisk::sess_cur_get();
2789 if (isset($sess) == FALSE)
2794 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2797 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2798 $btrace = btrace_line(debug_backtrace());
2801 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2802 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2807 function log_main($log)
2811 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
2814 $sess = Brisk::sess_cur_get();
2815 if (isset($sess) == FALSE)
2820 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
2823 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2824 $btrace = btrace_line(debug_backtrace());
2827 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2828 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2833 function log_rd($log)
2837 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
2840 $sess = Brisk::sess_cur_get();
2841 if (isset($sess) == FALSE)
2846 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
2849 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2850 $btrace = btrace_line(debug_backtrace());
2853 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2854 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2859 function log_rd2($log)
2863 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
2866 $sess = Brisk::sess_cur_get();
2867 if (isset($sess) == FALSE)
2872 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
2875 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2876 $btrace = btrace_line(debug_backtrace());
2880 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2881 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2886 function log_send($log)
2890 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
2893 $sess = Brisk::sess_cur_get();
2894 if (isset($sess) == FALSE)
2899 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
2902 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2903 $btrace = btrace_line(debug_backtrace());
2906 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2907 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2912 function log_lock($log)
2916 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
2919 $sess = Brisk::sess_cur_get();
2920 if (isset($sess) == FALSE)
2925 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
2928 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2929 $btrace = btrace_line(debug_backtrace());
2932 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2933 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2938 function log_wr($log)
2942 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
2945 $sess = Brisk::sess_cur_get();
2946 if (isset($sess) == FALSE)
2951 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
2954 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2955 $btrace = btrace_line(debug_backtrace());
2958 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2959 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2964 function log_load($log)
2968 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
2971 $sess = Brisk::sess_cur_get();
2972 if (isset($sess) == FALSE)
2977 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
2980 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2981 $btrace = btrace_line(debug_backtrace());
2984 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2985 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2990 function log_auth($sess, $log)
2994 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
2997 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3000 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3001 $btrace = btrace_line(debug_backtrace());
3004 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3005 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3010 function log_shme($log)
3014 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3017 $sess = Brisk::sess_cur_get();
3018 if (isset($sess) == FALSE)
3023 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3026 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3027 $btrace = btrace_line(debug_backtrace());
3030 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3031 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3038 // function log_legal($curtime, $sess, $name, $where, $mesg)
3039 function log_legal($curtime, $addr, $user, $where, $mesg)
3042 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3043 /* Unix time | session | nickname | IP | where was | mesg */
3044 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3045 ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'),
3046 $user->name, $addr, $where , $mesg));
3051 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3056 if ($sitted < PLAYERS_N) {
3064 if ($table == $cur_table)
3071 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3076 function show_notify($text, $tout, $butt, $w, $h)
3078 log_main("SHOW_NOTIFY: ".$text);
3079 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3082 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3084 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3085 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);
3088 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3090 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3093 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3094 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3097 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3098 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);
3102 function root_welcome($user)
3104 GLOBAL $root_wellarr, $G_lang;
3108 $dt = date("H:i ", $curtime);
3110 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3111 $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3118 function validate_sess($sess)
3120 if (strlen($sess) == SESS_LEN)
3126 function validate_name($name)
3128 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3130 for ($i = 0 ; $i < strlen($name_new) ; $i++) {
3132 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3139 function playsound($filename)
3141 return (sprintf('playsound("flasou", "%s");', $filename));
3144 function secstoword($secs)
3150 $mins = floor($secs / 60);
3152 if ($G_lang == 'en') {
3154 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3157 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3161 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3164 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3169 function sharedmem_sz($tok)
3171 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3172 log_main("shmop_open failed");
3175 $shm_sz = shmop_size($shm_id);
3176 shmop_close($shm_id);
3178 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3185 static function lock_data($is_exclusive)
3187 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3188 self::$delta_t = microtime(TRUE);
3189 log_lock("LOCK warrant [".self::$delta_t."]");
3197 static function unlock_data($res)
3201 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3210 static function lock_data($is_exclusive)
3212 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3213 self::$delta_t = microtime(TRUE);
3214 log_lock("LOCK poll [".self::$delta_t."]");
3222 static function unlock_data($res)
3226 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3232 function carousel_top()
3237 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));
3240 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>'));