mirror of
https://codeberg.org/demostf/api.git
synced 2026-06-04 02:14:06 +02:00
store kills directly with players
This commit is contained in:
parent
217dee4cd4
commit
6d01061c58
11 changed files with 83 additions and 84 deletions
|
|
@ -14,7 +14,6 @@ use Demostf\API\Providers\ChatProvider;
|
|||
use Demostf\API\Providers\DemoListProvider;
|
||||
use Demostf\API\Providers\DemoProvider;
|
||||
use Demostf\API\Providers\InfoProvider;
|
||||
use Demostf\API\Providers\KillProvider;
|
||||
use Demostf\API\Providers\PlayerProvider;
|
||||
use Demostf\API\Providers\UploadProvider;
|
||||
use Demostf\API\Providers\UserProvider;
|
||||
|
|
@ -82,10 +81,6 @@ class Container {
|
|||
return new InfoProvider($this->connection);
|
||||
}
|
||||
|
||||
public function getKillProvider(): KillProvider {
|
||||
return new KillProvider($this->connection);
|
||||
}
|
||||
|
||||
public function getPlayerProvider(): PlayerProvider {
|
||||
return new PlayerProvider($this->connection);
|
||||
}
|
||||
|
|
@ -104,7 +99,6 @@ class Container {
|
|||
$this->getUserProvider(),
|
||||
$this->getDemoProvider(),
|
||||
new DemoSaver(
|
||||
$this->getKillProvider(),
|
||||
$this->getPlayerProvider(),
|
||||
$this->getChatProvider(),
|
||||
$this->getUserProvider(),
|
||||
|
|
|
|||
|
|
@ -12,8 +12,22 @@ class Player {
|
|||
private string $name;
|
||||
private string $team;
|
||||
private string $class;
|
||||
private int $kills;
|
||||
private int $assists;
|
||||
private int $deaths;
|
||||
|
||||
public function __construct(int $id, int $demoId, int $demoUserId, int $userId, string $name, string $team, string $class) {
|
||||
public function __construct(
|
||||
int $id,
|
||||
int $demoId,
|
||||
int $demoUserId,
|
||||
int $userId,
|
||||
string $name,
|
||||
string $team,
|
||||
string $class,
|
||||
int $kills,
|
||||
int $assists,
|
||||
int $deaths
|
||||
) {
|
||||
$this->id = $id;
|
||||
$this->demoId = $demoId;
|
||||
$this->demoUserId = $demoUserId;
|
||||
|
|
@ -21,6 +35,9 @@ class Player {
|
|||
$this->name = $name;
|
||||
$this->team = $team;
|
||||
$this->class = $class;
|
||||
$this->kills = $kills;
|
||||
$this->assists = $assists;
|
||||
$this->deaths = $deaths;
|
||||
}
|
||||
|
||||
public function getId(): int {
|
||||
|
|
@ -50,4 +67,16 @@ class Player {
|
|||
public function getClass(): string {
|
||||
return $this->class;
|
||||
}
|
||||
|
||||
public function getKills(): int {
|
||||
return $this->kills;
|
||||
}
|
||||
|
||||
public function getAssists(): int {
|
||||
return $this->assists;
|
||||
}
|
||||
|
||||
public function getDeaths(): int {
|
||||
return $this->deaths;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,20 +5,17 @@ declare(strict_types=1);
|
|||
namespace Demostf\API\Demo;
|
||||
|
||||
use DateTime;
|
||||
use Demostf\API\Data\Kill;
|
||||
use Demostf\API\Data\ParsedDemo;
|
||||
use Demostf\API\Data\Player;
|
||||
use Demostf\API\Data\StoredDemo;
|
||||
use Demostf\API\Data\Upload;
|
||||
use Demostf\API\Providers\ChatProvider;
|
||||
use Demostf\API\Providers\DemoProvider;
|
||||
use Demostf\API\Providers\KillProvider;
|
||||
use Demostf\API\Providers\PlayerProvider;
|
||||
use Demostf\API\Providers\UserProvider;
|
||||
use Doctrine\DBAL\Connection;
|
||||
|
||||
class DemoSaver {
|
||||
private KillProvider $killProvider;
|
||||
private PlayerProvider $playerProvider;
|
||||
private ChatProvider $chatProvider;
|
||||
private UserProvider $userProvider;
|
||||
|
|
@ -26,14 +23,12 @@ class DemoSaver {
|
|||
private Connection $connection;
|
||||
|
||||
public function __construct(
|
||||
KillProvider $killProvider,
|
||||
PlayerProvider $playerProvider,
|
||||
ChatProvider $chatProvider,
|
||||
UserProvider $userProvider,
|
||||
DemoProvider $demoProvider,
|
||||
Connection $connection
|
||||
) {
|
||||
$this->killProvider = $killProvider;
|
||||
$this->playerProvider = $playerProvider;
|
||||
$this->chatProvider = $chatProvider;
|
||||
$this->userProvider = $userProvider;
|
||||
|
|
@ -42,9 +37,6 @@ class DemoSaver {
|
|||
}
|
||||
|
||||
public function saveDemo(ParsedDemo $demo, Header $header, StoredDemo $storedDemo, Upload $upload): int {
|
||||
/** @var int[] $userMap [$demoUserId => $dbUserId] */
|
||||
$userMap = [0 => 0];
|
||||
|
||||
$this->connection->beginTransaction();
|
||||
|
||||
$demoId = $this->demoProvider->storeDemo(new Demo(
|
||||
|
|
@ -67,9 +59,30 @@ class DemoSaver {
|
|||
$storedDemo->getPath()
|
||||
), $storedDemo->getBackend(), $storedDemo->getPath());
|
||||
|
||||
$kills = [];
|
||||
$assists = [];
|
||||
$deaths = [];
|
||||
|
||||
foreach ($demo->getPlayers() as $player) {
|
||||
$kills[$player->getDemoUserId()] = 0;
|
||||
$assists[$player->getDemoUserId()] = 0;
|
||||
$deaths[$player->getDemoUserId()] = 0;
|
||||
}
|
||||
|
||||
foreach ($demo->getKills() as $kill) {
|
||||
if ($kill->getAttackerDemoId()) {
|
||||
$kills[$kill->getAttackerDemoId()]++;
|
||||
}
|
||||
if ($kill->getAssisterDemoId()) {
|
||||
$assists[$kill->getAssisterDemoId()]++;
|
||||
}
|
||||
if ($kill->getVictimDemoId()) {
|
||||
$deaths[$kill->getVictimDemoId()]++;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($demo->getPlayers() as $player) {
|
||||
$userId = $this->userProvider->getUserId($player->getSteamId(), $player->getName());
|
||||
$userMap[$player->getDemoUserId()] = $userId;
|
||||
|
||||
$this->playerProvider->store(new Player(
|
||||
0,
|
||||
|
|
@ -78,17 +91,10 @@ class DemoSaver {
|
|||
$userId,
|
||||
$player->getName(),
|
||||
$player->getTeam(),
|
||||
$player->getClass()
|
||||
));
|
||||
}
|
||||
|
||||
foreach ($demo->getKills() as $kill) {
|
||||
$this->killProvider->store(new Kill(
|
||||
0,
|
||||
$demoId,
|
||||
$userMap[$kill->getAttackerDemoId()] ?? 0,
|
||||
$userMap[$kill->getAssisterDemoId()] ?? 0,
|
||||
$userMap[$kill->getVictimDemoId()] ?? 0
|
||||
$player->getClass(),
|
||||
$kills[$player->getDemoUserId()],
|
||||
$assists[$player->getDemoUserId()],
|
||||
$deaths[$player->getDemoUserId()]
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,11 +33,8 @@ class DemoProvider extends BaseProvider {
|
|||
|
||||
public function get(int $id, bool $fetchDetails = true): ?Demo {
|
||||
// sql magic
|
||||
$sql = 'WITH demokills AS (SELECT attacker_id, assister_id, victim_id FROM kills WHERE demo_id = ?)
|
||||
SELECT players.id, user_id, players.name, team, class, users.steamid, users.avatar,
|
||||
(SELECT COUNT(*) FROM demokills WHERE attacker_id=players.user_id) AS kills,
|
||||
(SELECT COUNT(*) FROM demokills WHERE assister_id=players.user_id) AS assists,
|
||||
(SELECT COUNT(*) FROM demokills WHERE victim_id=players.user_id) AS deaths
|
||||
$sql = '
|
||||
SELECT players.id, user_id, players.name, team, class, users.steamid, users.avatar, players.kills, players.assists, players.deaths
|
||||
FROM players
|
||||
INNER JOIN users ON players.user_id = users.id
|
||||
WHERE demo_id = ?';
|
||||
|
|
@ -49,7 +46,7 @@ class DemoProvider extends BaseProvider {
|
|||
|
||||
if ($fetchDetails) {
|
||||
$uploader = $this->userProvider->getById($demo->getUploader());
|
||||
$playerQuery = $this->connection->executeQuery($sql, [$demo->getId(), $demo->getId()]);
|
||||
$playerQuery = $this->connection->executeQuery($sql, [$demo->getId()]);
|
||||
$players = $playerQuery->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$demo->setUploaderUser($uploader);
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Demostf\API\Providers;
|
||||
|
||||
use Demostf\API\Data\Kill;
|
||||
|
||||
class KillProvider extends BaseProvider {
|
||||
public function store(Kill $kill): int {
|
||||
$query = $this->getQueryBuilder();
|
||||
$query->insert('kills')
|
||||
->values([
|
||||
'demo_id' => $query->createNamedParameter($kill->getDemoId()),
|
||||
'attacker_id' => $query->createNamedParameter($kill->getAttackerId()),
|
||||
'assister_id' => $query->createNamedParameter($kill->getAssisterId()),
|
||||
'victim_id' => $query->createNamedParameter($kill->getVictimId()),
|
||||
]);
|
||||
$query->execute();
|
||||
|
||||
return (int) $this->connection->lastInsertId();
|
||||
}
|
||||
}
|
||||
|
|
@ -17,6 +17,9 @@ class PlayerProvider extends BaseProvider {
|
|||
'name' => $query->createNamedParameter($player->getName()),
|
||||
'team' => $query->createNamedParameter($player->getTeam()),
|
||||
'class' => $query->createNamedParameter($player->getClass()),
|
||||
'kills' => $query->createNamedParameter($player->getKills()),
|
||||
'assists' => $query->createNamedParameter($player->getAssists()),
|
||||
'deaths' => $query->createNamedParameter($player->getDeaths()),
|
||||
]);
|
||||
$query->execute();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue