Skip to content

Commit

Permalink
Merge pull request #30 from BaekjoonCord/dev
Browse files Browse the repository at this point in the history
BJCORD 1.4.0
  • Loading branch information
karpitony authored Jun 4, 2024
2 parents 6ed57ab + 4f09e13 commit acf9af7
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 4 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<br>
<br>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="license"/></a>
<a href="https://chrome.google.com/webstore/detail/ichhnkdadkmehpahpbdgcoeccfahgpdk"><img src="https://img.shields.io/chrome-web-store/v/ichhnkdadkmehpahpbdgcoeccfahgpdk.svg" alt="chrome-webstore"/></a>
<a href="https://chrome.google.com/webstore/detail/ichhnkdadkmehpahpbdgcoeccfahgpdk"><img src="https://img.shields.io/chrome-web-store/d/ichhnkdadkmehpahpbdgcoeccfahgpdk.svg" alt="users"></a>

</p>

Expand All @@ -24,6 +26,7 @@
<br />

## 백준코드란?

- '백준코드'는 백준에서 푼 문제를 Github에 자동으로 커밋해주는 [백준허브](https://github.com/BaekjoonHub/BaekjoonHub)를 보며 '디스코드로 보내면 어떨까?'하는 생각에서 출발한 프로젝트입니다.
- 이 프로젝트의 핵심 기능은 백준에서 푼 문제를 웹훅을 사용해 디스코드 서버로 자동으로 공유하는 것입니다.
- 이 프로그램은 특히 알고리즘 동아리나 스터디 그룹에서 문제 풀이 과정을 함께 공유하고 협력하는 데에 유용할 것입니다.
Expand Down
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
30 changes: 28 additions & 2 deletions scripts/content/boj.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ if (!!handle) {
watch();
}

/**
* 내 제출 페이지에서 채점 중인 제출이 있는지 확인한다.
* 기존엔 120초 내 AC가 있었다면 웹훅을 전송했지만
* 채점이 오래 걸리면 제대로 감지하지 못하는 경우가 있었다.
* 10초 내 AC는 바로 웹훅을 전송하고 10초 이상된 AC는
* isJudging이 true인지 확인하고 전송한다.
*/
let isJudging = false;
let judgeStartTime = 0;

/**
* 1초마다 제출 결과를 확인한다. 제출 결과가 AC인 경우, Discord로 메시지를 전송한다.
*/
Expand All @@ -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);
Expand Down
20 changes: 20 additions & 0 deletions scripts/page/popup.js
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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) {
Expand All @@ -18,6 +30,11 @@ async function load() {
console.log(data);
}

/**
* 로딩된 웹훅을 렌더링합니다.
* 웹훅의 상태에 따라 스위치를 표시합니다.
* 스위치가 변경될 때마다 chrome sync에 저장합니다.
*/
function render() {
const list = document.getElementById("webhook-list");
list.innerHTML = "";
Expand Down Expand Up @@ -51,6 +68,9 @@ function render() {
});
}

/**
* 초기화 프로세스를 실행합니다.
*/
async function init() {
injectSettingPage();
await load();
Expand Down
34 changes: 33 additions & 1 deletion scripts/page/settings.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
/**
* @typedef {Object} Webhook 웹훅 리스트
*/
const webhooks = [];

/**
* 렌더링을 수행합니다.
* 로딩된 웹훅 목록을 화면에 렌더링하고, 삭제 버튼을 추가합니다.
* 삭제 버튼을 클릭하면 해당 웹훅을 삭제합니다.
*/
function render() {
const wh = webhooks.map((webhook, i) => {
const webhookElement = document.createElement("div");
Expand Down Expand Up @@ -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;
Expand All @@ -45,20 +60,35 @@ function addWebhook() {
clearInputs();
}

/**
* 웹훅을 삭제하고 chrome sync에 반영합니다.
*
* @param {number} index 삭제할 웹훅의 인덱스
*/
async function remove(index) {
webhooks.splice(index, 1);
render();
await chrome.storage.sync.set({ webhooks });
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();
await chrome.storage.sync.set({ webhooks });
console.log("Webhook added");
}

/**
* chrome sync에서 웹훅 목록을 불러옵니다.
* webhooks 배열에 저장합니다.
*/
async function load() {
const data = await chrome.storage.sync.get("webhooks");
if (data.webhooks) {
Expand All @@ -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);
Expand Down

0 comments on commit acf9af7

Please sign in to comment.