2 define(BRISKIN5_PLAYERS_N, 3);
3 define(BRISKIN5_MAX_PLAYERS, BRISKIN5_PLAYERS_N);
4 // define(BRISKIN5_SHM_MIN, (50000 * BRISKIN5_MAX_PLAYERS));
5 define(BRISKIN5_SHM_MIN, 32768);
6 define(BRISKIN5_SHM_MAX, (BRISKIN5_SHM_MIN + 1048576));
7 define(BRISKIN5_SHM_DLT, 32768);
15 var $comm; // commands for many people
16 var $step; // current step of the comm array
24 function Briskin5 (&$room, $table_idx, $table_token) {
25 $this->user = array();
26 $this->table = array();
28 $this->the_end = FALSE;
29 $this->shm_sz = BRISKIN5_SHM_MIN;
30 if (($this->tok = @ftok(FTOK_PATH."/table".$table_idx, "B")) == -1) {
36 $table =& $room->table[$table_idx];
38 log_wr("Briskin5 constructor");
40 for ($i = 0 ; $i < $table->player_n ; $i++) {
41 $user[$table->player[$i]]->table_token = $table_token;
42 $this->user[$i] =& User::spawn(&$user[$table->player[$i]], 0, $i);
44 $this->table[0] =& Table::spawn(&$table);
45 $this->table_idx = $table_idx;
46 $this->table_token = $table_token;
47 $this->garbage_timeout = 0;
49 log_wr("Briskin5 constructor end");
53 function &get_user($sess, &$idx)
55 GLOBAL $PHP_SELF, $G_false;
57 if (validate_sess($sess)) {
58 for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++) {
59 if (strcmp($sess, $this->user[$i]->sess) == 0) {
62 $ret = &$this->user[$i];
66 log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
67 // for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++)
68 // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
71 log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
78 function garbage_manager($force)
81 /* Garbage collector degli utenti in timeout */
84 if ($force || $this->garbage_timeout < $curtime) {
86 for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++) {
87 $user_cur = &$this->user[$i];
88 if ($user_cur->sess == "" ||
89 ($user_cur->stat == 'table' && ($user_cur->subst == 'shutdowned' || $user_cur->subst == 'shutdowner')))
92 if ($user_cur->lacc + EXPIRE_TIME_RD < $curtime) { // Auto logout dell'utente
93 log_rd2($user_cur->sess." bin5 AUTO LOGOUT.");
95 if ($user_cur->stat == 'table') {
96 log_auth($user_cur->sess," bin5 Autologout session.");
98 /* SI DELEGA AL garbage_manager principale LA RIMOZIONE DELL'UTENTE
100 $tmp_sess = $user_cur->sess;
101 $user_cur->sess = "";
102 step_unproxy($tmp_sess);
103 $user_cur->name = "";
104 $user_cur->the_end = FALSE;
108 $this->table_wakeup(&$user_cur);
112 log_rd2($user_cur->sess." GARBAGE UPDATED!");
114 $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
127 function &load_data($table_idx, $table_token = "")
129 GLOBAL $G_false, $sess;
133 log_wr("TABLE_IDX ".FTOK_PATH."/table".$table_idx);
136 if (($tok = @ftok(FTOK_PATH."/table".$table_idx, "B")) == -1) {
137 log_main("ftok failed");
142 if (($shm_sz = sharedmem_sz($tok)) == -1) {
143 log_main("shmop_open failed");
147 if (($shm = shm_attach($tok, $shm_sz)) == FALSE)
150 if (($bri = @shm_get_var($shm, $tok)) == FALSE)
153 if ($table_token != "" && $bri->table_token != $table_token) {
154 log_wr("bri->table_token: ".$bri->table_token."table_token: ".$table_token);
169 log_wr("briskin5 load_data failed");
178 function save_data(&$bri)
185 log_main("SAVE BRISKIN5 DATA");
187 if (!isset($bri->tok))
190 while ($bri->shm_sz < BRISKIN5_SHM_MAX) {
191 if (($shm = shm_attach($bri->tok, $bri->shm_sz)) == FALSE)
194 if (@shm_put_var($shm, $bri->tok, $bri) != FALSE) {
198 if (shm_remove($shm) === FALSE) {
199 log_only("REMOVE FALLITA");
203 $bri->shm_sz += BRISKIN5_SHM_DLT;
206 log_crit("save data failed!");
216 function destroy_data($table_idx)
222 log_main("DESTROY BRISKIN5 DATA");
225 log_main("DESTROY2 BRISKIN5 DATA");
227 if (($tok = @ftok(FTOK_PATH."/table".$table_idx, "B")) == -1)
230 if (($shm = @shmop_open($tok, 'a', 0, 0)) == FALSE)
233 if (shmop_delete($shm) == 0) {
234 log_only("REMOVE FALLITA ");
239 log_main("DESTROY2 BRISKIN5 DATA SUCCESS");
241 // log_main("QUI CI ARRIVA [".$bri->user[0]->name."]");
251 function lock_data($table_idx)
255 log_wr("LOCK_DATA ".FTOK_PATH."/table".$table_idx);
256 // echo "LOCK: ".FTOK_PATH."/main";
258 // WARNING monitor this step
259 if (($tok = @ftok(FTOK_PATH."/table".$table_idx, "B")) == -1) {
262 // WARNING monitor this step
263 if (($res = @sem_get($tok)) == FALSE) {
266 if (sem_acquire($res)) {
267 log_lock("LOCK table ".$table_idx."[res: ".$res."]");
271 log_lock("LOCK table ".$table_idx.":FAILED");
276 function unlock_data($res)
280 log_lock("UNLOCK table [res: ".$res."]");
282 return (sem_release($res));
286 function chatt_send(&$user, $mesg)
288 if ($user->stat == 'table') {
289 $table = &$this->table[$user->table];
292 $user_mesg = substr($mesg,6);
296 $dt = date("H:i ", $curtime);
297 if (strncmp($user_mesg, "/nick ", 6) == 0) {
298 log_main($user->sess." chatt_send BEGIN");
300 if (($name_new = validate_name(substr($user_mesg, 6))) == FALSE) {
301 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
302 $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.");', $dt, NICKSERV);
307 $user_mesg = "COMMAND ".$user_mesg;
310 // update local graph
311 // update remote graphs
312 for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++) {
313 $user_cur = &$this->user[$i];
314 // if ($user_cur->sess == '' || $user_cur->stat != 'room')
315 if ($user_cur->sess == '')
317 if ($user_cur->name == $name_new) {
318 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
319 $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"Nickname <b>%s</b> già in uso.%d");', $dt, NICKSERV, xcape($name_new), $this->table[$user->table]->auth_only == TRUE);
324 if ($i == BRISKIN5_MAX_PLAYERS) {
325 if ($user->flags & USER_FLAG_AUTH && strcasecmp($user->name,$name_new) != 0) {
326 if ($this->table[$user->table]->auth_only == TRUE) {
327 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
328 $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"<b>Non puoi cambiare nick a un tavolo per soli autenticati.</b>");', $dt, NICKSERV);
333 $user->flags &= ~USER_FLAG_AUTH; // Remove auth if name changed
337 $user->name = $name_new;
339 log_main($user->sess." chatt_send start set");
342 for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++) {
343 log_main($user->sess." chatt_send set loop");
345 $user_cur = &$this->user[$i];
346 if ($user_cur->sess == '')
348 if ($user_cur->stat == 'room') {
349 if ($user->stat == 'room' && $user->subst == 'standup') {
350 $this->standup_update(&$user);
352 else if ($user->stat == 'room' && $user->subst == 'sitdown' ||
353 $user->stat == 'table') {
354 log_main($user->sess." chatt_send pre table update");
356 $this->table_update(&$user);
358 log_main($user->sess." chatt_send post table update");
361 else if ($user_cur->stat == 'table' && $user_cur->table == $user->table) {
362 $table = &$this->table[$user->table];
364 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
365 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('set_names([%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"]); ',
366 $this->user[$table->player[($user_cur->table_pos) % BRISKIN5_PLAYERS_N]]->flags,
367 xcape($this->user[$table->player[($user_cur->table_pos) % BRISKIN5_PLAYERS_N]]->name),
369 $this->user[$table->player[($user_cur->table_pos+1) % BRISKIN5_PLAYERS_N]]->flags,
370 xcape($this->user[$table->player[($user_cur->table_pos+1) % BRISKIN5_PLAYERS_N]]->name),
372 $this->user[$table->player[($user_cur->table_pos+2) % BRISKIN5_PLAYERS_N]]->flags,
373 xcape($this->user[$table->player[($user_cur->table_pos+2) % BRISKIN5_PLAYERS_N]]->name),
375 (BRISKIN5_PLAYERS_N == 3 ? 0: $this->user[$table->player[($user_cur->table_pos+3) % BRISKIN5_PLAYERS_N]]->flags),
376 (BRISKIN5_PLAYERS_N == 3 ? "" : xcape($this->user[$table->player[($user_cur->table_pos+3) % BRISKIN5_PLAYERS_N]]->name)),
378 (BRISKIN5_PLAYERS_N == 3 ? 0: $this->user[$table->player[($user_cur->table_pos+4) % BRISKIN5_PLAYERS_N]]->flags),
379 (BRISKIN5_PLAYERS_N == 3 ? "" : xcape($this->user[$table->player[($user_cur->table_pos+4) % BRISKIN5_PLAYERS_N]]->name)));
380 if ($user_cur == $user) {
381 $itin = ($user->flags & USER_FLAG_AUTH ? "<i>" : "");
382 $itou = ($user->flags & USER_FLAG_AUTH ? "</i>" : "");
383 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('$("myname").innerHTML = "<b>%s%s%s</b>";',
384 $itin, xcape($user->name,ENT_COMPAT,"UTF-8"), $itou);
386 $user_cur->step_inc();
392 for ($i = 0 ; $i < ($user->stat == 'room' ? BRISKIN5_MAX_PLAYERS : BRISKIN5_PLAYERS_N) ; $i++) {
393 if ($user->stat == 'room') {
394 $user_cur = &$this->user[$i];
395 if ($user_cur->sess == '' || $user_cur->stat != 'room')
399 $user_cur = &$this->user[$table->player[$i]];
402 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
403 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('chatt_sub("%s", [%d, "%s"],"%s");',
404 $dt, $user->flags, xcape($user->name), xcape($user_mesg));
405 $user_cur->step_inc();
407 log_legal($curtime, $user, ($user->stat == 'room' ? 'room' : 'table '.$user->table),$user_mesg);
411 function table_wakeup(&$user)
413 $table = &$this->table[0];
415 log_main("BRISKIN5_WAKEUP begin function table stat: ".$user->stat." subst: ".$user->subst);
419 log_main("BRISKIN5_WAKEUP from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
421 for ($i = 0 ; $i < $table->player_n ; $i++) {
422 $user_cur = &$this->user[$i];
423 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
425 if ($user_cur == $user)
426 $user_cur->subst = "shutdowner";
428 $user_cur->subst = "shutdowned";
429 $user_cur->laccwr = $curtime;
431 $ret = "gst.st = ".($user_cur->step+1)."; ";
432 $ret .= 'gst.st_loc++; the_end=true; window.onbeforeunload = null; window.onunload = null; document.location.assign("../index.php");|';
434 log_wr($user_cur->sess." BRISKIN5_WAKEUP: ".$ret);
435 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
436 $user_cur->step_inc();
439 $this->the_end = TRUE;
443 * If all players are freezed the room garbage_manager clean up table and users.
445 function is_abandoned()
450 $table = &$this->table[0];
452 for ($i = 0 ; $i < $table->player_n ; $i++) {
453 $user_cur = &$this->user[$i];
455 if ($user_cur->lacc + (EXPIRE_TIME_RD * 2) >= $curtime) {
463 } // end class Briskin5
465 function locshm_exists($tok)
469 if (($id = @shmop_open($tok,"a", 0, 0)) == FALSE) {
470 log_main($tok." SHM NOT exists");
476 log_main($tok." SHM exists");