diff --git a/lua/cp/constants.lua b/lua/cp/constants.lua index 5a37c20..3a2e27d 100644 --- a/lua/cp/constants.lua +++ b/lua/cp/constants.lua @@ -221,8 +221,4 @@ M.DEFAULT_VERSIONS = { cpp = 'c++20', python = 'python3' } M.COOKIE_FILE = vim.fn.expand('~/.cache/cp-nvim/cookies.json') -M.LOGIN_ERRORS = { - bad_credentials = 'bad credentials', -} - return M diff --git a/lua/cp/credentials.lua b/lua/cp/credentials.lua index a1258c4..cf3d29e 100644 --- a/lua/cp/credentials.lua +++ b/lua/cp/credentials.lua @@ -14,13 +14,13 @@ local STATUS_MESSAGES = { ---@param platform string ---@param display string local function prompt_and_login(platform, display) - vim.ui.input({ prompt = '[cp.nvim]: ' .. display .. ' username: ' }, function(username) + vim.ui.input({ prompt = 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('[cp.nvim]: ' .. display .. ' password: ') + local password = vim.fn.inputsecret(display .. ' password: ') vim.fn.inputrestore() if not password or password == '' then logger.log('Cancelled', { level = vim.log.levels.WARN }) @@ -45,11 +45,7 @@ local function prompt_and_login(platform, display) ) else local err = result.error or 'unknown error' - cache.clear_credentials(platform) - logger.log( - display .. ' login failed: ' .. (constants.LOGIN_ERRORS[err] or err), - { level = vim.log.levels.ERROR } - ) + logger.log(display .. ' login failed: ' .. err, { level = vim.log.levels.ERROR }) end end) end) @@ -87,7 +83,6 @@ function M.login(platform) { level = vim.log.levels.INFO, override = true } ) else - cache.clear_credentials(platform) prompt_and_login(platform, display) end end) diff --git a/lua/cp/submit.lua b/lua/cp/submit.lua index 68b9b90..e2291d6 100644 --- a/lua/cp/submit.lua +++ b/lua/cp/submit.lua @@ -110,13 +110,10 @@ function M.submit(opts) logger.log('Submitted successfully', { level = vim.log.levels.INFO, override = true }) else local err = result and result.error or 'unknown error' - if err == 'bad_credentials' or err:match('^Login failed') then + if err:match('^Login failed') then cache.clear_credentials(platform) end - logger.log( - 'Submit failed: ' .. (constants.LOGIN_ERRORS[err] or err), - { level = vim.log.levels.ERROR } - ) + logger.log('Submit failed: ' .. err, { level = vim.log.levels.ERROR }) end end) end diff --git a/scrapers/atcoder.py b/scrapers/atcoder.py index 5667607..c52190b 100644 --- a/scrapers/atcoder.py +++ b/scrapers/atcoder.py @@ -400,13 +400,9 @@ def _at_login_action(credentials: dict[str, str]): page.fill('input[name="username"]', credentials.get("username", "")) page.fill('input[name="password"]', credentials.get("password", "")) page.click("#submit") - page.wait_for_function( - "() => !window.location.href.includes('/login') || !!document.querySelector('.alert-danger')", - timeout=BROWSER_NAV_TIMEOUT, + page.wait_for_url( + lambda url: "/login" not in url, timeout=BROWSER_NAV_TIMEOUT ) - if "/login" in page.url: - login_error = "bad_credentials" - return except Exception as e: login_error = str(e) @@ -464,9 +460,7 @@ def _login_headless(credentials: dict[str, str]) -> LoginResult: solve_cloudflare=True, ) login_error = get_error() - if login_error == "bad_credentials": - return LoginResult(success=False, error="bad_credentials") - elif login_error: + if login_error: return LoginResult(success=False, error=f"Login failed: {login_error}") logged_in = False @@ -479,7 +473,9 @@ def _login_headless(credentials: dict[str, str]) -> LoginResult: f"{BASE_URL}/home", page_action=verify_action, network_idle=True ) if not logged_in: - return LoginResult(success=False, error="bad_credentials") + return LoginResult( + success=False, error="Login failed (bad credentials?)" + ) try: browser_cookies = session.context.cookies() @@ -574,9 +570,7 @@ def _submit_headless( solve_cloudflare=True, ) login_error = get_login_error() - if login_error == "bad_credentials": - return SubmitResult(success=False, error="bad_credentials") - elif login_error: + if login_error: return SubmitResult( success=False, error=f"Login failed: {login_error}" ) diff --git a/scrapers/codechef.py b/scrapers/codechef.py index e314726..d7cb3ce 100644 --- a/scrapers/codechef.py +++ b/scrapers/codechef.py @@ -15,7 +15,7 @@ from .base import ( load_platform_cookies, save_platform_cookies, ) -from .timeouts import BROWSER_NAV_TIMEOUT, BROWSER_SESSION_TIMEOUT, HTTP_TIMEOUT +from .timeouts import BROWSER_SESSION_TIMEOUT, HTTP_TIMEOUT from .models import ( ContestListResult, ContestSummary, @@ -84,12 +84,10 @@ 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() - 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" + try: + page.wait_for_url(lambda url: "/login" not in url, timeout=3000) + except Exception: + login_error = "bad credentials?" return except Exception as e: login_error = str(e) @@ -107,7 +105,9 @@ def _login_headless_codechef(credentials: dict[str, str]) -> LoginResult: session.fetch(f"{BASE_URL}/", page_action=check_login, network_idle=True) if not logged_in: - return LoginResult(success=False, error="bad_credentials") + return LoginResult( + success=False, error="Login failed (bad credentials?)" + ) try: browser_cookies = session.context.cookies() @@ -163,12 +163,10 @@ 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() - 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" + try: + page.wait_for_url(lambda url: "/login" not in url, timeout=3000) + except Exception: + login_error = "bad credentials?" return except Exception as e: login_error = str(e) diff --git a/scrapers/codeforces.py b/scrapers/codeforces.py index bd69788..5bbfa38 100644 --- a/scrapers/codeforces.py +++ b/scrapers/codeforces.py @@ -353,15 +353,10 @@ def _cf_login_action(credentials: dict[str, str]): page.wait_for_selector('input[name="handleOrEmail"]', timeout=60000) page.fill('input[name="handleOrEmail"]', credentials.get("username", "")) page.fill('input[name="password"]', credentials.get("password", "")) - page.locator('#enterForm input[name="remember"]').check() page.locator('#enterForm input[type="submit"]').click() - page.wait_for_function( - "() => !window.location.href.includes('/enter') || !!document.querySelector('#enterForm span.error')", - timeout=BROWSER_NAV_TIMEOUT, + page.wait_for_url( + lambda url: "/enter" not in url, timeout=BROWSER_NAV_TIMEOUT ) - if "/enter" in page.url: - login_error = "bad_credentials" - return except Exception as e: login_error = str(e) @@ -421,9 +416,7 @@ def _login_headless_cf(credentials: dict[str, str]) -> LoginResult: solve_cloudflare=True, ) login_error = get_error() - if login_error == "bad_credentials": - return LoginResult(success=False, error="bad_credentials") - elif login_error: + if login_error: return LoginResult(success=False, error=f"Login failed: {login_error}") logged_in = False @@ -434,7 +427,9 @@ def _login_headless_cf(credentials: dict[str, str]) -> LoginResult: session.fetch(f"{BASE_URL}/", page_action=verify_action, network_idle=True) if not logged_in: - return LoginResult(success=False, error="bad_credentials") + return LoginResult( + success=False, error="Login failed (bad credentials?)" + ) try: browser_cookies = session.context.cookies() @@ -545,9 +540,7 @@ def _submit_headless( solve_cloudflare=True, ) login_error = _get_login_error() - if login_error == "bad_credentials": - return SubmitResult(success=False, error="bad_credentials") - elif login_error: + if login_error: return SubmitResult( success=False, error=f"Login failed: {login_error}" ) diff --git a/scrapers/cses.py b/scrapers/cses.py index 33fffb5..4f1fbcf 100644 --- a/scrapers/cses.py +++ b/scrapers/cses.py @@ -266,7 +266,7 @@ class CSESScraper(BaseScraper): print(json.dumps({"status": "logging_in"}), flush=True) token = await self._web_login(client, username, password) if not token: - return self._login_error("bad_credentials") + return self._login_error("Login failed (bad credentials?)") return LoginResult( success=True, @@ -434,7 +434,7 @@ class CSESScraper(BaseScraper): print(json.dumps({"status": "logging_in"}), flush=True) token = await self._web_login(client, username, password) if not token: - return self._submit_error("bad_credentials") + return self._submit_error("Login failed (bad credentials?)") print( json.dumps( { diff --git a/scrapers/kattis.py b/scrapers/kattis.py index 8b0099f..ac2c157 100644 --- a/scrapers/kattis.py +++ b/scrapers/kattis.py @@ -344,7 +344,7 @@ class KattisScraper(BaseScraper): print(json.dumps({"status": "logging_in"}), flush=True) ok = await _do_kattis_login(client, username, password) if not ok: - return self._submit_error("bad_credentials") + return self._submit_error("Login failed (bad credentials?)") await _save_kattis_cookies(client) print(json.dumps({"status": "submitting"}), flush=True) @@ -381,7 +381,7 @@ class KattisScraper(BaseScraper): print(json.dumps({"status": "logging_in"}), flush=True) ok = await _do_kattis_login(client, username, password) if not ok: - return self._submit_error("bad_credentials") + return self._submit_error("Login failed (bad credentials?)") await _save_kattis_cookies(client) try: r = await _do_submit() @@ -421,7 +421,7 @@ class KattisScraper(BaseScraper): print(json.dumps({"status": "logging_in"}), flush=True) ok = await _do_kattis_login(client, username, password) if not ok: - return self._login_error("bad_credentials") + return self._login_error("Login failed (bad credentials?)") await _save_kattis_cookies(client) return LoginResult( success=True, diff --git a/scrapers/usaco.py b/scrapers/usaco.py index e463881..b6e95d2 100644 --- a/scrapers/usaco.py +++ b/scrapers/usaco.py @@ -439,7 +439,7 @@ class USACOScraper(BaseScraper): except Exception as e: return self._submit_error(f"Login failed: {e}") if not ok: - return self._submit_error("bad_credentials") + return self._submit_error("Login failed (bad credentials?)") await _save_usaco_cookies(client) else: print(json.dumps({"status": "logging_in"}), flush=True) @@ -448,7 +448,7 @@ class USACOScraper(BaseScraper): except Exception as e: return self._submit_error(f"Login failed: {e}") if not ok: - return self._submit_error("bad_credentials") + return self._submit_error("Login failed (bad credentials?)") await _save_usaco_cookies(client) result = await self._do_submit(client, problem_id, language_id, source) @@ -463,7 +463,7 @@ class USACOScraper(BaseScraper): except Exception as e: return self._submit_error(f"Login failed: {e}") if not ok: - return self._submit_error("bad_credentials") + return self._submit_error("Login failed (bad credentials?)") await _save_usaco_cookies(client) return await self._do_submit(client, problem_id, language_id, source) @@ -543,7 +543,7 @@ class USACOScraper(BaseScraper): return self._login_error(f"Login request failed: {e}") if not ok: - return self._login_error("bad_credentials") + return self._login_error("Login failed (bad credentials?)") await _save_usaco_cookies(client) return LoginResult(