Skip to content

Commit 78c64d0

Browse files
committed
Fix(viewer): Adapt to arbitrary player names
1 parent 462294f commit 78c64d0

1 file changed

Lines changed: 17 additions & 22 deletions

File tree

codeclash/viewer/app.py

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ def process_round_results(round_results: dict[str, Any] | None) -> dict[str, Any
237237
class TrajectoryInfo:
238238
"""Information about a single trajectory"""
239239

240-
player_id: int
240+
player_id: str # Changed from int to str to support player names
241241
round_num: int
242242
api_calls: int
243243
cost: float
@@ -322,16 +322,16 @@ def parse_game_metadata(self) -> GameMetadata:
322322
agent_info=agent_info,
323323
)
324324

325-
def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | None:
325+
def parse_trajectory(self, player_name: str, round_num: int) -> TrajectoryInfo | None:
326326
"""Parse a specific trajectory file"""
327-
# Look in players/$player_id/ directory
328-
player_dir = self.log_dir / "players" / f"p{player_id}"
327+
# Look in players/$player_name/ directory
328+
player_dir = self.log_dir / "players" / player_name
329329
if not player_dir.exists():
330330
return None
331331

332332
# Try both .json and .log extensions
333333
for ext in [".json", ".log"]:
334-
traj_file = player_dir / f"p{player_id}_r{round_num}.traj{ext}"
334+
traj_file = player_dir / f"{player_name}_r{round_num}.traj{ext}"
335335
if traj_file.exists():
336336
try:
337337
data = json.loads(traj_file.read_text())
@@ -340,7 +340,6 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
340340
model_stats = info.get("model_stats", {})
341341

342342
# Get diff data from player metadata if available
343-
player_name = f"p{player_id}"
344343
diff = None
345344
incremental_diff = None
346345
modified_files = None
@@ -362,7 +361,7 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
362361
)
363362

364363
return TrajectoryInfo(
365-
player_id=player_id,
364+
player_id=player_name, # Now stores player name instead of numeric ID
366365
round_num=round_num,
367366
api_calls=model_stats.get("api_calls", 0),
368367
cost=model_stats.get("instance_cost", 0.0),
@@ -383,7 +382,7 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
383382
return None
384383

385384
def get_available_trajectories(self) -> list[tuple]:
386-
"""Get list of available trajectory files as (player_id, round_num) tuples"""
385+
"""Get list of available trajectory files as (player_name, round_num) tuples"""
387386
trajectories = []
388387
players_dir = self.log_dir / "players"
389388

@@ -395,22 +394,18 @@ def get_available_trajectories(self) -> list[tuple]:
395394
if not player_dir.is_dir():
396395
continue
397396

398-
try:
399-
# Extract player_id from directory name (e.g., "p1" -> 1)
400-
player_id = int(player_dir.name[1:]) # Remove 'p' prefix
401-
except (ValueError, IndexError):
402-
continue
397+
player_name = player_dir.name
403398

404399
# Find trajectory files in this player's directory
405-
for traj_file in player_dir.glob("p*_r*.traj.*"):
406-
# Extract round from filename like p1_r2.traj.json
400+
for traj_file in player_dir.glob("*_r*.traj.*"):
401+
# Extract round from filename like gpt5_r2.traj.json
407402
parts = traj_file.stem.split(".") # Remove extension
408403
if parts:
409-
name_part = parts[0] # p1_r2
404+
name_part = parts[0] # gpt5_r2
410405
try:
411406
_, round_part = name_part.split("_")
412407
round_num = int(round_part[1:]) # Remove 'r' prefix
413-
trajectories.append((player_id, round_num))
408+
trajectories.append((player_name, round_num))
414409
except (ValueError, IndexError):
415410
continue
416411

@@ -465,10 +460,10 @@ def index():
465460

466461
# Group trajectories by round
467462
trajectories_by_round = {}
468-
for player_id, round_num in available_trajectories:
463+
for player_name, round_num in available_trajectories:
469464
if round_num not in trajectories_by_round:
470465
trajectories_by_round[round_num] = []
471-
trajectory = parser.parse_trajectory(player_id, round_num)
466+
trajectory = parser.parse_trajectory(player_name, round_num)
472467
if trajectory:
473468
trajectories_by_round[round_num].append(trajectory)
474469

@@ -493,16 +488,16 @@ def game_picker():
493488
return render_template("picker.html", game_folders=game_folders, base_dir=str(logs_dir))
494489

495490

496-
@app.route("/trajectory/<int:player_id>/<int:round_num>")
497-
def trajectory_detail(player_id: int, round_num: int):
491+
@app.route("/trajectory/<player_name>/<int:round_num>")
492+
def trajectory_detail(player_name: str, round_num: int):
498493
"""Get detailed trajectory data"""
499494
selected_folder = request.args.get("folder")
500495
if not selected_folder:
501496
return jsonify({"error": "No folder specified"})
502497

503498
logs_dir = LOG_BASE_DIR
504499
parser = LogParser(logs_dir / selected_folder)
505-
trajectory = parser.parse_trajectory(player_id, round_num)
500+
trajectory = parser.parse_trajectory(player_name, round_num)
506501

507502
if not trajectory:
508503
return jsonify({"error": "Trajectory not found"})

0 commit comments

Comments
 (0)