BriskServ"); define('LOCK_SHARE_MAX', 10000); define('DBG_ONL2', 0x0001); define('DBG_ONLY', 0x0002); define('DBG_MAIN', 0x0004); define('DBG_READ', 0x0008); define('DBG_REA2', 0x0010); define('DBG_SEND', 0x0020); define('DBG_LOCK', 0x0040); define('DBG_WRIT', 0x0080); define('DBG_LOAD', 0x0100); define('DBG_AUTH', 0x0200); define('DBG_CRIT', 0x0400); define('DBG_LMOP', 0x0800); define('DBG_TRAC', 0x1000); define('DBG_SHME', 0x2000); // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols define('BRISK_DEBUG', 0x0800); define('BRISK_SINGLE_DEBUG',0); define('BRISK_SINGLE_SESS', ""); define('DEBUGGING', "no-debugging"); require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF); $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi', 'en' => 'back standing' ), 'btn_close' => array( 'it' => 'chiudi', 'en' => 'close'), 'tit_all' => array( 'it' => 'tutti', 'en' => 'all' ), 'tabtout_a'=> array( 'it' => '
Sei stato inattivo per ', 'en' => '
You are being idle for ' ), 'tabtout_b'=> array( 'it' => ' minuti.

Quindi ritorni tra i Giocatori in piedi.', 'en' => ' minutes.

Then you return with the standing players.'), 'tickmust' => array( 'it' => '
Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.

', 'en' => '
To activate the signalling message of the table it\'s necessary to be sitting

'), 'tickjust' => array( 'it' => '
Il messaggio di segnalazione del tavolo è già attivato.

', 'en' => 'EN
Il messaggio di segnalazione del tavolo è già attivato.

'), 'tickwait' => array( 'it' => '
Il messaggio di segnalazione del tavolo
è disattivato ancora per %d second%s.

', 'en' => 'EN
The signalling message of the table
will be deactivated for %d second%s.

'), 'alarpass' => array( 'it' => '
La password digitata non è corretta.

', 'en' => '
The entered password is not correct.

'), 'alarret' => array( 'it' => '"Alarm \\"%s\\" inviato a %s."', 'en' => '"Alarm \\"%s\\" sent to %s."'), 'authmust' => array( 'it' => 'Per autenticare qualcuno devi a tua volta essere autenticato.', 'en' => 'To authenticate someone you have to be authenticated.'), // on your turn 'mesgmust' => array( 'it' => 'Per inviare un messaggio devi essere autenticato.', 'en' => 'To send a message you have to be authenticated.'), 'nickmust' => array( 'it' => 'Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.', 'en' => 'The nickname have to contain at least one letter or one number.'), 'nickdupl' => array( 'it' => 'Nickname %s già in uso.', 'en' => 'The nickname %s is already in use.'), 'authchan' => array( 'it' => 'Non puoi cambiare nick a un tavolo per soli autenticati o se sei in modalità isolata.', 'en' => 'You can\'t change your nickname into a table for only authenticated or if you are in isolation mode.'), 'nickjust' => array( 'it' => 'Il nickname \'%s\' è già registrato, se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghostN.', 'en' => 'The nickname \'%s\' is already registered, if its proprietary will authenticate you will named again officially ghostN.'), // FIXME: him ??? 'statunkn' => array( 'it' => 'Questo stato non esiste.', 'en' => 'This state don\'t exists.'), 'tabincon' => array( 'it' => '
I dati del tavolo n° %d sono inconsistenti, verranno resettati.

Torni in piedi.

', 'en' => 'EN
I dati del tavolo n° %d sono inconsistenti, verranno resettati.

Torni in piedi.

'), 'listmust' => array( 'it' => 'Per andare in isolamento non bisogna essere seduti a tavoli non riservati.', 'en' => 'To go to isolation you must don\'t stay on not reserved tables'), 'tit_onauth'=>array( 'it' => '(solo aut.)', 'en' => '(only aut.)'), 'tit_onisol'=>array( 'it' => '(isolam.to)', 'en' => '(isolation)'), 'db_failed' =>array('it' => '
Il collegamento al database è fallito.
Temporaneamente tutte le autenticazioni verranno sospese, accederai a Brisk come un utente normale.

Ci scusiamo per il disagio.', 'en' => 'Connection to the database failed
All authentications are suspended temporarly, you login as normal user.
We are about the limitation') ); $G_lng = langtolng($G_lang); $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 ); $G_brisk_version = "4.3.0"; /* MLANG: ALL THE INFO STRINGS IN brisk.phh */ $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NOVITA\': adottato sac-a-push come motore per l\'invio dei dati in tempo reale, nuovo trasporto httpfile per explorer, tanti bug fixati, freeze su disco, fix del calcolo dei punti, nuovo stream dati xhr.', 'Se vuoi iscriverti alla Mailing List, cliccala!' ), 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NEWS: usage of reader/writer locking instead of generic exclusive locking.', 'If you want to subscribe our Mailing List, click it!' ) ); $G_room_help = array( 'it' => '
Descrizione
Questa è un\'implementazione della briscola in cinque, così come è spiegata su Wikipedia; in breve è la variante con l\'asta prima sulla carta e poi sui punti.

Configurazione del browser.
Occorre abilitare i cookies.

Uso del sito
Potete sedervi a un tavolo o rimanere in piedi.
Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.

Partita
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.

Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.
Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.

Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.

Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.
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.
Comandi della chat
/nick <nuovo_nickname> - cambio di nickname
/tav <frase di invito> - invito per gli altri giocatori al tavolo dove si è seduti
/st <stato> - cambia l\'icona associata al tuo user; stato può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
/authreq - se si è autenticati permette di garantire per un utente fidato
/mesgtoadm - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
/listen <all or auth> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
', 'en' => '
EN Descrizione
EN Questa è un\'implementazione della briscola in cinque, così come è spiegata su Wikipedia; in breve è la variante con l\'asta prima sulla carta e poi sui punti.

EN Configurazione del browser.
Occorre abilitare i cookies.

Uso del sito
Potete sedervi a un tavolo o rimanere in piedi.
Se al vostro tavolo si raggiungono i 5 giocatori inizia automaticamente la partita.

Partita
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.

Chi vince l\'asta dovrà decidere il seme della carta scelta e inizierà la mano.
Per giocare le carte dovrete trascinarle nel quadrato al centro del vostro schermo.

Il vostro turno è sempre segnalato da una cornice verde lampeggiante intorno al quadrato al centro del vostro schermo.

Durante la partita, se vorrete ricaricare la pagina, usate l\'apposito bottone \\"reload\\" in basso a destra.
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.
Comandi della chat
/nick <nuovo_nickname> - cambio di nickname
/tav <frase di invito> - invito per gli altri giocatori al tavolo dove si è seduti
/st <stato> - cambia l\'icona associata al tuo user; stato può valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
/authreq - se si è autenticati permette di garantire per un utente fidato
/mesgtoadm - se si è autenticati permette di lasciare un messaggio all\'amministratore del sito
/listen <all or auth> - se si è autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
'); // $G_room_passwdhowto = array( 'it' => '

Come registrarsi su Brisk

