From 4d213ba8f969b942636185ced62fc82fd9d6987a Mon Sep 17 00:00:00 2001 From: sachin Date: Mon, 8 Jun 2026 12:43:45 +0530 Subject: [PATCH 01/11] added direct submission for codechef --- manifest-chrome.partial.json | 1 + manifest-firefox.partial.json | 1 + readme.md | 5 ++- src/codeChefInjectedScript.ts | 65 +++++++++++++++++++++++++++++ src/handleSubmit.ts | 77 +++++++++++++++++++++++++++++++++++ webpack.config.js | 1 + 6 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 src/codeChefInjectedScript.ts diff --git a/manifest-chrome.partial.json b/manifest-chrome.partial.json index 85ef12c..8fa4408 100644 --- a/manifest-chrome.partial.json +++ b/manifest-chrome.partial.json @@ -5,6 +5,7 @@ "http://localhost/*", "https://cses.fi/*", "https://codeforces.com/*", + "*://*.codechef.com/*", "https://maang.in/*" ], "background": { diff --git a/manifest-firefox.partial.json b/manifest-firefox.partial.json index ca092cf..9bb0344 100644 --- a/manifest-firefox.partial.json +++ b/manifest-firefox.partial.json @@ -8,6 +8,7 @@ "*://localhost/*", "https://cses.fi/*", "*://codeforces.com/*", + "*://*.codechef.com/*", "*://maang.in/*", "webNavigation" ], diff --git a/readme.md b/readme.md index d38ce65..4a3035f 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,8 @@ # ![ICON](icon-48.png) cph-submit -Browser add-on that enables direct submission on Codeforces,CSES and Maang.in -with[Competitive Programming Helper](https://github.com/agrawal-d/cph). +Browser add-on that enables direct submission on Codeforces,CodeChef,CSES and +Maang.in with +[Competitive Programming Helper](https://github.com/agrawal-d/cph). Available for Firefox and Google Chrome. diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts new file mode 100644 index 0000000..617f302 --- /dev/null +++ b/src/codeChefInjectedScript.ts @@ -0,0 +1,65 @@ +import { ContentScriptData } from './types'; +import log from './log'; + +log(`cph-submit Codechef script injected`); + +const idToCodechefLanguage: Record = { + 42: 'C++', + 50: 'C++', + 54: 'C++', + 61: 'C++', + 89: 'C++', + 91: 'C++', + 52: 'C++', + 43: 'C', + 36: 'Java', + 60: 'Java', + 87: 'Java', + 31: 'Python3', + 7: 'Python3', + 40: 'PyPy 3', + 41: 'PyPy 3', + 70: 'PyPy 3', + 9: 'C#', + 65: 'C#', + 79: 'C#', + 34: 'JavaScript', + 55: 'JavaScript', + 32: 'Go', + 6: 'PHP', + 83: 'Kotlin', + 88: 'Kotlin', + 75: 'Rust', + 98: 'Rust', +}; + +const languageMap: Record = { + 'C++': 'C++', + Python3: 'PYTH 3', + C: 'C', + Java: 'JAVA', + 'PyPy 3': 'PYPY3', + 'C#': 'C#', + JavaScript: 'NODEJS', + Go: 'GO', + PHP: 'PHP', + Kotlin: 'KTLN', + Rust: 'rust', +}; + +chrome.runtime.onMessage.addListener((message) => { + if (message.type !== 'cph-submit-codechef') return; + + const languageName = idToCodechefLanguage[message.languageId]; + if (!languageName) return; + + const languageSelect = document.querySelector( + '#language-select', + ) as HTMLElement | null; + if (languageSelect) languageSelect.textContent = languageName; + + const languageInput = document.querySelector( + 'input.MuiSelect-nativeInput', + ) as HTMLInputElement | null; + if (languageInput) languageInput.value = languageMap[languageName]; +}); diff --git a/src/handleSubmit.ts b/src/handleSubmit.ts index 81685a0..a4a1025 100644 --- a/src/handleSubmit.ts +++ b/src/handleSubmit.ts @@ -2,6 +2,7 @@ import config from './config'; import log from './log'; declare const browser: any; +declare const ace: any; //This is required for platfroms using ace code Editor if (typeof browser !== 'undefined') { self.chrome = browser; @@ -100,6 +101,14 @@ export const isCSESProblem = (problemUrl: string) => { return false; } }; +export const isCodeChefProblem = (problemUrl: string) => { + try { + const url = new URL(problemUrl); + return url.hostname.endsWith('codechef.com'); + } catch { + return false; + } +}; export const handleAlgoZenithSubmit = async ( problemName: string, @@ -202,6 +211,66 @@ export const handleCSESSubmit = async ( }, ); }; +export const handleCodeChefSubmit = async ( + problemName: string, + languageId: number, + sourceCode: string, + problemUrl: string, +) => { + const tab = await chrome.tabs.create({ active: true, url: problemUrl }); + const tabId = tab.id as number; + chrome.windows.update(tab.windowId, { focused: true }); + + chrome.tabs.onUpdated.addListener( + function listener(updatedTabId, changeInfo) { + if (updatedTabId === tabId && changeInfo.status === 'complete') { + chrome.tabs.onUpdated.removeListener(listener); + + setTimeout(async () => { + await chrome.scripting.executeScript({ + target: { tabId, allFrames: false }, + files: ['/dist/codeChefInjectedScript.js'], + }); + + chrome.tabs.sendMessage(tabId, { + type: 'cph-submit-codechef', + languageId, + }); + + /**ChromeV3 don't Allow us to inject script due to CSP policy**/ + setTimeout(async () => { + await chrome.scripting.executeScript({ + target: { tabId, allFrames: false }, + world: 'MAIN', + func: (code) => { + const w = window as any; + if (w.ace) + w.ace + .edit( + document.querySelector( + '.ace_editor', + ), + ) + .setValue(code, -1); + }, + args: [sourceCode], + }); + + setTimeout(() => { + chrome.scripting.executeScript({ + target: { tabId, allFrames: false }, + func: () => + document + .getElementById('submit_btn') + ?.click(), + }); + }, 500); + }, 1000); + }, 2000); + } + }, + ); +}; export const handleSubmit = async ( problemName: string, languageId: number, @@ -229,6 +298,14 @@ export const handleSubmit = async ( problemUrl, ); } + if (isCodeChefProblem(problemUrl)) { + return handleCodeChefSubmit( + problemName, + languageId, + sourceCode, + problemUrl, + ); + } const submitTarget = resolveSubmitTarget(problemUrl); diff --git a/webpack.config.js b/webpack.config.js index d53f0e1..1d40872 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -7,6 +7,7 @@ module.exports = { injectedScript: './src/injectedScript.ts', algoZenithInjectedScript: './src/algoZenithInjectedScript.ts', csesInjectedScript: './src/csesInjectedScript.ts', + codeChefInjectedScript: './src/codeChefInjectedScript.ts', offscreen: './src/offscreen.ts', }, output: { From 5ca9de136a6637bc96160339a714f366695270cd Mon Sep 17 00:00:00 2001 From: sachin Date: Sat, 13 Jun 2026 03:03:24 +0530 Subject: [PATCH 02/11] fixed bug where language wasnt compiling in the selected language --- src/codeChefInjectedScript.ts | 85 ++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts index 617f302..cfa7d8b 100644 --- a/src/codeChefInjectedScript.ts +++ b/src/codeChefInjectedScript.ts @@ -1,6 +1,8 @@ import { ContentScriptData } from './types'; import log from './log'; +declare const ace: any; + log(`cph-submit Codechef script injected`); const idToCodechefLanguage: Record = { @@ -47,19 +49,78 @@ const languageMap: Record = { Rust: 'rust', }; -chrome.runtime.onMessage.addListener((message) => { - if (message.type !== 'cph-submit-codechef') return; +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +const simulateHumanClick = (element: HTMLElement) => { + ['mouseover', 'mousedown', 'mouseup', 'click'].forEach((eventType) => { + element.dispatchEvent( + new MouseEvent(eventType, { + bubbles: true, + cancelable: true, + view: window, + buttons: 1, + }), + ); + }); +}; + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.type !== 'cph-submit-codechef') return false; + + const execute = async () => { + try { + const languageName = idToCodechefLanguage[message.languageId]; + if (!languageName) { + sendResponse({ success: false, error: 'Unsupported language' }); + return; + } + + const languageSelectBtn = document.querySelector( + '#language-select', + ) as HTMLElement | null; + if (languageSelectBtn) { + simulateHumanClick(languageSelectBtn); + await sleep(300); + + const options = Array.from( + document.querySelectorAll('[role="option"]'), + ) as HTMLElement[]; + const targetOption = options.find((opt) => { + const val = opt.getAttribute('data-value'); + return ( + val === languageMap[languageName] || + opt.textContent?.trim() === languageName + ); + }); + + if (targetOption) { + simulateHumanClick(targetOption); + await sleep(400); + } + } + + const editor = document.querySelector('.ace_editor'); + if (editor && typeof ace !== 'undefined') { + ace.edit(editor).setValue(message.sourceCode, -1); + } - const languageName = idToCodechefLanguage[message.languageId]; - if (!languageName) return; + await sleep(200); - const languageSelect = document.querySelector( - '#language-select', - ) as HTMLElement | null; - if (languageSelect) languageSelect.textContent = languageName; + const submitBtn = document.getElementById('submit_btn'); + if (submitBtn) { + simulateHumanClick(submitBtn); + sendResponse({ success: true }); + } else { + sendResponse({ + success: false, + error: 'Submit button not found', + }); + } + } catch (error: any) { + sendResponse({ success: false, error: error.message }); + } + }; - const languageInput = document.querySelector( - 'input.MuiSelect-nativeInput', - ) as HTMLInputElement | null; - if (languageInput) languageInput.value = languageMap[languageName]; + execute(); + return true; }); From 491c95508a9cdd030c6e1ef78e48a0ff46f76b3f Mon Sep 17 00:00:00 2001 From: sachin Date: Sat, 13 Jun 2026 22:41:55 +0530 Subject: [PATCH 03/11] Added atcoder support --- manifest-chrome.partial.json | 1 + manifest-firefox.partial.json | 1 + src/atcoderInjectedScript.ts | 91 +++++++++++++++++++++++++++++++++++ src/handleSubmit.ts | 74 ++++++++++++++++++++++++++++ webpack.config.js | 1 + 5 files changed, 168 insertions(+) create mode 100644 src/atcoderInjectedScript.ts diff --git a/manifest-chrome.partial.json b/manifest-chrome.partial.json index 8fa4408..56c9679 100644 --- a/manifest-chrome.partial.json +++ b/manifest-chrome.partial.json @@ -6,6 +6,7 @@ "https://cses.fi/*", "https://codeforces.com/*", "*://*.codechef.com/*", + "*://*.atcoder.jp/*", "https://maang.in/*" ], "background": { diff --git a/manifest-firefox.partial.json b/manifest-firefox.partial.json index 9bb0344..6d3e99d 100644 --- a/manifest-firefox.partial.json +++ b/manifest-firefox.partial.json @@ -9,6 +9,7 @@ "https://cses.fi/*", "*://codeforces.com/*", "*://*.codechef.com/*", + "*://*.atcoder.jp/*", "*://maang.in/*", "webNavigation" ], diff --git a/src/atcoderInjectedScript.ts b/src/atcoderInjectedScript.ts new file mode 100644 index 0000000..dfa0cc9 --- /dev/null +++ b/src/atcoderInjectedScript.ts @@ -0,0 +1,91 @@ +import { ContentScriptData } from './types'; +import log from './log'; + +declare const ace: any; + +log('cph-submit atcoder script injected'); + +const idToAtcoderLanguage: Record = { + 91: 'C++23 (GCC 15.2.0)', + 89: 'C++ IOI-Style(GNU++20) (GCC 14.2.0)', + 52: 'C++23 (Clang 21.1.0)', + 43: 'C23 (GCC 14.2.0)', + 79: 'C# 13.0 (.NET 9.0.8)', + 28: 'D (DMD 2.111.0)', + 87: 'Java24 (OpenJDK 24.0.2)', + 88: 'Kotlin (Kotlin/JVM 2.2.10)', + 19: 'OCaml (ocamlopt 5.3.0)', + 4: 'Pascal (fpc 3.2.2)', + 13: 'Perl (perl 5.38.2)', + 6: 'PHP (PHP 8.4.12)', + 55: 'JavaScript (Node.js 22.19.0)', + 31: 'Python (CPython 3.13.7)', + 70: 'Python (PyPy 3.11-v7.3.20)', + 67: 'Ruby 3.4 (ruby 3.4.5)', + 32: 'Go (go 1.25.1)', + 98: 'Rust (rustc 1.89.0)', + 20: 'Scala (Dotty 3.7.2)', + 12: 'Haskell (GHC 9.8.4)', +}; + +chrome.runtime.onMessage.addListener((message) => { + if (message.type !== 'cph-submit-Atcoder') return; + + const { sourceCode, languageId } = message; + const languageText = idToAtcoderLanguage[languageId]; + + if (!languageText) { + alert('The following language is not supported'); + return; + } + + const selectBox = document.querySelector( + 'select[name="data.LanguageId"]', + ) as HTMLSelectElement; + + if (selectBox) { + const options = Array.from(selectBox.options); + const targetOption = options.find( + (opt) => opt.text.trim() === languageText, + ); + + if (targetOption) { + const atcoderValue = targetOption.value; + selectBox.value = atcoderValue; + selectBox.dispatchEvent(new Event('change', { bubbles: true })); + log( + `Successfully set language to ${languageText} (Value: ${atcoderValue})`, + ); + } else { + log( + `Error: Could not find an option matching the text "${languageText}" in the dropdown.`, + ); + } + } else { + log( + 'Error: Could not find the AtCoder language select box on this page.', + ); + } + + if (sourceCode) { + const script = document.createElement('script'); + const escapedCode = sourceCode + .replace(/\\/g, '\\\\') + .replace(/`/g, '\\`'); + + script.textContent = ` + if (typeof ace !== 'undefined') { + const editor = ace.edit("editor"); + editor.setValue(\`${escapedCode}\`); + editor.clearSelection(); + } else { + const textArea = document.querySelector('.plain-textarea'); + if (textArea) textArea.value = \`${escapedCode}\`; + } + `; + + document.documentElement.appendChild(script); + script.remove(); + log('Successfully injected source code into the editor.'); + } +}); diff --git a/src/handleSubmit.ts b/src/handleSubmit.ts index a4a1025..c19b006 100644 --- a/src/handleSubmit.ts +++ b/src/handleSubmit.ts @@ -109,6 +109,14 @@ export const isCodeChefProblem = (problemUrl: string) => { return false; } }; +export const isAtcoderProblem = (problemUrl: string) => { + try { + const url = new URL(problemUrl); + return url.hostname.endsWith('atcoder.jp'); + } catch { + return false; + } +}; export const handleAlgoZenithSubmit = async ( problemName: string, @@ -271,6 +279,64 @@ export const handleCodeChefSubmit = async ( }, ); }; +export const handleAtcoderSubmit = async ( + problemName: string, + languageId: number, + sourceCode: string, + problemUrl: string, +) => { + const tab = await chrome.tabs.create({ active: true, url: problemUrl }); + const tabId = tab.id as number; + chrome.windows.update(tab.windowId, { focused: true }); + + chrome.tabs.onUpdated.addListener( + function listener(updatedTabId, changeInfo) { + if (updatedTabId === tabId && changeInfo.status === 'complete') { + chrome.tabs.onUpdated.removeListener(listener); + + setTimeout(async () => { + await chrome.scripting.executeScript({ + target: { tabId, allFrames: false }, + files: ['/dist/AtcoderInjectedScript.js'], + }); + + chrome.tabs.sendMessage(tabId, { + type: 'cph-submit-Atcoder', + languageId, + }); + + /**ChromeV3 don't Allow us to inject script due to CSP policy**/ + setTimeout(async () => { + await chrome.scripting.executeScript({ + target: { tabId, allFrames: false }, + world: 'MAIN', + func: (code) => { + const w = window as any; + if (w.ace) + w.ace + .edit( + document.querySelector( + '.ace_editor', + ), + ) + .setValue(code, -1); + }, + args: [sourceCode], + }); + + setTimeout(() => { + chrome.scripting.executeScript({ + target: { tabId, allFrames: false }, + func: () => + document.getElementById('submit')?.click(), + }); + }, 7000); + }, 1000); + }, 2000); + } + }, + ); +}; export const handleSubmit = async ( problemName: string, languageId: number, @@ -306,6 +372,14 @@ export const handleSubmit = async ( problemUrl, ); } + if (isAtcoderProblem(problemUrl)) { + return handleAtcoderSubmit( + problemName, + languageId, + sourceCode, + problemUrl, + ); + } const submitTarget = resolveSubmitTarget(problemUrl); diff --git a/webpack.config.js b/webpack.config.js index 1d40872..967f677 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -8,6 +8,7 @@ module.exports = { algoZenithInjectedScript: './src/algoZenithInjectedScript.ts', csesInjectedScript: './src/csesInjectedScript.ts', codeChefInjectedScript: './src/codeChefInjectedScript.ts', + atcoderInjectedScript: './src/atcoderInjectedScript.ts', offscreen: './src/offscreen.ts', }, output: { From 056ca8faf8c799dd55e42144b40d19ab1f5a1184 Mon Sep 17 00:00:00 2001 From: sachin Date: Sat, 13 Jun 2026 23:03:31 +0530 Subject: [PATCH 04/11] updated readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 4a3035f..c08aa55 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@ # ![ICON](icon-48.png) cph-submit -Browser add-on that enables direct submission on Codeforces,CodeChef,CSES and -Maang.in with +Browser add-on that enables direct submission on Codeforces,CodeChef,AtCoder +CSES and Maang.in with [Competitive Programming Helper](https://github.com/agrawal-d/cph). Available for Firefox and Google Chrome. From ab8f2dbf781fac9fc3e311d3ac6eb6e983b3e2e3 Mon Sep 17 00:00:00 2001 From: sachin Date: Tue, 16 Jun 2026 20:11:52 +0530 Subject: [PATCH 05/11] added alerts in CC script --- src/codeChefInjectedScript.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts index cfa7d8b..ea7df48 100644 --- a/src/codeChefInjectedScript.ts +++ b/src/codeChefInjectedScript.ts @@ -64,14 +64,14 @@ const simulateHumanClick = (element: HTMLElement) => { }); }; -chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { +chrome.runtime.onMessage.addListener((message) => { if (message.type !== 'cph-submit-codechef') return false; const execute = async () => { try { const languageName = idToCodechefLanguage[message.languageId]; if (!languageName) { - sendResponse({ success: false, error: 'Unsupported language' }); + alert('Language is not supported'); return; } @@ -109,15 +109,12 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { const submitBtn = document.getElementById('submit_btn'); if (submitBtn) { simulateHumanClick(submitBtn); - sendResponse({ success: true }); + log('button submitted succesfully'); } else { - sendResponse({ - success: false, - error: 'Submit button not found', - }); + alert('submit button not found please submit manually'); } - } catch (error: any) { - sendResponse({ success: false, error: error.message }); + } catch (error) { + log(error); } }; From 6494741061423712c3ca3de50b7959c450aeb59d Mon Sep 17 00:00:00 2001 From: sachin Date: Tue, 16 Jun 2026 20:15:22 +0530 Subject: [PATCH 06/11] few changes in alert messages --- src/codeChefInjectedScript.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts index ea7df48..903551d 100644 --- a/src/codeChefInjectedScript.ts +++ b/src/codeChefInjectedScript.ts @@ -71,7 +71,7 @@ chrome.runtime.onMessage.addListener((message) => { try { const languageName = idToCodechefLanguage[message.languageId]; if (!languageName) { - alert('Language is not supported'); + alert('Current Language is not supported'); return; } @@ -109,7 +109,7 @@ chrome.runtime.onMessage.addListener((message) => { const submitBtn = document.getElementById('submit_btn'); if (submitBtn) { simulateHumanClick(submitBtn); - log('button submitted succesfully'); + log('problem submitted succesfully'); } else { alert('submit button not found please submit manually'); } @@ -119,5 +119,5 @@ chrome.runtime.onMessage.addListener((message) => { }; execute(); - return true; + }); From d0b627d7df98fdda663bbfad2d7b997164647133 Mon Sep 17 00:00:00 2001 From: sachin Date: Tue, 16 Jun 2026 20:17:20 +0530 Subject: [PATCH 07/11] formatting issue --- src/codeChefInjectedScript.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts index 903551d..d578fcf 100644 --- a/src/codeChefInjectedScript.ts +++ b/src/codeChefInjectedScript.ts @@ -119,5 +119,4 @@ chrome.runtime.onMessage.addListener((message) => { }; execute(); - }); From d11f0907e6ca632404cade7dd8467050a5570684 Mon Sep 17 00:00:00 2001 From: sachin Date: Wed, 17 Jun 2026 04:37:16 +0530 Subject: [PATCH 08/11] refracted code --- src/atcoderInjectedScript.ts | 28 ++++++++-------------------- src/codeChefInjectedScript.ts | 15 --------------- src/handleSubmit.ts | 12 ++---------- 3 files changed, 10 insertions(+), 45 deletions(-) diff --git a/src/atcoderInjectedScript.ts b/src/atcoderInjectedScript.ts index dfa0cc9..888de45 100644 --- a/src/atcoderInjectedScript.ts +++ b/src/atcoderInjectedScript.ts @@ -67,25 +67,13 @@ chrome.runtime.onMessage.addListener((message) => { ); } - if (sourceCode) { - const script = document.createElement('script'); - const escapedCode = sourceCode - .replace(/\\/g, '\\\\') - .replace(/`/g, '\\`'); + const cloudFareVerificationChecker = setInterval(() => { + const tokenInput = document.querySelector( + 'input[name="cf-turnstile-response"]', + ) as HTMLInputElement | null; - script.textContent = ` - if (typeof ace !== 'undefined') { - const editor = ace.edit("editor"); - editor.setValue(\`${escapedCode}\`); - editor.clearSelection(); - } else { - const textArea = document.querySelector('.plain-textarea'); - if (textArea) textArea.value = \`${escapedCode}\`; - } - `; - - document.documentElement.appendChild(script); - script.remove(); - log('Successfully injected source code into the editor.'); - } + if (tokenInput && tokenInput.value) { + document.getElementById('submit')?.click(); + } + }, 250); }); diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts index d578fcf..5ed8e7d 100644 --- a/src/codeChefInjectedScript.ts +++ b/src/codeChefInjectedScript.ts @@ -98,21 +98,6 @@ chrome.runtime.onMessage.addListener((message) => { await sleep(400); } } - - const editor = document.querySelector('.ace_editor'); - if (editor && typeof ace !== 'undefined') { - ace.edit(editor).setValue(message.sourceCode, -1); - } - - await sleep(200); - - const submitBtn = document.getElementById('submit_btn'); - if (submitBtn) { - simulateHumanClick(submitBtn); - log('problem submitted succesfully'); - } else { - alert('submit button not found please submit manually'); - } } catch (error) { log(error); } diff --git a/src/handleSubmit.ts b/src/handleSubmit.ts index c19b006..23dd43d 100644 --- a/src/handleSubmit.ts +++ b/src/handleSubmit.ts @@ -2,7 +2,7 @@ import config from './config'; import log from './log'; declare const browser: any; -declare const ace: any; //This is required for platfroms using ace code Editor +declare const ace: any; //Ace Editor if (typeof browser !== 'undefined') { self.chrome = browser; @@ -297,7 +297,7 @@ export const handleAtcoderSubmit = async ( setTimeout(async () => { await chrome.scripting.executeScript({ target: { tabId, allFrames: false }, - files: ['/dist/AtcoderInjectedScript.js'], + files: ['/dist/atcoderInjectedScript.js'], }); chrome.tabs.sendMessage(tabId, { @@ -323,14 +323,6 @@ export const handleAtcoderSubmit = async ( }, args: [sourceCode], }); - - setTimeout(() => { - chrome.scripting.executeScript({ - target: { tabId, allFrames: false }, - func: () => - document.getElementById('submit')?.click(), - }); - }, 7000); }, 1000); }, 2000); } From f4b03c3d0a871db5687ba642974637148553aeea Mon Sep 17 00:00:00 2001 From: sachin Date: Wed, 17 Jun 2026 19:28:55 +0530 Subject: [PATCH 09/11] added a 3 second timeout before cloudfare check --- src/atcoderInjectedScript.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/atcoderInjectedScript.ts b/src/atcoderInjectedScript.ts index 888de45..e585ffc 100644 --- a/src/atcoderInjectedScript.ts +++ b/src/atcoderInjectedScript.ts @@ -66,6 +66,7 @@ chrome.runtime.onMessage.addListener((message) => { 'Error: Could not find the AtCoder language select box on this page.', ); } + new Promise((r) => setTimeout(r, 3000)); const cloudFareVerificationChecker = setInterval(() => { const tokenInput = document.querySelector( From 2521ed55bf840bfec285b8022ad01f45b5bf9025 Mon Sep 17 00:00:00 2001 From: sachin Date: Sat, 20 Jun 2026 19:29:17 +0530 Subject: [PATCH 10/11] fixed submit during live contest --- src/atcoderInjectedScript.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/atcoderInjectedScript.ts b/src/atcoderInjectedScript.ts index e585ffc..84aed72 100644 --- a/src/atcoderInjectedScript.ts +++ b/src/atcoderInjectedScript.ts @@ -28,7 +28,7 @@ const idToAtcoderLanguage: Record = { 12: 'Haskell (GHC 9.8.4)', }; -chrome.runtime.onMessage.addListener((message) => { +chrome.runtime.onMessage.addListener(async (message) => { if (message.type !== 'cph-submit-Atcoder') return; const { sourceCode, languageId } = message; @@ -66,14 +66,20 @@ chrome.runtime.onMessage.addListener((message) => { 'Error: Could not find the AtCoder language select box on this page.', ); } - new Promise((r) => setTimeout(r, 3000)); + await new Promise((r) => setTimeout(r, 1500)); + /* there is no cloudfare verification during live contests*/ + const tokenInput = document.querySelector( + 'input[name="cf-turnstile-response"]', + ) as HTMLInputElement | null; - const cloudFareVerificationChecker = setInterval(() => { - const tokenInput = document.querySelector( - 'input[name="cf-turnstile-response"]', - ) as HTMLInputElement | null; + if (!tokenInput) { + document.getElementById('submit')?.click(); + return; + } + const cloudFareVerificationChecker = setInterval(() => { if (tokenInput && tokenInput.value) { + clearInterval(cloudFareVerificationChecker); document.getElementById('submit')?.click(); } }, 250); From 4328a050c6bb32a748e9d96a5f9f63471c55f942 Mon Sep 17 00:00:00 2001 From: sachin Date: Sat, 20 Jun 2026 19:58:12 +0530 Subject: [PATCH 11/11] moved cc submit to script --- src/codeChefInjectedScript.ts | 2 ++ src/handleSubmit.ts | 10 ---------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/codeChefInjectedScript.ts b/src/codeChefInjectedScript.ts index 5ed8e7d..e35c744 100644 --- a/src/codeChefInjectedScript.ts +++ b/src/codeChefInjectedScript.ts @@ -101,6 +101,8 @@ chrome.runtime.onMessage.addListener((message) => { } catch (error) { log(error); } + await new Promise((r) => setTimeout(r, 1500)); + document.getElementById('submit_btn')?.click(); }; execute(); diff --git a/src/handleSubmit.ts b/src/handleSubmit.ts index 23dd43d..224f6f2 100644 --- a/src/handleSubmit.ts +++ b/src/handleSubmit.ts @@ -263,16 +263,6 @@ export const handleCodeChefSubmit = async ( }, args: [sourceCode], }); - - setTimeout(() => { - chrome.scripting.executeScript({ - target: { tabId, allFrames: false }, - func: () => - document - .getElementById('submit_btn') - ?.click(), - }); - }, 500); }, 1000); }, 2000); }