Platesmania Code Counter

Show country statistics for a user

// ==UserScript==
// @name         Platesmania Code Counter
// @version      1.1.2
// @description  Show country statistics for a user
// @author       You
// @match        https://platesmania.com/user*
// @grant        none
// @license     MIT
// @namespace https://greasyfork.org/users/976031
// ==/UserScript==

(function () {
    'use strict';

    if (!/^\/user\d+$/.test(location.pathname)) return;

    const userId = window.location.href.match(/user(\d+)/)?.[1];
    if (!userId) {
        console.error('User ID could not be extracted.');
        return;
    }
    const button = document.createElement('button');
    button.innerHTML = 'Show Code Stats';
    Object.assign(button.style, {
        position: 'fixed',
        bottom: '10px',
        left: '10px',
        zIndex: '1000',
        padding: '10px 15px',
        backgroundColor: 'black',
        color: '#fff',
        border: 'none',
        borderRadius: '5px',
        cursor: 'pointer',
        display: 'flex',
        alignItems: 'center',
        gap: '10px',
    });
    const spinner = document.createElement('img');
    spinner.src = 'https://upload.wikimedia.org/wikipedia/commons/b/b9/Youtube_loading_symbol_1_%28wobbly%29.gif';
    Object.assign(spinner.style, {
        width: '20px',
        height: '20px',
        display: 'none',
    });
    button.appendChild(spinner);
    document.body.appendChild(button);
    button.addEventListener('click', async () => {
        const urls = [
            { url: `https://platesmania.com/userreg.php?gallery=al-${userId}`, name: `Albania` },
            { url: `https://platesmania.com/userreg.php?gallery=au-${userId}`, name: `Australia` },
            { url: `https://platesmania.com/userreg.php?gallery=at1-${userId}`, name: `Austria (1947 year system)` },
            { url: `https://platesmania.com/userreg.php?gallery=at3-${userId}`, name: `Austria (1990)` },
            { url: `https://platesmania.com/userreg.php?gallery=at2-${userId}`, name: `Austria (Official services and consulates)` },
            { url: `https://platesmania.com/userreg.php?gallery=az-${userId}`, name: `Azerbaijan` },
            { url: `https://platesmania.com/userreg.php?gallery=by3-${userId}`, name: `Belarus (1992)` },
            { url: `https://platesmania.com/userreg.php?gallery=by2-${userId}`, name: `Belarus (2000)` },
            { url: `https://platesmania.com/userreg.php?gallery=by1-${userId}`, name: `Belarus (2004)` },
            { url: `https://platesmania.com/userreg.php?gallery=br-${userId}`, name: `Brazil` },
            { url: `https://platesmania.com/userreg.php?gallery=bg-${userId}`, name: `Bulgaria` },
            { url: `https://platesmania.com/userreg.php?gallery=kh2-${userId}`, name: `Cambodia (Authorities)` },
            { url: `https://platesmania.com/userreg.php?gallery=kh1-${userId}`, name: `Cambodia (Regular plates)` },
            { url: `https://platesmania.com/userreg.php?gallery=ca-${userId}`, name: `Canada` },
            { url: `https://platesmania.com/userreg.php?gallery=cn-${userId}`, name: `China` },
            { url: `https://platesmania.com/userreg.php?gallery=hr-${userId}`, name: `Croatia` },
            { url: `https://platesmania.com/userreg.php?gallery=cz3-${userId}`, name: `Czech Republic (1960)` },
            { url: `https://platesmania.com/userreg.php?gallery=cz1-${userId}`, name: `Czech Republic (Cars, Motorcycles, Dealer)` },
            { url: `https://platesmania.com/userreg.php?gallery=cz2-${userId}`, name: `Czech Republic (Sportcars, Oldtimers)` },
            { url: `https://platesmania.com/userreg.php?gallery=eg1-${userId}`, name: `Egypt (2008)` },
            { url: `https://platesmania.com/userreg.php?gallery=fr2-${userId}`, name: `France (FNI)` },
            { url: `https://platesmania.com/userreg.php?gallery=fr1-${userId}`, name: `France (SIV)` },
            { url: `https://platesmania.com/userreg.php?gallery=de-${userId}`, name: `Germany` },
            { url: `https://platesmania.com/userreg.php?gallery=gr-${userId}`, name: `Greece` },
            { url: `https://platesmania.com/userreg.php?gallery=is1-${userId}`, name: `Iceland` },
            { url: `https://platesmania.com/userreg.php?gallery=is2-${userId}`, name: `Iceland (Diplomatic)` },
            { url: `https://platesmania.com/userreg.php?gallery=id-${userId}`, name: `Indonesia` },
            { url: `https://platesmania.com/userreg.php?gallery=iq-${userId}`, name: `Iraq` },
            { url: `https://platesmania.com/userreg.php?gallery=ie-${userId}`, name: `Ireland` },
            { url: `https://platesmania.com/userreg.php?gallery=it2-${userId}`, name: `Italy (1927)` },
            { url: `https://platesmania.com/userreg.php?gallery=it1-${userId}`, name: `Italy (1994)` },
            { url: `https://platesmania.com/userreg.php?gallery=jp-${userId}`, name: `Japan` },
            { url: `https://platesmania.com/userreg.php?gallery=kz1-${userId}`, name: `Kazakhstan (1993)` },
            { url: `https://platesmania.com/userreg.php?gallery=kz2-${userId}`, name: `Kazakhstan (2012)` },
            { url: `https://platesmania.com/userreg.php?gallery=kg1-${userId}`, name: `Kyrgyzstan (1994)` },
            { url: `https://platesmania.com/userreg.php?gallery=kg2-${userId}`, name: `Kyrgyzstan (2016)` },
            { url: `https://platesmania.com/userreg.php?gallery=my1-${userId}`, name: `Malaysia (A(BC) 1(234))` },
            { url: `https://platesmania.com/userreg.php?gallery=my2-${userId}`, name: `Malaysia (AB(C) 1(234) D)` },
            { url: `https://platesmania.com/userreg.php?gallery=my4-${userId}`, name: `Malaysia, Military` },
            { url: `https://platesmania.com/userreg.php?gallery=my3-${userId}`, name: `Malaysia, Taxi` },
            { url: `https://platesmania.com/userreg.php?gallery=mx-${userId}`, name: `Mexico` },
            { url: `https://platesmania.com/userreg.php?gallery=md1-${userId}`, name: `Moldova` },
            { url: `https://platesmania.com/userreg.php?gallery=mn-${userId}`, name: `Mongolia` },
            { url: `https://platesmania.com/userreg.php?gallery=me-${userId}`, name: `Montenegro` },
            { url: `https://platesmania.com/userreg.php?gallery=ma-${userId}`, name: `Morocco` },
            { url: `https://platesmania.com/userreg.php?gallery=mk1-${userId}`, name: `North Macedonia (1993)` },
            { url: `https://platesmania.com/userreg.php?gallery=mk2-${userId}`, name: `North Macedonia (2012)` },
            { url: `https://platesmania.com/userreg.php?gallery=no3-${userId}`, name: `Norway (1913-1971 - system)` },
            { url: `https://platesmania.com/userreg.php?gallery=no1-${userId}`, name: `Norway (Cars, Commercial vehicles, Tax-exempt vehicles)` },
            { url: `https://platesmania.com/userreg.php?gallery=no4-${userId}`, name: `Norway (Export/Tourist)` },
            { url: `https://platesmania.com/userreg.php?gallery=no2-${userId}`, name: `Norway (Trailers, motorcycles, special vehicles)` },
            { url: `https://platesmania.com/userreg.php?gallery=ps1-${userId}`, name: `Palestinian Authority (1994)` },
            { url: `https://platesmania.com/userreg.php?gallery=ps2-${userId}`, name: `Palestinian Authority (2018)` },
            { url: `https://platesmania.com/userreg.php?gallery=pl4-${userId}`, name: `Poland (1976)` },
            { url: `https://platesmania.com/userreg.php?gallery=pl1-${userId}`, name: `Poland (2000)` },
            { url: `https://platesmania.com/userreg.php?gallery=pl2-${userId}`, name: `Poland (Authorities, Military)` },
            { url: `https://platesmania.com/userreg.php?gallery=pl3-${userId}`, name: `Poland (Provisional and testing, Vanity Plates)` },
            { url: `https://platesmania.com/userreg.php?gallery=pt-${userId}`, name: `Portugal` },
            { url: `https://platesmania.com/userreg.php?gallery=ro-${userId}`, name: `Romania` },
            { url: `https://platesmania.com/userreg.php?gallery=ru-${userId}`, name: `Russia` },
            { url: `https://platesmania.com/userreg.php?gallery=rs-${userId}`, name: `Serbia` },
            { url: `https://platesmania.com/userreg.php?gallery=sk-${userId}`, name: `Slovakia` },
            { url: `https://platesmania.com/userreg.php?gallery=si-${userId}`, name: `Slovenia` },
            { url: `https://platesmania.com/userreg.php?gallery=kr-${userId}`, name: `South Korea` },
            { url: `https://platesmania.com/userreg.php?gallery=es4-${userId}`, name: `Spain (1900 year series)` },
            { url: `https://platesmania.com/userreg.php?gallery=es3-${userId}`, name: `Spain (1971 year series)` },
            { url: `https://platesmania.com/userreg.php?gallery=es2-${userId}`, name: `Spain (Official and military plates)` },
            { url: `https://platesmania.com/userreg.php?gallery=es1-${userId}`, name: `Spain (Specialty plates)` },
            { url: `https://platesmania.com/userreg.php?gallery=ch-${userId}`, name: `Switzerland` },
            { url: `https://platesmania.com/userreg.php?gallery=tj1-${userId}`, name: `Tajikistan (1996)` },
            { url: `https://platesmania.com/userreg.php?gallery=tj2-${userId}`, name: `Tajikistan (2009)` },
            { url: `https://platesmania.com/userreg.php?gallery=th-${userId}`, name: `Thailand` },
            { url: `https://platesmania.com/userreg.php?gallery=xx-${userId}`, name: `Transnistria (cars)` },
            { url: `https://platesmania.com/userreg.php?gallery=tr-${userId}`, name: `Turkey` },
            { url: `https://platesmania.com/userreg.php?gallery=ae-${userId}`, name: `UAE` },
            { url: `https://platesmania.com/userreg.php?gallery=us-${userId}`, name: `USA` },
            { url: `https://platesmania.com/userreg.php?gallery=su2-${userId}`, name: `USSR (1958)` },
            { url: `https://platesmania.com/userreg.php?gallery=su4-${userId}`, name: `USSR (1958, Trailers)` },
            { url: `https://platesmania.com/userreg.php?gallery=su1-${userId}`, name: `USSR (1977)` },
            { url: `https://platesmania.com/userreg.php?gallery=su3-${userId}`, name: `USSR (1977, Trailers)` },
            { url: `https://platesmania.com/userreg.php?gallery=ua1-${userId}`, name: `Ukraine (2004)` },
            { url: `https://platesmania.com/userreg.php?gallery=ua3-${userId}`, name: `Ukraine (Dealer 2004)` },
            { url: `https://platesmania.com/userreg.php?gallery=ua2-${userId}`, name: `Ukraine (Transit plates, Police, 2004)` },
            { url: `https://platesmania.com/userreg.php?gallery=uk5-${userId}`, name: `United Kingdom (1932 / 1903)` },
            { url: `https://platesmania.com/userreg.php?gallery=uk4-${userId}`, name: `United Kingdom (1963)` },
            { url: `https://platesmania.com/userreg.php?gallery=uk3-${userId}`, name: `United Kingdom (1983)` },
            { url: `https://platesmania.com/userreg.php?gallery=uk1-${userId}`, name: `United Kingdom (2001)` },
            { url: `https://platesmania.com/userreg.php?gallery=uk2-${userId}`, name: `United Kingdom (Northern Ireland (1966))` },
            { url: `https://platesmania.com/userreg.php?gallery=uz-${userId}`, name: `Uzbekistan` },
            { url: `https://platesmania.com/userreg.php?gallery=vn-${userId}`, name: `Vietnam` },
        ];
        const stats = [];
        for (const { name, url } of urls) {
            const response = await fetch(url);
            const text = await response.text();
            const parser = new DOMParser();
            const doc = parser.parseFromString(text, 'text/html');
            const tableRows = doc.querySelectorAll('#example tbody tr');
            let spotted = 0;
            let total = 0;
            tableRows.forEach(row => {
                total++;
                const spotsCell = row.querySelector('td:nth-child(4)');
                if (spotsCell && spotsCell.querySelector('a')) {
                    spotted++;
                }
            });
            const percentage = total > 0 ? ((spotted / total) * 100).toFixed(2) : "0.00";
            const barWidth = percentage > 0 ? Math.min(100, percentage) : 0;
            const barHTML = `<div style="background: #ccc; height: 10px; width: 100%; border-radius: 5px; overflow: hidden;">
                    <div style="background: #007bff; height: 100%; width: ${barWidth}%;"></div>
                 </div>`;
            stats.push({ name, spotted, total, percentage, barHTML });
            spinner.style.display = 'inline';
            button.textContent = `Fetching ${name}...`;
            button.appendChild(spinner);
            console.log(`Fetched ${name}`);
        }
        spinner.style.display = 'none';
        button.textContent = 'Done';
        button.remove();
        const popup = document.createElement('div');
        Object.assign(popup.style, {
            position: 'fixed',
            top: '50%',
            left: '50%',
            transform: 'translate(-50%, -50%)',
            backgroundColor: '#fff',
            border: '1px solid #ccc',
            padding: '20px',
            zIndex: '9999',
            boxShadow: '0 0 10px rgba(0, 0, 0, 0.1)',
            maxHeight: '90vh',
            overflowY: 'auto',
        });
        const heading = document.createElement('h3');
        heading.textContent = `Code Spotting Statistics for User ${userId}`;
        popup.appendChild(heading);
        stats.forEach(({ name, spotted, total, percentage, barHTML }) => {
            const statDiv = document.createElement('div');
            statDiv.style.marginBottom = '15px';
            const statText = document.createElement('p');
            statText.textContent = `${name}: ${spotted} / ${total} (${percentage}%)`;
            statDiv.appendChild(statText);
            const barContainer = document.createElement('div');
            barContainer.innerHTML = barHTML;
            statDiv.appendChild(barContainer);
            popup.appendChild(statDiv);
        });
        const closeButton = document.createElement('button');
        closeButton.textContent = 'Close';
        Object.assign(closeButton.style, {
            marginTop: '10px',
            padding: '5px 10px',
            backgroundColor: '#dc3545',
            color: '#fff',
            border: 'none',
            borderRadius: '3px',
            cursor: 'pointer',
        });
        closeButton.addEventListener('click', () => popup.remove());
        popup.appendChild(closeButton);
        document.body.appendChild(popup);
    });
})();