Attualmente ci sono due metodi per ottenere una password sul sito:

  • Facendosi garantire da un utente di Brisk che già possidede una password

  • Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:

  • Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
  • Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)
  • Smart card di InfoCamere

  • Per auto-garantisi occorre possedere:

  • il codice PIN della propria carta
  • il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)

  • Per effettuare la registrazione collegarsi al sito:

    https://brisk.mine.nu


    Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra fai una segnalazione.
  • ', 'en' => '

    EN Come registrarsi su Brisk

    EN Attualmente ci sono due metodi per ottenere una password sul sito:

  • Facendosi garantire da un utente di Brisk che già possidede una password

  • Auto-garantendosi utilizzando uno dei seguenti sistemi di identificazione digitale:

  • Carta Regionale dei Servizi della Lombardia (la tessera sanitaria)
  • Carta Regionale dei Servizi del Friuli Venezia Giulia (la tessera sanitaria)

  • Per auto-garantisi occorre possedere:

  • il codice PIN della propria carta
  • il lettore di smart-card per collegare la carta al PC (acquistabile di solito presso le edicole)

  • Per effettuare la registrazione collegarsi al sito:

    https://brisk.mine.nu


    Se sei in possesso di una carta che permette l\'identificazione via internet che non è nell\'elenco qui sopra fai una segnalazione.
  • ' ); /*
    Seguendo la procedura di auto-garanzia all\'url: https://brisk.mine.nu '; */ $G_room_about = array( 'it' => '
    briscola chiamata in salsa ajax

    version '.$G_brisk_version.'

    Copyright 2006-2012 Matteo Nastasi (aka mop)

    ', 'en' => '
    declaration briscola in ajax sauce (Beta)

    version '.$G_brisk_version.'

    Copyright 2006-2012 Matteo Nastasi (aka mop)

    '); function mop_flush() { for ($i = 0; $i < ob_get_level(); $i++) ob_end_flush(); ob_implicit_flush(1); flush(); } function force_no_cache(&$header_out) { $header_out['Pragma'] = 'no-cache, must-revalidate'; $header_out['Cache-Control'] = 'no-cache'; $header_out['Expires'] = '-1'; } function file_lock($fname, $is_exclusive) { if (($res = @fopen($fname, "r+")) == FALSE) { return (FALSE); } if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) { fclose($res); return (FALSE); } return ($res); } function file_unlock($res) { if ($res != FALSE) { flock($res, LOCK_UN); fclose($res); } } function webservers_exceeded() { return(file_exists(PROXY_PATH."/webservers_exceded.flag")); } function webservers_check() { GLOBAL $G_webserver_max; /* FIXME: check all procs expirations */ return (10); $ct = 0; $dh = opendir('/proc'); while (($file = readdir($dh)) !== false) { if (preg_match('/[0-9]+/', $file)) { $cmdline = explode("\0", file_get_contents('/proc/'.$file.'/cmdline')); // echo "xxx".$cmdline[0].$n; if (strstr('/usr/sbin/apache2', $cmdline[0]) != FALSE) { // echo "yyy".$cmdline[0].$n; $ct++; } } } closedir($dh); if ($ct >= $G_webserver_max) { touch(PROXY_PATH."/webservers_exceded.flag"); } else { unlink(PROXY_PATH."/webservers_exceded.flag"); } return ($ct); } $escpush_from = array("\\", "\""); $escpush_to = array("\\\\", "\\\""); function escpush($s) { GLOBAL $escpush_from, $escpush_to; return str_replace($escpush_from, $escpush_to, $s); } $escinp_from = array( "\"" ); $escinp_to = array( """ ); function escinput($s) { GLOBAL $escinp_from, $escinp_to; return str_replace($escinp_from, $escinp_to, $s); } function eschtml($s) { return htmlentities($s); } function esclfhtml($s) { return str_replace("\n", "
    \n", htmlentities($s)); } function langtolng($lang) { GLOBAL $G_lang; return ($G_lang == 'en' ? '-en' : ''); } function csplitter($in, $sep) { $st = 0; $id = 0; $out = array(); $out[$id] = ""; for ($i = 0 ; $i < strlen($in) ; $i++) { $ini = substr($in, $i, 1); if ($st == 0) { if ($ini == '\\') $st = 1; else if ($ini == $sep) { $id++; $out[$id] = ""; } else { $out[$id] .= $ini; } } else if ($st == 1) { $out[$id] .= $ini; $st = 0; } } return ($out); } function xcape($s) { $from = array ( '\\', '@', '|' ); $to = array ( '\\\\', '@', '¦' ); return (str_replace($from, $to, htmlentities($s,ENT_COMPAT,"UTF-8"))); } function xcapelt($s) { $from = array ( '\\', '|', "\t", "\n"); $to = array ( '\\\\', '\\|', "\\t", "\\n"); return (str_replace($from, $to, $s)); } function xcapemesg($s) { $from = array ( "\n"); $to = array ( "\\n"); return (str_replace($from, $to, $s)); } class Vect { function Vect($a) { $this->el = $a; } function getbyid($idx) { return ($this->el[$idx]); } function setbyid($idx, $v) { $this->el[$idx] = $v; } } class Table { var $idx; var $player; var $player_n; var $auth_only; // se tavolo riservato o libero var $wag_own; var $wag_com; var $wag_tout; var $table_token; var $table_start; // information field var $wakeup_time; function Table() { } function create($idx) { if (($thiz = new Table()) == FALSE) return (FALSE); $thiz->idx = $idx; $thiz->player = array(); $thiz->player_n = 0; $thiz->auth_only = FALSE; $thiz->wag_own = -1; $thiz->wag_com = ""; $thiz->wag_tout = 0; $thiz->table_token = ""; $thiz->table_start = 0; $thiz->wakeup_time = 0; return ($thiz); } function copy($from) { $this->idx = $from->idx; $this->player = array(); for ($i = 0 ; $i < $from->player_n ; $i++) $this->player[$i] = $from->player[$i]; $this->player_n = $from->player_n; log_main("PLAYER_N - parent::copy.".$this->player_n); $this->auth_only = $from->auth_only; $this->wag_own = $from->wag_own; $this->wag_com = $from->wag_com; $this->wag_tout = $from->wag_tout; $this->table_token = $from->table_token; $this->table_start = $from->table_start; $this->wakeup_time = $from->wakeup_time; } function myclone($from) { if (($thiz = new Table()) == FALSE) return (FALSE); $this->copy($from); return ($thiz); } function spawn($from) { if (($thiz = new Table()) == FALSE) return (FALSE); $thiz->idx = $from->idx; $thiz->player = array(); for ($i = 0 ; $i < $from->player_n ; $i++) $thiz->player[$i] = $i; $thiz->player_n = $from->player_n; $thiz->auth_only = $from->auth_only; $thiz->wag_own = $from->wag_own; $thiz->wag_com = $from->wag_com; $thiz->wag_tout = $from->wag_tout; $thiz->table_token = $from->table_token; $thiz->table_start = $from->table_start; $thiz->wakeup_time = $from->wakeup_time; return ($thiz); } function wag_set($user_idx, $mesg) { log_main("WAG_SET"); $this->wag_own = $user_idx; $this->wag_com = $mesg; $this->wag_tout = 0; } function wag_reset($timeout) { log_main("WAG_RESET"); unset($this->wag_own); $this->wag_own = -1; $this->wag_com = ""; $this->wag_tout = $timeout; } function player_get($idx) { return ($this->player[$idx]); } function player_set($idx, $player) { $this->player[$idx] = $player; } function user_add($idx) { $this->player[$this->player_n] = $idx; $this->player_n++; return ($this->player_n - 1); } function user_rem($room, $user) { $tabpos = $user->table_pos; /* verifico la consistenza dei dati */ if ($room->user[$this->player[$tabpos]] == $user) { /* aggiorna l'array dei giocatori al tavolo. */ for ($i = $tabpos ; $i < $this->player_n-1 ; $i++) { $this->player[$i] = $this->player[$i+1]; $user_cur = $room->user[$this->player[$i]]; $user_cur->table_pos = $i; } $this->player_n--; } else { log_main("INCONSISTENCY ON TABLE."); } } // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table, // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH)); // function act_content($isstanding, $sitted, $table, $cur_table, $allowed) function act_content($user) { $ret = ""; $isstanding = ($user->subst == 'standup'); $sitted = $this->player_n; $table = $this->idx; $cur_table = $user->table; $allowed = TRUE; if ($isstanding) { if ($sitted < PLAYERS_N) { if ($this->auth_only) { if ($user->flags & USER_FLAG_AUTH) $act = "sitreser"; else $act = 'reserved'; } else { $act = 'sit'; } } else { $act = 'none'; } } else { if ($table == $cur_table) $act = 'wake'; else $act = 'none'; } if ($act != '') $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act); return ($ret); } } // end class Table class Room { static $delta_t; var $crystal_filename; var $user; var $table; var $match; var $comm; // commands for many people var $step; // current step of the comm array var $garbage_timeout; var $shm_sz; function Room ($crystal_filename) { $this->crystal_filename = $crystal_filename; $this->user = array(); $this->table = array(); $this->match = array(); for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $this->user[$i] = User::create($this, $i, "", ""); } for ($i = 0 ; $i < TABLES_N ; $i++) { $this->table[$i] = Table::create($i); /* OLD METHOD if ($i < 12) { $row = ( (((int)($i / 4)) % 2) == 0 ); $col = ($i % 2 == 0); $this->table[$i]->auth_only = (($row && $col) || (!$row && !$col)); } else { $this->table[$i]->auth_only = FALSE; } */ if ($i < TABLES_AUTH_N) $this->table[$i]->auth_only = TRUE; else $this->table[$i]->auth_only = FALSE; } $this->garbage_timeout = 0; $this->shm_sz = SHM_DIMS_MIN; } function garbage_manager($force) { GLOBAL $G_lang, $mlang_brisk, $G_base; $ismod = FALSE; log_rd2("garbage_manager START"); /* Garbage collector degli utenti in timeout */ $curtime = time(); if (!$force && !($this->garbage_timeout < $curtime)) { return ($ismod); } webservers_check(); // Before all align times with table timeout for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) { $table_cur = $this->table[$table_idx]; // if the table is complete and exists its shared mem we get the info about users lacc if ($table_cur->player_n == PLAYERS_N) { log_main("PLAYERS == N TABLE ".$table_idx); $no_recovery = FALSE; if (isset($this->match[$table_idx])) { $bri = $this->match[$table_idx]; if ($table_cur->table_token != $bri->table_token) { log_main("ERROR: not matching table_token. Room: ".$table_cur->table_token." Table: ".$bri->table_token); log_main("ERROR: not matching table_start. Room: ".$table_cur->table_start." Table: ".$bri->table_start); $no_recovery = TRUE; $bri = FALSE; } if ($bri != FALSE) { // // SPAWN: JOIN // log_main("garbage_manager: bri loaded successfully."); $bri->garbage_manager(TRUE); $bri_table = $bri->table[0]; // is the end of the table if ($bri->the_end == TRUE) { /* * DESTROY OF FINISHED TABLE && MOVE PLAYER TO ROOM AGAIN */ log_main("garbage_manager: INSIDE THE END."); $plist = "$table_cur->table_token|$table_cur->idx|$table_cur->player_n"; for ($i = 0 ; $i < $table_cur->player_n ; $i++) { $plist .= '|'.$this->user[$table_cur->player[$i]]->sess; } for ($i = 0 ; $i < $bri_table->player_n ; $i++) { // stat must be "table" by definition $user_cur = $this->user[$table_cur->player[$i]]; $bri_user = $bri->user[$i]; $user_cur->subst = $bri_user->subst; $user_cur->step = $bri_user->step; $user_cur->lacc = $bri_user->lacc; $user_cur->laccwr = $bri_user->lacc; $user_cur->bantime = $bri_user->bantime; } log_legal($curtime, 'xxx', $user_cur, "STAT:DESTROY_GAME", $plist); $this->room_join_wakeup($user_cur, FALSE, 0); $table_cur->table_token = ""; $table_cur->wakeup_time = $curtime + WAKEUP_TIME; $this->match_del($table_idx); } else { log_main("gm:: save_data"); for ($i = 0 ; $i < $bri_table->player_n ; $i++) { $this->user[$table_cur->player[$i]]->lacc = $bri->user[$i]->lacc; } } } // if ($bri == FALSE else if ($no_recovery == FALSE) { log_crit("ERROR: table ".$table_idx." unrecoverable join"); for ($i = 0 ; $i < $table_cur->player_n ; $i++) { $user_cur = $this->user[$table_cur->player[$i]]; $user_cur->subst = "shutdowner"; $user_cur->step_inc(); $ret = sprintf('stat = "%s"; subst = "%s";', $user_cur->stat, $user_cur->subst); $ret .= "gst.st = ".($user_cur->step+1)."; "; // MLANG
    I dati del tavolo n° ".$user_cur->table." sono inconsistenti, verranno resettati.

    Torni in piedi.

    $prestr = sprintf($mlang_brisk['tabincon'][$G_lang], $user_cur->table); $ret .= show_notify($prestr, 2000, $mlang_brisk['btn_close'][$G_lang], 400, 110); $user_cur->comm[$user_cur->step % COMM_N] = $ret; $user_cur->step_inc(); } $plist = "$table_cur->table_token|$user_cur->table|$table_cur->player_n"; for ($i = 0 ; $i < $table_cur->player_n ; $i++) { $plist .= '|'.$this->user[$table_cur->player[$i]]->sess; } log_legal($curtime, 'xxx', $user_cur, "STAT:DESTROY_GAME(RECOVERY)", $plist); $this->room_join_wakeup($user_cur, TRUE, -2); $table_cur->table_token = ""; } } } // if ($table_cur->player_n == PLAYERS_N) { } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) { log_rd2("out new loop."); for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $user_cur = $this->user[$i]; log_rd2("User: ".$user_cur->name." stat: ".$user_cur->stat." subst: ".$user_cur->subst); if ($user_cur->sess == "") continue; if ($user_cur->lacc + EXPIRE_TIME_RD < $curtime) { // Auto logout dell'utente log_rd2("AUTO LOGOUT.".($user_cur->lacc + EXPIRE_TIME_RD)." curtime ".$curtime); if ($user_cur->stat == 'table' || $user_cur->stat == 'room') { log_auth($user_cur->sess, "Autologout session."); $user_cur->reset(); log_rd2("AUTO LOGOUT."); if ($user_cur->subst == 'sitdown' || $user_cur->stat == 'table') $this->room_wakeup($user_cur); else if ($user_cur->subst == 'standup') $this->room_outstandup($user_cur); else log_rd2("LOGOUT FROM WHAT ???"); } } if ($user_cur->laccwr + EXPIRE_TIME_SMAMMA < $curtime) { // lo rimettiamo in piedi if ($user_cur->stat == 'room' && $user_cur->subst == 'sitdown') { $this->room_wakeup($user_cur); $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; "; /* MLANG:
    Sei stato inattivo per ".(EXPIRE_TIME_SMAMMA/60.0)." minuti.

    Quindi ritorni tra i Giocatori in piedi.", "torna ai tavoli" */ $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); $user_cur->step_inc(); } } } log_rd2("GARBAGE UPDATED!"); $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT; $ismod = TRUE; return ($ismod); } function show_room($user_step, $user) { GLOBAL $G_lang, $mlang_brisk; log_main("show_room: username: ".$user->name); $ret = sprintf('gst.st = %d; ', $user_step); if ($user->flags & USER_FLAG_ISOLAUTH) { $ret .= 'list_set(\'isolation\', false, \''.$mlang_brisk['tit_onisol'][$G_lang].'\' ); '; } else if ($user->flags & USER_FLAG_LISTAUTH) { $ret .= 'list_set(\'auth\', false, \''.$mlang_brisk['tit_onauth'][$G_lang].'\' ); '; } else { $ret .= 'list_set(\'all\', false, \'\' ); '; } if ($user->subst == 'standup') $ret .= "tra.show(); "; else $ret .= "tra.hide(); "; $ret .= sprintf('stat = "%s";', $user->stat); $ret .= root_wellcome($user); if ($user->flags & USER_FLAG_DBFAILED) { $ret .= "gst.st = ".($user->step+1)."; "; $ret .= show_notify($mlang_brisk['db_failed'][$G_lang], 0, $mlang_brisk['btn_close'][$G_lang], 400, 140); } $ret .= sprintf('subst = "%s";', $user->subst); $ret .= $user->myname_innerHTML(); for ($i = 0 ; $i < TABLES_N ; $i++) { $ret .= $this->table_content($user, $i); // $ret .= table_act_content(($user->subst == 'standup'), $this->table[$i]->player_n, $i, $user->table, // ($this->table[$i]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH)); $ret .= $this->table[$i]->act_content($user); if ($this->table[$i]->wag_own != -1) $ret .= sprintf('tra.add(%d, "%s: %s"); ', $i, $this->user[$this->table[$i]->wag_own]->name, $this->table[$i]->wag_com); else $ret .= sprintf('tra.rem(%d); ', $i); } $ret .= $this->standup_content($user); $ret .= "setTimeout(preload_images, 0, g_preload_img_arr, g_imgct); "; return ($ret); } function room_wakeup($user) { $table_idx = $user->table; $table = $this->table[$table_idx]; log_main("WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst); $curtime = time(); $from_table = ($user->stat == "table"); if ($from_table) { log_main("WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n); for ($i = 0 ; $i < $table->player_n ; $i++) { $user_cur = $this->user[$table->player[$i]]; log_main("PREIMPOST: INLOOP name: ".$user_cur->name); if ($user->idx_get() != $table->player[$i]) { $user_cur->stat_set("room"); $user_cur->subst = "sitdown"; $user_cur->laccwr = $curtime; } else if ($user->sess != "") { $user_cur->stat_set("room"); $user_cur->subst = "standup"; $user_cur->laccwr = $curtime; $user_cur->table = -1; } } } else { $user->stat_set("room"); $user->subst = "standup"; $user->laccwr = $curtime; } $remove_wagon = FALSE; if($table->wag_own == $user->idx_get()) { $table->wag_reset($curtime); $remove_wagon = TRUE; } /* aggiorna l'array dei giocatori al tavolo. */ $table->user_rem($this, $user); for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $user_cur = $this->user[$i]; if ($user_cur->sess == '' || $user_cur->stat != 'room') continue; // log_main("VALORI: name: ".$user_cur->name."from_table: ".$from_table." tab: ".$user_cur->table." taix: ".$table_idx." ucur: ".$user_cur." us: ".$user); $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : ""); if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) { $ret .= 'gst.st_loc++; xstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|'; // $ret .= 'gst.st_loc++; document.location.assign("index.php");|'; log_main("DOCUMENT.index.php: from table"); } else if ($user_cur->stat == "room") { log_main("DOCUMENT.index.php: from table"); $ret .= $this->table_content($user_cur, $table_idx); $ret .= $this->standup_content($user_cur); // $ret .= table_act_content(FALSE, 0, $table_idx, $user->table, FALSE); $ret .= $table->act_content($user); if ($user->idx_get() == $i) { // set the new status $ret .= 'subst = "standup"; tra.show(); '; // clean the action buttons in other tables for ($e = 0 ; $e < TABLES_N ; $e++) { if ($this->table[$e]->player_n < PLAYERS_N) { // $ret .= table_act_content(TRUE, 0, $e, $user->table, // ($this->table[$e]->auth_only == FALSE ? TRUE : $user->flags & USER_FLAG_AUTH)); $ret .= $this->table[$e]->act_content($user); } } } else { // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table, // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH)); $ret .= $table->act_content($user_cur); } } log_wr("ROOM_WAKEUP: ".$ret); $user_cur->comm[$user_cur->step % COMM_N] = $ret; $user_cur->step_inc(); } } function room_join_wakeup($user, $update_lacc = FALSE, $trans_delta) { $table_idx = $user->table; $table = $this->table[$table_idx]; log_main("JOIN_WAKEUP: begin function table:".$table_idx." stat: ".$user->stat." subst: ".$user->subst); $curtime = time(); $user_wup = array(); $user_wup_n = 0; $user_tab = array(); $user_tab_n = 0; log_main("JOIN WAKEUP: from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n); for ($i = 0 ; $i < $table->player_n ; $i++) { $user_cur = $this->user[$table->player[$i]]; log_main("PREIMPOST INLOOP name: ".$user_cur->name); if ($user_cur->sess != "") { if ($update_lacc == TRUE) { $user_cur->laccwr = $curtime; } log_main("cur: ".$user_cur->name." subst: ".$user_cur->subst); if ($user_cur->subst == "shutdowned") { $user_cur->stat_set("room"); $user_cur->subst = "sitdown"; } else if ($user_cur->subst == "shutdowner") { $user_cur->stat_set("room"); $user_cur->subst = "standup"; $user_cur->table = -1; $user_wup[$user_wup_n++] = $user_cur; $remove_wagon = FALSE; if($table->wag_own == $table->player[$i]) { $remove_wagon = TRUE; $table->wag_reset($curtime); } } $user_tab[$user_tab_n++] = $table->player[$i]; } } for ($wup_idx = 0 ; $wup_idx < $user_wup_n ; $wup_idx++) $table->user_rem($this, $user_wup[$wup_idx]); /* aggiorna l'array dei giocatori al tavolo. */ for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { log_main("START LOOP"); $user_cur = $this->user[$i]; if ($user_cur->sess == '' || $user_cur->stat != 'room') { log_main("name: ".$user_cur->name."skip subst: ".$user_cur->subst); continue; } log_main("___"); log_main("VALORI name: ".$user_cur->name." tab: ".$user_cur->table." taix: ".$table_idx); $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : ""); if ($user_cur->stat == "room") { log_main("DOCUMENT.index.php from table"); $ret .= $this->table_content($user_cur, $table_idx); $ret .= $this->standup_content($user_cur); // $ret .= table_act_content(FALSE, 0, $table_idx, $user_cur->table, // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH)); $ret .= $table->act_content($user_cur); for ($tab_idx = 0 ; $tab_idx < $user_tab_n ; $tab_idx++) if ($user_tab[$tab_idx] == $i) break; // for users that wakeup the room will be reconstructed by index_rd.php if ($tab_idx < $user_tab_n) { log_main("PRE show_room username: ".$user_cur->name." STEP: ".$user_cur->step); // ARRAY_POP DISABLED // if ($trans_delta == 0) // while (array_pop($user_cur->comm) != NULL); $user_cur->trans_step = $user_cur->step + 1 + $trans_delta; $user_cur->comm[$user_cur->step % COMM_N] = ""; $user_cur->step_inc(); $user_cur->comm[$user_cur->step % COMM_N] = $this->show_room(($user_cur->step + 1), $user_cur); $user_cur->step_inc(); log_main("POST show_room username: ".$user_cur->name." STEP: ".$user_cur->step); continue; } log_main("JOIN_WAKEUP wup_idx ".$wup_idx." wup_n ".$user_wup_n); log_main("JOIN_WAKEUP more"); // $ret .= table_act_content(($user_cur->subst == 'standup'), $table->player_n, $table_idx, $user_cur->table, // ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH)); $ret .= $table->act_content($user_cur); log_main("JOIN_WAKEUP end more"); } log_wr("ROOM_JOIN_WAKEUP: ".$ret); $user_cur->comm[$user_cur->step % COMM_N] = $ret; $user_cur->step_inc(); } } function room_outstandup($user) { $this->room_sitdown($user, -1); } function table_update($user) { log_main("table_update: pre - USER: ".$user->name); $table_idx = $user->table; if ($table_idx > -1) $table = $this->table[$table_idx]; for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $ret = ""; $user_cur = $this->user[$i]; if ($user_cur->sess == '' || $user_cur->stat != 'room') continue; $ret = "gst.st = ".($user_cur->step+1)."; "; if ($table_idx > -1) $ret .= $this->table_content($user_cur, $table_idx); if ($user->idx_get() == $i) { $ret .= $user->myname_innerHTML(); } $user_cur->comm[$user_cur->step % COMM_N] = $ret; $user_cur->step_inc(); } log_main("table_update: post"); } function room_sitdown($user, $table_idx) { log_main("room_sitdown ".($user == FALSE ? "USER: FALSE" : "USER: ".$user->name)); $train_app = ""; if ($table_idx > -1 && $table_idx < TABLES_N) { $table = $this->table[$table_idx]; // wagon shutdown if ($table->wag_own != -1 && $table->player_n == PLAYERS_N) { for ($i = 0 ; $i < TABLES_N ; $i++) { if ($table->wag_own == $table->player[$i]) { $train_app = sprintf("tra.rem(%d); ", $table_idx); $table->wag_reset(time()); break; } } } } for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $ret = ""; $user_cur = $this->user[$i]; if ($user_cur->sess == '' || $user_cur->stat != 'room') continue; $ret = "gst.st = ".($user_cur->step+1)."; ".$train_app; if ($table_idx > -1) $ret .= $this->table_content($user_cur, $table_idx); $ret .= $this->standup_content($user_cur); if ($user->idx_get() == $i) { $ret .= 'subst = "sitdown"; tra.hide(); '; // clean the action buttons in other tables for ($e = 0 ; $e < TABLES_N ; $e++) { // $ret .= table_act_content(FALSE, 0, $e, $user_cur->table, FALSE); $ret .= $this->table[$e]->act_content($user_cur); } } else if ($table_idx > -1) { if ($table->player_n == PLAYERS_N) { // $ret .= table_act_content(($user_cur->subst == 'standup'), PLAYERS_N, $table_idx, $user_cur->table, /// ($table->auth_only == FALSE ? TRUE : $user_cur->flags & USER_FLAG_AUTH)); $ret .= $table->act_content($user_cur); } } $user_cur->comm[$user_cur->step % COMM_N] = $ret; $user_cur->step_inc(); } } function chatt_send($user, $mesg) { GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang; $only_you = FALSE; // common settings $msg = mb_substr($mesg, 6, 128, "UTF-8"); $curtime = time(); $dt = date("H:i ", $curtime); $target = ""; // // Compute actions // $to_user = FALSE; $to_all = FALSE; $to_room = FALSE; $to_tabl = FALSE; $is_normchat = FALSE; /* for old isolation management $is_ticker = FALSE; */ $update_room = FALSE; if (strcmp($msg, "/tav") == 0 || strncmp($msg, "/tav ", 5) == 0) { do { if ($user->stat != 'room' || $user->subst != 'sitdown') { /* MLANG: "
    Per attivare il messaggio di segnalazione del tavolo occorre essere seduti.

    ", "
    Il messaggio di segnalazione del tavolo è già attivato.

    ", "
    Il messaggio di segnalazione del tavolo
    è disattivato ancora per %d second%s.

    " */ $msg = $mlang_brisk['tickmust'][$G_lang]; $to_user = show_notify($msg, 0, "chiudi", 400, 100); break; } $table = $this->table[$user->table]; if ($table->wag_own != -1) { // MLANG
    Il messaggio di segnalazione del tavolo è già attivato.

    $msg = $mlang_brisk['tickjust'][$G_lang]; $to_user = show_notify($msg, 0, "chiudi", 400, 100); break; } $dtime = $curtime - $table->wag_tout; if ($dtime < EXPIRE_TIME_WAG) { // MLANG -
    Il messaggio di segnalazione del tavolo
    è disattivato ancora per %d second%s.

    $msg = sprintf($mlang_brisk['tickwait'][$G_lang], EXPIRE_TIME_WAG - $dtime, (EXPIRE_TIME_WAG - $dtime == 1 ? ($G_lang == 'en' ? "" : "o") : ($G_lang == 'en' ? "s" : "i"))); $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang] , 400, 100); break; } $msg = substr($msg, 5); $table->wag_set($user->idx_get(), $msg); $to_user = sprintf('tra.add(%d, "%s");', $user->table, xcape(sprintf("%s: %s", $user->name, $msg))); $to_room = $to_user; /* for old isolation management $is_ticker = TRUE; */ } while (0); } // /tav chat command else if (strncmp($msg, "/alarm ", 7) == 0) { if (strncmp($msg, "/alarm to ", 10) == 0) { $sp_pos = strpos($msg, " ", 10); $target = substr($msg, 10, $sp_pos - 10); $alarm_check = "/alarm to ".$target." ".$G_alarm_passwd." "; } else { $target = ""; $alarm_check = "/alarm ".$G_alarm_passwd." "; } do { if (strncmp($msg, $alarm_check, strlen($alarm_check)) != 0) { /* MLANG: "
    La password digitata non è corretta.

    " */ $msg = $mlang_brisk['alarpass'][$G_lang]; $to_user = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 100); break; } /* MLANG: "Alarm %s inviato a %s." */ $prestr = sprintf($mlang_brisk['alarret'][$G_lang], xcape(substr($msg, strlen($alarm_check))), ($target == "" ? $mlang_brisk['tit_all'][$G_lang] : xcape($target)) ); $to_user = sprintf('chatt_sub("%s", [2, "%s"],%s);', $dt, NICKSERV, $prestr); $msg = sprintf("
    %s

    %s


    ", $dt.NICKSERV, xcape(substr($msg, strlen($alarm_check)))); /* MLANG: "chiudi" */ $to_all = show_notify($msg, 0, $mlang_brisk['btn_close'][$G_lang], 400, 120); } while (0); } // /alarm chat command else if (strncmp($msg, "/listen ", 8) == 0) { $arg = substr($msg, 8); if (strcasecmp($arg, "isolation") == 0) { $flags_old = 0; if ($user->stat == 'room' && $user->subst == 'sitdown' && $user->table >= TABLES_AUTH_N) { $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['listmust'][$G_lang]); } else { $user->flags &= ~USER_FLAG_MAP_AUTH; $user->flags |= USER_FLAG_ISOLAUTH; $to_user = 'list_set(\'isolation\', true, \''.$mlang_brisk['tit_onisol'][$G_lang].'\'); '; } } else if (strcasecmp($arg, "auth") == 0) { $flags_old = $user->flags; $user->flags &= ~USER_FLAG_MAP_AUTH; $user->flags |= USER_FLAG_LISTAUTH; $to_user = 'list_set(\'auth\', true, \''.$mlang_brisk['tit_onauth'][$G_lang].'\'); '; } else { $flags_old = $user->flags; $user->flags &= ~USER_FLAG_MAP_AUTH; $to_user = 'list_set(\'all\', true, \'\'); '; } // if from isolation redraw standup area if (($flags_old ^ $user->flags) & USER_FLAG_ISOLAUTH) { $to_user .= 'standup_data_old = null; '.$this->standup_content($user); } } else if (strcmp($msg, "/authreq") == 0) { if ($user->flags & USER_FLAG_AUTH) { $to_user = sprintf('authbox(300,200);'); } else { /* MLANG: "Per autenticare qualcuno devi a tua volta essere autenticato.", "Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.", "Nickname %s già in uso." */ $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authmust'][$G_lang]); } } else if (strncmp($msg, "/mesgtoadm", 8) == 0) { if ($user->flags & USER_FLAG_AUTH) { $to_user = sprintf('mesgtoadmbox(500,300);'); } else { /* MLANG: "Per inviare un messaggio devi essere autenticato." */ $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['mesgmust'][$G_lang]); } } else if (strncmp($msg, "/nick ", 6) == 0) { log_main("chatt_send BEGIN"); do { if (($name_new = validate_name(substr($msg, 6))) == FALSE) { $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]); break; } $msg = "COMMAND ".$msg; for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $user_cur = $this->user[$i]; if ($user_cur->sess == '') continue; if (strcasecmp($user_cur->name,$name_new) == 0) break; } if ($i < MAX_PLAYERS) { $prestr = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new)); $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr); break; } /* MLANG: "Non puoi cambiare nick a un tavolo per soli autenticati.", "Il nickname \'%s\' è già registrato, se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghostN." */ if ($user->flags & USER_FLAG_AUTH) { if (strcasecmp($user->name,$name_new) != 0) { if (( ($user->flags & USER_FLAG_MAP_AUTH) != USER_FLAG_ISOLAUTH) && ($user->subst == 'standup' || ($user->subst != 'standup' && $this->table[$user->table]->auth_only == FALSE) ) ) { $user->flags &= ~(USER_FLAG_AUTH | USER_FLAG_TY_ALL); // Remove auth if name changed for ($i = 0 ; $i < TABLES_N ; $i++) { $to_user .= $this->table[$i]->act_content($user); } } else { $to_user = sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]); break; } } } $user->name = $name_new; // OK - nick changed /* se nome gia' in uso, segnala cosa potrebbe capitare */ if (($user->flags & USER_FLAG_AUTH) == 0) { if (($bdb = BriskDB::create()) != FALSE) { $bdb->users_load(); /* MLANG: "Il nickname \'%s\' è già registrato, se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghostN." */ if ($bdb->login_exists($name_new)) { $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new)); $to_user .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $prestr); } } } log_main("chatt_send start set"); $update_room = TRUE; } while (0); } // nick chat command else if (strncmp($msg, "/st ", 4) == 0) { log_main("chatt_send BEGIN"); do { $st_str = substr($msg, 4); if (strcasecmp($st_str, "normale") == 0) { $st = USER_FLAG_S_NORM; } else if (strcasecmp($st_str, "pausa") == 0) { $st = USER_FLAG_S_PAU; } else if (strcasecmp($st_str, "fuori") == 0) { $st = USER_FLAG_S_OUT; } else if (strcasecmp($st_str, "cane") == 0) { $st = USER_FLAG_S_DOG; } else if (strcasecmp($st_str, "cibo") == 0) { $st = USER_FLAG_S_EAT; } else if (strcasecmp($st_str, "lavoro") == 0) { $st = USER_FLAG_S_WRK; } else if (strcasecmp($st_str, "sigaretta") == 0) { $st = USER_FLAG_S_SMK; } else if (strcasecmp($st_str, "presente") == 0) { $st = USER_FLAG_S_EYE; } else if (strcasecmp($st_str, "coniglio") == 0) { $st = USER_FLAG_S_RABB; } else if (strcasecmp($st_str, "calcio") == 0) { $st = USER_FLAG_S_SOCC; } else if (strcasecmp($st_str, "pupo") == 0) { $st = USER_FLAG_S_BABY; } else if (strcasecmp($st_str, "pulizie") == 0) { $st = USER_FLAG_S_MOP; } else { /* MLANG: "Questo stato non esiste." */ $to_user = sprintf('chatt_sub("%s", [2,"%s"],"%s");', $dt, NICKSERV, $mlang_brisk['statunkn'][$G_lang]); break; } log_main("chatt_send start set"); if (($user->flags & USER_FLAG_S_ALL) != $st) { $update_room = TRUE; $user->flags = ($user->flags & ~USER_FLAG_S_ALL) | $st; } } while (0); } // nick chat command else { // normal chat line $is_normchat = TRUE; if (CHAT_ENABLED && $curtime < ($user->chat_ban + $user->chat_dlt)) { $only_you = TRUE; $user->chat_dlt = $user->chat_dlt * 2; if ($user->chat_dlt > 120) $user->chat_dlt = 120; } else if ($user->chat_lst == $msg) $only_you = TRUE; else if (CHAT_ENABLED && $curtime - $user->chattime[($user->chat_cur + 1) % CHAT_N] < CHAT_ILL_TIME) { $user->chat_ban = $curtime; $user->chat_dlt = 5; $only_you = TRUE; } else { $user->chat_ban = 0; $user->chat_dlt = 0; } if ($only_you) { $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban ==")); } else { $to_user = sprintf('chatt_sub("%s", [%d, "%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape($msg)); // temporary silentiation for troll (will became array check) // if (strcasecmp($user->name,'JackRokka') != 0 && $user->sess != '47ea653f602e8') $to_room = $to_user; } log_legal($curtime, 'xxx', $user, ($user->stat == 'room' ? 'room' : 'table '.$user->table),$msg); $user->chat_lst = "$msg"; $user->chattime[$user->chat_cur % CHAT_N] = $curtime; $user->chat_cur++; } if ($to_all) { $to_room = $to_all; $to_tabl = $to_all; } // // Output to clients // if ($to_user != FALSE) { $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; "; $user->comm[$user->step % COMM_N] .= $to_user; $user->step_inc(); } if ($to_room != FALSE) { for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $user_cur = $this->user[$i]; if ($target != "" && $user_cur->name != $target) continue; if ($user_cur->sess == '' || $user_cur->stat == 'table' || $user->idx_get() == $i) continue; if ($is_normchat == TRUE) { // use MAP_AUTH to check if auth or isolation if ($user_cur->flags & USER_FLAG_MAP_AUTH) { if (($user->flags & USER_FLAG_AUTH) == 0) { continue; } } } /* else if ($is_ticker) { if (($user_cur->flags & USER_FLAG_MAP_AUTH) == USER_FLAG_ISOLAUTH) { if ($user->table >= TABLES_AUTH_N) continue; } } */ $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; "; $user_cur->comm[$user_cur->step % COMM_N] .= $to_room; $user_cur->step_inc(); } } if ($to_tabl) { // FIXME BRISK4: include for each kind of table require_once("${G_base}briskin5/Obj/briskin5.phh"); // Before all align times with table timeout for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) { if (isset($this->match[$table_idx])) { $bri = $this->match[$table_idx]; $bri_table = $bri->table[0]; for ($i = 0 ; $i < $bri_table->player_n ; $i++) { // stat must be "table" by definition $bri_user = $bri->user[$i]; if ($target != "" && $bri_user->name != $target) continue; log_main("writa: ".$user_mesg); $bri_user->comm[$bri_user->step % COMM_N] = "gst.st = ".($bri_user->step+1)."; "; $bri_user->comm[$bri_user->step % COMM_N] .= $to_tabl; $bri_user->step_inc(); } } // if (isset($this->match } // for ($table_idx = 0 ; $table_idx < TABLES_N ; $table_idx++) { } // if ($to_tabl == true ... if ($update_room) { if ($user->stat == 'room' && $user->subst == 'standup') { $this->standup_update($user); } else if ($user->stat == 'room' && $user->subst == 'sitdown') { log_main("chatt_send pre table update"); $this->table_update($user); log_main("chatt_send post table update"); } } // if ($update_room ... return; } // function chatt_send( ... function get_user($sess, &$idx) { GLOBAL $PHP_SELF; if (validate_sess($sess)) { for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { if (strcmp($sess, $this->user[$i]->sess) == 0) { // find it $idx = $i; $ret = $this->user[$i]; return ($ret); } } log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF)); // for ($i = 0 ; $i < MAX_PLAYERS ; $i++) // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess)); } else { log_main(sprintf("get_user: Wrong strlen [%s]",$sess)); } return (FALSE); } /* * function add_user(&$room, &$sess, &$idx, $name, $pass, $ip) * * RETURN VALUE: * if ($idx > -1 && ret == FALSE) => duplicated nick * if ($idx == -2 && ret == FALSE) => invalid name * if ($idx == -3 && ret == FALSE) => wrong password * if ($idx == -1 && ret == FALSE) => no space left * if ($idx == 0 && ret == user) => SUCCESS * if ($idx == -$idx && ret == user) => SUCCESS (but the login exists in the auth db) */ function add_user(&$sess, &$idx, $name, $pass, $ip, $cookie) { GLOBAL $G_base; $idx = 0; $authenticate = FALSE; $user_type = 0; $login_exists = FALSE; $ghost = -1; $ghost_auth = FALSE; $idx = -1; $idfree = -1; $code = FALSE; if (($name_new = validate_name($name)) == FALSE) { $idx = -2; return (FALSE); } log_auth("XXX", sprintf("ARRIVA: [%s] pass:[%s]", $sess, ($pass == FALSE ? "FALSE" : $pass))); if (validate_sess($sess) == FALSE) $sess = ""; /* if pass != FALSE verify the login with pass */ log_auth("XXX", "auth1"); if (($bdb = BriskDB::create()) != FALSE) { $bdb->users_load(); if ($pass != FALSE) { // TODO: here add a method to $bdb to check if the db is available. log_auth("XXX", "auth2"); $authenticate = $bdb->login_verify($name_new, $pass, $code); log_auth("XXX", "authenticate: ".($authenticate != FALSE ? "TRUE" : "FALSE")); if ($authenticate != FALSE) { $user_type = $authenticate->type_get(); } else { $idx = -3; return (FALSE); } } else { $login_exists = $bdb->login_exists($name_new); } } else { // if db is down, send a warning and verify only current users // no actions at this moment } for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { /* free user ? */ if (strcmp($sess, $this->user[$i]->sess) == 0) { if ($idx == -1) $idx = $i; } if ($idfree == -1 && strcmp($this->user[$i]->sess, "") == 0) { $idfree = $i; continue; // NOTE: CHECK IT !! } if (strcasecmp($this->user[$i]->name, $name_new) == 0) { if ($authenticate != FALSE) { $ghost = $i; $ghost_auth = ($this->user[$i]->flags & USER_FLAG_AUTH); } else { $idx = $i; break; } } } if ($idx == -1) $idx = $idfree; log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new)); /* there is another user logged with your account and you and him have authenticated => new user get the session of the old user */ if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) { /* swap session */ $ghost_user = $this->user[$ghost]; $curtime = time(); $ghost_user->comm[$ghost_user->step % COMM_N] = ""; $ghost_user->step_inc(); if ($sess == "") { $sess = uniqid(""); $ghost_user->sess = $sess; } else { $ghost_user->sess = $sess; } // If user at the table we need to update the table data too $table_idx = $ghost_user->table; if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) { require_once("${G_base}briskin5/Obj/briskin5.phh"); if (isset($this->match[$table_idx])) { $bri = $this->match[$table_idx]; if ($bri->the_end != TRUE) { $bri->user[$ghost_user->table_pos]->comm[$bri->user[$ghost_user->table_pos]->step % COMM_N] = ""; $bri->user[$ghost_user->table_pos]->step_inc(); $bri->user[$ghost_user->table_pos]->sess = $sess; } } } $idx = $ghost; return ($this->user[$ghost]); } else if ($idx != -1 && $i == MAX_PLAYERS) { /* SUCCESS */ $curtime = time(); if ($sess == "") { $sess = uniqid(""); $this->user[$idx]->sess = $sess; } else { $this->user[$idx]->sess = $sess; } $this->user[$idx]->name = $name_new; // OK - add new user $this->user[$idx]->stat_set("room"); $this->user[$idx]->step_set(0); while (array_pop($this->user[$idx]->comm) != NULL); $this->user[$idx]->subst = "standup"; $this->user[$idx]->lacc = $curtime; $this->user[$idx]->laccwr = $curtime; $this->user[$idx]->bantime = 0; $this->user[$idx]->ip = $ip; $this->user[$idx]->flags = $user_type; $this->user[$idx]->flags |= ($authenticate != FALSE ? USER_FLAG_AUTH : 0x00); $this->user[$idx]->flags |= ( ($pass != FALSE && $bdb == FALSE) ? USER_FLAG_DBFAILED : 0x00); log_auth("XXX", sprintf("FLAGS: [%x]", $this->user[$idx]->flags)); if ($authenticate != FALSE) { $this->user[$idx]->code = $authenticate->code_get(); $this->user[$idx]->flags |= USER_FLAG_LISTAUTH; if (isset($cookie['CO_list'])) { if (strcmp($cookie['CO_list'], "auth") == 0) { $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH; $this->user[$idx]->flags |= USER_FLAG_LISTAUTH; } if (strcmp($cookie['CO_list'], "isolation") == 0) { $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH; $this->user[$idx]->flags |= USER_FLAG_ISOLAUTH; } else { $this->user[$idx]->flags &= ~USER_FLAG_MAP_AUTH; } } } if ($ghost > -1) { log_main("ghost: rename!"); $ghost_user = $this->user[$ghost]; if ($ghost_auth == FALSE) { for ($sfx = 1 ; $sfx <= MAX_PLAYERS ; $sfx++) { $ghostname = 'ghost'.$sfx; for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { if (strcmp("", $this->user[$i]->sess) == 0) continue; if (strcasecmp($this->user[$i]->name, $ghostname) == 0) { $ghostname = ''; break; } } if ($ghostname != '') break; } $ghost_user->name = $ghostname; if ($ghost_user->stat == 'room' && $ghost_user->subst == 'standup') { $this->standup_update($ghost_user); } else { log_main("chatt_send pre table update"); $this->table_update($ghost_user); log_main("chatt_send post table update"); } } // if ($ghost_auth == FALSE else { // FIXME: cacciare il vecchio utente room && table (if needed) $ghost_user->the_end = TRUE; $ghost_user->lacc = 0; $this->garbage_manager(TRUE); } } // if ($ghost > -1) { $real_idx = $idx; if ($login_exists) $idx = -($idx + 1); 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)); $ret = $this->user[$real_idx]; return ($ret); } return (FALSE); } function standup_update($user) { for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $user_cur = $this->user[$i]; if ($user_cur->sess == '') continue; log_main("STANDUP START: ".$user_cur->stat); if ($user_cur->stat == 'room') { $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur); if ($user->idx_get() == $i) { $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML(); } log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]); $user_cur->step_inc(); } } } // Static functions static function create($crystal_filename) { if (($room_ser = @file_get_contents($crystal_filename)) == FALSE || ($room = unserialize($room_ser)) == FALSE) { fprintf(STDERR, "NEW ROOM\n"); $room = new Room($crystal_filename); } else { fprintf(STDERR, "ROOM FROM FILE\n"); } return $room; } function load_data() { GLOBAL $sess; do { if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) { log_main("ftok failed"); break; } if (($shm_sz = sharedmem_sz($tok)) == -1) { log_main("shmop_open failed"); } if ($shm_sz == -1) $shm_sz = SHM_DIMS_MIN; if ($shm = shm_attach($tok, $shm_sz)) { $room = @shm_get_var($shm, $tok); // CHECKED BELOW log_only("bri == ".($room == FALSE ? "FALSE" : "TRUE")." bri === ".($room === FALSE ? "FALSE" : "TRUE")." bri isset ".(isset($room) ? "TRUE" : "FALSE")); if (isset($room)) log_only("bri count ".count($room)); if ($room == FALSE) { log_only("INIT MAIN DATA"); shm_detach($shm); $room = Room::create(); log_shme("Room::create"); if (Room::save_data($room) == FALSE) return FALSE; return $room; } $room->shm_sz = $shm_sz; shm_detach($shm); for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { if (($room->user[$i] = User::load_data($i, FALSE)) == FALSE) { log_crit("User::load_data failed"); break; } } if ($i < MAX_PLAYERS) { break; } } // // SHSPLIT: load users from the shared memory // return ($room); } while (0); return (FALSE); } function save_data_orig($room) { GLOBAL $sess; $shm = FALSE; // var_dump($room); if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) return (FALSE); while ($room->shm_sz < SHM_DIMS_MAX) { if (($shm = shm_attach($tok, $room->shm_sz)) == FALSE) break; // log_only("PUT_VAR DI ".strlen(serialize($room))); if (@shm_put_var($shm, $tok, $room) != FALSE) { shm_detach($shm); return (TRUE); } if (shm_remove($shm) === FALSE) { log_only("REMOVE FALLITA"); break; } shm_detach($shm); $room->shm_sz += SHM_DIMS_DLT; } if ($shm) shm_detach($shm); return (FALSE); } function dump_data() { $room_ser = serialize($this); $room_ser_len = mb_strlen($room_ser, "ASCII"); if (file_put_contents($this->crystal_filename, $room_ser) == $room_ser_len) { return (TRUE); } return (FALSE); } function save_data($room) { GLOBAL $sess; $ret = FALSE; $shm = FALSE; if (($tok = @ftok(FTOK_PATH."/main", "C")) == -1) return (FALSE); // SHSPLIT: before save the $room you must save users, // detach from main struct and (then) reattach $user_park = array(); for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { $user_park[$i] = $room->user[$i]; $room->user[$i] = FALSE; } while ($room->shm_sz < SHM_DIMS_MAX) { if (($shm = shm_attach($tok, $room->shm_sz)) == FALSE) break; // log_only("PUT_VAR DI ".strlen(serialize($room))); if (@shm_put_var($shm, $tok, $room) != FALSE) { log_shme("Room::save_data"); $ret = TRUE; break; } if (shm_remove($shm) === FALSE) { log_only("REMOVE FALLITA"); break; } shm_detach($shm); $room->shm_sz += SHM_DIMS_DLT; } if ($shm) shm_detach($shm); // SHSPLIT: reattach users to the room class for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { User::save_data($user_park[$i], $i); $room->user[$i] = $user_park[$i]; } log_load("FINISH: ".($ret == TRUE ? "TRUE" : "FALSE")); return ($ret); } static function lock_data($is_exclusive) { if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) { self::$delta_t = microtime(TRUE); log_lock("LOCK room [".self::$delta_t."]"); return ($res); } return (FALSE); } static function unlock_data($res) { GLOBAL $sess; log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]"); file_unlock($res); } function standup_content($user) { $ret = ""; $content = ""; if ($user->stat != 'room') return; for ($i = 0 , $ct = 0 ; $ct < 4 && $i < MAX_PLAYERS ; $i++) { if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "") continue; $ct++; } // $content .= sprintf('', $ct); $content = ' j_stand_cont( [ '; for ($i = 0 , $ct = 0 ; $i < MAX_PLAYERS ; $i++) { if ($this->user[$i]->sess == "" || $this->user[$i]->stat != "room" || $this->user[$i]->name == "") continue; $flags = $this->user[$i]->flags; if ($this->user[$i]->subst == "standup") { if ($user->idx_get() == $i) { $flags |= 1; } $content .= sprintf('%s[ %d, "%s" ]',($ct > 0 ? ', ' : ''), $flags, xcape($this->user[$i]->name)); $ct++; } } $content .= ' ]);'; return ($content); } function table_content($user, $table_idx) { $content = ""; $ret = ""; // TODO // // Si possono usare i dati nella classe table // $sess = $user->sess; $table = $this->table[$table_idx]; if ($user->stat != 'room') return; $content = "[ "; for ($i = 0 ; $i < $table->player_n ; $i++) { $user_cur = $this->user[$table->player[$i]]; $flags = $user_cur->flags; if ($user->idx_get() == $table->player[$i]) $flags |= 1; log_main($user_cur->name. sprintf(" IN TABLE [%d]", $table_idx)); $content .= sprintf('%s[ %d, "%s" ]',($i == 0 ? '' : ', '), $flags, xcape($user_cur->name)); } $content .= ' ]'; $ret .= sprintf('j_tab_cont(%d, %s);', $table_idx, $content); return ($ret); } function request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, $path, $addr, $get, $post, $cookie) { printf("NEW_SOCKET (root): %d\n", intval($new_socket)); $enc = get_encoding($header); if (isset($header['User-Agent']) && strstr($header['User-Agent'], "MSIE")) { $transp_type = "htmlfile"; } else { $transp_type = "iframe"; } force_no_cache($header_out); switch ($path) { case "": case "index.php": ob_start(); index_main($this, $transp_type, $header_out, $addr, $get, $post, $cookie); $content = ob_get_contents(); ob_end_clean(); $s_a_p->pgflush_try_add($enc, $new_socket, 20, $header_out, $content); return TRUE; break; case "index_wr.php": ob_start(); index_wr_main($this, $addr, $get, $post, $cookie); $content = ob_get_contents(); ob_end_clean(); $s_a_p->pgflush_try_add($enc, $new_socket, 20, $header_out, $content); return TRUE; break; case "index_rd_ifra.php": do { if (!isset($cookie['sess']) || (($user = $this->get_user($cookie['sess'], $idx)) == FALSE)) { $content = User::stream_fini($s_a_p->rndstr, TRUE); $s_a_p->pgflush_try_add($enc, $new_socket, 20, $header_out, $content); return TRUE; break; } // close a previous opened index_read_ifra socket, if exists if (($prev = $user->rd_socket_get()) != NULL) { $s_a_p->socks_unset($user->rd_socket_get()); fclose($user->rd_socket_get()); printf("CLOSE AND OPEN AGAIN ON IFRA2\n"); $user->rd_socket_set(NULL); } $content = ""; $user->stream_init($s_a_p->rndstr, $enc, $header_out, $content, $get, $post, $cookie); $response = headers_render($header_out, -1).chunked_content($user->rd_zls_get(), $content); $response_l = mb_strlen($response, "ASCII"); $wret = @fwrite($new_socket, $response, $response_l); if ($wret < $response_l) { printf("TROUBLES WITH FWRITE: %d\n", $wret); $user->rd_cache_set(mb_substr($content, $wret, $response_l - $wret, "ASCII")); } else { $user->rd_cache_set(""); } fflush($new_socket); $s_a_p->socks_set($new_socket, $user); $user->rd_socket_set($new_socket); printf(" - qui ci siamo - "); return TRUE; } while (FALSE); return FALSE; break; default: /* FAR TODO: move all into an array of registered sub-apps */ $subs = "briskin5/"; $subs_l = strlen($subs); if (!strncmp($path, $subs, $subs_l)) { $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie); return ($ret); } break; } return (FALSE); } function match_add($idx, $match) { $this->match[$idx] = $match; } function match_del($idx) { unset($this->match[$idx]); } function match_get($idx, $token) { if (isset($this->match[$idx])) { if ( $token == NULL || $token == $this->match[$idx]->table_token) { return ($this->match[$idx]); } } return NULL; } } // end class Room function make_seed() { list($usec, $sec) = explode(' ', microtime()); return (float) $sec + ((float) $usec * 100000); } function btrace_line($ar) { GLOBAL $G_btrace_pref_sub; $ret = ""; for ($i = 0 ; $i < count($ar) ; $i++) { $with_class = isset($ar[$i]['class']); $with_file = isset($ar[$i]['file']); $ret .= sprintf("%s%s%s (%s:%d)", ($i == 0 ? "" : ", "), ($with_class ? $ar[$i]['class'].$ar[$i]['type'] : ""), $ar[$i]['function'], ($with_file ? str_replace($G_btrace_pref_sub, "", $ar[$i]['file']) : ""), ($with_file ? $ar[$i]['line'] : "")); } return ($ret); } function trace_ftok($id, $add) { // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok(" $tok=@ftok($id, $add); log_shme($tok.": ".$id." + ".$add); return ($tok); } function log_mop($step, $log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LMOP) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("LMOP: [%f] [%05d] [%s] [%s]\n", gettimeofday(TRUE), $step, $log, $btrace)); fclose($fp); } } function log_only2($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONL2) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("ONL2: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_crit($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_CRIT) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("CRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_only($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_ONLY) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("ONLY: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_main($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_MAIN) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("MAIN: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_rd($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_READ) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("READ: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_rd2($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_REA2) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("REA2: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_send($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SEND) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("SEND: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_lock($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOCK) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("LOCK: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_wr($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_WRIT) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("WRIT: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_load($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_LOAD) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("LOAD: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } function log_auth($sess, $log) { GLOBAL $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_AUTH) == 0) return; if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0) return; if ((BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("LOAD: [%s] [%d] [%s] [%s]\n", $sess, time(), $log, $btrace)); fclose($fp); } } function log_shme($log) { GLOBAL $sess, $PHP_SELF; if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0) return; if (isset($sess) == FALSE) $ssess = "XXXX"; else $ssess = $sess; if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0) return; if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); fclose($fp); } } // function log_legal($curtime, $sess, $name, $where, $mesg) function log_legal($curtime, $addr, $user, $where, $mesg) { if (($fp = @fopen(LEGAL_PATH."/legal.log", 'a')) != FALSE) { /* Unix time | session | nickname | IP | where was | mesg */ fwrite($fp, sprintf("%ld|%s|%s|%s|%s|%s|%s|\n", $curtime, $user->sess, ($user->flags & USER_FLAG_AUTH ? 'A' : 'N'), $user->name, $addr, $where , $mesg)); fclose($fp); } } function table_act_content($isstanding, $sitted, $table, $cur_table, $allowed) { $ret = ""; if ($isstanding) { if ($sitted < PLAYERS_N) { if ($allowed) $act = 'sit'; else $act = 'reserved'; } } else { if ($table == $cur_table) $act = 'wake'; else $act = 'none'; } if ($act != '') $ret = sprintf('j_tab_act_cont(%d, \'%s\');', $table, $act); return ($ret); } function show_notify($text, $tout, $butt, $w, $h) { log_main("SHOW_NOTIFY: ".$text); return sprintf('var noti = new notify(gst,"%s",%d,"%s",%d,%d);', $text, $tout, $butt, $w, $h); } function show_notify_ex($text, $tout, $butt, $w, $h, $is_opaque, $block_time) { log_main("SHOW_NOTIFY OPAQUE: ".$text); 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); } function root_wellcome($user) { GLOBAL $root_wellarr, $G_lang; $ret = ""; $curtime = time(); $dt = date("H:i ", $curtime); for ($i = 0 ; $i < count($root_wellarr[$G_lang]) ; $i++) $ret .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, str_replace('"', '\"', $root_wellarr[$G_lang][$i])); return ($ret); } function validate_sess($sess) { if (strlen($sess) == SESS_LEN) return (TRUE); else return (FALSE); } function validate_name($name) { $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8")); for ($i = 0 ; $i < strlen($name_new) ; $i++) { $c = $name_new[$i]; if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9")) return ($name_new); } return (FALSE); } function playsound($filename) { return (sprintf('playsound("flasou", "%s");', $filename)); } function secstoword($secs) { GLOBAL $G_lang; $ret = ""; $mins = floor($secs / 60); $secs = $secs % 60; if ($G_lang == 'en') { if ($mins > 0) $ret = sprintf("%d minute%s%s", $mins, ($mins > 1 ? "s" : ""), ($secs > 0 ? " and " : "")); if ($secs > 0) $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "s" : "")); } else { if ($mins > 0) $ret = sprintf("%d minut%s%s", $mins, ($mins > 1 ? "i" : "o"), ($secs > 0 ? " e " : "")); if ($secs > 0) $ret .= sprintf("%d second%s", $secs, ($secs > 1 ? "i" : "o")); } return ($ret); } function sharedmem_sz($tok) { if (($shm_id = @shmop_open($tok, 'a', 0, 0)) == FALSE) { log_main("shmop_open failed"); return (-1); } $shm_sz = shmop_size($shm_id); shmop_close($shm_id); // log_main("shm_sz: ".$shm_sz." SHM_DIMS: ".SHM_DIMS); return ($shm_sz); } class Warrant { static $delta_t; static function lock_data($is_exclusive) { if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) { self::$delta_t = microtime(TRUE); log_lock("LOCK warrant [".self::$delta_t."]"); return ($res); } return (FALSE); } static function unlock_data($res) { GLOBAL $sess; log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]"); file_unlock($res); } } class Poll { static $delta_t; static function lock_data($is_exclusive) { if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) { self::$delta_t = microtime(TRUE); log_lock("LOCK poll [".self::$delta_t."]"); return ($res); } return (FALSE); } static function unlock_data($res) { GLOBAL $sess; log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]"); file_unlock($res); } } ?>