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 { class ParsedPlayer {
private string $name; private string $name;
private int $demoUserId; /** @var int[] */
private array $demoUserIds;
private string $steamId; private string $steamId;
private string $team; private string $team;
private string $class; 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->name = $name;
$this->demoUserId = $demoUserId; $this->demoUserIds = [];
$this->steamId = $steamId; $this->steamId = $steamId;
$this->team = $team; $this->team = $team;
$this->class = $class; $this->class = $class;
@ -23,8 +25,16 @@ class ParsedPlayer {
return $this->name; return $this->name;
} }
public function getDemoUserId(): int { public function addDemoUserId(int $userId): ParsedPlayer {
return $this->demoUserId; $this->demoUserIds[] = $userId;
return $this;
}
/**
* @return int[]
*/
public function getDemoUserIds(): array {
return $this->demoUserIds;
} }
public function getSteamId(): string { public function getSteamId(): string {

View file

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

View file

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

View file

@ -62,8 +62,8 @@ class DemoSaverTest extends TestCase {
new ChatMessage('user2', 13, 'msg2'), new ChatMessage('user2', 13, 'msg2'),
], ],
[ [
new ParsedPlayer('user1', 1, '1234567', 'red', 'scout'), (new ParsedPlayer('user1', '1234567', 'red', 'scout'))->addDemoUserId(1),
new ParsedPlayer('user2', 2, '2345678', 'blue', 'soldier'), (new ParsedPlayer('user2', '2345678', 'blue', 'soldier'))->addDemoUserId(2),
], ],
[ [
new ParsedKill(1, 0, 2), new ParsedKill(1, 0, 2),
@ -80,11 +80,11 @@ class DemoSaverTest extends TestCase {
$this->createMock(Connection::class) $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); $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->getPlayerCount());
$this->assertEquals(2, $retrievedDemo->getRedScore()); $this->assertEquals(2, $retrievedDemo->getRedScore());

View file

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