155 lines
4.7 KiB
PHP
155 lines
4.7 KiB
PHP
<?php
|
|
|
|
//the design choice here was to tie in clientpresence with recently played and visits and make it fully server-sided besides the client pings
|
|
|
|
use Fobe\Economy\EconomyHelper;
|
|
use Fobe\Games\Game;
|
|
use Fobe\Web\WebContextManager;
|
|
|
|
if (!WebContextManager::VerifyAccessKeyHeader())
|
|
{
|
|
die(http_response_code(401));
|
|
}
|
|
|
|
$action = (string)$_GET['action'];
|
|
$userid = (int)$_GET['UserID'];
|
|
$placeid = (int)$_GET['PlaceID'];
|
|
$jobid = (string)$_GET['JobID'];
|
|
$isteleport = (bool)$_GET['IsTeleport'];
|
|
|
|
function BadRequest()
|
|
{
|
|
die(http_response_code(401));
|
|
}
|
|
|
|
if (!$action || !$userid || !$placeid)
|
|
{
|
|
BadRequest();
|
|
}
|
|
|
|
if (!userExists($userid))
|
|
{
|
|
BadRequest();
|
|
}
|
|
|
|
$p = $pdo->prepare("SELECT * FROM game_launch_tokens WHERE uid = :u AND jobid = :jid");
|
|
$p->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$p->bindParam(":jid", $jobid, PDO::PARAM_INT);
|
|
$p->execute();
|
|
if ($p->rowCount() == 0) //no hits, so not valid user
|
|
{
|
|
BadRequest();
|
|
}
|
|
|
|
|
|
if ($action == "disconnect")
|
|
{
|
|
$u = $pdo->prepare("DELETE FROM game_presence WHERE uid = :i");
|
|
$u->bindParam(":i", $userid, PDO::PARAM_INT);
|
|
$u->execute();
|
|
}
|
|
else if ($action == "connect")
|
|
{
|
|
//check if user already has a presence, delete if exists
|
|
$p = $pdo->prepare("SELECT * FROM game_presence WHERE uid = :u");
|
|
$p->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$p->execute();
|
|
|
|
if ($p->rowCount() > 0)
|
|
{
|
|
$u = $pdo->prepare("DELETE FROM game_presence WHERE uid = :i");
|
|
$u->bindParam(":i", $userid, PDO::PARAM_INT);
|
|
$u->execute();
|
|
}
|
|
// ...
|
|
|
|
//create player presence (pass in the current servers job id for following functionality)
|
|
$g = $pdo->prepare("INSERT INTO game_presence(uid,placeid,jobid,whenJoined,lastPing) VALUES(:u,:p,:j,UNIX_TIMESTAMP(),UNIX_TIMESTAMP())");
|
|
$g->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$g->bindParam(":p", $placeid, PDO::PARAM_INT);
|
|
$g->bindParam(":j", $jobid, PDO::PARAM_STR);
|
|
$g->execute();
|
|
// ...
|
|
|
|
//remove them from queue (once presence is created above, placelauncher will detect playercount correctly. should be very rare for two people to get in a single slot)
|
|
Game::RemovePlayerFromQueue($userid);
|
|
|
|
//update or create player recently played (TODO: restrict to 4 database entries to save space)
|
|
$checkforrecent = $pdo->prepare("SELECT * FROM game_recents WHERE uid = :i AND gid = :g");
|
|
$checkforrecent->bindParam(":i", $userid, PDO::PARAM_INT);
|
|
$checkforrecent->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$checkforrecent->execute();
|
|
|
|
if ($checkforrecent->rowCount() > 0)
|
|
{
|
|
//update recently played
|
|
$setgamerecent = $pdo->prepare("UPDATE game_recents SET whenPlayed = UNIX_TIMESTAMP() WHERE uid = :u AND gid = :g");
|
|
$setgamerecent->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$setgamerecent->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$setgamerecent->execute();
|
|
//...
|
|
}
|
|
else
|
|
{
|
|
//create recently played
|
|
$setgamerecent = $pdo->prepare("INSERT INTO game_recents(uid,gid,whenPlayed) VALUES(:u,:g,UNIX_TIMESTAMP())");
|
|
$setgamerecent->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$setgamerecent->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$setgamerecent->execute();
|
|
//...
|
|
}
|
|
// ...
|
|
|
|
//place visit
|
|
$new_visit = false;
|
|
|
|
$visit = $pdo->prepare("SELECT * FROM game_unique_visit WHERE uid = :i AND gid = :g");
|
|
$visit->bindParam(":i", $userid, PDO::PARAM_INT);
|
|
$visit->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$visit->execute();
|
|
|
|
if ($visit->rowCount() > 0) //we got a hit
|
|
{
|
|
$info = $visit->fetch(PDO::FETCH_OBJ);
|
|
if(($info->visited + (86400 * 1)) > time()) //one day
|
|
{
|
|
return;
|
|
}
|
|
else //no visit to the game today
|
|
{
|
|
$setuniquevisit = $pdo->prepare("UPDATE game_unique_visit SET visited = :t WHERE uid = :u AND gid = :g");
|
|
$setuniquevisit->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$setuniquevisit->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$setuniquevisit->bindParam(":t", time(), PDO::PARAM_INT);
|
|
$setuniquevisit->execute();
|
|
|
|
$new_visit = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$setuniquevisit = $pdo->prepare("INSERT INTO game_unique_visit(uid,gid,visited) VALUES(:u,:g,:t)");
|
|
$setuniquevisit->bindParam(":u", $userid, PDO::PARAM_INT);
|
|
$setuniquevisit->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$setuniquevisit->bindParam(":t", time(), PDO::PARAM_INT);
|
|
$setuniquevisit->execute();
|
|
|
|
$new_visit = true;
|
|
}
|
|
|
|
$creatorid = getAssetInfo($placeid)->CreatorId;
|
|
if ($new_visit && $creatorid != $userid)
|
|
{
|
|
$setgamevisit = $pdo->prepare("UPDATE assets SET Visited = (Visited + 1) WHERE id = :g");
|
|
$setgamevisit->bindParam(":g", $placeid, PDO::PARAM_INT);
|
|
$setgamevisit->execute();
|
|
|
|
// XlXi: Removed to prevent farming.
|
|
//EconomyHelper::GiveAlphabux(1, $creatorid, "Place visit reward, placeid ".$placeid);
|
|
}
|
|
// ...
|
|
}
|
|
else
|
|
{
|
|
BadRequest(); //something RCC will show if the request is failing for some reason
|
|
} |