5 * Copyright (C) 2006-2015 Matteo Nastasi
6 * mailto: nastasi@alternativeoutput.it
7 * matteo.nastasi@milug.org
8 * web: http://www.alternativeoutput.it
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details. You should have received a
19 * copy of the GNU General Public License along with this program; if
20 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21 * Suite 330, Boston, MA 02111-1307, USA.
26 define('BRISK_CONF', "brisk.conf.pho");
27 define('FTOK_PATH', "/var/lib/brisk");
28 define('LEGAL_PATH', "/tmp/legal_brisk");
29 define('PROXY_PATH', "/var/lib/brisk_proxy");
30 define('TABLES_N', 36);
31 define('TABLES_APPR_N', 12);
32 define('TABLES_AUTH_N', 8);
33 define('TABLES_CERT_N', 4);
34 define('PLAYERS_N', 3);
35 define('MAX_POINTS', 5);
36 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
37 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
38 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
39 define('SHM_DIMS_DLT', 65536);
41 define('SHM_DIMS_U_MIN', 4096);
42 define('SHM_DIMS_U_MAX', 65536);
43 define('SHM_DIMS_U_DLT', 4096);
46 define('COMM_GEN_N', 50);
49 define('CHAT_ILL_TIME', 6);
50 define('CHAT_ENABLED', TRUE);
52 define('SESS_LEN', 13);
53 define('STREAM_TIMEOUT', 60);
54 /* FIXME: move to sac-a-push .phh */
55 /* TIME_RD define the server-side timeout, after half of it a ping request
56 is sent to client, after this time the client is log out */
57 define('EXPIRE_TIME_RD', 180);
58 define('EXPIRE_TIME_SMAMMA', 360);
59 define('EXPIRE_TIME_WAG', 10);
60 define('WAKEUP_TIME', 12);
61 // BAN_TIME da allineare anche in commons.js
62 define('BAN_TIME', 900);
63 define('GARBAGE_TIMEOUT', 5);
64 define('NICKSERV', "BriskServ");
66 define('LOCK_SHARE_MAX', 10000);
68 define('DBG_ONL2', 0x000001);
69 define('DBG_ONLY', 0x000002);
70 define('DBG_MAIN', 0x000004);
71 define('DBG_READ', 0x000008);
72 define('DBG_REA2', 0x000010);
73 define('DBG_SEND', 0x000020);
74 define('DBG_LOCK', 0x000040);
75 define('DBG_WRIT', 0x000080);
76 define('DBG_LOAD', 0x000100);
77 define('DBG_AUTH', 0x000200);
78 define('DBG_CRIT', 0x000400);
79 define('DBG_LMOP', 0x000800);
80 define('DBG_TRAC', 0x001000);
81 define('DBG_SHME', 0x002000);
82 define('DBG_ENGI', 0x004000);
83 define('DBG_CDS', 0x008000);
84 define('DBG_STEP', 0x010000);
85 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
86 define('BRISK_DEBUG', 0x0800);
88 define('BRISK_SINGLE_DEBUG',0);
89 define('BRISK_SINGLE_SESS', "");
90 define('DEBUGGING', "no-debugging");
92 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.7.0";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: dati dai client via web-socket.',
160 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
161 'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info,',
162 'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.',
163 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ) );
165 $G_room_help = array( 'it' => '
166 <div style=\\"text-align: left; padding: 8px;\\">
167 <b>Descrizione</b><br>
168 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
169 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
170 <b>Configurazione del browser.</b><br>
171 Occorre abilitare i cookies.<br>
173 <b>Uso del sito</b><br>
174 Potete sedervi a un tavolo o rimanere in piedi.<br>
175 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
178 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
179 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
180 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
181 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
182 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
183 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
185 <dt><b>Comandi della chat</b>
186 <!-- <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname -->
187 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
188 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
189 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
190 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
191 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
192 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
193 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
199 <div style=\\"text-align: left; padding: 8px;\\">
200 <b>EN Descrizione</b><br>
201 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
202 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
203 <b>Configurazione del browser.</b><br>
204 Occorre abilitare i cookies.<br>
206 <b>Uso del sito</b><br>
207 Potete sedervi a un tavolo o rimanere in piedi.<br>
208 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
211 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
212 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
213 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
214 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
215 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
216 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
218 <dt><b>Comandi della chat</b>
219 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
220 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
221 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
222 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
223 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
224 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
225 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
226 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
232 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
233 <div style=\\"text-align: left; padding: 8px;\\">
234 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
236 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
237 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
239 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
240 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
241 <li>Smart card di InfoCamere
244 <b>Per auto-garantisi occorre possedere:</b><br><br>
246 <li>il codice PIN della propria carta
247 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
250 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
252 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
253 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
254 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
255 diretta dell\' utente da parte dell\' amministratore.
260 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
261 <div style=\\"text-align: left; padding: 8px;\\">
262 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
264 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
265 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
267 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
268 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
271 <b>Per auto-garantisi occorre possedere:</b><br><br>
273 <li>il codice PIN della propria carta
274 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
277 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
279 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
280 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
281 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
282 diretta dell\' utente da parte dell\' amministratore.
289 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
293 $G_room_about = array( 'it' => '<br>
294 <div id=\\"header\\" class=\\"header\\">
295 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
296 briscola chiamata in salsa ajax
298 <br><b>version '.$G_brisk_version.'</b><br><br>
299 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
301 <div id=\\"header\\" class=\\"header\\">
302 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
303 declaration briscola in ajax sauce <b>(Beta)</b>
305 <br><b>version '.$G_brisk_version.'</b><br><br>
306 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
309 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
312 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
313 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
314 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
315 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
316 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
317 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
318 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
319 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
320 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
321 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
322 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
323 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
324 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
325 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
326 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
327 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
328 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
329 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
330 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
332 // $G_PG_cons_n = count($G_PG_cons);
333 // printf("N CONS: %d\n", $G_PG_cons_n);
335 /* printf("%d %d\n", count($voc), count($cons)); */
336 /* for ($i = 0 ; $i < 26 ; $i++) { */
337 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
339 /* printf(' "%s", ', chr(ord('a') + $i)); */
340 /* for ($e = 0 ; $e < 26 ; $e++) { */
341 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
343 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
350 return (ip2long($s));
355 return (long2ip($i));
358 function int2four($l)
360 if (PHP_INT_SIZE == 4)
363 return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
366 function four2int($s)
368 return ($s & 0xffffffff);
373 return int2four( ip2int($s) );
378 return int2ip( four2int($i) );
381 function nickserv_msg($dt, $msg) {
382 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
385 function passwd_gen($seed = NULL)
387 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
396 for ($sil = 0 ; $sil < 7 ; $sil++) {
397 if (($sil % 2) == 0) {
399 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
401 $old = mt_rand(0, $G_PG_vow_n-1);
402 $pw .= $G_PG_vow[$old];
405 $new = mt_rand(0, $G_PG_vow_n-1);
407 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
408 $pw .= $G_PG_vow[$new];
414 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
421 function cmd_return($val, $desc)
423 return array('val' => $val, 'desc' => $desc);
426 function cmd_serialize($attrs)
431 foreach ($attrs as $key => $value) {
432 $ret .= $sep . $key . '=' . urlencode($value);
438 function cmd_deserialize($cmd)
441 $a = explode('&', $cmd);
443 while ($i < count($a)) {
444 $b = split('=', $a[$i]);
445 $ret[urldecode($b[0])] = urldecode($b[1]);
456 function versions_cmp($v1, $v2)
458 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
462 $v1_ar = split('\.', $v1);
463 $v2_ar = split('\.', $v2);
465 $v2_ct = count($v2_ar);
467 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
468 if (($v2_ct - 1) < $i) {
471 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
472 if ($v1_ar[$i] != $v2_ar[$i]) {
473 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
482 // return string with IPV4 address
483 function addrtoipv4($addr)
485 $ipv4addr_arr = explode(':' , $addr);
486 if (isset($ipv4addr_arr[3])) {
487 $ipv4addr = $ipv4addr_arr[3];
497 for ($i = 0; $i < ob_get_level(); $i++)
499 ob_implicit_flush(1);
503 function force_no_cache(&$header_out)
505 $header_out['Pragma'] = 'no-cache, must-revalidate';
506 $header_out['Cache-Control'] = 'no-cache';
507 $header_out['Expires'] = '-1';
510 function file_lock($fname, $is_exclusive)
512 if (($res = @fopen($fname, "r+")) == FALSE) {
516 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
524 function file_unlock($res)
527 flock($res, LOCK_UN);
532 $escpush_from = array("\\", "\"");
533 $escpush_to = array("\\\\", "\\\"");
536 GLOBAL $escpush_from, $escpush_to;
538 return str_replace($escpush_from, $escpush_to, $s);
541 $escinp_from = array( "\"" );
542 $escinp_to = array( """ );
544 function escinput($s)
546 GLOBAL $escinp_from, $escinp_to;
548 return str_replace($escinp_from, $escinp_to, $s);
553 return htmlentities($s, ENT_COMPAT, "UTF-8");
556 function esclfhtml($s)
558 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
561 function langtolng($lang)
565 return ($G_lang == 'en' ? '-en' : '');
568 function csplitter($in, $sep)
574 for ($i = 0 ; $i < strlen($in) ; $i++) {
575 $ini = substr($in, $i, 1);
579 else if ($ini == $sep) {
598 $from = array ( '\\', '@', '|' );
599 $to = array ( '\\\\', '@', '¦' );
601 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
606 $from = array ( '\\', '|', "\t", "\n");
607 $to = array ( '\\\\', '\\|', "\\t", "\\n");
609 return (str_replace($from, $to, $s));
612 function xcapemesg($s)
614 $from = array ( "\n");
615 $to = array ( "\\n");
617 return (str_replace($from, $to, $s));
627 function getbyid($idx)
629 return ($this->el[$idx]);
632 function setbyid($idx, $v)
634 $this->el[$idx] = $v;
638 define('TABLE_AUTH_TY_PUBL', 0);
639 define('TABLE_AUTH_TY_APPR', 1);
640 define('TABLE_AUTH_TY_AUTH', 2);
641 define('TABLE_AUTH_TY_CERT', 3);
649 var $auth_type; // required authorization to sit down
656 var $table_start; // information field
666 function create($idx)
668 if (($thiz = new Table()) == FALSE)
672 $thiz->player = array();
675 if ($idx < TABLES_CERT_N)
676 $thiz->auth_type = TABLE_AUTH_TY_CERT;
677 else if ($idx < TABLES_AUTH_N)
678 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
679 else if ($idx < TABLES_APPR_N)
680 $thiz->auth_type = TABLE_AUTH_TY_APPR;
682 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
688 $thiz->table_token = "";
689 $thiz->table_start = 0;
691 $thiz->wakeup_time = 0;
700 $this->idx = $from->idx;
701 $this->player = array();
702 for ($i = 0 ; $i < $from->player_n ; $i++)
703 $this->player[$i] = $from->player[$i];
704 $this->player_n = $from->player_n;
706 log_main("PLAYER_N - parent::copy.".$this->player_n);
708 $this->auth_type = $from->auth_type;
710 $this->wag_own = $from->wag_own;
711 $this->wag_com = $from->wag_com;
712 $this->wag_tout = $from->wag_tout;
714 $this->table_token = $from->table_token;
715 $this->table_start = $from->table_start;
717 $this->wakeup_time = $from->wakeup_time;
719 $this->cache = $from->cache;
722 function myclone($from)
724 if (($thiz = new Table()) == FALSE)
732 function spawn($from)
734 if (($thiz = new Table()) == FALSE)
737 $thiz->idx = $from->idx;
738 $thiz->player = array();
739 for ($i = 0 ; $i < $from->player_n ; $i++)
740 $thiz->player[$i] = $i;
741 $thiz->player_n = $from->player_n;
743 $thiz->auth_type = $from->auth_type;
745 $thiz->wag_own = $from->wag_own;
746 $thiz->wag_com = $from->wag_com;
747 $thiz->wag_tout = $from->wag_tout;
749 $thiz->table_token = $from->table_token;
750 $thiz->table_start = $from->table_start;
752 $thiz->wakeup_time = $from->wakeup_time;
754 $thiz->cache = $from->cache;
759 function wag_set($user_idx, $mesg)
763 $this->wag_own = $user_idx;
764 $this->wag_com = $mesg;
768 function wag_reset($timeout)
770 log_main("WAG_RESET");
772 unset($this->wag_own);
775 $this->wag_tout = $timeout;
778 function player_get($idx)
780 return ($this->player[$idx]);
783 function player_set($idx, $player)
785 $this->player[$idx] = $player;
788 function user_add($idx)
790 $this->player[$this->player_n] = $idx;
793 return ($this->player_n - 1);
796 function user_rem($brisk, $user)
798 $tabpos = $user->table_pos;
800 /* verifico la consistenza dei dati */
801 if ($brisk->user[$this->player[$tabpos]] == $user) {
803 /* aggiorna l'array dei giocatori al tavolo. */
804 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
805 $this->player[$i] = $this->player[$i+1];
806 $user_cur = $brisk->user[$this->player[$i]];
807 $user_cur->table_pos = $i;
812 log_main("INCONSISTENCY ON TABLE.");
816 // Table->act_content - return 'id' of type of output required for table button
817 function act_content($user)
820 $isstanding = ($user->subst == 'standup');
821 $sitted = $this->player_n;
823 $cur_table = $user->table;
827 if ($sitted < PLAYERS_N) {
828 switch ($this->auth_type) {
829 case TABLE_AUTH_TY_CERT:
830 if ($user->is_cert() && !$user->is_appr())
835 case TABLE_AUTH_TY_AUTH:
836 if ($user->is_auth() && !$user->is_appr())
841 case TABLE_AUTH_TY_APPR:
842 if ($user->is_auth())
857 if ($table == $cur_table)
864 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
877 function Delay_Manager($triglevel)
879 $this->triglevel = $triglevel;
880 $this->delta = array();
881 $this->lastcheck = 0;
884 function delta_get($curtime)
886 // clean too old delta items
887 for ($i = 0 ; $i < count($this->delta) ; $i++) {
888 if ($this->delta[$i][0] < $curtime) {
889 array_splice($this->delta, $i, 1);
894 // add new delta items if delay exceeded $this->triglevel sec
895 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
896 $delta = $curtime - $this->lastcheck - $this->triglevel;
897 array_push($this->delta, array($curtime + $delta , $delta));
898 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
901 // extract the maximum valid delta
903 for ($i = 0 ; $i < count($this->delta) ; $i++) {
904 $delta_cur = $this->delta[$i][1];
905 if ($delta_max < $delta_cur)
906 $delta_max = $delta_cur;
909 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
914 function lastcheck_set($curtime)
916 $this->lastcheck = $curtime;
924 function Client_prefs()
928 static function from_user($user)
930 $thiz = new Client_prefs();
931 $thiz->user_load($user);
936 static function from_json($json)
938 $thiz = new Client_prefs();
939 if ($thiz->json_load($json) == FALSE) {
947 function user_load($user)
949 // fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
950 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
951 if ($user->rec != FALSE) {
952 $this->supp_comp = $user->rec->supp_comp_get();
955 $this->supp_comp = "000000000000";
958 // fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
961 function json_load($json_s)
966 if (gettype($json_s) == "string") {
967 if (($json = json_decode($json_s)) == FALSE)
973 if ($this->listen < 0 || $this->listen > 2)
975 $this->listen = $json->listen;
977 if (mb_strlen($json->supp_comp, "ASCII") != 12)
980 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
981 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
982 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
988 $this->supp_comp = $json->supp_comp;
995 function store($user, $is_save)
998 // fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
999 // $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
1000 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
1001 // fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
1003 if ($user->is_supp_custom()) {
1004 $user->rec->supp_comp_set($this->supp_comp);
1007 $user->prefs_store();
1011 define('GHOST_SESS_TOUT', 1800);
1012 define('GHOST_SESS_REAS_LOUT', 1); // logout
1013 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
1014 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
1015 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
1016 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
1017 define('GHOST_SESS_REAS_PROX', 6); // proxy access
1025 function GhostSessEl($time, $sess, $reas)
1027 $this->time = $time + GHOST_SESS_TOUT;
1028 $this->sess = $sess;
1029 $this->reas = $reas;
1037 function GhostSess()
1039 $this->gs = array();
1042 // push or update for this session
1043 function push($time, $sess, $reas)
1045 foreach($this->gs as $el) {
1046 if ($el->sess == "$sess") {
1048 $el->time = $time + GHOST_SESS_TOUT;
1053 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1059 foreach($this->gs as $key => $el) {
1060 if ($el->sess == "$sess") {
1061 $ret = $this->gs[$key];
1062 unset($this->gs[$key]);
1069 function garbage_manager($curtime)
1071 foreach($this->gs as $key => $el) {
1072 if ($el->time < $curtime) {
1073 unset($this->gs[$key]);
1083 var $crystal_filename;
1087 var $comm; // commands for many people
1088 var $step; // current step of the comm array
1089 var $garbage_timeout;
1092 var $ban_list; // ban list (authized allowed)
1093 var $black_list; // black list (anti-dos, noone allowed)
1094 var $cloud_smasher; // list of cloud ip ranges to be rejected
1100 public static $sess_cur;
1108 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1109 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1110 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1111 fprintf(STDERR, "ROOM FROM FILE\n");
1112 rename($crystal_filename, $crystal_filename.".old");
1114 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1120 fprintf(STDERR, "NEW ROOM\n");
1121 $thiz = new Brisk();
1123 $thiz->crystal_filename = $crystal_filename;
1124 $thiz->user = array();
1125 $thiz->table = array();
1126 $thiz->match = array();
1128 $thiz->ban_list = IpClass::create();
1129 $thiz->black_list = IpClass::create();
1130 $thiz->cloud_smasher = IpClass::create();
1131 $thiz->ghost_sess = new GhostSess();
1133 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1134 $thiz->user[$i] = User::create($thiz, $i, "", "");
1137 for ($i = 0 ; $i < TABLES_N ; $i++) {
1138 $thiz->table[$i] = Table::create($i);
1140 $thiz->garbage_timeout = 0;
1141 $thiz->shm_sz = SHM_DIMS_MIN;
1143 $thiz->delay_mgr = new Delay_Manager(1.5);
1145 static::$sess_cur = FALSE;
1147 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1152 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1154 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1155 count($ban_list), count($black_list), count($cloud_smasher));
1157 if (defined('CURL_DE_SAC_VERS')) {
1158 if (brisk_cds_reload($this) == FALSE) {
1162 $this->ban_list->update($ban_list);
1163 $this->black_list->update($black_list);
1164 $this->cloud_smasher->update($cloud_smasher);
1167 $this->banned_kickoff();
1168 $this->garbage_manager(TRUE);
1172 function banned_kickoff()
1176 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1177 $table_cur = $this->table[$table_idx];
1178 // if the table is complete and exists we check users IP
1180 if ($table_cur->player_n == PLAYERS_N) {
1181 if (isset($this->match[$table_idx]) &&
1182 $table_cur->table_token == $bin5->table_token) {
1183 log_main("PLAYERS == N TABLE ".$table_idx);
1185 $bin5 = $this->match[$table_idx];
1187 $is_ban |= $bin5->banned_kickoff();
1192 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1193 $user_cur = $this->user[$i];
1195 if ($user_cur->is_active() == FALSE)
1198 // check if the IP is blacklisted
1199 if ($this->black_check($user_cur->ip) ||
1200 $this->cloud_check($user_cur->ip)) {
1201 $user_cur->lacc = 0;
1206 // if authorized not check if banlisted
1207 if ($user_cur->is_auth()) {
1211 if ($this->ban_check($user_cur->ip)) {
1212 $user_cur->lacc = 0;
1220 function ban_check($ip_str)
1222 return ($this->ban_list->check($ip_str));
1225 function black_check($ip_str)
1227 return ($this->black_list->check($ip_str));
1230 function cloud_check($ip_str)
1232 return ($this->cloud_smasher->check($ip_str));
1235 function users_cleanup()
1238 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1239 $user_cur = $this->user[$i];
1241 if ($user_cur->the_end
1242 && (($user_cur->rd_toflush == FALSE
1243 && $user_cur->rd_step == $user_cur->step)
1244 || $user_cur->rd_endtime_is_expired($curtime))
1246 $user_cur->reset(); // users_cleanup, OK
1251 function garbage_manager($force)
1253 GLOBAL $G_lang, $mlang_brisk, $G_base;
1257 log_rd2("garbage_manager START");
1259 /* Garbage collector degli utenti in timeout */
1260 $curtime = microtime(TRUE);
1262 $delta = $this->delay_mgr->delta_get($curtime);
1264 if (!$force && !($this->garbage_timeout < $curtime)) {
1265 $this->delay_mgr->lastcheck_set($curtime);
1269 // Before all align times with table timeout
1270 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1271 $table_cur = $this->table[$table_idx];
1272 // if the table is complete and exists its shared mem we get the info about users lacc
1274 if ($table_cur->player_n == PLAYERS_N) {
1275 log_main("PLAYERS == N TABLE ".$table_idx);
1278 $no_recovery = FALSE;
1279 if (isset($this->match[$table_idx])) {
1280 $bin5 = $this->match[$table_idx];
1282 if ($table_cur->table_token != $bin5->table_token) {
1283 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1284 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1285 $no_recovery = TRUE;
1289 if ($bin5 != FALSE) {
1293 log_main("garbage_manager: bri loaded successfully.");
1294 $bin5->garbage_manager(TRUE);
1296 $bin5_table = $bin5->table[0];
1298 // is the end of the table
1300 if ($bin5->the_end == TRUE) {
1302 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1304 log_main("garbage_manager: INSIDE THE END.");
1306 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1307 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1308 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1311 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1312 // stat must be "table" by definition
1313 $user_cur = $this->user[$table_cur->player[$i]];
1314 $bin5_user = $bin5->user[$i];
1316 $user_cur->subst = $bin5_user->subst;
1317 $user_cur->rd_step = $bin5_user->rd_step;
1318 $user_cur->step = $bin5_user->step;
1319 $user_cur->lacc = $bin5_user->lacc;
1320 $user_cur->laccwr = $bin5_user->lacc;
1321 $user_cur->bantime = $bin5_user->bantime;
1322 $user_cur->the_end = $bin5_user->the_end;
1323 if ($user_cur->the_end) {
1324 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1328 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1330 $this->room_join_wakeup($user_cur, FALSE, 0);
1331 $table_cur->table_token = "";
1332 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1334 $this->match_del($table_idx);
1337 log_main("gm:: save_data");
1339 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1340 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1343 } // if ($bin5 == FALSE
1344 else if ($no_recovery == FALSE) {
1345 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1347 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1348 $user_cur = $this->user[$table_cur->player[$i]];
1349 $user_cur->subst = "shutdowner";
1350 $user_cur->step_inc();
1352 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1353 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1354 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1355 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1356 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1357 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1358 $user_cur->step_inc();
1361 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1362 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1363 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1365 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1367 $this->room_join_wakeup($user_cur, TRUE, -2);
1368 $table_cur->table_token = "";
1371 } // if ($table_cur->player_n == PLAYERS_N) {
1372 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1374 log_rd2("out new loop.");
1376 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1377 $user_cur = $this->user[$i];
1379 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1381 if ($user_cur->is_active() == FALSE)
1384 if ($user_cur->lacc + (($user_cur->ping_req ? 1.5 : 1.0) * EXPIRE_TIME_RD) < ($curtime - $delta)) {
1385 // Auto logout dell'utente
1386 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1388 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1389 $user_cur->the_end = TRUE;
1391 log_rd2("AUTO LOGOUT.");
1392 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1393 log_auth($user_cur->sess, "Autologout session.");
1395 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1396 $this->room_wakeup($user_cur);
1397 else if ($user_cur->subst == 'standup')
1398 $this->room_outstandup($user_cur);
1400 log_rd2("LOGOUT FROM WHAT ???");
1404 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1405 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1406 $this->room_wakeup($user_cur);
1407 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1408 /* 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" */
1409 $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);
1410 $user_cur->step_inc();
1414 log_rd2("GARBAGE UPDATED!");
1416 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1419 $this->ghost_sess->garbage_manager($curtime);
1421 $this->delay_mgr->lastcheck_set($curtime);
1425 function show_room($user_step, $user)
1427 GLOBAL $G_lang, $mlang_brisk;
1428 log_main("show_room: username: ".$user->name);
1430 $ret = sprintf('gst.st = %d; ', $user_step);
1432 $prefs = Client_prefs::from_user($user);
1433 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1436 if ($user->flags & USER_FLAG_ISOLAUTH) {
1437 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1439 else if ($user->flags & USER_FLAG_LISTAUTH) {
1440 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1443 $ret .= 'list_set(\'all\', false, \'\' ); ';
1447 if ($user->subst == 'standup')
1448 $ret .= "tra.show(); ";
1450 $ret .= "tra.hide(); ";
1452 $ret .= sprintf('stat = "%s";', $user->stat);
1454 $ret .= root_welcome($user);
1455 if ($user->flags & USER_FLAG_DBFAILED) {
1456 $ret .= "gst.st = ".($user->step+1)."; ";
1457 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1460 $ret .= sprintf('subst = "%s";', $user->subst);
1461 $ret .= $user->myname_innerHTML();
1463 for ($i = 0 ; $i < TABLES_N ; $i++) {
1465 $ret .= $this->table_content($user, $i, TRUE);
1467 $ret .= $this->table[$i]->act_content($user);
1468 if ($this->table[$i]->wag_own != -1)
1469 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1471 $ret .= sprintf('tra.rem(%d); ', $i);
1473 $ret .= $this->standup_content($user);
1474 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1479 function room_wakeup($user)
1481 $table_idx = $user->table;
1482 $table = $this->table[$table_idx];
1484 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1488 $from_table = ($user->stat == "table");
1490 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1492 for ($i = 0 ; $i < $table->player_n ; $i++) {
1493 $user_cur = $this->user[$table->player[$i]];
1494 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1496 if ($user->idx_get() != $table->player[$i]) {
1497 $user_cur->stat_set("room");
1498 $user_cur->subst = "sitdown";
1499 $user_cur->laccwr = $curtime;
1501 else if ($user->is_active()) {
1502 $user_cur->stat_set("room");
1503 $user_cur->subst = "standup";
1504 $user_cur->laccwr = $curtime;
1505 $user_cur->table = -1;
1510 $user->stat_set("room");
1511 $user->subst = "standup";
1512 $user->laccwr = $curtime;
1515 $remove_wagon = FALSE;
1516 if($table->wag_own == $user->idx_get()) {
1517 $table->wag_reset($curtime);
1518 $remove_wagon = TRUE;
1521 /* aggiorna l'array dei giocatori al tavolo. */
1522 $table->user_rem($this, $user);
1524 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1525 $user_cur = $this->user[$i];
1526 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1529 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1531 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1532 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1533 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1534 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1535 log_main("DOCUMENT.index.php: from table");
1537 else if ($user_cur->stat == "room") {
1538 log_main("DOCUMENT.index.php: from table");
1540 $ret .= $this->table_content($user_cur, $table_idx);
1541 $ret .= $this->standup_content($user_cur);
1543 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1544 $ret .= $table->act_content($user);
1546 if ($user->idx_get() == $i) {
1547 // set the new status
1548 $ret .= 'subst = "standup"; tra.show(); ';
1549 // clean the action buttons in other tables
1550 for ($e = 0 ; $e < TABLES_N ; $e++) {
1551 if ($this->table[$e]->player_n < PLAYERS_N) {
1552 $ret .= $this->table[$e]->act_content($user);
1557 $ret .= $table->act_content($user_cur);
1560 log_wr("ROOM_WAKEUP: ".$ret);
1561 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1562 $user_cur->step_inc();
1566 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1568 $table_idx = $user->table;
1569 $table = $this->table[$table_idx];
1571 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1574 $user_wup = array();
1576 $user_tab = array();
1578 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1580 for ($i = 0 ; $i < $table->player_n ; $i++) {
1581 $user_cur = $this->user[$table->player[$i]];
1582 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1583 if ($user_cur->is_empty()) {
1586 if ($update_lacc == TRUE) {
1587 $user_cur->laccwr = $curtime;
1589 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1590 if ($user_cur->subst == "shutdowned") {
1591 $user_cur->stat_set("room");
1592 $user_cur->subst = "sitdown";
1594 else if ($user_cur->subst == "shutdowner") {
1595 $user_cur->stat_set("room");
1596 $user_cur->subst = "standup";
1597 $user_cur->table = -1;
1598 $user_wup[$user_wup_n++] = $user_cur;
1600 $remove_wagon = FALSE;
1601 if($table->wag_own == $table->player[$i]) {
1602 $remove_wagon = TRUE;
1603 $table->wag_reset($curtime);
1606 $user_tab[$user_tab_n++] = $table->player[$i];
1609 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1610 $table->user_rem($this, $user_wup[$wup_idx]);
1612 /* aggiorna l'array dei giocatori al tavolo. */
1614 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1615 log_main("START LOOP");
1616 $user_cur = $this->user[$i];
1617 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1618 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1623 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1625 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1626 if ($user_cur->stat == "room") {
1627 log_main("DOCUMENT.index.php from table");
1629 $ret .= $this->table_content($user_cur, $table_idx);
1630 $ret .= $this->standup_content($user_cur);
1632 $ret .= $table->act_content($user_cur);
1635 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1636 if ($user_tab[$tab_idx] == $i)
1639 // for users that wakeup the room will be reconstructed by index_rd.php
1640 if ($tab_idx < $user_tab_n) {
1641 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1643 // ARRAY_POP DISABLED
1644 // if ($trans_delta == 0)
1645 // while (array_pop($user_cur->comm) != NULL);
1647 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1648 $user_cur->comm[$user_cur->step % COMM_N] = "";
1649 $user_cur->step_inc();
1650 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1651 $user_cur->step_inc();
1652 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1656 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1658 log_main("JOIN_WAKEUP more");
1660 $ret .= $table->act_content($user_cur);
1662 log_main("JOIN_WAKEUP end more");
1664 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1665 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1666 $user_cur->step_inc();
1671 function info_show($user, $target, $dt)
1673 if success return assoc. array with "ret" => 0 and other fields
1674 else return an assoc. array with "ret: != 0 and "mesg" with an error description
1676 function info_show($user, $target, $dt)
1678 GLOBAL $G_lang, $mlang_brisk, $G_base;
1685 if ($target == "") {
1689 if (($bdb = BriskDB::create()) == FALSE) {
1693 if ($target == $user->name) {
1695 $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
1698 if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
1702 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1703 $guar_login = $guar_item->login_get();
1708 $user_tos_vers = $user_item->tos_vers_get();
1710 $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code);
1712 $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code);
1713 $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code);
1714 $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code);
1715 $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code);
1717 if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code,
1718 $widefriend, $narrowfriend)) == FALSE) {
1719 $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code,
1720 $widefriend, $narrowfriend);
1723 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1724 $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target));
1726 else if ($guar_login == "") {
1727 $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
1731 if ($ret > 0 && $mesg == "") {
1732 $mesg = sprintf($mlang_brisk['inf_err'][$G_lang], $ret);
1736 $jret = json_encode(array("ret" => $ret, "mesg" => $mesg));
1739 $jret = json_encode(array("ret" => 0,
1742 // FIXME: state internationalization
1744 ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
1745 ($user_item->type & USER_FLAG_TY_CERT ? "Certificato" :
1746 ($user_item->type & (USER_FLAG_TY_NORM | USER_FLAG_TY_SUPER) ?
1747 "Normale" : "Stato sconosciuto"))),
1748 "guar" => ($user_item->type & USER_FLAG_TY_APPR ?
1750 "party" => $partyskill,
1751 "match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) ,
1752 "game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt),
1753 "friend" => usersnet_friend_getlabel($usersnet_item->friend),
1754 "skill" => $usersnet_item->skill,
1755 "trust" => $usersnet_item->trust,
1756 "widefriend" => $usersnet_item->widefriend,
1757 "narrowfriend" => $usersnet_item->narrowfriend
1764 function info_save($user, $json_s)
1766 GLOBAL $G_lang, $mlang_brisk, $G_base;
1774 if (($json = json_decode($json_s)) == FALSE) {
1779 if (($bdb = BriskDB::create()) == FALSE) {
1784 if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) {
1785 $ret = 4000 + $subret;
1793 function room_outstandup($user)
1795 $this->room_sitdown($user, -1);
1798 function table_update($user)
1800 log_main("table_update: pre - USER: ".$user->name);
1802 $table_idx = $user->table;
1804 if ($table_idx > -1)
1805 $table = $this->table[$table_idx];
1807 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1809 $user_cur = $this->user[$i];
1810 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1813 $ret = "gst.st = ".($user_cur->step+1)."; ";
1814 if ($table_idx > -1)
1815 $ret .= $this->table_content($user_cur, $table_idx);
1817 if ($user->idx_get() == $i) {
1818 $ret .= $user->myname_innerHTML();
1820 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1821 $user_cur->step_inc();
1824 log_main("table_update: post");
1827 function room_sitdown($user, $table_idx)
1829 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1833 if ($table_idx > -1 && $table_idx < TABLES_N) {
1834 $table = $this->table[$table_idx];
1837 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1838 for ($i = 0 ; $i < TABLES_N ; $i++) {
1839 if ($table->wag_own == $table->player[$i]) {
1840 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1841 $table->wag_reset(time());
1848 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1850 $user_cur = $this->user[$i];
1851 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1854 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1855 if ($table_idx > -1)
1856 $ret .= $this->table_content($user_cur, $table_idx);
1857 $ret .= $this->standup_content($user_cur);
1859 if ($user->idx_get() == $i) {
1860 $ret .= 'subst = "sitdown"; tra.hide(); ';
1861 // clean the action buttons in other tables
1862 for ($e = 0 ; $e < TABLES_N ; $e++) {
1863 $ret .= $this->table[$e]->act_content($user_cur);
1866 else if ($table_idx > -1) {
1867 if ($table->player_n == PLAYERS_N) {
1869 $ret .= $table->act_content($user_cur);
1872 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1873 $user_cur->step_inc();
1877 function kickuser($user, $out_reas)
1881 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1883 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1885 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1886 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1887 $bin5 = &$this->match[$user->table];
1888 $user_bin5 = &$bin5->user[$user->table_pos];
1889 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1890 $bin5->table_wakeup($user_bin5);
1891 $user->the_end = TRUE;
1892 $this->room_wakeup($user);
1896 if ($user->stat == 'table' || $user->stat == 'room') {
1897 $user->the_end = TRUE;
1898 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1899 $this->room_wakeup($user);
1901 else if ($user->subst == 'standup') {
1902 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1903 $this->room_outstandup($user);
1906 log_rd2("LOGOUT FROM WHAT ???");
1911 function kickuser_by_name($name, $out_reas)
1913 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1914 $user_out = $this->user[$i];
1915 if (strcmp($user_out->name, $name) == 0) {
1916 return ($this->kickuser($user_out, $out_reas));
1922 function kickuser_by_sess($sess, $out_reas)
1924 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1925 $user_out = $this->user[$i];
1926 if (strcmp($user_out->sess, $sess) == 0) {
1927 return ($this->kickuser($user_out, $out_reas));
1933 function kickuser_by_idx($idx, $out_reas)
1935 $user_out = $this->user[$idx];
1936 return ($this->kickuser($user_out, $out_reas));
1939 function chatt_send($user, $mesg, $mlang_indwr = NULL)
1941 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1944 // fprintf(STDERR, "WE ARE HERE: [%s]\n", $mesg);
1947 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1949 $dt = date("H:i ", $curtime);
1960 $is_normchat = FALSE;
1961 /* for old isolation management $is_ticker = FALSE; */
1962 $update_room = FALSE;
1964 if (strcmp($msg, "/tav") == 0 ||
1965 strncmp($msg, "/tav ", 5) == 0) {
1967 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1968 /* 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>" */
1969 $msg = $mlang_brisk['tickmust'][$G_lang];
1970 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1975 $table = $this->table[$user->table];
1977 if ($table->wag_own != -1) {
1978 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1979 $msg = $mlang_brisk['tickjust'][$G_lang];
1980 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1985 $dtime = $curtime - $table->wag_tout;
1986 if ($dtime < EXPIRE_TIME_WAG) {
1987 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1988 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1989 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1990 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1995 $msg = substr($msg, 5);
1997 $table->wag_set($user->idx_get(), $msg);
1998 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1999 $to_room = $to_user;
2000 /* for old isolation management $is_ticker = TRUE; */
2002 } // /tav chat command
2003 // just for development use currently
2004 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
2005 fprintf(STDERR, "MOP OUT\n");
2006 $target = substr($msg, 5);
2007 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
2009 else if (strncmp($msg, "/alarm ", 7) == 0) {
2010 if (strncmp($msg, "/alarm to ", 10) == 0) {
2011 $sp_pos = strpos($msg, " ", 10);
2012 $target = substr($msg, 10, $sp_pos - 10);
2013 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
2017 $alarm_check = "/alarm ".$G_alarm_passwd." ";
2020 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
2021 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
2022 $msg = $mlang_brisk['alarpass'][$G_lang];
2023 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
2028 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
2029 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
2030 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
2031 $to_user = nickserv_msg($dt, $prestr);
2033 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
2034 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
2035 /* MLANG: "chiudi" */
2036 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
2038 } // /alarm chat command
2039 else if (strncmp($msg, "/listen ", 8) == 0) {
2040 $arg = substr($msg, 8);
2042 if (strcasecmp($arg, "isolation") == 0) {
2044 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
2045 $user->table >= TABLES_AUTH_N) {
2046 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
2050 $user->flags &= ~USER_FLAG_MAP_AUTH;
2051 $user->flags |= USER_FLAG_ISOLAUTH;
2052 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
2055 else if (strcasecmp($arg, "auth") == 0) {
2056 $flags_old = $user->flags;
2057 $user->flags &= ~USER_FLAG_MAP_AUTH;
2058 $user->flags |= USER_FLAG_LISTAUTH;
2059 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
2062 $flags_old = $user->flags;
2063 $user->flags &= ~USER_FLAG_MAP_AUTH;
2064 $to_user = 'list_set(\'all\', true, \'\'); ';
2067 // if from isolation redraw standup area
2068 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
2069 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
2073 else if (strcmp($msg, "/authreq") == 0) {
2074 if ($user->is_cert()) {
2075 $to_user = sprintf('authbox(300,200);');
2078 /* 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." */
2079 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
2082 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
2083 if ($user->is_auth()) {
2084 $to_user = sprintf('mesgtoadmbox(500,300);');
2087 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
2088 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
2091 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
2092 log_main("chatt_send BEGIN");
2095 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2096 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2100 $msg = "COMMAND ".$msg;
2101 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2102 $user_cur = $this->user[$i];
2104 if ($user_cur->is_active() == FALSE)
2106 if (strcasecmp($user_cur->name,$name_new) == 0)
2109 if ($i < MAX_PLAYERS) {
2110 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2111 $to_user = nickserv_msg($dt, $prestr);
2115 /* 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>" */
2116 if ($user->is_auth()) {
2117 if (strcasecmp($user->name,$name_new) != 0) {
2118 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2119 ($user->subst == 'standup' ||
2120 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2123 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2124 for ($i = 0 ; $i < TABLES_N ; $i++) {
2125 $to_user .= $this->table[$i]->act_content($user);
2129 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2134 $user->name = $name_new; // OK - nick changed
2135 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2136 if ( ! $user->is_auth() ) {
2137 if (($bdb = BriskDB::create()) != FALSE) {
2139 /* 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>" */
2140 if ($bdb->login_exists(strtolower($name_new))) {
2141 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2142 $to_user .= nickserv_msg($dt, $prestr);
2147 log_main("chatt_send start set");
2149 $update_room = TRUE;
2151 } // nick chat command
2152 else if (strncmp($msg, "/info ", 6) == 0) {
2154 if (! $user->is_auth()) {
2156 $to_user = nickserv_msg($dt, $mlang_indwr['info_auth'][$G_lang]);
2159 $to_user = nickserv_msg($dt, "error");
2163 $info_user = substr($msg, 6);
2165 echo $this->info_show($user, urldecode($info_user), $dt);
2168 else if (strncmp($msg, "/st ", 4) == 0) {
2169 log_main("chatt_send BEGIN");
2172 $st_str = substr($msg, 4);
2174 if (strcasecmp($st_str, "normale") == 0) {
2175 $st = USER_FLAG_S_NORM;
2177 else if (strcasecmp($st_str, "pausa") == 0) {
2178 $st = USER_FLAG_S_PAU;
2180 else if (strcasecmp($st_str, "fuori") == 0) {
2181 $st = USER_FLAG_S_OUT;
2183 else if (strcasecmp($st_str, "cane") == 0) {
2184 $st = USER_FLAG_S_DOG;
2186 else if (strcasecmp($st_str, "cibo") == 0) {
2187 $st = USER_FLAG_S_EAT;
2189 else if (strcasecmp($st_str, "lavoro") == 0) {
2190 $st = USER_FLAG_S_WRK;
2192 else if (strcasecmp($st_str, "sigaretta") == 0) {
2193 $st = USER_FLAG_S_SMK;
2195 else if (strcasecmp($st_str, "presente") == 0) {
2196 $st = USER_FLAG_S_EYE;
2198 else if (strcasecmp($st_str, "coniglio") == 0) {
2199 $st = USER_FLAG_S_RABB;
2201 else if (strcasecmp($st_str, "calcio") == 0) {
2202 $st = USER_FLAG_S_SOCC;
2204 else if (strcasecmp($st_str, "pupo") == 0) {
2205 $st = USER_FLAG_S_BABY;
2207 else if (strcasecmp($st_str, "pulizie") == 0) {
2208 $st = USER_FLAG_S_MOP;
2210 else if (strcasecmp($st_str, "babbo") == 0) {
2211 $st = USER_FLAG_S_BABBO;
2213 else if (strcasecmp($st_str, "renna") == 0) {
2214 $st = USER_FLAG_S_RENNA;
2216 else if (strcasecmp($st_str, "pupazzo") == 0) {
2217 $st = USER_FLAG_S_PUPAZ;
2219 else if (strcasecmp($st_str, "vischio") == 0) {
2220 $st = USER_FLAG_S_VISCH;
2223 /* MLANG: "Questo stato non esiste." */
2224 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2228 log_main("chatt_send start set");
2229 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2230 $update_room = TRUE;
2231 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2234 } // nick chat command
2236 else { // normal chat line
2237 $is_normchat = TRUE;
2238 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2240 $user->chat_dlt = $user->chat_dlt * 2;
2241 if ($user->chat_dlt > 120)
2242 $user->chat_dlt = 120;
2244 else if ($user->chat_lst == $msg)
2246 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2247 $user->chat_ban = $curtime;
2248 $user->chat_dlt = 5;
2252 $user->chat_ban = 0;
2253 $user->chat_dlt = 0;
2257 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2260 // TEMPORARY DISABLED UNTIL test user option will be available
2261 // if ( TRUE && (!$user->is_auth() || $user->is_appr()) ) {
2262 if (!$user->is_auth()) {
2263 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2264 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2266 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2267 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2268 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2270 $auguri = sprintf("%s auguri %s %s.",
2271 $aug_head[mt_rand(0, count($aug_head)-1)],
2272 $aug_body[mt_rand(0, count($aug_body)-1)],
2273 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2275 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2280 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2281 // temporary silentiation for troll (will became array check)
2282 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2283 $to_room = $to_user;
2287 log_legal($curtime, $user->ip, $user,
2288 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2290 $user->chat_lst = "$msg";
2291 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2301 // Output to clients
2304 if ($to_user != FALSE) {
2305 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2306 $user->comm[$user->step % COMM_N] .= $to_user;
2310 if ($to_room != FALSE) {
2311 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2312 $user_cur = $this->user[$i];
2313 if ($target != "" && $user_cur->name != $target)
2315 if ($user_cur->is_active() == FALSE // is not active user
2316 || $user_cur->stat == 'table' // or stat is 'table'
2317 || $user->idx_get() == $i) // or the $user idx is equal to current var
2320 if ($is_normchat == TRUE) {
2321 // use MAP_AUTH to check if auth or isolation
2322 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2323 if ( ! $user->is_auth() ) {
2329 else if ($is_ticker) {
2330 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2331 if ($user->table >= TABLES_AUTH_N)
2336 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2337 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2338 $user_cur->step_inc();
2343 // FIXME BRISK4: include for each kind of table
2344 require_once("${G_base}briskin5/Obj/briskin5.phh");
2345 // Before all align times with table timeout
2346 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2347 if (isset($this->match[$table_idx])) {
2348 $bin5 = $this->match[$table_idx];
2350 $bin5_table = $bin5->table[0];
2351 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2352 // stat must be "table" by definition
2353 $bin5_user = $bin5->user[$i];
2355 if ($target != "" && $bin5_user->name != $target)
2357 log_main("writa: ".$user_mesg);
2358 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2359 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2360 $bin5_user->step_inc();
2362 } // if (isset($this->match
2363 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2364 } // if ($to_tabl == true ...
2367 if ($user->stat == 'room' && $user->subst == 'standup') {
2368 $this->standup_update($user);
2370 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2371 log_main("chatt_send pre table update");
2372 $this->table_update($user);
2373 log_main("chatt_send post table update");
2375 } // if ($update_room ...
2378 } // function chatt_send( ...
2380 function get_user($sess, &$idx)
2384 if (validate_sess($sess)) {
2385 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2386 if ($this->user[$i]->is_empty())
2388 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2391 $ret = $this->user[$i];
2395 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2396 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2397 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2400 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2407 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2410 * if ($idx > -1 && ret == FALSE) => duplicated nick
2411 * if ($idx == -2 && ret == FALSE) => invalid name
2412 * if ($idx == -3 && ret == FALSE) => wrong password
2413 * if ($idx == -1 && ret == FALSE) => no space left
2414 * if ($idx == 0 && ret == user) => SUCCESS
2415 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2418 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2424 $authenticate = FALSE;
2426 $login_exists = FALSE;
2428 $ghost_auth = FALSE;
2433 if (($name_new = validate_name($name)) == FALSE) {
2438 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2439 if (validate_sess($sess) == FALSE)
2442 /* if pass != FALSE verify the login with pass */
2443 log_auth("XXX", "auth1");
2445 if (($bdb = BriskDB::create()) != FALSE) {
2447 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2448 log_auth("XXX", "auth2");
2449 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2450 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2452 if ($authenticate != FALSE) {
2453 $user_type = $authenticate->type_get();
2461 $login_exists = $bdb->login_exists(strtolower($name_new));
2463 TO ENABLE USER-LOGIN ONLY
2464 - $login_exists = $bdb->login_exists(strtolower($name_new));
2465 + // $login_exists = $bdb->login_exists(strtolower($name_new));
2466 + // Force access with login and password
2473 // if db is down, send a warning and verify only current users
2474 // no actions at this moment
2476 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2478 if ($this->user[$i]->is_empty()) {
2479 if ($idfree == -1) {
2484 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2489 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2490 if ($authenticate != FALSE) {
2492 $ghost_auth = $this->user[$i]->is_auth();
2503 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2505 /* there is another user logged with your account and you and him have authenticated => new user
2506 get the session of the old user */
2507 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2510 $ghost_user = $this->user[$ghost];
2512 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2513 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2514 $ghost_user->step_inc();
2517 $ghost_user->sess = $sess;
2520 $ghost_user->sess = $sess;
2523 // If user at the table we need to update the table data too
2524 $table_idx = $ghost_user->table;
2525 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2526 require_once("${G_base}briskin5/Obj/briskin5.phh");
2527 if (isset($this->match[$table_idx])) {
2528 $bin5 = $this->match[$table_idx];
2530 if ($bin5->the_end != TRUE) {
2531 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2532 $bin5->user[$ghost_user->table_pos]->step_inc();
2533 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2539 if (defined('CURL_DE_SAC_VERS')) {
2540 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2542 return ($this->user[$ghost]);
2544 else if ($idx != -1 && $i == MAX_PLAYERS) {
2549 $this->user[$idx]->sess = $sess;
2552 $this->user[$idx]->sess = $sess;
2554 $this->user[$idx]->name = $name_new; // OK - add new user
2555 $this->user[$idx]->stat_set("room");
2556 $this->user[$idx]->step_set(0);
2557 while (array_pop($this->user[$idx]->comm) != NULL);
2558 $this->user[$idx]->subst = "standup";
2559 $this->user[$idx]->lacc = $curtime;
2560 $this->user[$idx]->laccwr = $curtime;
2561 $this->user[$idx]->bantime = 0;
2562 $this->user[$idx]->ip = $ip;
2564 $this->user[$idx]->rec = $authenticate;
2565 $this->user[$idx]->flags = $user_type;
2566 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2567 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2568 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2570 if ($authenticate != FALSE) {
2571 $this->user[$idx]->code = $authenticate->code_get();
2573 // all this part is included in the db server
2574 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2576 if (isset($cookie['CO_list'])) {
2577 // fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2578 if (strcmp($cookie['CO_list'], "auth") == 0) {
2579 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2580 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2582 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2583 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2584 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2587 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2592 // fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2595 // fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2597 log_main("ghost: rename!");
2598 $ghost_user = $this->user[$ghost];
2600 if ($ghost_auth == FALSE) {
2601 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2602 $ghostname = 'ghost'.$sfx;
2603 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2604 if (strcmp("", $this->user[$i]->sess) == 0)
2607 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2612 if ($ghostname != '')
2616 $ghost_user->name = $ghostname;
2618 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2619 $this->standup_update($ghost_user);
2622 log_main("chatt_send pre table update");
2623 $this->table_update($ghost_user);
2624 log_main("chatt_send post table update");
2626 } // if ($ghost_auth == FALSE
2628 // FIXME: cacciare il vecchio utente room && table (if needed)
2629 $ghost_user->the_end = TRUE;
2630 $ghost_user->lacc = 0;
2631 $this->garbage_manager(TRUE);
2633 } // if ($ghost > -1) {
2638 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));
2640 $ret = $this->user[$real_idx];
2641 if (defined('CURL_DE_SAC_VERS')) {
2642 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2650 function standup_update($user)
2652 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2653 $user_cur = $this->user[$i];
2654 if ($user_cur->is_active() == FALSE)
2657 log_main("STANDUP START: ".$user_cur->stat);
2659 if ($user_cur->stat == 'room') {
2660 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2661 if ($user->idx_get() == $i) {
2662 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2664 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2666 $user_cur->step_inc();
2671 function dump_data()
2673 $brisk_ser = serialize($this);
2674 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2675 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2682 function standup_content($user)
2686 if ($user->stat != 'room')
2689 $content = ' j_stand_cont( [ ';
2691 $user_cur_id = $user->idx_get();
2692 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2693 if ($this->user[$i]->is_active() == FALSE // is not active user
2694 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2695 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2698 $flags = $this->user[$i]->flags;
2700 // sql record exists AND last donate > 2013-01-01
2701 if ($this->user[$i]->is_supp_custom()) {
2702 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2708 if ($this->user[$i]->subst == "standup") {
2709 if ($user_cur_id == $i) {
2713 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2714 xcape($this->user[$i]->name), $supp_comp_s);
2723 function table_content($user, $table_idx, $use_cache=FALSE)
2729 // Si possono usare i dati nella classe table
2732 $sess = $user->sess;
2733 $table = $this->table[$table_idx];
2735 $user_at_table = FALSE;
2737 if ($user->stat != 'room')
2740 $user_cur_id = $user->idx_get();
2742 # check if user at table
2743 for ($i = 0 ; $i < $table->player_n ; $i++) {
2744 if ($user_cur_id == $table->player[$i]) {
2745 $user_at_table = TRUE;
2750 if ($use_cache && !$user_at_table && $table->cache != NULL) {
2751 return $table->cache;
2755 for ($i = 0 ; $i < $table->player_n ; $i++) {
2756 $user_cur = $this->user[$table->player[$i]];
2758 $flags = $user_cur->flags;
2760 if ($user_cur_id == $table->player[$i])
2763 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2764 if ($user_cur->is_supp_custom())
2765 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2769 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2770 xcape($user_cur->name), $supp_comp_s);
2775 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2776 if (! $user_at_table) {
2777 $table->cache = $ret;
2782 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2784 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2786 // printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2788 // fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2789 if ($this->black_check($addr)) {
2790 // TODO: waiting async 5 sec before close
2791 // fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2794 if ($path != "" && $path != "index.php") {
2795 if ($this->cloud_check($addr)) {
2796 // TODO: waiting async 5 sec before close
2801 $enc = get_encoding($header);
2802 if (isset($header['User-Agent'])) {
2803 if (strstr($header['User-Agent'], "MSIE")) {
2804 $transp_type = "htmlfile";
2807 $transp_type = "xhr";
2811 $transp_type = "iframe";
2813 force_no_cache($header_out);
2819 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2820 $content = ob_get_contents();
2823 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2824 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2828 case "index_wr.php":
2830 // Enhance required: in the POST case, after the header you must get content
2831 // from the socket, waiting if necessary
2835 index_wr_main($this, $addr, $get, $post, $cookie);
2836 $content = ob_get_contents();
2839 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2843 case "index_rd.php":
2844 case "index_rd_wss.php":
2845 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2847 if ($transp == 'websocket' || $transp == 'websocketsec')
2851 if (!isset($cookie['sess'])
2852 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2854 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2856 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2861 $this->sess_cur_set($user->sess);
2862 // close a previous opened index_read_ifra socket, if exists
2863 if (($prev = $user->rd_socket_get()) != NULL) {
2864 $s_a_p->socks_unset($user->rd_socket_get());
2865 fclose($user->rd_socket_get());
2866 // printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2867 $user->rd_socket_set(NULL);
2871 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2872 $response = headers_render($header_out, -1).$user->chunked_content($content);
2873 $response_l = mb_strlen($response, "ASCII");
2875 $wret = @fwrite($new_socket, $response, $response_l);
2876 if ($wret < $response_l) {
2877 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2878 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2881 $user->rd_cache_set("");
2883 fflush($new_socket);
2886 $s_a_p->socks_set($new_socket, $user, NULL);
2887 $user->rd_socket_set($new_socket);
2888 // printf(" - qui ci siamo - ");
2895 if (!(BRISK_DEBUG & DBG_ENGI))
2897 fprintf(STDERR, "TEST.PHP running\n");
2898 if (isset($post['data'])) {
2899 $content = $post['data'];
2902 $content = "NO DATA AVAILABLE";
2904 $header_out['Content-Type'] = 'text/plain';
2905 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2909 /* FAR TODO: move all into an array of registered sub-apps */
2910 $subs = "briskin5/";
2911 $subs_l = strlen($subs);
2912 if (!strncmp($path, $subs, $subs_l)) {
2913 $ret = Bin5::request_mgr($s_a_p, $header, $header_out, $new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2922 function match_add($idx, $match)
2924 $this->match[$idx] = $match;
2927 function match_del($idx)
2929 unset($this->match[$idx]);
2932 function match_get($idx, $token)
2934 if (isset($this->match[$idx])) {
2936 || $token == $this->match[$idx]->table_token) {
2937 return ($this->match[$idx]);
2942 function sess_cur_set($sess)
2944 static::$sess_cur = $sess;
2947 static function sess_cur_get()
2949 return(static::$sess_cur);
2951 } // end class Brisk
2953 function make_seed()
2955 list($usec, $sec) = explode(' ', microtime());
2956 return (float) $sec + ((float) $usec * 100000);
2959 function btrace_line($ar)
2961 GLOBAL $G_btrace_pref_sub;
2964 for ($i = 0 ; $i < count($ar) ; $i++) {
2965 $with_class = isset($ar[$i]['class']);
2966 $with_file = isset($ar[$i]['file']);
2967 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2968 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2969 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2970 ($with_file ? $ar[$i]['line'] : ""));
2976 function trace_ftok($id, $add)
2978 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2979 $tok=@ftok($id, $add);
2981 log_shme($tok.": ".$id." + ".$add);
2986 function log_mop($step, $log)
2990 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2993 $sess = Brisk::sess_cur_get();
2994 if (isset($sess) == FALSE)
2999 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
3002 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3003 $btrace = btrace_line(debug_backtrace());
3006 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3007 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
3012 function log_step($log)
3016 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
3019 $sess = Brisk::sess_cur_get();
3020 if (isset($sess) == FALSE)
3025 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
3028 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3029 $btrace = btrace_line(debug_backtrace());
3032 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
3033 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3040 function log_cds($log)
3044 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
3047 $sess = Brisk::sess_cur_get();
3048 if (isset($sess) == FALSE)
3053 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
3056 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3057 $btrace = btrace_line(debug_backtrace());
3060 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
3061 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3067 function log_only2($log)
3071 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
3074 $sess = Brisk::sess_cur_get();
3075 if (isset($sess) == FALSE)
3080 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
3083 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3084 $btrace = btrace_line(debug_backtrace());
3087 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3088 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3093 function log_crit($log)
3097 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
3100 $sess = Brisk::sess_cur_get();
3101 if (isset($sess) == FALSE)
3106 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
3109 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3110 $btrace = btrace_line(debug_backtrace());
3113 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3114 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3119 function log_only($log)
3123 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
3126 $sess = Brisk::sess_cur_get();
3127 if (isset($sess) == FALSE)
3132 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3135 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3136 $btrace = btrace_line(debug_backtrace());
3139 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3140 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3145 function log_main($log)
3149 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3152 $sess = Brisk::sess_cur_get();
3153 if (isset($sess) == FALSE)
3158 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3161 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3162 $btrace = btrace_line(debug_backtrace());
3165 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3166 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3171 function log_rd($log)
3175 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3178 $sess = Brisk::sess_cur_get();
3179 if (isset($sess) == FALSE)
3184 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3187 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3188 $btrace = btrace_line(debug_backtrace());
3191 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3192 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3197 function log_rd2($log)
3201 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3204 $sess = Brisk::sess_cur_get();
3205 if (isset($sess) == FALSE)
3210 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3213 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3214 $btrace = btrace_line(debug_backtrace());
3218 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3219 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3224 function log_send($log)
3228 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3231 $sess = Brisk::sess_cur_get();
3232 if (isset($sess) == FALSE)
3237 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3240 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3241 $btrace = btrace_line(debug_backtrace());
3244 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3245 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3250 function log_lock($log)
3254 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3257 $sess = Brisk::sess_cur_get();
3258 if (isset($sess) == FALSE)
3263 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3266 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3267 $btrace = btrace_line(debug_backtrace());
3270 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3271 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3276 function log_wr($log)
3280 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3283 $sess = Brisk::sess_cur_get();
3284 if (isset($sess) == FALSE)
3289 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3292 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3293 $btrace = btrace_line(debug_backtrace());
3296 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3297 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3302 function log_load($log)
3306 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3309 $sess = Brisk::sess_cur_get();
3310 if (isset($sess) == FALSE)
3315 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3318 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3319 $btrace = btrace_line(debug_backtrace());
3322 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3323 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3328 function log_auth($sess, $log)
3332 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3335 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3338 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3339 $btrace = btrace_line(debug_backtrace());
3342 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3343 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3348 function log_shme($log)
3352 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3355 $sess = Brisk::sess_cur_get();
3356 if (isset($sess) == FALSE)
3361 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3364 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3365 $btrace = btrace_line(debug_backtrace());
3368 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3369 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3376 // function log_legal($curtime, $sess, $name, $where, $mesg)
3377 function log_legal($curtime, $addr, $user, $where, $mesg)
3379 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3380 /* Unix time | session | nickname | IP | where was | mesg */
3381 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, ($user ? $user->sess : "NOSESS"),
3382 ($user ? ($user->is_auth() ? 'A' : 'N') : "U"),
3383 ($user ? $user->name : "NO-USER"), $addr, $where , $mesg));
3388 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3393 if ($sitted < PLAYERS_N) {
3401 if ($table == $cur_table)
3408 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3413 function show_notify($text, $tout, $butt, $w, $h)
3415 log_main("SHOW_NOTIFY: ".$text);
3416 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3419 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3421 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3422 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);
3425 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3427 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3430 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3431 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3434 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3435 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);
3439 function root_welcome($user)
3441 GLOBAL $root_wellarr, $G_lang;
3445 $dt = date("H:i ", $curtime);
3447 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3448 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3455 function validate_sess($sess)
3457 if (strlen($sess) == SESS_LEN)
3463 function validate_name($name)
3465 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3467 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3469 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3476 function playsound($name)
3478 return (sprintf('g_jukebox.play("%s");', $name));
3481 function secstoword($secs)
3487 $mins = floor($secs / 60);
3489 if ($G_lang == 'en') {
3491 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3494 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3498 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3501 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3506 function sharedmem_sz($tok)
3508 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3509 log_main("shmop_open failed");
3512 $shm_sz = shmop_size($shm_id);
3513 shmop_close($shm_id);
3515 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3522 static function lock_data($is_exclusive)
3524 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3525 self::$delta_t = microtime(TRUE);
3526 log_lock("LOCK warrant [".self::$delta_t."]");
3534 static function unlock_data($res)
3538 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3547 static function lock_data($is_exclusive)
3549 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3550 self::$delta_t = microtime(TRUE);
3551 log_lock("LOCK poll [".self::$delta_t."]");
3559 static function unlock_data($res)
3563 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3569 function carousel_top()
3574 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));
3577 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>'));
3581 function login_consistency($name)
3584 if (($len = mb_strlen($name)) > 12) {
3588 for ($i = 0 ; $i < mb_strlen($name) ; $i++) {
3589 $c = mb_substr($name, $i, 1);
3590 if (mb_ereg_match ("[a-zA-Z0-9]", $c)) {