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