Greasy Fork

koc chatv2

tester

当前为 2025-05-18 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/534027/1591171/koc%20chatv2.js

Tabs.TabDemo = {
    tabOrder: 8001,
    tabLabel: 'Truce/AP Monitor',
    tabColor: 'blue',
    myDiv: null,
    Options: {
        Counter: 0,
    },
    targets: [],

    init: function(div) {
        var t = Tabs.TabDemo;
        t.myDiv = div;

        if (!Options.TabDemo) {
            Options.TabDemo = t.Options;
        } else {
            for (var y in t.Options) {
                if (!Options.TabDemo.hasOwnProperty(y)) {
                    Options.TabDemo[y] = t.Options[y];
                }
            }
        }
    },

    hide: function() {
        var t = Tabs.TabDemo;
    },

    show: function() {
        var t = Tabs.TabDemo;
        t.loadTargets();
        t.displayTargetList();
    },

    paint: function() {
        var m = `
            <div class="divHeader" align="center">Truce/AP Monitor</div>
            <br>
            <div align="center">
                <label for="targetInput">Player Name/UID:</label>
                <input type="text" id="targetInput" class="btInput">
                <button id="addTargetButton" class="buttonv2 std blue">Add Target</button>
                <br><br>
                <div id="targetList"></div> <br>
                <div id="truceMonitorStatus"></div>
            </div>
        `;

        this.myDiv.innerHTML = m;

        // Event listeners
        var self = this;
        $("#addTargetButton").click(function() {
            self.addTarget();
        });
    },

    addTarget: function() {
        var targetInput = $("#targetInput").val().trim();
        if (targetInput === "") {
            return;
        }

        var self = this;
        getPlayerInfo(targetInput)
            .then(function(player) {
                if (player) {
                    self.targets.push(player);
                    self.saveTargets();
                    self.displayTargetList();
                    self.updateStatus(tx("Target added."));
                } else {
                    self.updateStatus(tx("Player not found."));
                }
            })
            .catch(function(error) {
                self.updateStatus(tx("Error adding target: ") + error.message);
            });

        $("#targetInput").val(""); // Clear input field
    },

    displayTargetList: function() {
        var targetList = $("#targetList");
        targetList.empty();

        if (this.targets.length === 0) {
            targetList.append("<p>No targets are currently being monitored.</p>");
            return;
        }

        var html = "<ul>";
        this.targets.forEach(function(target) {
            html += `<li>${target.name} (${target.uid})</li>`;
        });
        html += "</ul>";
        targetList.html(html);
    },

    checkTrucesAndAP: function() {
        var self = this;
        this.targets.forEach(function(target) {
            var truceEnds = getTruceEndTime(target);
            var apEnds = getAPEndTime(target);

            if (truceEnds) {
                self.displayTruceInfo(target, truceEnds);
            }

            if (apEnds) {
                self.displayAPInfo(target, apEnds);
            }
        });
    },

    displayTruceInfo: function(target, endTime) {
        var timeLeft = endTime - unixTime();
        if (timeLeft <= 0) {
            this.notifyTruceEnded(target);
        } else {
            var hours = Math.floor(timeLeft / 3600);
            var minutes = Math.floor((timeLeft % 3600) / 60);
            $("#targetList").append(
                `<p>${target.name}'s truce ends in ${hours}h ${minutes}m</p>`
            );
        }
    },

    displayAPInfo: function(target, endTime) {
        var timeLeft = endTime - unixTime();
        if (timeLeft <= 0) {
            this.notifyAPEnded(target);
        } else {
            var hours = Math.floor(timeLeft / 3600);
            var minutes = Math.floor((timeLeft % 3600) / 60);
            $("#targetList").append(
                `<p>${target.name}'s AP ends in ${hours}h ${minutes}m</p>`
            );
        }
    },

    notifyTruceEnded: function(target) {
        this.updateStatus("Target " + target.name + "'s truce has ended!");
        this.playNotificationSound();
    },

    notifyAPEnded: function(target) {
        this.updateStatus("Target " + target.name + "'s AP has ended!");
        this.playNotificationSound();
    },

    updateStatus: function(message) {
        $("#truceMonitorStatus").html(message);
    },

    saveTargets: function() {
        GM_setValue("truceTargets", JSON.stringify(this.targets));
    },

    loadTargets: function() {
        var savedTargets = GM_getValue("truceTargets", "[]");
        this.targets = JSON.parse(savedTargets);
    },

    playNotificationSound: function() {
        var audio = new Audio("/sounds/notification.mp3");
        audio.play();
    },

    hide: function() {
        // Clear interval when hiding
        if (this.checkInterval) {
            clearInterval(this.checkInterval);
        }
    },

    EverySecond: function() {
        this.checkTrucesAndAP();
    }
};