1
0
Fork 0
mirror of https://codeberg.org/demostf/api.git synced 2026-06-03 18:04:08 +02:00

handle reconnected players better

This commit is contained in:
Robin Appelman 2022-06-07 15:16:48 +02:00
commit 76ee1f6cc3
5 changed files with 51 additions and 25 deletions

View file

@ -6,14 +6,16 @@ namespace Demostf\API\Data;
class ParsedPlayer {
private string $name;
private int $demoUserId;
/** @var int[] */
private array $demoUserIds;
private string $steamId;
private string $team;
private string $class;
public function __construct(string $name, int $demoUserId, string $steamId, string $team, string $class) {
public function __construct(string $name, string $steamId, string $team, string $class) {
$this->name = $name;
$this->demoUserId = $demoUserId;
$this->demoUserIds = [];
$this->steamId = $steamId;
$this->team = $team;
$this->class = $class;
@ -23,8 +25,16 @@ class ParsedPlayer {
return $this->name;
}
public function getDemoUserId(): int {
return $this->demoUserId;
public function addDemoUserId(int $userId): ParsedPlayer {
$this->demoUserIds[] = $userId;
return $this;
}
/**
* @return int[]
*/
public function getDemoUserIds(): array {
return $this->demoUserIds;
}
public function getSteamId(): string {

View file

@ -64,9 +64,11 @@ class DemoSaver {
$deaths = [];
foreach ($demo->getPlayers() as $player) {
$kills[$player->getDemoUserId()] = 0;
$assists[$player->getDemoUserId()] = 0;
$deaths[$player->getDemoUserId()] = 0;
foreach ($player->getDemoUserIds() as $demoUserId) {
$kills[$demoUserId] = 0;
$assists[$demoUserId] = 0;
$deaths[$demoUserId] = 0;
}
}
foreach ($demo->getKills() as $kill) {
@ -84,17 +86,26 @@ class DemoSaver {
foreach ($demo->getPlayers() as $player) {
$userId = $this->userProvider->getUserId($player->getSteamId(), $player->getName());
$playerKills = 0;
$playerAssists = 0;
$playerDeaths = 0;
foreach ($player->getDemoUserIds() as $demoUserId) {
$playerKills += $kills[$demoUserId];
$playerAssists += $assists[$demoUserId];
$playerDeaths += $deaths[$demoUserId];
}
$this->playerProvider->store(new Player(
0,
$demoId,
$player->getDemoUserId(),
$player->getDemoUserIds()[0],
$userId,
$player->getName(),
$player->getTeam(),
$player->getClass(),
$kills[$player->getDemoUserId()],
$assists[$player->getDemoUserId()],
$deaths[$player->getDemoUserId()]
$playerKills,
$playerAssists,
$playerDeaths
));
}

View file

@ -124,16 +124,21 @@ class Parser {
}
}
if ($player['steamId'] && 'BOT' !== $player['steamId']) {// skip spectators
$players[] = new ParsedPlayer(
$player['name'],
$player['userId'],
self::convertSteamIdToCommunityId($player['steamId']),
$player['team'] ?? '',
$this->getClassName((int) $class)
);
$steamId = self::convertSteamIdToCommunityId($player['steamId']);
if (!isset($players[$steamId])) {
$players[$steamId] = new ParsedPlayer(
$player['name'],
$steamId,
$player['team'] ?? '',
$this->getClassName((int) $class)
);
}
$players[$steamId]->addDemoUserId($player['userId']);
}
}
$players = array_values($players);
return new ParsedDemo(
$red,
$blue,
@ -156,10 +161,10 @@ class Parser {
* @param string $steamId The SteamID string as used on servers, like
* <var>STEAM_0:0:12345</var>
*
* @return string The converted 64bit numeric SteamID
* @throws InvalidArgumentException if the SteamID doesn't have the correct
* format
*
* @return string The converted 64bit numeric SteamID
*/
public static function convertSteamIdToCommunityId(string $steamId): string {
if ('STEAM_ID_LAN' === $steamId || 'BOT' === $steamId) {

View file

@ -62,8 +62,8 @@ class DemoSaverTest extends TestCase {
new ChatMessage('user2', 13, 'msg2'),
],
[
new ParsedPlayer('user1', 1, '1234567', 'red', 'scout'),
new ParsedPlayer('user2', 2, '2345678', 'blue', 'soldier'),
(new ParsedPlayer('user1', '1234567', 'red', 'scout'))->addDemoUserId(1),
(new ParsedPlayer('user2', '2345678', 'blue', 'soldier'))->addDemoUserId(2),
],
[
new ParsedKill(1, 0, 2),
@ -80,11 +80,11 @@ class DemoSaverTest extends TestCase {
$this->createMock(Connection::class)
);
$storedDemo = new StoredDemo('http://example.com/foo', 'foo', 'example');
$storedDemo = new StoredDemo('https://example.com/foo', 'foo', 'example');
$demoId = $saver->saveDemo($parsed, $header, $storedDemo, $upload);
$retrievedDemo = $demoProvider->get($demoId, true);
$retrievedDemo = $demoProvider->get($demoId);
$this->assertEquals(2, $retrievedDemo->getPlayerCount());
$this->assertEquals(2, $retrievedDemo->getRedScore());

View file

@ -49,7 +49,7 @@ class ParserTest extends TestCase {
$expectedPlayers = $expectedRaw['players'];
$this->assertCount(\count($expectedPlayers), $result->getPlayers());
$this->assertEquals($expectedPlayers[0]['name'], $result->getPlayers()[0]->getName());
$this->assertEquals($expectedPlayers[0]['demo_user_id'], $result->getPlayers()[0]->getDemoUserId());
$this->assertEquals([$expectedPlayers[0]['demo_user_id']], $result->getPlayers()[0]->getDemoUserIds());
$this->assertEquals($expectedPlayers[0]['team'], $result->getPlayers()[0]->getTeam());
$this->assertEquals($expectedPlayers[0]['class'], $result->getPlayers()[0]->getClass());
$this->assertEquals(Parser::convertSteamIdToCommunityId($expectedPlayers[0]['steam_id']), $result->getPlayers()[0]->getSteamId());