Advertisement
stsyn

[DERP] OwO who did this?

May 12th, 2019
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         OwO who did this
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.0.0
  5. // @description  Concept of UI tweak to show, who exactly created image
  6. // @author       stsyn
  7.  
  8. // @include      *://trixiebooru.org/*
  9. // @include      *://derpibooru.org/*
  10. // @include      *://www.trixiebooru.org/*
  11. // @include      *://www.derpibooru.org/*
  12. // @include      *://*.o53xo.orzgs6djmvrg633souxg64th.*.*/*
  13. // @include      *://*.orzgs6djmvrg633souxg64th.*.*/*
  14. // @include      *://*.o53xo.mrsxe4djmjxw64tvfzxxezy.*.*/*
  15. // @include      *://*.mrsxe4djmjxw64tvfzxxezy.*.*/*
  16.  
  17. // @exclude      *://trixiebooru.org/adverts/*
  18. // @exclude      *://derpibooru.org/adverts/*
  19. // @exclude      *://www.trixiebooru.org/adverts/*
  20. // @exclude      *://www.derpibooru.org/adverts/*
  21. // @exclude      *://*.o53xo.orzgs6djmvrg633souxg64th.*.*/adverts/*
  22. // @exclude      *://*.orzgs6djmvrg633souxg64th.*.*/adverts/*
  23. // @exclude      *://*.o53xo.mrsxe4djmjxw64tvfzxxezy.*.*/adverts/*
  24. // @exclude      *://*.mrsxe4djmjxw64tvfzxxezy.*.*/adverts/*
  25.  
  26. // @require      https://github.com/stsyn/derpibooruscripts/raw/master/YouBooru/lib.js
  27. // @grant        unsafeWindow
  28. // @run-at       document-idle
  29. // ==/UserScript==
  30.  
  31. (function() {
  32.     'use strict';
  33.     const includeBadges = false; //toggleable
  34.     const selector = '.tag.dropdown[data-tag-category="origin"][data-tag-name*="artist:"] .tag__name, .tag.dropdown[data-tag-category="origin"][data-tag-name*="colorist:"] .tag__name, .tag.dropdown[data-tag-category="origin"][data-tag-name*="photographer:"] .tag__name';
  35.     const limitation = 3;
  36.  
  37.  
  38.     let remains = 0;
  39.     let userbase;
  40.     let results = [];
  41.     let isUserBaseAvailable; //time to use YDB:Tools base, if it's available
  42.  
  43.     function nameEncode(name) {
  44.         return encodeURI(name.replace(/\-/g,'-dash-').replace(/\+/g,'-plus-').replace(/\:/g,'-colon-').replace(/\./g,'-dot-').replace(/\//g,'-fwslash-').replace(/\\/g,'-bwslash-').replace(/ /g,'+')).replace(/\</g,'%3C').replace(/\#/,'%2523');
  45.     };
  46.  
  47.     function read() {
  48.         if (localStorage._ydb_toolsUB2) {
  49.             isUserBaseAvailable = true;
  50.             try {
  51.                 let temp = JSON.parse(localStorage._ydb_toolsUB2);
  52.                 userbase = temp;
  53.             }
  54.             catch(e) {
  55.             }
  56.         } else isUserBaseAvailable = false;
  57.     }
  58.  
  59.     function gainNames() {
  60.         let getName = (el) => {
  61.             fetch(el.href)
  62.             .then(response => {
  63.                 if (response.ok) return response.text();
  64.             })
  65.             .then(code => {
  66.                 let x = InfernoAddElem('div',{innerHTML:code,style:{display:'none'}},[]);
  67.                 for (let i=0; i<x.querySelectorAll('.tag-info__more strong').length; i++) {
  68.                     let ax = x.querySelectorAll('.tag-info__more strong')[i];
  69.                     if (ax.innerHTML == 'Associated Derpibooru users:') {
  70.                         let n = ax.nextSibling.nextSibling;
  71.                         if (results.indexOf(n.innerHTML) >-1) return;
  72.                         results.push({name:n.innerHTML, elem:el, count:parseInt(el.parentNode.querySelector('.tag__count').innerHTML.replace('(', ''))});
  73.                         break;
  74.                     }
  75.                 }
  76.                 remains--;
  77.                 if (remains == 0 && results.length > 0) gainIds();
  78.             });
  79.         }
  80.  
  81.         if (document.querySelectorAll(selector).length > limitation) return;
  82.         for (let i=0; i<document.querySelectorAll(selector).length; i++) {
  83.             let el = document.querySelectorAll(selector)[i];
  84.             remains++;
  85.             if (!isUserBaseAvailable) getName(el);
  86.             else {
  87.                 if (userbase.artists[el.innerHTML] != undefined) {
  88.                     let n = userbase.users[userbase.artists[el.innerHTML]];
  89.                     results.push({name:n.name, elem:el, id:n.id, count:parseInt(el.parentNode.querySelector('.tag__count').innerHTML.replace('(', ''))});
  90.                     remains--;
  91.                 }
  92.                 else getName(el);
  93.             }
  94.         }
  95.         if (remains == 0 && results.length > 0) gainIds();
  96.     }
  97.  
  98.     function gainIds() {
  99.         //actually, it gathers bagdes now
  100.         if (!includeBadges) {
  101.             gainComms();
  102.             return;
  103.         }
  104.         let getId = (r) => {
  105.             fetch('/profiles/'+nameEncode(r.name)+'.json')
  106.             .then(response => {
  107.                 if (response.ok) return response.json();
  108.             })
  109.             .then(data => {
  110.                 r.awards = data.awards;
  111.                 remains--;
  112.                 if (remains == 0 && results.length > 0) gainComms();
  113.             });
  114.         }
  115.  
  116.         for (let i=0; i<results.length; i++) {
  117.             remains++;
  118.             getId(results[i]);
  119.         }
  120.         if (remains == 0 && results.length > 0) gainComms();
  121.     }
  122.  
  123.     function gainComms() {
  124.         //okay, isUserBaseAvailable won't help there
  125.         let getComm = (r) => {
  126.             fetch('/commissions/'+nameEncode(r.name))
  127.             .then(response => {
  128.                 if (response.ok) return response.text();
  129.             })
  130.             .then(code => {
  131.                 let x = InfernoAddElem('div',{innerHTML:code,style:{display:'none'}},[]);
  132.                 if (!x.querySelector('.block__content.commission__block_body')) r.commState = 'none';
  133.                 else r.commState = (x.querySelector('.block__content.commission__block_body br+strong').nextSibling.wholeText.trim()=='Open'?'open':'closed');
  134.  
  135.                 remains--;
  136.                 if (remains == 0 && results.length > 0) show();
  137.             });
  138.         }
  139.  
  140.         for (let i=0; i<results.length; i++) {
  141.             remains++;
  142.             getComm(results[i]);
  143.         }
  144.     }
  145.  
  146.     function commLink(r) {
  147.         if (r.commState == 'none') return InfernoAddElem('span', {}, []);
  148.         return InfernoAddElem('span', {className:'commissions'}, [
  149.             InfernoAddElem('a', {href:'/commissions/'+nameEncode(r.name), style:{color:(r.commState=='open'?'green':'')}, innerHTML:(r.commState=='open'?'(commissions open)':'(commissions list)')}, [])
  150.         ])
  151.     }
  152.  
  153.     function show() {
  154.         if ((results.length == 0) || (results.length > limitation)) return;
  155.         if (document.querySelector('#extrameta .image_uploader a') != undefined && results.length == 1 && document.querySelector('#extrameta .image_uploader a').innerHTML == results[0].name) {
  156.             document.querySelector('#extrameta > div').firstChild.nodeValue = 'Created and uploaded ';
  157.             if (results[0].commState != 'none') document.querySelector('#extrameta .image_uploader').appendChild(commLink(results[0]));
  158.         } else {
  159.             results.sort((a,b) => {return b.count - a.count;});
  160.             let container;
  161.             document.querySelector('#container .block.block__header').insertBefore(container = InfernoAddElem('div',{className:'image-metabar flex flex--wrap block__header--user-credit center--layout'},[
  162.                 InfernoAddElem('span', {innerHTML:'Created by'}, [])
  163.             ]),document.getElementById('extrameta'));
  164.             for (let i=0; i<results.length; i++) {
  165.                 let badges = [];
  166.                 let bd = [];
  167.                 if (results[i].awards) {
  168.                     for (let j=0; j<results[i].awards.length; j++) {
  169.                         let bx = badges;
  170.                         if (j>=7) bx = bd;
  171.                         let aw = results[i].awards[j];
  172.                         bx.push(InfernoAddElem('div', {className:'badge'}, [
  173.                             InfernoAddElem('img', {src:aw.image_url, alt:aw.title+' — '+aw.label, width:18, height:18}, [])
  174.                         ]));
  175.                     }
  176.                     if (results[i].awards.length>7) {
  177.                         badges.push(InfernoAddElem('div',{className:'dropdown'},[
  178.                             InfernoAddElem('i',{className:'fa fa-caret-down'},[]),
  179.                             InfernoAddElem('div',{className:'dropdown__content block__header'},[
  180.                                 InfernoAddElem('div',{className:'badges flex--column'},bd)
  181.                             ])
  182.                         ]))
  183.                     };
  184.                 }
  185.                 container.appendChild(InfernoAddElem('span',{className:'image_uploader'},[
  186.                     InfernoAddElem('a',{innerHTML:results[i].name, href:'/profiles/'+nameEncode(results[i].name)},[]),
  187.                     InfernoAddElem('div',{className:'badges'},badges),
  188.                     commLink(results[i])
  189.                 ]));
  190.  
  191.                 if (i == results.length-2) container.appendChild(InfernoAddElem('span',{innerHTML:'&nbsp;and'},[]));
  192.                 else if (i<results.length-1) container.appendChild(InfernoAddElem('span',{innerHTML:','},[]));
  193.             }
  194.  
  195.  
  196.         }
  197.     }
  198.  
  199.     if ((parseInt(location.pathname.slice(1))>=0 && location.pathname.split('/')[2] == undefined) || (location.pathname.split('/')[1] == 'images' && parseInt(location.pathname.split('/')[2])>=0 && location.pathname.split('/')[3] == undefined)) {
  200.         read();
  201.         gainNames();
  202.     }
  203. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement