feat(games): manually add games (e.g. SPT) with launch + own logs
Some titles never show up in a Steam/Lutris/Heroic scan — standalone mod
launchers like SPT (Single-Player Tarkov), itch.io downloads, hand-installed
executables. Add a user-authored custom-games list (core/customgames.py) shown
alongside the other sources in `rigdoctor games` and the GUI.
Each entry can carry a launch command and a log directory:
- `rigdoctor games add "SPT" --command .../tarkov.sh` (logs/ auto-detected)
- `rigdoctor games play "SPT"` launches it under the crash-capture wrapper
(wrap.run gains an explicit game-name override, since there's no SteamAppId)
- the diagnostic now feeds the game's own logs to the analysis: gamelogs
.collect(game=...) tails the registered log dir (SPT's server/launcher logs)
alongside the kernel log, freshness-scoped by mtime.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -47,6 +47,36 @@ class CollectTests(unittest.TestCase):
|
||||
self.assertEqual(gamelogs.collect(), "")
|
||||
|
||||
|
||||
class CustomGameLogTests(unittest.TestCase):
|
||||
def test_collect_includes_custom_game_logs(self):
|
||||
tmp = Path(tempfile.mkdtemp())
|
||||
(tmp / "tarkov-latest.log").write_text(">>> Tarkov gone. clean exit")
|
||||
(tmp / "server-latest.log").write_text("SPT server error: mod failed to load")
|
||||
with mock.patch.object(gamelogs, "_proton_logs", return_value=[]), \
|
||||
mock.patch.object(gamelogs, "_steam_console", return_value=None), \
|
||||
mock.patch("rigdoctor.core.customgames.log_dir", return_value=str(tmp)):
|
||||
out = gamelogs.collect(game="SPT")
|
||||
self.assertIn("SPT log", out)
|
||||
self.assertIn("server-latest.log", out)
|
||||
self.assertIn("mod failed to load", out)
|
||||
|
||||
def test_custom_logs_skipped_when_stale(self):
|
||||
tmp = Path(tempfile.mkdtemp())
|
||||
old = tmp / "tarkov-latest.log"
|
||||
old.write_text("an earlier session")
|
||||
old_mtime = time.time() - 3600
|
||||
os.utime(old, (old_mtime, old_mtime))
|
||||
with mock.patch.object(gamelogs, "_proton_logs", return_value=[]), \
|
||||
mock.patch.object(gamelogs, "_steam_console", return_value=None), \
|
||||
mock.patch("rigdoctor.core.customgames.log_dir", return_value=str(tmp)):
|
||||
self.assertEqual(gamelogs.collect(since=time.time() - 60, game="SPT"), "")
|
||||
|
||||
def test_no_game_means_no_custom_logs(self):
|
||||
with mock.patch.object(gamelogs, "_proton_logs", return_value=[]), \
|
||||
mock.patch.object(gamelogs, "_steam_console", return_value=None):
|
||||
self.assertEqual(gamelogs.collect(), "") # game=None → custom lookup skipped
|
||||
|
||||
|
||||
class SinceScopingTests(unittest.TestCase):
|
||||
def test_since_filter_keeps_window_only(self):
|
||||
text = (
|
||||
|
||||
Reference in New Issue
Block a user