拡張機能マネージャー

ユーザーによる動的な設定が必要な複数のユーザースクリプトを管理します。

// ==UserScript==
// @name         拡張機能マネージャー
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @license      MIT
// @description  ユーザーによる動的な設定が必要な複数のユーザースクリプトを管理します。
// @author       You
// @match        *.x-feeder.info/*/
// @match        *.x-feeder.info/*/sp/
// @exclude      *.x-feeder.info/*/settings/*
// @match        http://drrrkari.com/room/
// @match        http://www.3751chat.com/ChatRoom*
// @match        https://pictsense.com/*
// @match        http://www.himachat.com/
// @match        https://discord.com/*
// @match        https://*.open2ch.net/*
// @require      http://code.jquery.com/jquery-3.5.1.min.js
// @require      https://greasyfork.org/scripts/419945-global-managedextensions/code/Global_ManagedExtensions.js?version=889360
// @require      https://greasyfork.org/scripts/419888-antimatterx/code/antimatterx.js?version=889299
// @require      https://greasyfork.org/scripts/417889-sendmessage/code/sendMessage.js?version=876786
// @grant        none
// ==/UserScript==

(function(unsafeWindow) {
    'use strict';
    /*-------------------------------------------------- カスタマイズ領域 --------------------------------------------------*/
    var fontColor = "white", // 文字色
        backgroundColor = "rgba(0, 0, 0, 0.7)"; // 背景色
    /*------------------------------------------------------------------------------------------------------------------*/
    var $ = window.$,
        amx = window.antimatterx,
        sendMessage = window.sendMessage;
    //--------------------------------------------------
    var h = $("<div>").css({
            position: "fixed",
            zIndex: "99999",
            top: "0",
            left: "0",
            display: "inline-block"
        }).appendTo("body"),
        container = $("<div>").text("拡張機能マネージャー").css({
            padding: "1em",
            paddingTop: "3em",
            color: fontColor,
            backgroundColor: backgroundColor,
            width: "22em",
            height: "100vh",
            maxWidth: "90vw",
            overflow: "scroll",
            textAlign: "left",
            fontSize: "1em"
        }).appendTo(h),
        toggleBtn = $(amx.addInputBool(h[0], {
            title: "拡張機能",
            insertBefore: true,
            change: function(flag) {
                h.css("left", flag ? 0 : -h.width() * 1.4);
            }
        })).css({
            position: "fixed",
            left: "0",
            maxWidth: "100%"
        }),
        selectHolder = $("<div>").appendTo(container).after("<br>"),
        content = $("<div>").appendTo(container);
    h.css({
        transition: "all .5s",
        left: -h.width() * 1.4
    });
    //--------------------------------------------------
    function getList() { // Global_ManagedExtensionsからリストを取得する
        var exts = unsafeWindow.Global_ManagedExtensions,
            configList = {}, // 初期化関数のリスト
            extList = { // 拡張機能のリスト
                "▼拡張機能を選択": null
            },
            tagList = { // タグ付けされた拡張機能のリスト
                "▼タグから選択": null,
                "すべて": Object.keys(exts)
            };
        Object.keys(exts).forEach(function(k) {
            configList[k] = (amx.isType(exts[k], "Function") ? exts[k] :
                amx.isType(exts[k], "Object") && amx.isType(exts[k].config, "Function") ? exts[k].config :
                undefined);
            extList[k] = k;
            if (!amx.isType(exts[k], "Object")) return;
            var tag = exts[k].tag;
            if (amx.isType(tag, "String")) tagList[tag] = (tagList[tag] || []).concat([k]);
            amx.initType(tag, []).forEach(function(v) {
                tagList[v] = (tagList[v] || []).concat([k]);
            });
        });
        Object.keys(tagList).forEach(function(k) {
            if (amx.isType(tagList[k], "Array")) tagList[k] = JSON.stringify(tagList[k]);
        });
        return {
            configList: configList,
            extList: extList,
            tagList: tagList
        };
    };
    var lists = getList();

    function updateSelect() {
        var nowLists = getList();
        Object.keys(nowLists.configList).forEach(function(k) {
            lists.configList[k] = nowLists.configList[k];
            lists.extList[k] = nowLists.extList[k];
        });
        Object.keys(nowLists.tagList).forEach(function(k) {
            lists.tagList[k] = nowLists.tagList[k];
        });
        selectHolder.find("select").each(function(i, e) {
            amx.triggerEvent(e, "updateselect");
        });
    };
    amx.addSelect(selectHolder[0], {
        list: lists.extList,
        width: "90%",
        change: function(v) {
            content.empty();
            if (/^(|null)$/.test(v)) return;
            var config = lists.configList[v];
            if (config !== undefined) content.append(config(sendMessage));
            selectHolder.find("select").last().val(null);
        }
    });
    amx.addSelect(selectHolder[0], {
        list: lists.tagList,
        width: "90%",
        change: function(v) {
            content.empty();
            if (/^(|null)$/.test(v)) return;
            JSON.parse(v).forEach(function(k, i) {
                var config = lists.configList[k];
                if (config !== undefined) $("<div>").text(++i + ". " + k).appendTo(content).append(config(sendMessage)).after("<br><br>");
            });
            selectHolder.find("select").first().val(null);
        }
    });
    selectHolder.find("select").on("click mouseover", updateSelect);
    updateSelect();
    //--------------------------------------------------
})(this.unsafeWindow || window);