From f63b72788c08b3a8f1952e5374a26b21f5f6615f Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 7 Mar 2026 17:55:13 -0500 Subject: [PATCH] fix(codechef): fast bad-credentials detection and prompt prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace `wait_for_url` with `wait_for_function` in both login and submit `login_action` callbacks, racing URL change against `div.error` appearing — same pattern as AtCoder and Codeforces. Also prefix credential prompts with `[cp.nvim]:` for consistency. --- lua/cp/credentials.lua | 4 ++-- scrapers/codechef.py | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lua/cp/credentials.lua b/lua/cp/credentials.lua index ce88ca8..6a28079 100644 --- a/lua/cp/credentials.lua +++ b/lua/cp/credentials.lua @@ -15,13 +15,13 @@ local STATUS_MESSAGES = { ---@param platform string ---@param display string local function prompt_and_login(platform, display) - vim.ui.input({ prompt = display .. ' username: ' }, function(username) + vim.ui.input({ prompt = '[cp.nvim]: ' .. display .. ' username: ' }, function(username) if not username or username == '' then logger.log('Cancelled', { level = vim.log.levels.WARN }) return end vim.fn.inputsave() - local password = vim.fn.inputsecret(display .. ' password: ') + local password = vim.fn.inputsecret('[cp.nvim]: ' .. display .. ' password: ') vim.fn.inputrestore() if not password or password == '' then logger.log('Cancelled', { level = vim.log.levels.WARN }) diff --git a/scrapers/codechef.py b/scrapers/codechef.py index bec4be9..07cf556 100644 --- a/scrapers/codechef.py +++ b/scrapers/codechef.py @@ -84,9 +84,11 @@ def _login_headless_codechef(credentials: dict[str, str]) -> LoginResult: page.locator('input[name="name"]').fill(credentials.get("username", "")) page.locator('input[name="pass"]').fill(credentials.get("password", "")) page.locator("input.cc-login-btn").click() - try: - page.wait_for_url(lambda url: "/login" not in url, timeout=3000) - except Exception: + page.wait_for_function( + "() => !window.location.href.includes('/login') || !!document.querySelector('div.error')", + timeout=BROWSER_NAV_TIMEOUT, + ) + if "/login" in page.url: login_error = "bad_credentials" return except Exception as e: @@ -163,9 +165,11 @@ def _submit_headless_codechef( page.locator('input[name="name"]').fill(credentials.get("username", "")) page.locator('input[name="pass"]').fill(credentials.get("password", "")) page.locator("input.cc-login-btn").click() - try: - page.wait_for_url(lambda url: "/login" not in url, timeout=3000) - except Exception: + page.wait_for_function( + "() => !window.location.href.includes('/login') || !!document.querySelector('div.error')", + timeout=BROWSER_NAV_TIMEOUT, + ) + if "/login" in page.url: login_error = "bad_credentials" return except Exception as e: