Connected Users

Shows the amount of connected users next to the amount of all users

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Connected Users
// @namespace    http://tampermonkey.net/
// @version      1.1.1
// @description  Shows the amount of connected users next to the amount of all users
// @author       guildedbird & azti
// @match        https://pixelplace.io/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    let canvasTotal = null;
    let lastUserTotal = null;
    let lastDisplay = '';

    function update(force = false) {
        const value1 = document.querySelector('#chat .online span.value');
        const value2 = document.querySelector('span.sub-value');

        if (!value1 || !value2) return;

        const titleText = value1.title;
        const matchUserTotal = titleText.match(/^\d+/);
        const matchCanvasTotal = titleText.match(/\s\d+/);

        if (!matchUserTotal) return;

        const currentUserTotal = parseInt(matchUserTotal[0]);

        if (canvasTotal === null && matchCanvasTotal) {
            canvasTotal = parseInt(matchCanvasTotal[0].trim());
        }

        const newDisplay = (() => {
            let result = `${currentUserTotal}`;
            if (canvasTotal && canvasTotal > 0) {
                result += ` & ${canvasTotal}`;
            }
            return `(${result})`;
        })();

        if (force || currentUserTotal !== lastUserTotal || newDisplay !== lastDisplay) {
            value2.textContent = newDisplay;
            value2.style.setProperty('display', 'inline', 'important');
            value2.style.setProperty('color', '#b3b3b3', 'important');

            lastUserTotal = currentUserTotal;
            lastDisplay = newDisplay;
        }
    }

    function updateCanvasTotal() {
        const players = document.querySelectorAll('.players-list .player');
        const newTotal = players.length;

        if (newTotal !== canvasTotal) {
            canvasTotal = newTotal;
            update(true);
        }
    }

    function observeSubValue() {
        const value2 = document.querySelector('span.sub-value');
        if (value2) {
            const observer = new MutationObserver(() => {
                value2.style.setProperty('display', 'inline', 'important');
                value2.style.setProperty('color', '#b3b3b3', 'important');
            });
            observer.observe(value2, { attributes: true, attributeFilter: ['style'] });
        }
    }

    update();
    observeSubValue();

    const chatElement = document.querySelector('#chat .online');
    if (chatElement) {
        const observer = new MutationObserver(() => {
            const value1 = document.querySelector('#chat .online span.value');
            if (value1) update();
        });
        observer.observe(chatElement, { childList: true, subtree: true, attributes: true });
    }

    const playerListElement = document.querySelector('.players-list');
    if (playerListElement) {
        const observer2 = new MutationObserver(() => {
            updateCanvasTotal();
        });
        observer2.observe(playerListElement, { childList: true, subtree: true, attributes: true });
    }
})();