아카라이브 깡계 확인 수정본

아카라이브 깡계 확인 스크립트

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name 아카라이브 깡계 확인 수정본
// @namespace Null
// @version 5.18
// @description 아카라이브 깡계 확인 스크립트
// @match https://arca.live/b/*/*
// @grant GM_xmlhttpRequest
// ==/UserScript==


const usernameElement = document.querySelector('.username.d-none.d-sm-inline');
const usernameText = usernameElement.textContent.trim(); // 공백 제거

let dataFilterValues = {};

var numOfRequests = 0;
var numOfStyle = 0;

function setLinkStyle(link, post, comment) {
    // console.log('P :' + post + ' C : ' + comment);

    if (post === 0 && comment === 0) {
        link.style.fontWeight = 'bold';
        link.style.color = 'red';
        // link.style.textDecoration = 'line-through';
        link.textContent += ' [삭제된 계정]';
    } else {
        link.style.color = ((post <= 10 && comment <= 10) || comment <= 5) ? 'red' :
        ((post <= 10 && comment > 10) || comment <= 10) ? 'orange' :
        ((post < 15 && comment > 14 ) || comment <= 14) ? 'lightgreen' : '';

        if (post < 15 || comment < 15) {
            link.textContent += ` [최근 글: ${post < 15 ? post : '🆗'} 댓글: ${comment < 15 ? comment : '🆗'}]`;
        }
    }
    numOfStyle++;
}

async function fetchDataAndSetStyle(link) {
    const targetURL = link.href;
    const dataFilterValue = link.getAttribute('data-filter').trim();
    numOfRequests++;

    if (usernameText !== dataFilterValue && !dataFilterValues[dataFilterValue]) {
        dataFilterValues[dataFilterValue] = { post: 0, comment: 0 };
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: targetURL,
                onload: function (response) {
                    const htmlData = response.responseText;
                    const parser = new DOMParser();
                    const doc = parser.parseFromString(htmlData, 'text/html');

                    console.log(dataFilterValue); // DEBUG

                    if (doc.querySelectorAll('.error-code').length >= 1) {
                    } else {
                        const cardBlockElement = doc.querySelector('.card-block');
                        const childNodes = cardBlockElement.childNodes;
                        let postCount = 0;
                        let commentCount = 0;
                        let flag = 0;

                        for (const node of childNodes) {
                            if (node.nodeType === Node.ELEMENT_NODE) {
                                if (node.className === "clearfix") {
                                    flag += 1;
                                }
                                if (node.className === "user-recent" && flag === 0) {
                                    postCount += 1;
                                } else if (node.className === "user-recent" && flag === 1) {
                                    commentCount += 1;
                                }
                            }
                        }
                        dataFilterValues[dataFilterValue] = { post: postCount, comment: commentCount };
                    }
                    resolve();
                }
            });
        });
    }
}

(async () => {
    console.time('Execution Time');
    const promises = [];
    console.log("Data Sorting..."); // DEBUG
    document.querySelectorAll('.info-row .user-info a').forEach(link => {
        promises.push(fetchDataAndSetStyle(link));
    });

    await Promise.all(promises);

    console.log("Labeling..."); // DEBUG

    document.querySelectorAll('.info-row .user-info a').forEach(secondLink => {
        const secondDataFilterValue = secondLink.getAttribute('data-filter').trim();
        if (dataFilterValues[secondDataFilterValue]) {
            const { post, comment } = dataFilterValues[secondDataFilterValue];
            setLinkStyle(secondLink, post, comment);
        }
    });

    console.timeEnd('Execution Time');
    console.log('Req : ' + numOfRequests + ' Sty : ' + numOfStyle);
    console.log(dataFilterValues);

})();