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) {
263 // WARNING monitor this step
264 if (($res = @sem_get($tok)) == FALSE) {
265 echo "SEM_GET FAILED";
268 if (sem_acquire($res)) {
269 log_lock("LOCK table ".$table_idx."[res: ".$res."]");
273 log_lock("LOCK table ".$table_idx.":FAILED");
278 function unlock_data($res)
282 log_lock("UNLOCK table [res: ".$res."]");
284 return (sem_release($res));
288 function chatt_send(&$user, $mesg)
290 if ($user->stat == 'table') {
291 $table = &$this->table[$user->table];
294 $user_mesg = substr($mesg,6);
298 $dt = date("H:i ", $curtime);
299 if (strncmp($user_mesg, "/nick ", 6) == 0) {
300 log_main($user->sess." chatt_send BEGIN");
302 if (($name_new = validate_name(substr($user_mesg, 6))) == FALSE) {
303 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
304 $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s","Il nickname deve contenere almeno una lettera dell\'alfabeto o una cifra.");', $dt.NICKSERV);
309 $user_mesg = "COMMAND ".$user_mesg;
312 // update local graph
313 // update remote graphs
314 for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++) {
315 $user_cur = &$this->user[$i];
316 // if ($user_cur->sess == '' || $user_cur->stat != 'room')
317 if ($user_cur->sess == '')
319 if ($user_cur->name == $name_new) {
320 $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
321 $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s","Nickname <b>%s</b> già in uso.");', $dt.NICKSERV, xcape($name_new));
326 if ($i == BRISKIN5_MAX_PLAYERS) {
327 $user->name = $name_new;
329 log_main($user->sess." chatt_send start set");
332 for ($i = 0 ; $i < BRISKIN5_MAX_PLAYERS ; $i++) {
333 log_main($user->sess." chatt_send set loop");
335 $user_cur = &$this->user[$i];
336 if ($user_cur->sess == '')
338 if ($user_cur->stat == 'room') {
339 if ($user->stat == 'room' && $user->subst == 'standup') {
340 $this->standup_update(&$user);
342 else if ($user->stat == 'room' && $user->subst == 'sitdown' ||
343 $user->stat == 'table') {
344 log_main($user->sess." chatt_send pre table update");
346 $this->table_update(&$user);
348 log_main($user->sess." chatt_send post table update");
351 else if ($user_cur->stat == 'table' && $user_cur->table == $user->table) {
352 $table = &$this->table[$user->table];
354 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
355 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('set_names(" %s", " %s", " %s", " %s", " %s"); ',
356 xcape($this->user[$table->player[($user_cur->table_pos) % BRISKIN5_PLAYERS_N]]->name),
357 xcape($this->user[$table->player[($user_cur->table_pos+1) % BRISKIN5_PLAYERS_N]]->name),
358 xcape($this->user[$table->player[($user_cur->table_pos+2) % BRISKIN5_PLAYERS_N]]->name),
359 (BRISKIN5_PLAYERS_N == 3 ? "" : xcape($this->user[$table->player[($user_cur->table_pos+3) % BRISKIN5_PLAYERS_N]]->name)),
360 (BRISKIN5_PLAYERS_N == 3 ? "" : xcape($this->user[$table->player[($user_cur->table_pos+4) % BRISKIN5_PLAYERS_N]]->name)));
361 if ($user_cur == $user)
362 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('$("myname").innerHTML = "<b>%s</b>";',
363 xcape($user->name,ENT_COMPAT,"UTF-8"));
364 $user_cur->step_inc();
370 for ($i = 0 ; $i < ($user->stat == 'room' ? BRISKIN5_MAX_PLAYERS : BRISKIN5_PLAYERS_N) ; $i++) {
371 if ($user->stat == 'room') {
372 $user_cur = &$this->user[$i];
373 if ($user_cur->sess == '' || $user_cur->stat != 'room')
377 $user_cur = &$this->user[$table->player[$i]];
380 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
381 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('chatt_sub("%s","%s");',
382 $dt.xcape($user->name), xcape($user_mesg));
383 $user_cur->step_inc();
385 log_legal($curtime, $user->sess, $user->name,
386 ($user->stat == 'room' ? 'room' : 'table '.$user->table),$user_mesg);
390 function table_wakeup(&$user)
392 $table = &$this->table[0];
394 log_main("BRISKIN5_WAKEUP begin function table stat: ".$user->stat." subst: ".$user->subst);
398 log_main("BRISKIN5_WAKEUP from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
400 for ($i = 0 ; $i < $table->player_n ; $i++) {
401 $user_cur = &$this->user[$i];
402 log_main("PREIMPOST INLOOP name: ".$user_cur->name);
404 if ($user_cur == $user)
405 $user_cur->subst = "shutdowner";
407 $user_cur->subst = "shutdowned";
408 $user_cur->laccwr = $curtime;
410 $ret = "gst.st = ".($user_cur->step+1)."; ";
411 $ret .= 'gst.st_loc++; the_end=true; window.onbeforeunload = null; window.onunload = null; document.location.assign("../index.php");|';
413 log_wr($user_cur->sess." BRISKIN5_WAKEUP: ".$ret);
414 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
415 $user_cur->step_inc();
418 $this->the_end = TRUE;
422 * If all players are freezed the room garbage_manager clean up table and users.
424 function is_abandoned()
429 $table = &$this->table[0];
431 for ($i = 0 ; $i < $table->player_n ; $i++) {
432 $user_cur = &$this->user[$i];
434 if ($user_cur->lacc + (EXPIRE_TIME_RD * 2) >= $curtime) {
442 } // end class Briskin5
444 function locshm_exists($tok)
448 if (($id = @shmop_open($tok,"a", 0, 0)) == FALSE) {
449 log_main($tok." SHM NOT exists");
455 log_main($tok." SHM exists");