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:
parent
96d67cb993
commit
76ee1f6cc3
5 changed files with 51 additions and 25 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue