polygon-website-foss/api/private/components/Games.php

137 lines
4.1 KiB
PHP

<?php
class Games
{
static function GetServerInfo($id, $UserID = 0, $CheckIfWhitelisted = false)
{
if ($CheckIfWhitelisted)
{
return db::run(
"SELECT selfhosted_servers.*,
users.username, users.jointime,
(SELECT COUNT(DISTINCT uid) FROM client_sessions WHERE ping+35 > UNIX_TIMESTAMP() AND serverID = :id AND valid AND verified) AS players,
(ping+35 > UNIX_TIMESTAMP()) AS online
FROM selfhosted_servers
INNER JOIN users ON users.id = hoster
WHERE selfhosted_servers.id = :id AND (Privacy = \"Public\" OR hoster = :UserID OR JSON_CONTAINS(PrivacyWhitelist, :UserID, \"$\"))",
[":id" => $id, ":UserID" => $UserID]
)->fetch(PDO::FETCH_OBJ);
}
else
{
return db::run(
"SELECT selfhosted_servers.*,
users.username, users.jointime,
(SELECT COUNT(DISTINCT uid) FROM client_sessions WHERE ping+35 > UNIX_TIMESTAMP() AND serverID = :id AND valid AND verified) AS players,
(ping+35 > UNIX_TIMESTAMP()) AS online
FROM selfhosted_servers
INNER JOIN users ON users.id = hoster WHERE selfhosted_servers.id = :id",
[":id" => $id]
)->fetch(PDO::FETCH_OBJ);
}
}
static function GetPlayersInServer($serverID)
{
return db::run("
SELECT users.* FROM selfhosted_servers
INNER JOIN client_sessions ON client_sessions.ping+35 > UNIX_TIMESTAMP() AND serverID = selfhosted_servers.id AND valid
INNER JOIN users ON users.id = uid
WHERE selfhosted_servers.id = :id GROUP BY client_sessions.uid", [":id" => $serverID]);
}
static function GetPlayerCountInServer($ServerID)
{
$PlayerCount = db::run(
"SELECT COUNT(DISTINCT uid) FROM client_sessions WHERE ping+35 > UNIX_TIMESTAMP() AND serverID = :ServerID AND valid AND verified)",
[":ServerID" => $ServerID]
)->fetchColumn();
return (int) $PlayerCount;
}
static function GetPlayersInGame($JobID)
{
$Players = db::run(
"SELECT GameJobSessions.UserID, users.username AS Username FROM GameJobSessions
INNER JOIN users ON users.id = UserID
WHERE JobID = :JobID AND Active",
[":JobID" => $JobID]
)->fetchAll(PDO::FETCH_ASSOC);
foreach ($Players as &$Player)
{
$Player["Thumbnail"] = Thumbnails::GetAvatar($Player["UserID"]);
}
return $Players;
}
static function CheckIfPlayerInGame($UserID, $JobID)
{
return db::run(
"SELECT COUNT(*) FROM GameJobSessions WHERE Active AND Verified AND UserID = :UserID AND JobID = :JobID",
[":UserID" => $UserID, ":JobID" => $JobID]
)->fetchColumn();
}
static function GetJobSession($Ticket)
{
// used for clientpresence and placevisit
// we just want to make sure that the ticket exists and the game job is open
return db::run(
"SELECT GameJobSessions.*, GameJobs.PlaceID FROM GameJobSessions
INNER JOIN GameJobs ON GameJobs.JobID = GameJobSessions.JobID
WHERE SecurityTicket = :Ticket AND Status = \"Ready\"",
[":Ticket" => $Ticket]
)->fetch(PDO::FETCH_OBJ);
}
static function GetJobInfo($JobID)
{
return db::run(
"SELECT * FROM GameJobs WHERE JobID = :JobID",
[":JobID" => $JobID]
)->fetch(PDO::FETCH_OBJ);
}
static function RefreshJobCount($ServerID)
{
$JobCount = db::run(
"SELECT COUNT(*) FROM GameJobs WHERE ServerID = :ServerID AND Status IN (\"Loading\", \"Ready\")",
[":ServerID" => $ServerID]
)->fetchColumn();
db::run(
"UPDATE GameServers SET ActiveJobs = :JobCount WHERE ServerID = :ServerID",
[":JobCount" => $JobCount, ":ServerID" => $ServerID]
);
}
static function RefreshActivePlayers($PlaceID)
{
$ActivePlayers = db::run(
"SELECT COUNT(*) FROM GameJobSessions WHERE Active AND JobID IN
(
SELECT JobID FROM GameJobs WHERE PlaceID = :PlaceID AND Status = \"Ready\"
)",
[":PlaceID" => $PlaceID]
)->fetchColumn();
db::run(
"UPDATE assets SET ActivePlayers = :ActivePlayers WHERE id = :PlaceID",
[":ActivePlayers" => $ActivePlayers, ":PlaceID" => $PlaceID]
);
}
static function RefreshRunningGameMarker($PlaceID)
{
db::run(
"UPDATE assets SET ServerRunning =
(
SELECT COUNT(*) FROM GameJobs WHERE PlaceID = :PlaceID AND Status = \"Ready\"
) > 0 WHERE id = :PlaceID",
[":PlaceID" => $PlaceID]
);
}
}