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', 3600);
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 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
93 require_once("${G_base}Obj/ipclass.phh");
95 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
96 'en' => 'back standing' ),
97 'btn_close' => array( 'it' => 'chiudi',
100 'tit_all' => array( 'it' => 'tutti',
103 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
104 'en' => '<br>You are being idle for ' ),
105 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
106 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
107 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
108 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
109 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
110 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
111 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
112 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
113 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
114 'en' => '<br>The entered password is not correct.<br><br>'),
115 'alarret' => array( 'it' => 'Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>.',
116 'en' => 'Alarm \\"<b>%s</b>\\" sent to <b>%s</b>.'),
117 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
118 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
119 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
120 'en' => '<b>To send a message you have to be authenticated.</b>'),
121 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
122 'en' => 'The nickname have to contain at least one letter or one number.'),
123 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
124 'en' => 'The nickname <b>%s</b> is already in use.'),
125 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
126 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
127 '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>',
128 '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 ???
129 'statunkn' => array( 'it' => 'Questo stato non esiste.',
130 'en' => 'This state don\'t exists.'),
131 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
132 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
133 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
134 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
136 'tit_onauth'=>array( 'it' => '(solo aut.)',
137 'en' => '(only aut.)'),
138 'tit_onisol'=>array( 'it' => '(isolam.to)',
139 'en' => '(isolation)'),
140 '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.',
141 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
143 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
144 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessarig per poter richiedere questa funzionalità.'),
145 'inf_self' => array( 'it' => 'Non puoi informarti su te stesso.',
146 'en' => 'EN Non puoi informarti su te stesso.'),
147 'inf_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
148 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
149 'inf_err' => array( 'it' => 'Error %d. Utilizzo: <b>/info <i><login></i></b>.',
150 'en' => 'Error %d. Usage: <b>/info <i><login></i></b>.')
153 $G_lng = langtolng($G_lang);
155 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
156 $G_brisk_version = "5.2.0";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info, vedere cosa pensano i tuoi amici degli altri utenti e ci sono i nuovi tavoli riservati per registrati e apprendisti.',
160 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
161 'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info,',
162 'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.',
163 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ) );
165 $G_room_help = array( 'it' => '
166 <div style=\\"text-align: left; padding: 8px;\\">
167 <b>Descrizione</b><br>
168 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
169 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
170 <b>Configurazione del browser.</b><br>
171 Occorre abilitare i cookies.<br>
173 <b>Uso del sito</b><br>
174 Potete sedervi a un tavolo o rimanere in piedi.<br>
175 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
178 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
179 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
180 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
181 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
182 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
183 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
185 <dt><b>Comandi della chat</b>
186 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
187 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
188 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
189 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
190 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
191 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
192 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
193 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
199 <div style=\\"text-align: left; padding: 8px;\\">
200 <b>EN Descrizione</b><br>
201 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
202 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
203 <b>Configurazione del browser.</b><br>
204 Occorre abilitare i cookies.<br>
206 <b>Uso del sito</b><br>
207 Potete sedervi a un tavolo o rimanere in piedi.<br>
208 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
211 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
212 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
213 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
214 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
215 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
216 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
218 <dt><b>Comandi della chat</b>
219 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
220 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
221 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
222 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
223 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
224 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
225 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
226 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
232 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
233 <div style=\\"text-align: left; padding: 8px;\\">
234 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
236 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
237 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
239 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
240 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
241 <li>Smart card di InfoCamere
244 <b>Per auto-garantisi occorre possedere:</b><br><br>
246 <li>il codice PIN della propria carta
247 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
250 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
252 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
253 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
254 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
255 diretta dell\' utente da parte dell\' amministratore.
260 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
261 <div style=\\"text-align: left; padding: 8px;\\">
262 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
264 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
265 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
267 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
268 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
271 <b>Per auto-garantisi occorre possedere:</b><br><br>
273 <li>il codice PIN della propria carta
274 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
277 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
279 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
280 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
281 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
282 diretta dell\' utente da parte dell\' amministratore.
289 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
293 $G_room_about = array( 'it' => '<br>
294 <div id=\\"header\\" class=\\"header\\">
295 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
296 briscola chiamata in salsa ajax
298 <br><b>version '.$G_brisk_version.'</b><br><br>
299 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
301 <div id=\\"header\\" class=\\"header\\">
302 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
303 declaration briscola in ajax sauce <b>(Beta)</b>
305 <br><b>version '.$G_brisk_version.'</b><br><br>
306 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
309 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
312 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
313 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
314 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
315 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
316 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
317 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
318 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
319 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
320 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
321 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
322 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
323 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
324 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
325 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
326 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
327 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
328 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
329 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
330 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
332 // $G_PG_cons_n = count($G_PG_cons);
333 // printf("N CONS: %d\n", $G_PG_cons_n);
335 /* printf("%d %d\n", count($voc), count($cons)); */
336 /* for ($i = 0 ; $i < 26 ; $i++) { */
337 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
339 /* printf(' "%s", ', chr(ord('a') + $i)); */
340 /* for ($e = 0 ; $e < 26 ; $e++) { */
341 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
343 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
350 return (ip2long($s));
355 return (long2ip($i));
358 function int2four($l)
360 if (PHP_INT_SIZE == 4)
363 return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
366 function four2int($s)
368 return ($s & 0xffffffff);
373 return int2four( ip2int($s) );
378 return int2ip( four2int($i) );
381 function nickserv_msg($dt, $msg) {
382 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
385 function passwd_gen($seed = NULL)
387 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
396 for ($sil = 0 ; $sil < 7 ; $sil++) {
397 if (($sil % 2) == 0) {
399 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
401 $old = mt_rand(0, $G_PG_vow_n-1);
402 $pw .= $G_PG_vow[$old];
405 $new = mt_rand(0, $G_PG_vow_n-1);
407 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
408 $pw .= $G_PG_vow[$new];
414 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
421 function cmd_return($val, $desc)
423 return array('val' => $val, 'desc' => $desc);
426 function cmd_serialize($attrs)
431 foreach ($attrs as $key => $value) {
432 $ret .= $sep . $key . '=' . urlencode($value);
438 function cmd_deserialize($cmd)
441 $a = explode('&', $cmd);
443 while ($i < count($a)) {
444 $b = split('=', $a[$i]);
445 $ret[urldecode($b[0])] = urldecode($b[1]);
456 function versions_cmp($v1, $v2)
458 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
462 $v1_ar = split('\.', $v1);
463 $v2_ar = split('\.', $v2);
465 $v2_ct = count($v2_ar);
467 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
468 if (($v2_ct - 1) < $i) {
471 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
472 if ($v1_ar[$i] != $v2_ar[$i]) {
473 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
482 // return string with IPV4 address
483 function addrtoipv4($addr)
485 $ipv4addr_arr = explode(':' , $addr);
486 if (isset($ipv4addr_arr[3])) {
487 $ipv4addr = $ipv4addr_arr[3];
497 for ($i = 0; $i < ob_get_level(); $i++)
499 ob_implicit_flush(1);
503 function force_no_cache(&$header_out)
505 $header_out['Pragma'] = 'no-cache, must-revalidate';
506 $header_out['Cache-Control'] = 'no-cache';
507 $header_out['Expires'] = '-1';
510 function file_lock($fname, $is_exclusive)
512 if (($res = @fopen($fname, "r+")) == FALSE) {
516 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
524 function file_unlock($res)
527 flock($res, LOCK_UN);
532 $escpush_from = array("\\", "\"");
533 $escpush_to = array("\\\\", "\\\"");
536 GLOBAL $escpush_from, $escpush_to;
538 return str_replace($escpush_from, $escpush_to, $s);
541 $escinp_from = array( "\"" );
542 $escinp_to = array( """ );
544 function escinput($s)
546 GLOBAL $escinp_from, $escinp_to;
548 return str_replace($escinp_from, $escinp_to, $s);
553 return htmlentities($s, ENT_COMPAT, "UTF-8");
556 function esclfhtml($s)
558 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
561 function langtolng($lang)
565 return ($G_lang == 'en' ? '-en' : '');
568 function csplitter($in, $sep)
574 for ($i = 0 ; $i < strlen($in) ; $i++) {
575 $ini = substr($in, $i, 1);
579 else if ($ini == $sep) {
598 $from = array ( '\\', '@', '|' );
599 $to = array ( '\\\\', '@', '¦' );
601 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
606 $from = array ( '\\', '|', "\t", "\n");
607 $to = array ( '\\\\', '\\|', "\\t", "\\n");
609 return (str_replace($from, $to, $s));
612 function xcapemesg($s)
614 $from = array ( "\n");
615 $to = array ( "\\n");
617 return (str_replace($from, $to, $s));
627 function getbyid($idx)
629 return ($this->el[$idx]);
632 function setbyid($idx, $v)
634 $this->el[$idx] = $v;
638 define('TABLE_AUTH_TY_PUBL', 0);
639 define('TABLE_AUTH_TY_APPR', 1);
640 define('TABLE_AUTH_TY_AUTH', 2);
641 define('TABLE_AUTH_TY_CERT', 3);
649 var $auth_type; // required authorization to sit down
656 var $table_start; // information field
664 function create($idx)
666 if (($thiz = new Table()) == FALSE)
670 $thiz->player = array();
673 if ($idx < TABLES_CERT_N)
674 $thiz->auth_type = TABLE_AUTH_TY_CERT;
675 else if ($idx < TABLES_AUTH_N)
676 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
677 else if ($idx < TABLES_APPR_N)
678 $thiz->auth_type = TABLE_AUTH_TY_APPR;
680 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
686 $thiz->table_token = "";
687 $thiz->table_start = 0;
689 $thiz->wakeup_time = 0;
696 $this->idx = $from->idx;
697 $this->player = array();
698 for ($i = 0 ; $i < $from->player_n ; $i++)
699 $this->player[$i] = $from->player[$i];
700 $this->player_n = $from->player_n;
702 log_main("PLAYER_N - parent::copy.".$this->player_n);
704 $this->auth_type = $from->auth_type;
706 $this->wag_own = $from->wag_own;
707 $this->wag_com = $from->wag_com;
708 $this->wag_tout = $from->wag_tout;
710 $this->table_token = $from->table_token;
711 $this->table_start = $from->table_start;
713 $this->wakeup_time = $from->wakeup_time;
716 function myclone($from)
718 if (($thiz = new Table()) == FALSE)
726 function spawn($from)
728 if (($thiz = new Table()) == FALSE)
731 $thiz->idx = $from->idx;
732 $thiz->player = array();
733 for ($i = 0 ; $i < $from->player_n ; $i++)
734 $thiz->player[$i] = $i;
735 $thiz->player_n = $from->player_n;
737 $thiz->auth_type = $from->auth_type;
739 $thiz->wag_own = $from->wag_own;
740 $thiz->wag_com = $from->wag_com;
741 $thiz->wag_tout = $from->wag_tout;
743 $thiz->table_token = $from->table_token;
744 $thiz->table_start = $from->table_start;
746 $thiz->wakeup_time = $from->wakeup_time;
751 function wag_set($user_idx, $mesg)
755 $this->wag_own = $user_idx;
756 $this->wag_com = $mesg;
760 function wag_reset($timeout)
762 log_main("WAG_RESET");
764 unset($this->wag_own);
767 $this->wag_tout = $timeout;
770 function player_get($idx)
772 return ($this->player[$idx]);
775 function player_set($idx, $player)
777 $this->player[$idx] = $player;
780 function user_add($idx)
782 $this->player[$this->player_n] = $idx;
785 return ($this->player_n - 1);
788 function user_rem($brisk, $user)
790 $tabpos = $user->table_pos;
792 /* verifico la consistenza dei dati */
793 if ($brisk->user[$this->player[$tabpos]] == $user) {
795 /* aggiorna l'array dei giocatori al tavolo. */
796 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
797 $this->player[$i] = $this->player[$i+1];
798 $user_cur = $brisk->user[$this->player[$i]];
799 $user_cur->table_pos = $i;
804 log_main("INCONSISTENCY ON TABLE.");
808 // Table->act_content - return 'id' of type of output required for table button
809 function act_content($user)
812 $isstanding = ($user->subst == 'standup');
813 $sitted = $this->player_n;
815 $cur_table = $user->table;
819 if ($sitted < PLAYERS_N) {
820 switch ($this->auth_type) {
821 case TABLE_AUTH_TY_CERT:
822 if ($user->is_cert() && !$user->is_appr())
827 case TABLE_AUTH_TY_AUTH:
828 if ($user->is_auth() && !$user->is_appr())
833 case TABLE_AUTH_TY_APPR:
834 if ($user->is_auth())
849 if ($table == $cur_table)
856 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
869 function Delay_Manager($triglevel)
871 $this->triglevel = $triglevel;
872 $this->delta = array();
873 $this->lastcheck = 0;
876 function delta_get($curtime)
878 // clean too old delta items
879 for ($i = 0 ; $i < count($this->delta) ; $i++) {
880 if ($this->delta[$i][0] < $curtime) {
881 array_splice($this->delta, $i, 1);
886 // add new delta items if delay exceeded $this->triglevel sec
887 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
888 $delta = $curtime - $this->lastcheck - $this->triglevel;
889 array_push($this->delta, array($curtime + $delta , $delta));
890 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
893 // extract the maximum valid delta
895 for ($i = 0 ; $i < count($this->delta) ; $i++) {
896 $delta_cur = $this->delta[$i][1];
897 if ($delta_max < $delta_cur)
898 $delta_max = $delta_cur;
901 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
906 function lastcheck_set($curtime)
908 $this->lastcheck = $curtime;
916 function Client_prefs()
920 static function from_user($user)
922 $thiz = new Client_prefs();
923 $thiz->user_load($user);
928 static function from_json($json)
930 $thiz = new Client_prefs();
931 if ($thiz->json_load($json) == FALSE) {
939 function user_load($user)
941 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
942 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
943 if ($user->rec != FALSE) {
944 $this->supp_comp = $user->rec->supp_comp_get();
947 $this->supp_comp = "000000000000";
950 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
953 function json_load($json_s)
958 if (gettype($json_s) == "string") {
959 if (($json = json_decode($json_s)) == FALSE)
965 if ($this->listen < 0 || $this->listen > 2)
967 $this->listen = $json->listen;
969 if (mb_strlen($json->supp_comp, "ASCII") != 12)
972 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
973 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
974 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
980 $this->supp_comp = $json->supp_comp;
987 function store($user, $is_save)
990 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
991 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
992 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
993 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
995 if ($user->is_supp_custom()) {
996 $user->rec->supp_comp_set($this->supp_comp);
999 $user->prefs_store();
1003 define('GHOST_SESS_TOUT', 1800);
1004 define('GHOST_SESS_REAS_LOUT', 1); // logout
1005 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
1006 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
1007 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
1008 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
1009 define('GHOST_SESS_REAS_PROX', 6); // proxy access
1017 function GhostSessEl($time, $sess, $reas)
1019 $this->time = $time + GHOST_SESS_TOUT;
1020 $this->sess = $sess;
1021 $this->reas = $reas;
1029 function GhostSess()
1031 $this->gs = array();
1034 // push or update for this session
1035 function push($time, $sess, $reas)
1037 foreach($this->gs as $el) {
1038 if ($el->sess == "$sess") {
1040 $el->time = $time + GHOST_SESS_TOUT;
1045 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1051 foreach($this->gs as $key => $el) {
1052 if ($el->sess == "$sess") {
1053 $ret = $this->gs[$key];
1054 unset($this->gs[$key]);
1061 function garbage_manager($curtime)
1063 foreach($this->gs as $key => $el) {
1064 if ($el->time < $curtime) {
1065 unset($this->gs[$key]);
1075 var $crystal_filename;
1079 var $comm; // commands for many people
1080 var $step; // current step of the comm array
1081 var $garbage_timeout;
1084 var $ban_list; // ban list (authized allowed)
1085 var $black_list; // black list (anti-dos, noone allowed)
1086 var $cloud_smasher; // list of cloud ip ranges to be rejected
1092 public static $sess_cur;
1100 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1101 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1102 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1103 fprintf(STDERR, "ROOM FROM FILE\n");
1104 rename($crystal_filename, $crystal_filename.".old");
1106 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1112 fprintf(STDERR, "NEW ROOM\n");
1113 $thiz = new Brisk();
1115 $thiz->crystal_filename = $crystal_filename;
1116 $thiz->user = array();
1117 $thiz->table = array();
1118 $thiz->match = array();
1120 $thiz->ban_list = IpClass::create();
1121 $thiz->black_list = IpClass::create();
1122 $thiz->cloud_smasher = IpClass::create();
1123 $thiz->ghost_sess = new GhostSess();
1125 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1126 $thiz->user[$i] = User::create($thiz, $i, "", "");
1129 for ($i = 0 ; $i < TABLES_N ; $i++) {
1130 $thiz->table[$i] = Table::create($i);
1132 $thiz->garbage_timeout = 0;
1133 $thiz->shm_sz = SHM_DIMS_MIN;
1135 $thiz->delay_mgr = new Delay_Manager(1.5);
1137 static::$sess_cur = FALSE;
1139 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1144 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1146 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1147 count($ban_list), count($black_list), count($cloud_smasher));
1149 if (defined('CURL_DE_SAC_VERS')) {
1150 if (brisk_cds_reload($this) == FALSE) {
1154 $this->ban_list->update($ban_list);
1155 $this->black_list->update($black_list);
1156 $this->cloud_smasher->update($cloud_smasher);
1159 $this->banned_kickoff();
1160 $this->garbage_manager(TRUE);
1164 function banned_kickoff()
1168 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1169 $table_cur = $this->table[$table_idx];
1170 // if the table is complete and exists we check users IP
1172 if ($table_cur->player_n == PLAYERS_N) {
1173 if (isset($this->match[$table_idx]) &&
1174 $table_cur->table_token == $bin5->table_token) {
1175 log_main("PLAYERS == N TABLE ".$table_idx);
1177 $bin5 = $this->match[$table_idx];
1179 $is_ban |= $bin5->banned_kickoff();
1184 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1185 $user_cur = $this->user[$i];
1187 if ($user_cur->is_active() == FALSE)
1190 // check if the IP is blacklisted
1191 if ($this->black_check($user_cur->ip) ||
1192 $this->cloud_check($user_cur->ip)) {
1193 $user_cur->lacc = 0;
1198 // if authorized not check if banlisted
1199 if ($user_cur->is_auth()) {
1203 if ($this->ban_check($user_cur->ip)) {
1204 $user_cur->lacc = 0;
1212 function ban_check($ip_str)
1214 return ($this->ban_list->check($ip_str));
1217 function black_check($ip_str)
1219 return ($this->black_list->check($ip_str));
1222 function cloud_check($ip_str)
1224 return ($this->cloud_smasher->check($ip_str));
1227 function users_cleanup()
1229 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1230 $user_cur = $this->user[$i];
1232 if ($user_cur->the_end) {
1233 $user_cur->reset(); // users_cleanup, OK
1238 function garbage_manager($force)
1240 GLOBAL $G_lang, $mlang_brisk, $G_base;
1244 log_rd2("garbage_manager START");
1246 /* Garbage collector degli utenti in timeout */
1247 $curtime = microtime(TRUE);
1249 $delta = $this->delay_mgr->delta_get($curtime);
1251 if (!$force && !($this->garbage_timeout < $curtime)) {
1252 $this->delay_mgr->lastcheck_set($curtime);
1256 // Before all align times with table timeout
1257 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1258 $table_cur = $this->table[$table_idx];
1259 // if the table is complete and exists its shared mem we get the info about users lacc
1261 if ($table_cur->player_n == PLAYERS_N) {
1262 log_main("PLAYERS == N TABLE ".$table_idx);
1265 $no_recovery = FALSE;
1266 if (isset($this->match[$table_idx])) {
1267 $bin5 = $this->match[$table_idx];
1269 if ($table_cur->table_token != $bin5->table_token) {
1270 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1271 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1272 $no_recovery = TRUE;
1276 if ($bin5 != FALSE) {
1280 log_main("garbage_manager: bri loaded successfully.");
1281 $bin5->garbage_manager(TRUE);
1283 $bin5_table = $bin5->table[0];
1285 // is the end of the table
1287 if ($bin5->the_end == TRUE) {
1289 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1291 log_main("garbage_manager: INSIDE THE END.");
1293 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1294 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1295 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1298 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1299 // stat must be "table" by definition
1300 $user_cur = $this->user[$table_cur->player[$i]];
1301 $bin5_user = $bin5->user[$i];
1303 $user_cur->subst = $bin5_user->subst;
1304 $user_cur->rd_step = $bin5_user->rd_step;
1305 $user_cur->step = $bin5_user->step;
1306 $user_cur->lacc = $bin5_user->lacc;
1307 $user_cur->laccwr = $bin5_user->lacc;
1308 $user_cur->bantime = $bin5_user->bantime;
1309 $user_cur->the_end = $bin5_user->the_end;
1310 if ($user_cur->the_end) {
1311 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1315 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1317 $this->room_join_wakeup($user_cur, FALSE, 0);
1318 $table_cur->table_token = "";
1319 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1321 $this->match_del($table_idx);
1324 log_main("gm:: save_data");
1326 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1327 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1330 } // if ($bin5 == FALSE
1331 else if ($no_recovery == FALSE) {
1332 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1334 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1335 $user_cur = $this->user[$table_cur->player[$i]];
1336 $user_cur->subst = "shutdowner";
1337 $user_cur->step_inc();
1339 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1340 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1341 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1342 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1343 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1344 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1345 $user_cur->step_inc();
1348 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1349 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1350 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1352 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1354 $this->room_join_wakeup($user_cur, TRUE, -2);
1355 $table_cur->table_token = "";
1358 } // if ($table_cur->player_n == PLAYERS_N) {
1359 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1361 log_rd2("out new loop.");
1363 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1364 $user_cur = $this->user[$i];
1366 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1368 if ($user_cur->is_active() == FALSE)
1371 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1372 // Auto logout dell'utente
1373 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1375 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1376 $user_cur->the_end = TRUE;
1378 log_rd2("AUTO LOGOUT.");
1379 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1380 log_auth($user_cur->sess, "Autologout session.");
1382 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1383 $this->room_wakeup($user_cur);
1384 else if ($user_cur->subst == 'standup')
1385 $this->room_outstandup($user_cur);
1387 log_rd2("LOGOUT FROM WHAT ???");
1391 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1392 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1393 $this->room_wakeup($user_cur);
1394 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1395 /* 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" */
1396 $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);
1397 $user_cur->step_inc();
1401 log_rd2("GARBAGE UPDATED!");
1403 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1406 $this->ghost_sess->garbage_manager($curtime);
1408 $this->delay_mgr->lastcheck_set($curtime);
1412 function show_room($user_step, $user)
1414 GLOBAL $G_lang, $mlang_brisk;
1415 log_main("show_room: username: ".$user->name);
1417 $ret = sprintf('gst.st = %d; ', $user_step);
1419 $prefs = Client_prefs::from_user($user);
1420 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1423 if ($user->flags & USER_FLAG_ISOLAUTH) {
1424 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1426 else if ($user->flags & USER_FLAG_LISTAUTH) {
1427 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1430 $ret .= 'list_set(\'all\', false, \'\' ); ';
1434 if ($user->subst == 'standup')
1435 $ret .= "tra.show(); ";
1437 $ret .= "tra.hide(); ";
1439 $ret .= sprintf('stat = "%s";', $user->stat);
1441 $ret .= root_welcome($user);
1442 if ($user->flags & USER_FLAG_DBFAILED) {
1443 $ret .= "gst.st = ".($user->step+1)."; ";
1444 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1447 $ret .= sprintf('subst = "%s";', $user->subst);
1448 $ret .= $user->myname_innerHTML();
1450 for ($i = 0 ; $i < TABLES_N ; $i++) {
1452 $ret .= $this->table_content($user, $i);
1454 $ret .= $this->table[$i]->act_content($user);
1455 if ($this->table[$i]->wag_own != -1)
1456 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1458 $ret .= sprintf('tra.rem(%d); ', $i);
1460 $ret .= $this->standup_content($user);
1461 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1466 function room_wakeup($user)
1468 $table_idx = $user->table;
1469 $table = $this->table[$table_idx];
1471 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1475 $from_table = ($user->stat == "table");
1477 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1479 for ($i = 0 ; $i < $table->player_n ; $i++) {
1480 $user_cur = $this->user[$table->player[$i]];
1481 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1483 if ($user->idx_get() != $table->player[$i]) {
1484 $user_cur->stat_set("room");
1485 $user_cur->subst = "sitdown";
1486 $user_cur->laccwr = $curtime;
1488 else if ($user->is_active()) {
1489 $user_cur->stat_set("room");
1490 $user_cur->subst = "standup";
1491 $user_cur->laccwr = $curtime;
1492 $user_cur->table = -1;
1497 $user->stat_set("room");
1498 $user->subst = "standup";
1499 $user->laccwr = $curtime;
1502 $remove_wagon = FALSE;
1503 if($table->wag_own == $user->idx_get()) {
1504 $table->wag_reset($curtime);
1505 $remove_wagon = TRUE;
1508 /* aggiorna l'array dei giocatori al tavolo. */
1509 $table->user_rem($this, $user);
1511 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1512 $user_cur = $this->user[$i];
1513 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1516 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1518 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1519 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1520 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1521 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1522 log_main("DOCUMENT.index.php: from table");
1524 else if ($user_cur->stat == "room") {
1525 log_main("DOCUMENT.index.php: from table");
1527 $ret .= $this->table_content($user_cur, $table_idx);
1528 $ret .= $this->standup_content($user_cur);
1530 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1531 $ret .= $table->act_content($user);
1533 if ($user->idx_get() == $i) {
1534 // set the new status
1535 $ret .= 'subst = "standup"; tra.show(); ';
1536 // clean the action buttons in other tables
1537 for ($e = 0 ; $e < TABLES_N ; $e++) {
1538 if ($this->table[$e]->player_n < PLAYERS_N) {
1539 $ret .= $this->table[$e]->act_content($user);
1544 $ret .= $table->act_content($user_cur);
1547 log_wr("ROOM_WAKEUP: ".$ret);
1548 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1549 $user_cur->step_inc();
1553 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1555 $table_idx = $user->table;
1556 $table = $this->table[$table_idx];
1558 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1561 $user_wup = array();
1563 $user_tab = array();
1565 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1567 for ($i = 0 ; $i < $table->player_n ; $i++) {
1568 $user_cur = $this->user[$table->player[$i]];
1569 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1570 if ($user_cur->is_empty()) {
1573 if ($update_lacc == TRUE) {
1574 $user_cur->laccwr = $curtime;
1576 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1577 if ($user_cur->subst == "shutdowned") {
1578 $user_cur->stat_set("room");
1579 $user_cur->subst = "sitdown";
1581 else if ($user_cur->subst == "shutdowner") {
1582 $user_cur->stat_set("room");
1583 $user_cur->subst = "standup";
1584 $user_cur->table = -1;
1585 $user_wup[$user_wup_n++] = $user_cur;
1587 $remove_wagon = FALSE;
1588 if($table->wag_own == $table->player[$i]) {
1589 $remove_wagon = TRUE;
1590 $table->wag_reset($curtime);
1593 $user_tab[$user_tab_n++] = $table->player[$i];
1596 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1597 $table->user_rem($this, $user_wup[$wup_idx]);
1599 /* aggiorna l'array dei giocatori al tavolo. */
1601 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1602 log_main("START LOOP");
1603 $user_cur = $this->user[$i];
1604 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1605 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1610 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1612 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1613 if ($user_cur->stat == "room") {
1614 log_main("DOCUMENT.index.php from table");
1616 $ret .= $this->table_content($user_cur, $table_idx);
1617 $ret .= $this->standup_content($user_cur);
1619 $ret .= $table->act_content($user_cur);
1622 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1623 if ($user_tab[$tab_idx] == $i)
1626 // for users that wakeup the room will be reconstructed by index_rd.php
1627 if ($tab_idx < $user_tab_n) {
1628 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1630 // ARRAY_POP DISABLED
1631 // if ($trans_delta == 0)
1632 // while (array_pop($user_cur->comm) != NULL);
1634 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1635 $user_cur->comm[$user_cur->step % COMM_N] = "";
1636 $user_cur->step_inc();
1637 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1638 $user_cur->step_inc();
1639 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1643 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1645 log_main("JOIN_WAKEUP more");
1647 $ret .= $table->act_content($user_cur);
1649 log_main("JOIN_WAKEUP end more");
1651 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1652 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1653 $user_cur->step_inc();
1658 function info_show($user, $target, $dt)
1660 if success return assoc. array with "ret" => 0 and other fields
1661 else return an assoc. array with "ret: != 0 and "mesg" with an error description
1663 function info_show($user, $target, $dt)
1665 GLOBAL $G_lang, $mlang_brisk, $G_base;
1672 if ($target == "") {
1676 if (($bdb = BriskDB::create()) == FALSE) {
1680 if ($target == $user->name) {
1682 $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
1685 if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
1689 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1690 $guar_login = $guar_item->login_get();
1695 $user_tos_vers = $user_item->tos_vers_get();
1697 $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code);
1699 $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code);
1700 $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code);
1701 $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code);
1702 $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code);
1704 if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code,
1705 $widefriend, $narrowfriend)) == FALSE) {
1706 $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code,
1707 $widefriend, $narrowfriend);
1710 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1711 $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target));
1713 else if ($guar_login == "") {
1714 $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
1718 if ($ret > 0 && $mesg == "") {
1719 $mesg = sprintf($mlang_brisk['inf_err'][$G_lang], $ret);
1723 $jret = json_encode(array("ret" => $ret, "mesg" => $mesg));
1726 $jret = json_encode(array("ret" => 0,
1729 // FIXME: state internationalization
1731 ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
1732 ($user_item->type & USER_FLAG_TY_CERT ? "Certificato" :
1733 ($user_item->type & (USER_FLAG_TY_NORM | USER_FLAG_TY_SUPER) ?
1734 "Normale" : "Stato sconosciuto"))),
1735 "guar" => ($user_item->type & USER_FLAG_TY_APPR ?
1737 "party" => $partyskill,
1738 "match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) ,
1739 "game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt),
1740 "friend" => usersnet_friend_getlabel($usersnet_item->friend),
1741 "skill" => $usersnet_item->skill,
1742 "trust" => $usersnet_item->trust,
1743 "widefriend" => $usersnet_item->widefriend,
1744 "narrowfriend" => $usersnet_item->narrowfriend
1751 function info_save($user, $json_s)
1753 GLOBAL $G_lang, $mlang_brisk, $G_base;
1761 if (($json = json_decode($json_s)) == FALSE) {
1766 if (($bdb = BriskDB::create()) == FALSE) {
1771 if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) {
1772 $ret = 4000 + $subret;
1780 function room_outstandup($user)
1782 $this->room_sitdown($user, -1);
1785 function table_update($user)
1787 log_main("table_update: pre - USER: ".$user->name);
1789 $table_idx = $user->table;
1791 if ($table_idx > -1)
1792 $table = $this->table[$table_idx];
1794 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1796 $user_cur = $this->user[$i];
1797 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1800 $ret = "gst.st = ".($user_cur->step+1)."; ";
1801 if ($table_idx > -1)
1802 $ret .= $this->table_content($user_cur, $table_idx);
1804 if ($user->idx_get() == $i) {
1805 $ret .= $user->myname_innerHTML();
1807 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1808 $user_cur->step_inc();
1811 log_main("table_update: post");
1814 function room_sitdown($user, $table_idx)
1816 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1820 if ($table_idx > -1 && $table_idx < TABLES_N) {
1821 $table = $this->table[$table_idx];
1824 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1825 for ($i = 0 ; $i < TABLES_N ; $i++) {
1826 if ($table->wag_own == $table->player[$i]) {
1827 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1828 $table->wag_reset(time());
1835 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1837 $user_cur = $this->user[$i];
1838 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1841 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1842 if ($table_idx > -1)
1843 $ret .= $this->table_content($user_cur, $table_idx);
1844 $ret .= $this->standup_content($user_cur);
1846 if ($user->idx_get() == $i) {
1847 $ret .= 'subst = "sitdown"; tra.hide(); ';
1848 // clean the action buttons in other tables
1849 for ($e = 0 ; $e < TABLES_N ; $e++) {
1850 $ret .= $this->table[$e]->act_content($user_cur);
1853 else if ($table_idx > -1) {
1854 if ($table->player_n == PLAYERS_N) {
1856 $ret .= $table->act_content($user_cur);
1859 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1860 $user_cur->step_inc();
1864 function kickuser($user, $out_reas)
1868 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1870 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1872 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1873 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1874 $bin5 = &$this->match[$user->table];
1875 $user_bin5 = &$bin5->user[$user->table_pos];
1876 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1877 $bin5->table_wakeup($user_bin5);
1878 $user->the_end = TRUE;
1879 $this->room_wakeup($user);
1883 if ($user->stat == 'table' || $user->stat == 'room') {
1884 $user->the_end = TRUE;
1885 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1886 $this->room_wakeup($user);
1888 else if ($user->subst == 'standup') {
1889 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1890 $this->room_outstandup($user);
1893 log_rd2("LOGOUT FROM WHAT ???");
1898 function kickuser_by_name($name, $out_reas)
1900 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1901 $user_out = $this->user[$i];
1902 if (strcmp($user_out->name, $name) == 0) {
1903 return ($this->kickuser($user_out, $out_reas));
1909 function kickuser_by_sess($sess, $out_reas)
1911 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1912 $user_out = $this->user[$i];
1913 if (strcmp($user_out->sess, $sess) == 0) {
1914 return ($this->kickuser($user_out, $out_reas));
1920 function kickuser_by_idx($idx, $out_reas)
1922 $user_out = $this->user[$idx];
1923 return ($this->kickuser($user_out, $out_reas));
1926 function chatt_send($user, $mesg)
1928 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1931 fprintf(STDERR, "WE ARE HERE: [%s]\n", $mesg);
1934 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1936 $dt = date("H:i ", $curtime);
1947 $is_normchat = FALSE;
1948 /* for old isolation management $is_ticker = FALSE; */
1949 $update_room = FALSE;
1951 if (strcmp($msg, "/tav") == 0 ||
1952 strncmp($msg, "/tav ", 5) == 0) {
1954 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1955 /* 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>" */
1956 $msg = $mlang_brisk['tickmust'][$G_lang];
1957 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1962 $table = $this->table[$user->table];
1964 if ($table->wag_own != -1) {
1965 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1966 $msg = $mlang_brisk['tickjust'][$G_lang];
1967 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1972 $dtime = $curtime - $table->wag_tout;
1973 if ($dtime < EXPIRE_TIME_WAG) {
1974 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1975 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1976 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1977 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1982 $msg = substr($msg, 5);
1984 $table->wag_set($user->idx_get(), $msg);
1985 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1986 $to_room = $to_user;
1987 /* for old isolation management $is_ticker = TRUE; */
1989 } // /tav chat command
1990 // just for development use currently
1991 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1992 fprintf(STDERR, "MOP OUT\n");
1993 $target = substr($msg, 5);
1994 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1996 else if (strncmp($msg, "/alarm ", 7) == 0) {
1997 if (strncmp($msg, "/alarm to ", 10) == 0) {
1998 $sp_pos = strpos($msg, " ", 10);
1999 $target = substr($msg, 10, $sp_pos - 10);
2000 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
2004 $alarm_check = "/alarm ".$G_alarm_passwd." ";
2007 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
2008 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
2009 $msg = $mlang_brisk['alarpass'][$G_lang];
2010 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
2015 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
2016 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
2017 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
2018 $to_user = nickserv_msg($dt, $prestr);
2020 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
2021 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
2022 /* MLANG: "chiudi" */
2023 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
2025 } // /alarm chat command
2026 else if (strncmp($msg, "/listen ", 8) == 0) {
2027 $arg = substr($msg, 8);
2029 if (strcasecmp($arg, "isolation") == 0) {
2031 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
2032 $user->table >= TABLES_AUTH_N) {
2033 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
2037 $user->flags &= ~USER_FLAG_MAP_AUTH;
2038 $user->flags |= USER_FLAG_ISOLAUTH;
2039 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
2042 else if (strcasecmp($arg, "auth") == 0) {
2043 $flags_old = $user->flags;
2044 $user->flags &= ~USER_FLAG_MAP_AUTH;
2045 $user->flags |= USER_FLAG_LISTAUTH;
2046 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
2049 $flags_old = $user->flags;
2050 $user->flags &= ~USER_FLAG_MAP_AUTH;
2051 $to_user = 'list_set(\'all\', true, \'\'); ';
2054 // if from isolation redraw standup area
2055 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
2056 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
2060 else if (strcmp($msg, "/authreq") == 0) {
2061 if ($user->is_cert()) {
2062 $to_user = sprintf('authbox(300,200);');
2065 /* 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." */
2066 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
2069 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
2070 if ($user->is_auth()) {
2071 $to_user = sprintf('mesgtoadmbox(500,300);');
2074 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
2075 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
2078 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
2079 log_main("chatt_send BEGIN");
2082 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2083 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2087 $msg = "COMMAND ".$msg;
2088 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2089 $user_cur = $this->user[$i];
2091 if ($user_cur->is_active() == FALSE)
2093 if (strcasecmp($user_cur->name,$name_new) == 0)
2096 if ($i < MAX_PLAYERS) {
2097 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2098 $to_user = nickserv_msg($dt, $prestr);
2102 /* 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>" */
2103 if ($user->is_auth()) {
2104 if (strcasecmp($user->name,$name_new) != 0) {
2105 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2106 ($user->subst == 'standup' ||
2107 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2110 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2111 for ($i = 0 ; $i < TABLES_N ; $i++) {
2112 $to_user .= $this->table[$i]->act_content($user);
2116 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2121 $user->name = $name_new; // OK - nick changed
2122 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2123 if ( ! $user->is_auth() ) {
2124 if (($bdb = BriskDB::create()) != FALSE) {
2126 /* 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>" */
2127 if ($bdb->login_exists(strtolower($name_new))) {
2128 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2129 $to_user .= nickserv_msg($dt, $prestr);
2134 log_main("chatt_send start set");
2136 $update_room = TRUE;
2138 } // nick chat command
2139 else if (strncmp($msg, "/info ", 6) == 0) {
2140 $info_user = substr($msg, 6);
2142 echo $this->info_show($user, urldecode($info_user), $dt);
2144 else if (strncmp($msg, "/st ", 4) == 0) {
2145 log_main("chatt_send BEGIN");
2148 $st_str = substr($msg, 4);
2150 if (strcasecmp($st_str, "normale") == 0) {
2151 $st = USER_FLAG_S_NORM;
2153 else if (strcasecmp($st_str, "pausa") == 0) {
2154 $st = USER_FLAG_S_PAU;
2156 else if (strcasecmp($st_str, "fuori") == 0) {
2157 $st = USER_FLAG_S_OUT;
2159 else if (strcasecmp($st_str, "cane") == 0) {
2160 $st = USER_FLAG_S_DOG;
2162 else if (strcasecmp($st_str, "cibo") == 0) {
2163 $st = USER_FLAG_S_EAT;
2165 else if (strcasecmp($st_str, "lavoro") == 0) {
2166 $st = USER_FLAG_S_WRK;
2168 else if (strcasecmp($st_str, "sigaretta") == 0) {
2169 $st = USER_FLAG_S_SMK;
2171 else if (strcasecmp($st_str, "presente") == 0) {
2172 $st = USER_FLAG_S_EYE;
2174 else if (strcasecmp($st_str, "coniglio") == 0) {
2175 $st = USER_FLAG_S_RABB;
2177 else if (strcasecmp($st_str, "calcio") == 0) {
2178 $st = USER_FLAG_S_SOCC;
2180 else if (strcasecmp($st_str, "pupo") == 0) {
2181 $st = USER_FLAG_S_BABY;
2183 else if (strcasecmp($st_str, "pulizie") == 0) {
2184 $st = USER_FLAG_S_MOP;
2186 else if (strcasecmp($st_str, "babbo") == 0) {
2187 $st = USER_FLAG_S_BABBO;
2189 else if (strcasecmp($st_str, "renna") == 0) {
2190 $st = USER_FLAG_S_RENNA;
2192 else if (strcasecmp($st_str, "pupazzo") == 0) {
2193 $st = USER_FLAG_S_PUPAZ;
2195 else if (strcasecmp($st_str, "vischio") == 0) {
2196 $st = USER_FLAG_S_VISCH;
2199 /* MLANG: "Questo stato non esiste." */
2200 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2204 log_main("chatt_send start set");
2205 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2206 $update_room = TRUE;
2207 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2210 } // nick chat command
2212 else { // normal chat line
2213 $is_normchat = TRUE;
2214 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2216 $user->chat_dlt = $user->chat_dlt * 2;
2217 if ($user->chat_dlt > 120)
2218 $user->chat_dlt = 120;
2220 else if ($user->chat_lst == $msg)
2222 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2223 $user->chat_ban = $curtime;
2224 $user->chat_dlt = 5;
2228 $user->chat_ban = 0;
2229 $user->chat_dlt = 0;
2233 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2236 // TEMPORARY DISABLED UNTIL test user option will be available
2237 // if ( TRUE && (!$user->is_auth() || $user->is_appr()) ) {
2238 if (!$user->is_auth()) {
2239 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2240 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2242 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2243 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2244 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2246 $auguri = sprintf("%s auguri %s %s.",
2247 $aug_head[mt_rand(0, count($aug_head)-1)],
2248 $aug_body[mt_rand(0, count($aug_body)-1)],
2249 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2251 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2256 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2257 // temporary silentiation for troll (will became array check)
2258 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2259 $to_room = $to_user;
2263 log_legal($curtime, $user->ip, $user,
2264 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2266 $user->chat_lst = "$msg";
2267 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2277 // Output to clients
2280 if ($to_user != FALSE) {
2281 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2282 $user->comm[$user->step % COMM_N] .= $to_user;
2286 if ($to_room != FALSE) {
2287 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2288 $user_cur = $this->user[$i];
2289 if ($target != "" && $user_cur->name != $target)
2291 if ($user_cur->is_active() == FALSE // is not active user
2292 || $user_cur->stat == 'table' // or stat is 'table'
2293 || $user->idx_get() == $i) // or the $user idx is equal to current var
2296 if ($is_normchat == TRUE) {
2297 // use MAP_AUTH to check if auth or isolation
2298 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2299 if ( ! $user->is_auth() ) {
2305 else if ($is_ticker) {
2306 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2307 if ($user->table >= TABLES_AUTH_N)
2312 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2313 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2314 $user_cur->step_inc();
2319 // FIXME BRISK4: include for each kind of table
2320 require_once("${G_base}briskin5/Obj/briskin5.phh");
2321 // Before all align times with table timeout
2322 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2323 if (isset($this->match[$table_idx])) {
2324 $bin5 = $this->match[$table_idx];
2326 $bin5_table = $bin5->table[0];
2327 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2328 // stat must be "table" by definition
2329 $bin5_user = $bin5->user[$i];
2331 if ($target != "" && $bin5_user->name != $target)
2333 log_main("writa: ".$user_mesg);
2334 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2335 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2336 $bin5_user->step_inc();
2338 } // if (isset($this->match
2339 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2340 } // if ($to_tabl == true ...
2343 if ($user->stat == 'room' && $user->subst == 'standup') {
2344 $this->standup_update($user);
2346 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2347 log_main("chatt_send pre table update");
2348 $this->table_update($user);
2349 log_main("chatt_send post table update");
2351 } // if ($update_room ...
2354 } // function chatt_send( ...
2356 function get_user($sess, &$idx)
2360 if (validate_sess($sess)) {
2361 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2362 if ($this->user[$i]->is_empty())
2364 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2367 $ret = $this->user[$i];
2371 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2372 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2373 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2376 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2383 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2386 * if ($idx > -1 && ret == FALSE) => duplicated nick
2387 * if ($idx == -2 && ret == FALSE) => invalid name
2388 * if ($idx == -3 && ret == FALSE) => wrong password
2389 * if ($idx == -1 && ret == FALSE) => no space left
2390 * if ($idx == 0 && ret == user) => SUCCESS
2391 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2394 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2400 $authenticate = FALSE;
2402 $login_exists = FALSE;
2404 $ghost_auth = FALSE;
2409 if (($name_new = validate_name($name)) == FALSE) {
2414 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2415 if (validate_sess($sess) == FALSE)
2418 /* if pass != FALSE verify the login with pass */
2419 log_auth("XXX", "auth1");
2421 if (($bdb = BriskDB::create()) != FALSE) {
2423 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2424 log_auth("XXX", "auth2");
2425 $authenticate = $bdb->login_verify(strtolower($name_new), $pass, $code);
2426 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2428 if ($authenticate != FALSE) {
2429 $user_type = $authenticate->type_get();
2437 $login_exists = $bdb->login_exists(strtolower($name_new));
2441 // if db is down, send a warning and verify only current users
2442 // no actions at this moment
2444 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2446 if ($this->user[$i]->is_empty()) {
2447 if ($idfree == -1) {
2452 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2457 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2458 if ($authenticate != FALSE) {
2460 $ghost_auth = $this->user[$i]->is_auth();
2471 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2473 /* there is another user logged with your account and you and him have authenticated => new user
2474 get the session of the old user */
2475 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2478 $ghost_user = $this->user[$ghost];
2480 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2481 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2482 $ghost_user->step_inc();
2485 $ghost_user->sess = $sess;
2488 $ghost_user->sess = $sess;
2491 // If user at the table we need to update the table data too
2492 $table_idx = $ghost_user->table;
2493 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2494 require_once("${G_base}briskin5/Obj/briskin5.phh");
2495 if (isset($this->match[$table_idx])) {
2496 $bin5 = $this->match[$table_idx];
2498 if ($bin5->the_end != TRUE) {
2499 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2500 $bin5->user[$ghost_user->table_pos]->step_inc();
2501 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2507 if (defined('CURL_DE_SAC_VERS')) {
2508 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2510 return ($this->user[$ghost]);
2512 else if ($idx != -1 && $i == MAX_PLAYERS) {
2517 $this->user[$idx]->sess = $sess;
2520 $this->user[$idx]->sess = $sess;
2522 $this->user[$idx]->name = $name_new; // OK - add new user
2523 $this->user[$idx]->stat_set("room");
2524 $this->user[$idx]->step_set(0);
2525 while (array_pop($this->user[$idx]->comm) != NULL);
2526 $this->user[$idx]->subst = "standup";
2527 $this->user[$idx]->lacc = $curtime;
2528 $this->user[$idx]->laccwr = $curtime;
2529 $this->user[$idx]->bantime = 0;
2530 $this->user[$idx]->ip = $ip;
2532 $this->user[$idx]->rec = $authenticate;
2533 $this->user[$idx]->flags = $user_type;
2534 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2535 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2536 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2538 if ($authenticate != FALSE) {
2539 $this->user[$idx]->code = $authenticate->code_get();
2541 // all this part is included in the db server
2542 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2544 if (isset($cookie['CO_list'])) {
2545 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2546 if (strcmp($cookie['CO_list'], "auth") == 0) {
2547 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2548 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2550 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2551 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2552 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2555 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2560 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2563 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2565 log_main("ghost: rename!");
2566 $ghost_user = $this->user[$ghost];
2568 if ($ghost_auth == FALSE) {
2569 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2570 $ghostname = 'ghost'.$sfx;
2571 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2572 if (strcmp("", $this->user[$i]->sess) == 0)
2575 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2580 if ($ghostname != '')
2584 $ghost_user->name = $ghostname;
2586 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2587 $this->standup_update($ghost_user);
2590 log_main("chatt_send pre table update");
2591 $this->table_update($ghost_user);
2592 log_main("chatt_send post table update");
2594 } // if ($ghost_auth == FALSE
2596 // FIXME: cacciare il vecchio utente room && table (if needed)
2597 $ghost_user->the_end = TRUE;
2598 $ghost_user->lacc = 0;
2599 $this->garbage_manager(TRUE);
2601 } // if ($ghost > -1) {
2606 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));
2608 $ret = $this->user[$real_idx];
2609 if (defined('CURL_DE_SAC_VERS')) {
2610 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2618 function standup_update($user)
2620 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2621 $user_cur = $this->user[$i];
2622 if ($user_cur->is_active() == FALSE)
2625 log_main("STANDUP START: ".$user_cur->stat);
2627 if ($user_cur->stat == 'room') {
2628 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2629 if ($user->idx_get() == $i) {
2630 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2632 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2634 $user_cur->step_inc();
2639 function dump_data()
2641 $brisk_ser = serialize($this);
2642 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2643 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2650 function standup_content($user)
2654 if ($user->stat != 'room')
2657 $content = ' j_stand_cont( [ ';
2659 $user_cur_id = $user->idx_get();
2660 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2661 if ($this->user[$i]->is_active() == FALSE // is not active user
2662 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2663 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2666 $flags = $this->user[$i]->flags;
2668 // sql record exists AND last donate > 2013-01-01
2669 if ($this->user[$i]->is_supp_custom()) {
2670 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2676 if ($this->user[$i]->subst == "standup") {
2677 if ($user_cur_id == $i) {
2681 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2682 xcape($this->user[$i]->name), $supp_comp_s);
2691 function table_content($user, $table_idx)
2697 // Si possono usare i dati nella classe table
2700 $sess = $user->sess;
2701 $table = $this->table[$table_idx];
2703 if ($user->stat != 'room')
2706 $user_cur_id = $user->idx_get();
2708 for ($i = 0 ; $i < $table->player_n ; $i++) {
2709 $user_cur = $this->user[$table->player[$i]];
2711 $flags = $user_cur->flags;
2713 if ($user_cur_id == $table->player[$i])
2716 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2717 if ($user_cur->is_supp_custom())
2718 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2722 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2723 xcape($user_cur->name), $supp_comp_s);
2728 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2733 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2735 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2737 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2739 fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2740 if ($this->black_check($addr)) {
2741 // TODO: waiting async 5 sec before close
2742 fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2745 if ($path != "" && $path != "index.php") {
2746 if ($this->cloud_check($addr)) {
2747 // TODO: waiting async 5 sec before close
2752 $enc = get_encoding($header);
2753 if (isset($header['User-Agent'])) {
2754 if (strstr($header['User-Agent'], "MSIE")) {
2755 $transp_type = "htmlfile";
2758 $transp_type = "xhr";
2762 $transp_type = "iframe";
2764 force_no_cache($header_out);
2770 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2771 $content = ob_get_contents();
2774 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2775 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2779 case "index_wr.php":
2781 // Enhance required: in the POST case, after the header you must get content
2782 // from the socket, waiting if necessary
2786 index_wr_main($this, $addr, $get, $post, $cookie);
2787 $content = ob_get_contents();
2790 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2794 case "index_rd.php":
2795 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2797 if ($transp == 'websocket')
2801 if (!isset($cookie['sess'])
2802 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2804 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2806 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2811 $this->sess_cur_set($user->sess);
2812 // close a previous opened index_read_ifra socket, if exists
2813 if (($prev = $user->rd_socket_get()) != NULL) {
2814 $s_a_p->socks_unset($user->rd_socket_get());
2815 fclose($user->rd_socket_get());
2816 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2817 $user->rd_socket_set(NULL);
2821 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2822 $response = headers_render($header_out, -1).$user->chunked_content($content);
2823 $response_l = mb_strlen($response, "ASCII");
2825 $wret = @fwrite($new_socket, $response, $response_l);
2826 if ($wret < $response_l) {
2827 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2828 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2831 $user->rd_cache_set("");
2833 fflush($new_socket);
2836 $s_a_p->socks_set($new_socket, $user, NULL);
2837 $user->rd_socket_set($new_socket);
2838 printf(" - qui ci siamo - ");
2845 if (!(BRISK_DEBUG & DBG_ENGI))
2847 fprintf(STDERR, "TEST.PHP running\n");
2848 if (isset($post['data'])) {
2849 $content = $post['data'];
2852 $content = "NO DATA AVAILABLE";
2854 $header_out['Content-Type'] = 'text/plain';
2855 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2859 /* FAR TODO: move all into an array of registered sub-apps */
2860 $subs = "briskin5/";
2861 $subs_l = strlen($subs);
2862 if (!strncmp($path, $subs, $subs_l)) {
2863 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2872 function match_add($idx, $match)
2874 $this->match[$idx] = $match;
2877 function match_del($idx)
2879 unset($this->match[$idx]);
2882 function match_get($idx, $token)
2884 if (isset($this->match[$idx])) {
2886 || $token == $this->match[$idx]->table_token) {
2887 return ($this->match[$idx]);
2892 function sess_cur_set($sess)
2894 static::$sess_cur = $sess;
2897 static function sess_cur_get()
2899 return(static::$sess_cur);
2901 } // end class Brisk
2903 function make_seed()
2905 list($usec, $sec) = explode(' ', microtime());
2906 return (float) $sec + ((float) $usec * 100000);
2909 function btrace_line($ar)
2911 GLOBAL $G_btrace_pref_sub;
2914 for ($i = 0 ; $i < count($ar) ; $i++) {
2915 $with_class = isset($ar[$i]['class']);
2916 $with_file = isset($ar[$i]['file']);
2917 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2918 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2919 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2920 ($with_file ? $ar[$i]['line'] : ""));
2926 function trace_ftok($id, $add)
2928 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2929 $tok=@ftok($id, $add);
2931 log_shme($tok.": ".$id." + ".$add);
2936 function log_mop($step, $log)
2940 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2943 $sess = Brisk::sess_cur_get();
2944 if (isset($sess) == FALSE)
2949 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2952 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2953 $btrace = btrace_line(debug_backtrace());
2956 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2957 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2962 function log_step($log)
2966 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2969 $sess = Brisk::sess_cur_get();
2970 if (isset($sess) == FALSE)
2975 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2978 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2979 $btrace = btrace_line(debug_backtrace());
2982 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2983 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2990 function log_cds($log)
2994 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2997 $sess = Brisk::sess_cur_get();
2998 if (isset($sess) == FALSE)
3003 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
3006 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3007 $btrace = btrace_line(debug_backtrace());
3010 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
3011 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3017 function log_only2($log)
3021 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 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_ONL2) == 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."/brisk.log", 'a')) != FALSE) {
3038 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3043 function log_crit($log)
3047 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
3050 $sess = Brisk::sess_cur_get();
3051 if (isset($sess) == FALSE)
3056 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
3059 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3060 $btrace = btrace_line(debug_backtrace());
3063 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3064 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3069 function log_only($log)
3073 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
3076 $sess = Brisk::sess_cur_get();
3077 if (isset($sess) == FALSE)
3082 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3085 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3086 $btrace = btrace_line(debug_backtrace());
3089 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3090 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3095 function log_main($log)
3099 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3102 $sess = Brisk::sess_cur_get();
3103 if (isset($sess) == FALSE)
3108 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3111 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3112 $btrace = btrace_line(debug_backtrace());
3115 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3116 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3121 function log_rd($log)
3125 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3128 $sess = Brisk::sess_cur_get();
3129 if (isset($sess) == FALSE)
3134 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3137 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3138 $btrace = btrace_line(debug_backtrace());
3141 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3142 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3147 function log_rd2($log)
3151 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3154 $sess = Brisk::sess_cur_get();
3155 if (isset($sess) == FALSE)
3160 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3163 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3164 $btrace = btrace_line(debug_backtrace());
3168 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3169 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3174 function log_send($log)
3178 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 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_SEND) == 0)
3190 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3191 $btrace = btrace_line(debug_backtrace());
3194 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3195 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3200 function log_lock($log)
3204 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3207 $sess = Brisk::sess_cur_get();
3208 if (isset($sess) == FALSE)
3213 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3216 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3217 $btrace = btrace_line(debug_backtrace());
3220 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3221 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3226 function log_wr($log)
3230 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3233 $sess = Brisk::sess_cur_get();
3234 if (isset($sess) == FALSE)
3239 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3242 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3243 $btrace = btrace_line(debug_backtrace());
3246 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3247 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3252 function log_load($log)
3256 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3259 $sess = Brisk::sess_cur_get();
3260 if (isset($sess) == FALSE)
3265 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3268 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3269 $btrace = btrace_line(debug_backtrace());
3272 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3273 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3278 function log_auth($sess, $log)
3282 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3285 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3288 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3289 $btrace = btrace_line(debug_backtrace());
3292 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3293 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3298 function log_shme($log)
3302 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3305 $sess = Brisk::sess_cur_get();
3306 if (isset($sess) == FALSE)
3311 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3314 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3315 $btrace = btrace_line(debug_backtrace());
3318 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3319 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3326 // function log_legal($curtime, $sess, $name, $where, $mesg)
3327 function log_legal($curtime, $addr, $user, $where, $mesg)
3330 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3331 /* Unix time | session | nickname | IP | where was | mesg */
3332 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3333 ($user->is_auth() ? 'A' : 'N'),
3334 $user->name, $addr, $where , $mesg));
3339 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3344 if ($sitted < PLAYERS_N) {
3352 if ($table == $cur_table)
3359 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3364 function show_notify($text, $tout, $butt, $w, $h)
3366 log_main("SHOW_NOTIFY: ".$text);
3367 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3370 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3372 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3373 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);
3376 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3378 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3381 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3382 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3385 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3386 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);
3390 function root_welcome($user)
3392 GLOBAL $root_wellarr, $G_lang;
3396 $dt = date("H:i ", $curtime);
3398 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3399 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3406 function validate_sess($sess)
3408 if (strlen($sess) == SESS_LEN)
3414 function validate_name($name)
3416 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3418 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3420 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3427 function playsound($filename)
3429 return (sprintf('playsound("flasou", "%s");', $filename));
3432 function secstoword($secs)
3438 $mins = floor($secs / 60);
3440 if ($G_lang == 'en') {
3442 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3445 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3449 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3452 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3457 function sharedmem_sz($tok)
3459 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3460 log_main("shmop_open failed");
3463 $shm_sz = shmop_size($shm_id);
3464 shmop_close($shm_id);
3466 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3473 static function lock_data($is_exclusive)
3475 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3476 self::$delta_t = microtime(TRUE);
3477 log_lock("LOCK warrant [".self::$delta_t."]");
3485 static function unlock_data($res)
3489 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3498 static function lock_data($is_exclusive)
3500 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3501 self::$delta_t = microtime(TRUE);
3502 log_lock("LOCK poll [".self::$delta_t."]");
3510 static function unlock_data($res)
3514 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3520 function carousel_top()
3525 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));
3528 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>'));
3532 function login_consistency($name)
3535 if (($len = mb_strlen($name)) > 12) {
3539 for ($i = 0 ; $i < mb_strlen($name) ; $i++) {
3540 $c = mb_substr($name, $i, 1);
3541 if (mb_ereg_match ("[a-zA-Z0-9]", $c)) {