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.1.3";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: comando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti, info su numero di mani e di partite.',
160 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
161 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: ENcomando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti.',
162 'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
164 $G_room_help = array( 'it' => '
165 <div style=\\"text-align: left; padding: 8px;\\">
166 <b>Descrizione</b><br>
167 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
168 <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>
169 <b>Configurazione del browser.</b><br>
170 Occorre abilitare i cookies.<br>
172 <b>Uso del sito</b><br>
173 Potete sedervi a un tavolo o rimanere in piedi.<br>
174 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
177 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>
178 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
179 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
180 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
181 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
182 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.
184 <dt><b>Comandi della chat</b>
185 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
186 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
187 <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\\"
188 <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
189 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
190 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
191 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
192 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
198 <div style=\\"text-align: left; padding: 8px;\\">
199 <b>EN Descrizione</b><br>
200 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
201 <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>
202 <b>Configurazione del browser.</b><br>
203 Occorre abilitare i cookies.<br>
205 <b>Uso del sito</b><br>
206 Potete sedervi a un tavolo o rimanere in piedi.<br>
207 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
210 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>
211 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
212 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
213 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
214 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
215 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.
217 <dt><b>Comandi della chat</b>
218 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
219 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
220 <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\\"
221 <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
222 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
223 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
224 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
225 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
231 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
232 <div style=\\"text-align: left; padding: 8px;\\">
233 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
235 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
236 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
238 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
239 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
240 <li>Smart card di InfoCamere
243 <b>Per auto-garantisi occorre possedere:</b><br><br>
245 <li>il codice PIN della propria carta
246 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
249 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
251 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
252 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
253 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
254 diretta dell\' utente da parte dell\' amministratore.
259 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
260 <div style=\\"text-align: left; padding: 8px;\\">
261 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
263 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
264 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
266 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
267 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
270 <b>Per auto-garantisi occorre possedere:</b><br><br>
272 <li>il codice PIN della propria carta
273 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
276 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
278 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
279 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
280 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
281 diretta dell\' utente da parte dell\' amministratore.
288 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
292 $G_room_about = array( 'it' => '<br>
293 <div id=\\"header\\" class=\\"header\\">
294 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
295 briscola chiamata in salsa ajax
297 <br><b>version '.$G_brisk_version.'</b><br><br>
298 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
300 <div id=\\"header\\" class=\\"header\\">
301 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
302 declaration briscola in ajax sauce <b>(Beta)</b>
304 <br><b>version '.$G_brisk_version.'</b><br><br>
305 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
308 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
311 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
312 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
313 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
314 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
315 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
316 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
317 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
318 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
319 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
320 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
321 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
322 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
323 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
324 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
325 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
326 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
327 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
328 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
329 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
331 // $G_PG_cons_n = count($G_PG_cons);
332 // printf("N CONS: %d\n", $G_PG_cons_n);
334 /* printf("%d %d\n", count($voc), count($cons)); */
335 /* for ($i = 0 ; $i < 26 ; $i++) { */
336 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
338 /* printf(' "%s", ', chr(ord('a') + $i)); */
339 /* for ($e = 0 ; $e < 26 ; $e++) { */
340 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
342 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
349 return (ip2long($s));
354 return (long2ip($i));
357 function int2four($l)
359 if (PHP_INT_SIZE == 4)
362 return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
365 function four2int($s)
367 return ($s & 0xffffffff);
372 return int2four( ip2int($s) );
377 return int2ip( four2int($i) );
380 function nickserv_msg($dt, $msg) {
381 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
384 function passwd_gen($seed = NULL)
386 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
395 for ($sil = 0 ; $sil < 7 ; $sil++) {
396 if (($sil % 2) == 0) {
398 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
400 $old = mt_rand(0, $G_PG_vow_n-1);
401 $pw .= $G_PG_vow[$old];
404 $new = mt_rand(0, $G_PG_vow_n-1);
406 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
407 $pw .= $G_PG_vow[$new];
413 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
420 function cmd_return($val, $desc)
422 return array('val' => $val, 'desc' => $desc);
425 function cmd_serialize($attrs)
430 foreach ($attrs as $key => $value) {
431 $ret .= $sep . $key . '=' . urlencode($value);
437 function cmd_deserialize($cmd)
440 $a = explode('&', $cmd);
442 while ($i < count($a)) {
443 $b = split('=', $a[$i]);
444 $ret[urldecode($b[0])] = urldecode($b[1]);
455 function versions_cmp($v1, $v2)
457 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
461 $v1_ar = split('\.', $v1);
462 $v2_ar = split('\.', $v2);
464 $v2_ct = count($v2_ar);
466 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
467 if (($v2_ct - 1) < $i) {
470 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
471 if ($v1_ar[$i] != $v2_ar[$i]) {
472 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
481 // return string with IPV4 address
482 function addrtoipv4($addr)
484 $ipv4addr_arr = explode(':' , $addr);
485 if (isset($ipv4addr_arr[3])) {
486 $ipv4addr = $ipv4addr_arr[3];
496 for ($i = 0; $i < ob_get_level(); $i++)
498 ob_implicit_flush(1);
502 function force_no_cache(&$header_out)
504 $header_out['Pragma'] = 'no-cache, must-revalidate';
505 $header_out['Cache-Control'] = 'no-cache';
506 $header_out['Expires'] = '-1';
509 function file_lock($fname, $is_exclusive)
511 if (($res = @fopen($fname, "r+")) == FALSE) {
515 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
523 function file_unlock($res)
526 flock($res, LOCK_UN);
531 $escpush_from = array("\\", "\"");
532 $escpush_to = array("\\\\", "\\\"");
535 GLOBAL $escpush_from, $escpush_to;
537 return str_replace($escpush_from, $escpush_to, $s);
540 $escinp_from = array( "\"" );
541 $escinp_to = array( """ );
543 function escinput($s)
545 GLOBAL $escinp_from, $escinp_to;
547 return str_replace($escinp_from, $escinp_to, $s);
552 return htmlentities($s, ENT_COMPAT, "UTF-8");
555 function esclfhtml($s)
557 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
560 function langtolng($lang)
564 return ($G_lang == 'en' ? '-en' : '');
567 function csplitter($in, $sep)
573 for ($i = 0 ; $i < strlen($in) ; $i++) {
574 $ini = substr($in, $i, 1);
578 else if ($ini == $sep) {
597 $from = array ( '\\', '@', '|' );
598 $to = array ( '\\\\', '@', '¦' );
600 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
605 $from = array ( '\\', '|', "\t", "\n");
606 $to = array ( '\\\\', '\\|', "\\t", "\\n");
608 return (str_replace($from, $to, $s));
611 function xcapemesg($s)
613 $from = array ( "\n");
614 $to = array ( "\\n");
616 return (str_replace($from, $to, $s));
626 function getbyid($idx)
628 return ($this->el[$idx]);
631 function setbyid($idx, $v)
633 $this->el[$idx] = $v;
637 define('TABLE_AUTH_TY_PUBL', 0);
638 define('TABLE_AUTH_TY_APPR', 1);
639 define('TABLE_AUTH_TY_AUTH', 2);
640 define('TABLE_AUTH_TY_CERT', 3);
648 var $auth_type; // required authorization to sit down
655 var $table_start; // information field
663 function create($idx)
665 if (($thiz = new Table()) == FALSE)
669 $thiz->player = array();
672 if ($idx < TABLES_CERT_N)
673 $thiz->auth_type = TABLE_AUTH_TY_CERT;
674 else if ($idx < TABLES_AUTH_N)
675 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
676 else if ($idx < TABLES_APPR_N)
677 $thiz->auth_type = TABLE_AUTH_TY_APPR;
679 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
685 $thiz->table_token = "";
686 $thiz->table_start = 0;
688 $thiz->wakeup_time = 0;
695 $this->idx = $from->idx;
696 $this->player = array();
697 for ($i = 0 ; $i < $from->player_n ; $i++)
698 $this->player[$i] = $from->player[$i];
699 $this->player_n = $from->player_n;
701 log_main("PLAYER_N - parent::copy.".$this->player_n);
703 $this->auth_type = $from->auth_type;
705 $this->wag_own = $from->wag_own;
706 $this->wag_com = $from->wag_com;
707 $this->wag_tout = $from->wag_tout;
709 $this->table_token = $from->table_token;
710 $this->table_start = $from->table_start;
712 $this->wakeup_time = $from->wakeup_time;
715 function myclone($from)
717 if (($thiz = new Table()) == FALSE)
725 function spawn($from)
727 if (($thiz = new Table()) == FALSE)
730 $thiz->idx = $from->idx;
731 $thiz->player = array();
732 for ($i = 0 ; $i < $from->player_n ; $i++)
733 $thiz->player[$i] = $i;
734 $thiz->player_n = $from->player_n;
736 $thiz->auth_type = $from->auth_type;
738 $thiz->wag_own = $from->wag_own;
739 $thiz->wag_com = $from->wag_com;
740 $thiz->wag_tout = $from->wag_tout;
742 $thiz->table_token = $from->table_token;
743 $thiz->table_start = $from->table_start;
745 $thiz->wakeup_time = $from->wakeup_time;
750 function wag_set($user_idx, $mesg)
754 $this->wag_own = $user_idx;
755 $this->wag_com = $mesg;
759 function wag_reset($timeout)
761 log_main("WAG_RESET");
763 unset($this->wag_own);
766 $this->wag_tout = $timeout;
769 function player_get($idx)
771 return ($this->player[$idx]);
774 function player_set($idx, $player)
776 $this->player[$idx] = $player;
779 function user_add($idx)
781 $this->player[$this->player_n] = $idx;
784 return ($this->player_n - 1);
787 function user_rem($brisk, $user)
789 $tabpos = $user->table_pos;
791 /* verifico la consistenza dei dati */
792 if ($brisk->user[$this->player[$tabpos]] == $user) {
794 /* aggiorna l'array dei giocatori al tavolo. */
795 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
796 $this->player[$i] = $this->player[$i+1];
797 $user_cur = $brisk->user[$this->player[$i]];
798 $user_cur->table_pos = $i;
803 log_main("INCONSISTENCY ON TABLE.");
807 // Table->act_content - return 'id' of type of output required for table button
808 function act_content($user)
811 $isstanding = ($user->subst == 'standup');
812 $sitted = $this->player_n;
814 $cur_table = $user->table;
818 if ($sitted < PLAYERS_N) {
819 switch ($this->auth_type) {
820 case TABLE_AUTH_TY_CERT:
821 if ($user->is_cert() && !$user->is_appr())
826 case TABLE_AUTH_TY_AUTH:
827 if ($user->is_auth() && !$user->is_appr())
832 case TABLE_AUTH_TY_APPR:
833 if ($user->is_auth())
848 if ($table == $cur_table)
855 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
868 function Delay_Manager($triglevel)
870 $this->triglevel = $triglevel;
871 $this->delta = array();
872 $this->lastcheck = 0;
875 function delta_get($curtime)
877 // clean too old delta items
878 for ($i = 0 ; $i < count($this->delta) ; $i++) {
879 if ($this->delta[$i][0] < $curtime) {
880 array_splice($this->delta, $i, 1);
885 // add new delta items if delay exceeded $this->triglevel sec
886 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
887 $delta = $curtime - $this->lastcheck - $this->triglevel;
888 array_push($this->delta, array($curtime + $delta , $delta));
889 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
892 // extract the maximum valid delta
894 for ($i = 0 ; $i < count($this->delta) ; $i++) {
895 $delta_cur = $this->delta[$i][1];
896 if ($delta_max < $delta_cur)
897 $delta_max = $delta_cur;
900 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
905 function lastcheck_set($curtime)
907 $this->lastcheck = $curtime;
915 function Client_prefs()
919 static function from_user($user)
921 $thiz = new Client_prefs();
922 $thiz->user_load($user);
927 static function from_json($json)
929 $thiz = new Client_prefs();
930 if ($thiz->json_load($json) == FALSE) {
938 function user_load($user)
940 fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
941 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
942 if ($user->rec != FALSE) {
943 $this->supp_comp = $user->rec->supp_comp_get();
946 $this->supp_comp = "000000000000";
949 fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
952 function json_load($json_s)
957 if (gettype($json_s) == "string") {
958 if (($json = json_decode($json_s)) == FALSE)
964 if ($this->listen < 0 || $this->listen > 2)
966 $this->listen = $json->listen;
968 if (mb_strlen($json->supp_comp, "ASCII") != 12)
971 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
972 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
973 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
979 $this->supp_comp = $json->supp_comp;
986 function store($user, $is_save)
989 fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
990 $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
991 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
992 fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
994 if ($user->is_supp_custom()) {
995 $user->rec->supp_comp_set($this->supp_comp);
998 $user->prefs_store();
1002 define('GHOST_SESS_TOUT', 1800);
1003 define('GHOST_SESS_REAS_LOUT', 1); // logout
1004 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
1005 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
1006 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
1007 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
1008 define('GHOST_SESS_REAS_PROX', 6); // proxy access
1016 function GhostSessEl($time, $sess, $reas)
1018 $this->time = $time + GHOST_SESS_TOUT;
1019 $this->sess = $sess;
1020 $this->reas = $reas;
1028 function GhostSess()
1030 $this->gs = array();
1033 // push or update for this session
1034 function push($time, $sess, $reas)
1036 foreach($this->gs as $el) {
1037 if ($el->sess == "$sess") {
1039 $el->time = $time + GHOST_SESS_TOUT;
1044 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1050 foreach($this->gs as $key => $el) {
1051 if ($el->sess == "$sess") {
1052 $ret = $this->gs[$key];
1053 unset($this->gs[$key]);
1060 function garbage_manager($curtime)
1062 foreach($this->gs as $key => $el) {
1063 if ($el->time < $curtime) {
1064 unset($this->gs[$key]);
1074 var $crystal_filename;
1078 var $comm; // commands for many people
1079 var $step; // current step of the comm array
1080 var $garbage_timeout;
1083 var $ban_list; // ban list (authized allowed)
1084 var $black_list; // black list (anti-dos, noone allowed)
1085 var $cloud_smasher; // list of cloud ip ranges to be rejected
1091 public static $sess_cur;
1099 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1100 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1101 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1102 fprintf(STDERR, "ROOM FROM FILE\n");
1103 rename($crystal_filename, $crystal_filename.".old");
1105 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1111 fprintf(STDERR, "NEW ROOM\n");
1112 $thiz = new Brisk();
1114 $thiz->crystal_filename = $crystal_filename;
1115 $thiz->user = array();
1116 $thiz->table = array();
1117 $thiz->match = array();
1119 $thiz->ban_list = IpClass::create();
1120 $thiz->black_list = IpClass::create();
1121 $thiz->cloud_smasher = IpClass::create();
1122 $thiz->ghost_sess = new GhostSess();
1124 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1125 $thiz->user[$i] = User::create($thiz, $i, "", "");
1128 for ($i = 0 ; $i < TABLES_N ; $i++) {
1129 $thiz->table[$i] = Table::create($i);
1131 $thiz->garbage_timeout = 0;
1132 $thiz->shm_sz = SHM_DIMS_MIN;
1134 $thiz->delay_mgr = new Delay_Manager(1.5);
1136 static::$sess_cur = FALSE;
1138 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1143 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1145 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1146 count($ban_list), count($black_list), count($cloud_smasher));
1148 if (defined('CURL_DE_SAC_VERS')) {
1149 if (brisk_cds_reload($this) == FALSE) {
1153 $this->ban_list->update($ban_list);
1154 $this->black_list->update($black_list);
1155 $this->cloud_smasher->update($cloud_smasher);
1158 $this->banned_kickoff();
1159 $this->garbage_manager(TRUE);
1163 function banned_kickoff()
1167 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1168 $table_cur = $this->table[$table_idx];
1169 // if the table is complete and exists we check users IP
1171 if ($table_cur->player_n == PLAYERS_N) {
1172 if (isset($this->match[$table_idx]) &&
1173 $table_cur->table_token == $bin5->table_token) {
1174 log_main("PLAYERS == N TABLE ".$table_idx);
1176 $bin5 = $this->match[$table_idx];
1178 $is_ban |= $bin5->banned_kickoff();
1183 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1184 $user_cur = $this->user[$i];
1186 if ($user_cur->is_active() == FALSE)
1189 // check if the IP is blacklisted
1190 if ($this->black_check($user_cur->ip) ||
1191 $this->cloud_check($user_cur->ip)) {
1192 $user_cur->lacc = 0;
1197 // if authorized not check if banlisted
1198 if ($user_cur->is_auth()) {
1202 if ($this->ban_check($user_cur->ip)) {
1203 $user_cur->lacc = 0;
1211 function ban_check($ip_str)
1213 return ($this->ban_list->check($ip_str));
1216 function black_check($ip_str)
1218 return ($this->black_list->check($ip_str));
1221 function cloud_check($ip_str)
1223 return ($this->cloud_smasher->check($ip_str));
1226 function users_cleanup()
1228 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1229 $user_cur = $this->user[$i];
1231 if ($user_cur->the_end) {
1232 $user_cur->reset(); // users_cleanup, OK
1237 function garbage_manager($force)
1239 GLOBAL $G_lang, $mlang_brisk, $G_base;
1243 log_rd2("garbage_manager START");
1245 /* Garbage collector degli utenti in timeout */
1246 $curtime = microtime(TRUE);
1248 $delta = $this->delay_mgr->delta_get($curtime);
1250 if (!$force && !($this->garbage_timeout < $curtime)) {
1251 $this->delay_mgr->lastcheck_set($curtime);
1255 // Before all align times with table timeout
1256 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1257 $table_cur = $this->table[$table_idx];
1258 // if the table is complete and exists its shared mem we get the info about users lacc
1260 if ($table_cur->player_n == PLAYERS_N) {
1261 log_main("PLAYERS == N TABLE ".$table_idx);
1264 $no_recovery = FALSE;
1265 if (isset($this->match[$table_idx])) {
1266 $bin5 = $this->match[$table_idx];
1268 if ($table_cur->table_token != $bin5->table_token) {
1269 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1270 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1271 $no_recovery = TRUE;
1275 if ($bin5 != FALSE) {
1279 log_main("garbage_manager: bri loaded successfully.");
1280 $bin5->garbage_manager(TRUE);
1282 $bin5_table = $bin5->table[0];
1284 // is the end of the table
1286 if ($bin5->the_end == TRUE) {
1288 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1290 log_main("garbage_manager: INSIDE THE END.");
1292 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1293 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1294 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1297 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1298 // stat must be "table" by definition
1299 $user_cur = $this->user[$table_cur->player[$i]];
1300 $bin5_user = $bin5->user[$i];
1302 $user_cur->subst = $bin5_user->subst;
1303 $user_cur->rd_step = $bin5_user->rd_step;
1304 $user_cur->step = $bin5_user->step;
1305 $user_cur->lacc = $bin5_user->lacc;
1306 $user_cur->laccwr = $bin5_user->lacc;
1307 $user_cur->bantime = $bin5_user->bantime;
1308 $user_cur->the_end = $bin5_user->the_end;
1309 if ($user_cur->the_end) {
1310 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1314 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1316 $this->room_join_wakeup($user_cur, FALSE, 0);
1317 $table_cur->table_token = "";
1318 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1320 $this->match_del($table_idx);
1323 log_main("gm:: save_data");
1325 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1326 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1329 } // if ($bin5 == FALSE
1330 else if ($no_recovery == FALSE) {
1331 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1333 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1334 $user_cur = $this->user[$table_cur->player[$i]];
1335 $user_cur->subst = "shutdowner";
1336 $user_cur->step_inc();
1338 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1339 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1340 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1341 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1342 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1343 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1344 $user_cur->step_inc();
1347 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1348 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1349 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1351 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1353 $this->room_join_wakeup($user_cur, TRUE, -2);
1354 $table_cur->table_token = "";
1357 } // if ($table_cur->player_n == PLAYERS_N) {
1358 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1360 log_rd2("out new loop.");
1362 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1363 $user_cur = $this->user[$i];
1365 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1367 if ($user_cur->is_active() == FALSE)
1370 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) {
1371 // Auto logout dell'utente
1372 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1374 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1375 $user_cur->the_end = TRUE;
1377 log_rd2("AUTO LOGOUT.");
1378 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1379 log_auth($user_cur->sess, "Autologout session.");
1381 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1382 $this->room_wakeup($user_cur);
1383 else if ($user_cur->subst == 'standup')
1384 $this->room_outstandup($user_cur);
1386 log_rd2("LOGOUT FROM WHAT ???");
1390 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1391 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1392 $this->room_wakeup($user_cur);
1393 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1394 /* 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" */
1395 $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);
1396 $user_cur->step_inc();
1400 log_rd2("GARBAGE UPDATED!");
1402 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1405 $this->ghost_sess->garbage_manager($curtime);
1407 $this->delay_mgr->lastcheck_set($curtime);
1411 function show_room($user_step, $user)
1413 GLOBAL $G_lang, $mlang_brisk;
1414 log_main("show_room: username: ".$user->name);
1416 $ret = sprintf('gst.st = %d; ', $user_step);
1418 $prefs = Client_prefs::from_user($user);
1419 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1422 if ($user->flags & USER_FLAG_ISOLAUTH) {
1423 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1425 else if ($user->flags & USER_FLAG_LISTAUTH) {
1426 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1429 $ret .= 'list_set(\'all\', false, \'\' ); ';
1433 if ($user->subst == 'standup')
1434 $ret .= "tra.show(); ";
1436 $ret .= "tra.hide(); ";
1438 $ret .= sprintf('stat = "%s";', $user->stat);
1440 $ret .= root_welcome($user);
1441 if ($user->flags & USER_FLAG_DBFAILED) {
1442 $ret .= "gst.st = ".($user->step+1)."; ";
1443 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1446 $ret .= sprintf('subst = "%s";', $user->subst);
1447 $ret .= $user->myname_innerHTML();
1449 for ($i = 0 ; $i < TABLES_N ; $i++) {
1451 $ret .= $this->table_content($user, $i);
1453 $ret .= $this->table[$i]->act_content($user);
1454 if ($this->table[$i]->wag_own != -1)
1455 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1457 $ret .= sprintf('tra.rem(%d); ', $i);
1459 $ret .= $this->standup_content($user);
1460 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1465 function room_wakeup($user)
1467 $table_idx = $user->table;
1468 $table = $this->table[$table_idx];
1470 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1474 $from_table = ($user->stat == "table");
1476 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1478 for ($i = 0 ; $i < $table->player_n ; $i++) {
1479 $user_cur = $this->user[$table->player[$i]];
1480 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1482 if ($user->idx_get() != $table->player[$i]) {
1483 $user_cur->stat_set("room");
1484 $user_cur->subst = "sitdown";
1485 $user_cur->laccwr = $curtime;
1487 else if ($user->is_active()) {
1488 $user_cur->stat_set("room");
1489 $user_cur->subst = "standup";
1490 $user_cur->laccwr = $curtime;
1491 $user_cur->table = -1;
1496 $user->stat_set("room");
1497 $user->subst = "standup";
1498 $user->laccwr = $curtime;
1501 $remove_wagon = FALSE;
1502 if($table->wag_own == $user->idx_get()) {
1503 $table->wag_reset($curtime);
1504 $remove_wagon = TRUE;
1507 /* aggiorna l'array dei giocatori al tavolo. */
1508 $table->user_rem($this, $user);
1510 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1511 $user_cur = $this->user[$i];
1512 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1515 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1517 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1518 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1519 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1520 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1521 log_main("DOCUMENT.index.php: from table");
1523 else if ($user_cur->stat == "room") {
1524 log_main("DOCUMENT.index.php: from table");
1526 $ret .= $this->table_content($user_cur, $table_idx);
1527 $ret .= $this->standup_content($user_cur);
1529 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1530 $ret .= $table->act_content($user);
1532 if ($user->idx_get() == $i) {
1533 // set the new status
1534 $ret .= 'subst = "standup"; tra.show(); ';
1535 // clean the action buttons in other tables
1536 for ($e = 0 ; $e < TABLES_N ; $e++) {
1537 if ($this->table[$e]->player_n < PLAYERS_N) {
1538 $ret .= $this->table[$e]->act_content($user);
1543 $ret .= $table->act_content($user_cur);
1546 log_wr("ROOM_WAKEUP: ".$ret);
1547 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1548 $user_cur->step_inc();
1552 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1554 $table_idx = $user->table;
1555 $table = $this->table[$table_idx];
1557 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1560 $user_wup = array();
1562 $user_tab = array();
1564 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1566 for ($i = 0 ; $i < $table->player_n ; $i++) {
1567 $user_cur = $this->user[$table->player[$i]];
1568 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1569 if ($user_cur->is_empty()) {
1572 if ($update_lacc == TRUE) {
1573 $user_cur->laccwr = $curtime;
1575 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1576 if ($user_cur->subst == "shutdowned") {
1577 $user_cur->stat_set("room");
1578 $user_cur->subst = "sitdown";
1580 else if ($user_cur->subst == "shutdowner") {
1581 $user_cur->stat_set("room");
1582 $user_cur->subst = "standup";
1583 $user_cur->table = -1;
1584 $user_wup[$user_wup_n++] = $user_cur;
1586 $remove_wagon = FALSE;
1587 if($table->wag_own == $table->player[$i]) {
1588 $remove_wagon = TRUE;
1589 $table->wag_reset($curtime);
1592 $user_tab[$user_tab_n++] = $table->player[$i];
1595 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1596 $table->user_rem($this, $user_wup[$wup_idx]);
1598 /* aggiorna l'array dei giocatori al tavolo. */
1600 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1601 log_main("START LOOP");
1602 $user_cur = $this->user[$i];
1603 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1604 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1609 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1611 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1612 if ($user_cur->stat == "room") {
1613 log_main("DOCUMENT.index.php from table");
1615 $ret .= $this->table_content($user_cur, $table_idx);
1616 $ret .= $this->standup_content($user_cur);
1618 $ret .= $table->act_content($user_cur);
1621 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1622 if ($user_tab[$tab_idx] == $i)
1625 // for users that wakeup the room will be reconstructed by index_rd.php
1626 if ($tab_idx < $user_tab_n) {
1627 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1629 // ARRAY_POP DISABLED
1630 // if ($trans_delta == 0)
1631 // while (array_pop($user_cur->comm) != NULL);
1633 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1634 $user_cur->comm[$user_cur->step % COMM_N] = "";
1635 $user_cur->step_inc();
1636 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1637 $user_cur->step_inc();
1638 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1642 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1644 log_main("JOIN_WAKEUP more");
1646 $ret .= $table->act_content($user_cur);
1648 log_main("JOIN_WAKEUP end more");
1650 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1651 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1652 $user_cur->step_inc();
1657 function info_show($user, $target, $dt)
1659 if success return assoc. array with "ret" => 0 and other fields
1660 else return an assoc. array with "ret: != 0 and "mesg" with an error description
1662 function info_show($user, $target, $dt)
1664 GLOBAL $G_lang, $mlang_brisk, $G_base;
1671 if ($target == "") {
1675 if (($bdb = BriskDB::create()) == FALSE) {
1679 if ($target == $user->name) {
1681 $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
1684 if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
1688 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1689 $guar_login = $guar_item->login_get();
1694 $user_tos_vers = $user_item->tos_vers_get();
1696 $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code);
1698 $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code);
1699 $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code);
1700 $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code);
1701 $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code);
1703 if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code,
1704 $widefriend, $narrowfriend)) == FALSE) {
1705 $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code,
1706 $widefriend, $narrowfriend);
1709 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1710 $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target));
1712 else if ($guar_login == "") {
1713 $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
1717 if ($ret > 0 && $mesg == "") {
1718 $mesg = sprintf($mlang_brisk['inf_err'][$G_lang], $ret);
1722 $jret = json_encode(array("ret" => $ret, "mesg" => $mesg));
1725 $jret = json_encode(array("ret" => 0,
1728 // FIXME: state internationalization
1730 ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
1731 ($user_item->type & USER_FLAG_TY_CERT ? "Certificato" :
1732 ($user_item->type & (USER_FLAG_TY_NORM | USER_FLAG_TY_SUPER) ?
1733 "Normale" : "Stato sconosciuto"))),
1734 "guar" => ($user_item->type & USER_FLAG_TY_APPR ?
1736 "party" => $partyskill,
1737 "match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) ,
1738 "game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt),
1739 "friend" => usersnet_friend_getlabel($usersnet_item->friend),
1740 "skill" => $usersnet_item->skill,
1741 "trust" => $usersnet_item->trust,
1742 "widefriend" => $usersnet_item->widefriend,
1743 "narrowfriend" => $usersnet_item->narrowfriend
1750 function info_save($user, $json_s)
1752 GLOBAL $G_lang, $mlang_brisk, $G_base;
1760 if (($json = json_decode($json_s)) == FALSE) {
1765 if (($bdb = BriskDB::create()) == FALSE) {
1770 if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) {
1771 $ret = 4000 + $subret;
1779 function room_outstandup($user)
1781 $this->room_sitdown($user, -1);
1784 function table_update($user)
1786 log_main("table_update: pre - USER: ".$user->name);
1788 $table_idx = $user->table;
1790 if ($table_idx > -1)
1791 $table = $this->table[$table_idx];
1793 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1795 $user_cur = $this->user[$i];
1796 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1799 $ret = "gst.st = ".($user_cur->step+1)."; ";
1800 if ($table_idx > -1)
1801 $ret .= $this->table_content($user_cur, $table_idx);
1803 if ($user->idx_get() == $i) {
1804 $ret .= $user->myname_innerHTML();
1806 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1807 $user_cur->step_inc();
1810 log_main("table_update: post");
1813 function room_sitdown($user, $table_idx)
1815 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1819 if ($table_idx > -1 && $table_idx < TABLES_N) {
1820 $table = $this->table[$table_idx];
1823 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1824 for ($i = 0 ; $i < TABLES_N ; $i++) {
1825 if ($table->wag_own == $table->player[$i]) {
1826 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1827 $table->wag_reset(time());
1834 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1836 $user_cur = $this->user[$i];
1837 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1840 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1841 if ($table_idx > -1)
1842 $ret .= $this->table_content($user_cur, $table_idx);
1843 $ret .= $this->standup_content($user_cur);
1845 if ($user->idx_get() == $i) {
1846 $ret .= 'subst = "sitdown"; tra.hide(); ';
1847 // clean the action buttons in other tables
1848 for ($e = 0 ; $e < TABLES_N ; $e++) {
1849 $ret .= $this->table[$e]->act_content($user_cur);
1852 else if ($table_idx > -1) {
1853 if ($table->player_n == PLAYERS_N) {
1855 $ret .= $table->act_content($user_cur);
1858 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1859 $user_cur->step_inc();
1863 function kickuser($user, $out_reas)
1867 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1869 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1871 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1872 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1873 $bin5 = &$this->match[$user->table];
1874 $user_bin5 = &$bin5->user[$user->table_pos];
1875 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1876 $bin5->table_wakeup($user_bin5);
1877 $user->the_end = TRUE;
1878 $this->room_wakeup($user);
1882 if ($user->stat == 'table' || $user->stat == 'room') {
1883 $user->the_end = TRUE;
1884 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1885 $this->room_wakeup($user);
1887 else if ($user->subst == 'standup') {
1888 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1889 $this->room_outstandup($user);
1892 log_rd2("LOGOUT FROM WHAT ???");
1897 function kickuser_by_name($name, $out_reas)
1899 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1900 $user_out = $this->user[$i];
1901 if (strcmp($user_out->name, $name) == 0) {
1902 return ($this->kickuser($user_out, $out_reas));
1908 function kickuser_by_sess($sess, $out_reas)
1910 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1911 $user_out = $this->user[$i];
1912 if (strcmp($user_out->sess, $sess) == 0) {
1913 return ($this->kickuser($user_out, $out_reas));
1919 function kickuser_by_idx($idx, $out_reas)
1921 $user_out = $this->user[$idx];
1922 return ($this->kickuser($user_out, $out_reas));
1925 function chatt_send($user, $mesg)
1927 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1930 fprintf(STDERR, "WE ARE HERE: [%s]\n", $mesg);
1933 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1935 $dt = date("H:i ", $curtime);
1946 $is_normchat = FALSE;
1947 /* for old isolation management $is_ticker = FALSE; */
1948 $update_room = FALSE;
1950 if (strcmp($msg, "/tav") == 0 ||
1951 strncmp($msg, "/tav ", 5) == 0) {
1953 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1954 /* 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>" */
1955 $msg = $mlang_brisk['tickmust'][$G_lang];
1956 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1961 $table = $this->table[$user->table];
1963 if ($table->wag_own != -1) {
1964 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1965 $msg = $mlang_brisk['tickjust'][$G_lang];
1966 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1971 $dtime = $curtime - $table->wag_tout;
1972 if ($dtime < EXPIRE_TIME_WAG) {
1973 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1974 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1975 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1976 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1981 $msg = substr($msg, 5);
1983 $table->wag_set($user->idx_get(), $msg);
1984 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1985 $to_room = $to_user;
1986 /* for old isolation management $is_ticker = TRUE; */
1988 } // /tav chat command
1989 // just for development use currently
1990 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1991 fprintf(STDERR, "MOP OUT\n");
1992 $target = substr($msg, 5);
1993 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
1995 else if (strncmp($msg, "/alarm ", 7) == 0) {
1996 if (strncmp($msg, "/alarm to ", 10) == 0) {
1997 $sp_pos = strpos($msg, " ", 10);
1998 $target = substr($msg, 10, $sp_pos - 10);
1999 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
2003 $alarm_check = "/alarm ".$G_alarm_passwd." ";
2006 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
2007 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
2008 $msg = $mlang_brisk['alarpass'][$G_lang];
2009 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
2014 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
2015 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
2016 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
2017 $to_user = nickserv_msg($dt, $prestr);
2019 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
2020 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
2021 /* MLANG: "chiudi" */
2022 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
2024 } // /alarm chat command
2025 else if (strncmp($msg, "/listen ", 8) == 0) {
2026 $arg = substr($msg, 8);
2028 if (strcasecmp($arg, "isolation") == 0) {
2030 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
2031 $user->table >= TABLES_AUTH_N) {
2032 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
2036 $user->flags &= ~USER_FLAG_MAP_AUTH;
2037 $user->flags |= USER_FLAG_ISOLAUTH;
2038 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
2041 else if (strcasecmp($arg, "auth") == 0) {
2042 $flags_old = $user->flags;
2043 $user->flags &= ~USER_FLAG_MAP_AUTH;
2044 $user->flags |= USER_FLAG_LISTAUTH;
2045 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
2048 $flags_old = $user->flags;
2049 $user->flags &= ~USER_FLAG_MAP_AUTH;
2050 $to_user = 'list_set(\'all\', true, \'\'); ';
2053 // if from isolation redraw standup area
2054 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
2055 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
2059 else if (strcmp($msg, "/authreq") == 0) {
2060 if ($user->is_cert()) {
2061 $to_user = sprintf('authbox(300,200);');
2064 /* 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." */
2065 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
2068 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
2069 if ($user->is_auth()) {
2070 $to_user = sprintf('mesgtoadmbox(500,300);');
2073 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
2074 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
2077 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
2078 log_main("chatt_send BEGIN");
2081 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2082 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2086 $msg = "COMMAND ".$msg;
2087 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2088 $user_cur = $this->user[$i];
2090 if ($user_cur->is_active() == FALSE)
2092 if (strcasecmp($user_cur->name,$name_new) == 0)
2095 if ($i < MAX_PLAYERS) {
2096 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2097 $to_user = nickserv_msg($dt, $prestr);
2101 /* 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>" */
2102 if ($user->is_auth()) {
2103 if (strcasecmp($user->name,$name_new) != 0) {
2104 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2105 ($user->subst == 'standup' ||
2106 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2109 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2110 for ($i = 0 ; $i < TABLES_N ; $i++) {
2111 $to_user .= $this->table[$i]->act_content($user);
2115 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2120 $user->name = $name_new; // OK - nick changed
2121 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2122 if ( ! $user->is_auth() ) {
2123 if (($bdb = BriskDB::create()) != FALSE) {
2125 /* 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>" */
2126 if ($bdb->login_exists(strtolower($name_new))) {
2127 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2128 $to_user .= nickserv_msg($dt, $prestr);
2133 log_main("chatt_send start set");
2135 $update_room = TRUE;
2137 } // nick chat command
2138 else if (strncmp($msg, "/info ", 6) == 0) {
2139 $info_user = substr($msg, 6);
2141 echo $this->info_show($user, urldecode($info_user), $dt);
2143 else if (strncmp($msg, "/st ", 4) == 0) {
2144 log_main("chatt_send BEGIN");
2147 $st_str = substr($msg, 4);
2149 if (strcasecmp($st_str, "normale") == 0) {
2150 $st = USER_FLAG_S_NORM;
2152 else if (strcasecmp($st_str, "pausa") == 0) {
2153 $st = USER_FLAG_S_PAU;
2155 else if (strcasecmp($st_str, "fuori") == 0) {
2156 $st = USER_FLAG_S_OUT;
2158 else if (strcasecmp($st_str, "cane") == 0) {
2159 $st = USER_FLAG_S_DOG;
2161 else if (strcasecmp($st_str, "cibo") == 0) {
2162 $st = USER_FLAG_S_EAT;
2164 else if (strcasecmp($st_str, "lavoro") == 0) {
2165 $st = USER_FLAG_S_WRK;
2167 else if (strcasecmp($st_str, "sigaretta") == 0) {
2168 $st = USER_FLAG_S_SMK;
2170 else if (strcasecmp($st_str, "presente") == 0) {
2171 $st = USER_FLAG_S_EYE;
2173 else if (strcasecmp($st_str, "coniglio") == 0) {
2174 $st = USER_FLAG_S_RABB;
2176 else if (strcasecmp($st_str, "calcio") == 0) {
2177 $st = USER_FLAG_S_SOCC;
2179 else if (strcasecmp($st_str, "pupo") == 0) {
2180 $st = USER_FLAG_S_BABY;
2182 else if (strcasecmp($st_str, "pulizie") == 0) {
2183 $st = USER_FLAG_S_MOP;
2185 else if (strcasecmp($st_str, "babbo") == 0) {
2186 $st = USER_FLAG_S_BABBO;
2188 else if (strcasecmp($st_str, "renna") == 0) {
2189 $st = USER_FLAG_S_RENNA;
2191 else if (strcasecmp($st_str, "pupazzo") == 0) {
2192 $st = USER_FLAG_S_PUPAZ;
2194 else if (strcasecmp($st_str, "vischio") == 0) {
2195 $st = USER_FLAG_S_VISCH;
2198 /* MLANG: "Questo stato non esiste." */
2199 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2203 log_main("chatt_send start set");
2204 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2205 $update_room = TRUE;
2206 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2209 } // nick chat command
2211 else { // normal chat line
2212 $is_normchat = TRUE;
2213 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2215 $user->chat_dlt = $user->chat_dlt * 2;
2216 if ($user->chat_dlt > 120)
2217 $user->chat_dlt = 120;
2219 else if ($user->chat_lst == $msg)
2221 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2222 $user->chat_ban = $curtime;
2223 $user->chat_dlt = 5;
2227 $user->chat_ban = 0;
2228 $user->chat_dlt = 0;
2232 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2235 // TEMPORARY DISABLED UNTIL test user option will be available
2236 // if ( TRUE && (!$user->is_auth() || $user->is_appr()) ) {
2237 if (!$user->is_auth()) {
2238 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2239 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2241 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2242 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2243 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2245 $auguri = sprintf("%s auguri %s %s.",
2246 $aug_head[mt_rand(0, count($aug_head)-1)],
2247 $aug_body[mt_rand(0, count($aug_body)-1)],
2248 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2250 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2255 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2256 // temporary silentiation for troll (will became array check)
2257 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2258 $to_room = $to_user;
2262 log_legal($curtime, $user->ip, $user,
2263 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2265 $user->chat_lst = "$msg";
2266 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2276 // Output to clients
2279 if ($to_user != FALSE) {
2280 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2281 $user->comm[$user->step % COMM_N] .= $to_user;
2285 if ($to_room != FALSE) {
2286 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2287 $user_cur = $this->user[$i];
2288 if ($target != "" && $user_cur->name != $target)
2290 if ($user_cur->is_active() == FALSE // is not active user
2291 || $user_cur->stat == 'table' // or stat is 'table'
2292 || $user->idx_get() == $i) // or the $user idx is equal to current var
2295 if ($is_normchat == TRUE) {
2296 // use MAP_AUTH to check if auth or isolation
2297 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2298 if ( ! $user->is_auth() ) {
2304 else if ($is_ticker) {
2305 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2306 if ($user->table >= TABLES_AUTH_N)
2311 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2312 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2313 $user_cur->step_inc();
2318 // FIXME BRISK4: include for each kind of table
2319 require_once("${G_base}briskin5/Obj/briskin5.phh");
2320 // Before all align times with table timeout
2321 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2322 if (isset($this->match[$table_idx])) {
2323 $bin5 = $this->match[$table_idx];
2325 $bin5_table = $bin5->table[0];
2326 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2327 // stat must be "table" by definition
2328 $bin5_user = $bin5->user[$i];
2330 if ($target != "" && $bin5_user->name != $target)
2332 log_main("writa: ".$user_mesg);
2333 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2334 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2335 $bin5_user->step_inc();
2337 } // if (isset($this->match
2338 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2339 } // if ($to_tabl == true ...
2342 if ($user->stat == 'room' && $user->subst == 'standup') {
2343 $this->standup_update($user);
2345 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2346 log_main("chatt_send pre table update");
2347 $this->table_update($user);
2348 log_main("chatt_send post table update");
2350 } // if ($update_room ...
2353 } // function chatt_send( ...
2355 function get_user($sess, &$idx)
2359 if (validate_sess($sess)) {
2360 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2361 if ($this->user[$i]->is_empty())
2363 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2366 $ret = $this->user[$i];
2370 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2371 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2372 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2375 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2382 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2385 * if ($idx > -1 && ret == FALSE) => duplicated nick
2386 * if ($idx == -2 && ret == FALSE) => invalid name
2387 * if ($idx == -3 && ret == FALSE) => wrong password
2388 * if ($idx == -1 && ret == FALSE) => no space left
2389 * if ($idx == 0 && ret == user) => SUCCESS
2390 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2393 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2399 $authenticate = FALSE;
2401 $login_exists = FALSE;
2403 $ghost_auth = FALSE;
2408 if (($name_new = validate_name($name)) == FALSE) {
2413 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2414 if (validate_sess($sess) == FALSE)
2417 /* if pass != FALSE verify the login with pass */
2418 log_auth("XXX", "auth1");
2420 if (($bdb = BriskDB::create()) != FALSE) {
2422 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2423 log_auth("XXX", "auth2");
2424 $authenticate = $bdb->login_verify(strtolower($name_new), $pass, $code);
2425 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2427 if ($authenticate != FALSE) {
2428 $user_type = $authenticate->type_get();
2436 $login_exists = $bdb->login_exists(strtolower($name_new));
2440 // if db is down, send a warning and verify only current users
2441 // no actions at this moment
2443 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2445 if ($this->user[$i]->is_empty()) {
2446 if ($idfree == -1) {
2451 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2456 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2457 if ($authenticate != FALSE) {
2459 $ghost_auth = $this->user[$i]->is_auth();
2470 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2472 /* there is another user logged with your account and you and him have authenticated => new user
2473 get the session of the old user */
2474 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2477 $ghost_user = $this->user[$ghost];
2479 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2480 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2481 $ghost_user->step_inc();
2484 $ghost_user->sess = $sess;
2487 $ghost_user->sess = $sess;
2490 // If user at the table we need to update the table data too
2491 $table_idx = $ghost_user->table;
2492 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2493 require_once("${G_base}briskin5/Obj/briskin5.phh");
2494 if (isset($this->match[$table_idx])) {
2495 $bin5 = $this->match[$table_idx];
2497 if ($bin5->the_end != TRUE) {
2498 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2499 $bin5->user[$ghost_user->table_pos]->step_inc();
2500 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2506 if (defined('CURL_DE_SAC_VERS')) {
2507 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2509 return ($this->user[$ghost]);
2511 else if ($idx != -1 && $i == MAX_PLAYERS) {
2516 $this->user[$idx]->sess = $sess;
2519 $this->user[$idx]->sess = $sess;
2521 $this->user[$idx]->name = $name_new; // OK - add new user
2522 $this->user[$idx]->stat_set("room");
2523 $this->user[$idx]->step_set(0);
2524 while (array_pop($this->user[$idx]->comm) != NULL);
2525 $this->user[$idx]->subst = "standup";
2526 $this->user[$idx]->lacc = $curtime;
2527 $this->user[$idx]->laccwr = $curtime;
2528 $this->user[$idx]->bantime = 0;
2529 $this->user[$idx]->ip = $ip;
2531 $this->user[$idx]->rec = $authenticate;
2532 $this->user[$idx]->flags = $user_type;
2533 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2534 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2535 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2537 if ($authenticate != FALSE) {
2538 $this->user[$idx]->code = $authenticate->code_get();
2540 // all this part is included in the db server
2541 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2543 if (isset($cookie['CO_list'])) {
2544 fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2545 if (strcmp($cookie['CO_list'], "auth") == 0) {
2546 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2547 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2549 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2550 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2551 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2554 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2559 fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2562 fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2564 log_main("ghost: rename!");
2565 $ghost_user = $this->user[$ghost];
2567 if ($ghost_auth == FALSE) {
2568 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2569 $ghostname = 'ghost'.$sfx;
2570 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2571 if (strcmp("", $this->user[$i]->sess) == 0)
2574 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2579 if ($ghostname != '')
2583 $ghost_user->name = $ghostname;
2585 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2586 $this->standup_update($ghost_user);
2589 log_main("chatt_send pre table update");
2590 $this->table_update($ghost_user);
2591 log_main("chatt_send post table update");
2593 } // if ($ghost_auth == FALSE
2595 // FIXME: cacciare il vecchio utente room && table (if needed)
2596 $ghost_user->the_end = TRUE;
2597 $ghost_user->lacc = 0;
2598 $this->garbage_manager(TRUE);
2600 } // if ($ghost > -1) {
2605 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));
2607 $ret = $this->user[$real_idx];
2608 if (defined('CURL_DE_SAC_VERS')) {
2609 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2617 function standup_update($user)
2619 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2620 $user_cur = $this->user[$i];
2621 if ($user_cur->is_active() == FALSE)
2624 log_main("STANDUP START: ".$user_cur->stat);
2626 if ($user_cur->stat == 'room') {
2627 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2628 if ($user->idx_get() == $i) {
2629 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2631 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2633 $user_cur->step_inc();
2638 function dump_data()
2640 $brisk_ser = serialize($this);
2641 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2642 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2649 function standup_content($user)
2653 if ($user->stat != 'room')
2656 $content = ' j_stand_cont( [ ';
2658 $user_cur_id = $user->idx_get();
2659 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2660 if ($this->user[$i]->is_active() == FALSE // is not active user
2661 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2662 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2665 $flags = $this->user[$i]->flags;
2667 // sql record exists AND last donate > 2013-01-01
2668 if ($this->user[$i]->is_supp_custom()) {
2669 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2675 if ($this->user[$i]->subst == "standup") {
2676 if ($user_cur_id == $i) {
2680 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2681 xcape($this->user[$i]->name), $supp_comp_s);
2690 function table_content($user, $table_idx)
2696 // Si possono usare i dati nella classe table
2699 $sess = $user->sess;
2700 $table = $this->table[$table_idx];
2702 if ($user->stat != 'room')
2705 $user_cur_id = $user->idx_get();
2707 for ($i = 0 ; $i < $table->player_n ; $i++) {
2708 $user_cur = $this->user[$table->player[$i]];
2710 $flags = $user_cur->flags;
2712 if ($user_cur_id == $table->player[$i])
2715 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2716 if ($user_cur->is_supp_custom())
2717 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2721 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2722 xcape($user_cur->name), $supp_comp_s);
2727 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2732 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2734 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2736 printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2738 fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2739 if ($this->black_check($addr)) {
2740 // TODO: waiting async 5 sec before close
2741 fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2744 if ($path != "" && $path != "index.php") {
2745 if ($this->cloud_check($addr)) {
2746 // TODO: waiting async 5 sec before close
2751 $enc = get_encoding($header);
2752 if (isset($header['User-Agent'])) {
2753 if (strstr($header['User-Agent'], "MSIE")) {
2754 $transp_type = "htmlfile";
2757 $transp_type = "xhr";
2761 $transp_type = "iframe";
2763 force_no_cache($header_out);
2769 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2770 $content = ob_get_contents();
2773 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2774 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2778 case "index_wr.php":
2780 // Enhance required: in the POST case, after the header you must get content
2781 // from the socket, waiting if necessary
2785 index_wr_main($this, $addr, $get, $post, $cookie);
2786 $content = ob_get_contents();
2789 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2793 case "index_rd.php":
2794 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2796 if ($transp == 'websocket')
2800 if (!isset($cookie['sess'])
2801 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2803 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2805 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2810 $this->sess_cur_set($user->sess);
2811 // close a previous opened index_read_ifra socket, if exists
2812 if (($prev = $user->rd_socket_get()) != NULL) {
2813 $s_a_p->socks_unset($user->rd_socket_get());
2814 fclose($user->rd_socket_get());
2815 printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2816 $user->rd_socket_set(NULL);
2820 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2821 $response = headers_render($header_out, -1).$user->chunked_content($content);
2822 $response_l = mb_strlen($response, "ASCII");
2824 $wret = @fwrite($new_socket, $response, $response_l);
2825 if ($wret < $response_l) {
2826 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2827 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2830 $user->rd_cache_set("");
2832 fflush($new_socket);
2835 $s_a_p->socks_set($new_socket, $user, NULL);
2836 $user->rd_socket_set($new_socket);
2837 printf(" - qui ci siamo - ");
2844 if (!(BRISK_DEBUG & DBG_ENGI))
2846 fprintf(STDERR, "TEST.PHP running\n");
2847 if (isset($post['data'])) {
2848 $content = $post['data'];
2851 $content = "NO DATA AVAILABLE";
2853 $header_out['Content-Type'] = 'text/plain';
2854 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2858 /* FAR TODO: move all into an array of registered sub-apps */
2859 $subs = "briskin5/";
2860 $subs_l = strlen($subs);
2861 if (!strncmp($path, $subs, $subs_l)) {
2862 $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2871 function match_add($idx, $match)
2873 $this->match[$idx] = $match;
2876 function match_del($idx)
2878 unset($this->match[$idx]);
2881 function match_get($idx, $token)
2883 if (isset($this->match[$idx])) {
2885 || $token == $this->match[$idx]->table_token) {
2886 return ($this->match[$idx]);
2891 function sess_cur_set($sess)
2893 static::$sess_cur = $sess;
2896 static function sess_cur_get()
2898 return(static::$sess_cur);
2900 } // end class Brisk
2902 function make_seed()
2904 list($usec, $sec) = explode(' ', microtime());
2905 return (float) $sec + ((float) $usec * 100000);
2908 function btrace_line($ar)
2910 GLOBAL $G_btrace_pref_sub;
2913 for ($i = 0 ; $i < count($ar) ; $i++) {
2914 $with_class = isset($ar[$i]['class']);
2915 $with_file = isset($ar[$i]['file']);
2916 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2917 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2918 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2919 ($with_file ? $ar[$i]['line'] : ""));
2925 function trace_ftok($id, $add)
2927 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2928 $tok=@ftok($id, $add);
2930 log_shme($tok.": ".$id." + ".$add);
2935 function log_mop($step, $log)
2939 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2942 $sess = Brisk::sess_cur_get();
2943 if (isset($sess) == FALSE)
2948 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2951 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2952 $btrace = btrace_line(debug_backtrace());
2955 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2956 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2961 function log_step($log)
2965 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2968 $sess = Brisk::sess_cur_get();
2969 if (isset($sess) == FALSE)
2974 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2977 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2978 $btrace = btrace_line(debug_backtrace());
2981 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
2982 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
2989 function log_cds($log)
2993 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
2996 $sess = Brisk::sess_cur_get();
2997 if (isset($sess) == FALSE)
3002 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
3005 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3006 $btrace = btrace_line(debug_backtrace());
3009 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
3010 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3016 function log_only2($log)
3020 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
3023 $sess = Brisk::sess_cur_get();
3024 if (isset($sess) == FALSE)
3029 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
3032 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3033 $btrace = btrace_line(debug_backtrace());
3036 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3037 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3042 function log_crit($log)
3046 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
3049 $sess = Brisk::sess_cur_get();
3050 if (isset($sess) == FALSE)
3055 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
3058 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3059 $btrace = btrace_line(debug_backtrace());
3062 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3063 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3068 function log_only($log)
3072 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
3075 $sess = Brisk::sess_cur_get();
3076 if (isset($sess) == FALSE)
3081 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3084 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3085 $btrace = btrace_line(debug_backtrace());
3088 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3089 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3094 function log_main($log)
3098 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3101 $sess = Brisk::sess_cur_get();
3102 if (isset($sess) == FALSE)
3107 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3110 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3111 $btrace = btrace_line(debug_backtrace());
3114 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3115 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3120 function log_rd($log)
3124 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3127 $sess = Brisk::sess_cur_get();
3128 if (isset($sess) == FALSE)
3133 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3136 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3137 $btrace = btrace_line(debug_backtrace());
3140 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3141 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3146 function log_rd2($log)
3150 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3153 $sess = Brisk::sess_cur_get();
3154 if (isset($sess) == FALSE)
3159 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3162 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3163 $btrace = btrace_line(debug_backtrace());
3167 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3168 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3173 function log_send($log)
3177 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3180 $sess = Brisk::sess_cur_get();
3181 if (isset($sess) == FALSE)
3186 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3189 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3190 $btrace = btrace_line(debug_backtrace());
3193 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3194 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3199 function log_lock($log)
3203 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3206 $sess = Brisk::sess_cur_get();
3207 if (isset($sess) == FALSE)
3212 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3215 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3216 $btrace = btrace_line(debug_backtrace());
3219 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3220 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3225 function log_wr($log)
3229 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3232 $sess = Brisk::sess_cur_get();
3233 if (isset($sess) == FALSE)
3238 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3241 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3242 $btrace = btrace_line(debug_backtrace());
3245 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3246 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3251 function log_load($log)
3255 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3258 $sess = Brisk::sess_cur_get();
3259 if (isset($sess) == FALSE)
3264 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3267 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3268 $btrace = btrace_line(debug_backtrace());
3271 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3272 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3277 function log_auth($sess, $log)
3281 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3284 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3287 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3288 $btrace = btrace_line(debug_backtrace());
3291 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3292 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3297 function log_shme($log)
3301 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3304 $sess = Brisk::sess_cur_get();
3305 if (isset($sess) == FALSE)
3310 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3313 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3314 $btrace = btrace_line(debug_backtrace());
3317 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3318 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3325 // function log_legal($curtime, $sess, $name, $where, $mesg)
3326 function log_legal($curtime, $addr, $user, $where, $mesg)
3329 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3330 /* Unix time | session | nickname | IP | where was | mesg */
3331 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess,
3332 ($user->is_auth() ? 'A' : 'N'),
3333 $user->name, $addr, $where , $mesg));
3338 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3343 if ($sitted < PLAYERS_N) {
3351 if ($table == $cur_table)
3358 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3363 function show_notify($text, $tout, $butt, $w, $h)
3365 log_main("SHOW_NOTIFY: ".$text);
3366 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3369 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3371 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3372 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);
3375 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3377 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3380 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3381 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3384 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3385 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);
3389 function root_welcome($user)
3391 GLOBAL $root_wellarr, $G_lang;
3395 $dt = date("H:i ", $curtime);
3397 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3398 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3405 function validate_sess($sess)
3407 if (strlen($sess) == SESS_LEN)
3413 function validate_name($name)
3415 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3417 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3419 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3426 function playsound($filename)
3428 return (sprintf('playsound("flasou", "%s");', $filename));
3431 function secstoword($secs)
3437 $mins = floor($secs / 60);
3439 if ($G_lang == 'en') {
3441 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3444 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3448 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3451 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3456 function sharedmem_sz($tok)
3458 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3459 log_main("shmop_open failed");
3462 $shm_sz = shmop_size($shm_id);
3463 shmop_close($shm_id);
3465 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3472 static function lock_data($is_exclusive)
3474 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3475 self::$delta_t = microtime(TRUE);
3476 log_lock("LOCK warrant [".self::$delta_t."]");
3484 static function unlock_data($res)
3488 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3497 static function lock_data($is_exclusive)
3499 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3500 self::$delta_t = microtime(TRUE);
3501 log_lock("LOCK poll [".self::$delta_t."]");
3509 static function unlock_data($res)
3513 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3519 function carousel_top()
3524 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));
3527 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>'));
3531 function login_consistency($name)
3534 if (($len = mb_strlen($name)) > 12) {
3538 for ($i = 0 ; $i < mb_strlen($name) ; $i++) {
3539 $c = mb_substr($name, $i, 1);
3540 if (mb_ereg_match ("[a-zA-Z0-9]", $c)) {