壁紙変更(Feederチャット)

Feederチャットの背景画像を変更するスクリプトです。

// ==UserScript==
// @name         壁紙変更(Feederチャット)
// @namespace    http://tampermonkey.net/
// @version      0.18
// @description  Feederチャットの背景画像を変更するスクリプトです。
// @author       You
// @match        *.x-feeder.info/*/
// @match        *.x-feeder.info/*/sp/
// @exclude      *.x-feeder.info/*/settings/**
// @require      https://greasyfork.org/scripts/396472-yaju1919/code/yaju1919.js?version=802405
// @require      https://greasyfork.org/scripts/387509-yaju1919-library/code/yaju1919_library.js?version=755144
// @require      https://greasyfork.org/scripts/388005-managed-extensions/code/Managed_Extensions.js?version=720959
// @grant        GM.setValue
// @grant        GM.getValue
// ==/UserScript==

(function(unsafeWindow) {
    'use strict';
    unsafeWindow.Managed_Extensions["壁紙変更"] = {
        config: (function() {
            var $ = unsafeWindow.$;
            var yaju1919 = window.yaju1919;
            var old_yaju1919 = yaju1919_library;
            var backgroundColor_copy = $("#wrapper").css("background-color"); // デフォルトの背景色をコピー
            var intervalId, filterElement; // intervalIdはsetIntervalのidを格納する変数、filterElementはフィルタの要素を格納する変数
            var h = $("<div>");
            //////////////////////////////////////////////////
            var inputChangeBool = yaju1919.addInputBool(h, { // 壁紙変更
                title: "壁紙変更",
                value: false,
                change: (function() {
                    main();
                })
            });
            h.append("<hr>");
            var inputImageUrls = yaju1919.addInputText(h, { // 画像URL
                save: "inputImageUrls",
                title: "画像URL",
                placeholder: "背景画像のURLを改行で区切って入力",
                width: "90%",
                textarea: true,
                change: (function() {
                    setTimeout((function() {
                        h.find("textarea").val([...new Set(inputImageUrls().split("\n").filter((function(v) {
                            return v.match(/^(https?|data):\/\/.+$/);
                        })))].join("\n"));
                        main();
                    }));
                })
            });
            var inputInterval_text = $("<div>").text("変更間隔: 5秒").appendTo(h);
            var inputInterval = old_yaju1919.appendInputRange(h, { // 変更間隔
                save: "inputInterval",
                width: "90%",
                value: 5,
                min: 5,
                max: 300,
                step: 1,
                change: (function() {
                    loadValue();
                    main("keep");
                })
            });
            // フィルタ関係の入力要素
            h.append("<br>フィルタの色: ");
            var inputColor = $("<input>", { // フィルタの色
                type: "color",
                value: "#000000"
            }).change(function() {
                yaju1919.save("inputColor", inputColor.val());
            }).appendTo(h);
            var inputOpacity_text = $("<div>").text("フィルタの不透明度: 0%").appendTo(h);
            var inputOpacity = old_yaju1919.appendInputRange(h, { // フィルタの不透明度
                save: "inputOpacity",
                width: "90%",
                value: 0,
                min: 0,
                max: 100,
                step: 1,
                change: (function() {
                    loadValue();
                    main("keep");
                })
            });
            //-----------------------
            h.append("<hr>");
            // 画像の加工関係の入力要素
            var inputBlur_text = $("<div>").text("ぼかしの強度: 0%").appendTo(h);
            var inputBlur = old_yaju1919.appendInputRange(h, { // ぼかしの強度
                save: "inputBlur",
                width: "90%",
                value: 0,
                min: 0,
                max: 100,
                step: 1,
                change: (function() {
                    loadValue();
                    main("keep");
                })
            });
            var inputBrightness_text = $("<div>").text("明度: 100%").appendTo(h);
            var inputBrightness = old_yaju1919.appendInputRange(h, { // 明度
                save: "inputBrightness",
                width: "90%",
                value: 100,
                min: 0,
                max: 200,
                step: 1,
                change: (function() {
                    loadValue();
                    main("keep");
                })
            });
            var inputSaturate_text = $("<div>").text("彩度: 100%").appendTo(h);
            var inputSaturate = old_yaju1919.appendInputRange(h, { // 彩度
                save: "inputSaturate",
                width: "90%",
                value: 100,
                min: 0,
                max: 200,
                step: 1,
                change: (function() {
                    loadValue();
                    main("keep");
                })
            });
            var inputSepia_text = $("<div>").text("セピア: 0%").appendTo(h);
            var inputSepia = old_yaju1919.appendInputRange(h, { // セピア
                save: "inputSepia",
                width: "90%",
                value: 0,
                min: 0,
                max: 100,
                step: 1,
                change: (function() {
                    loadValue();
                    main("keep");
                })
            });
            addBtn(h, "初期値", (function() { // 初期値
                if (!confirm("初期値に戻しますか?")) return;
                var ranges = $("input[type='range']");
                ranges.eq(2).val(0);
                ranges.eq(3).val(100);
                ranges.eq(4).val(100);
                ranges.eq(5).val(0);
                loadValue();
                main("keep");
            }));
            //-------------------------
            //////////////////////////////////////////////////
            setTimeout(loadValue); // setTimeoutで遅延して値を読み込む
            //////////////////////////////////////////////////
            // 汎用的な関数
            function timeConv(second) { // 秒数から分秒に変換する関数
                var min = Math.floor(second / 60);
                var sec = second % 60;
                var timeText = sec + "秒";
                if (min > 0) timeText = min + "分" + timeText;
                return timeText;
            };

            function addBtn(h, title, func) { // ボタンを追加する関数
                return $("<button>").text(title).click(func).appendTo(h);
            };
            //-------------
            // 処理的な関数
            function loadValue() { // 値を読み込む関数
                inputInterval_text.text("変更間隔: " + timeConv(inputInterval()));
                inputOpacity_text.text("フィルタの不透明度: " + inputOpacity() + "%");
                inputBlur_text.text("ぼかしの強度: " + inputBlur() + "%");
                inputBrightness_text.text("明度: " + inputBrightness() + "%");
                inputSaturate_text.text("彩度: " + inputSaturate() + "%");
                inputSepia_text.text("セピア: " + inputSepia() + "%");
                yaju1919.load("inputColor", (function(r) {
                    inputColor.val(r);
                }));
            };

            function setImage(data) { // 壁紙を設定する関数
                var imageIdx = inputImageUrls().split("\n").indexOf($("body").css("background-image").match(/^url\("((https?|data):\/\/.+)"\)$/)[1]);
                if (data === "keep") {
                    yaju1919.load("imageIdx", (function(r) {
                        imageIdx = r;
                    }));
                } else {
                    if (!inputImageUrls().split("\n")[imageIdx + 1]) imageIdx = 0;
                    else imageIdx++;
                    yaju1919.save("imageIdx", imageIdx);
                };
                $("#wrapper").css("background-color", "transparent");
                setTimeout((function() {
                    yaju1919.setBgImg(inputImageUrls().split("\n")[imageIdx], {
                        color: inputColor.val(),
                        opacity: inputOpacity() / 100
                    });
                }));
            };

            function removeImage() { // 壁紙を削除する関数
                if (filterElement) filterElement.remove();
                $("#wrapper").css("background-color", backgroundColor_copy);
                $("body").removeAttr("style");
                yaju1919.setBgImg(null, {
                    opacity: 0
                });
            };

            function setFilter() { // フィルタを設定する関数
                return $("<div>").css({
                    zIndex: "-114515",
                    background: "inherit",
                    filter: "blur(" + inputBlur() / 10 + "px) brightness(" + inputBrightness() + "%) saturate(" + inputSaturate() + "%) sepia(" + inputSepia() + "%)",
                    position: "fixed",
                    top: "0px",
                    left: "0px",
                    right: "0px",
                    bottom: "0px"
                }).appendTo("body");
            };

            function main(data) { // 設定用関数
                setTimeout((function() {
                    removeImage();
                    clearInterval(intervalId);
                    if (!inputChangeBool() || inputImageUrls() === "") return;
                    setImage(data);
                    filterElement = setFilter();
                    if (inputImageUrls().split("\n").length === 1) return;
                    intervalId = setInterval((function() {
                        setImage();
                    }), inputInterval() * 1000);
                }));
            };
            //-------------
            //////////////////////////////////////////////////
            return h;
        }),
        tag: "装飾"
    };
})(this.unsafeWindow || window);