2022-08-27 04:21:15 +04:00
|
|
|
const g_captcha_timeout_seconds = 600;
|
|
|
|
|
|
|
|
const captcha_hidden_field = document.forms[0].children[4].children[0];
|
|
|
|
|
2022-09-23 00:36:43 +04:00
|
|
|
let g_captcha_timeout_remain = g_captcha_timeout_seconds;
|
2022-08-27 04:21:15 +04:00
|
|
|
let g_current_captcha_id = captcha_hidden_field.value;
|
|
|
|
|
2022-10-19 21:05:24 +04:00
|
|
|
function getColorScheme() {
|
2022-10-19 21:20:34 +04:00
|
|
|
return window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
|
2022-10-19 21:05:24 +04:00
|
|
|
}
|
|
|
|
|
2022-08-27 04:21:15 +04:00
|
|
|
async function getNewCaptcha() {
|
2022-10-21 02:10:43 +04:00
|
|
|
const id = await fetch("/api/captcha/", { method: "POST"}).then(r => r.text());
|
2022-10-19 21:20:34 +04:00
|
|
|
g_current_captcha_id = id;
|
|
|
|
captcha_hidden_field.value = id;
|
2022-10-21 02:10:43 +04:00
|
|
|
setTimeout(() => { captcha_img.src = `/api/captcha/${id}/image?style=${getColorScheme()}` }, 600);
|
2022-10-19 21:20:34 +04:00
|
|
|
g_captcha_timeout_remain = g_captcha_timeout_seconds;
|
2022-08-27 04:21:15 +04:00
|
|
|
}
|
|
|
|
|
2022-08-25 03:24:52 +04:00
|
|
|
const captcha_span = document.getElementsByClassName("captcha")[0];
|
|
|
|
const captcha_img = captcha_span.children[1];
|
|
|
|
|
2022-08-27 04:21:15 +04:00
|
|
|
captcha_span.classList.toggle("refresh");
|
2022-08-29 22:57:46 +04:00
|
|
|
captcha_span.children[3].innerHTML =
|
2022-10-19 21:20:34 +04:00
|
|
|
`<button id="refresh">Refresh</button>ed in <b><span id="remain">600</span></b> seconds.`;
|
2022-08-25 03:24:52 +04:00
|
|
|
|
|
|
|
const captcha_refresh = document.getElementById("refresh");
|
|
|
|
const captcha_remain = document.getElementById("remain");
|
|
|
|
|
|
|
|
captcha_refresh.classList.toggle("refresh");
|
|
|
|
captcha_refresh.addEventListener("click", async e => {
|
2022-10-19 21:20:34 +04:00
|
|
|
e.preventDefault();
|
|
|
|
captcha_refresh.disabled = true;
|
|
|
|
setTimeout(async () => {
|
|
|
|
captcha_refresh.disabled = false;
|
2022-10-21 02:10:43 +04:00
|
|
|
await fetch(`/api/captcha/${g_current_captcha_id}?remove`); }, 3000);
|
2022-10-19 21:20:34 +04:00
|
|
|
document.getElementsByName("captcha_answer")[0].value = "";
|
|
|
|
await getNewCaptcha();
|
2022-08-25 03:24:52 +04:00
|
|
|
});
|
|
|
|
|
2022-08-29 22:57:46 +04:00
|
|
|
// Remove unused CAPTCHA on a server.
|
2022-10-21 02:10:43 +04:00
|
|
|
window.addEventListener("unload", () => fetch(`/api/captcha/${g_current_captcha_id}?remove`));
|
2022-08-29 22:57:46 +04:00
|
|
|
|
2022-08-25 03:24:52 +04:00
|
|
|
setInterval(async () => {
|
2022-10-19 21:20:34 +04:00
|
|
|
captcha_remain.innerText = --g_captcha_timeout_remain;
|
|
|
|
if (g_captcha_timeout_remain == 0)
|
|
|
|
await getNewCaptcha();
|
2022-08-25 03:24:52 +04:00
|
|
|
}, 1000);
|