5 * Copyright (C) 2006-2014 Matteo Nastasi
6 * mailto: nastasi@alternativeoutput.it
7 * matteo.nastasi@milug.org
8 * web: http://www.alternativeoutput.it
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details. You should have received a
19 * copy of the GNU General Public License along with this program; if
20 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21 * Suite 330, Boston, MA 02111-1307, USA.
26 define('BRISK_CONF', "brisk.conf.pho");
27 define('FTOK_PATH', "/var/lib/brisk");
28 define('LEGAL_PATH', "/tmp/legal_brisk");
29 define('PROXY_PATH', "/var/lib/brisk_proxy");
30 define('TABLES_N', 36);
31 define('TABLES_AUTH_N', 8);
32 define('TABLES_CERT_N', 4);
33 define('PLAYERS_N', 3);
34 define('MAX_POINTS', 5);
35 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
36 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
37 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
38 define('SHM_DIMS_DLT', 65536);
40 define('SHM_DIMS_U_MIN', 4096);
41 define('SHM_DIMS_U_MAX', 65536);
42 define('SHM_DIMS_U_DLT', 4096);
45 define('COMM_GEN_N', 50);
48 define('CHAT_ILL_TIME', 6);
49 define('CHAT_ENABLED', TRUE);
51 define('SESS_LEN', 13);
52 define('STREAM_TIMEOUT', 60);
53 /* FIXME: move to sac-a-push .phh */
54 /* TIME_RD define the server-side timeout, after half of it a ping request
55 is sent to client, after this time the client is log out */
56 define('EXPIRE_TIME_RD', 180);
57 define('EXPIRE_TIME_SMAMMA', 360);
58 define('EXPIRE_TIME_WAG', 10);
59 define('WAKEUP_TIME', 12);
60 // BAN_TIME da allineare anche in commons.js
61 define('BAN_TIME', 3600);
62 define('GARBAGE_TIMEOUT', 5);
63 define('NICKSERV', "BriskServ");
65 define('LOCK_SHARE_MAX', 10000);
67 define('DBG_ONL2', 0x000001);
68 define('DBG_ONLY', 0x000002);
69 define('DBG_MAIN', 0x000004);
70 define('DBG_READ', 0x000008);
71 define('DBG_REA2', 0x000010);
72 define('DBG_SEND', 0x000020);
73 define('DBG_LOCK', 0x000040);
74 define('DBG_WRIT', 0x000080);
75 define('DBG_LOAD', 0x000100);
76 define('DBG_AUTH', 0x000200);
77 define('DBG_CRIT', 0x000400);
78 define('DBG_LMOP', 0x000800);
79 define('DBG_TRAC', 0x001000);
80 define('DBG_SHME', 0x002000);
81 define('DBG_ENGI', 0x004000);
82 define('DBG_CDS', 0x008000);
83 define('DBG_STEP', 0x010000);
84 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
85 define('BRISK_DEBUG', 0x0800);
87 define('BRISK_SINGLE_DEBUG',0);
88 define('BRISK_SINGLE_SESS', "");
89 define('DEBUGGING', "no-debugging");
91 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
92 require_once("${G_base}Obj/ipclass.phh");
94 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
95 'en' => 'back standing' ),
96 'btn_close' => array( 'it' => 'chiudi',
99 'tit_all' => array( 'it' => 'tutti',
102 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
103 'en' => '<br>You are being idle for ' ),
104 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
105 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
106 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
107 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
108 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
109 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
110 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
111 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
112 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
113 'en' => '<br>The entered password is not correct.<br><br>'),
114 'alarret' => array( 'it' => 'Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>.',
115 'en' => 'Alarm \\"<b>%s</b>\\" sent to <b>%s</b>.'),
116 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
117 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
118 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
119 'en' => '<b>To send a message you have to be authenticated.</b>'),
120 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
121 'en' => 'The nickname have to contain at least one letter or one number.'),
122 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
123 'en' => 'The nickname <b>%s</b> is already in use.'),
124 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
125 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
126 '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>',
127 '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 ???
128 'statunkn' => array( 'it' => 'Questo stato non esiste.',
129 'en' => 'This state don\'t exists.'),
130 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
131 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
132 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
133 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
135 'tit_onauth'=>array( 'it' => '(solo aut.)',
136 'en' => '(only aut.)'),
137 'tit_onisol'=>array( 'it' => '(isolam.to)',
138 'en' => '(isolation)'),
139 '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.',
140 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
142 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
143 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
144 'gua_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
145 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
146 'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
147 'en' => 'EN <b>%s</b> si è auto-garantito.'),
148 'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
149 'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
150 'gua_err' => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i><login></i></b>.',
151 'en' => 'Error %d. Usage: <b>/guar <i><login></i></b>.')
154 $G_lng = langtolng($G_lang);
156 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
157 $G_brisk_version = "4.18.5";
159 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
160 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: Puffin riattivato, accessi da cloud disattivati, corretto bug sulla gestione di puffin, riabilitato blocco dei proxy.',
161 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
162 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: Puffin re-enabled, cloud accesses disabled, fixed puffin mgmt bug, re-enabled proxy access block.',
163 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
165 $G_room_help = array( 'it' => '
166 <div style=\\"text-align: left; padding: 8px;\\">
167 <b>Descrizione</b><br>
168 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
169 <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>
170 <b>Configurazione del browser.</b><br>
171 Occorre abilitare i cookies.<br>
173 <b>Uso del sito</b><br>
174 Potete sedervi a un tavolo o rimanere in piedi.<br>
175 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
178 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>
179 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
180 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
181 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
182 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
183 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.
185 <dt><b>Comandi della chat</b>
186 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
187 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
188 <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\\"
189 <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
190 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
191 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
192 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
193 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
199 <div style=\\"text-align: left; padding: 8px;\\">
200 <b>EN Descrizione</b><br>
201 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
202 <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>
203 <b>Configurazione del browser.</b><br>
204 Occorre abilitare i cookies.<br>
206 <b>Uso del sito</b><br>
207 Potete sedervi a un tavolo o rimanere in piedi.<br>
208 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
211 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>
212 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
213 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
214 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
215 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
216 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.
218 <dt><b>Comandi della chat</b>
219 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
220 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
221 <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\\"
222 <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
223 <dd><b>/guar <i><login></i></b> - mostra il garante dell\'utente con il login passato come argomento
224 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
225 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
226 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
232 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
233 <div style=\\"text-align: left; padding: 8px;\\">
234 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
236 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
237 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
239 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
240 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
241 <li>Smart card di InfoCamere
244 <b>Per auto-garantisi occorre possedere:</b><br><br>
246 <li>il codice PIN della propria carta
247 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
250 <b>Per effettuare la registrazione collegarsi al sito:</b> <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>.<br><br>
254 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
255 diretta dell\' utente da parte dell\' amministratore.
260 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
261 <div style=\\"text-align: left; padding: 8px;\\">
262 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
264 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
265 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
267 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
268 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
271 <b>Per auto-garantisi occorre possedere:</b><br><br>
273 <li>il codice PIN della propria carta
274 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
277 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
279 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
280 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
281 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
282 diretta dell\' utente da parte dell\' amministratore.
289 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
293 $G_room_about = array( 'it' => '<br>
294 <div id=\\"header\\" class=\\"header\\">
295 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
296 briscola chiamata in salsa ajax
298 <br><b>version '.$G_brisk_version.'</b><br><br>
299 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
301 <div id=\\"header\\" class=\\"header\\">
302 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
303 declaration briscola in ajax sauce <b>(Beta)</b>
305 <br><b>version '.$G_brisk_version.'</b><br><br>
306 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
309 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
312 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
313 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
314 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
315 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
316 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
317 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
318 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
319 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
320 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
321 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
322 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
323 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
324 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
325 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
326 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
327 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
328 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
329 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
330 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
332 // $G_PG_cons_n = count($G_PG_cons);
333 // printf("N CONS: %d\n", $G_PG_cons_n);
335 /* printf("%d %d\n", count($voc), count($cons)); */
336 /* for ($i = 0 ; $i < 26 ; $i++) { */
337 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
339 /* printf(' "%s", ', chr(ord('a') + $i)); */
340 /* for ($e = 0 ; $e < 26 ; $e++) { */
341 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
343 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
351 if (PHP_INT_SIZE == 4)
354 return ( ($v & 0x80000000 ? 0xffffffff00000000 : 0x00) | $v );
359 return long2ip($i & 0xffffffff);
362 function nickserv_msg($dt, $msg) {
363 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
366 function passwd_gen($seed = NULL)
368 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
377 for ($sil = 0 ; $sil < 7 ; $sil++) {
378 if (($sil % 2) == 0) {
380 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
382 $old = mt_rand(0, $G_PG_vow_n-1);
383 $pw .= $G_PG_vow[$old];
386 $new = mt_rand(0, $G_PG_vow_n-1);
388 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
389 $pw .= $G_PG_vow[$new];
395 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
402 function cmd_return($val, $desc)
404 return array('val' => $val, 'desc' => $desc);
407 function cmd_serialize($attrs)
412 foreach ($attrs as $key => $value) {
413 $ret .= $sep . $key . '=' . urlencode($value);
419 function cmd_deserialize($cmd)
422 $a = explode('&', $cmd);
424 while ($i < count($a)) {
425 $b = split('=', $a[$i]);
426 $ret[urldecode($b[0])] = urldecode($b[1]);
437 function versions_cmp($v1, $v2)
439 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
443 $v1_ar = split('\.', $v1);
444 $v2_ar = split('\.', $v2);
446 $v2_ct = count($v2_ar);
448 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
449 if (($v2_ct - 1) < $i) {
452 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
453 if ($v1_ar[$i] != $v2_ar[$i]) {
454 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
463 // return string with IPV4 address
464 function addrtoipv4($addr)
466 $ipv4addr_arr = explode(':' , $addr);
467 if (isset($ipv4addr_arr[3])) {
468 $ipv4addr = $ipv4addr_arr[3];
478 for ($i = 0; $i < ob_get_level(); $i++)
480 ob_implicit_flush(1);
484 function force_no_cache(&$header_out)
486 $header_out['Pragma'] = 'no-cache, must-revalidate';
487 $header_out['Cache-Control'] = 'no-cache';
488 $header_out['Expires'] = '-1';
491 function file_lock($fname, $is_exclusive)
493 if (($res = @fopen($fname, "r+")) == FALSE) {
497 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
505 function file_unlock($res)
508 flock($res, LOCK_UN);
513 $escpush_from = array("\\", "\"");
514 $escpush_to = array("\\\\", "\\\"");
517 GLOBAL $escpush_from, $escpush_to;
519 return str_replace($escpush_from, $escpush_to, $s);
522 $escinp_from = array( "\"" );
523 $escinp_to = array( """ );
525 function escinput($s)
527 GLOBAL $escinp_from, $escinp_to;
529 return str_replace($escinp_from, $escinp_to, $s);
534 return htmlentities($s, ENT_COMPAT, "UTF-8");
537 function esclfhtml($s)
539 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
542 function langtolng($lang)
546 return ($G_lang == 'en' ? '-en' : '');
549 function csplitter($in, $sep)
555 for ($i = 0 ; $i < strlen($in) ; $i++) {
556 $ini = substr($in, $i, 1);
560 else if ($ini == $sep) {
579 $from = array ( '\\', '@', '|' );
580 $to = array ( '\\\\', '@', '¦' );
582 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
587 $from = array ( '\\', '|', "\t", "\n");
588 $to = array ( '\\\\', '\\|', "\\t", "\\n");
590 return (str_replace($from, $to, $s));
593 function xcapemesg($s)
595 $from = array ( "\n");
596 $to = array ( "\\n");
598 return (str_replace($from, $to, $s));
608 function getbyid($idx)
610 return ($this->el[$idx]);
613 function setbyid($idx, $v)
615 $this->el[$idx] = $v;
619 define('TABLE_AUTH_TY_PUBL', 0);
620 define('TABLE_AUTH_TY_AUTH', 1);
621 define('TABLE_AUTH_TY_CERT', 2);
629 var $auth_type; // required authorization to sit down
636 var $table_start; // information field
644 function create($idx)
646 if (($thiz = new Table()) == FALSE)
650 $thiz->player = array();
653 if ($idx < TABLES_CERT_N)
654 $thiz->auth_type = TABLE_AUTH_TY_CERT;
655 else if ($idx < TABLES_AUTH_N)
656 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
658 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
664 $thiz->table_token = "";
665 $thiz->table_start = 0;
667 $thiz->wakeup_time = 0;
674 $this->idx = $from->idx;
675 $this->player = array();
676 for ($i = 0 ; $i < $from->player_n ; $i++)
677 $this->player[$i] = $from->player[$i];
678 $this->player_n = $from->player_n;
680 log_main("PLAYER_N - parent::copy.".$this->player_n);
682 $this->auth_type = $from->auth_type;
684 $this->wag_own = $from->wag_own;
685 $this->wag_com = $from->wag_com;
686 $this->wag_tout = $from->wag_tout;
688 $this->table_token = $from->table_token;
689 $this->table_start = $from->table_start;
691 $this->wakeup_time = $from->wakeup_time;
694 function myclone($from)
696 if (($thiz = new Table()) == FALSE)
704 function spawn($from)
706 if (($thiz = new Table()) == FALSE)
709 $thiz->idx = $from->idx;
710 $thiz->player = array();
711 for ($i = 0 ; $i < $from->player_n ; $i++)
712 $thiz->player[$i] = $i;
713 $thiz->player_n = $from->player_n;
715 $thiz->auth_type = $from->auth_type;
717 $thiz->wag_own = $from->wag_own;
718 $thiz->wag_com = $from->wag_com;
719 $thiz->wag_tout = $from->wag_tout;
721 $thiz->table_token = $from->table_token;
722 $thiz->table_start = $from->table_start;
724 $thiz->wakeup_time = $from->wakeup_time;
729 function wag_set($user_idx, $mesg)
733 $this->wag_own = $user_idx;
734 $this->wag_com = $mesg;
738 function wag_reset($timeout)
740 log_main("WAG_RESET");
742 unset($this->wag_own);
745 $this->wag_tout = $timeout;
748 function player_get($idx)
750 return ($this->player[$idx]);
753 function player_set($idx, $player)
755 $this->player[$idx] = $player;
758 function user_add($idx)
760 $this->player[$this->player_n] = $idx;
763 return ($this->player_n - 1);
766 function user_rem($brisk, $user)
768 $tabpos = $user->table_pos;
770 /* verifico la consistenza dei dati */
771 if ($brisk->user[$this->player[$tabpos]] == $user) {
773 /* aggiorna l'array dei giocatori al tavolo. */
774 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
775 $this->player[$i] = $this->player[$i+1];
776 $user_cur = $brisk->user[$this->player[$i]];
777 $user_cur->table_pos = $i;
782 log_main("INCONSISTENCY ON TABLE.");
786 // Table->act_content - return 'id' of type of output required for table button
787 function act_content($user)
790 $isstanding = ($user->subst == 'standup');
791 $sitted = $this->player_n;
793 $cur_table = $user->table;
797 if ($sitted < PLAYERS_N) {
798 switch ($this->auth_type) {
799 case TABLE_AUTH_TY_CERT:
800 if ($user->is_cert())
805 case TABLE_AUTH_TY_AUTH:
806 if ($user->is_auth())
821 if ($table == $cur_table)
828 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
841 function Delay_Manager($triglevel)
843 $this->triglevel = $triglevel;
844 $this->delta = array();
845 $this->lastcheck = 0;
848 function delta_get($curtime)
850 // clean too old delta items
851 for ($i = 0 ; $i < count($this->delta) ; $i++) {
852 if ($this->delta[$i][0] < $curtime) {
853 array_splice($this->delta, $i, 1);
858 // add new delta items if delay exceeded $this->triglevel sec
859 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
860 $delta = $curtime - $this->lastcheck - $this->triglevel;
861 array_push($this->delta, array($curtime + $delta , $delta));
862 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
865 // extract the maximum valid delta
867 for ($i = 0 ; $i < count($this->delta) ; $i++) {
868 $delta_cur = $this->delta[$i][1];
869 if ($delta_max < $delta_cur)
870 $delta_max = $delta_cur;
873 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
878 function lastcheck_set($curtime)
880 $this->lastcheck = $curtime;
888 function Client_prefs()
892 static function from_user($user)
894 $thiz = new Client_prefs();
895 $thiz->user_load($user);
900 static function from_json($json)
902 $thiz = new Client_prefs();
903 if ($thiz->json_load($json) == FALSE) {
911 function user_load($user)
913 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
914 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
915 if ($user->rec != FALSE) {
916 $this->supp_comp = $user->rec->supp_comp_get();
919 $this->supp_comp = "000000000000";
922 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
925 function json_load($json_s)
930 if (gettype($json_s) == "string") {
931 if (($json = json_decode($json_s)) == FALSE)
937 if ($this->listen < 0 || $this->listen > 2)
939 $this->listen = $json->listen;
941 if (mb_strlen($json->supp_comp, "ASCII") != 12)
944 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
945 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
946 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
952 $this->supp_comp = $json->supp_comp;
959 function store($user, $is_save)
962 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
963 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
964 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
965 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
967 if ($user->is_supp_custom()) {
968 $user->rec->supp_comp_set($this->supp_comp);
971 $user->prefs_store();
975 define('GHOST_SESS_TOUT', 1800);
976 define('GHOST_SESS_REAS_LOUT', 1); // logout
977 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
978 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
979 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
980 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
981 define('GHOST_SESS_REAS_PROX', 6); // proxy access
989 function GhostSessEl($time, $sess, $reas)
991 $this->time = $time + GHOST_SESS_TOUT;
1001 function GhostSess()
1003 $this->gs = array();
1006 // push or update for this session
1007 function push($time, $sess, $reas)
1009 foreach($this->gs as $el) {
1010 if ($el->sess == "$sess") {
1012 $el->time = $time + GHOST_SESS_TOUT;
1017 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1023 foreach($this->gs as $key => $el) {
1024 if ($el->sess == "$sess") {
1025 $ret = $this->gs[$key];
1026 unset($this->gs[$key]);
1033 function garbage_manager($curtime)
1035 foreach($this->gs as $key => $el) {
1036 if ($el->time < $curtime) {
1037 unset($this->gs[$key]);
1047 var $crystal_filename;
1051 var $comm; // commands for many people
1052 var $step; // current step of the comm array
1053 var $garbage_timeout;
1056 var $ban_list; // ban list (authized allowed)
1057 var $black_list; // black list (anti-dos, noone allowed)
1058 var $cloud_smasher; // list of cloud ip ranges to be rejected
1064 public static $sess_cur;
1072 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1073 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1074 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1075 fprintf(STDERR, "ROOM FROM FILE\n");
1076 rename($crystal_filename, $crystal_filename.".old");
1078 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1084 fprintf(STDERR, "NEW ROOM\n");
1085 $thiz = new Brisk();
1087 $thiz->crystal_filename = $crystal_filename;
1088 $thiz->user = array();
1089 $thiz->table = array();
1090 $thiz->match = array();
1092 $thiz->ban_list = IpClass::create();
1093 $thiz->black_list = IpClass::create();
1094 $thiz->cloud_smasher = IpClass::create();
1095 $thiz->ghost_sess = new GhostSess();
1097 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1098 $thiz->user[$i] = User::create($thiz, $i, "", "");
1101 for ($i = 0 ; $i < TABLES_N ; $i++) {
1102 $thiz->table[$i] = Table::create($i);
1104 $thiz->garbage_timeout = 0;
1105 $thiz->shm_sz = SHM_DIMS_MIN;
1107 $thiz->delay_mgr = new Delay_Manager(1.5);
1109 static::$sess_cur = FALSE;
1111 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1116 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1118 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1119 count($ban_list), count($black_list), count($cloud_smasher));
1121 if (defined('CURL_DE_SAC_VERS')) {
1122 if (brisk_cds_reload($this) == FALSE) {
1126 $this->ban_list->update($ban_list);
1127 $this->black_list->update($black_list);
1128 $this->cloud_smasher->update($cloud_smasher);
1131 $this->banned_kickoff();
1132 $this->garbage_manager(TRUE);
1136 function banned_kickoff()
1140 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1141 $table_cur = $this->table[$table_idx];
1142 // if the table is complete and exists we check users IP
1144 if ($table_cur->player_n == PLAYERS_N) {
1145 if (isset($this->match[$table_idx]) &&
1146 $table_cur->table_token == $bin5->table_token) {
1147 log_main("PLAYERS == N TABLE ".$table_idx);
1149 $bin5 = $this->match[$table_idx];
1151 $is_ban |= $bin5->banned_kickoff();
1156 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1157 $user_cur = $this->user[$i];
1159 if ($user_cur->is_active() == FALSE)
1162 // check if the IP is blacklisted
1163 if ($this->black_check($user_cur->ip) ||
1164 $this->cloud_check($user_cur->ip)) {
1165 $user_cur->lacc = 0;
1170 // if authorized not check if banlisted
1171 if ($user_cur->is_auth()) {
1175 if ($this->ban_check($user_cur->ip)) {
1176 $user_cur->lacc = 0;
1184 function ban_check($ip_str)
1186 return ($this->ban_list->check($ip_str));
1189 function black_check($ip_str)
1191 return ($this->black_list->check($ip_str));
1194 function cloud_check($ip_str)
1196 return ($this->cloud_smasher->check($ip_str));
1199 function users_cleanup()
1201 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1202 $user_cur = $this->user[$i];
1204 if ($user_cur->the_end) {
1205 $user_cur->reset(); // users_cleanup, OK
1210 function garbage_manager($force)
1212 GLOBAL $G_lang, $mlang_brisk, $G_base;
1216 log_rd2("garbage_manager START");
1218 /* Garbage collector degli utenti in timeout */
1219 $curtime = microtime(TRUE);
1221 $delta = $this->delay_mgr->delta_get($curtime);
1223 if (!$force && !($this->garbage_timeout < $curtime)) {
1224 $this->delay_mgr->lastcheck_set($curtime);
1228 // Before all align times with table timeout
1229 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1230 $table_cur = $this->table[$table_idx];
1231 // if the table is complete and exists its shared mem we get the info about users lacc
1233 if ($table_cur->player_n == PLAYERS_N) {
1234 log_main("PLAYERS == N TABLE ".$table_idx);
1237 $no_recovery = FALSE;
1238 if (isset($this->match[$table_idx])) {
1239 $bin5 = $this->match[$table_idx];
1241 if ($table_cur->table_token != $bin5->table_token) {
1242 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1243 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1244 $no_recovery = TRUE;
1248 if ($bin5 != FALSE) {
1252 log_main("garbage_manager: bri loaded successfully.");
1253 $bin5->garbage_manager(TRUE);
1255 $bin5_table = $bin5->table[0];
1257 // is the end of the table
1259 if ($bin5->the_end == TRUE) {
1261 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1263 log_main("garbage_manager: INSIDE THE END.");
1265 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1266 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1267 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1270 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1271 // stat must be "table" by definition
1272 $user_cur = $this->user[$table_cur->player[$i]];
1273 $bin5_user = $bin5->user[$i];
1275 $user_cur->subst = $bin5_user->subst;
1276 $user_cur->rd_step = $bin5_user->rd_step;
1277 $user_cur->step = $bin5_user->step;
1278 $user_cur->lacc = $bin5_user->lacc;
1279 $user_cur->laccwr = $bin5_user->lacc;
1280 $user_cur->bantime = $bin5_user->bantime;
1281 $user_cur->the_end = $bin5_user->the_end;
1282 if ($user_cur->the_end) {
1283 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1287 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1289 $this->room_join_wakeup($user_cur, FALSE, 0);
1290 $table_cur->table_token = "";
1291 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1293 $this->match_del($table_idx);
1296 log_main("gm:: save_data");
1298 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1299 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1302 } // if ($bin5 == FALSE
1303 else if ($no_recovery == FALSE) {
1304 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1306 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1307 $user_cur = $this->user[$table_cur->player[$i]];
1308 $user_cur->subst = "shutdowner";
1309 $user_cur->step_inc();
1311 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1312 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1313 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1314 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1315 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1316 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1317 $user_cur->step_inc();
1320 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1321 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1322 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1324 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1326 $this->room_join_wakeup($user_cur, TRUE, -2);
1327 $table_cur->table_token = "";
1330 } // if ($table_cur->player_n == PLAYERS_N) {
1331 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1333 log_rd2("out new loop.");
1335 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1336 $user_cur = $this->user[$i];
1338 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1340 if ($user_cur->is_active() == FALSE)
1343 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1344 // Auto logout dell'utente
1345 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1347 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1348 $user_cur->the_end = TRUE;
1350 log_rd2("AUTO LOGOUT.");
1351 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1352 log_auth($user_cur->sess, "Autologout session.");
1354 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1355 $this->room_wakeup($user_cur);
1356 else if ($user_cur->subst == 'standup')
1357 $this->room_outstandup($user_cur);
1359 log_rd2("LOGOUT FROM WHAT ???");
1363 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1364 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1365 $this->room_wakeup($user_cur);
1366 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1367 /* 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" */
1368 $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);
1369 $user_cur->step_inc();
1373 log_rd2("GARBAGE UPDATED!");
1375 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1378 $this->ghost_sess->garbage_manager($curtime);
1380 $this->delay_mgr->lastcheck_set($curtime);
1384 function show_room($user_step, $user)
1386 GLOBAL $G_lang, $mlang_brisk;
1387 log_main("show_room: username: ".$user->name);
1389 $ret = sprintf('gst.st = %d; ', $user_step);
1391 $prefs = Client_prefs::from_user($user);
1392 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1395 if ($user->flags & USER_FLAG_ISOLAUTH) {
1396 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1398 else if ($user->flags & USER_FLAG_LISTAUTH) {
1399 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1402 $ret .= 'list_set(\'all\', false, \'\' ); ';
1406 if ($user->subst == 'standup')
1407 $ret .= "tra.show(); ";
1409 $ret .= "tra.hide(); ";
1411 $ret .= sprintf('stat = "%s";', $user->stat);
1413 $ret .= root_welcome($user);
1414 if ($user->flags & USER_FLAG_DBFAILED) {
1415 $ret .= "gst.st = ".($user->step+1)."; ";
1416 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1419 $ret .= sprintf('subst = "%s";', $user->subst);
1420 $ret .= $user->myname_innerHTML();
1422 for ($i = 0 ; $i < TABLES_N ; $i++) {
1424 $ret .= $this->table_content($user, $i);
1426 $ret .= $this->table[$i]->act_content($user);
1427 if ($this->table[$i]->wag_own != -1)
1428 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1430 $ret .= sprintf('tra.rem(%d); ', $i);
1432 $ret .= $this->standup_content($user);
1433 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1439 function room_wakeup($user)
1441 $table_idx = $user->table;
1442 $table = $this->table[$table_idx];
1444 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1448 $from_table = ($user->stat == "table");
1450 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1452 for ($i = 0 ; $i < $table->player_n ; $i++) {
1453 $user_cur = $this->user[$table->player[$i]];
1454 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1456 if ($user->idx_get() != $table->player[$i]) {
1457 $user_cur->stat_set("room");
1458 $user_cur->subst = "sitdown";
1459 $user_cur->laccwr = $curtime;
1461 else if ($user->is_active()) {
1462 $user_cur->stat_set("room");
1463 $user_cur->subst = "standup";
1464 $user_cur->laccwr = $curtime;
1465 $user_cur->table = -1;
1470 $user->stat_set("room");
1471 $user->subst = "standup";
1472 $user->laccwr = $curtime;
1475 $remove_wagon = FALSE;
1476 if($table->wag_own == $user->idx_get()) {
1477 $table->wag_reset($curtime);
1478 $remove_wagon = TRUE;
1482 /* aggiorna l'array dei giocatori al tavolo. */
1483 $table->user_rem($this, $user);
1485 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1486 $user_cur = $this->user[$i];
1487 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1490 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1492 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1493 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1494 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1495 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1496 log_main("DOCUMENT.index.php: from table");
1498 else if ($user_cur->stat == "room") {
1499 log_main("DOCUMENT.index.php: from table");
1501 $ret .= $this->table_content($user_cur, $table_idx);
1502 $ret .= $this->standup_content($user_cur);
1504 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1505 $ret .= $table->act_content($user);
1507 if ($user->idx_get() == $i) {
1508 // set the new status
1509 $ret .= 'subst = "standup"; tra.show(); ';
1510 // clean the action buttons in other tables
1511 for ($e = 0 ; $e < TABLES_N ; $e++) {
1512 if ($this->table[$e]->player_n < PLAYERS_N) {
1513 $ret .= $this->table[$e]->act_content($user);
1518 $ret .= $table->act_content($user_cur);
1521 log_wr("ROOM_WAKEUP: ".$ret);
1522 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1523 $user_cur->step_inc();
1527 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1529 $table_idx = $user->table;
1530 $table = $this->table[$table_idx];
1532 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1535 $user_wup = array();
1537 $user_tab = array();
1539 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1541 for ($i = 0 ; $i < $table->player_n ; $i++) {
1542 $user_cur = $this->user[$table->player[$i]];
1543 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1544 if ($user_cur->is_empty()) {
1547 if ($update_lacc == TRUE) {
1548 $user_cur->laccwr = $curtime;
1550 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1551 if ($user_cur->subst == "shutdowned") {
1552 $user_cur->stat_set("room");
1553 $user_cur->subst = "sitdown";
1555 else if ($user_cur->subst == "shutdowner") {
1556 $user_cur->stat_set("room");
1557 $user_cur->subst = "standup";
1558 $user_cur->table = -1;
1559 $user_wup[$user_wup_n++] = $user_cur;
1561 $remove_wagon = FALSE;
1562 if($table->wag_own == $table->player[$i]) {
1563 $remove_wagon = TRUE;
1564 $table->wag_reset($curtime);
1567 $user_tab[$user_tab_n++] = $table->player[$i];
1570 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1571 $table->user_rem($this, $user_wup[$wup_idx]);
1573 /* aggiorna l'array dei giocatori al tavolo. */
1575 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1576 log_main("START LOOP");
1577 $user_cur = $this->user[$i];
1578 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1579 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1584 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1586 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1587 if ($user_cur->stat == "room") {
1588 log_main("DOCUMENT.index.php from table");
1590 $ret .= $this->table_content($user_cur, $table_idx);
1591 $ret .= $this->standup_content($user_cur);
1593 $ret .= $table->act_content($user_cur);
1596 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1597 if ($user_tab[$tab_idx] == $i)
1600 // for users that wakeup the room will be reconstructed by index_rd.php
1601 if ($tab_idx < $user_tab_n) {
1602 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1604 // ARRAY_POP DISABLED
1605 // if ($trans_delta == 0)
1606 // while (array_pop($user_cur->comm) != NULL);
1608 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1609 $user_cur->comm[$user_cur->step % COMM_N] = "";
1610 $user_cur->step_inc();
1611 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1612 $user_cur->step_inc();
1613 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1617 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1619 log_main("JOIN_WAKEUP more");
1621 $ret .= $table->act_content($user_cur);
1623 log_main("JOIN_WAKEUP end more");
1625 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1626 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1627 $user_cur->step_inc();
1631 function guarantee_show($user, $user_login, $dt)
1633 GLOBAL $G_lang, $mlang_brisk, $G_base;
1639 if ($user_login == "") {
1643 if (($bdb = BriskDB::create()) == FALSE) {
1647 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1651 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1652 $guar_login = $guar_item->login_get();
1657 $user_tos_vers = $user_item->tos_vers_get();
1659 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1660 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1662 else if ($guar_login == "") {
1663 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1665 else if ($guar_login == $user_login) {
1666 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1669 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1670 xcape($user_login), xcape($guar_login)));
1675 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1678 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1684 function room_outstandup($user)
1686 $this->room_sitdown($user, -1);
1689 function table_update($user)
1691 log_main("table_update: pre - USER: ".$user->name);
1693 $table_idx = $user->table;
1695 if ($table_idx > -1)
1696 $table = $this->table[$table_idx];
1698 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1700 $user_cur = $this->user[$i];
1701 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1704 $ret = "gst.st = ".($user_cur->step+1)."; ";
1705 if ($table_idx > -1)
1706 $ret .= $this->table_content($user_cur, $table_idx);
1708 if ($user->idx_get() == $i) {
1709 $ret .= $user->myname_innerHTML();
1711 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1712 $user_cur->step_inc();
1715 log_main("table_update: post");
1718 function room_sitdown($user, $table_idx)
1720 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1724 if ($table_idx > -1 && $table_idx < TABLES_N) {
1725 $table = $this->table[$table_idx];
1728 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1729 for ($i = 0 ; $i < TABLES_N ; $i++) {
1730 if ($table->wag_own == $table->player[$i]) {
1731 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1732 $table->wag_reset(time());
1739 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1741 $user_cur = $this->user[$i];
1742 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1745 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1746 if ($table_idx > -1)
1747 $ret .= $this->table_content($user_cur, $table_idx);
1748 $ret .= $this->standup_content($user_cur);
1750 if ($user->idx_get() == $i) {
1751 $ret .= 'subst = "sitdown"; tra.hide(); ';
1752 // clean the action buttons in other tables
1753 for ($e = 0 ; $e < TABLES_N ; $e++) {
1754 $ret .= $this->table[$e]->act_content($user_cur);
1757 else if ($table_idx > -1) {
1758 if ($table->player_n == PLAYERS_N) {
1760 $ret .= $table->act_content($user_cur);
1763 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1764 $user_cur->step_inc();
1768 function kickuser($user, $out_reas)
1772 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1774 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1776 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1777 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1778 $bin5 = &$this->match[$user->table];
1779 $user_bin5 = &$bin5->user[$user->table_pos];
1780 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1781 $bin5->table_wakeup($user_bin5);
1782 $user->the_end = TRUE;
1783 $this->room_wakeup($user);
1787 if ($user->stat == 'table' || $user->stat == 'room') {
1788 $user->the_end = TRUE;
1789 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1790 $this->room_wakeup($user);
1792 else if ($user->subst == 'standup') {
1793 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1794 $this->room_outstandup($user);
1797 log_rd2("LOGOUT FROM WHAT ???");
1802 function kickuser_by_name($name, $out_reas)
1804 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1805 $user_out = $this->user[$i];
1806 if (strcmp($user_out->name, $name) == 0) {
1807 return ($this->kickuser($user_out, $out_reas));
1813 function kickuser_by_sess($sess, $out_reas)
1815 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1816 $user_out = $this->user[$i];
1817 if (strcmp($user_out->sess, $sess) == 0) {
1818 return ($this->kickuser($user_out, $out_reas));
1824 function kickuser_by_idx($idx, $out_reas)
1826 $user_out = $this->user[$idx];
1827 return ($this->kickuser($user_out, $out_reas));
1830 function chatt_send($user, $mesg)
1832 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1836 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1838 $dt = date("H:i ", $curtime);
1849 $is_normchat = FALSE;
1850 /* for old isolation management $is_ticker = FALSE; */
1851 $update_room = FALSE;
1853 if (strcmp($msg, "/tav") == 0 ||
1854 strncmp($msg, "/tav ", 5) == 0) {
1856 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1857 /* 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>" */
1858 $msg = $mlang_brisk['tickmust'][$G_lang];
1859 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1864 $table = $this->table[$user->table];
1866 if ($table->wag_own != -1) {
1867 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1868 $msg = $mlang_brisk['tickjust'][$G_lang];
1869 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1874 $dtime = $curtime - $table->wag_tout;
1875 if ($dtime < EXPIRE_TIME_WAG) {
1876 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1877 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1878 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1879 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1884 $msg = substr($msg, 5);
1886 $table->wag_set($user->idx_get(), $msg);
1887 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1888 $to_room = $to_user;
1889 /* for old isolation management $is_ticker = TRUE; */
1891 } // /tav chat command
1892 // just for development use currently
1893 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1894 fprintf(STDERR, "MOP OUT\n");
1895 $target = substr($msg, 5);
1896 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1898 else if (strncmp($msg, "/alarm ", 7) == 0) {
1899 if (strncmp($msg, "/alarm to ", 10) == 0) {
1900 $sp_pos = strpos($msg, " ", 10);
1901 $target = substr($msg, 10, $sp_pos - 10);
1902 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1906 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1909 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1910 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1911 $msg = $mlang_brisk['alarpass'][$G_lang];
1912 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1917 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1918 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1919 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1920 $to_user = nickserv_msg($dt, $prestr);
1922 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1923 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1924 /* MLANG: "chiudi" */
1925 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1927 } // /alarm chat command
1928 else if (strncmp($msg, "/listen ", 8) == 0) {
1929 $arg = substr($msg, 8);
1931 if (strcasecmp($arg, "isolation") == 0) {
1933 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1934 $user->table >= TABLES_AUTH_N) {
1935 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1939 $user->flags &= ~USER_FLAG_MAP_AUTH;
1940 $user->flags |= USER_FLAG_ISOLAUTH;
1941 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1944 else if (strcasecmp($arg, "auth") == 0) {
1945 $flags_old = $user->flags;
1946 $user->flags &= ~USER_FLAG_MAP_AUTH;
1947 $user->flags |= USER_FLAG_LISTAUTH;
1948 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1951 $flags_old = $user->flags;
1952 $user->flags &= ~USER_FLAG_MAP_AUTH;
1953 $to_user = 'list_set(\'all\', true, \'\'); ';
1956 // if from isolation redraw standup area
1957 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1958 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1962 else if (strcmp($msg, "/authreq") == 0) {
1963 if ($user->is_cert()) {
1964 $to_user = sprintf('authbox(300,200);');
1967 /* 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." */
1968 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1971 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1972 if ($user->is_auth()) {
1973 $to_user = sprintf('mesgtoadmbox(500,300);');
1976 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1977 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1980 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
1981 log_main("chatt_send BEGIN");
1984 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
1985 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
1989 $msg = "COMMAND ".$msg;
1990 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1991 $user_cur = $this->user[$i];
1993 if ($user_cur->is_active() == FALSE)
1995 if (strcasecmp($user_cur->name,$name_new) == 0)
1998 if ($i < MAX_PLAYERS) {
1999 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2000 $to_user = nickserv_msg($dt, $prestr);
2004 /* 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>" */
2005 if ($user->is_auth()) {
2006 if (strcasecmp($user->name,$name_new) != 0) {
2007 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2008 ($user->subst == 'standup' ||
2009 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2012 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2013 for ($i = 0 ; $i < TABLES_N ; $i++) {
2014 $to_user .= $this->table[$i]->act_content($user);
2018 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2023 $user->name = $name_new; // OK - nick changed
2024 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2025 if ( ! $user->is_auth() ) {
2026 if (($bdb = BriskDB::create()) != FALSE) {
2028 /* 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>" */
2029 if ($bdb->login_exists($name_new)) {
2030 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2031 $to_user .= nickserv_msg($dt, $prestr);
2036 log_main("chatt_send start set");
2038 $update_room = TRUE;
2040 } // nick chat command
2041 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2042 $guar_user = substr($msg, 6);
2044 $this->guarantee_show($user, $guar_user, $dt);
2046 else if (strncmp($msg, "/st ", 4) == 0) {
2047 log_main("chatt_send BEGIN");
2050 $st_str = substr($msg, 4);
2052 if (strcasecmp($st_str, "normale") == 0) {
2053 $st = USER_FLAG_S_NORM;
2055 else if (strcasecmp($st_str, "pausa") == 0) {
2056 $st = USER_FLAG_S_PAU;
2058 else if (strcasecmp($st_str, "fuori") == 0) {
2059 $st = USER_FLAG_S_OUT;
2061 else if (strcasecmp($st_str, "cane") == 0) {
2062 $st = USER_FLAG_S_DOG;
2064 else if (strcasecmp($st_str, "cibo") == 0) {
2065 $st = USER_FLAG_S_EAT;
2067 else if (strcasecmp($st_str, "lavoro") == 0) {
2068 $st = USER_FLAG_S_WRK;
2070 else if (strcasecmp($st_str, "sigaretta") == 0) {
2071 $st = USER_FLAG_S_SMK;
2073 else if (strcasecmp($st_str, "presente") == 0) {
2074 $st = USER_FLAG_S_EYE;
2076 else if (strcasecmp($st_str, "coniglio") == 0) {
2077 $st = USER_FLAG_S_RABB;
2079 else if (strcasecmp($st_str, "calcio") == 0) {
2080 $st = USER_FLAG_S_SOCC;
2082 else if (strcasecmp($st_str, "pupo") == 0) {
2083 $st = USER_FLAG_S_BABY;
2085 else if (strcasecmp($st_str, "pulizie") == 0) {
2086 $st = USER_FLAG_S_MOP;
2088 else if (strcasecmp($st_str, "babbo") == 0) {
2089 $st = USER_FLAG_S_BABBO;
2091 else if (strcasecmp($st_str, "renna") == 0) {
2092 $st = USER_FLAG_S_RENNA;
2094 else if (strcasecmp($st_str, "pupazzo") == 0) {
2095 $st = USER_FLAG_S_PUPAZ;
2097 else if (strcasecmp($st_str, "vischio") == 0) {
2098 $st = USER_FLAG_S_VISCH;
2101 /* MLANG: "Questo stato non esiste." */
2102 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2106 log_main("chatt_send start set");
2107 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2108 $update_room = TRUE;
2109 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2112 } // nick chat command
2114 else { // normal chat line
2115 $is_normchat = TRUE;
2116 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2118 $user->chat_dlt = $user->chat_dlt * 2;
2119 if ($user->chat_dlt > 120)
2120 $user->chat_dlt = 120;
2122 else if ($user->chat_lst == $msg)
2124 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2125 $user->chat_ban = $curtime;
2126 $user->chat_dlt = 5;
2130 $user->chat_ban = 0;
2131 $user->chat_dlt = 0;
2135 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2138 if ( TRUE && (! $user->is_auth()) ) {
2139 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2140 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2142 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2143 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2144 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2146 $auguri = sprintf("%s auguri %s %s.",
2147 $aug_head[mt_rand(0, count($aug_head)-1)],
2148 $aug_body[mt_rand(0, count($aug_body)-1)],
2149 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2151 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2156 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2157 // temporary silentiation for troll (will became array check)
2158 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2159 $to_room = $to_user;
2163 log_legal($curtime, $user->ip, $user,
2164 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2166 $user->chat_lst = "$msg";
2167 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2177 // Output to clients
2180 if ($to_user != FALSE) {
2181 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2182 $user->comm[$user->step % COMM_N] .= $to_user;
2186 if ($to_room != FALSE) {
2187 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2188 $user_cur = $this->user[$i];
2189 if ($target != "" && $user_cur->name != $target)
2191 if ($user_cur->is_active() == FALSE // is not active user
2192 || $user_cur->stat == 'table' // or stat is 'table'
2193 || $user->idx_get() == $i) // or the $user idx is equal to current var
2196 if ($is_normchat == TRUE) {
2197 // use MAP_AUTH to check if auth or isolation
2198 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2199 if ( ! $user->is_auth() ) {
2205 else if ($is_ticker) {
2206 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2207 if ($user->table >= TABLES_AUTH_N)
2212 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2213 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2214 $user_cur->step_inc();
2219 // FIXME BRISK4: include for each kind of table
2220 require_once("${G_base}briskin5/Obj/briskin5.phh");
2221 // Before all align times with table timeout
2222 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2223 if (isset($this->match[$table_idx])) {
2224 $bin5 = $this->match[$table_idx];
2226 $bin5_table = $bin5->table[0];
2227 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2228 // stat must be "table" by definition
2229 $bin5_user = $bin5->user[$i];
2231 if ($target != "" && $bin5_user->name != $target)
2233 log_main("writa: ".$user_mesg);
2234 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2235 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2236 $bin5_user->step_inc();
2238 } // if (isset($this->match
2239 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2240 } // if ($to_tabl == true ...
2243 if ($user->stat == 'room' && $user->subst == 'standup') {
2244 $this->standup_update($user);
2246 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2247 log_main("chatt_send pre table update");
2248 $this->table_update($user);
2249 log_main("chatt_send post table update");
2251 } // if ($update_room ...
2254 } // function chatt_send( ...
2256 function get_user($sess, &$idx)
2260 if (validate_sess($sess)) {
2261 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2262 if ($this->user[$i]->is_empty())
2264 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2267 $ret = $this->user[$i];
2271 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2272 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2273 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2276 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2283 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2286 * if ($idx > -1 && ret == FALSE) => duplicated nick
2287 * if ($idx == -2 && ret == FALSE) => invalid name
2288 * if ($idx == -3 && ret == FALSE) => wrong password
2289 * if ($idx == -1 && ret == FALSE) => no space left
2290 * if ($idx == 0 && ret == user) => SUCCESS
2291 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2294 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2300 $authenticate = FALSE;
2302 $login_exists = FALSE;
2304 $ghost_auth = FALSE;
2309 if (($name_new = validate_name($name)) == FALSE) {
2314 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2315 if (validate_sess($sess) == FALSE)
2318 /* if pass != FALSE verify the login with pass */
2319 log_auth("XXX", "auth1");
2321 if (($bdb = BriskDB::create()) != FALSE) {
2323 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2324 log_auth("XXX", "auth2");
2325 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2326 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2328 if ($authenticate != FALSE) {
2329 $user_type = $authenticate->type_get();
2337 $login_exists = $bdb->login_exists($name_new);
2341 // if db is down, send a warning and verify only current users
2342 // no actions at this moment
2344 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2346 if ($this->user[$i]->is_empty()) {
2347 if ($idfree == -1) {
2352 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2357 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2358 if ($authenticate != FALSE) {
2360 $ghost_auth = $this->user[$i]->is_auth();
2371 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2373 /* there is another user logged with your account and you and him have authenticated => new user
2374 get the session of the old user */
2375 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2378 $ghost_user = $this->user[$ghost];
2380 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2381 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2382 $ghost_user->step_inc();
2385 $ghost_user->sess = $sess;
2388 $ghost_user->sess = $sess;
2391 // If user at the table we need to update the table data too
2392 $table_idx = $ghost_user->table;
2393 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2394 require_once("${G_base}briskin5/Obj/briskin5.phh");
2395 if (isset($this->match[$table_idx])) {
2396 $bin5 = $this->match[$table_idx];
2398 if ($bin5->the_end != TRUE) {
2399 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2400 $bin5->user[$ghost_user->table_pos]->step_inc();
2401 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2407 if (defined('CURL_DE_SAC_VERS')) {
2408 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2410 return ($this->user[$ghost]);
2412 else if ($idx != -1 && $i == MAX_PLAYERS) {
2417 $this->user[$idx]->sess = $sess;
2420 $this->user[$idx]->sess = $sess;
2422 $this->user[$idx]->name = $name_new; // OK - add new user
2423 $this->user[$idx]->stat_set("room");
2424 $this->user[$idx]->step_set(0);
2425 while (array_pop($this->user[$idx]->comm) != NULL);
2426 $this->user[$idx]->subst = "standup";
2427 $this->user[$idx]->lacc = $curtime;
2428 $this->user[$idx]->laccwr = $curtime;
2429 $this->user[$idx]->bantime = 0;
2430 $this->user[$idx]->ip = $ip;
2432 $this->user[$idx]->rec = $authenticate;
2433 $this->user[$idx]->flags = $user_type;
2434 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2435 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2436 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2438 if ($authenticate != FALSE) {
2439 $this->user[$idx]->code = $authenticate->code_get();
2441 // all this part is included in the db server
2442 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2444 if (isset($cookie['CO_list'])) {
2445 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2446 if (strcmp($cookie['CO_list'], "auth") == 0) {
2447 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2448 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2450 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2451 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2452 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2455 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2460 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2463 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2465 log_main("ghost: rename!");
2466 $ghost_user = $this->user[$ghost];
2468 if ($ghost_auth == FALSE) {
2469 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2470 $ghostname = 'ghost'.$sfx;
2471 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2472 if (strcmp("", $this->user[$i]->sess) == 0)
2475 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2480 if ($ghostname != '')
2484 $ghost_user->name = $ghostname;
2486 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2487 $this->standup_update($ghost_user);
2490 log_main("chatt_send pre table update");
2491 $this->table_update($ghost_user);
2492 log_main("chatt_send post table update");
2494 } // if ($ghost_auth == FALSE
2496 // FIXME: cacciare il vecchio utente room && table (if needed)
2497 $ghost_user->the_end = TRUE;
2498 $ghost_user->lacc = 0;
2499 $this->garbage_manager(TRUE);
2501 } // if ($ghost > -1) {
2506 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));
2508 $ret = $this->user[$real_idx];
2509 if (defined('CURL_DE_SAC_VERS')) {
2510 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2518 function standup_update($user)
2520 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2521 $user_cur = $this->user[$i];
2522 if ($user_cur->is_active() == FALSE)
2525 log_main("STANDUP START: ".$user_cur->stat);
2527 if ($user_cur->stat == 'room') {
2528 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2529 if ($user->idx_get() == $i) {
2530 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2532 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2534 $user_cur->step_inc();
2539 function dump_data()
2541 $brisk_ser = serialize($this);
2542 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2543 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2550 function standup_content($user)
2554 if ($user->stat != 'room')
2557 $content = ' j_stand_cont( [ ';
2559 $user_cur_id = $user->idx_get();
2560 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2561 if ($this->user[$i]->is_active() == FALSE // is not active user
2562 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2563 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2566 $flags = $this->user[$i]->flags;
2568 // sql record exists AND last donate > 2013-01-01
2569 if ($this->user[$i]->is_supp_custom()) {
2570 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2576 if ($this->user[$i]->subst == "standup") {
2577 if ($user_cur_id == $i) {
2581 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2582 xcape($this->user[$i]->name), $supp_comp_s);
2591 function table_content($user, $table_idx)
2597 // Si possono usare i dati nella classe table
2600 $sess = $user->sess;
2601 $table = $this->table[$table_idx];
2603 if ($user->stat != 'room')
2606 $user_cur_id = $user->idx_get();
2608 for ($i = 0 ; $i < $table->player_n ; $i++) {
2609 $user_cur = $this->user[$table->player[$i]];
2611 $flags = $user_cur->flags;
2613 if ($user_cur_id == $table->player[$i])
2616 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2617 if ($user_cur->is_supp_custom())
2618 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2622 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2623 xcape($user_cur->name), $supp_comp_s);
2628 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2633 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2635 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2637 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2639 fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2640 if ($this->black_check($addr)) {
2641 // TODO: waiting async 5 sec before close
2642 fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2645 if ($path != "" && $path != "index.php") {
2646 if ($this->cloud_check($addr)) {
2647 // TODO: waiting async 5 sec before close
2652 $enc = get_encoding($header);
2653 if (isset($header['User-Agent'])) {
2654 if (strstr($header['User-Agent'], "MSIE")) {
2655 $transp_type = "htmlfile";
2658 $transp_type = "xhr";
2662 $transp_type = "iframe";
2664 force_no_cache($header_out);
2670 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2671 $content = ob_get_contents();
2674 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2675 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2679 case "index_wr.php":
2681 // Enhance required: in the POST case, after the header you must get content
2682 // from the socket, waiting if necessary
2686 index_wr_main($this, $addr, $get, $post, $cookie);
2687 $content = ob_get_contents();
2690 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2694 case "index_rd.php":
2695 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2697 if ($transp == 'websocket')
2701 if (!isset($cookie['sess'])
2702 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2704 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2706 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2711 $this->sess_cur_set($user->sess);
2712 // close a previous opened index_read_ifra socket, if exists
2713 if (($prev = $user->rd_socket_get()) != NULL) {
2714 $s_a_p->socks_unset($user->rd_socket_get());
2715 fclose($user->rd_socket_get());
2716 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2717 $user->rd_socket_set(NULL);
2721 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2722 $response = headers_render($header_out, -1).$user->chunked_content($content);
2723 $response_l = mb_strlen($response, "ASCII");
2725 $wret = @fwrite($new_socket, $response, $response_l);
2726 if ($wret < $response_l) {
2727 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2728 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2731 $user->rd_cache_set("");
2733 fflush($new_socket);
2736 $s_a_p->socks_set($new_socket, $user, NULL);
2737 $user->rd_socket_set($new_socket);
2738 printf(" - qui ci siamo - ");
2745 if (!(BRISK_DEBUG & DBG_ENGI))
2747 fprintf(STDERR, "TEST.PHP running\n");
2748 if (isset($post['data'])) {
2749 $content = $post['data'];
2752 $content = "NO DATA AVAILABLE";
2754 $header_out['Content-Type'] = 'text/plain';
2755 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2759 /* FAR TODO: move all into an array of registered sub-apps */
2760 $subs = "briskin5/";
2761 $subs_l = strlen($subs);
2762 if (!strncmp($path, $subs, $subs_l)) {
2763 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2772 function match_add($idx, $match)
2774 $this->match[$idx] = $match;
2777 function match_del($idx)
2779 unset($this->match[$idx]);
2782 function match_get($idx, $token)
2784 if (isset($this->match[$idx])) {
2786 || $token == $this->match[$idx]->table_token) {
2787 return ($this->match[$idx]);
2792 function sess_cur_set($sess)
2794 static::$sess_cur = $sess;
2797 static function sess_cur_get()
2799 return(static::$sess_cur);
2801 } // end class Brisk
2803 function make_seed()
2805 list($usec, $sec) = explode(' ', microtime());
2806 return (float) $sec + ((float) $usec * 100000);
2809 function btrace_line($ar)
2811 GLOBAL $G_btrace_pref_sub;
2814 for ($i = 0 ; $i < count($ar) ; $i++) {
2815 $with_class = isset($ar[$i]['class']);
2816 $with_file = isset($ar[$i]['file']);
2817 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2818 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2819 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2820 ($with_file ? $ar[$i]['line'] : ""));
2826 function trace_ftok($id, $add)
2828 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2829 $tok=@ftok($id, $add);
2831 log_shme($tok.": ".$id." + ".$add);
2836 function log_mop($step, $log)
2840 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2843 $sess = Brisk::sess_cur_get();
2844 if (isset($sess) == FALSE)
2849 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2852 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2853 $btrace = btrace_line(debug_backtrace());
2856 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2857 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2862 function log_step($log)
2866 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2869 $sess = Brisk::sess_cur_get();
2870 if (isset($sess) == FALSE)
2875 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2878 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2879 $btrace = btrace_line(debug_backtrace());
2882 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2883 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2890 function log_cds($log)
2894 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2897 $sess = Brisk::sess_cur_get();
2898 if (isset($sess) == FALSE)
2903 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2906 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2907 $btrace = btrace_line(debug_backtrace());
2910 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2911 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2917 function log_only2($log)
2921 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2924 $sess = Brisk::sess_cur_get();
2925 if (isset($sess) == FALSE)
2930 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2933 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2934 $btrace = btrace_line(debug_backtrace());
2937 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2938 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2943 function log_crit($log)
2947 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2950 $sess = Brisk::sess_cur_get();
2951 if (isset($sess) == FALSE)
2956 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2959 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2960 $btrace = btrace_line(debug_backtrace());
2963 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2964 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2969 function log_only($log)
2973 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2976 $sess = Brisk::sess_cur_get();
2977 if (isset($sess) == FALSE)
2982 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
2985 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2986 $btrace = btrace_line(debug_backtrace());
2989 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2990 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2995 function log_main($log)
2999 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3002 $sess = Brisk::sess_cur_get();
3003 if (isset($sess) == FALSE)
3008 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3011 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3012 $btrace = btrace_line(debug_backtrace());
3015 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3016 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3021 function log_rd($log)
3025 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3028 $sess = Brisk::sess_cur_get();
3029 if (isset($sess) == FALSE)
3034 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3037 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3038 $btrace = btrace_line(debug_backtrace());
3041 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3042 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3047 function log_rd2($log)
3051 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3054 $sess = Brisk::sess_cur_get();
3055 if (isset($sess) == FALSE)
3060 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3063 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3064 $btrace = btrace_line(debug_backtrace());
3068 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3069 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3074 function log_send($log)
3078 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3081 $sess = Brisk::sess_cur_get();
3082 if (isset($sess) == FALSE)
3087 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3090 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3091 $btrace = btrace_line(debug_backtrace());
3094 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3095 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3100 function log_lock($log)
3104 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3107 $sess = Brisk::sess_cur_get();
3108 if (isset($sess) == FALSE)
3113 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3116 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3117 $btrace = btrace_line(debug_backtrace());
3120 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3121 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3126 function log_wr($log)
3130 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3133 $sess = Brisk::sess_cur_get();
3134 if (isset($sess) == FALSE)
3139 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3142 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3143 $btrace = btrace_line(debug_backtrace());
3146 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3147 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3152 function log_load($log)
3156 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3159 $sess = Brisk::sess_cur_get();
3160 if (isset($sess) == FALSE)
3165 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3168 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3169 $btrace = btrace_line(debug_backtrace());
3172 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3173 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3178 function log_auth($sess, $log)
3182 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3185 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3188 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3189 $btrace = btrace_line(debug_backtrace());
3192 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3193 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3198 function log_shme($log)
3202 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3205 $sess = Brisk::sess_cur_get();
3206 if (isset($sess) == FALSE)
3211 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3214 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3215 $btrace = btrace_line(debug_backtrace());
3218 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3219 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3226 // function log_legal($curtime, $sess, $name, $where, $mesg)
3227 function log_legal($curtime, $addr, $user, $where, $mesg)
3230 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3231 /* Unix time | session | nickname | IP | where was | mesg */
3232 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3233 ($user->is_auth() ? 'A' : 'N'),
3234 $user->name, $addr, $where , $mesg));
3239 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3244 if ($sitted < PLAYERS_N) {
3252 if ($table == $cur_table)
3259 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3264 function show_notify($text, $tout, $butt, $w, $h)
3266 log_main("SHOW_NOTIFY: ".$text);
3267 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3270 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3272 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3273 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);
3276 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3278 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3281 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3282 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3285 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3286 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);
3290 function root_welcome($user)
3292 GLOBAL $root_wellarr, $G_lang;
3296 $dt = date("H:i ", $curtime);
3298 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3299 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3306 function validate_sess($sess)
3308 if (strlen($sess) == SESS_LEN)
3314 function validate_name($name)
3316 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3318 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3320 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3327 function playsound($filename)
3329 return (sprintf('playsound("flasou", "%s");', $filename));
3332 function secstoword($secs)
3338 $mins = floor($secs / 60);
3340 if ($G_lang == 'en') {
3342 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3345 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3349 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3352 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3357 function sharedmem_sz($tok)
3359 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3360 log_main("shmop_open failed");
3363 $shm_sz = shmop_size($shm_id);
3364 shmop_close($shm_id);
3366 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3373 static function lock_data($is_exclusive)
3375 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3376 self::$delta_t = microtime(TRUE);
3377 log_lock("LOCK warrant [".self::$delta_t."]");
3385 static function unlock_data($res)
3389 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3398 static function lock_data($is_exclusive)
3400 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3401 self::$delta_t = microtime(TRUE);
3402 log_lock("LOCK poll [".self::$delta_t."]");
3410 static function unlock_data($res)
3414 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3420 function carousel_top()
3425 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));
3428 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>'));