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 @@
+
+
@@ -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);