Grepolis tripjes detector

Laat op het profiel van een speler of op het eiland scherm zien welke steden wel/geen trip hebben

当前为 2025-01-23 提交的版本,查看 最新版本

// ==UserScript==
// @name         Grepolis tripjes detector
// @version      2025-01-23
// @description  Laat op het profiel van een speler of op het eiland scherm zien welke steden wel/geen trip hebben
// @author       archdukeDaan
// @match        https://*.grepolis.com/*
// @license      MIT
// @namespace    https://tampermonkey.net/
// @grant        none
// ==/UserScript==

/////////////////////////////////////////////////////////////
// MAP ENHANCER VEREIST
/////////////////////////////////////////////////////////////

(function() {
    'use strict';

    // vul hier de allianties in
    // alleen deze allianties krijgen een trip tag op het eiland informatie scherm
    var allianties = [
        {   "naam":"Bruin Café",
            "id": 11
        },
        {   "naam":"De Librije",
            "id": 181
        },
        {   "naam":"Passionele Nachten",
            "id": 307
        },
        {   "naam":"Engnekken",
            "id": 255
        },
        {   "naam":"Brain Drain",
            "id": 82
        },
    ]

    // kies hier of je wil dat de trip tags automatisch verschijnen, of dat je het handmatig wil aanklikken.
    // auto = true : als je een eiland informatie scherm opent, staat er automatisch bij iedere stad een trip tag.
    // auto = false : als je een eiland informatie scherm opent, moet je zelf op de knop klikken voordat de trip tags verschijnen.
    var auto = true

    // timer om te checken of de knop moet worden geplaatst
    // er kan maar maximaal 1 profiel tegelijk open staan
    setTimeout(function checkProfielWindowOpen() {
        if (document.getElementById("player_towns") != null) {
            if (document.getElementById("tripknopProfiel") == null){
                addTripKnop('profiel')
            }
        }
        setTimeout(checkProfielWindowOpen, 500);
    }, 500);

    // timer om te checken of tags op de kaart moeten worden geupdate
    setTimeout(function checkTagsOpKaart() {
        generateTripjesOpKaart()
        setTimeout(checkTagsOpKaart, 1000);
    }, 5000);

    // timer om te checken of de knop moet worden geplaatst
    // er kunnen meerdere eilanden vensters tegelijk open staan
    setTimeout(function checkEilandWindowOpen() {
        if (document.getElementsByClassName("island_info_wrapper") != null) {
            // verkrijg alle openstaande eiland vensters
            var vensters = getAllOpenEilandVensters()
            for(let i=0;i<vensters.length;i++){
                var venster = vensters[i]
                // check of dit eiland venster al een knop heeft
                if (venster.querySelector("#tripknopEiland") == null){
                    addTripKnop('eiland',venster)
                }
            }
        }
        setTimeout(checkEilandWindowOpen, 500);
    }, 500);

    function addTripKnop(knop_type,venster) {
        var button = document.createElement('span');
        button.textContent = 'Tripjes';
        button.style.zIndex = 1000;
        button.style.width = '50px'
        button.style.padding = '4px';
        button.style.marginTop = '4px'
        button.style.marginBottom = '4px'
        button.style.color = 'white';
        button.style.border = '1px solid black';
        button.style.borderRadius = '5px';
        button.style.cursor = 'pointer';
        button.style.marginLeft = '15px';

        if (knop_type == 'profiel'){
            button.addEventListener('click', function(){
                generateTripjesOpProfiel();
            }, false);
            button.setAttribute('id', 'tripknopProfiel');

            // voeg de knop als tweede element toe aan de game_header van de stedenlijst op het profiel
            var profiel = document.getElementById("player_towns")
            var element = profiel.children[0].querySelector('.game_header');
            element.insertBefore(button,element.children[0]);

        } else if (knop_type == 'eiland'){
            button.addEventListener('click', function(){
                generateTripjesOpEiland(venster);
            }, false);
            button.setAttribute('id', `tripknopEiland`);
            button.style.backgroundColor = 'blue';

            var eiland_controls = venster.querySelector("#island_towns_controls")
            eiland_controls.appendChild(button)
            if (auto == true){
                button.click()
            }
        }
        console.log("Trip knop toegevoegd!")
    }

    function getHuidigeSpeler(){
        var playerObj = MM.getModels().Player
        var player = Object.values(playerObj)[0].attributes;
        var huidigeSpeler = player.name
        return huidigeSpeler
    }

    function getTripLijst(){
        // verkrijg alle tripjes en stop ze in een lijst
        const steden_met_troepen_buiten = ITowns.all_supporting_units.fragments

        var triplijst = []

        Object.values(steden_met_troepen_buiten).forEach((stad) => {
            var tripjes = stad.models
            tripjes.forEach((trip) => {
                var trip_info = trip.attributes

                var stad_naam = trip_info.current_town_name
                var stad_speler = trip_info.current_town_player_name
                var stad_id = trip_info.current_town_id
                //var trip_stad_herkomst = trip_info.home_town_name

                var row = {"stad_naam":stad_naam,"stad_speler":stad_speler,"stad_id":stad_id}
                triplijst.push( row )
            });
        });
        //console.log(triplijst)
        return triplijst
    }

    function getProfileName(){
        // verkrijg speler naam van het huidige profiel dat open staat
        var profiel = document.getElementById("player_info").children
        var naam = ""
        for(let i=0;i<profiel.length;i++){
            var el = profiel[i]
            if (el.tagName == "H3"){
                naam = el.innerHTML
                break
            }
        }
        return naam
    }

    function getStedenLijstOpProfiel(){
        // verkrijg stedenlijst dom element van een speler zn profiel
        var profiel_steden = document.getElementById("player_towns").children[0].children
        var steden = false
        for(let i=0;i<profiel_steden.length;i++){
            var el2 = profiel_steden[i]
            if (el2.tagName == "UL"){
                steden = el2.children
                break
            }
        }
        //console.log(steden)
        return steden
    }

    function getStedenLijstOpEiland(venster){
        // verkrijg stedenlijst dom element van een eiland
        var eiland_steden = venster.querySelector("#island_info_towns_left_sorted_by_name").children
        //console.log(steden)
        return eiland_steden
    }

    function getAlliantieFromLink(stad_obj){
        // verkrijg de alliantie van de eigenaar van een stad vanuit de GP link DOM element
        // als speler geen alliantie heeft, return -1
        if (stad_obj.querySelector('.gp_alliance_link') != null){
            var link_as_str = stad_obj.querySelector('.gp_alliance_link').outerHTML;
            var alliantie = link_as_str.split("Layout.allianceProfile.open")[1].split(",")[1].split(")")[0]
            return alliantie
        } else {
            return -1
        }
    }

    function getAlliantieFromKaart(stad_obj){
        if (stad_obj.querySelector('.alliance_name') != null){
            return stad_obj.querySelector('.alliance_name').innerHTML
        } else {
            return ""
        }
    }

    function getAllOpenEilandVensters(){
        var vensters = document.getElementsByClassName("island_info_wrapper")
        return vensters
    }

    function generateTripjesOpEiland(venster){
        // indien van toepassing, verwijder de oude tags op het eiland informatie scherm
        venster.querySelector("#island_info_towns_left_sorted_by_name").querySelectorAll('.tripTag').forEach(e => e.remove());

        // verkrijg stedenlijst op het eiland
        var steden = getStedenLijstOpEiland(venster)

        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // loop over de steden en voeg tag 'geen trip' toe als de stadsnaam niet in triplijst staat
        for (let k=0; k < steden.length; k++){
            var stad_obj = steden[k]
            var stad_naam = stad_obj.querySelector(".gp_town_link").innerHTML;
            var stad_eigenaar_dom = stad_obj.querySelector(".gp_player_link")
            var stad_eigenaar = "Spookstad"
            if (stad_eigenaar_dom != null){
                stad_eigenaar = stad_eigenaar_dom.innerHTML;
            }
            var stad_alliantie = getAlliantieFromLink(stad_obj);

            // plaats geen tag als de stad van de huidige speler is
            // plaats geen tag als de alliantie van de eigenaar van de stad niet in de alliantie lijst staat
            if ( (stad_eigenaar != getHuidigeSpeler()) & (allianties.findIndex( e => e.id == stad_alliantie) > -1) ){
                var tag = document.createElement('div');
                tag.style.zIndex = 1000;
                tag.style.cursor = 'pointer';
                tag.setAttribute('class','tripTag')
                tag.style.fontWeight = 'bold';
                tag.style.marginLeft = '10px';
                // kijk of er een trip in de stad ligt
                var j = triplijst.findIndex( e => (e.stad_naam == stad_naam) && (e.stad_speler == stad_eigenaar) )
                if (j>-1){
                    tag.textContent = "Wel trip";
                    tag.style.color = 'green'
                } else {
                    tag.textContent = "Geen trip";
                    tag.style.color = 'red'
                }
                // voeg de tag toe aan de DOM
                steden[k].appendChild(tag);
            }
        }
    }

    function generateTripjesOpProfiel(){
        // indien van toepassing, verwijder de oude tags op het profiel
        document.getElementById("player_towns").querySelectorAll('.tripTag').forEach(e => e.remove());

        // verkrijg naam op het profiel
        var naam = getProfileName()

        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // verkrijg stedenlijst op het profiel
        var steden = getStedenLijstOpProfiel()

        // loop over de steden en voeg tag 'geen trip' of 'wel trip' toe
        for (let k=0; k < steden.length; k++){
            var stad = steden[k].children[1]
            var stad_naam = stad.innerHTML

            var tag = document.createElement('span');
            tag.style.zIndex = 1000;
            tag.style.cursor = 'pointer';
            tag.setAttribute('class','tripTag')
            tag.style.fontWeight = 'bold';

            // kijk of er een trip in de stad ligt
            var j = triplijst.findIndex( e => (e.stad_naam == stad_naam) & (e.stad_speler == naam) )
            if (j>-1){
                tag.textContent = "Wel trip";
                tag.style.color = 'green'
            } else {
                tag.textContent = "Geen trip";
                tag.style.color = 'red'
            }
            // voeg de tag toe aan de DOM
            steden[k].appendChild(tag)
        }

    }

    function generateTripjesOpKaart(){
        // verkrijg de triplijst
        var triplijst = getTripLijst()

        // verkrijg de steden op de kaart
        var steden_kaart = document.getElementById("map_towns")
        var steden_op_kaart = steden_kaart.querySelectorAll('a[id^="town_"]');

        for (let i=0; i<steden_op_kaart.length;i++) {
            var stad = steden_op_kaart[i]

            var stad_alliantie = -1//getAlliantieFromKaart(stad).trim()

            if (allianties.findIndex( e=> e.naam == stad_alliantie) == -1){
                // check of er al een tag staat
                if (stad.querySelector(".tripTag") == null){
                    var stad_id = stad.id.substring(5)

                    // tag
                    var tag = document.createElement('div');
                    tag.style.zIndex = 1000;
                    tag.style.cursor = 'pointer';
                    tag.setAttribute('class','tripTag')
                    tag.style.fontWeight = 'bold';
                    tag.style.width = '15px';
                    tag.style.height = '15px';
                    tag.style.borderRadius = '50%'
                    tag.style.position = 'relative';
                    tag.style.top = "60%";
                    tag.style.left = "70%";
                    tag.style.border = '2px solid black'

                    // kijk of er een trip in de stad ligt
                    var j = triplijst.findIndex( e => (e.stad_id == stad_id) )
                    if (j>-1){
                        tag.style.backgroundColor = 'green'
                    } else {
                        tag.style.backgroundColor = 'red'
                    }
                    stad.appendChild(tag)
                }
            }
        }
    }
})();