## Problem
Login and submit were stub-only for USACO, Kattis, and CodeChef, leaving
three platforms without a working solve loop.
## Solution
Three commits, one per platform:
**USACO** — httpx-based login via `login-session.php` with cookie cache.
Submit fetches the problem page and parses the form dynamically (action
URL, hidden fields, language select) before POSTing multipart with
`sub_file[]`.
**Kattis** — httpx-based login via `/login/email` (official Kattis CLI
API). Submit is a multipart POST to `/submit`; the `contest` field is
included only when `contest_id != problem_id`. `scrape_contest_list`
URL updated to filter
`kattis_original=on&kattis_recycled=off&user_created=off`.
**CodeChef** — StealthySession browser-based login and submit following
the AtCoder/CF pattern. Login checks `__NEXT_DATA__` for current user
and fills the email/password form. Submit navigates to
`/{contest_id}/submit/{problem_id}`, selects language (standard
`<select>` first, custom dropdown fallback), sets code via
Monaco/CodeMirror/textarea JS, and clicks submit. Retry-on-relogin
pattern matches existing CF behaviour.
Language IDs added to `language_ids.py` for all three platforms.
30 lines
590 B
Python
30 lines
590 B
Python
LANGUAGE_IDS = {
|
|
"atcoder": {
|
|
"cpp": "6017",
|
|
"python": "6082",
|
|
},
|
|
"codeforces": {
|
|
"cpp": "89",
|
|
"python": "70",
|
|
},
|
|
"cses": {
|
|
"cpp": "C++17",
|
|
"python": "Python3",
|
|
},
|
|
"usaco": {
|
|
"cpp": "cpp",
|
|
"python": "python",
|
|
},
|
|
"kattis": {
|
|
"cpp": "C++17",
|
|
"python": "Python 3",
|
|
},
|
|
"codechef": {
|
|
"cpp": "C++ 17",
|
|
"python": "Python 3",
|
|
},
|
|
}
|
|
|
|
|
|
def get_language_id(platform: str, language: str) -> str | None:
|
|
return LANGUAGE_IDS.get(platform, {}).get(language)
|