From d56fd38ab2fbcd370079ed7280629adf244cee80 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 6 Mar 2026 23:32:28 -0500 Subject: [PATCH 1/3] fix(codechef): replace blind sleeps and fix practice fallback detection Problem: Submit used fixed `wait_for_timeout` delays throughout, and the practice fallback check only matched one dialog variant, causing "contest not available for submission" to be silently swallowed as success. Solution: Replace the initial 2s page-load sleep with `wait_for_selector('[aria-haspopup="listbox"]')`, drop unnecessary sleeps around the Ace editor click and submit button, and wait for the result dialog with `wait_for_selector` instead of a fixed 3s sleep. Extend the fallback check to also match "not available for submission". --- scrapers/codechef.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/scrapers/codechef.py b/scrapers/codechef.py index 7767b72..0427d5d 100644 --- a/scrapers/codechef.py +++ b/scrapers/codechef.py @@ -178,16 +178,15 @@ def _submit_headless_codechef( needs_relogin = True return try: - page.wait_for_timeout(2000) + page.wait_for_selector('[aria-haspopup="listbox"]', timeout=10000) page.locator('[aria-haspopup="listbox"]').click() page.wait_for_selector('[role="option"]', timeout=5000) page.locator(f'[role="option"][data-value="{language_id}"]').click() - page.wait_for_timeout(2000) + page.wait_for_timeout(250) page.locator(".ace_editor").click() page.keyboard.press("Control+a") - page.wait_for_timeout(200) page.evaluate( """(code) => { const textarea = document.querySelector('.ace_text-input'); @@ -199,20 +198,25 @@ def _submit_headless_codechef( }""", source_code, ) - page.wait_for_timeout(1000) + page.wait_for_timeout(125) page.evaluate( "() => document.getElementById('submit_btn').scrollIntoView({block:'center'})" ) - page.wait_for_timeout(200) page.locator("#submit_btn").dispatch_event("click") - page.wait_for_timeout(3000) + try: + page.wait_for_selector('[role="dialog"], .swal2-popup', timeout=5000) + except Exception: + pass dialog_text = page.evaluate("""() => { const d = document.querySelector('[role="dialog"], .swal2-popup'); return d ? d.textContent.trim() : null; }""") - if dialog_text and "not available for accepting solutions" in dialog_text: + if dialog_text and ( + "not available for accepting solutions" in dialog_text + or "not available for submission" in dialog_text + ): submit_error = "PRACTICE_FALLBACK" elif dialog_text: submit_error = dialog_text From 95100dbd8df3b4aad9d6dead16ff4cfd623e3a94 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 6 Mar 2026 23:37:25 -0500 Subject: [PATCH 2/3] fix(atcoder): remove post-upload settle delay before submit --- scrapers/atcoder.py | 2 -- scrapers/timeouts.py | 1 - 2 files changed, 3 deletions(-) diff --git a/scrapers/atcoder.py b/scrapers/atcoder.py index 8645beb..a9876cf 100644 --- a/scrapers/atcoder.py +++ b/scrapers/atcoder.py @@ -30,7 +30,6 @@ from .timeouts import ( BROWSER_ELEMENT_WAIT, BROWSER_NAV_TIMEOUT, BROWSER_SESSION_TIMEOUT, - BROWSER_SETTLE_DELAY, BROWSER_SUBMIT_NAV_TIMEOUT, BROWSER_TURNSTILE_POLL, HTTP_TIMEOUT, @@ -500,7 +499,6 @@ def _submit_headless( "buffer": Path(file_path).read_bytes(), }, ) - page.wait_for_timeout(BROWSER_SETTLE_DELAY) page.locator('button[type="submit"]').click(no_wait_after=True) page.wait_for_url( lambda url: "/submissions/me" in url, diff --git a/scrapers/timeouts.py b/scrapers/timeouts.py index e4ff583..4148d4a 100644 --- a/scrapers/timeouts.py +++ b/scrapers/timeouts.py @@ -11,4 +11,3 @@ BROWSER_SUBMIT_NAV_TIMEOUT["atcoder"] = BROWSER_NAV_TIMEOUT * 2 BROWSER_SUBMIT_NAV_TIMEOUT["codeforces"] = BROWSER_NAV_TIMEOUT * 2 BROWSER_TURNSTILE_POLL = 5000 BROWSER_ELEMENT_WAIT = 10000 -BROWSER_SETTLE_DELAY = 500 From 118bd2659082ef23afef3d9825e5df5305d05d52 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 6 Mar 2026 23:37:38 -0500 Subject: [PATCH 3/3] docs(readme): add USACO and Kattis to supported platforms list --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 427496d..be37094 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ https://github.com/user-attachments/assets/e81d8dfb-578f-4a79-9989-210164fc0148 ## Features -- **Multi-platform support**: AtCoder, CodeChef, Codeforces, and CSES +- **Multi-platform support**: AtCoder, CodeChef, Codeforces, USACO, CSES, + Kattis - **Automatic problem setup**: Scrape test cases and metadata in seconds - **Dual view modes**: Lightweight I/O view for quick feedback, full panel for detailed analysis