Habitica Chat Window Toggle Spells

Adds spell toggle to HabitRPG/Habitica

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();
});