+ static function lock_data($is_exclusive, $table_idx)
+ {
+ if (($res = file_lock(FTOK_PATH."/bin5/table".$table_idx."/table", $is_exclusive)) != FALSE) {
+ self::$delta_t = microtime(TRUE);
+ log_lock("LOCK table [".$table_idx."] [".self::$delta_t[$table_idx]."]");
+
+ return (new Vect(array('res' => $res, 'tab' => $table_idx)));
+ }
+
+ return (FALSE);
+ }
+
+
+ static function unlock_data($res_vect)
+ {
+ GLOBAL $sess;
+
+ $res = $res_vect->getbyid('res');
+ $tab = $res_vect->getbyid('tab');
+
+ log_lock("UNLOCK table [".$tab."] [".(microtime(TRUE) - (self::$delta_t[$tab]))."]");
+
+ file_unlock($res);
+ }
+
+
+ function chatt_send($user, $mesg)
+ {
+ GLOBAL $mlang_brisk, $G_lang;
+
+ if ($user->stat == 'table') {
+ $table = &$this->table[$user->table];
+ }
+
+ $user_mesg = substr($mesg,6);
+
+ $curtime = time();
+
+ $dt = date("H:i ", $curtime);
+ if (strncmp($user_mesg, "/nick ", 6) == 0) {
+ log_main($user->sess." chatt_send BEGIN");
+
+ if (($name_new = validate_name(substr($user_mesg, 6))) == FALSE) {
+ $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
+ $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
+ $user->step_inc();
+
+ return;
+ }
+ $user_mesg = "COMMAND ".$user_mesg;
+ // Search dup name
+ // change
+ // update local graph
+ // update remote graphs
+ for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
+ $user_cur = $this->user[$i];
+ // if ($user_cur->sess == '' || $user_cur->stat != 'room')
+ if ($user_cur->sess == '')
+ continue;
+ if (strcasecmp($user_cur->name, $name_new) == 0) {
+ $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
+
+ $premsg = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
+ $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $premsg);
+ $user->step_inc();
+ break;
+ }
+ }
+ if ($i == BIN5_MAX_PLAYERS) {
+ if ($user->flags & USER_FLAG_AUTH && strcasecmp($user->name,$name_new) != 0) {
+ if ($this->table[$user->table]->auth_only == TRUE) {
+ $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
+ $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"<b>%s</b>");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
+ $user->step_inc();
+ return;
+ }
+ else {
+ $user->flags &= ~USER_FLAG_AUTH; // Remove auth if name changed
+ }
+ }
+
+ $user->name = $name_new;
+
+ log_main($user->sess." chatt_send start set");
+
+
+ for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
+ log_main($user->sess." chatt_send set loop");
+
+ $user_cur = &$this->user[$i];
+ if ($user_cur->sess == '')
+ continue;
+
+ if ($user_cur->stat == 'table' && $user_cur->table == $user->table) {
+ $table = &$this->table[$user->table];
+
+ $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
+ $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('set_names([%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"]); ',
+ $this->user[$table->player[($user_cur->table_pos) % BIN5_PLAYERS_N]]->flags,
+ xcape($this->user[$table->player[($user_cur->table_pos) % BIN5_PLAYERS_N]]->name),
+
+ $this->user[$table->player[($user_cur->table_pos+1) % BIN5_PLAYERS_N]]->flags,
+ xcape($this->user[$table->player[($user_cur->table_pos+1) % BIN5_PLAYERS_N]]->name),
+
+ $this->user[$table->player[($user_cur->table_pos+2) % BIN5_PLAYERS_N]]->flags,
+ xcape($this->user[$table->player[($user_cur->table_pos+2) % BIN5_PLAYERS_N]]->name),
+
+ (BIN5_PLAYERS_N == 3 ? 0: $this->user[$table->player[($user_cur->table_pos+3) % BIN5_PLAYERS_N]]->flags),
+ (BIN5_PLAYERS_N == 3 ? "" : xcape($this->user[$table->player[($user_cur->table_pos+3) % BIN5_PLAYERS_N]]->name)),
+
+ (BIN5_PLAYERS_N == 3 ? 0: $this->user[$table->player[($user_cur->table_pos+4) % BIN5_PLAYERS_N]]->flags),
+ (BIN5_PLAYERS_N == 3 ? "" : xcape($this->user[$table->player[($user_cur->table_pos+4) % BIN5_PLAYERS_N]]->name)));
+ if ($user_cur == $user) {
+ $user_cur->comm[$user_cur->step % COMM_N] .= $user_cur->myname_innerHTML();
+ }
+ $user_cur->step_inc();
+ }
+ }
+ }
+ }
+ else {
+ for ($i = 0 ; $i < ($user->stat == 'room' ? BIN5_MAX_PLAYERS : BIN5_PLAYERS_N) ; $i++) {
+ if ($user->stat == 'room') {
+ $user_cur = &$this->user[$i];
+ if ($user_cur->sess == '' || $user_cur->stat != 'room')
+ continue;
+ }
+ else {
+ $user_cur = &$this->user[$table->player[$i]];
+ }
+
+ $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
+ $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('chatt_sub("%s", [%d, "%s"],"%s");',
+ $dt, $user->flags, xcape($user->name), xcape($user_mesg));
+ $user_cur->step_inc();
+ }
+ log_legal($curtime, $user->ip, $user, ($user->stat == 'room' ? 'room' : 'table '.$user->table_orig),$user_mesg);
+ }
+ }
+
+ function table_wakeup($user)
+ {
+ $table = &$this->table[0];
+
+ log_main("BIN5_WAKEUP begin function table stat: ".$user->stat." subst: ".$user->subst);
+
+ $curtime = time();
+
+ log_main("BIN5_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[$i];
+ log_main("PREIMPOST INLOOP name: ".$user_cur->name);
+
+ if ($user_cur == $user)
+ $user_cur->subst = "shutdowner";
+ else
+ $user_cur->subst = "shutdowned";
+ $user_cur->laccwr = $curtime;
+
+ $ret = "gst.st = ".($user_cur->step+1)."; ";
+ $ret .= 'gst.st_loc++; xstm.stop(); window.onbeforeunload = null; window.onunload = null; document.location.assign("../index.php");|';
+
+ log_wr($user_cur->sess." BIN5_WAKEUP: ".$ret);
+ $user_cur->comm[$user_cur->step % COMM_N] = $ret;
+ $user_cur->step_inc();
+ }
+
+ $this->the_end = TRUE;