fix(scrapers): bad credentials detection and error message cleanup

Problem: Wrong credentials during login produced two bugs: scrapers
wrapped the `bad_credentials` error code in `"Login failed: ..."`,
causing double-prefixed messages in the UI; and `credentials.lua`
did not clear cached credentials before re-prompting or on failure,
leaving stale bad creds in the cache.

Solution: Standardize all scrapers to emit `"bad_credentials"` as
the raw error code. Add `LOGIN_ERRORS` map in `constants.lua` to
translate it to a human-readable string in both `credentials.lua`
and `submit.lua`. Fix `credentials.lua` to clear credentials on
failure in both the fresh-prompt and cached-creds-fail paths.
For AtCoder and Codeforces, replace `wait_for_url` with
`wait_for_function` to detect the login error element immediately
rather than waiting the full 10s navigation timeout. Also add
"Remember me" checkbox check on Codeforces login.
This commit is contained in:
Barrett Ruth 2026-03-07 17:35:20 -05:00
parent 573b335646
commit 0ad7a9614f
Signed by: barrett
GPG key ID: A6C96C9349D2FC81
9 changed files with 55 additions and 25 deletions

View file

@ -11,6 +11,7 @@ local STATUS_MESSAGES = {
installing_browser = 'Installing browser...',
}
---@param platform string
---@param display string
local function prompt_and_login(platform, display)
@ -45,7 +46,11 @@ local function prompt_and_login(platform, display)
)
else
local err = result.error or 'unknown error'
logger.log(display .. ' login failed: ' .. err, { level = vim.log.levels.ERROR })
cache.clear_credentials(platform)
logger.log(
display .. ' login failed: ' .. (constants.LOGIN_ERRORS[err] or err),
{ level = vim.log.levels.ERROR }
)
end
end)
end)
@ -83,6 +88,7 @@ function M.login(platform)
{ level = vim.log.levels.INFO, override = true }
)
else
cache.clear_credentials(platform)
prompt_and_login(platform, display)
end
end)