Dev_Multi_Open2

Easier Opening in Deviantart Notification Center

À data de 28/10/2019. Ver a versão mais recente.

Terá de instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

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

Terá de instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Terá de instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Terá de instalar uma extensão como Tampermonkey para instalar este script.

Terá de instalar uma extensão de gestão de scripts de utilizador para instalar este script.

(Já tenho um gestor de scripts de utilizador, deixe-me instalá-lo!)

Terá de instalar uma extensão como Stylus para instalar este estilo.

Terá de instalar uma extensão como Stylus para instalar este estilo.

Terá de instalar uma extensão como Stylus para instalar este estilo.

Terá de instalar uma extensão de gestão de estilos de utilizador para instalar este estilo.

Terá de instalar uma extensão de gestão de estilos de utilizador para instalar este estilo.

Terá de instalar uma extensão de gestão de estilos de utilizador para instalar este estilo.

(Já tenho um gestor de estilos de utilizador, deixe-me instalá-lo!)

// ==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*/