Troopcounter

Simple custom made troopcounter

目前為 2024-08-12 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Troopcounter
// @namespace    http://tampermonkey.net/
// @version      2024-08-13
// @description  Simple custom made troopcounter
// @author       Vonk
// @match        https://*.grepolis.com/game/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    $(document).ready(function () {
        addTroopCounterButton();
        setTimeout(function () {
            if (localStorage.getItem(storagetoken) !== null && localStorage.getItem(storagekey) !== null) {
                fetchData();
                setInterval(fetchData, 600000);
            }
        }, 10000);

        const worldId = Game.world_id;

        const storagetoken = `token_${worldId}`;
        const storagekey = `key_${worldId}`;


        function addTroopCounterButton() {
            if (document.getElementById('troopCounterButton') == null) {
                var a = document.createElement('div');
                a.id = "troopCounterButton";
                a.className = 'btn_settings circle_button_small';
                a.style.top = '90px';
                a.style.right = '57px';
                a.style.zIndex = '10000';
                a.innerHTML = "T";
                document.getElementById('ui_box').appendChild(a);
                $("#troopCounterButton").click(function () {
                    createTroopcounterWindow();
                });
            }
        }

        var troops = [
            { "id": 1, "name": "sword" },
            { "id": 2, "name": "archer" },
            { "id": 3, "name": "hoplite" },
            { "id": 4, "name": "slinger" },
            { "id": 5, "name": "rider" },
            { "id": 6, "name": "chariot" },
            { "id": 7, "name": "catapult" },
            { "id": 8, "name": "godsent" },
            { "id": 9, "name": "manticore" },
            { "id": 10, "name": "harpy" },
            { "id": 11, "name": "pegasus" },
            { "id": 12, "name": "griffin" },
            { "id": 13, "name": "cerberus" },
            { "id": 14, "name": "minotaur" },
            { "id": 15, "name": "medusa" },
            { "id": 16, "name": "zyklop" },
            { "id": 17, "name": "centaur" },
            { "id": 18, "name": "sea_monster" },
            { "id": 19, "name": "ladon" },
            { "id": 20, "name": "spartoi" },
            { "id": 21, "name": "small_transporter" },
            { "id": 22, "name": "big_transporter" },
            { "id": 23, "name": "bireme" },
            { "id": 24, "name": "attack_ship" },
            { "id": 25, "name": "trireme" },
            { "id": 26, "name": "colonize_ship" },
            { "id": 27, "name": "siren" },
            { "id": 28, "name": "fury" },
            { "id": 29, "name": "demolition_ship" },
            { "id": 30, "name": "satyr" },
            { "id": 31, "name": "calydonian_boar" }
        ];

        function createTroopcounterWindow() {
            var windowExists = false;
            var windowItem = null;
            for (var item of document.getElementsByClassName('ui-dialog-title')) {
                if (item.innerHTML == "TroopCounter") {
                    windowExists = true;
                    windowItem = item;
                }
            }
            if (!windowExists) {
                var wnd = Layout.wnd.Create(Layout.wnd.TYPE_DIALOG, "TroopCounter");
                wnd.setContent('');
            }
            for (var item of document.getElementsByClassName('ui-dialog-title')) {
                if (item.innerHTML == "TroopCounter") {
                    windowItem = item;
                }
            }
            wnd.setHeight('500');
            wnd.setWidth('750');
            wnd.setTitle("TroopCounter");
            var title = windowItem;
            var frame = title.parentElement.parentElement.children[1].children[4];
            frame.innerHTML = '';



            var html = document.createElement('html');
            var body = document.createElement('div');
            var head = document.createElement('head');
            var element = document.createElement('h3');
            element.innerHTML = "TroopCounter";
            element.style.margin = '0 auto';
            body.appendChild(element);

            var tableContainer = document.createElement('div');
            tableContainer.style.height = '300px';
            tableContainer.style.overflowY = 'auto';

            var table = document.createElement('table');
            table.id = "troopcounterTable";
            table.style.overflowX = 'scroll';

            tableContainer.appendChild(table);
            var headerRow = document.createElement('tr');
            var playernameHeader = document.createElement('th');
            playernameHeader.textContent = 'Playername';
            headerRow.appendChild(playernameHeader);

            troops.forEach(function (troop) {
                var th = document.createElement('th');
                var spanElement = document.createElement('span');
                spanElement.setAttribute('class', 'unit index_unit unit_icon40x40 ' + troop.name);
                th.appendChild(spanElement);
                headerRow.appendChild(th);
            });

            table.appendChild(headerRow);


            body.appendChild(tableContainer);
            frame.appendChild(body);

            // Add login inputs
            var loginDiv = document.createElement('div');
            loginDiv.style.marginTop = "10px";
            loginDiv.innerHTML = `
                        Token: <input type="text" id="token"><br>
                        Key: <input type="text" id="key"><br>
                        <button id="saveButton">Save token & key</button>
                        <button id="loadButton">Laad troepenoverzicht</button>
                        <button id="fetchData">Update eigen data</button>`;
            frame.appendChild(loginDiv);

            var discordButton = document.createElement('button');
            discordButton.innerHTML = 'Join Discord';
            discordButton.style.marginTop = '10px';
            discordButton.style.float = 'right';
            discordButton.onclick = function() {
                window.open('https://discord.gg/rvETEWWQmf', '_blank');
            };

            frame.appendChild(discordButton);

            if (localStorage.getItem(storagetoken) !== null && localStorage.getItem(storagekey) !== null) {
                document.getElementById('token').value = localStorage.getItem(storagetoken);
                document.getElementById('key').value = localStorage.getItem(storagekey);
            };

            frame.appendChild(loginDiv);
            document.getElementById('saveButton').addEventListener('click', function () {
                var token = document.getElementById('token').value;
                var key = document.getElementById('key').value;
                localStorage.setItem(storagetoken, token);
                localStorage.setItem(storagekey, key);

                setTimeout(function () {
                    location.reload();
                }, 1000);
            });



            // Event listener for login button

            // Event listener for load button
            document.getElementById('loadButton').addEventListener('click', function () {
                fetchTroopCountData();
            });
            document.getElementById('fetchData').addEventListener('click', function () {
                fetchData();
            });
        }

        function fetchTroopCountData() {
            var token = localStorage.getItem(storagetoken);
            var key = localStorage.getItem(storagekey);
            if (!token || !key) {
                console.log('No token & key filled in.');
                return;
            }

            var link = `https://localhost:7003/api/Group/GetGroupPlayersWithTroops?token=${token}&key=${key}&troopTypeStr=all`;

            fetch(link)
                .then(response => response.json())
                .then(data => {
                    updateTroopCounts(data.players);
                })
                .catch(error => {
                    console.error('Error fetching troop count data:', error);
                });
        }

        function createPlayerRow(player) {
            // Check if the player already exists in the table
            var existingRow = document.getElementById('player-' + player.id);
            if (existingRow) {
                // Update existing row with player information
                updatePlayerRow(existingRow, player);
                return existingRow;
            }

            // If the player doesn't exist, create a new row
            var row = document.createElement('tr');
            row.id = 'player-' + player.id;

            var playerNameCell = document.createElement('td');
            playerNameCell.textContent = player.name;
            row.appendChild(playerNameCell);

            // Create a map to store the troop counts for easy lookup
            var troopCountMap = {};
            player.troops.forEach(function (troop) {
                troopCountMap[troop.name] = troop.count;
            });

            troops.forEach(function (troop) {
                var cell = document.createElement('td');
                cell.style.textAlign = "center";

                // If troop count exists in the troop count map, add it to the cell
                if (troopCountMap.hasOwnProperty(troop.name)) {
                    cell.textContent = troopCountMap[troop.name];
                } else {
                    cell.textContent = "0"; // Set count to 0 if not found
                }

                row.appendChild(cell);
            });

            return row;
        }

        function updateTroopCounts(data) {
            var table = document.querySelector('#troopcounterTable'); // Assuming you have only one table in your page
            data.forEach(player => {
                var row = createPlayerRow(player);
                table.appendChild(row);
            });
        }

        function updatePlayerRow(row, player) {
            var playerNameCell = row.querySelector('td:first-child');
            playerNameCell.textContent = player.name;

            var troopCountMap = {};
            player.troops.forEach(function (troop) {
                troopCountMap[troop.name] = troop.count;
            });

            var cells = row.querySelectorAll('td:not(:first-child)');
            cells.forEach(function (cell, index) {
                var troop = troops[index];
                if (troopCountMap.hasOwnProperty(troop.name)) {
                    cell.textContent = troopCountMap[troop.name];
                } else {
                    cell.textContent = "0";
                }
            });
        };

        function createPlayer() {
            const playerId = Game.player_id;
            const playerName = Game.player_name;
            const allianceId = Game.alliance_id;
            const allianceName = MM.getModels().Player[Game.player_id].attributes.alliance_name;

            let formattedData = {
                id: playerId,
                name: playerName,
                allianceId: allianceId,
                allianceName: allianceName,
                token: localStorage.getItem(storagetoken),
                key: localStorage.getItem(storagekey)
            };

            fetch(`https://localhost:7003/api/Player/CreatePlayer`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(formattedData)
            })
                .then(response => {
                    if (!response.ok) {
                        throw new Error('Failed to add player');
                    }
                    console.log('Player added successfully');
                    setTimeout(fetchData, 5000);
                })
                .catch(error => {
                    console.error('Error adding player:', error);
                });
        }

        function fetchData() {
            const playerId = Game.player_id

            let townsObject = ITowns.getTowns();
            let cl = MM.getModels().Player[Game.player_id].attributes.cultural_step;
            let lastUpdated = Date.now().toString();

            let townsData = Object.values(townsObject).map(town => {
                // Fetch home troops
                let homeUnits = town.units();
                let troopsInTown = [];

                // Fetch outer troops
                let outerUnits = town.unitsOuter();
                let outerTroopsInTown = [];

                // Extract home troops for the town if available
                if (homeUnits) {
                    troopsInTown = Object.keys(homeUnits).map(unitType => ({
                        name: unitType,
                        count: homeUnits[unitType]
                    }));
                }

                // Extract outer troops for the town if available
                if (outerUnits) {
                    outerTroopsInTown = Object.keys(outerUnits).map(unitType => ({
                        name: unitType,
                        count: outerUnits[unitType]
                    }));
                }

                return {
                    id: town.id,
                    name: town.name,
                    points: town.getPoints(),
                    availableTroopsInTown: troopsInTown,
                    outerTroopsInTown: outerTroopsInTown
                };
            });

            let formattedData = {
                token: localStorage.getItem(storagetoken),
                key: localStorage.getItem(storagekey),
                lastUpdated: lastUpdated,
                culturalLevel: cl,
                townRequests: townsData
            };

            fetch(`https://localhost:7003/api/Player/AddTownsToPlayer?playerId=${playerId}`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(formattedData)
            })
                .then(async response => {
                    if (!response.ok) {
                        var errorMessage = await response.text();
                        if (errorMessage && errorMessage === "Player doesn't exist") {
                            console.log('Failed due to player not existing, creating player');
                            createPlayer();
                        }
                    } else {
                        console.log('Towns data sent successfully');
                    }
                })
                .catch(error => {
                    console.error('Error sending towns data:', error);
                });
        };
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址