Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. setTimeout(function( elem ){
  2.     document.body.appendChild(elem=document.getElementById("sananvapaus-ctrl")||document.createElement("div"));
  3.     elem.id        = "sananvapaus-ctrl";
  4.     elem.innerHTML = "<button onclick='window.mdwifos()'>Sananvapaus: <b class='on'>Paljastettu</b><b class='off'>Turvattu</b></button><img id='exportImgBtn' onclick='exportAsImage()' style='float:right' width='21' height='21' />";
  5.     elem.style     = "padding:1em;position:absolute;top:0px;left:50%;transform:translate(-50%,0%);"
  6.  
  7.     document.body.appendChild(elem=document.getElementById("sananvapaus-css")||document.createElement("style"));
  8.     elem.id          = "sananvapaus-css";
  9.     elem.type        = "text/css";
  10.     elem.textContent =
  11.     "body.sananvapaus #items.yt-live-chat-item-list-renderer>.yt-live-chat-item-list-renderer{ display: none!important;}"+
  12.     "body.sananvapaus #items.yt-live-chat-item-list-renderer>.yt-live-chat-item-list-renderer[is-deleted] { display: flex!important;}"+
  13.     "body.sananvapaus #items.yt-live-chat-item-list-renderer>.yt-live-chat-item-list-renderer[is-deleted]:not([show-original]) #message.yt-live-chat-text-message-renderer { display:initial!important;color:initial;font-style:initial;padding-right:0.4em;}"+
  14.     "body.sananvapaus #sananvapaus-ctrl button>.off,body #sananvapaus-ctrl button>.on { display: none!important; }"+
  15.     "body.sananvapaus #sananvapaus-ctrl button>.on { display: inline!important; }";
  16.  
  17.     window.mdwifos = function( v ){
  18.         window.sananvapaus=v==null?!window.sananvapaus:!!v;
  19.         document.body.classList[window.sananvapaus?"add":"remove"]("sananvapaus");
  20.     };
  21.    
  22.     window.exportAsImage = function(){
  23.         exportImage( window.deldata, function( img ){
  24.             document.getElementById( "exportImgBtn" ).src = img.src;
  25.         });
  26.     };
  27.    
  28.     revealSananvapaus();
  29. });
  30.  
  31. /* Reveal */
  32.  
  33. function revealSananvapaus( delkey ){
  34.     window.sananvapausInterval = window.sananvapausInterval || setInterval( revealSananvapaus, 15000 );
  35.  
  36.     delkey = delkey || revealSananvapaus.getKey();
  37.     var deldata = revealSananvapaus.load( delkey ) || {}, deldata_ids = [];
  38.  
  39.     var alldata = window.alldata = window.alldata || {};
  40.     for( var elem of document.querySelectorAll("#items > yt-live-chat-text-message-renderer")){
  41.         alldata[ elem.id ] = revealSananvapaus.parseMsgElemToArr(elem);
  42.     }
  43.  
  44.     for( var elem of document.querySelectorAll("#items > yt-live-chat-text-message-renderer[is-deleted]")){
  45.         deldata_ids.push( elem.id );
  46.         deldata[ elem.id ] = alldata[ elem.id ];
  47.     }
  48.     revealSananvapaus.save( delkey, window.deldata = deldata, window.deldata_ids = deldata_ids );
  49.     revealSananvapaus.print( deldata );
  50.    
  51.     return deldata;
  52. }
  53. revealSananvapaus.parseMsgElemToArr = function( elem ){
  54.     var time = elem.querySelector("#timestamp").textContent.match(/(\d+):(\d+) (AM|PM)/);
  55.  
  56.     return [
  57.         elem.querySelector("#img").src,
  58.         60*((time[3]=="PM"?12:0)+parseInt(time[1]))+parseInt(time[2]),
  59.         elem.querySelector("#author-name").textContent,
  60.         elem.querySelector("#message").textContent,
  61.         (elem.querySelector("#deleted-state")||{}).textContent
  62.     ];
  63. };
  64. revealSananvapaus.print = function( deldata ){
  65.     console.log( Object.keys( deldata ).map(function(id){ return deldata[id][1]+" "+deldata[id][2]+": "+deldata[id][3]+" -> "+deldata[id][4]; }).join("\n"));
  66.     console.log( "Sananvapaus koskettanut tässä chatissa "+Object.keys(deldata).length+" viestiä" );
  67. };
  68. revealSananvapaus.getKey = function(){
  69.     return "yt-deldata-"+ location.href.match(/\?(?:.*?)v=([^&]+)/)[1];
  70. };
  71. revealSananvapaus.load = function( key ){
  72.     try {
  73.         return JSON.parse( localStorage.getItem( key ));
  74.     } catch( err ) { console.error( err ); }
  75. };
  76. revealSananvapaus.save = function( key, deldata, order ){
  77.     try {
  78.         localStorage.setItem( key, JSON.stringify( deldata ));
  79.         if( order ) localStorage.setItem( key+"-order", order.join(","));
  80.     } catch( err ) { console.error( err ); }
  81. };
  82.  
  83. /* Export */
  84.  
  85. function exportHTML( data, html ){
  86.     html = html || "";
  87.     data = data || window.deldata;
  88.     data = Object.keys(data).map(v=>(v=data[v]));
  89.     data = data.sort((a,b)=>parseInt(a[1])-parseInt(b[1]));
  90.     data = data.map(v=>((v[1]=[parseInt(v[1]/60),v[1]%60]),v));
  91.    
  92.     for( var a of data ){
  93.         a[1][0] = (a[1][0] < 10 ? "0" : "") + a[1][0];
  94.         a[1][1] = (a[1][1] < 10 ? "0" : "") + a[1][1];
  95.         var e = "";
  96.         e += "<img style='width:24px;border-radius:50%;float:left;margin-right:16px' src='"+a[0]+"'>";
  97.        
  98.         // timestamp
  99.         e += "<span style='color:rgba(17,17,17,0.4);margin-right:8px'>"+a[1][0]+":"+a[1][1]+"</span>";
  100.        
  101.         // handle
  102.         e += "<span style='color:rgba(17,17,17,0.6);font-weight:bold;margin-right:8px'>"+a[2]+"</span>";
  103.  
  104.         // msg
  105.         e += "<span style=''>"+a[3]+"</span>";
  106.         e += "<span style='color:rgba(0,0,0,0.5);font-style:italic'> -> "+a[4]+"</span>";
  107.         html += "<div style='line-height:24px;padding:0px 24px;font-size:13px'>"+e+"</div>";
  108.     }
  109.     return html;
  110. }
  111. exportHTML.prependBody = (function( celem ){
  112.     var pelem = document.createElement("div");
  113.     pelem.append( celem = document.createElement("div") );
  114.     pelem.style.position="absolute";
  115.     pelem.style.left=pelem.style.right=pelem.style.top=pelem.style.bottom="0px";
  116.     pelem.style.overflowY="auto";
  117.     pelem.style.zIndex="9001";
  118.     pelem.style.backgroundColor="#ffffff";
  119.  
  120.     return function( data, html ){
  121.         document.body.prepend( pelem );
  122.         pelem.style.display = "block";
  123.         celem.innerHTML = exportHTML( data, html );
  124.         return celem;
  125.     };
  126. })();
  127.  
  128. function elementToCanvas( element, callback ){
  129.     var script = document.createElement("script");
  130.     script.onload = function(){
  131.         try {
  132.             html2canvas( element ).then(callback);
  133.         } catch( error ){
  134.             console.error( error );
  135.         }
  136.     }
  137.     script.src = "https://html2canvas.hertzen.com/dist/html2canvas.min.js";
  138.     document.body.append( script );
  139. }
  140.  
  141. function exportImage( data, callback ){
  142.     var celem = exportHTML.prependBody( window.deldata );
  143.     setTimeout(function(){
  144.         elementToCanvas( celem, function( canvas ){
  145.             var img = new Image();
  146.             img.onload = function(){
  147.                 celem.parentElement.style.display = "none";
  148.                 callback( img );
  149.             };
  150.             img.src = canvas.toDataURL();
  151.         });
  152.     }, 1000);
  153. }