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_APPR_N', 12);
32 define('TABLES_AUTH_N', 8);
33 define('TABLES_CERT_N', 4);
34 define('PLAYERS_N', 3);
35 define('MAX_POINTS', 5);
36 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
37 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
38 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
39 define('SHM_DIMS_DLT', 65536);
41 define('SHM_DIMS_U_MIN', 4096);
42 define('SHM_DIMS_U_MAX', 65536);
43 define('SHM_DIMS_U_DLT', 4096);
46 define('COMM_GEN_N', 50);
49 define('CHAT_ILL_TIME', 6);
50 define('CHAT_ENABLED', TRUE);
52 define('SESS_LEN', 13);
53 define('STREAM_TIMEOUT', 60);
54 /* FIXME: move to sac-a-push .phh */
55 /* TIME_RD define the server-side timeout, after half of it a ping request
56 is sent to client, after this time the client is log out */
57 define('EXPIRE_TIME_RD', 180);
58 define('EXPIRE_TIME_SMAMMA', 360);
59 define('EXPIRE_TIME_WAG', 10);
60 define('WAKEUP_TIME', 12);
61 // BAN_TIME da allineare anche in commons.js
62 define('BAN_TIME', 900);
63 define('GARBAGE_TIMEOUT', 5);
64 define('NICKSERV', "BriskServ");
66 define('LOCK_SHARE_MAX', 10000);
68 define('DBG_ONL2', 0x000001);
69 define('DBG_ONLY', 0x000002);
70 define('DBG_MAIN', 0x000004);
71 define('DBG_READ', 0x000008);
72 define('DBG_REA2', 0x000010);
73 define('DBG_SEND', 0x000020);
74 define('DBG_LOCK', 0x000040);
75 define('DBG_WRIT', 0x000080);
76 define('DBG_LOAD', 0x000100);
77 define('DBG_AUTH', 0x000200);
78 define('DBG_CRIT', 0x000400);
79 define('DBG_LMOP', 0x000800);
80 define('DBG_TRAC', 0x001000);
81 define('DBG_SHME', 0x002000);
82 define('DBG_ENGI', 0x004000);
83 define('DBG_CDS', 0x008000);
84 define('DBG_STEP', 0x010000);
85 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
86 define('BRISK_DEBUG', 0x0800);
88 define('BRISK_SINGLE_DEBUG',0);
89 define('BRISK_SINGLE_SESS', "");
90 define('DEBUGGING', "no-debugging");
92 define('BSK_BUSTING', "dev");
94 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
95 require_once("${G_base}Obj/ipclass.phh");
97 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
98 'en' => 'back standing' ),
99 'btn_close' => array( 'it' => 'chiudi',
102 'tit_all' => array( 'it' => 'tutti',
105 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
106 'en' => '<br>You are being idle for ' ),
107 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
108 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
109 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
110 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
111 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
112 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
113 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
114 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
115 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
116 'en' => '<br>The entered password is not correct.<br><br>'),
117 'alarret' => array( 'it' => 'Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>.',
118 'en' => 'Alarm \\"<b>%s</b>\\" sent to <b>%s</b>.'),
119 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
120 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
121 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
122 'en' => '<b>To send a message you have to be authenticated.</b>'),
123 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
124 'en' => 'The nickname have to contain at least one letter or one number.'),
125 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
126 'en' => 'The nickname <b>%s</b> is already in use.'),
127 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
128 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
129 '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>',
130 '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 ???
131 'statunkn' => array( 'it' => 'Questo stato non esiste.',
132 'en' => 'This state don\'t exists.'),
133 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
134 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
135 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
136 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
138 'tit_onauth'=>array( 'it' => '(solo aut.)',
139 'en' => '(only aut.)'),
140 'tit_onisol'=>array( 'it' => '(isolam.to)',
141 'en' => '(isolation)'),
142 '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.',
143 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
145 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
146 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessarig per poter richiedere questa funzionalità.'),
147 'inf_self' => array( 'it' => 'Non puoi informarti su te stesso.',
148 'en' => 'EN Non puoi informarti su te stesso.'),
149 'inf_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
150 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
151 'inf_err' => array( 'it' => 'Error %d. Utilizzo: <b>/info <i><login></i></b>.',
152 'en' => 'Error %d. Usage: <b>/info <i><login></i></b>.')
155 $G_lng = langtolng($G_lang);
157 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
158 $G_brisk_version = "5.8.0";
160 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
161 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: dati dai client via web-socket.',
162 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
163 'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info,',
164 'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.',
165 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ) );
167 $G_room_help = array( 'it' => '
168 <div style=\\"text-align: left; padding: 8px;\\">
169 <b>Descrizione</b><br>
170 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
171 <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>
172 <b>Configurazione del browser.</b><br>
173 Occorre abilitare i cookies.<br>
175 <b>Uso del sito</b><br>
176 Potete sedervi a un tavolo o rimanere in piedi.<br>
177 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
180 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>
181 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
182 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
183 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
184 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
185 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.
187 <dt><b>Comandi della chat</b>
188 <!-- <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname -->
189 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
190 <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\\"
191 <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
192 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
193 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
194 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
195 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
201 <div style=\\"text-align: left; padding: 8px;\\">
202 <b>EN Descrizione</b><br>
203 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
204 <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>
205 <b>Configurazione del browser.</b><br>
206 Occorre abilitare i cookies.<br>
208 <b>Uso del sito</b><br>
209 Potete sedervi a un tavolo o rimanere in piedi.<br>
210 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
213 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>
214 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
215 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
216 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
217 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
218 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.
220 <dt><b>Comandi della chat</b>
221 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
222 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
223 <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\\"
224 <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
225 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
226 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
227 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
228 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
234 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
235 <div style=\\"text-align: left; padding: 8px;\\">
236 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
238 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
239 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
241 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
242 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
243 <li>Smart card di InfoCamere
246 <b>Per auto-garantisi occorre possedere:</b><br><br>
248 <li>il codice PIN della propria carta
249 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
252 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
254 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
255 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
256 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
257 diretta dell\' utente da parte dell\' amministratore.
262 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
263 <div style=\\"text-align: left; padding: 8px;\\">
264 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
266 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
267 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
269 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
270 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
273 <b>Per auto-garantisi occorre possedere:</b><br><br>
275 <li>il codice PIN della propria carta
276 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
279 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
281 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
282 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
283 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
284 diretta dell\' utente da parte dell\' amministratore.
291 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
295 $G_room_about = array( 'it' => '<br>
296 <div id=\\"header\\" class=\\"header\\">
297 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
298 briscola chiamata in salsa ajax
300 <br><b>version '.$G_brisk_version.'</b><br><br>
301 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
303 <div id=\\"header\\" class=\\"header\\">
304 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
305 declaration briscola in ajax sauce <b>(Beta)</b>
307 <br><b>version '.$G_brisk_version.'</b><br><br>
308 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
311 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
314 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
315 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
316 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
317 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
318 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
319 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
320 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
321 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
322 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
323 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
324 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
325 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
326 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
327 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
328 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
329 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
330 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
331 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
332 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
334 // $G_PG_cons_n = count($G_PG_cons);
335 // printf("N CONS: %d\n", $G_PG_cons_n);
337 /* printf("%d %d\n", count($voc), count($cons)); */
338 /* for ($i = 0 ; $i < 26 ; $i++) { */
339 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
341 /* printf(' "%s", ', chr(ord('a') + $i)); */
342 /* for ($e = 0 ; $e < 26 ; $e++) { */
343 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
345 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
352 return (ip2long($s));
357 return (long2ip($i));
360 function int2four($l)
362 if (PHP_INT_SIZE == 4)
365 return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
368 function four2int($s)
370 return ($s & 0xffffffff);
375 return int2four( ip2int($s) );
380 return int2ip( four2int($i) );
383 function nickserv_msg($dt, $msg) {
384 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
387 function passwd_gen($seed = NULL)
389 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
398 for ($sil = 0 ; $sil < 7 ; $sil++) {
399 if (($sil % 2) == 0) {
401 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
403 $old = mt_rand(0, $G_PG_vow_n-1);
404 $pw .= $G_PG_vow[$old];
407 $new = mt_rand(0, $G_PG_vow_n-1);
409 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
410 $pw .= $G_PG_vow[$new];
416 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
423 function cmd_return($val, $desc)
425 return array('val' => $val, 'desc' => $desc);
428 function cmd_serialize($attrs)
433 foreach ($attrs as $key => $value) {
434 $ret .= $sep . $key . '=' . urlencode($value);
440 function cmd_deserialize($cmd)
443 $a = explode('&', $cmd);
445 while ($i < count($a)) {
446 $b = split('=', $a[$i]);
447 $ret[urldecode($b[0])] = urldecode($b[1]);
458 function versions_cmp($v1, $v2)
460 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
464 $v1_ar = split('\.', $v1);
465 $v2_ar = split('\.', $v2);
467 $v2_ct = count($v2_ar);
469 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
470 if (($v2_ct - 1) < $i) {
473 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
474 if ($v1_ar[$i] != $v2_ar[$i]) {
475 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
484 // return string with IPV4 address
485 function addrtoipv4($addr)
487 $ipv4addr_arr = explode(':' , $addr);
488 if (isset($ipv4addr_arr[3])) {
489 $ipv4addr = $ipv4addr_arr[3];
499 for ($i = 0; $i < ob_get_level(); $i++)
501 ob_implicit_flush(1);
505 function force_no_cache(&$header_out)
507 $header_out['Pragma'] = 'no-cache, must-revalidate';
508 $header_out['Cache-Control'] = 'no-cache';
509 $header_out['Expires'] = '-1';
512 function file_lock($fname, $is_exclusive)
514 if (($res = @fopen($fname, "r+")) == FALSE) {
518 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
526 function file_unlock($res)
529 flock($res, LOCK_UN);
534 $escpush_from = array("\\", "\"");
535 $escpush_to = array("\\\\", "\\\"");
538 GLOBAL $escpush_from, $escpush_to;
540 return str_replace($escpush_from, $escpush_to, $s);
543 $escinp_from = array( "\"" );
544 $escinp_to = array( """ );
546 function escinput($s)
548 GLOBAL $escinp_from, $escinp_to;
550 return str_replace($escinp_from, $escinp_to, $s);
555 return htmlentities($s, ENT_COMPAT, "UTF-8");
558 function esclfhtml($s)
560 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
563 function langtolng($lang)
567 return ($G_lang == 'en' ? '-en' : '');
570 function csplitter($in, $sep)
576 for ($i = 0 ; $i < strlen($in) ; $i++) {
577 $ini = substr($in, $i, 1);
581 else if ($ini == $sep) {
600 $from = array ( '\\', '@', '|' );
601 $to = array ( '\\\\', '@', '¦' );
603 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
608 $from = array ( '\\', '|', "\t", "\n");
609 $to = array ( '\\\\', '\\|', "\\t", "\\n");
611 return (str_replace($from, $to, $s));
614 function xcapemesg($s)
616 $from = array ( "\n");
617 $to = array ( "\\n");
619 return (str_replace($from, $to, $s));
629 function getbyid($idx)
631 return ($this->el[$idx]);
634 function setbyid($idx, $v)
636 $this->el[$idx] = $v;
640 define('TABLE_AUTH_TY_PUBL', 0);
641 define('TABLE_AUTH_TY_APPR', 1);
642 define('TABLE_AUTH_TY_AUTH', 2);
643 define('TABLE_AUTH_TY_CERT', 3);
651 var $auth_type; // required authorization to sit down
658 var $table_start; // information field
666 function create($idx)
668 if (($thiz = new Table()) == FALSE)
672 $thiz->player = array();
675 if ($idx < TABLES_CERT_N)
676 $thiz->auth_type = TABLE_AUTH_TY_CERT;
677 else if ($idx < TABLES_AUTH_N)
678 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
679 else if ($idx < TABLES_APPR_N)
680 $thiz->auth_type = TABLE_AUTH_TY_APPR;
682 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
688 $thiz->table_token = "";
689 $thiz->table_start = 0;
691 $thiz->wakeup_time = 0;
698 $this->idx = $from->idx;
699 $this->player = array();
700 for ($i = 0 ; $i < $from->player_n ; $i++)
701 $this->player[$i] = $from->player[$i];
702 $this->player_n = $from->player_n;
704 log_main("PLAYER_N - parent::copy.".$this->player_n);
706 $this->auth_type = $from->auth_type;
708 $this->wag_own = $from->wag_own;
709 $this->wag_com = $from->wag_com;
710 $this->wag_tout = $from->wag_tout;
712 $this->table_token = $from->table_token;
713 $this->table_start = $from->table_start;
715 $this->wakeup_time = $from->wakeup_time;
718 function myclone($from)
720 if (($thiz = new Table()) == FALSE)
728 function spawn($from)
730 if (($thiz = new Table()) == FALSE)
733 $thiz->idx = $from->idx;
734 $thiz->player = array();
735 for ($i = 0 ; $i < $from->player_n ; $i++)
736 $thiz->player[$i] = $i;
737 $thiz->player_n = $from->player_n;
739 $thiz->auth_type = $from->auth_type;
741 $thiz->wag_own = $from->wag_own;
742 $thiz->wag_com = $from->wag_com;
743 $thiz->wag_tout = $from->wag_tout;
745 $thiz->table_token = $from->table_token;
746 $thiz->table_start = $from->table_start;
748 $thiz->wakeup_time = $from->wakeup_time;
753 function wag_set($user_idx, $mesg)
757 $this->wag_own = $user_idx;
758 $this->wag_com = $mesg;
762 function wag_reset($timeout)
764 log_main("WAG_RESET");
766 unset($this->wag_own);
769 $this->wag_tout = $timeout;
772 function player_get($idx)
774 return ($this->player[$idx]);
777 function player_set($idx, $player)
779 $this->player[$idx] = $player;
782 function user_add($idx)
784 $this->player[$this->player_n] = $idx;
787 return ($this->player_n - 1);
790 function user_rem($brisk, $user)
792 $tabpos = $user->table_pos;
794 /* verifico la consistenza dei dati */
795 if ($brisk->user[$this->player[$tabpos]] == $user) {
797 /* aggiorna l'array dei giocatori al tavolo. */
798 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
799 $this->player[$i] = $this->player[$i+1];
800 $user_cur = $brisk->user[$this->player[$i]];
801 $user_cur->table_pos = $i;
806 log_main("INCONSISTENCY ON TABLE.");
810 // Table->act_content - return 'id' of type of output required for table button
811 function act_content($user)
814 $isstanding = ($user->subst == 'standup');
815 $sitted = $this->player_n;
817 $cur_table = $user->table;
821 if ($sitted < PLAYERS_N) {
822 switch ($this->auth_type) {
823 case TABLE_AUTH_TY_CERT:
824 if ($user->is_cert() && !$user->is_appr())
829 case TABLE_AUTH_TY_AUTH:
830 if ($user->is_auth() && !$user->is_appr())
835 case TABLE_AUTH_TY_APPR:
836 if ($user->is_auth())
851 if ($table == $cur_table)
858 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
871 function Delay_Manager($triglevel)
873 $this->triglevel = $triglevel;
874 $this->delta = array();
875 $this->lastcheck = 0;
878 function delta_get($curtime)
880 // clean too old delta items
881 for ($i = 0 ; $i < count($this->delta) ; $i++) {
882 if ($this->delta[$i][0] < $curtime) {
883 array_splice($this->delta, $i, 1);
888 // add new delta items if delay exceeded $this->triglevel sec
889 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
890 $delta = $curtime - $this->lastcheck - $this->triglevel;
891 array_push($this->delta, array($curtime + $delta , $delta));
892 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
895 // extract the maximum valid delta
897 for ($i = 0 ; $i < count($this->delta) ; $i++) {
898 $delta_cur = $this->delta[$i][1];
899 if ($delta_max < $delta_cur)
900 $delta_max = $delta_cur;
903 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
908 function lastcheck_set($curtime)
910 $this->lastcheck = $curtime;
918 function Client_prefs()
922 static function from_user($user)
924 $thiz = new Client_prefs();
925 $thiz->user_load($user);
930 static function from_json($json)
932 $thiz = new Client_prefs();
933 if ($thiz->json_load($json) == FALSE) {
941 function user_load($user)
943 // fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
944 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
945 if ($user->rec != FALSE) {
946 $this->supp_comp = $user->rec->supp_comp_get();
949 $this->supp_comp = "000000000000";
952 // fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
955 function json_load($json_s)
960 if (gettype($json_s) == "string") {
961 if (($json = json_decode($json_s)) == FALSE)
967 if ($this->listen < 0 || $this->listen > 2)
969 $this->listen = $json->listen;
971 if (mb_strlen($json->supp_comp, "ASCII") != 12)
974 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
975 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
976 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
982 $this->supp_comp = $json->supp_comp;
989 function store($user, $is_save)
992 // fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
993 // $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
994 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
995 // fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
997 if ($user->is_supp_custom()) {
998 $user->rec->supp_comp_set($this->supp_comp);
1001 $user->prefs_store();
1005 define('GHOST_SESS_TOUT', 1800);
1006 define('GHOST_SESS_REAS_LOUT', 1); // logout
1007 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
1008 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
1009 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
1010 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
1011 define('GHOST_SESS_REAS_PROX', 6); // proxy access
1019 function GhostSessEl($time, $sess, $reas)
1021 $this->time = $time + GHOST_SESS_TOUT;
1022 $this->sess = $sess;
1023 $this->reas = $reas;
1031 function GhostSess()
1033 $this->gs = array();
1036 // push or update for this session
1037 function push($time, $sess, $reas)
1039 foreach($this->gs as $el) {
1040 if ($el->sess == "$sess") {
1042 $el->time = $time + GHOST_SESS_TOUT;
1047 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1053 foreach($this->gs as $key => $el) {
1054 if ($el->sess == "$sess") {
1055 $ret = $this->gs[$key];
1056 unset($this->gs[$key]);
1063 function garbage_manager($curtime)
1065 foreach($this->gs as $key => $el) {
1066 if ($el->time < $curtime) {
1067 unset($this->gs[$key]);
1077 var $crystal_filename;
1081 var $comm; // commands for many people
1082 var $step; // current step of the comm array
1083 var $garbage_timeout;
1086 var $ban_list; // ban list (authized allowed)
1087 var $black_list; // black list (anti-dos, noone allowed)
1088 var $cloud_smasher; // list of cloud ip ranges to be rejected
1094 public static $sess_cur;
1102 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1103 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1104 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1105 fprintf(STDERR, "ROOM FROM FILE\n");
1106 rename($crystal_filename, $crystal_filename.".old");
1108 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1114 fprintf(STDERR, "NEW ROOM\n");
1115 $thiz = new Brisk();
1117 $thiz->crystal_filename = $crystal_filename;
1118 $thiz->user = array();
1119 $thiz->table = array();
1120 $thiz->match = array();
1122 $thiz->ban_list = IpClass::create();
1123 $thiz->black_list = IpClass::create();
1124 $thiz->cloud_smasher = IpClass::create();
1125 $thiz->ghost_sess = new GhostSess();
1127 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1128 $thiz->user[$i] = User::create($thiz, $i, "", "");
1131 for ($i = 0 ; $i < TABLES_N ; $i++) {
1132 $thiz->table[$i] = Table::create($i);
1134 $thiz->garbage_timeout = 0;
1135 $thiz->shm_sz = SHM_DIMS_MIN;
1137 $thiz->delay_mgr = new Delay_Manager(1.5);
1139 static::$sess_cur = FALSE;
1141 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1146 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1148 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1149 count($ban_list), count($black_list), count($cloud_smasher));
1151 if (defined('CURL_DE_SAC_VERS')) {
1152 if (brisk_cds_reload($this) == FALSE) {
1156 $this->ban_list->update($ban_list);
1157 $this->black_list->update($black_list);
1158 $this->cloud_smasher->update($cloud_smasher);
1161 $this->banned_kickoff();
1162 $this->garbage_manager(TRUE);
1166 function banned_kickoff()
1170 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1171 $table_cur = $this->table[$table_idx];
1172 // if the table is complete and exists we check users IP
1174 if ($table_cur->player_n == PLAYERS_N) {
1175 if (isset($this->match[$table_idx]) &&
1176 $table_cur->table_token == $bin5->table_token) {
1177 log_main("PLAYERS == N TABLE ".$table_idx);
1179 $bin5 = $this->match[$table_idx];
1181 $is_ban |= $bin5->banned_kickoff();
1186 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1187 $user_cur = $this->user[$i];
1189 if ($user_cur->is_active() == FALSE)
1192 // check if the IP is blacklisted
1193 if ($this->black_check($user_cur->ip) ||
1194 $this->cloud_check($user_cur->ip)) {
1195 $user_cur->lacc = 0;
1200 // if authorized not check if banlisted
1201 if ($user_cur->is_auth()) {
1205 if ($this->ban_check($user_cur->ip)) {
1206 $user_cur->lacc = 0;
1214 function ban_check($ip_str)
1216 return ($this->ban_list->check($ip_str));
1219 function black_check($ip_str)
1221 return ($this->black_list->check($ip_str));
1224 function cloud_check($ip_str)
1226 return ($this->cloud_smasher->check($ip_str));
1229 function users_cleanup()
1232 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1233 $user_cur = $this->user[$i];
1235 if ($user_cur->the_end
1236 && (($user_cur->rd_toflush == FALSE
1237 && $user_cur->rd_step == $user_cur->step)
1238 || $user_cur->rd_endtime_is_expired($curtime))
1240 $user_cur->reset(); // users_cleanup, OK
1245 function garbage_manager($force)
1247 GLOBAL $G_lang, $mlang_brisk, $G_base;
1251 log_rd2("garbage_manager START");
1253 /* Garbage collector degli utenti in timeout */
1254 $curtime = microtime(TRUE);
1256 $delta = $this->delay_mgr->delta_get($curtime);
1258 if (!$force && !($this->garbage_timeout < $curtime)) {
1259 $this->delay_mgr->lastcheck_set($curtime);
1263 // Before all align times with table timeout
1264 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1265 $table_cur = $this->table[$table_idx];
1266 // if the table is complete and exists its shared mem we get the info about users lacc
1268 if ($table_cur->player_n == PLAYERS_N) {
1269 log_main("PLAYERS == N TABLE ".$table_idx);
1272 $no_recovery = FALSE;
1273 if (isset($this->match[$table_idx])) {
1274 $bin5 = $this->match[$table_idx];
1276 if ($table_cur->table_token != $bin5->table_token) {
1277 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1278 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1279 $no_recovery = TRUE;
1283 if ($bin5 != FALSE) {
1287 log_main("garbage_manager: bri loaded successfully.");
1288 $bin5->garbage_manager(TRUE);
1290 $bin5_table = $bin5->table[0];
1292 // is the end of the table
1294 if ($bin5->the_end == TRUE) {
1296 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1298 log_main("garbage_manager: INSIDE THE END.");
1300 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1301 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1302 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1305 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1306 // stat must be "table" by definition
1307 $user_cur = $this->user[$table_cur->player[$i]];
1308 $bin5_user = $bin5->user[$i];
1310 $user_cur->subst = $bin5_user->subst;
1311 $user_cur->rd_step = $bin5_user->rd_step;
1312 $user_cur->step = $bin5_user->step;
1313 $user_cur->lacc = $bin5_user->lacc;
1314 $user_cur->laccwr = $bin5_user->lacc;
1315 $user_cur->bantime = $bin5_user->bantime;
1316 $user_cur->the_end = $bin5_user->the_end;
1317 if ($user_cur->the_end) {
1318 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1322 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1324 $this->room_join_wakeup($user_cur, FALSE, 0);
1325 $table_cur->table_token = "";
1326 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1328 $this->match_del($table_idx);
1331 log_main("gm:: save_data");
1333 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1334 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1337 } // if ($bin5 == FALSE
1338 else if ($no_recovery == FALSE) {
1339 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1341 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1342 $user_cur = $this->user[$table_cur->player[$i]];
1343 $user_cur->subst = "shutdowner";
1344 $user_cur->step_inc();
1346 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1347 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1348 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1349 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1350 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1351 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1352 $user_cur->step_inc();
1355 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1356 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1357 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1359 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1361 $this->room_join_wakeup($user_cur, TRUE, -2);
1362 $table_cur->table_token = "";
1365 } // if ($table_cur->player_n == PLAYERS_N) {
1366 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1368 log_rd2("out new loop.");
1370 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1371 $user_cur = $this->user[$i];
1373 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1375 if ($user_cur->is_active() == FALSE)
1378 if ($user_cur->lacc + (($user_cur->ping_req ? 1.5 : 1.0) * EXPIRE_TIME_RD) < ($curtime - $delta)) {
1379 // Auto logout dell'utente
1380 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1382 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1383 $user_cur->the_end = TRUE;
1385 log_rd2("AUTO LOGOUT.");
1386 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1387 log_auth($user_cur->sess, "Autologout session.");
1389 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1390 $this->room_wakeup($user_cur);
1391 else if ($user_cur->subst == 'standup')
1392 $this->room_outstandup($user_cur);
1394 log_rd2("LOGOUT FROM WHAT ???");
1398 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1399 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1400 $this->room_wakeup($user_cur);
1401 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1402 /* 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" */
1403 $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);
1404 $user_cur->step_inc();
1408 log_rd2("GARBAGE UPDATED!");
1410 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1413 $this->ghost_sess->garbage_manager($curtime);
1415 $this->delay_mgr->lastcheck_set($curtime);
1419 function show_room($user_step, $user)
1421 GLOBAL $G_lang, $mlang_brisk;
1422 log_main("show_room: username: ".$user->name);
1424 $ret = sprintf('gst.st = %d; ', $user_step);
1426 $prefs = Client_prefs::from_user($user);
1427 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1430 if ($user->flags & USER_FLAG_ISOLAUTH) {
1431 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1433 else if ($user->flags & USER_FLAG_LISTAUTH) {
1434 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1437 $ret .= 'list_set(\'all\', false, \'\' ); ';
1441 if ($user->subst == 'standup')
1442 $ret .= "tra.show(); ";
1444 $ret .= "tra.hide(); ";
1446 $ret .= sprintf('stat = "%s";', $user->stat);
1448 $ret .= root_welcome($user);
1449 if ($user->flags & USER_FLAG_DBFAILED) {
1450 $ret .= "gst.st = ".($user->step+1)."; ";
1451 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1454 $ret .= sprintf('subst = "%s";', $user->subst);
1455 $ret .= $user->myname_innerHTML();
1457 for ($i = 0 ; $i < TABLES_N ; $i++) {
1459 $ret .= $this->table_content($user, $i);
1461 $ret .= $this->table[$i]->act_content($user);
1462 if ($this->table[$i]->wag_own != -1)
1463 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1465 $ret .= sprintf('tra.rem(%d); ', $i);
1467 $ret .= $this->standup_content($user);
1468 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1473 function room_wakeup($user)
1475 $table_idx = $user->table;
1476 $table = $this->table[$table_idx];
1478 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1482 $from_table = ($user->stat == "table");
1484 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1486 for ($i = 0 ; $i < $table->player_n ; $i++) {
1487 $user_cur = $this->user[$table->player[$i]];
1488 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1490 if ($user->idx_get() != $table->player[$i]) {
1491 $user_cur->stat_set("room");
1492 $user_cur->subst = "sitdown";
1493 $user_cur->laccwr = $curtime;
1495 else if ($user->is_active()) {
1496 $user_cur->stat_set("room");
1497 $user_cur->subst = "standup";
1498 $user_cur->laccwr = $curtime;
1499 $user_cur->table = -1;
1504 $user->stat_set("room");
1505 $user->subst = "standup";
1506 $user->laccwr = $curtime;
1509 $remove_wagon = FALSE;
1510 if($table->wag_own == $user->idx_get()) {
1511 $table->wag_reset($curtime);
1512 $remove_wagon = TRUE;
1515 /* aggiorna l'array dei giocatori al tavolo. */
1516 $table->user_rem($this, $user);
1518 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1519 $user_cur = $this->user[$i];
1520 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1523 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1525 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1526 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1527 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1528 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1529 log_main("DOCUMENT.index.php: from table");
1531 else if ($user_cur->stat == "room") {
1532 log_main("DOCUMENT.index.php: from table");
1534 $ret .= $this->table_content($user_cur, $table_idx);
1535 $ret .= $this->standup_content($user_cur);
1537 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1538 $ret .= $table->act_content($user);
1540 if ($user->idx_get() == $i) {
1541 // set the new status
1542 $ret .= 'subst = "standup"; tra.show(); ';
1543 // clean the action buttons in other tables
1544 for ($e = 0 ; $e < TABLES_N ; $e++) {
1545 if ($this->table[$e]->player_n < PLAYERS_N) {
1546 $ret .= $this->table[$e]->act_content($user);
1551 $ret .= $table->act_content($user_cur);
1554 log_wr("ROOM_WAKEUP: ".$ret);
1555 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1556 $user_cur->step_inc();
1560 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1562 $table_idx = $user->table;
1563 $table = $this->table[$table_idx];
1565 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1568 $user_wup = array();
1570 $user_tab = array();
1572 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1574 for ($i = 0 ; $i < $table->player_n ; $i++) {
1575 $user_cur = $this->user[$table->player[$i]];
1576 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1577 if ($user_cur->is_empty()) {
1580 if ($update_lacc == TRUE) {
1581 $user_cur->laccwr = $curtime;
1583 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1584 if ($user_cur->subst == "shutdowned") {
1585 $user_cur->stat_set("room");
1586 $user_cur->subst = "sitdown";
1588 else if ($user_cur->subst == "shutdowner") {
1589 $user_cur->stat_set("room");
1590 $user_cur->subst = "standup";
1591 $user_cur->table = -1;
1592 $user_wup[$user_wup_n++] = $user_cur;
1594 $remove_wagon = FALSE;
1595 if($table->wag_own == $table->player[$i]) {
1596 $remove_wagon = TRUE;
1597 $table->wag_reset($curtime);
1600 $user_tab[$user_tab_n++] = $table->player[$i];
1603 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1604 $table->user_rem($this, $user_wup[$wup_idx]);
1606 /* aggiorna l'array dei giocatori al tavolo. */
1608 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1609 log_main("START LOOP");
1610 $user_cur = $this->user[$i];
1611 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1612 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1617 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1619 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1620 if ($user_cur->stat == "room") {
1621 log_main("DOCUMENT.index.php from table");
1623 $ret .= $this->table_content($user_cur, $table_idx);
1624 $ret .= $this->standup_content($user_cur);
1626 $ret .= $table->act_content($user_cur);
1629 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1630 if ($user_tab[$tab_idx] == $i)
1633 // for users that wakeup the room will be reconstructed by index_rd.php
1634 if ($tab_idx < $user_tab_n) {
1635 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1637 // ARRAY_POP DISABLED
1638 // if ($trans_delta == 0)
1639 // while (array_pop($user_cur->comm) != NULL);
1641 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1642 $user_cur->comm[$user_cur->step % COMM_N] = "";
1643 $user_cur->step_inc();
1644 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1645 $user_cur->step_inc();
1646 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1650 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1652 log_main("JOIN_WAKEUP more");
1654 $ret .= $table->act_content($user_cur);
1656 log_main("JOIN_WAKEUP end more");
1658 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1659 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1660 $user_cur->step_inc();
1665 function info_show($user, $target, $dt)
1667 if success return assoc. array with "ret" => 0 and other fields
1668 else return an assoc. array with "ret: != 0 and "mesg" with an error description
1670 function info_show($user, $target, $dt)
1672 GLOBAL $G_lang, $mlang_brisk, $G_base;
1679 if ($target == "") {
1683 if (($bdb = BriskDB::create()) == FALSE) {
1687 if ($target == $user->name) {
1689 $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
1692 if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
1696 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1697 $guar_login = $guar_item->login_get();
1702 $user_tos_vers = $user_item->tos_vers_get();
1704 $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code);
1706 $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code);
1707 $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code);
1708 $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code);
1709 $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code);
1711 if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code,
1712 $widefriend, $narrowfriend)) == FALSE) {
1713 $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code,
1714 $widefriend, $narrowfriend);
1717 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1718 $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target));
1720 else if ($guar_login == "") {
1721 $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
1725 if ($ret > 0 && $mesg == "") {
1726 $mesg = sprintf($mlang_brisk['inf_err'][$G_lang], $ret);
1730 $jret = json_encode(array("ret" => $ret, "mesg" => $mesg));
1733 $jret = json_encode(array("ret" => 0,
1736 // FIXME: state internationalization
1738 ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
1739 ($user_item->type & USER_FLAG_TY_CERT ? "Certificato" :
1740 ($user_item->type & (USER_FLAG_TY_NORM | USER_FLAG_TY_SUPER) ?
1741 "Normale" : "Stato sconosciuto"))),
1742 "guar" => ($user_item->type & USER_FLAG_TY_APPR ?
1744 "party" => $partyskill,
1745 "match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) ,
1746 "game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt),
1747 "friend" => usersnet_friend_getlabel($usersnet_item->friend),
1748 "skill" => $usersnet_item->skill,
1749 "trust" => $usersnet_item->trust,
1750 "widefriend" => $usersnet_item->widefriend,
1751 "narrowfriend" => $usersnet_item->narrowfriend
1758 function info_save($user, $json_s)
1760 GLOBAL $G_lang, $mlang_brisk, $G_base;
1768 if (($json = json_decode($json_s)) == FALSE) {
1773 if (($bdb = BriskDB::create()) == FALSE) {
1778 if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) {
1779 $ret = 4000 + $subret;
1787 function room_outstandup($user)
1789 $this->room_sitdown($user, -1);
1792 function table_update($user)
1794 log_main("table_update: pre - USER: ".$user->name);
1796 $table_idx = $user->table;
1798 if ($table_idx > -1)
1799 $table = $this->table[$table_idx];
1801 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1803 $user_cur = $this->user[$i];
1804 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1807 $ret = "gst.st = ".($user_cur->step+1)."; ";
1808 if ($table_idx > -1)
1809 $ret .= $this->table_content($user_cur, $table_idx);
1811 if ($user->idx_get() == $i) {
1812 $ret .= $user->myname_innerHTML();
1814 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1815 $user_cur->step_inc();
1818 log_main("table_update: post");
1821 function room_sitdown($user, $table_idx)
1823 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1827 if ($table_idx > -1 && $table_idx < TABLES_N) {
1828 $table = $this->table[$table_idx];
1831 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1832 for ($i = 0 ; $i < TABLES_N ; $i++) {
1833 if ($table->wag_own == $table->player[$i]) {
1834 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1835 $table->wag_reset(time());
1842 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1844 $user_cur = $this->user[$i];
1845 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1848 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1849 if ($table_idx > -1)
1850 $ret .= $this->table_content($user_cur, $table_idx);
1851 $ret .= $this->standup_content($user_cur);
1853 if ($user->idx_get() == $i) {
1854 $ret .= 'subst = "sitdown"; tra.hide(); ';
1855 // clean the action buttons in other tables
1856 for ($e = 0 ; $e < TABLES_N ; $e++) {
1857 $ret .= $this->table[$e]->act_content($user_cur);
1860 else if ($table_idx > -1) {
1861 if ($table->player_n == PLAYERS_N) {
1863 $ret .= $table->act_content($user_cur);
1866 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1867 $user_cur->step_inc();
1871 function kickuser($user, $out_reas)
1875 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1877 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1879 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1880 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1881 $bin5 = &$this->match[$user->table];
1882 $user_bin5 = &$bin5->user[$user->table_pos];
1883 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1884 $bin5->table_wakeup($user_bin5);
1885 $user->the_end = TRUE;
1886 $this->room_wakeup($user);
1890 if ($user->stat == 'table' || $user->stat == 'room') {
1891 $user->the_end = TRUE;
1892 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1893 $this->room_wakeup($user);
1895 else if ($user->subst == 'standup') {
1896 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1897 $this->room_outstandup($user);
1900 log_rd2("LOGOUT FROM WHAT ???");
1905 function kickuser_by_name($name, $out_reas)
1907 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1908 $user_out = $this->user[$i];
1909 if (strcmp($user_out->name, $name) == 0) {
1910 return ($this->kickuser($user_out, $out_reas));
1916 function kickuser_by_sess($sess, $out_reas)
1918 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1919 $user_out = $this->user[$i];
1920 if (strcmp($user_out->sess, $sess) == 0) {
1921 return ($this->kickuser($user_out, $out_reas));
1927 function kickuser_by_idx($idx, $out_reas)
1929 $user_out = $this->user[$idx];
1930 return ($this->kickuser($user_out, $out_reas));
1933 function chatt_send($user, $mesg, $mlang_indwr = NULL)
1935 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1938 // fprintf(STDERR, "WE ARE HERE: [%s]\n", $mesg);
1941 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1943 $dt = date("H:i ", $curtime);
1954 $is_normchat = FALSE;
1955 /* for old isolation management $is_ticker = FALSE; */
1956 $update_room = FALSE;
1958 if (strcmp($msg, "/tav") == 0 ||
1959 strncmp($msg, "/tav ", 5) == 0) {
1961 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1962 /* 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>" */
1963 $msg = $mlang_brisk['tickmust'][$G_lang];
1964 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1969 $table = $this->table[$user->table];
1971 if ($table->wag_own != -1) {
1972 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1973 $msg = $mlang_brisk['tickjust'][$G_lang];
1974 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1979 $dtime = $curtime - $table->wag_tout;
1980 if ($dtime < EXPIRE_TIME_WAG) {
1981 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1982 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1983 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1984 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1989 $msg = substr($msg, 5);
1991 $table->wag_set($user->idx_get(), $msg);
1992 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1993 $to_room = $to_user;
1994 /* for old isolation management $is_ticker = TRUE; */
1996 } // /tav chat command
1997 // just for development use currently
1998 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1999 fprintf(STDERR, "MOP OUT\n");
2000 $target = substr($msg, 5);
2001 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
2003 else if (strncmp($msg, "/alarm ", 7) == 0) {
2004 if (strncmp($msg, "/alarm to ", 10) == 0) {
2005 $sp_pos = strpos($msg, " ", 10);
2006 $target = substr($msg, 10, $sp_pos - 10);
2007 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
2011 $alarm_check = "/alarm ".$G_alarm_passwd." ";
2014 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
2015 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
2016 $msg = $mlang_brisk['alarpass'][$G_lang];
2017 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
2022 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
2023 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
2024 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
2025 $to_user = nickserv_msg($dt, $prestr);
2027 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
2028 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
2029 /* MLANG: "chiudi" */
2030 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
2032 } // /alarm chat command
2033 else if (strncmp($msg, "/listen ", 8) == 0) {
2034 $arg = substr($msg, 8);
2036 if (strcasecmp($arg, "isolation") == 0) {
2038 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
2039 $user->table >= TABLES_AUTH_N) {
2040 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
2044 $user->flags &= ~USER_FLAG_MAP_AUTH;
2045 $user->flags |= USER_FLAG_ISOLAUTH;
2046 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
2049 else if (strcasecmp($arg, "auth") == 0) {
2050 $flags_old = $user->flags;
2051 $user->flags &= ~USER_FLAG_MAP_AUTH;
2052 $user->flags |= USER_FLAG_LISTAUTH;
2053 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
2056 $flags_old = $user->flags;
2057 $user->flags &= ~USER_FLAG_MAP_AUTH;
2058 $to_user = 'list_set(\'all\', true, \'\'); ';
2061 // if from isolation redraw standup area
2062 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
2063 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
2067 else if (strcmp($msg, "/authreq") == 0) {
2068 if ($user->is_cert()) {
2069 $to_user = sprintf('authbox(300,200);');
2072 /* 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." */
2073 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
2076 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
2077 if ($user->is_auth()) {
2078 $to_user = sprintf('mesgtoadmbox(500,300);');
2081 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
2082 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
2085 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
2086 log_main("chatt_send BEGIN");
2089 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2090 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2094 $msg = "COMMAND ".$msg;
2095 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2096 $user_cur = $this->user[$i];
2098 if ($user_cur->is_active() == FALSE)
2100 if (strcasecmp($user_cur->name,$name_new) == 0)
2103 if ($i < MAX_PLAYERS) {
2104 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2105 $to_user = nickserv_msg($dt, $prestr);
2109 /* 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>" */
2110 if ($user->is_auth()) {
2111 if (strcasecmp($user->name,$name_new) != 0) {
2112 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2113 ($user->subst == 'standup' ||
2114 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2117 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2118 for ($i = 0 ; $i < TABLES_N ; $i++) {
2119 $to_user .= $this->table[$i]->act_content($user);
2123 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2128 $user->name = $name_new; // OK - nick changed
2129 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2130 if ( ! $user->is_auth() ) {
2131 if (($bdb = BriskDB::create()) != FALSE) {
2133 /* 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>" */
2134 if ($bdb->login_exists(strtolower($name_new))) {
2135 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2136 $to_user .= nickserv_msg($dt, $prestr);
2141 log_main("chatt_send start set");
2143 $update_room = TRUE;
2145 } // nick chat command
2146 else if (strncmp($msg, "/info ", 6) == 0) {
2148 if (! $user->is_auth()) {
2150 $to_user = nickserv_msg($dt, $mlang_indwr['info_auth'][$G_lang]);
2153 $to_user = nickserv_msg($dt, "error");
2157 $info_user = substr($msg, 6);
2159 echo $this->info_show($user, urldecode($info_user), $dt);
2162 else if (strncmp($msg, "/st ", 4) == 0) {
2163 log_main("chatt_send BEGIN");
2166 $st_str = substr($msg, 4);
2168 if (strcasecmp($st_str, "normale") == 0) {
2169 $st = USER_FLAG_S_NORM;
2171 else if (strcasecmp($st_str, "pausa") == 0) {
2172 $st = USER_FLAG_S_PAU;
2174 else if (strcasecmp($st_str, "fuori") == 0) {
2175 $st = USER_FLAG_S_OUT;
2177 else if (strcasecmp($st_str, "cane") == 0) {
2178 $st = USER_FLAG_S_DOG;
2180 else if (strcasecmp($st_str, "cibo") == 0) {
2181 $st = USER_FLAG_S_EAT;
2183 else if (strcasecmp($st_str, "lavoro") == 0) {
2184 $st = USER_FLAG_S_WRK;
2186 else if (strcasecmp($st_str, "sigaretta") == 0) {
2187 $st = USER_FLAG_S_SMK;
2189 else if (strcasecmp($st_str, "presente") == 0) {
2190 $st = USER_FLAG_S_EYE;
2192 else if (strcasecmp($st_str, "coniglio") == 0) {
2193 $st = USER_FLAG_S_RABB;
2195 else if (strcasecmp($st_str, "calcio") == 0) {
2196 $st = USER_FLAG_S_SOCC;
2198 else if (strcasecmp($st_str, "pupo") == 0) {
2199 $st = USER_FLAG_S_BABY;
2201 else if (strcasecmp($st_str, "pulizie") == 0) {
2202 $st = USER_FLAG_S_MOP;
2204 else if (strcasecmp($st_str, "babbo") == 0) {
2205 $st = USER_FLAG_S_BABBO;
2207 else if (strcasecmp($st_str, "renna") == 0) {
2208 $st = USER_FLAG_S_RENNA;
2210 else if (strcasecmp($st_str, "pupazzo") == 0) {
2211 $st = USER_FLAG_S_PUPAZ;
2213 else if (strcasecmp($st_str, "vischio") == 0) {
2214 $st = USER_FLAG_S_VISCH;
2217 /* MLANG: "Questo stato non esiste." */
2218 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2222 log_main("chatt_send start set");
2223 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2224 $update_room = TRUE;
2225 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2228 } // nick chat command
2230 else { // normal chat line
2231 $is_normchat = TRUE;
2232 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2234 $user->chat_dlt = $user->chat_dlt * 2;
2235 if ($user->chat_dlt > 120)
2236 $user->chat_dlt = 120;
2238 else if ($user->chat_lst == $msg)
2240 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2241 $user->chat_ban = $curtime;
2242 $user->chat_dlt = 5;
2246 $user->chat_ban = 0;
2247 $user->chat_dlt = 0;
2251 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2254 // TEMPORARY DISABLED UNTIL test user option will be available
2255 // if ( TRUE && (!$user->is_auth() || $user->is_appr()) ) {
2256 if (!$user->is_auth()) {
2257 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2258 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2260 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2261 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2262 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2264 $auguri = sprintf("%s auguri %s %s.",
2265 $aug_head[mt_rand(0, count($aug_head)-1)],
2266 $aug_body[mt_rand(0, count($aug_body)-1)],
2267 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2269 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2274 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2275 // temporary silentiation for troll (will became array check)
2276 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2277 $to_room = $to_user;
2281 log_legal($curtime, $user->ip, $user,
2282 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2284 $user->chat_lst = "$msg";
2285 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2295 // Output to clients
2298 if ($to_user != FALSE) {
2299 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2300 $user->comm[$user->step % COMM_N] .= $to_user;
2304 if ($to_room != FALSE) {
2305 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2306 $user_cur = $this->user[$i];
2307 if ($target != "" && $user_cur->name != $target)
2309 if ($user_cur->is_active() == FALSE // is not active user
2310 || $user_cur->stat == 'table' // or stat is 'table'
2311 || $user->idx_get() == $i) // or the $user idx is equal to current var
2314 if ($is_normchat == TRUE) {
2315 // use MAP_AUTH to check if auth or isolation
2316 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2317 if ( ! $user->is_auth() ) {
2323 else if ($is_ticker) {
2324 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2325 if ($user->table >= TABLES_AUTH_N)
2330 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2331 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2332 $user_cur->step_inc();
2337 // FIXME BRISK4: include for each kind of table
2338 require_once("${G_base}briskin5/Obj/briskin5.phh");
2339 // Before all align times with table timeout
2340 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2341 if (isset($this->match[$table_idx])) {
2342 $bin5 = $this->match[$table_idx];
2344 $bin5_table = $bin5->table[0];
2345 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2346 // stat must be "table" by definition
2347 $bin5_user = $bin5->user[$i];
2349 if ($target != "" && $bin5_user->name != $target)
2351 log_main("writa: ".$user_mesg);
2352 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2353 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2354 $bin5_user->step_inc();
2356 } // if (isset($this->match
2357 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2358 } // if ($to_tabl == true ...
2361 if ($user->stat == 'room' && $user->subst == 'standup') {
2362 $this->standup_update($user);
2364 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2365 log_main("chatt_send pre table update");
2366 $this->table_update($user);
2367 log_main("chatt_send post table update");
2369 } // if ($update_room ...
2372 } // function chatt_send( ...
2374 function get_user($sess, &$idx)
2378 if (validate_sess($sess)) {
2379 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2380 if ($this->user[$i]->is_empty())
2382 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2385 $ret = $this->user[$i];
2389 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2390 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2391 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2394 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2401 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2404 * if ($idx > -1 && ret == FALSE) => duplicated nick
2405 * if ($idx == -2 && ret == FALSE) => invalid name
2406 * if ($idx == -3 && ret == FALSE) => wrong password
2407 * if ($idx == -1 && ret == FALSE) => no space left
2408 * if ($idx == 0 && ret == user) => SUCCESS
2409 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2412 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2418 $authenticate = FALSE;
2420 $login_exists = FALSE;
2422 $ghost_auth = FALSE;
2427 if (($name_new = validate_name($name)) == FALSE) {
2432 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2433 if (validate_sess($sess) == FALSE)
2436 /* if pass != FALSE verify the login with pass */
2437 log_auth("XXX", "auth1");
2439 if (($bdb = BriskDB::create()) != FALSE) {
2441 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2442 log_auth("XXX", "auth2");
2443 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2444 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2446 if ($authenticate != FALSE) {
2447 $user_type = $authenticate->type_get();
2455 $login_exists = $bdb->login_exists(strtolower($name_new));
2457 TO ENABLE USER-LOGIN ONLY
2458 - $login_exists = $bdb->login_exists(strtolower($name_new));
2459 + // $login_exists = $bdb->login_exists(strtolower($name_new));
2460 + // Force access with login and password
2467 // if db is down, send a warning and verify only current users
2468 // no actions at this moment
2470 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2472 if ($this->user[$i]->is_empty()) {
2473 if ($idfree == -1) {
2478 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2483 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2484 if ($authenticate != FALSE) {
2486 $ghost_auth = $this->user[$i]->is_auth();
2497 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2499 /* there is another user logged with your account and you and him have authenticated => new user
2500 get the session of the old user */
2501 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2504 $ghost_user = $this->user[$ghost];
2506 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2507 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2508 $ghost_user->step_inc();
2511 $ghost_user->sess = $sess;
2514 $ghost_user->sess = $sess;
2517 // If user at the table we need to update the table data too
2518 $table_idx = $ghost_user->table;
2519 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2520 require_once("${G_base}briskin5/Obj/briskin5.phh");
2521 if (isset($this->match[$table_idx])) {
2522 $bin5 = $this->match[$table_idx];
2524 if ($bin5->the_end != TRUE) {
2525 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2526 $bin5->user[$ghost_user->table_pos]->step_inc();
2527 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2533 if (defined('CURL_DE_SAC_VERS')) {
2534 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2536 return ($this->user[$ghost]);
2538 else if ($idx != -1 && $i == MAX_PLAYERS) {
2543 $this->user[$idx]->sess = $sess;
2546 $this->user[$idx]->sess = $sess;
2548 $this->user[$idx]->name = $name_new; // OK - add new user
2549 $this->user[$idx]->stat_set("room");
2550 $this->user[$idx]->step_set(0);
2551 while (array_pop($this->user[$idx]->comm) != NULL);
2552 $this->user[$idx]->subst = "standup";
2553 $this->user[$idx]->lacc = $curtime;
2554 $this->user[$idx]->laccwr = $curtime;
2555 $this->user[$idx]->bantime = 0;
2556 $this->user[$idx]->ip = $ip;
2558 $this->user[$idx]->rec = $authenticate;
2559 $this->user[$idx]->flags = $user_type;
2560 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2561 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2562 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2564 if ($authenticate != FALSE) {
2565 $this->user[$idx]->code = $authenticate->code_get();
2567 // all this part is included in the db server
2568 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2570 if (isset($cookie['CO_list'])) {
2571 // fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2572 if (strcmp($cookie['CO_list'], "auth") == 0) {
2573 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2574 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2576 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2577 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2578 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2581 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2586 // fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2589 // fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2591 log_main("ghost: rename!");
2592 $ghost_user = $this->user[$ghost];
2594 if ($ghost_auth == FALSE) {
2595 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2596 $ghostname = 'ghost'.$sfx;
2597 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2598 if (strcmp("", $this->user[$i]->sess) == 0)
2601 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2606 if ($ghostname != '')
2610 $ghost_user->name = $ghostname;
2612 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2613 $this->standup_update($ghost_user);
2616 log_main("chatt_send pre table update");
2617 $this->table_update($ghost_user);
2618 log_main("chatt_send post table update");
2620 } // if ($ghost_auth == FALSE
2622 // FIXME: cacciare il vecchio utente room && table (if needed)
2623 $ghost_user->the_end = TRUE;
2624 $ghost_user->lacc = 0;
2625 $this->garbage_manager(TRUE);
2627 } // if ($ghost > -1) {
2632 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));
2634 $ret = $this->user[$real_idx];
2635 if (defined('CURL_DE_SAC_VERS')) {
2636 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2644 function standup_update($user)
2646 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2647 $user_cur = $this->user[$i];
2648 if ($user_cur->is_active() == FALSE)
2651 log_main("STANDUP START: ".$user_cur->stat);
2653 if ($user_cur->stat == 'room') {
2654 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2655 if ($user->idx_get() == $i) {
2656 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2658 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2660 $user_cur->step_inc();
2665 function dump_data()
2667 $brisk_ser = serialize($this);
2668 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2669 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2676 function standup_content($user)
2680 if ($user->stat != 'room')
2683 $content = ' j_stand_cont( [ ';
2685 $user_cur_id = $user->idx_get();
2686 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2687 if ($this->user[$i]->is_active() == FALSE // is not active user
2688 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2689 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2692 $flags = $this->user[$i]->flags;
2694 // sql record exists AND last donate > 2013-01-01
2695 if ($this->user[$i]->is_supp_custom()) {
2696 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2702 if ($this->user[$i]->subst == "standup") {
2703 if ($user_cur_id == $i) {
2707 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2708 xcape($this->user[$i]->name), $supp_comp_s);
2717 function table_content($user, $table_idx)
2723 // Si possono usare i dati nella classe table
2726 $sess = $user->sess;
2727 $table = $this->table[$table_idx];
2729 if ($user->stat != 'room')
2732 $user_cur_id = $user->idx_get();
2734 for ($i = 0 ; $i < $table->player_n ; $i++) {
2735 $user_cur = $this->user[$table->player[$i]];
2737 $flags = $user_cur->flags;
2739 if ($user_cur_id == $table->player[$i])
2742 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2743 if ($user_cur->is_supp_custom())
2744 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2748 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2749 xcape($user_cur->name), $supp_comp_s);
2754 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2759 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2761 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2763 // printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2765 // fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2766 if ($this->black_check($addr)) {
2767 // TODO: waiting async 5 sec before close
2768 // fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2771 if ($path != "" && $path != "index.php") {
2772 if ($this->cloud_check($addr)) {
2773 // TODO: waiting async 5 sec before close
2778 $enc = get_encoding($header);
2779 if (isset($header['User-Agent'])) {
2780 if (strstr($header['User-Agent'], "MSIE")) {
2781 $transp_type = "htmlfile";
2784 $transp_type = "xhr";
2788 $transp_type = "iframe";
2790 force_no_cache($header_out);
2796 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2797 $content = ob_get_contents();
2800 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2801 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2805 case "index_wr.php":
2807 // Enhance required: in the POST case, after the header you must get content
2808 // from the socket, waiting if necessary
2812 index_wr_main($this, $addr, $get, $post, $cookie);
2813 $content = ob_get_contents();
2816 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2820 case "index_rd.php":
2821 case "index_rd_wss.php":
2822 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2824 if ($transp == 'websocket' || $transp == 'websocketsec')
2828 if (!isset($cookie['sess'])
2829 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2831 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2833 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2838 $this->sess_cur_set($user->sess);
2839 // close a previous opened index_read_ifra socket, if exists
2840 if (($prev = $user->rd_socket_get()) != NULL) {
2841 $s_a_p->socks_unset($user->rd_socket_get());
2842 fclose($user->rd_socket_get());
2843 // printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2844 $user->rd_socket_set(NULL);
2848 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2849 $response = headers_render($header_out, -1).$user->chunked_content($content);
2850 $response_l = mb_strlen($response, "ASCII");
2852 $wret = @fwrite($new_socket, $response, $response_l);
2853 if ($wret < $response_l) {
2854 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2855 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2858 $user->rd_cache_set("");
2860 fflush($new_socket);
2863 $s_a_p->socks_set($new_socket, $user, NULL);
2864 $user->rd_socket_set($new_socket);
2865 // printf(" - qui ci siamo - ");
2872 if (!(BRISK_DEBUG & DBG_ENGI))
2874 fprintf(STDERR, "TEST.PHP running\n");
2875 if (isset($post['data'])) {
2876 $content = $post['data'];
2879 $content = "NO DATA AVAILABLE";
2881 $header_out['Content-Type'] = 'text/plain';
2882 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2886 /* FAR TODO: move all into an array of registered sub-apps */
2887 $subs = "briskin5/";
2888 $subs_l = strlen($subs);
2889 if (!strncmp($path, $subs, $subs_l)) {
2890 $ret = Bin5::request_mgr($s_a_p, $header, $header_out, $new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2899 function match_add($idx, $match)
2901 $this->match[$idx] = $match;
2904 function match_del($idx)
2906 unset($this->match[$idx]);
2909 function match_get($idx, $token)
2911 if (isset($this->match[$idx])) {
2913 || $token == $this->match[$idx]->table_token) {
2914 return ($this->match[$idx]);
2919 function sess_cur_set($sess)
2921 static::$sess_cur = $sess;
2924 static function sess_cur_get()
2926 return(static::$sess_cur);
2928 } // end class Brisk
2930 function make_seed()
2932 list($usec, $sec) = explode(' ', microtime());
2933 return (float) $sec + ((float) $usec * 100000);
2936 function btrace_line($ar)
2938 GLOBAL $G_btrace_pref_sub;
2941 for ($i = 0 ; $i < count($ar) ; $i++) {
2942 $with_class = isset($ar[$i]['class']);
2943 $with_file = isset($ar[$i]['file']);
2944 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2945 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2946 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2947 ($with_file ? $ar[$i]['line'] : ""));
2953 function trace_ftok($id, $add)
2955 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2956 $tok=@ftok($id, $add);
2958 log_shme($tok.": ".$id." + ".$add);
2963 function log_mop($step, $log)
2967 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2970 $sess = Brisk::sess_cur_get();
2971 if (isset($sess) == FALSE)
2976 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2979 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2980 $btrace = btrace_line(debug_backtrace());
2983 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2984 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2989 function log_step($log)
2993 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2996 $sess = Brisk::sess_cur_get();
2997 if (isset($sess) == FALSE)
3002 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
3005 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3006 $btrace = btrace_line(debug_backtrace());
3009 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
3010 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3017 function log_cds($log)
3021 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
3024 $sess = Brisk::sess_cur_get();
3025 if (isset($sess) == FALSE)
3030 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
3033 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3034 $btrace = btrace_line(debug_backtrace());
3037 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
3038 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3044 function log_only2($log)
3048 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
3051 $sess = Brisk::sess_cur_get();
3052 if (isset($sess) == FALSE)
3057 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
3060 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3061 $btrace = btrace_line(debug_backtrace());
3064 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3065 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3070 function log_crit($log)
3074 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
3077 $sess = Brisk::sess_cur_get();
3078 if (isset($sess) == FALSE)
3083 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
3086 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3087 $btrace = btrace_line(debug_backtrace());
3090 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3091 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3096 function log_only($log)
3100 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
3103 $sess = Brisk::sess_cur_get();
3104 if (isset($sess) == FALSE)
3109 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3112 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3113 $btrace = btrace_line(debug_backtrace());
3116 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3117 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3122 function log_main($log)
3126 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3129 $sess = Brisk::sess_cur_get();
3130 if (isset($sess) == FALSE)
3135 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3138 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3139 $btrace = btrace_line(debug_backtrace());
3142 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3143 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3148 function log_rd($log)
3152 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3155 $sess = Brisk::sess_cur_get();
3156 if (isset($sess) == FALSE)
3161 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3164 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3165 $btrace = btrace_line(debug_backtrace());
3168 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3169 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3174 function log_rd2($log)
3178 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3181 $sess = Brisk::sess_cur_get();
3182 if (isset($sess) == FALSE)
3187 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3190 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3191 $btrace = btrace_line(debug_backtrace());
3195 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3196 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3201 function log_send($log)
3205 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3208 $sess = Brisk::sess_cur_get();
3209 if (isset($sess) == FALSE)
3214 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3217 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3218 $btrace = btrace_line(debug_backtrace());
3221 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3222 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3227 function log_lock($log)
3231 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3234 $sess = Brisk::sess_cur_get();
3235 if (isset($sess) == FALSE)
3240 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3243 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3244 $btrace = btrace_line(debug_backtrace());
3247 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3248 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3253 function log_wr($log)
3257 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3260 $sess = Brisk::sess_cur_get();
3261 if (isset($sess) == FALSE)
3266 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3269 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3270 $btrace = btrace_line(debug_backtrace());
3273 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3274 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3279 function log_load($log)
3283 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3286 $sess = Brisk::sess_cur_get();
3287 if (isset($sess) == FALSE)
3292 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3295 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3296 $btrace = btrace_line(debug_backtrace());
3299 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3300 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3305 function log_auth($sess, $log)
3309 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3312 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3315 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3316 $btrace = btrace_line(debug_backtrace());
3319 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3320 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3325 function log_shme($log)
3329 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3332 $sess = Brisk::sess_cur_get();
3333 if (isset($sess) == FALSE)
3338 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3341 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3342 $btrace = btrace_line(debug_backtrace());
3345 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3346 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3353 // function log_legal($curtime, $sess, $name, $where, $mesg)
3354 function log_legal($curtime, $addr, $user, $where, $mesg)
3356 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3357 /* Unix time | session | nickname | IP | where was | mesg */
3358 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, ($user ? $user->sess : "NOSESS"),
3359 ($user ? ($user->is_auth() ? 'A' : 'N') : "U"),
3360 ($user ? $user->name : "NO-USER"), $addr, $where , $mesg));
3365 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3370 if ($sitted < PLAYERS_N) {
3378 if ($table == $cur_table)
3385 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3390 function show_notify($text, $tout, $butt, $w, $h)
3392 log_main("SHOW_NOTIFY: ".$text);
3393 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3396 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3398 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3399 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);
3402 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3404 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3407 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3408 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3411 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3412 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);
3416 function root_welcome($user)
3418 GLOBAL $root_wellarr, $G_lang;
3422 $dt = date("H:i ", $curtime);
3424 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3425 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3432 function validate_sess($sess)
3434 if (strlen($sess) == SESS_LEN)
3440 function validate_name($name)
3442 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3444 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3446 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3453 function playsound($name)
3455 return (sprintf('g_jukebox.play("%s");', $name));
3458 function secstoword($secs)
3464 $mins = floor($secs / 60);
3466 if ($G_lang == 'en') {
3468 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3471 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3475 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3478 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3483 function sharedmem_sz($tok)
3485 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3486 log_main("shmop_open failed");
3489 $shm_sz = shmop_size($shm_id);
3490 shmop_close($shm_id);
3492 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3499 static function lock_data($is_exclusive)
3501 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3502 self::$delta_t = microtime(TRUE);
3503 log_lock("LOCK warrant [".self::$delta_t."]");
3511 static function unlock_data($res)
3515 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3524 static function lock_data($is_exclusive)
3526 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3527 self::$delta_t = microtime(TRUE);
3528 log_lock("LOCK poll [".self::$delta_t."]");
3536 static function unlock_data($res)
3540 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3546 function carousel_top()
3551 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));
3554 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>'));
3558 function login_consistency($name)
3561 if (($len = mb_strlen($name)) > 12) {
3565 for ($i = 0 ; $i < mb_strlen($name) ; $i++) {
3566 $c = mb_substr($name, $i, 1);
3567 if (mb_ereg_match ("[a-zA-Z0-9]", $c)) {