Parse The Crucible game logs into a structured model.
- PHP >= 8.4
Install via Composer:
composer require adnanmula/keyforge-game-log-parser<?php
use AdnanMula\KeyforgeGameLogParser\Event\EventType;
use AdnanMula\KeyforgeGameLogParser\Parser\GameLogParser;
use AdnanMula\KeyforgeGameLogParser\Parser\ParseType;
$log = file_get_contents('path/to/log.txt');
$parser = new GameLogParser();
$game = $parser->execute($log, ParseType::PLAIN);
$winner = $game->winner()?->name;
$keysForged = $game->timeline()->filter(EventType::KEY_FORGED)->count();
$reapsByPlayer1 = $game->player1->timeline->filter(EventType::REAP)->count();
$firstCreatureUsedToReapByPlayer1 = $game->player1->timeline->filter(EventType::REAP)->at(0)->value;You can parse logs provided in 3 different formats via ParseType:
ParseType::PLAIN(default): a single string containing the full log, what you get when use tco's copy to clipboard button.ParseType::ARRAY: an array of strings containing the log messages, one per line.ParseType::HTML: the HTML markup of the log view.
<?php
use AdnanMula\KeyforgeGameLogParser\Parser\GameLogParser;
use AdnanMula\KeyforgeGameLogParser\Parser\ParseType;
$parser = new GameLogParser();
$plainString = '
Alice brings Deck A to The Crucible
Bob brings Deck B to The Crucible
...
';
// PLAIN
$game1 = $parser->execute($plainString, ParseType::PLAIN);
// ARRAY
$messages = [
'Alice brings Deck A to The Crucible',
'Bob brings Deck B to The Crucible',
// ...
];
$game2 = $parser->execute($messages, ParseType::ARRAY);
// HTML
$html = '<div class="message">Alice brings Deck A to The Crucible</div>...';
$game3 = $parser->execute($html, ParseType::HTML);execute() returns a Game object with the following useful members:
player1,player2(AdnanMula\KeyforgeGameLogParser\Game\Player)name,deck,isFirst,isWinner,hasConcededtimeline(AdnanMula\KeyforgeGameLogParser\Game\Timeline)
winner(): ?Playerloser(): ?Playerfirst(): ?Player(the player who took the first turn)timeline(): Timeline(combined, time-ordered events from both players)
Timelines are collections with helper methods:
filter(EventType ...$events): Collectioncount(),first(),last(),at(int $i),items(): array
Example queries:
<?php
use AdnanMula\KeyforgeGameLogParser\Event\EventType;
// Checks declared across the whole game
$checks = $game->timeline()->filter(EventType::CHECK_DECLARED)->items();
// Player-specific timeline queries
$p1Checks = $game->player1->timeline->filter(EventType::CHECK_DECLARED)->items();
$p2Keys = $game->player2->timeline->filter(EventType::KEY_FORGED)->items();
$reapsAndFights = $game->player2->timeline->filter(EventType::REAP, EventType::FIGHT)->items();
etc...The library categorizes log messages into typed events via EventType enum:
- AMBER_OBTAINED
- AMBER_STOLEN
- CARDS_DISCARDED
- CARDS_DRAWN
- CARDS_PLAYED
- CARD_USED
- HOUSE_CHOSEN
- KEY_FORGED
- FIGHT
- REAP
- EXTRA_TURN
- TOKEN_CREATED
- PROPHECY_ACTIVATED
- PROPHECY_FULFILLED
- FATE_RESOLVED
- TIDE_RAISED
- CHAINS_ADDED
- CHAINS_REDUCED
- PLAYER_CONCEDED
- CHECK_DECLARED