Dev_Multi_Open2

Easier Opening in Deviantart Notification Center

Ekde 2019/10/28. Vidu La ĝisdata versio.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Dev_Multi_Open2
// @namespace    http://phi.pf-control.de/apps/userscripts
// @version      1.0
// @description  Easier Opening in Deviantart Notification Center
// @author       Dediggefedde
// @match        https://www.deviantart.com/notifications/*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// @require      http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js
// @grant        GM.xmlHttpRequest
// ==/UserScript==
/* globals $*/

(function () {
    'use strict';

    var selfTrg = false;
    var selContainer;
    var selectees = "div._1FZFD>div,div.CMvV0>div,div.VG6bf>div,div._3igXW>div,div._1F-dq>div"; //,div._3KMiG
    var topBar = "div._24VFR._3zk0a._3Rgyb";
    var checkedBox = "div._2qxrJ,div._15Po9";
    var selcont = "div._3Pgai";
    var viewAllBut = "button._9rMMY._1qwC7._3xVcb._1KcL_._21wpm";
    var allButClass = "_9rMMY _1qwC7 _3xVcb _1KcL_ _21wpm";
    var stackCount="div.Ey06z";

    function prepareSite() {
        var scr = $('<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css">');
        scr.appendTo(document.head);
        var sty = $("<style type='text/css'></style>");
        sty.append(".ui-selectable-helper{background-image:linear-gradient(rgb(0,255,0),rgb(0,100,0));opacity:0.3;}");
        sty.append(".dmo_openAll{top: 68%;}");
        sty.appendTo(document.head);
        scr.ready(function () {
            setInterval(dynamicInsertion, 1000);
        });
    }

    function selecting(ev, ui) {
        var target = $(ui.selecting);
        var selecting = true;
        if (target.length == 0) {
            target = $(ui.unselecting);
            selecting = false;
        }
        var url = target.attr("url");
        selfTrg = true;

        if (!selecting) {
            if (target.find(checkedBox).length == 1) target.find("label").click(); //unselecting DOM
            if (ev == 0) target.removeClass("ui-selected").addClass("ui-unselecting");
        } else {
            if (target.find(checkedBox).length == 0) target.find("label").click(); //selecting DOM
            if (ev == 0) target.addClass("ui-selecting");
        }
        selfTrg = false;
    }

    function insertOpenButton() {

        if ($("button.dmo2_openTab").length > 0) return;
        var btnOpen = $("<button class='eNvqE dmo2_openTab'>Open in new Tab</button>");
        $(topBar).append(btnOpen);
        $("button.eNvqE").addClass("_1BMgL"); //add space between buttons
        btnOpen.click(function () {
            $(selectees).has(checkedBox).each(function () {
                if ($(this).attr("url") != undefined) window.open($(this).attr("url"));
            });
        });
    }

    function getStackURLs(offset, userid,type) {
        return new Promise(function (resolve, reject) {
            GM.xmlHttpRequest({
                method: "GET",
                url: "https://www.deviantart.com/_napi/da-messagecentre/api/stack?stackId=uq:devwatch:tg%3D"+type+",sender%3D" + userid + "&type=deviations&offset="+offset+"&limit=24",
                onerror: function (response) {
                    reject(response);
                },
                onload: function (response) {
                    var resp=JSON.parse(response.responseText);
                    //response.results[0].deviation.url;
                    for (var el of resp.results) {
                        window.open(el.deviation.url);
                    }
                    if (resp.hasMore) resolve(getStackURLs(24, userid));
                    else resolve(1);
                }
            });
        });
    }

    function requestAllOpen(event) {
        var userid = $(event.target).closest(selectees).find("a.user-link").attr("data-userid");
        //keyword in div.Ey06z
        var type=$(this).closest(selectees).find(stackCount).text();
        if(type.indexOf("Deviations")!=-1){
            getStackURLs(0,userid,"deviations");
            getStackURLs(0,userid,"groupdeviations");
        }else if(type.indexOf("Journals")!=-1){
            getStackURLs(0,userid,"journals");
        }else if(type.indexOf("Polls")!=-1){
            getStackURLs(0,userid,"polls");
        }
    }

    function insertOpenAllButton() {
        $(viewAllBut).not("[dmo2_openAll]").attr("dmo2_openAll", true).after($("<button class='dmo_openAll " + allButClass + "'>Open All</button>").click(requestAllOpen));
    }

    function makeSelectable() {
        selContainer.selectable({ //jquery ui selectable
            filter: selectees,
            distance: 10, //allows clicking. deprecated, hopefully stays a while
            selecting: selecting, //during selection; select/unselect only regarding mark-area
            unselecting: selecting
        });
        $(selectees).find("label input").change(function (event) { //change selection by hand
            if (!selfTrg) {
                event.stopPropagation();
                var target = $(this).closest(selectees);
                var el = {};
                if (target.find(checkedBox).length == 0) el.unselecting = target;
                else el.selecting = target;
                selecting(0, el);
                selContainer.selectable('refresh');
                selContainer.data("ui-selectable")._mouseStop(null);
            }
        });
        insertOpenButton();
    }

    function dynamicInsertion() {
        $(selectees).not("[url]").each(function () { //href disappears for selected items. copy it beforehand
            $(this).attr("url", $(this).find("a[data-hook='deviation_link']").attr("href"));
        });
        insertOpenAllButton();
        if ($(selectees).not("[dmo2]").length == 0) return; //only do if you have selectees without attribute
        $(selectees).attr("dmo2", true);
        selContainer = $(selcont);
        makeSelectable();
    }
    prepareSite();
})();

/* deviantart API
https://www.deviantart.com/_napi/da-messagecentre/api/stack?stackId=uq:devwatch:tg%3Ddeviations,sender%3D4165994&type=deviations&offset=0&limit=24
stackId	uq:devwatch:tg=deviations,sender=4165994
type	deviations
offset	0
limit	24

response
response.results[0].deviation.url
response.counts.total
response.hasMore*/