Habitica Chat Window Toggle Spells

Adds spell toggle to HabitRPG/Habitica

// ==UserScript==
// @name Habitica Chat Window Toggle Spells
// @version 0.6
// @description Adds spell toggle to HabitRPG/Habitica
// @namespace HabiticaChatSpellToggle
// @match https://habitica.com/*
// @noframes
// @grant none

// ==/UserScript==

// overlay on/off chat button

var PARTY_URL = "#/options/groups/party";
var TOGGLE_LOCAL_STORAGE_ID = "HabiticaChatSpellToggleHideAll";

var QUICKPARTY_BUTTON_ID = "HabiticaChatSpellToggleQuickParty";
var QUICKPARTY_BUTTON_SELECTOR = "#" + QUICKPARTY_BUTTON_ID;
var QUICKPARTY_BUTTON_HTML = "<li class='toolbar-button'><a id='" + QUICKPARTY_BUTTON_ID + "' ui-sref='options.social.party' href='#/options/groups/party'><span>? Party</span></a></li>";

var TOGGLE_BUTTON_ID = "HabiticaChatSpellToggle";
var TOGGLE_BUTTON_SELECTOR = "#" + TOGGLE_BUTTON_ID;
var TOGGLE_BUTTON_HTML = "<button type='button' id='" + TOGGLE_BUTTON_ID + "' style='margin-right: 9px'>Loading...</button>";


var TOGGLE_BUTTON_TEXT = {
    false: "Show Spells",
    true: "Hide Spells"
};
var groupChatWatch = null;

$.fn.exists = function() {
    return this.length !== 0;
};

var watcher = function(test, init) {
    var attempts=100;
    var initWatcher = setInterval(function() {
        if(attempts-- <= 0) {
            console.log('Giving up');
            clearInterval(initWatcher);
        }
        else if (test()) {
            clearInterval(initWatcher);
            init();
        }
        else {
            console.log('Attempts left: ', attempts, '\tWatching for ', test.toString().replace(/(\r\n|\n|\r|\t| )+/g," "));        
        }
    }, 100);
};

var preformattedMessages = function() {
    return $('li').has('code');
};

var hideAll = function(newValue) {
    if (newValue !== undefined) {
        localStorage.setItem(TOGGLE_LOCAL_STORAGE_ID, newValue);
    }

    return localStorage.getItem(TOGGLE_LOCAL_STORAGE_ID) === "true";
};

var applyStyleAndUpdateButtonLabel = function() {
    watcher(function() {
        return $("#loading-bar").is(":visible") === false;
    },
            function() {
        console.log("applyStyleAndUpdateButtonLabel");

        var hide = hideAll();

        $(TOGGLE_BUTTON_SELECTOR).text(TOGGLE_BUTTON_TEXT[!hide]);

        if (hide) {
            preformattedMessages().hide();
        } else {
            preformattedMessages().show();
        }
    });
};

var groupScope = function() {
    var elem = $("div.party.ng-scope");

    if (!elem)
        return null;

    return elem.scope();
};

var chatChanged2 = function(b,c) {
    console.log("Chat Changed ");

    applyStyleAndUpdateButtonLabel();
};

var installOnPartyScreen = function() {
    // general
    watcher(function() {
        return $(".toolbar-nav").length > 0;
    }, function() {
        if ($(QUICKPARTY_BUTTON_SELECTOR).length === 0) {
            console.log("Installing QuickParty Button in Main Menu");

            $(".toolbar-nav").append(QUICKPARTY_BUTTON_HTML);
        }
    });

    // tab specific
    if (window.location.hash === PARTY_URL) {

        watcher(function() {
            return groupScope() && !groupScope().group.loadingParty;
        }, function() {

            if (!$(TOGGLE_BUTTON_SELECTOR).exists()) {
                console.log("Watching group.chat...");

                // dispose existing binding
                if(groupChatWatch) {
                    groupChatWatch();
                }

                groupChatWatch = groupScope().$watch("group.chat", chatChanged2, true);

                console.log("Installing Toggle Button on Party Screen...");

                // any time you trigger any of the buttons you should trigger applyStyleAndUpdateButtonLabel
                var chatButtons = $("div.chat-buttons").first();
                chatButtons.children().click(applyStyleAndUpdateButtonLabel);

                // insert new button
                chatButtons.prepend(TOGGLE_BUTTON_HTML);

                // hide/show all first time
                applyStyleAndUpdateButtonLabel();

                // don't toggle to avoid confusion from newer messages
                $(TOGGLE_BUTTON_SELECTOR).click(function() {

                    //var visible = preformattedMessages().is(":visible");
                    var hide = hideAll();
                    hideAll(!hide);

                    applyStyleAndUpdateButtonLabel();
                });
            }
        });
    }
};

watcher(function() {
    return angular;
}, function() {
    $(window).on('hashchange', installOnPartyScreen);

    installOnPartyScreen();
});

QingJ © 2025

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