Auto collect community points

Twitchのコミュニティポイントを自動で取得します。Automatically get Twitch community points.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Auto collect community points
// @namespace    https://twitter.com/rin_jugatla
// @version      0.0.1
// @description  Twitchのコミュニティポイントを自動で取得します。Automatically get Twitch community points.
// @author       rin_jugatla
// @match        https://www.twitch.tv/*
// @grant        none
// ==/UserScript==

let is_success_watch_dog = false;
let try_count = 0;
const try_limit = 10;
const try_delay_ms = 5000;
const click_random_delay_ms = 5000;
const print_log = true;

function watchPointCollectButton() {
    const watch_selector = 'div[data-test-selector="community-points-summary"] > div:nth-child(2) > div';
    const watch_element = document.querySelector(watch_selector);
    if (watch_element == null) { return; }

    function virtualClick() {
        const point_collect_button_selector = 'div[data-test-selector="community-points-summary"] > div:nth-child(2) > div > div > div> button';
        const button = document.querySelector(point_collect_button_selector);

        if (button == null) { return; }
        setTimeout(() => {
            if (print_log) { console.log(); }
            button.click();
        }, Math.random() * click_random_delay_ms);
    }

    // ノードの監視
    const mutation = new MutationObserver(virtualClick);
    mutation.observe(watch_element, { childList: true, subtree: true });
    is_success_watch_dog = true;
}

window.addEventListener('load', () => {
    const timer = setInterval(() => {
        try_count++;
        watchPointCollectButton();

        const is_giveup_watch_dog = try_count > try_limit - 1;
        if (is_giveup_watch_dog || is_success_watch_dog) { clearInterval(timer); }
    }, try_delay_ms);
});