5 * Copyright (C) 2006-2015 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)); */
350 return (ip2long($s));
355 return (long2ip($i));
358 function int2four($l)
360 if (PHP_INT_SIZE == 4)
363 return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
366 function four2int($s)
368 return ($s & 0xffffffff);
373 return int2four( ip2int($s) );
378 return int2ip( four2int($i) );
381 function nickserv_msg($dt, $msg) {
382 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
385 function passwd_gen($seed = NULL)
387 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
396 for ($sil = 0 ; $sil < 7 ; $sil++) {
397 if (($sil % 2) == 0) {
399 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
401 $old = mt_rand(0, $G_PG_vow_n-1);
402 $pw .= $G_PG_vow[$old];
405 $new = mt_rand(0, $G_PG_vow_n-1);
407 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
408 $pw .= $G_PG_vow[$new];
414 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
421 function cmd_return($val, $desc)
423 return array('val' => $val, 'desc' => $desc);
426 function cmd_serialize($attrs)
431 foreach ($attrs as $key => $value) {
432 $ret .= $sep . $key . '=' . urlencode($value);
438 function cmd_deserialize($cmd)
441 $a = explode('&', $cmd);
443 while ($i < count($a)) {
444 $b = split('=', $a[$i]);
445 $ret[urldecode($b[0])] = urldecode($b[1]);
456 function versions_cmp($v1, $v2)
458 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
462 $v1_ar = split('\.', $v1);
463 $v2_ar = split('\.', $v2);
465 $v2_ct = count($v2_ar);
467 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
468 if (($v2_ct - 1) < $i) {
471 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
472 if ($v1_ar[$i] != $v2_ar[$i]) {
473 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
482 // return string with IPV4 address
483 function addrtoipv4($addr)
485 $ipv4addr_arr = explode(':' , $addr);
486 if (isset($ipv4addr_arr[3])) {
487 $ipv4addr = $ipv4addr_arr[3];
497 for ($i = 0; $i < ob_get_level(); $i++)
499 ob_implicit_flush(1);
503 function force_no_cache(&$header_out)
505 $header_out['Pragma'] = 'no-cache, must-revalidate';
506 $header_out['Cache-Control'] = 'no-cache';
507 $header_out['Expires'] = '-1';
510 function file_lock($fname, $is_exclusive)
512 if (($res = @fopen($fname, "r+")) == FALSE) {
516 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
524 function file_unlock($res)
527 flock($res, LOCK_UN);
532 $escpush_from = array("\\", "\"");
533 $escpush_to = array("\\\\", "\\\"");
536 GLOBAL $escpush_from, $escpush_to;
538 return str_replace($escpush_from, $escpush_to, $s);
541 $escinp_from = array( "\"" );
542 $escinp_to = array( """ );
544 function escinput($s)
546 GLOBAL $escinp_from, $escinp_to;
548 return str_replace($escinp_from, $escinp_to, $s);
553 return htmlentities($s, ENT_COMPAT, "UTF-8");
556 function esclfhtml($s)
558 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
561 function langtolng($lang)
565 return ($G_lang == 'en' ? '-en' : '');
568 function csplitter($in, $sep)
574 for ($i = 0 ; $i < strlen($in) ; $i++) {
575 $ini = substr($in, $i, 1);
579 else if ($ini == $sep) {
598 $from = array ( '\\', '@', '|' );
599 $to = array ( '\\\\', '@', '¦' );
601 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
606 $from = array ( '\\', '|', "\t", "\n");
607 $to = array ( '\\\\', '\\|', "\\t", "\\n");
609 return (str_replace($from, $to, $s));
612 function xcapemesg($s)
614 $from = array ( "\n");
615 $to = array ( "\\n");
617 return (str_replace($from, $to, $s));
627 function getbyid($idx)
629 return ($this->el[$idx]);
632 function setbyid($idx, $v)
634 $this->el[$idx] = $v;
638 define('TABLE_AUTH_TY_PUBL', 0);
639 define('TABLE_AUTH_TY_AUTH', 1);
640 define('TABLE_AUTH_TY_CERT', 2);
648 var $auth_type; // required authorization to sit down
655 var $table_start; // information field
663 function create($idx)
665 if (($thiz = new Table()) == FALSE)
669 $thiz->player = array();
672 if ($idx < TABLES_CERT_N)
673 $thiz->auth_type = TABLE_AUTH_TY_CERT;
674 else if ($idx < TABLES_AUTH_N)
675 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
677 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
683 $thiz->table_token = "";
684 $thiz->table_start = 0;
686 $thiz->wakeup_time = 0;
693 $this->idx = $from->idx;
694 $this->player = array();
695 for ($i = 0 ; $i < $from->player_n ; $i++)
696 $this->player[$i] = $from->player[$i];
697 $this->player_n = $from->player_n;
699 log_main("PLAYER_N - parent::copy.".$this->player_n);
701 $this->auth_type = $from->auth_type;
703 $this->wag_own = $from->wag_own;
704 $this->wag_com = $from->wag_com;
705 $this->wag_tout = $from->wag_tout;
707 $this->table_token = $from->table_token;
708 $this->table_start = $from->table_start;
710 $this->wakeup_time = $from->wakeup_time;
713 function myclone($from)
715 if (($thiz = new Table()) == FALSE)
723 function spawn($from)
725 if (($thiz = new Table()) == FALSE)
728 $thiz->idx = $from->idx;
729 $thiz->player = array();
730 for ($i = 0 ; $i < $from->player_n ; $i++)
731 $thiz->player[$i] = $i;
732 $thiz->player_n = $from->player_n;
734 $thiz->auth_type = $from->auth_type;
736 $thiz->wag_own = $from->wag_own;
737 $thiz->wag_com = $from->wag_com;
738 $thiz->wag_tout = $from->wag_tout;
740 $thiz->table_token = $from->table_token;
741 $thiz->table_start = $from->table_start;
743 $thiz->wakeup_time = $from->wakeup_time;
748 function wag_set($user_idx, $mesg)
752 $this->wag_own = $user_idx;
753 $this->wag_com = $mesg;
757 function wag_reset($timeout)
759 log_main("WAG_RESET");
761 unset($this->wag_own);
764 $this->wag_tout = $timeout;
767 function player_get($idx)
769 return ($this->player[$idx]);
772 function player_set($idx, $player)
774 $this->player[$idx] = $player;
777 function user_add($idx)
779 $this->player[$this->player_n] = $idx;
782 return ($this->player_n - 1);
785 function user_rem($brisk, $user)
787 $tabpos = $user->table_pos;
789 /* verifico la consistenza dei dati */
790 if ($brisk->user[$this->player[$tabpos]] == $user) {
792 /* aggiorna l'array dei giocatori al tavolo. */
793 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
794 $this->player[$i] = $this->player[$i+1];
795 $user_cur = $brisk->user[$this->player[$i]];
796 $user_cur->table_pos = $i;
801 log_main("INCONSISTENCY ON TABLE.");
805 // Table->act_content - return 'id' of type of output required for table button
806 function act_content($user)
809 $isstanding = ($user->subst == 'standup');
810 $sitted = $this->player_n;
812 $cur_table = $user->table;
816 if ($sitted < PLAYERS_N) {
817 switch ($this->auth_type) {
818 case TABLE_AUTH_TY_CERT:
819 if ($user->is_cert() && !$user->is_appr())
824 case TABLE_AUTH_TY_AUTH:
825 if ($user->is_auth() && !$user->is_appr())
840 if ($table == $cur_table)
847 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
860 function Delay_Manager($triglevel)
862 $this->triglevel = $triglevel;
863 $this->delta = array();
864 $this->lastcheck = 0;
867 function delta_get($curtime)
869 // clean too old delta items
870 for ($i = 0 ; $i < count($this->delta) ; $i++) {
871 if ($this->delta[$i][0] < $curtime) {
872 array_splice($this->delta, $i, 1);
877 // add new delta items if delay exceeded $this->triglevel sec
878 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
879 $delta = $curtime - $this->lastcheck - $this->triglevel;
880 array_push($this->delta, array($curtime + $delta , $delta));
881 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
884 // extract the maximum valid delta
886 for ($i = 0 ; $i < count($this->delta) ; $i++) {
887 $delta_cur = $this->delta[$i][1];
888 if ($delta_max < $delta_cur)
889 $delta_max = $delta_cur;
892 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
897 function lastcheck_set($curtime)
899 $this->lastcheck = $curtime;
907 function Client_prefs()
911 static function from_user($user)
913 $thiz = new Client_prefs();
914 $thiz->user_load($user);
919 static function from_json($json)
921 $thiz = new Client_prefs();
922 if ($thiz->json_load($json) == FALSE) {
930 function user_load($user)
932 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
933 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
934 if ($user->rec != FALSE) {
935 $this->supp_comp = $user->rec->supp_comp_get();
938 $this->supp_comp = "000000000000";
941 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
944 function json_load($json_s)
949 if (gettype($json_s) == "string") {
950 if (($json = json_decode($json_s)) == FALSE)
956 if ($this->listen < 0 || $this->listen > 2)
958 $this->listen = $json->listen;
960 if (mb_strlen($json->supp_comp, "ASCII") != 12)
963 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
964 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
965 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
971 $this->supp_comp = $json->supp_comp;
978 function store($user, $is_save)
981 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
982 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
983 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
984 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
986 if ($user->is_supp_custom()) {
987 $user->rec->supp_comp_set($this->supp_comp);
990 $user->prefs_store();
994 define('GHOST_SESS_TOUT', 1800);
995 define('GHOST_SESS_REAS_LOUT', 1); // logout
996 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
997 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
998 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
999 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
1000 define('GHOST_SESS_REAS_PROX', 6); // proxy access
1008 function GhostSessEl($time, $sess, $reas)
1010 $this->time = $time + GHOST_SESS_TOUT;
1011 $this->sess = $sess;
1012 $this->reas = $reas;
1020 function GhostSess()
1022 $this->gs = array();
1025 // push or update for this session
1026 function push($time, $sess, $reas)
1028 foreach($this->gs as $el) {
1029 if ($el->sess == "$sess") {
1031 $el->time = $time + GHOST_SESS_TOUT;
1036 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1042 foreach($this->gs as $key => $el) {
1043 if ($el->sess == "$sess") {
1044 $ret = $this->gs[$key];
1045 unset($this->gs[$key]);
1052 function garbage_manager($curtime)
1054 foreach($this->gs as $key => $el) {
1055 if ($el->time < $curtime) {
1056 unset($this->gs[$key]);
1066 var $crystal_filename;
1070 var $comm; // commands for many people
1071 var $step; // current step of the comm array
1072 var $garbage_timeout;
1075 var $ban_list; // ban list (authized allowed)
1076 var $black_list; // black list (anti-dos, noone allowed)
1077 var $cloud_smasher; // list of cloud ip ranges to be rejected
1083 public static $sess_cur;
1091 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1092 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1093 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1094 fprintf(STDERR, "ROOM FROM FILE\n");
1095 rename($crystal_filename, $crystal_filename.".old");
1097 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1103 fprintf(STDERR, "NEW ROOM\n");
1104 $thiz = new Brisk();
1106 $thiz->crystal_filename = $crystal_filename;
1107 $thiz->user = array();
1108 $thiz->table = array();
1109 $thiz->match = array();
1111 $thiz->ban_list = IpClass::create();
1112 $thiz->black_list = IpClass::create();
1113 $thiz->cloud_smasher = IpClass::create();
1114 $thiz->ghost_sess = new GhostSess();
1116 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1117 $thiz->user[$i] = User::create($thiz, $i, "", "");
1120 for ($i = 0 ; $i < TABLES_N ; $i++) {
1121 $thiz->table[$i] = Table::create($i);
1123 $thiz->garbage_timeout = 0;
1124 $thiz->shm_sz = SHM_DIMS_MIN;
1126 $thiz->delay_mgr = new Delay_Manager(1.5);
1128 static::$sess_cur = FALSE;
1130 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1135 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1137 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1138 count($ban_list), count($black_list), count($cloud_smasher));
1140 if (defined('CURL_DE_SAC_VERS')) {
1141 if (brisk_cds_reload($this) == FALSE) {
1145 $this->ban_list->update($ban_list);
1146 $this->black_list->update($black_list);
1147 $this->cloud_smasher->update($cloud_smasher);
1150 $this->banned_kickoff();
1151 $this->garbage_manager(TRUE);
1155 function banned_kickoff()
1159 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1160 $table_cur = $this->table[$table_idx];
1161 // if the table is complete and exists we check users IP
1163 if ($table_cur->player_n == PLAYERS_N) {
1164 if (isset($this->match[$table_idx]) &&
1165 $table_cur->table_token == $bin5->table_token) {
1166 log_main("PLAYERS == N TABLE ".$table_idx);
1168 $bin5 = $this->match[$table_idx];
1170 $is_ban |= $bin5->banned_kickoff();
1175 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1176 $user_cur = $this->user[$i];
1178 if ($user_cur->is_active() == FALSE)
1181 // check if the IP is blacklisted
1182 if ($this->black_check($user_cur->ip) ||
1183 $this->cloud_check($user_cur->ip)) {
1184 $user_cur->lacc = 0;
1189 // if authorized not check if banlisted
1190 if ($user_cur->is_auth()) {
1194 if ($this->ban_check($user_cur->ip)) {
1195 $user_cur->lacc = 0;
1203 function ban_check($ip_str)
1205 return ($this->ban_list->check($ip_str));
1208 function black_check($ip_str)
1210 return ($this->black_list->check($ip_str));
1213 function cloud_check($ip_str)
1215 return ($this->cloud_smasher->check($ip_str));
1218 function users_cleanup()
1220 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1221 $user_cur = $this->user[$i];
1223 if ($user_cur->the_end) {
1224 $user_cur->reset(); // users_cleanup, OK
1229 function garbage_manager($force)
1231 GLOBAL $G_lang, $mlang_brisk, $G_base;
1235 log_rd2("garbage_manager START");
1237 /* Garbage collector degli utenti in timeout */
1238 $curtime = microtime(TRUE);
1240 $delta = $this->delay_mgr->delta_get($curtime);
1242 if (!$force && !($this->garbage_timeout < $curtime)) {
1243 $this->delay_mgr->lastcheck_set($curtime);
1247 // Before all align times with table timeout
1248 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1249 $table_cur = $this->table[$table_idx];
1250 // if the table is complete and exists its shared mem we get the info about users lacc
1252 if ($table_cur->player_n == PLAYERS_N) {
1253 log_main("PLAYERS == N TABLE ".$table_idx);
1256 $no_recovery = FALSE;
1257 if (isset($this->match[$table_idx])) {
1258 $bin5 = $this->match[$table_idx];
1260 if ($table_cur->table_token != $bin5->table_token) {
1261 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1262 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1263 $no_recovery = TRUE;
1267 if ($bin5 != FALSE) {
1271 log_main("garbage_manager: bri loaded successfully.");
1272 $bin5->garbage_manager(TRUE);
1274 $bin5_table = $bin5->table[0];
1276 // is the end of the table
1278 if ($bin5->the_end == TRUE) {
1280 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1282 log_main("garbage_manager: INSIDE THE END.");
1284 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1285 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1286 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1289 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1290 // stat must be "table" by definition
1291 $user_cur = $this->user[$table_cur->player[$i]];
1292 $bin5_user = $bin5->user[$i];
1294 $user_cur->subst = $bin5_user->subst;
1295 $user_cur->rd_step = $bin5_user->rd_step;
1296 $user_cur->step = $bin5_user->step;
1297 $user_cur->lacc = $bin5_user->lacc;
1298 $user_cur->laccwr = $bin5_user->lacc;
1299 $user_cur->bantime = $bin5_user->bantime;
1300 $user_cur->the_end = $bin5_user->the_end;
1301 if ($user_cur->the_end) {
1302 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1306 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1308 $this->room_join_wakeup($user_cur, FALSE, 0);
1309 $table_cur->table_token = "";
1310 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1312 $this->match_del($table_idx);
1315 log_main("gm:: save_data");
1317 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1318 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1321 } // if ($bin5 == FALSE
1322 else if ($no_recovery == FALSE) {
1323 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1325 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1326 $user_cur = $this->user[$table_cur->player[$i]];
1327 $user_cur->subst = "shutdowner";
1328 $user_cur->step_inc();
1330 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1331 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1332 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1333 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1334 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1335 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1336 $user_cur->step_inc();
1339 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1340 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1341 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1343 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1345 $this->room_join_wakeup($user_cur, TRUE, -2);
1346 $table_cur->table_token = "";
1349 } // if ($table_cur->player_n == PLAYERS_N) {
1350 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1352 log_rd2("out new loop.");
1354 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1355 $user_cur = $this->user[$i];
1357 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1359 if ($user_cur->is_active() == FALSE)
1362 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1363 // Auto logout dell'utente
1364 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1366 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1367 $user_cur->the_end = TRUE;
1369 log_rd2("AUTO LOGOUT.");
1370 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1371 log_auth($user_cur->sess, "Autologout session.");
1373 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1374 $this->room_wakeup($user_cur);
1375 else if ($user_cur->subst == 'standup')
1376 $this->room_outstandup($user_cur);
1378 log_rd2("LOGOUT FROM WHAT ???");
1382 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1383 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1384 $this->room_wakeup($user_cur);
1385 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1386 /* 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" */
1387 $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);
1388 $user_cur->step_inc();
1392 log_rd2("GARBAGE UPDATED!");
1394 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1397 $this->ghost_sess->garbage_manager($curtime);
1399 $this->delay_mgr->lastcheck_set($curtime);
1403 function show_room($user_step, $user)
1405 GLOBAL $G_lang, $mlang_brisk;
1406 log_main("show_room: username: ".$user->name);
1408 $ret = sprintf('gst.st = %d; ', $user_step);
1410 $prefs = Client_prefs::from_user($user);
1411 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1414 if ($user->flags & USER_FLAG_ISOLAUTH) {
1415 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1417 else if ($user->flags & USER_FLAG_LISTAUTH) {
1418 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1421 $ret .= 'list_set(\'all\', false, \'\' ); ';
1425 if ($user->subst == 'standup')
1426 $ret .= "tra.show(); ";
1428 $ret .= "tra.hide(); ";
1430 $ret .= sprintf('stat = "%s";', $user->stat);
1432 $ret .= root_welcome($user);
1433 if ($user->flags & USER_FLAG_DBFAILED) {
1434 $ret .= "gst.st = ".($user->step+1)."; ";
1435 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1438 $ret .= sprintf('subst = "%s";', $user->subst);
1439 $ret .= $user->myname_innerHTML();
1441 for ($i = 0 ; $i < TABLES_N ; $i++) {
1443 $ret .= $this->table_content($user, $i);
1445 $ret .= $this->table[$i]->act_content($user);
1446 if ($this->table[$i]->wag_own != -1)
1447 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1449 $ret .= sprintf('tra.rem(%d); ', $i);
1451 $ret .= $this->standup_content($user);
1452 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1458 function room_wakeup($user)
1460 $table_idx = $user->table;
1461 $table = $this->table[$table_idx];
1463 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1467 $from_table = ($user->stat == "table");
1469 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1471 for ($i = 0 ; $i < $table->player_n ; $i++) {
1472 $user_cur = $this->user[$table->player[$i]];
1473 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1475 if ($user->idx_get() != $table->player[$i]) {
1476 $user_cur->stat_set("room");
1477 $user_cur->subst = "sitdown";
1478 $user_cur->laccwr = $curtime;
1480 else if ($user->is_active()) {
1481 $user_cur->stat_set("room");
1482 $user_cur->subst = "standup";
1483 $user_cur->laccwr = $curtime;
1484 $user_cur->table = -1;
1489 $user->stat_set("room");
1490 $user->subst = "standup";
1491 $user->laccwr = $curtime;
1494 $remove_wagon = FALSE;
1495 if($table->wag_own == $user->idx_get()) {
1496 $table->wag_reset($curtime);
1497 $remove_wagon = TRUE;
1501 /* aggiorna l'array dei giocatori al tavolo. */
1502 $table->user_rem($this, $user);
1504 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1505 $user_cur = $this->user[$i];
1506 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1509 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1511 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1512 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1513 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1514 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1515 log_main("DOCUMENT.index.php: from table");
1517 else if ($user_cur->stat == "room") {
1518 log_main("DOCUMENT.index.php: from table");
1520 $ret .= $this->table_content($user_cur, $table_idx);
1521 $ret .= $this->standup_content($user_cur);
1523 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1524 $ret .= $table->act_content($user);
1526 if ($user->idx_get() == $i) {
1527 // set the new status
1528 $ret .= 'subst = "standup"; tra.show(); ';
1529 // clean the action buttons in other tables
1530 for ($e = 0 ; $e < TABLES_N ; $e++) {
1531 if ($this->table[$e]->player_n < PLAYERS_N) {
1532 $ret .= $this->table[$e]->act_content($user);
1537 $ret .= $table->act_content($user_cur);
1540 log_wr("ROOM_WAKEUP: ".$ret);
1541 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1542 $user_cur->step_inc();
1546 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1548 $table_idx = $user->table;
1549 $table = $this->table[$table_idx];
1551 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1554 $user_wup = array();
1556 $user_tab = array();
1558 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1560 for ($i = 0 ; $i < $table->player_n ; $i++) {
1561 $user_cur = $this->user[$table->player[$i]];
1562 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1563 if ($user_cur->is_empty()) {
1566 if ($update_lacc == TRUE) {
1567 $user_cur->laccwr = $curtime;
1569 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1570 if ($user_cur->subst == "shutdowned") {
1571 $user_cur->stat_set("room");
1572 $user_cur->subst = "sitdown";
1574 else if ($user_cur->subst == "shutdowner") {
1575 $user_cur->stat_set("room");
1576 $user_cur->subst = "standup";
1577 $user_cur->table = -1;
1578 $user_wup[$user_wup_n++] = $user_cur;
1580 $remove_wagon = FALSE;
1581 if($table->wag_own == $table->player[$i]) {
1582 $remove_wagon = TRUE;
1583 $table->wag_reset($curtime);
1586 $user_tab[$user_tab_n++] = $table->player[$i];
1589 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1590 $table->user_rem($this, $user_wup[$wup_idx]);
1592 /* aggiorna l'array dei giocatori al tavolo. */
1594 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1595 log_main("START LOOP");
1596 $user_cur = $this->user[$i];
1597 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1598 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1603 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1605 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1606 if ($user_cur->stat == "room") {
1607 log_main("DOCUMENT.index.php from table");
1609 $ret .= $this->table_content($user_cur, $table_idx);
1610 $ret .= $this->standup_content($user_cur);
1612 $ret .= $table->act_content($user_cur);
1615 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1616 if ($user_tab[$tab_idx] == $i)
1619 // for users that wakeup the room will be reconstructed by index_rd.php
1620 if ($tab_idx < $user_tab_n) {
1621 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1623 // ARRAY_POP DISABLED
1624 // if ($trans_delta == 0)
1625 // while (array_pop($user_cur->comm) != NULL);
1627 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1628 $user_cur->comm[$user_cur->step % COMM_N] = "";
1629 $user_cur->step_inc();
1630 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1631 $user_cur->step_inc();
1632 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1636 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1638 log_main("JOIN_WAKEUP more");
1640 $ret .= $table->act_content($user_cur);
1642 log_main("JOIN_WAKEUP end more");
1644 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1645 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1646 $user_cur->step_inc();
1650 function guarantee_show($user, $user_login, $dt)
1652 GLOBAL $G_lang, $mlang_brisk, $G_base;
1658 if ($user_login == "") {
1662 if (($bdb = BriskDB::create()) == FALSE) {
1666 if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) {
1670 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1671 $guar_login = $guar_item->login_get();
1676 $user_tos_vers = $user_item->tos_vers_get();
1678 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1679 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)));
1681 else if ($guar_login == "") {
1682 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
1684 else if ($guar_login == $user_login) {
1685 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
1688 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
1689 xcape($user_login), xcape($guar_login)));
1694 $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
1697 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
1703 function room_outstandup($user)
1705 $this->room_sitdown($user, -1);
1708 function table_update($user)
1710 log_main("table_update: pre - USER: ".$user->name);
1712 $table_idx = $user->table;
1714 if ($table_idx > -1)
1715 $table = $this->table[$table_idx];
1717 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1719 $user_cur = $this->user[$i];
1720 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1723 $ret = "gst.st = ".($user_cur->step+1)."; ";
1724 if ($table_idx > -1)
1725 $ret .= $this->table_content($user_cur, $table_idx);
1727 if ($user->idx_get() == $i) {
1728 $ret .= $user->myname_innerHTML();
1730 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1731 $user_cur->step_inc();
1734 log_main("table_update: post");
1737 function room_sitdown($user, $table_idx)
1739 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1743 if ($table_idx > -1 && $table_idx < TABLES_N) {
1744 $table = $this->table[$table_idx];
1747 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1748 for ($i = 0 ; $i < TABLES_N ; $i++) {
1749 if ($table->wag_own == $table->player[$i]) {
1750 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1751 $table->wag_reset(time());
1758 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1760 $user_cur = $this->user[$i];
1761 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1764 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1765 if ($table_idx > -1)
1766 $ret .= $this->table_content($user_cur, $table_idx);
1767 $ret .= $this->standup_content($user_cur);
1769 if ($user->idx_get() == $i) {
1770 $ret .= 'subst = "sitdown"; tra.hide(); ';
1771 // clean the action buttons in other tables
1772 for ($e = 0 ; $e < TABLES_N ; $e++) {
1773 $ret .= $this->table[$e]->act_content($user_cur);
1776 else if ($table_idx > -1) {
1777 if ($table->player_n == PLAYERS_N) {
1779 $ret .= $table->act_content($user_cur);
1782 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1783 $user_cur->step_inc();
1787 function kickuser($user, $out_reas)
1791 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1793 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1795 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1796 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1797 $bin5 = &$this->match[$user->table];
1798 $user_bin5 = &$bin5->user[$user->table_pos];
1799 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1800 $bin5->table_wakeup($user_bin5);
1801 $user->the_end = TRUE;
1802 $this->room_wakeup($user);
1806 if ($user->stat == 'table' || $user->stat == 'room') {
1807 $user->the_end = TRUE;
1808 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1809 $this->room_wakeup($user);
1811 else if ($user->subst == 'standup') {
1812 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1813 $this->room_outstandup($user);
1816 log_rd2("LOGOUT FROM WHAT ???");
1821 function kickuser_by_name($name, $out_reas)
1823 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1824 $user_out = $this->user[$i];
1825 if (strcmp($user_out->name, $name) == 0) {
1826 return ($this->kickuser($user_out, $out_reas));
1832 function kickuser_by_sess($sess, $out_reas)
1834 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1835 $user_out = $this->user[$i];
1836 if (strcmp($user_out->sess, $sess) == 0) {
1837 return ($this->kickuser($user_out, $out_reas));
1843 function kickuser_by_idx($idx, $out_reas)
1845 $user_out = $this->user[$idx];
1846 return ($this->kickuser($user_out, $out_reas));
1849 function chatt_send($user, $mesg)
1851 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1855 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1857 $dt = date("H:i ", $curtime);
1868 $is_normchat = FALSE;
1869 /* for old isolation management $is_ticker = FALSE; */
1870 $update_room = FALSE;
1872 if (strcmp($msg, "/tav") == 0 ||
1873 strncmp($msg, "/tav ", 5) == 0) {
1875 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1876 /* 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>" */
1877 $msg = $mlang_brisk['tickmust'][$G_lang];
1878 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1883 $table = $this->table[$user->table];
1885 if ($table->wag_own != -1) {
1886 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1887 $msg = $mlang_brisk['tickjust'][$G_lang];
1888 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1893 $dtime = $curtime - $table->wag_tout;
1894 if ($dtime < EXPIRE_TIME_WAG) {
1895 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1896 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1897 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1898 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1903 $msg = substr($msg, 5);
1905 $table->wag_set($user->idx_get(), $msg);
1906 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1907 $to_room = $to_user;
1908 /* for old isolation management $is_ticker = TRUE; */
1910 } // /tav chat command
1911 // just for development use currently
1912 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1913 fprintf(STDERR, "MOP OUT\n");
1914 $target = substr($msg, 5);
1915 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1917 else if (strncmp($msg, "/alarm ", 7) == 0) {
1918 if (strncmp($msg, "/alarm to ", 10) == 0) {
1919 $sp_pos = strpos($msg, " ", 10);
1920 $target = substr($msg, 10, $sp_pos - 10);
1921 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
1925 $alarm_check = "/alarm ".$G_alarm_passwd." ";
1928 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
1929 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
1930 $msg = $mlang_brisk['alarpass'][$G_lang];
1931 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
1936 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
1937 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
1938 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
1939 $to_user = nickserv_msg($dt, $prestr);
1941 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
1942 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
1943 /* MLANG: "chiudi" */
1944 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
1946 } // /alarm chat command
1947 else if (strncmp($msg, "/listen ", 8) == 0) {
1948 $arg = substr($msg, 8);
1950 if (strcasecmp($arg, "isolation") == 0) {
1952 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
1953 $user->table >= TABLES_AUTH_N) {
1954 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
1958 $user->flags &= ~USER_FLAG_MAP_AUTH;
1959 $user->flags |= USER_FLAG_ISOLAUTH;
1960 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
1963 else if (strcasecmp($arg, "auth") == 0) {
1964 $flags_old = $user->flags;
1965 $user->flags &= ~USER_FLAG_MAP_AUTH;
1966 $user->flags |= USER_FLAG_LISTAUTH;
1967 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
1970 $flags_old = $user->flags;
1971 $user->flags &= ~USER_FLAG_MAP_AUTH;
1972 $to_user = 'list_set(\'all\', true, \'\'); ';
1975 // if from isolation redraw standup area
1976 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
1977 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
1981 else if (strcmp($msg, "/authreq") == 0) {
1982 if ($user->is_cert()) {
1983 $to_user = sprintf('authbox(300,200);');
1986 /* 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." */
1987 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
1990 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
1991 if ($user->is_auth()) {
1992 $to_user = sprintf('mesgtoadmbox(500,300);');
1995 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
1996 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
1999 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
2000 log_main("chatt_send BEGIN");
2003 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2004 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2008 $msg = "COMMAND ".$msg;
2009 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2010 $user_cur = $this->user[$i];
2012 if ($user_cur->is_active() == FALSE)
2014 if (strcasecmp($user_cur->name,$name_new) == 0)
2017 if ($i < MAX_PLAYERS) {
2018 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2019 $to_user = nickserv_msg($dt, $prestr);
2023 /* 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>" */
2024 if ($user->is_auth()) {
2025 if (strcasecmp($user->name,$name_new) != 0) {
2026 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2027 ($user->subst == 'standup' ||
2028 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2031 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2032 for ($i = 0 ; $i < TABLES_N ; $i++) {
2033 $to_user .= $this->table[$i]->act_content($user);
2037 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2042 $user->name = $name_new; // OK - nick changed
2043 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2044 if ( ! $user->is_auth() ) {
2045 if (($bdb = BriskDB::create()) != FALSE) {
2047 /* 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>" */
2048 if ($bdb->login_exists($name_new)) {
2049 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2050 $to_user .= nickserv_msg($dt, $prestr);
2055 log_main("chatt_send start set");
2057 $update_room = TRUE;
2059 } // nick chat command
2060 else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
2061 $guar_user = substr($msg, 6);
2063 $this->guarantee_show($user, $guar_user, $dt);
2065 else if (strncmp($msg, "/st ", 4) == 0) {
2066 log_main("chatt_send BEGIN");
2069 $st_str = substr($msg, 4);
2071 if (strcasecmp($st_str, "normale") == 0) {
2072 $st = USER_FLAG_S_NORM;
2074 else if (strcasecmp($st_str, "pausa") == 0) {
2075 $st = USER_FLAG_S_PAU;
2077 else if (strcasecmp($st_str, "fuori") == 0) {
2078 $st = USER_FLAG_S_OUT;
2080 else if (strcasecmp($st_str, "cane") == 0) {
2081 $st = USER_FLAG_S_DOG;
2083 else if (strcasecmp($st_str, "cibo") == 0) {
2084 $st = USER_FLAG_S_EAT;
2086 else if (strcasecmp($st_str, "lavoro") == 0) {
2087 $st = USER_FLAG_S_WRK;
2089 else if (strcasecmp($st_str, "sigaretta") == 0) {
2090 $st = USER_FLAG_S_SMK;
2092 else if (strcasecmp($st_str, "presente") == 0) {
2093 $st = USER_FLAG_S_EYE;
2095 else if (strcasecmp($st_str, "coniglio") == 0) {
2096 $st = USER_FLAG_S_RABB;
2098 else if (strcasecmp($st_str, "calcio") == 0) {
2099 $st = USER_FLAG_S_SOCC;
2101 else if (strcasecmp($st_str, "pupo") == 0) {
2102 $st = USER_FLAG_S_BABY;
2104 else if (strcasecmp($st_str, "pulizie") == 0) {
2105 $st = USER_FLAG_S_MOP;
2107 else if (strcasecmp($st_str, "babbo") == 0) {
2108 $st = USER_FLAG_S_BABBO;
2110 else if (strcasecmp($st_str, "renna") == 0) {
2111 $st = USER_FLAG_S_RENNA;
2113 else if (strcasecmp($st_str, "pupazzo") == 0) {
2114 $st = USER_FLAG_S_PUPAZ;
2116 else if (strcasecmp($st_str, "vischio") == 0) {
2117 $st = USER_FLAG_S_VISCH;
2120 /* MLANG: "Questo stato non esiste." */
2121 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2125 log_main("chatt_send start set");
2126 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2127 $update_room = TRUE;
2128 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2131 } // nick chat command
2133 else { // normal chat line
2134 $is_normchat = TRUE;
2135 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2137 $user->chat_dlt = $user->chat_dlt * 2;
2138 if ($user->chat_dlt > 120)
2139 $user->chat_dlt = 120;
2141 else if ($user->chat_lst == $msg)
2143 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2144 $user->chat_ban = $curtime;
2145 $user->chat_dlt = 5;
2149 $user->chat_ban = 0;
2150 $user->chat_dlt = 0;
2154 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2157 if ( TRUE && (! $user->is_auth()) ) {
2158 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2159 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2161 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2162 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2163 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2165 $auguri = sprintf("%s auguri %s %s.",
2166 $aug_head[mt_rand(0, count($aug_head)-1)],
2167 $aug_body[mt_rand(0, count($aug_body)-1)],
2168 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2170 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2175 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2176 // temporary silentiation for troll (will became array check)
2177 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2178 $to_room = $to_user;
2182 log_legal($curtime, $user->ip, $user,
2183 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2185 $user->chat_lst = "$msg";
2186 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2196 // Output to clients
2199 if ($to_user != FALSE) {
2200 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2201 $user->comm[$user->step % COMM_N] .= $to_user;
2205 if ($to_room != FALSE) {
2206 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2207 $user_cur = $this->user[$i];
2208 if ($target != "" && $user_cur->name != $target)
2210 if ($user_cur->is_active() == FALSE // is not active user
2211 || $user_cur->stat == 'table' // or stat is 'table'
2212 || $user->idx_get() == $i) // or the $user idx is equal to current var
2215 if ($is_normchat == TRUE) {
2216 // use MAP_AUTH to check if auth or isolation
2217 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2218 if ( ! $user->is_auth() ) {
2224 else if ($is_ticker) {
2225 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2226 if ($user->table >= TABLES_AUTH_N)
2231 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2232 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2233 $user_cur->step_inc();
2238 // FIXME BRISK4: include for each kind of table
2239 require_once("${G_base}briskin5/Obj/briskin5.phh");
2240 // Before all align times with table timeout
2241 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2242 if (isset($this->match[$table_idx])) {
2243 $bin5 = $this->match[$table_idx];
2245 $bin5_table = $bin5->table[0];
2246 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2247 // stat must be "table" by definition
2248 $bin5_user = $bin5->user[$i];
2250 if ($target != "" && $bin5_user->name != $target)
2252 log_main("writa: ".$user_mesg);
2253 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2254 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2255 $bin5_user->step_inc();
2257 } // if (isset($this->match
2258 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2259 } // if ($to_tabl == true ...
2262 if ($user->stat == 'room' && $user->subst == 'standup') {
2263 $this->standup_update($user);
2265 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2266 log_main("chatt_send pre table update");
2267 $this->table_update($user);
2268 log_main("chatt_send post table update");
2270 } // if ($update_room ...
2273 } // function chatt_send( ...
2275 function get_user($sess, &$idx)
2279 if (validate_sess($sess)) {
2280 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2281 if ($this->user[$i]->is_empty())
2283 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2286 $ret = $this->user[$i];
2290 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2291 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2292 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2295 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2302 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2305 * if ($idx > -1 && ret == FALSE) => duplicated nick
2306 * if ($idx == -2 && ret == FALSE) => invalid name
2307 * if ($idx == -3 && ret == FALSE) => wrong password
2308 * if ($idx == -1 && ret == FALSE) => no space left
2309 * if ($idx == 0 && ret == user) => SUCCESS
2310 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2313 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2319 $authenticate = FALSE;
2321 $login_exists = FALSE;
2323 $ghost_auth = FALSE;
2328 if (($name_new = validate_name($name)) == FALSE) {
2333 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2334 if (validate_sess($sess) == FALSE)
2337 /* if pass != FALSE verify the login with pass */
2338 log_auth("XXX", "auth1");
2340 if (($bdb = BriskDB::create()) != FALSE) {
2342 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2343 log_auth("XXX", "auth2");
2344 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2345 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2347 if ($authenticate != FALSE) {
2348 $user_type = $authenticate->type_get();
2356 $login_exists = $bdb->login_exists($name_new);
2360 // if db is down, send a warning and verify only current users
2361 // no actions at this moment
2363 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2365 if ($this->user[$i]->is_empty()) {
2366 if ($idfree == -1) {
2371 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2376 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2377 if ($authenticate != FALSE) {
2379 $ghost_auth = $this->user[$i]->is_auth();
2390 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2392 /* there is another user logged with your account and you and him have authenticated => new user
2393 get the session of the old user */
2394 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2397 $ghost_user = $this->user[$ghost];
2399 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2400 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2401 $ghost_user->step_inc();
2404 $ghost_user->sess = $sess;
2407 $ghost_user->sess = $sess;
2410 // If user at the table we need to update the table data too
2411 $table_idx = $ghost_user->table;
2412 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2413 require_once("${G_base}briskin5/Obj/briskin5.phh");
2414 if (isset($this->match[$table_idx])) {
2415 $bin5 = $this->match[$table_idx];
2417 if ($bin5->the_end != TRUE) {
2418 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2419 $bin5->user[$ghost_user->table_pos]->step_inc();
2420 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2426 if (defined('CURL_DE_SAC_VERS')) {
2427 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2429 return ($this->user[$ghost]);
2431 else if ($idx != -1 && $i == MAX_PLAYERS) {
2436 $this->user[$idx]->sess = $sess;
2439 $this->user[$idx]->sess = $sess;
2441 $this->user[$idx]->name = $name_new; // OK - add new user
2442 $this->user[$idx]->stat_set("room");
2443 $this->user[$idx]->step_set(0);
2444 while (array_pop($this->user[$idx]->comm) != NULL);
2445 $this->user[$idx]->subst = "standup";
2446 $this->user[$idx]->lacc = $curtime;
2447 $this->user[$idx]->laccwr = $curtime;
2448 $this->user[$idx]->bantime = 0;
2449 $this->user[$idx]->ip = $ip;
2451 $this->user[$idx]->rec = $authenticate;
2452 $this->user[$idx]->flags = $user_type;
2453 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2454 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2455 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2457 if ($authenticate != FALSE) {
2458 $this->user[$idx]->code = $authenticate->code_get();
2460 // all this part is included in the db server
2461 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2463 if (isset($cookie['CO_list'])) {
2464 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2465 if (strcmp($cookie['CO_list'], "auth") == 0) {
2466 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2467 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2469 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2470 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2471 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2474 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2479 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2482 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2484 log_main("ghost: rename!");
2485 $ghost_user = $this->user[$ghost];
2487 if ($ghost_auth == FALSE) {
2488 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2489 $ghostname = 'ghost'.$sfx;
2490 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2491 if (strcmp("", $this->user[$i]->sess) == 0)
2494 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2499 if ($ghostname != '')
2503 $ghost_user->name = $ghostname;
2505 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2506 $this->standup_update($ghost_user);
2509 log_main("chatt_send pre table update");
2510 $this->table_update($ghost_user);
2511 log_main("chatt_send post table update");
2513 } // if ($ghost_auth == FALSE
2515 // FIXME: cacciare il vecchio utente room && table (if needed)
2516 $ghost_user->the_end = TRUE;
2517 $ghost_user->lacc = 0;
2518 $this->garbage_manager(TRUE);
2520 } // if ($ghost > -1) {
2525 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));
2527 $ret = $this->user[$real_idx];
2528 if (defined('CURL_DE_SAC_VERS')) {
2529 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2537 function standup_update($user)
2539 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2540 $user_cur = $this->user[$i];
2541 if ($user_cur->is_active() == FALSE)
2544 log_main("STANDUP START: ".$user_cur->stat);
2546 if ($user_cur->stat == 'room') {
2547 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2548 if ($user->idx_get() == $i) {
2549 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2551 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2553 $user_cur->step_inc();
2558 function dump_data()
2560 $brisk_ser = serialize($this);
2561 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2562 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2569 function standup_content($user)
2573 if ($user->stat != 'room')
2576 $content = ' j_stand_cont( [ ';
2578 $user_cur_id = $user->idx_get();
2579 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2580 if ($this->user[$i]->is_active() == FALSE // is not active user
2581 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2582 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2585 $flags = $this->user[$i]->flags;
2587 // sql record exists AND last donate > 2013-01-01
2588 if ($this->user[$i]->is_supp_custom()) {
2589 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2595 if ($this->user[$i]->subst == "standup") {
2596 if ($user_cur_id == $i) {
2600 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2601 xcape($this->user[$i]->name), $supp_comp_s);
2610 function table_content($user, $table_idx)
2616 // Si possono usare i dati nella classe table
2619 $sess = $user->sess;
2620 $table = $this->table[$table_idx];
2622 if ($user->stat != 'room')
2625 $user_cur_id = $user->idx_get();
2627 for ($i = 0 ; $i < $table->player_n ; $i++) {
2628 $user_cur = $this->user[$table->player[$i]];
2630 $flags = $user_cur->flags;
2632 if ($user_cur_id == $table->player[$i])
2635 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2636 if ($user_cur->is_supp_custom())
2637 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2641 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2642 xcape($user_cur->name), $supp_comp_s);
2647 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2652 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2654 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2656 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2658 fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2659 if ($this->black_check($addr)) {
2660 // TODO: waiting async 5 sec before close
2661 fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2664 if ($path != "" && $path != "index.php") {
2665 if ($this->cloud_check($addr)) {
2666 // TODO: waiting async 5 sec before close
2671 $enc = get_encoding($header);
2672 if (isset($header['User-Agent'])) {
2673 if (strstr($header['User-Agent'], "MSIE")) {
2674 $transp_type = "htmlfile";
2677 $transp_type = "xhr";
2681 $transp_type = "iframe";
2683 force_no_cache($header_out);
2689 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2690 $content = ob_get_contents();
2693 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2694 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2698 case "index_wr.php":
2700 // Enhance required: in the POST case, after the header you must get content
2701 // from the socket, waiting if necessary
2705 index_wr_main($this, $addr, $get, $post, $cookie);
2706 $content = ob_get_contents();
2709 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2713 case "index_rd.php":
2714 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2716 if ($transp == 'websocket')
2720 if (!isset($cookie['sess'])
2721 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2723 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2725 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2730 $this->sess_cur_set($user->sess);
2731 // close a previous opened index_read_ifra socket, if exists
2732 if (($prev = $user->rd_socket_get()) != NULL) {
2733 $s_a_p->socks_unset($user->rd_socket_get());
2734 fclose($user->rd_socket_get());
2735 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2736 $user->rd_socket_set(NULL);
2740 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2741 $response = headers_render($header_out, -1).$user->chunked_content($content);
2742 $response_l = mb_strlen($response, "ASCII");
2744 $wret = @fwrite($new_socket, $response, $response_l);
2745 if ($wret < $response_l) {
2746 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2747 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2750 $user->rd_cache_set("");
2752 fflush($new_socket);
2755 $s_a_p->socks_set($new_socket, $user, NULL);
2756 $user->rd_socket_set($new_socket);
2757 printf(" - qui ci siamo - ");
2764 if (!(BRISK_DEBUG & DBG_ENGI))
2766 fprintf(STDERR, "TEST.PHP running\n");
2767 if (isset($post['data'])) {
2768 $content = $post['data'];
2771 $content = "NO DATA AVAILABLE";
2773 $header_out['Content-Type'] = 'text/plain';
2774 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2778 /* FAR TODO: move all into an array of registered sub-apps */
2779 $subs = "briskin5/";
2780 $subs_l = strlen($subs);
2781 if (!strncmp($path, $subs, $subs_l)) {
2782 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2791 function match_add($idx, $match)
2793 $this->match[$idx] = $match;
2796 function match_del($idx)
2798 unset($this->match[$idx]);
2801 function match_get($idx, $token)
2803 if (isset($this->match[$idx])) {
2805 || $token == $this->match[$idx]->table_token) {
2806 return ($this->match[$idx]);
2811 function sess_cur_set($sess)
2813 static::$sess_cur = $sess;
2816 static function sess_cur_get()
2818 return(static::$sess_cur);
2820 } // end class Brisk
2822 function make_seed()
2824 list($usec, $sec) = explode(' ', microtime());
2825 return (float) $sec + ((float) $usec * 100000);
2828 function btrace_line($ar)
2830 GLOBAL $G_btrace_pref_sub;
2833 for ($i = 0 ; $i < count($ar) ; $i++) {
2834 $with_class = isset($ar[$i]['class']);
2835 $with_file = isset($ar[$i]['file']);
2836 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2837 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2838 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2839 ($with_file ? $ar[$i]['line'] : ""));
2845 function trace_ftok($id, $add)
2847 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2848 $tok=@ftok($id, $add);
2850 log_shme($tok.": ".$id." + ".$add);
2855 function log_mop($step, $log)
2859 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2862 $sess = Brisk::sess_cur_get();
2863 if (isset($sess) == FALSE)
2868 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2871 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2872 $btrace = btrace_line(debug_backtrace());
2875 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2876 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2881 function log_step($log)
2885 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2888 $sess = Brisk::sess_cur_get();
2889 if (isset($sess) == FALSE)
2894 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2897 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2898 $btrace = btrace_line(debug_backtrace());
2901 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2902 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2909 function log_cds($log)
2913 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2916 $sess = Brisk::sess_cur_get();
2917 if (isset($sess) == FALSE)
2922 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
2925 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2926 $btrace = btrace_line(debug_backtrace());
2929 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
2930 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2936 function log_only2($log)
2940 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
2943 $sess = Brisk::sess_cur_get();
2944 if (isset($sess) == FALSE)
2949 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
2952 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2953 $btrace = btrace_line(debug_backtrace());
2956 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2957 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2962 function log_crit($log)
2966 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
2969 $sess = Brisk::sess_cur_get();
2970 if (isset($sess) == FALSE)
2975 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
2978 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2979 $btrace = btrace_line(debug_backtrace());
2982 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2983 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
2988 function log_only($log)
2992 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
2995 $sess = Brisk::sess_cur_get();
2996 if (isset($sess) == FALSE)
3001 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3004 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3005 $btrace = btrace_line(debug_backtrace());
3008 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3009 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3014 function log_main($log)
3018 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3021 $sess = Brisk::sess_cur_get();
3022 if (isset($sess) == FALSE)
3027 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3030 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3031 $btrace = btrace_line(debug_backtrace());
3034 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3035 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3040 function log_rd($log)
3044 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3047 $sess = Brisk::sess_cur_get();
3048 if (isset($sess) == FALSE)
3053 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3056 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3057 $btrace = btrace_line(debug_backtrace());
3060 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3061 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3066 function log_rd2($log)
3070 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3073 $sess = Brisk::sess_cur_get();
3074 if (isset($sess) == FALSE)
3079 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3082 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3083 $btrace = btrace_line(debug_backtrace());
3087 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3088 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3093 function log_send($log)
3097 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3100 $sess = Brisk::sess_cur_get();
3101 if (isset($sess) == FALSE)
3106 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3109 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3110 $btrace = btrace_line(debug_backtrace());
3113 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3114 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3119 function log_lock($log)
3123 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3126 $sess = Brisk::sess_cur_get();
3127 if (isset($sess) == FALSE)
3132 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3135 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3136 $btrace = btrace_line(debug_backtrace());
3139 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3140 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3145 function log_wr($log)
3149 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3152 $sess = Brisk::sess_cur_get();
3153 if (isset($sess) == FALSE)
3158 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3161 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3162 $btrace = btrace_line(debug_backtrace());
3165 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3166 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3171 function log_load($log)
3175 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3178 $sess = Brisk::sess_cur_get();
3179 if (isset($sess) == FALSE)
3184 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3187 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3188 $btrace = btrace_line(debug_backtrace());
3191 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3192 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3197 function log_auth($sess, $log)
3201 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3204 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3207 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3208 $btrace = btrace_line(debug_backtrace());
3211 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3212 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3217 function log_shme($log)
3221 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3224 $sess = Brisk::sess_cur_get();
3225 if (isset($sess) == FALSE)
3230 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3233 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3234 $btrace = btrace_line(debug_backtrace());
3237 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3238 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3245 // function log_legal($curtime, $sess, $name, $where, $mesg)
3246 function log_legal($curtime, $addr, $user, $where, $mesg)
3249 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3250 /* Unix time | session | nickname | IP | where was | mesg */
3251 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3252 ($user->is_auth() ? 'A' : 'N'),
3253 $user->name, $addr, $where , $mesg));
3258 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3263 if ($sitted < PLAYERS_N) {
3271 if ($table == $cur_table)
3278 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3283 function show_notify($text, $tout, $butt, $w, $h)
3285 log_main("SHOW_NOTIFY: ".$text);
3286 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3289 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3291 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3292 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);
3295 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3297 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3300 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3301 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3304 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3305 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);
3309 function root_welcome($user)
3311 GLOBAL $root_wellarr, $G_lang;
3315 $dt = date("H:i ", $curtime);
3317 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3318 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3325 function validate_sess($sess)
3327 if (strlen($sess) == SESS_LEN)
3333 function validate_name($name)
3335 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3337 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3339 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3346 function playsound($filename)
3348 return (sprintf('playsound("flasou", "%s");', $filename));
3351 function secstoword($secs)
3357 $mins = floor($secs / 60);
3359 if ($G_lang == 'en') {
3361 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3364 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3368 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3371 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3376 function sharedmem_sz($tok)
3378 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3379 log_main("shmop_open failed");
3382 $shm_sz = shmop_size($shm_id);
3383 shmop_close($shm_id);
3385 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3392 static function lock_data($is_exclusive)
3394 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3395 self::$delta_t = microtime(TRUE);
3396 log_lock("LOCK warrant [".self::$delta_t."]");
3404 static function unlock_data($res)
3408 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3417 static function lock_data($is_exclusive)
3419 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3420 self::$delta_t = microtime(TRUE);
3421 log_lock("LOCK poll [".self::$delta_t."]");
3429 static function unlock_data($res)
3433 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3439 function carousel_top()
3444 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));
3447 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>'));