From da471891aab172e4147991bf9f974bb7125af141 Mon Sep 17 00:00:00 2001 From: Yunseok Date: Mon, 27 May 2024 09:33:17 +0900 Subject: [PATCH 1/3] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2899a79..ff3355d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@

license + chrome-webstore + users

@@ -24,6 +26,7 @@
## 백준코드란? + - '백준코드'는 백준에서 푼 문제를 Github에 자동으로 커밋해주는 [백준허브](https://github.com/BaekjoonHub/BaekjoonHub)를 보며 '디스코드로 보내면 어떨까?'하는 생각에서 출발한 프로젝트입니다. - 이 프로젝트의 핵심 기능은 백준에서 푼 문제를 웹훅을 사용해 디스코드 서버로 자동으로 공유하는 것입니다. - 이 프로그램은 특히 알고리즘 동아리나 스터디 그룹에서 문제 풀이 과정을 함께 공유하고 협력하는 데에 유용할 것입니다. From 5338ef73145c454d9083564ee0aab3ba9f7fd951 Mon Sep 17 00:00:00 2001 From: YEAHx4 Date: Thu, 30 May 2024 14:15:34 +0900 Subject: [PATCH 2/3] Add documentatin comment to page scripts --- scripts/page/popup.js | 20 ++++++++++++++++++++ scripts/page/settings.js | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/scripts/page/popup.js b/scripts/page/popup.js index 83c503c..354ef42 100644 --- a/scripts/page/popup.js +++ b/scripts/page/popup.js @@ -1,5 +1,13 @@ +/** + * @typedef {Object} Webhook 웹훅 리스트 + */ const webhooks = []; +/** + * chrome extension 아이콘의 href 를 설정 페이지로 변경합니다. + * + * @returns {void} + */ function injectSettingPage() { const setting = document.getElementById("a-setting-page"); if (!setting) return; @@ -9,6 +17,10 @@ function injectSettingPage() { setting.href = `chrome-extension://${id}/popup/settings.html`; } +/** + * chrome sync 에서 웹훅을 불러옵니다. + * webhook에 저장합니다. + */ async function load() { const data = await chrome.storage.sync.get("webhooks"); if (data.webhooks) { @@ -18,6 +30,11 @@ async function load() { console.log(data); } +/** + * 로딩된 웹훅을 렌더링합니다. + * 웹훅의 상태에 따라 스위치를 표시합니다. + * 스위치가 변경될 때마다 chrome sync에 저장합니다. + */ function render() { const list = document.getElementById("webhook-list"); list.innerHTML = ""; @@ -51,6 +68,9 @@ function render() { }); } +/** + * 초기화 프로세스를 실행합니다. + */ async function init() { injectSettingPage(); await load(); diff --git a/scripts/page/settings.js b/scripts/page/settings.js index bb32b1e..c208a9e 100644 --- a/scripts/page/settings.js +++ b/scripts/page/settings.js @@ -1,5 +1,13 @@ +/** + * @typedef {Object} Webhook 웹훅 리스트 + */ const webhooks = []; +/** + * 렌더링을 수행합니다. + * 로딩된 웹훅 목록을 화면에 렌더링하고, 삭제 버튼을 추가합니다. + * 삭제 버튼을 클릭하면 해당 웹훅을 삭제합니다. + */ function render() { const wh = webhooks.map((webhook, i) => { const webhookElement = document.createElement("div"); @@ -32,11 +40,18 @@ function render() { webhooksElement.append(...wh); } +/** + * 입력 필드를 초기화합니다. + * 웹훅이 추가된 후 실행됩니다. + */ function clearInputs() { document.getElementById("name-input").value = ""; document.getElementById("url-input").value = ""; } +/** + * 새로운 웹훅츨 추가하고 chrome sync에 저장합니다. + */ function addWebhook() { const name = document.getElementById("name-input").value; const url = document.getElementById("url-input").value; @@ -45,6 +60,11 @@ function addWebhook() { clearInputs(); } +/** + * 웹훅을 삭제하고 chrome sync에 반영합니다. + * + * @param {number} index 삭제할 웹훅의 인덱스 + */ async function remove(index) { webhooks.splice(index, 1); render(); @@ -52,6 +72,12 @@ async function remove(index) { console.log("Webhook deleted"); } +/** + * 웹훅을 chrome sync에 저장합니다. + * + * @param {string} name 웹훅 이름 + * @param {string} url 웹훅 URL + */ async function add(name, url) { webhooks.push({ name, url, enabled: true }); render(); @@ -59,6 +85,10 @@ async function add(name, url) { console.log("Webhook added"); } +/** + * chrome sync에서 웹훅 목록을 불러옵니다. + * webhooks 배열에 저장합니다. + */ async function load() { const data = await chrome.storage.sync.get("webhooks"); if (data.webhooks) { @@ -67,7 +97,9 @@ async function load() { console.log("Webhooks loaded"); console.log(data); } - +/** + * 이벤트 리스너를 추가하고 초기 렌더링을 수행합니. + */ async function init() { const addButton = document.getElementById("add-webhook"); addButton.addEventListener("click", addWebhook); From db9bce3d5660102b68997701565e8bd373a4208e Mon Sep 17 00:00:00 2001 From: YEAHx4 Date: Tue, 4 Jun 2024 16:29:02 +0900 Subject: [PATCH 3/3] Send webhook message in time-independent way --- manifest.json | 2 +- scripts/content/boj.js | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 5e5407e..dbb6577 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "name": "백준코드", "description": "Automatically send BOJ to your discord server", "homepage_url": "https://github.com/BaekjoonCord/BJCORD-extension", - "version": "1.3.4", + "version": "1.4.0", "author": "karpitony, YEAHx4", "action": { "default_icon": "assets/thumbnail.png", diff --git a/scripts/content/boj.js b/scripts/content/boj.js index dd12f7e..28e267f 100644 --- a/scripts/content/boj.js +++ b/scripts/content/boj.js @@ -15,6 +15,16 @@ if (!!handle) { watch(); } +/** + * 내 제출 페이지에서 채점 중인 제출이 있는지 확인한다. + * 기존엔 120초 내 AC가 있었다면 웹훅을 전송했지만 + * 채점이 오래 걸리면 제대로 감지하지 못하는 경우가 있었다. + * 10초 내 AC는 바로 웹훅을 전송하고 10초 이상된 AC는 + * isJudging이 true인지 확인하고 전송한다. + */ +let isJudging = false; +let judgeStartTime = 0; + /** * 1초마다 제출 결과를 확인한다. 제출 결과가 AC인 경우, Discord로 메시지를 전송한다. */ @@ -38,10 +48,26 @@ function watch() { // resultCategory == "wait" // ) // return; - if (resultCategory != "ac") return; + if (resultCategory == "judging") { + if (!isJudging) { + isJudging = true; + judgeStartTime = new Date().getTime(); + log("Waiting for judge result..."); + } + return; + } + if (resultCategory != "ac") { + log('Result is not "AC". Aborted.'); + return; + } const time = getTimeDifference(data.submissionTime); - if (time > 120) return; + if (time > 10) { + if (!isJudging) return; + + const duration = new Date().getTime() - judgeStartTime; + log("AC detected. " + duration / 1000 + " s elapsed."); + } clearInterval(interval); log("Submission detected: " + resultCategory);