5 * Copyright (C) 2006-2015 Matteo Nastasi
6 * mailto: nastasi@alternativeoutput.it
7 * matteo.nastasi@milug.org
8 * web: http://www.alternativeoutput.it
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details. You should have received a
19 * copy of the GNU General Public License along with this program; if
20 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21 * Suite 330, Boston, MA 02111-1307, USA.
26 define('BRISK_CONF', "brisk.conf.pho");
27 define('FTOK_PATH', "/var/lib/brisk");
28 define('LEGAL_PATH', "/tmp/legal_brisk");
29 define('PROXY_PATH', "/var/lib/brisk_proxy");
30 define('TABLES_N', 36);
31 define('TABLES_APPR_N', 12);
32 define('TABLES_AUTH_N', 8);
33 define('TABLES_CERT_N', 4);
34 define('PLAYERS_N', 3);
35 define('MAX_POINTS', 5);
36 define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N)));
37 define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS));
38 define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576);
39 define('SHM_DIMS_DLT', 65536);
41 define('SHM_DIMS_U_MIN', 4096);
42 define('SHM_DIMS_U_MAX', 65536);
43 define('SHM_DIMS_U_DLT', 4096);
46 define('COMM_GEN_N', 50);
49 define('CHAT_ILL_TIME', 6);
50 define('CHAT_ENABLED', TRUE);
52 define('SESS_LEN', 13);
53 define('STREAM_TIMEOUT', 60);
54 /* FIXME: move to sac-a-push .phh */
55 /* TIME_RD define the server-side timeout, after half of it a ping request
56 is sent to client, after this time the client is log out */
57 define('EXPIRE_TIME_RD', 180);
58 define('EXPIRE_TIME_SMAMMA', 360);
59 define('EXPIRE_TIME_WAG', 10);
60 define('WAKEUP_TIME', 12);
61 // BAN_TIME da allineare anche in commons.js
62 define('BAN_TIME', 900);
63 define('GARBAGE_TIMEOUT', 5);
64 define('NICKSERV', "BriskServ");
66 define('LOCK_SHARE_MAX', 10000);
68 define('DBG_ONL2', 0x000001);
69 define('DBG_ONLY', 0x000002);
70 define('DBG_MAIN', 0x000004);
71 define('DBG_READ', 0x000008);
72 define('DBG_REA2', 0x000010);
73 define('DBG_SEND', 0x000020);
74 define('DBG_LOCK', 0x000040);
75 define('DBG_WRIT', 0x000080);
76 define('DBG_LOAD', 0x000100);
77 define('DBG_AUTH', 0x000200);
78 define('DBG_CRIT', 0x000400);
79 define('DBG_LMOP', 0x000800);
80 define('DBG_TRAC', 0x001000);
81 define('DBG_SHME', 0x002000);
82 define('DBG_ENGI', 0x004000);
83 define('DBG_CDS', 0x008000);
84 define('DBG_STEP', 0x010000);
85 // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols
86 define('BRISK_DEBUG', 0x0800);
88 define('BRISK_SINGLE_DEBUG',0);
89 define('BRISK_SINGLE_SESS', "");
90 define('DEBUGGING', "no-debugging");
92 require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF);
93 require_once("${G_base}Obj/ipclass.phh");
95 $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
96 'en' => 'back standing' ),
97 'btn_close' => array( 'it' => 'chiudi',
100 'tit_all' => array( 'it' => 'tutti',
103 'tabtout_a'=> array( 'it' => '<br>Sei stato inattivo per ',
104 'en' => '<br>You are being idle for ' ),
105 'tabtout_b'=> array( 'it' => ' minuti. <br><br>Quindi ritorni tra i <b>Giocatori in piedi</b>.',
106 'en' => ' minutes. <br><br>Then you return with the <b>standing players</b>.'),
107 'tickmust' => array( 'it' => '<br>Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.<br><br>',
108 'en' => '<br>To activate the signalling message of the table it\'s necessary to be sitting<br><br>'),
109 'tickjust' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> ',
110 'en' => 'EN<br>Il messaggio di segnalazione del tavolo è già attivato.<br><br> '),
111 'tickwait' => array( 'it' => '<br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>',
112 'en' => 'EN<br>The signalling message of the table<br>will be deactivated for %d second%s.<br><br>'),
113 'alarpass' => array( 'it' => '<br>La password digitata non è corretta.<br><br>',
114 'en' => '<br>The entered password is not correct.<br><br>'),
115 'alarret' => array( 'it' => 'Alarm \\"<b>%s</b>\\" inviato a <b>%s</b>.',
116 'en' => 'Alarm \\"<b>%s</b>\\" sent to <b>%s</b>.'),
117 'authmust' => array( 'it' => '<b>Per autenticare qualcuno devi a tua volta essere autenticato e certificato.</b>',
118 'en' => '<b>To authenticate someone you have to be authenticated and certified.</b>'), // on your turn
119 'mesgmust' => array( 'it' => '<b>Per inviare un messaggio devi essere autenticato.</b>',
120 'en' => '<b>To send a message you have to be authenticated.</b>'),
121 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.',
122 'en' => 'The nickname have to contain at least one letter or one number.'),
123 'nickdupl' => array( 'it' => 'Nickname <b>%s</b> già in uso.',
124 'en' => 'The nickname <b>%s</b> is already in use.'),
125 'authchan' => array( 'it' => '<b>Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.</b>',
126 'en' => '<b>You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.</b>'),
127 'nickjust' => array( 'it' => 'Il nickname <b>\'%s\'</b> è già registrato, <b>se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghost<i>N</i>.</b>',
128 'en' => 'The nickname <b>\'%s\'</b> is already registered, <b>if its proprietary will authenticate you will named again officially ghost<i>N</i>.</b>'), // FIXME: him ???
129 'statunkn' => array( 'it' => 'Questo stato non esiste.',
130 'en' => 'This state don\'t exists.'),
131 'tabincon' => array( 'it' => '<br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>',
132 'en' => 'EN <br>I dati del tavolo n° %d sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>'),
133 'listmust' => array( 'it' => '<b>Per andare in isolamento non bisogna essere seduti a tavoli non riservati.</b>',
134 'en' => '<b>To go to isolation you must don\'t stay on not reserved tables</b>'),
136 'tit_onauth'=>array( 'it' => '(solo aut.)',
137 'en' => '(only aut.)'),
138 'tit_onisol'=>array( 'it' => '(isolam.to)',
139 'en' => '(isolation)'),
140 'db_failed' =>array('it' => '<br>Il collegamento al database è fallito.<br>Temporaneamente tutte le autenticazioni verranno sospese, accederai a Brisk come un utente normale.<br><br>Ci scusiamo per il disagio.',
141 'en' => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
143 'tos_old' => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
144 'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessarig per poter richiedere questa funzionalità.'),
145 'inf_self' => array( 'it' => 'Non puoi informarti su te stesso.',
146 'en' => 'EN Non puoi informarti su te stesso.'),
147 'inf_nfd' => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
148 'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
149 'inf_err' => array( 'it' => 'Error %d. Utilizzo: <b>/info <i><login></i></b>.',
150 'en' => 'Error %d. Usage: <b>/info <i><login></i></b>.')
153 $G_lng = langtolng($G_lang);
155 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
156 $G_brisk_version = "5.8.0";
158 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
159 $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: dati dai client via web-socket.',
160 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
161 'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info,',
162 'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.',
163 'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ) );
165 $G_room_help = array( 'it' => '
166 <div style=\\"text-align: left; padding: 8px;\\">
167 <b>Descrizione</b><br>
168 Questa è un\'implementazione della briscola in cinque, così come è spiegata su
169 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
170 <b>Configurazione del browser.</b><br>
171 Occorre abilitare i cookies.<br>
173 <b>Uso del sito</b><br>
174 Potete sedervi a un tavolo o rimanere in piedi.<br>
175 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
178 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
179 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
180 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
181 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
182 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
183 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
185 <dt><b>Comandi della chat</b>
186 <!-- <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname -->
187 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
188 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
189 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
190 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
191 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
192 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
193 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
199 <div style=\\"text-align: left; padding: 8px;\\">
200 <b>EN Descrizione</b><br>
201 EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su
202 <a target=\\"_blank\\" href=\\"http://it.wikipedia.org/wiki/Briscola#Gioco_a_5\\">Wikipedia</a>; in breve è la variante con l\'asta prima sulla carta e poi sui punti.<br><br>
203 <b>Configurazione del browser.</b><br>
204 Occorre abilitare i cookies.<br>
206 <b>Uso del sito</b><br>
207 Potete sedervi a un tavolo o rimanere in piedi.<br>
208 Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.<br>
211 All\'inizio vengono distribuite le carte e parte l\'asta; per partecipare all\'asta, quando sarà il vostro turno, potrete scegliere se andare avanti o passare cliccando sulle icone corrispondenti. Se si arriva ai punti, scrivete nella textbox il vostro rilancio e cliccate PUNTI.<br><br>
212 Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.<br>
213 Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.<br><br>
214 Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.<br><br>
215 Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.<br>
216 Dopo che è iniziata una partita per uscirne dovete chiedere agli altri giocatori di sbloccarla cliccando sul lucchetto. Se non si segue questa prassi, una volta usciti, non vi potrete sedere a nessun tavolo per '.floor(BAN_TIME/60).' minuti.
218 <dt><b>Comandi della chat</b>
219 <dd><b>/nick <i><nuovo_nickname></i></b> - cambio di nickname
220 <dd><b>/tav <i><frase di invito></i></b> - invito per gli altri giocatori al tavolo dove si è seduti
221 <dd><b>/st <i><stato></i></b> - cambia l\'icona associata al tuo user; <i>stato</i> può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
222 <dd><b>/cont <i><id partita></i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
223 <dd><b>/info <i><login></i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
224 <dd><b>/authreq</b> - se si è autenticati permette di garantire per un utente fidato
225 <dd><b>/mesgtoadm</b> - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
226 <dd><b>/listen <all or auth></b> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
232 $G_room_passwdhowto = array( 'it' => '<br><h2>Come registrarsi su Brisk</h2>
233 <div style=\\"text-align: left; padding: 8px;\\">
234 Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
236 <li><b>Facendosi garantire da un utente di Brisk che sia certificato.</b><br><br>
237 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
239 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
240 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
241 <li>Smart card di InfoCamere
244 <b>Per auto-garantisi occorre possedere:</b><br><br>
246 <li>il codice PIN della propria carta
247 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
250 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
252 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
253 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
254 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
255 diretta dell\' utente da parte dell\' amministratore.
260 'en' => '<br><h2>EN Come registrarsi su Brisk</h2>
261 <div style=\\"text-align: left; padding: 8px;\\">
262 EN Attualmente ci sono due metodi per ottenere una password sul sito:<br><br>
264 <li><b>Facendosi garantire da un utente di Brisk che già possidede una password</b><br><br>
265 <li><b>Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:</b><br><br>
267 <li>Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
268 <li>Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
271 <b>Per auto-garantisi occorre possedere:</b><br><br>
273 <li>il codice PIN della propria carta
274 <li>il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)
277 <b>Per effettuare la registrazione collegarsi al sito:</b> <a class=\\"flat\\" target=\\"_blank\\" href=\\"https://brisk.mine.nu\\">https://brisk.mine.nu</a>
279 Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra
280 <a class=\\"flat\\" href=\\"mailto:authadmbrisk@alternativeoutput.it\\">fai una segnalazione</a>.<br><br>
281 Le regole per ottenere la certificazione sono in via di definizione, l\' unica accettata è la conoscenza
282 diretta dell\' utente da parte dell\' amministratore.
289 <dd>Seguendo la procedura di auto-garanzia all\'url: <a href="https://brisk.mine.nu">https://brisk.mine.nu</a>
293 $G_room_about = array( 'it' => '<br>
294 <div id=\\"header\\" class=\\"header\\">
295 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
296 briscola chiamata in salsa ajax
298 <br><b>version '.$G_brisk_version.'</b><br><br>
299 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>',
301 <div id=\\"header\\" class=\\"header\\">
302 <img class=\\"nobo\\" src=\\"img/brisk_logo64.png\\">
303 declaration briscola in ajax sauce <b>(Beta)</b>
305 <br><b>version '.$G_brisk_version.'</b><br><br>
306 Copyright 2006-2012 <a href=\\"mailto:brisk@alternativeoutput.it\\">Matteo Nastasi</a> (aka mop)<br><br>');
309 $G_PG_vow = array("a", "e", "i", "o", "u", "y");
312 "b", "bb", "bc", "bd", "bf", "bg", "bk", "bl", "bm", "bn", "bp", "br", "bs", "bt", "bv", "bw", "bz",
313 "c", "cb", "cc", "cd", "cf", "cg", "ck", "cl", "cm", "cn", "cp", "cq", "cr", "cs", "ct", "cv", "cw", "cx", "cz",
314 "d", "db", "dc", "dd", "df", "dg", "dk", "dl", "dm", "dn", "dp", "dr", "ds", "dt", "dv", "dw", "dx", "dz",
315 "f", "fb", "fc", "fd", "ff", "fg", "fk", "fl", "fm", "fn", "fp", "fr", "fs", "ft", "fv", "fw", "fx", "fz",
316 "g", "gb", "gc", "gd", "gf", "gg", "gk", "gl", "gm", "gn", "gp", "gr", "gs", "gt", "gv", "gw", "gx", "gz",
317 "j", "jb", "jc", "jd", "jf", "jg", "jk", "jl", "jm", "jn", "jp", "jq", "jr", "js", "jt", "jv", "jw", "jx", "jz",
318 "k", "kb", "kc", "kd", "kf", "kg", "kk", "kl", "km", "kn", "kp", "kr", "ks", "kt", "kv", "kw", "kx", "kz",
319 "l", "lb", "lc", "ld", "lf", "lg", "lk", "ll", "lm", "ln", "lp", "lr", "ls", "lt", "lv", "lw", "lx", "lz",
320 "m", "mb", "mc", "md", "mf", "mg", "mk", "ml", "mm", "mn", "mp", "mr", "ms", "mt", "mv", "mw", "mx", "mz",
321 "n", "nb", "nc", "nd", "nf", "ng", "nk", "nl", "nm", "nn", "np", "nr", "ns", "nt", "nv", "nw", "nx", "nz",
322 "p", "pb", "pc", "pd", "pf", "pg", "pk", "pl", "pm", "pn", "pp", "pr", "ps", "pt", "pv", "pw", "px", "pz",
323 "q", "qb", "qc", "qd", "qf", "qg", "qk", "ql", "qm", "qn", "qp", "qq", "qr", "qs", "qt", "qv", "qw", "qx", "qz",
324 "r", "rb", "rc", "rd", "rf", "rg", "rk", "rl", "rm", "rn", "rp", "rr", "rs", "rt", "rv", "rw", "rx", "rz",
325 "s", "sb", "sc", "sd", "sf", "sg", "sk", "sl", "sm", "sn", "sp", "sq", "sr", "ss", "st", "sv", "sw", "sx", "sz",
326 "t", "tb", "tc", "td", "tf", "tg", "tk", "tl", "tm", "tn", "tp", "tr", "ts", "tt", "tv", "tw", "tx", "tz",
327 "v", "vb", "vc", "vd", "vf", "vg", "vk", "vl", "vm", "vn", "vp", "vr", "vs", "vt", "vv", "vw", "vx", "vz",
328 "w", "wb", "wc", "wd", "wf", "wg", "wk", "wl", "wm", "wn", "wp", "wr", "ws", "wt", "wv", "ww", "wx", "wz",
329 "x", "xb", "xc", "xd", "xf", "xg", "xk", "xl", "xm", "xn", "xp", "xr", "xs", "xt", "xv", "xw", "xx", "xz",
330 "z", "zb", "zc", "zd", "zf", "zg", "zk", "zl", "zm", "zn", "zp", "zr", "zs", "zt", "zv", "zw", "zx", "zz",
332 // $G_PG_cons_n = count($G_PG_cons);
333 // printf("N CONS: %d\n", $G_PG_cons_n);
335 /* printf("%d %d\n", count($voc), count($cons)); */
336 /* for ($i = 0 ; $i < 26 ; $i++) { */
337 /* if (array_search(chr(ord('a') + $i), $voc) !== FALSE || $i == 7) */
339 /* printf(' "%s", ', chr(ord('a') + $i)); */
340 /* for ($e = 0 ; $e < 26 ; $e++) { */
341 /* if (array_search(chr(ord('a') + $e), $voc) !== FALSE || $e == 7) */
343 /* printf('"%s%s", ', chr(ord('a') + $i), chr(ord('a') + $e)); */
350 return (ip2long($s));
355 return (long2ip($i));
358 function int2four($l)
360 if (PHP_INT_SIZE == 4)
363 return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
366 function four2int($s)
368 return ($s & 0xffffffff);
373 return int2four( ip2int($s) );
378 return int2ip( four2int($i) );
381 function nickserv_msg($dt, $msg) {
382 return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
385 function passwd_gen($seed = NULL)
387 GLOBAL $G_PG_vow, $G_PG_vow_n, $G_PG_cons, $G_PG_cons_n;
396 for ($sil = 0 ; $sil < 7 ; $sil++) {
397 if (($sil % 2) == 0) {
399 for ($n = 0 ; $n < mt_rand(1,2) ; $n++) {
401 $old = mt_rand(0, $G_PG_vow_n-1);
402 $pw .= $G_PG_vow[$old];
405 $new = mt_rand(0, $G_PG_vow_n-1);
407 $new = ($new + mt_rand(0, $G_PG_vow_n-2)) % $G_PG_vow_n;
408 $pw .= $G_PG_vow[$new];
414 $pw .= $G_PG_cons[mt_rand(0, $G_PG_cons_n-1)];
421 function cmd_return($val, $desc)
423 return array('val' => $val, 'desc' => $desc);
426 function cmd_serialize($attrs)
431 foreach ($attrs as $key => $value) {
432 $ret .= $sep . $key . '=' . urlencode($value);
438 function cmd_deserialize($cmd)
441 $a = explode('&', $cmd);
443 while ($i < count($a)) {
444 $b = split('=', $a[$i]);
445 $ret[urldecode($b[0])] = urldecode($b[1]);
456 function versions_cmp($v1, $v2)
458 // printf("V1: [%s]\nV2: [%s]\n", $v1, $v2);
462 $v1_ar = split('\.', $v1);
463 $v2_ar = split('\.', $v2);
465 $v2_ct = count($v2_ar);
467 for ($i = 0 ; $i < count($v1_ar) ; $i++) {
468 if (($v2_ct - 1) < $i) {
471 // printf("here [%s] [%s]\n", $v1_ar[$i], $v2_ar[$i]);
472 if ($v1_ar[$i] != $v2_ar[$i]) {
473 if (strval($v1_ar[$i]) < strval($v2_ar[$i]))
482 // return string with IPV4 address
483 function addrtoipv4($addr)
485 $ipv4addr_arr = explode(':' , $addr);
486 if (isset($ipv4addr_arr[3])) {
487 $ipv4addr = $ipv4addr_arr[3];
497 for ($i = 0; $i < ob_get_level(); $i++)
499 ob_implicit_flush(1);
503 function force_no_cache(&$header_out)
505 $header_out['Pragma'] = 'no-cache, must-revalidate';
506 $header_out['Cache-Control'] = 'no-cache';
507 $header_out['Expires'] = '-1';
510 function file_lock($fname, $is_exclusive)
512 if (($res = @fopen($fname, "r+")) == FALSE) {
516 if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) {
524 function file_unlock($res)
527 flock($res, LOCK_UN);
532 $escpush_from = array("\\", "\"");
533 $escpush_to = array("\\\\", "\\\"");
536 GLOBAL $escpush_from, $escpush_to;
538 return str_replace($escpush_from, $escpush_to, $s);
541 $escinp_from = array( "\"" );
542 $escinp_to = array( """ );
544 function escinput($s)
546 GLOBAL $escinp_from, $escinp_to;
548 return str_replace($escinp_from, $escinp_to, $s);
553 return htmlentities($s, ENT_COMPAT, "UTF-8");
556 function esclfhtml($s)
558 return str_replace(" ", " ", str_replace("\n", "<br>", htmlspecialchars($s)));
561 function langtolng($lang)
565 return ($G_lang == 'en' ? '-en' : '');
568 function csplitter($in, $sep)
574 for ($i = 0 ; $i < strlen($in) ; $i++) {
575 $ini = substr($in, $i, 1);
579 else if ($ini == $sep) {
598 $from = array ( '\\', '@', '|' );
599 $to = array ( '\\\\', '@', '¦' );
601 return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8")));
606 $from = array ( '\\', '|', "\t", "\n");
607 $to = array ( '\\\\', '\\|', "\\t", "\\n");
609 return (str_replace($from, $to, $s));
612 function xcapemesg($s)
614 $from = array ( "\n");
615 $to = array ( "\\n");
617 return (str_replace($from, $to, $s));
627 function getbyid($idx)
629 return ($this->el[$idx]);
632 function setbyid($idx, $v)
634 $this->el[$idx] = $v;
638 define('TABLE_AUTH_TY_PUBL', 0);
639 define('TABLE_AUTH_TY_APPR', 1);
640 define('TABLE_AUTH_TY_AUTH', 2);
641 define('TABLE_AUTH_TY_CERT', 3);
649 var $auth_type; // required authorization to sit down
656 var $table_start; // information field
664 function create($idx)
666 if (($thiz = new Table()) == FALSE)
670 $thiz->player = array();
673 if ($idx < TABLES_CERT_N)
674 $thiz->auth_type = TABLE_AUTH_TY_CERT;
675 else if ($idx < TABLES_AUTH_N)
676 $thiz->auth_type = TABLE_AUTH_TY_AUTH;
677 else if ($idx < TABLES_APPR_N)
678 $thiz->auth_type = TABLE_AUTH_TY_APPR;
680 $thiz->auth_type = TABLE_AUTH_TY_PUBL;
686 $thiz->table_token = "";
687 $thiz->table_start = 0;
689 $thiz->wakeup_time = 0;
696 $this->idx = $from->idx;
697 $this->player = array();
698 for ($i = 0 ; $i < $from->player_n ; $i++)
699 $this->player[$i] = $from->player[$i];
700 $this->player_n = $from->player_n;
702 log_main("PLAYER_N - parent::copy.".$this->player_n);
704 $this->auth_type = $from->auth_type;
706 $this->wag_own = $from->wag_own;
707 $this->wag_com = $from->wag_com;
708 $this->wag_tout = $from->wag_tout;
710 $this->table_token = $from->table_token;
711 $this->table_start = $from->table_start;
713 $this->wakeup_time = $from->wakeup_time;
716 function myclone($from)
718 if (($thiz = new Table()) == FALSE)
726 function spawn($from)
728 if (($thiz = new Table()) == FALSE)
731 $thiz->idx = $from->idx;
732 $thiz->player = array();
733 for ($i = 0 ; $i < $from->player_n ; $i++)
734 $thiz->player[$i] = $i;
735 $thiz->player_n = $from->player_n;
737 $thiz->auth_type = $from->auth_type;
739 $thiz->wag_own = $from->wag_own;
740 $thiz->wag_com = $from->wag_com;
741 $thiz->wag_tout = $from->wag_tout;
743 $thiz->table_token = $from->table_token;
744 $thiz->table_start = $from->table_start;
746 $thiz->wakeup_time = $from->wakeup_time;
751 function wag_set($user_idx, $mesg)
755 $this->wag_own = $user_idx;
756 $this->wag_com = $mesg;
760 function wag_reset($timeout)
762 log_main("WAG_RESET");
764 unset($this->wag_own);
767 $this->wag_tout = $timeout;
770 function player_get($idx)
772 return ($this->player[$idx]);
775 function player_set($idx, $player)
777 $this->player[$idx] = $player;
780 function user_add($idx)
782 $this->player[$this->player_n] = $idx;
785 return ($this->player_n - 1);
788 function user_rem($brisk, $user)
790 $tabpos = $user->table_pos;
792 /* verifico la consistenza dei dati */
793 if ($brisk->user[$this->player[$tabpos]] == $user) {
795 /* aggiorna l'array dei giocatori al tavolo. */
796 for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) {
797 $this->player[$i] = $this->player[$i+1];
798 $user_cur = $brisk->user[$this->player[$i]];
799 $user_cur->table_pos = $i;
804 log_main("INCONSISTENCY ON TABLE.");
808 // Table->act_content - return 'id' of type of output required for table button
809 function act_content($user)
812 $isstanding = ($user->subst == 'standup');
813 $sitted = $this->player_n;
815 $cur_table = $user->table;
819 if ($sitted < PLAYERS_N) {
820 switch ($this->auth_type) {
821 case TABLE_AUTH_TY_CERT:
822 if ($user->is_cert() && !$user->is_appr())
827 case TABLE_AUTH_TY_AUTH:
828 if ($user->is_auth() && !$user->is_appr())
833 case TABLE_AUTH_TY_APPR:
834 if ($user->is_auth())
849 if ($table == $cur_table)
856 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
869 function Delay_Manager($triglevel)
871 $this->triglevel = $triglevel;
872 $this->delta = array();
873 $this->lastcheck = 0;
876 function delta_get($curtime)
878 // clean too old delta items
879 for ($i = 0 ; $i < count($this->delta) ; $i++) {
880 if ($this->delta[$i][0] < $curtime) {
881 array_splice($this->delta, $i, 1);
886 // add new delta items if delay exceeded $this->triglevel sec
887 if ($curtime > $this->lastcheck + $this->triglevel && $curtime < $this->lastcheck + 1200.0) {
888 $delta = $curtime - $this->lastcheck - $this->triglevel;
889 array_push($this->delta, array($curtime + $delta , $delta));
890 // fprintf(STDERR, "DELTA: add new delta [%f] [%f] [%f]\n", $this->triglevel, $curtime + $delta, $delta);
893 // extract the maximum valid delta
895 for ($i = 0 ; $i < count($this->delta) ; $i++) {
896 $delta_cur = $this->delta[$i][1];
897 if ($delta_max < $delta_cur)
898 $delta_max = $delta_cur;
901 // fprintf(STDERR, "DELTA: status %d, delta_max: %f\n", count($this->delta), $delta_max);
906 function lastcheck_set($curtime)
908 $this->lastcheck = $curtime;
916 function Client_prefs()
920 static function from_user($user)
922 $thiz = new Client_prefs();
923 $thiz->user_load($user);
928 static function from_json($json)
930 $thiz = new Client_prefs();
931 if ($thiz->json_load($json) == FALSE) {
939 function user_load($user)
941 // fprintf(STDERR, "QQ %s: %x\n", __FUNCTION__, $user->flags);
942 $this->listen = ($user->flags & USER_FLAG_MAP_AUTH) >> 2;
943 if ($user->rec != FALSE) {
944 $this->supp_comp = $user->rec->supp_comp_get();
947 $this->supp_comp = "000000000000";
950 // fprintf(STDERR, "QQ %s: LISTEN: %d\n", __FUNCTION__, $this->listen);
953 function json_load($json_s)
958 if (gettype($json_s) == "string") {
959 if (($json = json_decode($json_s)) == FALSE)
965 if ($this->listen < 0 || $this->listen > 2)
967 $this->listen = $json->listen;
969 if (mb_strlen($json->supp_comp, "ASCII") != 12)
972 for ($i = 0, $idx = 0 ; $i < 12 ; $i++) {
973 if (($json->supp_comp[$i] >= '0' && $json->supp_comp[$i] <= '9') ||
974 ($json->supp_comp[$i] >= 'a' && $json->supp_comp[$i] <= 'f'))
980 $this->supp_comp = $json->supp_comp;
987 function store($user, $is_save)
990 // fprintf(STDERR, "QQ %s::%s PRE: %x\n", __CLASS__, __FUNCTION__,
991 // $user->flags & (~USER_FLAG_S_ALL & ~USER_FLAG_AUTH));
992 $user->flags_set(($this->listen << 2), USER_FLAG_MAP_AUTH);
993 // fprintf(STDERR, "QQ %s::%s %x\n", __CLASS__, __FUNCTION__,
995 if ($user->is_supp_custom()) {
996 $user->rec->supp_comp_set($this->supp_comp);
999 $user->prefs_store();
1003 define('GHOST_SESS_TOUT', 1800);
1004 define('GHOST_SESS_REAS_LOUT', 1); // logout
1005 define('GHOST_SESS_REAS_ANOT', 2); // another user get session
1006 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
1007 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
1008 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
1009 define('GHOST_SESS_REAS_PROX', 6); // proxy access
1017 function GhostSessEl($time, $sess, $reas)
1019 $this->time = $time + GHOST_SESS_TOUT;
1020 $this->sess = $sess;
1021 $this->reas = $reas;
1029 function GhostSess()
1031 $this->gs = array();
1034 // push or update for this session
1035 function push($time, $sess, $reas)
1037 foreach($this->gs as $el) {
1038 if ($el->sess == "$sess") {
1040 $el->time = $time + GHOST_SESS_TOUT;
1045 $this->gs[] = new GhostSessEl($time, $sess, $reas);
1051 foreach($this->gs as $key => $el) {
1052 if ($el->sess == "$sess") {
1053 $ret = $this->gs[$key];
1054 unset($this->gs[$key]);
1061 function garbage_manager($curtime)
1063 foreach($this->gs as $key => $el) {
1064 if ($el->time < $curtime) {
1065 unset($this->gs[$key]);
1075 var $crystal_filename;
1079 var $comm; // commands for many people
1080 var $step; // current step of the comm array
1081 var $garbage_timeout;
1084 var $ban_list; // ban list (authized allowed)
1085 var $black_list; // black list (anti-dos, noone allowed)
1086 var $cloud_smasher; // list of cloud ip ranges to be rejected
1092 public static $sess_cur;
1100 static function create($crystal_filename, $ban_list, $black_list, $cloud_smasher) {
1101 if (($brisk_ser = @file_get_contents($crystal_filename)) != FALSE) {
1102 if (($brisk = unserialize($brisk_ser)) != FALSE) {
1103 fprintf(STDERR, "ROOM FROM FILE\n");
1104 rename($crystal_filename, $crystal_filename.".old");
1106 $brisk->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1112 fprintf(STDERR, "NEW ROOM\n");
1113 $thiz = new Brisk();
1115 $thiz->crystal_filename = $crystal_filename;
1116 $thiz->user = array();
1117 $thiz->table = array();
1118 $thiz->match = array();
1120 $thiz->ban_list = IpClass::create();
1121 $thiz->black_list = IpClass::create();
1122 $thiz->cloud_smasher = IpClass::create();
1123 $thiz->ghost_sess = new GhostSess();
1125 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1126 $thiz->user[$i] = User::create($thiz, $i, "", "");
1129 for ($i = 0 ; $i < TABLES_N ; $i++) {
1130 $thiz->table[$i] = Table::create($i);
1132 $thiz->garbage_timeout = 0;
1133 $thiz->shm_sz = SHM_DIMS_MIN;
1135 $thiz->delay_mgr = new Delay_Manager(1.5);
1137 static::$sess_cur = FALSE;
1139 $thiz->reload(TRUE, $ban_list, $black_list, $cloud_smasher);
1144 function reload($is_first, $ban_list, $black_list, $cloud_smasher)
1146 fprintf(STDERR, "RELOAD STUFF (%d)(%d)(%d)\n",
1147 count($ban_list), count($black_list), count($cloud_smasher));
1149 if (defined('CURL_DE_SAC_VERS')) {
1150 if (brisk_cds_reload($this) == FALSE) {
1154 $this->ban_list->update($ban_list);
1155 $this->black_list->update($black_list);
1156 $this->cloud_smasher->update($cloud_smasher);
1159 $this->banned_kickoff();
1160 $this->garbage_manager(TRUE);
1164 function banned_kickoff()
1168 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1169 $table_cur = $this->table[$table_idx];
1170 // if the table is complete and exists we check users IP
1172 if ($table_cur->player_n == PLAYERS_N) {
1173 if (isset($this->match[$table_idx]) &&
1174 $table_cur->table_token == $bin5->table_token) {
1175 log_main("PLAYERS == N TABLE ".$table_idx);
1177 $bin5 = $this->match[$table_idx];
1179 $is_ban |= $bin5->banned_kickoff();
1184 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1185 $user_cur = $this->user[$i];
1187 if ($user_cur->is_active() == FALSE)
1190 // check if the IP is blacklisted
1191 if ($this->black_check($user_cur->ip) ||
1192 $this->cloud_check($user_cur->ip)) {
1193 $user_cur->lacc = 0;
1198 // if authorized not check if banlisted
1199 if ($user_cur->is_auth()) {
1203 if ($this->ban_check($user_cur->ip)) {
1204 $user_cur->lacc = 0;
1212 function ban_check($ip_str)
1214 return ($this->ban_list->check($ip_str));
1217 function black_check($ip_str)
1219 return ($this->black_list->check($ip_str));
1222 function cloud_check($ip_str)
1224 return ($this->cloud_smasher->check($ip_str));
1227 function users_cleanup()
1230 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1231 $user_cur = $this->user[$i];
1233 if ($user_cur->the_end
1234 && (($user_cur->rd_toflush == FALSE
1235 && $user_cur->rd_step == $user_cur->step)
1236 || $user_cur->rd_endtime_is_expired($curtime))
1238 $user_cur->reset(); // users_cleanup, OK
1243 function garbage_manager($force)
1245 GLOBAL $G_lang, $mlang_brisk, $G_base;
1249 log_rd2("garbage_manager START");
1251 /* Garbage collector degli utenti in timeout */
1252 $curtime = microtime(TRUE);
1254 $delta = $this->delay_mgr->delta_get($curtime);
1256 if (!$force && !($this->garbage_timeout < $curtime)) {
1257 $this->delay_mgr->lastcheck_set($curtime);
1261 // Before all align times with table timeout
1262 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1263 $table_cur = $this->table[$table_idx];
1264 // if the table is complete and exists its shared mem we get the info about users lacc
1266 if ($table_cur->player_n == PLAYERS_N) {
1267 log_main("PLAYERS == N TABLE ".$table_idx);
1270 $no_recovery = FALSE;
1271 if (isset($this->match[$table_idx])) {
1272 $bin5 = $this->match[$table_idx];
1274 if ($table_cur->table_token != $bin5->table_token) {
1275 log_main("ERROR: not matching table_token. Brisk: ".$table_cur->table_token." Table: ".$bin5->table_token);
1276 log_main("ERROR: not matching table_start. Brisk: ".$table_cur->table_start." Table: ".$bin5->table_start);
1277 $no_recovery = TRUE;
1281 if ($bin5 != FALSE) {
1285 log_main("garbage_manager: bri loaded successfully.");
1286 $bin5->garbage_manager(TRUE);
1288 $bin5_table = $bin5->table[0];
1290 // is the end of the table
1292 if ($bin5->the_end == TRUE) {
1294 * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN
1296 log_main("garbage_manager: INSIDE THE END.");
1298 $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n";
1299 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1300 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1303 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1304 // stat must be "table" by definition
1305 $user_cur = $this->user[$table_cur->player[$i]];
1306 $bin5_user = $bin5->user[$i];
1308 $user_cur->subst = $bin5_user->subst;
1309 $user_cur->rd_step = $bin5_user->rd_step;
1310 $user_cur->step = $bin5_user->step;
1311 $user_cur->lacc = $bin5_user->lacc;
1312 $user_cur->laccwr = $bin5_user->lacc;
1313 $user_cur->bantime = $bin5_user->bantime;
1314 $user_cur->the_end = $bin5_user->the_end;
1315 if ($user_cur->the_end) {
1316 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TTOT);
1320 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME", $plist);
1322 $this->room_join_wakeup($user_cur, FALSE, 0);
1323 $table_cur->table_token = "";
1324 $table_cur->wakeup_time = $curtime + WAKEUP_TIME;
1326 $this->match_del($table_idx);
1329 log_main("gm:: save_data");
1331 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
1332 $this->user[$table_cur->player[$i]]->lacc = $bin5->user[$i]->lacc;
1335 } // if ($bin5 == FALSE
1336 else if ($no_recovery == FALSE) {
1337 log_crit("ERROR: table ".$table_idx." unrecoverable join");
1339 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1340 $user_cur = $this->user[$table_cur->player[$i]];
1341 $user_cur->subst = "shutdowner";
1342 $user_cur->step_inc();
1344 $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst);
1345 $ret .= "gst.st = ".($user_cur->step+1)."; ";
1346 // MLANG <br>I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.<br><br>Torni in piedi.<br><br>
1347 $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table);
1348 $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110);
1349 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1350 $user_cur->step_inc();
1353 $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n";
1354 for ($i = 0 ; $i < $table_cur->player_n ; $i++) {
1355 $plist .= '|'.$this->user[$table_cur->player[$i]]->sess;
1357 log_legal($curtime, $user_cur->ip, $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist);
1359 $this->room_join_wakeup($user_cur, TRUE, -2);
1360 $table_cur->table_token = "";
1363 } // if ($table_cur->player_n == PLAYERS_N) {
1364 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
1366 log_rd2("out new loop.");
1368 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1369 $user_cur = $this->user[$i];
1371 log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst);
1373 if ($user_cur->is_active() == FALSE)
1376 if ($user_cur->lacc + (($user_cur->ping_req ? 1.5 : 1.0) * EXPIRE_TIME_RD) < ($curtime - $delta)) {
1377 // Auto logout dell'utente
1378 log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime - delta ".($curtime - $delta));
1380 $this->ghost_sess->push($curtime, $user_cur->sess, GHOST_SESS_REAS_TOUT);
1381 $user_cur->the_end = TRUE;
1383 log_rd2("AUTO LOGOUT.");
1384 if ($user_cur->stat == 'table' || $user_cur->stat == 'room') {
1385 log_auth($user_cur->sess, "Autologout session.");
1387 if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table')
1388 $this->room_wakeup($user_cur);
1389 else if ($user_cur->subst == 'standup')
1390 $this->room_outstandup($user_cur);
1392 log_rd2("LOGOUT FROM WHAT ???");
1396 if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < ($curtime - $delta)) { // lo rimettiamo in piedi
1397 if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') {
1398 $this->room_wakeup($user_cur);
1399 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
1400 /* 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" */
1401 $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);
1402 $user_cur->step_inc();
1406 log_rd2("GARBAGE UPDATED!");
1408 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
1411 $this->ghost_sess->garbage_manager($curtime);
1413 $this->delay_mgr->lastcheck_set($curtime);
1417 function show_room($user_step, $user)
1419 GLOBAL $G_lang, $mlang_brisk;
1420 log_main("show_room: username: ".$user->name);
1422 $ret = sprintf('gst.st = %d; ', $user_step);
1424 $prefs = Client_prefs::from_user($user);
1425 $ret .= sprintf('prefs_load(\'%s\', false, false);', json_encode($prefs));
1428 if ($user->flags & USER_FLAG_ISOLAUTH) {
1429 $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); ';
1431 else if ($user->flags & USER_FLAG_LISTAUTH) {
1432 $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); ';
1435 $ret .= 'list_set(\'all\', false, \'\' ); ';
1439 if ($user->subst == 'standup')
1440 $ret .= "tra.show(); ";
1442 $ret .= "tra.hide(); ";
1444 $ret .= sprintf('stat = "%s";', $user->stat);
1446 $ret .= root_welcome($user);
1447 if ($user->flags & USER_FLAG_DBFAILED) {
1448 $ret .= "gst.st = ".($user->step+1)."; ";
1449 $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140);
1452 $ret .= sprintf('subst = "%s";', $user->subst);
1453 $ret .= $user->myname_innerHTML();
1455 for ($i = 0 ; $i < TABLES_N ; $i++) {
1457 $ret .= $this->table_content($user, $i);
1459 $ret .= $this->table[$i]->act_content($user);
1460 if ($this->table[$i]->wag_own != -1)
1461 $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com);
1463 $ret .= sprintf('tra.rem(%d); ', $i);
1465 $ret .= $this->standup_content($user);
1466 $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); ";
1471 function room_wakeup($user)
1473 $table_idx = $user->table;
1474 $table = $this->table[$table_idx];
1476 log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1480 $from_table = ($user->stat == "table");
1482 log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1484 for ($i = 0 ; $i < $table->player_n ; $i++) {
1485 $user_cur = $this->user[$table->player[$i]];
1486 log_main("PREIMPOST: INLOOP name: ".$user_cur->name);
1488 if ($user->idx_get() != $table->player[$i]) {
1489 $user_cur->stat_set("room");
1490 $user_cur->subst = "sitdown";
1491 $user_cur->laccwr = $curtime;
1493 else if ($user->is_active()) {
1494 $user_cur->stat_set("room");
1495 $user_cur->subst = "standup";
1496 $user_cur->laccwr = $curtime;
1497 $user_cur->table = -1;
1502 $user->stat_set("room");
1503 $user->subst = "standup";
1504 $user->laccwr = $curtime;
1507 $remove_wagon = FALSE;
1508 if($table->wag_own == $user->idx_get()) {
1509 $table->wag_reset($curtime);
1510 $remove_wagon = TRUE;
1513 /* aggiorna l'array dei giocatori al tavolo. */
1514 $table->user_rem($this, $user);
1516 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1517 $user_cur = $this->user[$i];
1518 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1521 // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user);
1523 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1524 if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) {
1525 $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|';
1526 // $ret .= 'gst.st_loc++; document.location.assign("index.php");|';
1527 log_main("DOCUMENT.index.php: from table");
1529 else if ($user_cur->stat == "room") {
1530 log_main("DOCUMENT.index.php: from table");
1532 $ret .= $this->table_content($user_cur, $table_idx);
1533 $ret .= $this->standup_content($user_cur);
1535 // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE);
1536 $ret .= $table->act_content($user);
1538 if ($user->idx_get() == $i) {
1539 // set the new status
1540 $ret .= 'subst = "standup"; tra.show(); ';
1541 // clean the action buttons in other tables
1542 for ($e = 0 ; $e < TABLES_N ; $e++) {
1543 if ($this->table[$e]->player_n < PLAYERS_N) {
1544 $ret .= $this->table[$e]->act_content($user);
1549 $ret .= $table->act_content($user_cur);
1552 log_wr("ROOM_WAKEUP: ".$ret);
1553 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1554 $user_cur->step_inc();
1558 function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta)
1560 $table_idx = $user->table;
1561 $table = $this->table[$table_idx];
1563 log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst);
1566 $user_wup = array();
1568 $user_tab = array();
1570 log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
1572 for ($i = 0 ; $i < $table->player_n ; $i++) {
1573 $user_cur = $this->user[$table->player[$i]];
1574 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
1575 if ($user_cur->is_empty()) {
1578 if ($update_lacc == TRUE) {
1579 $user_cur->laccwr = $curtime;
1581 log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst);
1582 if ($user_cur->subst == "shutdowned") {
1583 $user_cur->stat_set("room");
1584 $user_cur->subst = "sitdown";
1586 else if ($user_cur->subst == "shutdowner") {
1587 $user_cur->stat_set("room");
1588 $user_cur->subst = "standup";
1589 $user_cur->table = -1;
1590 $user_wup[$user_wup_n++] = $user_cur;
1592 $remove_wagon = FALSE;
1593 if($table->wag_own == $table->player[$i]) {
1594 $remove_wagon = TRUE;
1595 $table->wag_reset($curtime);
1598 $user_tab[$user_tab_n++] = $table->player[$i];
1601 for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++)
1602 $table->user_rem($this, $user_wup[$wup_idx]);
1604 /* aggiorna l'array dei giocatori al tavolo. */
1606 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1607 log_main("START LOOP");
1608 $user_cur = $this->user[$i];
1609 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') { // is not active user or the stat isn't 'room'
1610 log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst);
1615 log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx);
1617 $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : "");
1618 if ($user_cur->stat == "room") {
1619 log_main("DOCUMENT.index.php from table");
1621 $ret .= $this->table_content($user_cur, $table_idx);
1622 $ret .= $this->standup_content($user_cur);
1624 $ret .= $table->act_content($user_cur);
1627 for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++)
1628 if ($user_tab[$tab_idx] == $i)
1631 // for users that wakeup the room will be reconstructed by index_rd.php
1632 if ($tab_idx < $user_tab_n) {
1633 log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1635 // ARRAY_POP DISABLED
1636 // if ($trans_delta == 0)
1637 // while (array_pop($user_cur->comm) != NULL);
1639 $user_cur->trans_step = $user_cur->step + 1 + $trans_delta;
1640 $user_cur->comm[$user_cur->step % COMM_N] = "";
1641 $user_cur->step_inc();
1642 $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur);
1643 $user_cur->step_inc();
1644 log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step);
1648 log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n);
1650 log_main("JOIN_WAKEUP more");
1652 $ret .= $table->act_content($user_cur);
1654 log_main("JOIN_WAKEUP end more");
1656 log_wr("ROOM_JOIN_WAKEUP: ".$ret);
1657 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1658 $user_cur->step_inc();
1663 function info_show($user, $target, $dt)
1665 if success return assoc. array with "ret" => 0 and other fields
1666 else return an assoc. array with "ret: != 0 and "mesg" with an error description
1668 function info_show($user, $target, $dt)
1670 GLOBAL $G_lang, $mlang_brisk, $G_base;
1677 if ($target == "") {
1681 if (($bdb = BriskDB::create()) == FALSE) {
1685 if ($target == $user->name) {
1687 $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]);
1690 if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
1694 if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
1695 $guar_login = $guar_item->login_get();
1700 $user_tos_vers = $user_item->tos_vers_get();
1702 $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code);
1704 $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code);
1705 $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code);
1706 $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code);
1707 $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code);
1709 if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code,
1710 $widefriend, $narrowfriend)) == FALSE) {
1711 $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code,
1712 $widefriend, $narrowfriend);
1715 if (versions_cmp($user_tos_vers, "1.2") < 0) {
1716 $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target));
1718 else if ($guar_login == "") {
1719 $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
1723 if ($ret > 0 && $mesg == "") {
1724 $mesg = sprintf($mlang_brisk['inf_err'][$G_lang], $ret);
1728 $jret = json_encode(array("ret" => $ret, "mesg" => $mesg));
1731 $jret = json_encode(array("ret" => 0,
1734 // FIXME: state internationalization
1736 ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
1737 ($user_item->type & USER_FLAG_TY_CERT ? "Certificato" :
1738 ($user_item->type & (USER_FLAG_TY_NORM | USER_FLAG_TY_SUPER) ?
1739 "Normale" : "Stato sconosciuto"))),
1740 "guar" => ($user_item->type & USER_FLAG_TY_APPR ?
1742 "party" => $partyskill,
1743 "match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) ,
1744 "game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt),
1745 "friend" => usersnet_friend_getlabel($usersnet_item->friend),
1746 "skill" => $usersnet_item->skill,
1747 "trust" => $usersnet_item->trust,
1748 "widefriend" => $usersnet_item->widefriend,
1749 "narrowfriend" => $usersnet_item->narrowfriend
1756 function info_save($user, $json_s)
1758 GLOBAL $G_lang, $mlang_brisk, $G_base;
1766 if (($json = json_decode($json_s)) == FALSE) {
1771 if (($bdb = BriskDB::create()) == FALSE) {
1776 if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) {
1777 $ret = 4000 + $subret;
1785 function room_outstandup($user)
1787 $this->room_sitdown($user, -1);
1790 function table_update($user)
1792 log_main("table_update: pre - USER: ".$user->name);
1794 $table_idx = $user->table;
1796 if ($table_idx > -1)
1797 $table = $this->table[$table_idx];
1799 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1801 $user_cur = $this->user[$i];
1802 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1805 $ret = "gst.st = ".($user_cur->step+1)."; ";
1806 if ($table_idx > -1)
1807 $ret .= $this->table_content($user_cur, $table_idx);
1809 if ($user->idx_get() == $i) {
1810 $ret .= $user->myname_innerHTML();
1812 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1813 $user_cur->step_inc();
1816 log_main("table_update: post");
1819 function room_sitdown($user, $table_idx)
1821 log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name));
1825 if ($table_idx > -1 && $table_idx < TABLES_N) {
1826 $table = $this->table[$table_idx];
1829 if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) {
1830 for ($i = 0 ; $i < TABLES_N ; $i++) {
1831 if ($table->wag_own == $table->player[$i]) {
1832 $train_app = sprintf("tra.rem(%d); ", $table_idx);
1833 $table->wag_reset(time());
1840 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1842 $user_cur = $this->user[$i];
1843 if ($user_cur->is_active() == FALSE || $user_cur->stat != 'room') // is not active user or the stat isn't 'room'
1846 $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app;
1847 if ($table_idx > -1)
1848 $ret .= $this->table_content($user_cur, $table_idx);
1849 $ret .= $this->standup_content($user_cur);
1851 if ($user->idx_get() == $i) {
1852 $ret .= 'subst = "sitdown"; tra.hide(); ';
1853 // clean the action buttons in other tables
1854 for ($e = 0 ; $e < TABLES_N ; $e++) {
1855 $ret .= $this->table[$e]->act_content($user_cur);
1858 else if ($table_idx > -1) {
1859 if ($table->player_n == PLAYERS_N) {
1861 $ret .= $table->act_content($user_cur);
1864 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
1865 $user_cur->step_inc();
1869 function kickuser($user, $out_reas)
1873 fprintf(STDERR, "MOP: GHOST_SESS: %d\n", $out_reas);
1875 $this->ghost_sess->push($curtime, $user->sess, $out_reas);
1877 fprintf(STDERR, "MOP: status out: %s %s %d\n", $user->stat, $user->subst, $user->idx);
1878 if ($user->stat == 'table' && $user->subst != 'sitdown') {
1879 $bin5 = &$this->match[$user->table];
1880 $user_bin5 = &$bin5->user[$user->table_pos];
1881 fprintf(STDERR, "MOP: status in: %s %s %d\n", $user_bin5->stat, $user_bin5->subst, $user_bin5->idx);
1882 $bin5->table_wakeup($user_bin5);
1883 $user->the_end = TRUE;
1884 $this->room_wakeup($user);
1888 if ($user->stat == 'table' || $user->stat == 'room') {
1889 $user->the_end = TRUE;
1890 if ($user->subst == 'sitdown' || $user->stat == 'table') {
1891 $this->room_wakeup($user);
1893 else if ($user->subst == 'standup') {
1894 fprintf(STDERR, "MOP: KICK here [%s]\n", btrace_line(debug_backtrace()));
1895 $this->room_outstandup($user);
1898 log_rd2("LOGOUT FROM WHAT ???");
1903 function kickuser_by_name($name, $out_reas)
1905 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1906 $user_out = $this->user[$i];
1907 if (strcmp($user_out->name, $name) == 0) {
1908 return ($this->kickuser($user_out, $out_reas));
1914 function kickuser_by_sess($sess, $out_reas)
1916 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
1917 $user_out = $this->user[$i];
1918 if (strcmp($user_out->sess, $sess) == 0) {
1919 return ($this->kickuser($user_out, $out_reas));
1925 function kickuser_by_idx($idx, $out_reas)
1927 $user_out = $this->user[$idx];
1928 return ($this->kickuser($user_out, $out_reas));
1931 function chatt_send($user, $mesg, $mlang_indwr = NULL)
1933 GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang;
1936 // fprintf(STDERR, "WE ARE HERE: [%s]\n", $mesg);
1939 $msg = mb_substr($mesg, 6, 128, "UTF-8");
1941 $dt = date("H:i ", $curtime);
1952 $is_normchat = FALSE;
1953 /* for old isolation management $is_ticker = FALSE; */
1954 $update_room = FALSE;
1956 if (strcmp($msg, "/tav") == 0 ||
1957 strncmp($msg, "/tav ", 5) == 0) {
1959 if ($user->stat != 'room' || $user->subst != 'sitdown') {
1960 /* 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>" */
1961 $msg = $mlang_brisk['tickmust'][$G_lang];
1962 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1967 $table = $this->table[$user->table];
1969 if ($table->wag_own != -1) {
1970 // MLANG <br>Il messaggio di segnalazione del tavolo è già attivato.<br><br>
1971 $msg = $mlang_brisk['tickjust'][$G_lang];
1972 $to_user = show_notify($msg, 0, "chiudi", 400, 100);
1977 $dtime = $curtime - $table->wag_tout;
1978 if ($dtime < EXPIRE_TIME_WAG) {
1979 // MLANG - <br>Il messaggio di segnalazione del tavolo<br>è disattivato ancora per %d second%s.<br><br>
1980 $msg = sprintf($mlang_brisk['tickwait'][$G_lang],
1981 EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i")));
1982 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100);
1987 $msg = substr($msg, 5);
1989 $table->wag_set($user->idx_get(), $msg);
1990 $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg)));
1991 $to_room = $to_user;
1992 /* for old isolation management $is_ticker = TRUE; */
1994 } // /tav chat command
1995 // just for development use currently
1996 else if (FALSE && strncmp($msg, "/out ", 5) == 0) {
1997 fprintf(STDERR, "MOP OUT\n");
1998 $target = substr($msg, 5);
1999 $this->kickuser_by_name($target, GHOST_SESS_REAS_ANON);
2001 else if (strncmp($msg, "/alarm ", 7) == 0) {
2002 if (strncmp($msg, "/alarm to ", 10) == 0) {
2003 $sp_pos = strpos($msg, " ", 10);
2004 $target = substr($msg, 10, $sp_pos - 10);
2005 $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." ";
2009 $alarm_check = "/alarm ".$G_alarm_passwd." ";
2012 if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) {
2013 /* MLANG: "<br>La password digitata non è corretta.<br><br>" */
2014 $msg = $mlang_brisk['alarpass'][$G_lang];
2015 $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100);
2020 /* MLANG: "Alarm <b>%s</b> inviato a <b>%s</b>." */
2021 $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))),
2022 ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) );
2023 $to_user = nickserv_msg($dt, $prestr);
2025 $msg = sprintf("<br><b>%s<br><br>%s</b><br><br>",
2026 $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check))));
2027 /* MLANG: "chiudi" */
2028 $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120);
2030 } // /alarm chat command
2031 else if (strncmp($msg, "/listen ", 8) == 0) {
2032 $arg = substr($msg, 8);
2034 if (strcasecmp($arg, "isolation") == 0) {
2036 if ($user->stat == 'room' && $user->subst == 'sitdown' &&
2037 $user->table >= TABLES_AUTH_N) {
2038 $to_user = nickserv_msg($dt, $mlang_brisk['listmust'][$G_lang]);
2042 $user->flags &= ~USER_FLAG_MAP_AUTH;
2043 $user->flags |= USER_FLAG_ISOLAUTH;
2044 $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); ';
2047 else if (strcasecmp($arg, "auth") == 0) {
2048 $flags_old = $user->flags;
2049 $user->flags &= ~USER_FLAG_MAP_AUTH;
2050 $user->flags |= USER_FLAG_LISTAUTH;
2051 $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); ';
2054 $flags_old = $user->flags;
2055 $user->flags &= ~USER_FLAG_MAP_AUTH;
2056 $to_user = 'list_set(\'all\', true, \'\'); ';
2059 // if from isolation redraw standup area
2060 if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) {
2061 $to_user .= 'standup_data_old = null; '.$this->standup_content($user);
2065 else if (strcmp($msg, "/authreq") == 0) {
2066 if ($user->is_cert()) {
2067 $to_user = sprintf('authbox(300,200);');
2070 /* 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." */
2071 $to_user = nickserv_msg($dt, $mlang_brisk['authmust'][$G_lang]);
2074 else if (strncmp($msg, "/mesgtoadm", 8) == 0) {
2075 if ($user->is_auth()) {
2076 $to_user = sprintf('mesgtoadmbox(500,300);');
2079 /* MLANG: "<b>Per inviare un messaggio devi essere autenticato.</b>" */
2080 $to_user = nickserv_msg($dt, $mlang_brisk['mesgmust'][$G_lang]);
2083 else if (FALSE && strncmp($msg, "/nick ", 6) == 0) {
2084 log_main("chatt_send BEGIN");
2087 if (($name_new = validate_name(substr($msg, 6))) == FALSE) {
2088 $to_user = nickserv_msg($dt, $mlang_brisk['nickmust'][$G_lang]);
2092 $msg = "COMMAND ".$msg;
2093 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2094 $user_cur = $this->user[$i];
2096 if ($user_cur->is_active() == FALSE)
2098 if (strcasecmp($user_cur->name,$name_new) == 0)
2101 if ($i < MAX_PLAYERS) {
2102 $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
2103 $to_user = nickserv_msg($dt, $prestr);
2107 /* 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>" */
2108 if ($user->is_auth()) {
2109 if (strcasecmp($user->name,$name_new) != 0) {
2110 if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) &&
2111 ($user->subst == 'standup' ||
2112 ($user->subst != 'standup' && $this->table[$user->table]->auth_type == TABLE_AUTH_TY_PUBL)
2115 $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed
2116 for ($i = 0 ; $i < TABLES_N ; $i++) {
2117 $to_user .= $this->table[$i]->act_content($user);
2121 $to_user = nickserv_msg($dt, $mlang_brisk['authchan'][$G_lang]);
2126 $user->name = $name_new; // OK - nick changed
2127 /* se nome gia' in uso, segnala cosa potrebbe capitare */
2128 if ( ! $user->is_auth() ) {
2129 if (($bdb = BriskDB::create()) != FALSE) {
2131 /* 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>" */
2132 if ($bdb->login_exists(strtolower($name_new))) {
2133 $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new));
2134 $to_user .= nickserv_msg($dt, $prestr);
2139 log_main("chatt_send start set");
2141 $update_room = TRUE;
2143 } // nick chat command
2144 else if (strncmp($msg, "/info ", 6) == 0) {
2146 if (! $user->is_auth()) {
2148 $to_user = nickserv_msg($dt, $mlang_indwr['info_auth'][$G_lang]);
2151 $to_user = nickserv_msg($dt, "error");
2155 $info_user = substr($msg, 6);
2157 echo $this->info_show($user, urldecode($info_user), $dt);
2160 else if (strncmp($msg, "/st ", 4) == 0) {
2161 log_main("chatt_send BEGIN");
2164 $st_str = substr($msg, 4);
2166 if (strcasecmp($st_str, "normale") == 0) {
2167 $st = USER_FLAG_S_NORM;
2169 else if (strcasecmp($st_str, "pausa") == 0) {
2170 $st = USER_FLAG_S_PAU;
2172 else if (strcasecmp($st_str, "fuori") == 0) {
2173 $st = USER_FLAG_S_OUT;
2175 else if (strcasecmp($st_str, "cane") == 0) {
2176 $st = USER_FLAG_S_DOG;
2178 else if (strcasecmp($st_str, "cibo") == 0) {
2179 $st = USER_FLAG_S_EAT;
2181 else if (strcasecmp($st_str, "lavoro") == 0) {
2182 $st = USER_FLAG_S_WRK;
2184 else if (strcasecmp($st_str, "sigaretta") == 0) {
2185 $st = USER_FLAG_S_SMK;
2187 else if (strcasecmp($st_str, "presente") == 0) {
2188 $st = USER_FLAG_S_EYE;
2190 else if (strcasecmp($st_str, "coniglio") == 0) {
2191 $st = USER_FLAG_S_RABB;
2193 else if (strcasecmp($st_str, "calcio") == 0) {
2194 $st = USER_FLAG_S_SOCC;
2196 else if (strcasecmp($st_str, "pupo") == 0) {
2197 $st = USER_FLAG_S_BABY;
2199 else if (strcasecmp($st_str, "pulizie") == 0) {
2200 $st = USER_FLAG_S_MOP;
2202 else if (strcasecmp($st_str, "babbo") == 0) {
2203 $st = USER_FLAG_S_BABBO;
2205 else if (strcasecmp($st_str, "renna") == 0) {
2206 $st = USER_FLAG_S_RENNA;
2208 else if (strcasecmp($st_str, "pupazzo") == 0) {
2209 $st = USER_FLAG_S_PUPAZ;
2211 else if (strcasecmp($st_str, "vischio") == 0) {
2212 $st = USER_FLAG_S_VISCH;
2215 /* MLANG: "Questo stato non esiste." */
2216 $to_user = nickserv_msg($dt, $mlang_brisk['statunkn'][$G_lang]);
2220 log_main("chatt_send start set");
2221 if (($user->flags & USER_FLAG_S_ALL) != $st) {
2222 $update_room = TRUE;
2223 $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st;
2226 } // nick chat command
2228 else { // normal chat line
2229 $is_normchat = TRUE;
2230 if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) {
2232 $user->chat_dlt = $user->chat_dlt * 2;
2233 if ($user->chat_dlt > 120)
2234 $user->chat_dlt = 120;
2236 else if ($user->chat_lst == $msg)
2238 else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) {
2239 $user->chat_ban = $curtime;
2240 $user->chat_dlt = 5;
2244 $user->chat_ban = 0;
2245 $user->chat_dlt = 0;
2249 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
2252 // TEMPORARY DISABLED UNTIL test user option will be available
2253 // if ( TRUE && (!$user->is_auth() || $user->is_appr()) ) {
2254 if (!$user->is_auth()) {
2255 $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
2256 $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
2258 $aug_head = array("Tanti", "Tantissimi", "Un enormità", "Un milione", "Un' esagerazione");
2259 $aug_body = array("a tutti gli utenti", "a tutti gli uomini", "a tutte le donne", "a tutti gli utenti");
2260 $aug_tail = array("di Brisk", "del sito", "della ciurma", "della comitiva", "del gruppo");
2262 $auguri = sprintf("%s auguri %s %s.",
2263 $aug_head[mt_rand(0, count($aug_head)-1)],
2264 $aug_body[mt_rand(0, count($aug_body)-1)],
2265 $aug_tail[mt_rand(0, count($aug_tail)-1)]);
2267 $to_room = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name),
2272 $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg));
2273 // temporary silentiation for troll (will became array check)
2274 // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8')
2275 $to_room = $to_user;
2279 log_legal($curtime, $user->ip, $user,
2280 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg);
2282 $user->chat_lst = "$msg";
2283 $user->chattime[$user->chat_cur % CHAT_N] = $curtime;
2293 // Output to clients
2296 if ($to_user != FALSE) {
2297 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
2298 $user->comm[$user->step % COMM_N] .= $to_user;
2302 if ($to_room != FALSE) {
2303 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2304 $user_cur = $this->user[$i];
2305 if ($target != "" && $user_cur->name != $target)
2307 if ($user_cur->is_active() == FALSE // is not active user
2308 || $user_cur->stat == 'table' // or stat is 'table'
2309 || $user->idx_get() == $i) // or the $user idx is equal to current var
2312 if ($is_normchat == TRUE) {
2313 // use MAP_AUTH to check if auth or isolation
2314 if ($user_cur->flags & USER_FLAG_MAP_AUTH) {
2315 if ( ! $user->is_auth() ) {
2321 else if ($is_ticker) {
2322 if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) {
2323 if ($user->table >= TABLES_AUTH_N)
2328 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
2329 $user_cur->comm[$user_cur->step % COMM_N] .= $to_room;
2330 $user_cur->step_inc();
2335 // FIXME BRISK4: include for each kind of table
2336 require_once("${G_base}briskin5/Obj/briskin5.phh");
2337 // Before all align times with table timeout
2338 for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2339 if (isset($this->match[$table_idx])) {
2340 $bin5 = $this->match[$table_idx];
2342 $bin5_table = $bin5->table[0];
2343 for ($i = 0 ; $i < $bin5_table->player_n ; $i++) {
2344 // stat must be "table" by definition
2345 $bin5_user = $bin5->user[$i];
2347 if ($target != "" && $bin5_user->name != $target)
2349 log_main("writa: ".$user_mesg);
2350 $bin5_user->comm[$bin5_user->step % COMM_N] = "gst.st = ".($bin5_user->step+1)."; ";
2351 $bin5_user->comm[$bin5_user->step % COMM_N] .= $to_tabl;
2352 $bin5_user->step_inc();
2354 } // if (isset($this->match
2355 } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) {
2356 } // if ($to_tabl == true ...
2359 if ($user->stat == 'room' && $user->subst == 'standup') {
2360 $this->standup_update($user);
2362 else if ($user->stat == 'room' && $user->subst == 'sitdown') {
2363 log_main("chatt_send pre table update");
2364 $this->table_update($user);
2365 log_main("chatt_send post table update");
2367 } // if ($update_room ...
2370 } // function chatt_send( ...
2372 function get_user($sess, &$idx)
2376 if (validate_sess($sess)) {
2377 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2378 if ($this->user[$i]->is_empty())
2380 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2383 $ret = $this->user[$i];
2387 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
2388 // for ($i = 0 ; $i < MAX_PLAYERS ; $i++)
2389 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
2392 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
2399 * function add_user(&$brisk, &$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2402 * if ($idx > -1 && ret == FALSE) => duplicated nick
2403 * if ($idx == -2 && ret == FALSE) => invalid name
2404 * if ($idx == -3 && ret == FALSE) => wrong password
2405 * if ($idx == -1 && ret == FALSE) => no space left
2406 * if ($idx == 0 && ret == user) => SUCCESS
2407 * if ($idx == -($idx + 1) && ret == user) => SUCCESS (but the login exists in the auth db)
2410 function add_user(&$sess, &$idx, $name, $pass, $ip, $header, $cookie)
2416 $authenticate = FALSE;
2418 $login_exists = FALSE;
2420 $ghost_auth = FALSE;
2425 if (($name_new = validate_name($name)) == FALSE) {
2430 log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass)));
2431 if (validate_sess($sess) == FALSE)
2434 /* if pass != FALSE verify the login with pass */
2435 log_auth("XXX", "auth1");
2437 if (($bdb = BriskDB::create()) != FALSE) {
2439 if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available.
2440 log_auth("XXX", "auth2");
2441 $authenticate = $bdb->login_verify($name_new, $pass, $code);
2442 log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE"));
2444 if ($authenticate != FALSE) {
2445 $user_type = $authenticate->type_get();
2453 $login_exists = $bdb->login_exists(strtolower($name_new));
2455 TO ENABLE USER-LOGIN ONLY
2456 - $login_exists = $bdb->login_exists(strtolower($name_new));
2457 + // $login_exists = $bdb->login_exists(strtolower($name_new));
2458 + // Force access with login and password
2465 // if db is down, send a warning and verify only current users
2466 // no actions at this moment
2468 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2470 if ($this->user[$i]->is_empty()) {
2471 if ($idfree == -1) {
2476 if (strcmp($sess, $this->user[$i]->sess) == 0) {
2481 if (strcasecmp($this->user[$i]->name, $name_new) == 0) {
2482 if ($authenticate != FALSE) {
2484 $ghost_auth = $this->user[$i]->is_auth();
2495 log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new));
2497 /* there is another user logged with your account and you and him have authenticated => new user
2498 get the session of the old user */
2499 if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) {
2502 $ghost_user = $this->user[$ghost];
2504 $this->ghost_sess->push($curtime, $ghost_user->sess, GHOST_SESS_REAS_ANOT);
2505 $ghost_user->comm[$ghost_user->step % COMM_N] = "";
2506 $ghost_user->step_inc();
2509 $ghost_user->sess = $sess;
2512 $ghost_user->sess = $sess;
2515 // If user at the table we need to update the table data too
2516 $table_idx = $ghost_user->table;
2517 if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) {
2518 require_once("${G_base}briskin5/Obj/briskin5.phh");
2519 if (isset($this->match[$table_idx])) {
2520 $bin5 = $this->match[$table_idx];
2522 if ($bin5->the_end != TRUE) {
2523 $bin5->user[$ghost_user->table_pos]->comm[$bin5->user[$ghost_user->table_pos]->step % COMM_N] = "";
2524 $bin5->user[$ghost_user->table_pos]->step_inc();
2525 $bin5->user[$ghost_user->table_pos]->sess = $sess;
2531 if (defined('CURL_DE_SAC_VERS')) {
2532 brisk_cds_execute($this, $ghost, $idx, $sess, $ip, $authenticate, $header);
2534 return ($this->user[$ghost]);
2536 else if ($idx != -1 && $i == MAX_PLAYERS) {
2541 $this->user[$idx]->sess = $sess;
2544 $this->user[$idx]->sess = $sess;
2546 $this->user[$idx]->name = $name_new; // OK - add new user
2547 $this->user[$idx]->stat_set("room");
2548 $this->user[$idx]->step_set(0);
2549 while (array_pop($this->user[$idx]->comm) != NULL);
2550 $this->user[$idx]->subst = "standup";
2551 $this->user[$idx]->lacc = $curtime;
2552 $this->user[$idx]->laccwr = $curtime;
2553 $this->user[$idx]->bantime = 0;
2554 $this->user[$idx]->ip = $ip;
2556 $this->user[$idx]->rec = $authenticate;
2557 $this->user[$idx]->flags = $user_type;
2558 $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00);
2559 $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00);
2560 log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags));
2562 if ($authenticate != FALSE) {
2563 $this->user[$idx]->code = $authenticate->code_get();
2565 // all this part is included in the db server
2566 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2568 if (isset($cookie['CO_list'])) {
2569 // fprintf(STDERR, "QQ: %s CO_list: [%s]\n", __FUNCTION__, $cookie['CO_list']);
2570 if (strcmp($cookie['CO_list'], "auth") == 0) {
2571 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2572 $this->user[$idx]->flags |= USER_FLAG_LISTAUTH;
2574 if (strcmp($cookie['CO_list'], "isolation") == 0) {
2575 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2576 $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH;
2579 $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH;
2584 // fprintf(STDERR, "QQ: CO_list not set flags: %x\n", __FUNCTION__, $this->user[$idx]->flags);
2587 // fprintf(STDERR, "QQ %s: flag %x\n", __FUNCTION__, $this->user[$idx]->flags);
2589 log_main("ghost: rename!");
2590 $ghost_user = $this->user[$ghost];
2592 if ($ghost_auth == FALSE) {
2593 for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) {
2594 $ghostname = 'ghost'.$sfx;
2595 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2596 if (strcmp("", $this->user[$i]->sess) == 0)
2599 if (strcasecmp($this->user[$i]->name, $ghostname) == 0) {
2604 if ($ghostname != '')
2608 $ghost_user->name = $ghostname;
2610 if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') {
2611 $this->standup_update($ghost_user);
2614 log_main("chatt_send pre table update");
2615 $this->table_update($ghost_user);
2616 log_main("chatt_send post table update");
2618 } // if ($ghost_auth == FALSE
2620 // FIXME: cacciare il vecchio utente room && table (if needed)
2621 $ghost_user->the_end = TRUE;
2622 $ghost_user->lacc = 0;
2623 $this->garbage_manager(TRUE);
2625 } // if ($ghost > -1) {
2630 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));
2632 $ret = $this->user[$real_idx];
2633 if (defined('CURL_DE_SAC_VERS')) {
2634 brisk_cds_execute($this, $ghost, $real_idx, $sess, $ip, $authenticate, $header);
2642 function standup_update($user)
2644 for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
2645 $user_cur = $this->user[$i];
2646 if ($user_cur->is_active() == FALSE)
2649 log_main("STANDUP START: ".$user_cur->stat);
2651 if ($user_cur->stat == 'room') {
2652 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur);
2653 if ($user->idx_get() == $i) {
2654 $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML();
2656 log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]);
2658 $user_cur->step_inc();
2663 function dump_data()
2665 $brisk_ser = serialize($this);
2666 $brisk_ser_len = mb_strlen($brisk_ser, "ASCII");
2667 if (file_put_contents($this->crystal_filename, $brisk_ser) == $brisk_ser_len) {
2674 function standup_content($user)
2678 if ($user->stat != 'room')
2681 $content = ' j_stand_cont( [ ';
2683 $user_cur_id = $user->idx_get();
2684 for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) {
2685 if ($this->user[$i]->is_active() == FALSE // is not active user
2686 || $this->user[$i]->stat != "room" // or the stat isn't 'room'
2687 || $this->user[$i]->name == "") // or the name is empty, happens when user is reset (TODO: check it)
2690 $flags = $this->user[$i]->flags;
2692 // sql record exists AND last donate > 2013-01-01
2693 if ($this->user[$i]->is_supp_custom()) {
2694 $supp_comp_s = sprintf(', "%s"', $this->user[$i]->rec->supp_comp_get());
2700 if ($this->user[$i]->subst == "standup") {
2701 $content .= sprintf('%s[ %d, "%s"%s ]',($ct > 0 ? ', ' : ''), $flags,
2702 xcape($this->user[$i]->name), $supp_comp_s);
2711 function table_content($user, $table_idx)
2717 // Si possono usare i dati nella classe table
2720 $sess = $user->sess;
2721 $table = $this->table[$table_idx];
2723 if ($user->stat != 'room')
2726 $user_cur_id = $user->idx_get();
2728 for ($i = 0 ; $i < $table->player_n ; $i++) {
2729 $user_cur = $this->user[$table->player[$i]];
2731 $flags = $user_cur->flags;
2733 log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx));
2734 if ($user_cur->is_supp_custom())
2735 $supp_comp_s = sprintf(', "%s"', $user_cur->rec->supp_comp_get());
2739 $content .= sprintf('%s[ %d, "%s"%s ]',($i == 0 ? '' : ', '), $flags,
2740 xcape($user_cur->name), $supp_comp_s);
2745 $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content);
2750 function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie)
2752 GLOBAL $G_ban_list, $G_black_list, $G_cloud_smasher;
2754 // printf("NEW_SOCKET (root): %d PATH [%s]\n", intval($new_socket), $path);
2756 // fprintf(STDERR, "\n\n\n PRE_BLACK [%s]\n\n\n", $addr);
2757 if ($this->black_check($addr)) {
2758 // TODO: waiting async 5 sec before close
2759 // fprintf(STDERR, "\n\n\n BLACK CHECK\n\n\n");
2762 if ($path != "" && $path != "index.php") {
2763 if ($this->cloud_check($addr)) {
2764 // TODO: waiting async 5 sec before close
2769 $enc = get_encoding($header);
2770 if (isset($header['User-Agent'])) {
2771 if (strstr($header['User-Agent'], "MSIE")) {
2772 $transp_type = "htmlfile";
2775 $transp_type = "xhr";
2779 $transp_type = "iframe";
2781 force_no_cache($header_out);
2787 index_main($this, $transp_type, $header, $header_out, $addr, $get, $post, $cookie);
2788 $content = ob_get_contents();
2791 // fprintf(STDERR, "\n\nCONTENT [%s]\n\n", $content);
2792 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2796 case "index_wr.php":
2798 // Enhance required: in the POST case, after the header you must get content
2799 // from the socket, waiting if necessary
2803 index_wr_main($this, $addr, $get, $post, $cookie);
2804 $content = ob_get_contents();
2807 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2811 case "index_rd.php":
2812 case "index_rd_wss.php":
2813 if (($transp = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
2815 if ($transp == 'websocket' || $transp == 'websocketsec')
2819 if (!isset($cookie['sess'])
2820 || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) {
2822 $content = User::stream_fini($transp, $s_a_p->rndstr, TRUE);
2824 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2829 $this->sess_cur_set($user->sess);
2830 // close a previous opened index_read_ifra socket, if exists
2831 if (($prev = $user->rd_socket_get()) != NULL) {
2832 $s_a_p->socks_unset($user->rd_socket_get());
2833 fclose($user->rd_socket_get());
2834 // printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
2835 $user->rd_socket_set(NULL);
2839 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
2840 $response = headers_render($header_out, -1).$user->chunked_content($content);
2841 $response_l = mb_strlen($response, "ASCII");
2843 $wret = @fwrite($new_socket, $response, $response_l);
2844 if ($wret < $response_l) {
2845 printf("TROUBLES WITH FWRITE: %d\n", $wret);
2846 $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII"));
2849 $user->rd_cache_set("");
2851 fflush($new_socket);
2854 $s_a_p->socks_set($new_socket, $user, NULL);
2855 $user->rd_socket_set($new_socket);
2856 // printf(" - qui ci siamo - ");
2863 if (!(BRISK_DEBUG & DBG_ENGI))
2865 fprintf(STDERR, "TEST.PHP running\n");
2866 if (isset($post['data'])) {
2867 $content = $post['data'];
2870 $content = "NO DATA AVAILABLE";
2872 $header_out['Content-Type'] = 'text/plain';
2873 $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
2877 /* FAR TODO: move all into an array of registered sub-apps */
2878 $subs = "briskin5/";
2879 $subs_l = strlen($subs);
2880 if (!strncmp($path, $subs, $subs_l)) {
2881 $ret = Bin5::request_mgr($s_a_p, $header, $header_out, $new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
2890 function match_add($idx, $match)
2892 $this->match[$idx] = $match;
2895 function match_del($idx)
2897 unset($this->match[$idx]);
2900 function match_get($idx, $token)
2902 if (isset($this->match[$idx])) {
2904 || $token == $this->match[$idx]->table_token) {
2905 return ($this->match[$idx]);
2910 function sess_cur_set($sess)
2912 static::$sess_cur = $sess;
2915 static function sess_cur_get()
2917 return(static::$sess_cur);
2919 } // end class Brisk
2921 function make_seed()
2923 list($usec, $sec) = explode(' ', microtime());
2924 return (float) $sec + ((float) $usec * 100000);
2927 function btrace_line($ar)
2929 GLOBAL $G_btrace_pref_sub;
2932 for ($i = 0 ; $i < count($ar) ; $i++) {
2933 $with_class = isset($ar[$i]['class']);
2934 $with_file = isset($ar[$i]['file']);
2935 $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "),
2936 ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""),
2937 $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""),
2938 ($with_file ? $ar[$i]['line'] : ""));
2944 function trace_ftok($id, $add)
2946 // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok("
2947 $tok=@ftok($id, $add);
2949 log_shme($tok.": ".$id." + ".$add);
2954 function log_mop($step, $log)
2958 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0)
2961 $sess = Brisk::sess_cur_get();
2962 if (isset($sess) == FALSE)
2967 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0)
2970 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2971 $btrace = btrace_line(debug_backtrace());
2974 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
2975 fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace));
2980 function log_step($log)
2984 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_STEP) == 0)
2987 $sess = Brisk::sess_cur_get();
2988 if (isset($sess) == FALSE)
2993 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_STEP) == 0)
2996 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
2997 $btrace = btrace_line(debug_backtrace());
3000 if (($fp = @fopen(LEGAL_PATH."/step.log", 'a')) != FALSE) {
3001 fwrite($fp, sprintf("STEP: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3008 function log_cds($log)
3012 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CDS) == 0)
3015 $sess = Brisk::sess_cur_get();
3016 if (isset($sess) == FALSE)
3021 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CDS) == 0)
3024 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3025 $btrace = btrace_line(debug_backtrace());
3028 if (($fp = @fopen(LEGAL_PATH."/cds.log", 'a')) != FALSE) {
3029 fwrite($fp, sprintf("CDS: [%f] [%s] [%s]\n", gettimeofday(TRUE), $log, $btrace));
3035 function log_only2($log)
3039 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0)
3042 $sess = Brisk::sess_cur_get();
3043 if (isset($sess) == FALSE)
3048 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0)
3051 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3052 $btrace = btrace_line(debug_backtrace());
3055 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3056 fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3061 function log_crit($log)
3065 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0)
3068 $sess = Brisk::sess_cur_get();
3069 if (isset($sess) == FALSE)
3074 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0)
3077 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3078 $btrace = btrace_line(debug_backtrace());
3081 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3082 fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3087 function log_only($log)
3091 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0)
3094 $sess = Brisk::sess_cur_get();
3095 if (isset($sess) == FALSE)
3100 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0)
3103 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3104 $btrace = btrace_line(debug_backtrace());
3107 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3108 fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3113 function log_main($log)
3117 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0)
3120 $sess = Brisk::sess_cur_get();
3121 if (isset($sess) == FALSE)
3126 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0)
3129 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3130 $btrace = btrace_line(debug_backtrace());
3133 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3134 fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3139 function log_rd($log)
3143 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0)
3146 $sess = Brisk::sess_cur_get();
3147 if (isset($sess) == FALSE)
3152 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0)
3155 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3156 $btrace = btrace_line(debug_backtrace());
3159 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3160 fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3165 function log_rd2($log)
3169 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0)
3172 $sess = Brisk::sess_cur_get();
3173 if (isset($sess) == FALSE)
3178 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0)
3181 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3182 $btrace = btrace_line(debug_backtrace());
3186 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3187 fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3192 function log_send($log)
3196 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0)
3199 $sess = Brisk::sess_cur_get();
3200 if (isset($sess) == FALSE)
3205 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0)
3208 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3209 $btrace = btrace_line(debug_backtrace());
3212 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3213 fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3218 function log_lock($log)
3222 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0)
3225 $sess = Brisk::sess_cur_get();
3226 if (isset($sess) == FALSE)
3231 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0)
3234 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3235 $btrace = btrace_line(debug_backtrace());
3238 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3239 fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3244 function log_wr($log)
3248 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0)
3251 $sess = Brisk::sess_cur_get();
3252 if (isset($sess) == FALSE)
3257 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0)
3260 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3261 $btrace = btrace_line(debug_backtrace());
3264 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3265 fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3270 function log_load($log)
3274 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0)
3277 $sess = Brisk::sess_cur_get();
3278 if (isset($sess) == FALSE)
3283 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0)
3286 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3287 $btrace = btrace_line(debug_backtrace());
3290 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3291 fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3296 function log_auth($sess, $log)
3300 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0)
3303 if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0)
3306 if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3307 $btrace = btrace_line(debug_backtrace());
3310 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3311 fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace));
3316 function log_shme($log)
3320 if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0)
3323 $sess = Brisk::sess_cur_get();
3324 if (isset($sess) == FALSE)
3329 if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0)
3332 if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC)
3333 $btrace = btrace_line(debug_backtrace());
3336 if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) {
3337 fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace));
3344 // function log_legal($curtime, $sess, $name, $where, $mesg)
3345 function log_legal($curtime, $addr, $user, $where, $mesg)
3347 if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) {
3348 /* Unix time | session | nickname | IP | where was | mesg */
3349 fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, ($user ? $user->sess : "NOSESS"),
3350 ($user ? ($user->is_auth() ? 'A' : 'N') : "U"),
3351 ($user ? $user->name : "NO-USER"), $addr, $where , $mesg));
3356 function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed)
3361 if ($sitted < PLAYERS_N) {
3369 if ($table == $cur_table)
3376 $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act);
3381 function show_notify($text, $tout, $butt, $w, $h)
3383 log_main("SHOW_NOTIFY: ".$text);
3384 return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h);
3387 function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time)
3389 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3390 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);
3393 function show_notify_document($text, $tout, $butt_arr, $confirm_func, $confirm_func_args, $w, $h, $is_opaque, $block_time)
3395 log_main("SHOW_NOTIFY OPAQUE: ".$text);
3398 for ($i = 0 ; $i < count($butt_arr) ; $i++) {
3399 $butts .= sprintf("%s'%s'", ($i == 0 ? "" : ","), $butt_arr[$i]);
3402 return sprintf('g_nd = new notify_document(gst, "%s", %d, [ %s ], %s, %s, %d, %d, %s, %d);|',
3403 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);
3407 function root_welcome($user)
3409 GLOBAL $root_wellarr, $G_lang;
3413 $dt = date("H:i ", $curtime);
3415 for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++)
3416 $ret .= nickserv_msg($dt, str_replace('"', '\"', $root_wellarr[$G_lang][$i]));
3423 function validate_sess($sess)
3425 if (strlen($sess) == SESS_LEN)
3431 function validate_name($name)
3433 $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
3435 for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
3437 if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
3444 function playsound($name)
3446 return (sprintf('g_jukebox.play("%s");', $name));
3449 function secstoword($secs)
3455 $mins = floor($secs / 60);
3457 if ($G_lang == 'en') {
3459 $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : ""));
3462 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : ""));
3466 $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : ""));
3469 $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o"));
3474 function sharedmem_sz($tok)
3476 if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
3477 log_main("shmop_open failed");
3480 $shm_sz = shmop_size($shm_id);
3481 shmop_close($shm_id);
3483 // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS);
3490 static function lock_data($is_exclusive)
3492 if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) {
3493 self::$delta_t = microtime(TRUE);
3494 log_lock("LOCK warrant [".self::$delta_t."]");
3502 static function unlock_data($res)
3506 log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]");
3515 static function lock_data($is_exclusive)
3517 if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) {
3518 self::$delta_t = microtime(TRUE);
3519 log_lock("LOCK poll [".self::$delta_t."]");
3527 static function unlock_data($res)
3531 log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]");
3537 function carousel_top()
3542 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));
3545 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>'));
3549 function login_consistency($name)
3552 if (($len = mb_strlen($name)) > 12) {
3556 for ($i = 0 ; $i < mb_strlen($name) ; $i++) {
3557 $c = mb_substr($name, $i, 1);
3558 if (mb_ereg_match ("[a-zA-Z0-9]", $c)) {