Logtime Plus

https://github.com/pcluchet/logtime-plus

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Logtime Plus
// @namespace   profile.intra.42.fr
// @include     https://profile.intra.42.fr/
// @version     1.3
// @grant       none
// @description https://github.com/pcluchet/logtime-plus
// ==/UserScript==
 
function minTommss(minutes){
    var sign = minutes < 0 ? "-" : "";
    var min = Math.floor(Math.abs(minutes));
    var sec = Math.floor((Math.abs(minutes) * 60) % 60);
    return sign + (min < 10 ? "0" : "") + min + "h" + (sec < 10 ? "0" : "") + sec;
}

function load_js()
   {
      var head= document.getElementsByTagName('head')[0];
      var script= document.createElement('script');
      script.type= 'text/javascript';
      script.src= 'https://profile.intra.42.fr/assets/application-a482bc20dff3485ff22a2d7350c86b65accb523b5f0b6f711d36840efbefc37d.js';
      head.appendChild(script);
   }
 
 
function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}
 
function get_n(add, n){
    //console.log("Birdel0");
    var tt = n + add;
    console.log('n : ' + n + " add : " + add);
   if (tt == 0)
  {
   return 12;
  }
  else if ( tt < 0)
    {
      return 11;
    }
    else
        {
  return n+add;
        }
}

function disp_hint_top(event){

                              var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('target = '+ s.serializeToString(event.target));
               
                             var sum = event.target.parentNode.getAttribute('hoursum');
                             var x = parseFloat(event.target.parentNode.getAttribute('spoof_x'));
                             var y = parseFloat(event.target.parentNode.getAttribute('spoof_y'));
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect')
                         to_add.setAttribute("x", x+17);
                         to_add.setAttribute("y", y-5);
                         to_add.setAttribute("fill", '#fff');
                         to_add.setAttribute("width", '53');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("filter", 'url(#black-glow)');
                         to_add.setAttribute("font-family", 'sans-serif');
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'text')
                         to_add.setAttribute("x", x+28);
                         to_add.setAttribute("y", y+11);
                         to_add.setAttribute("fill", '#444');
                         to_add.setAttribute("width", '42');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '13');
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                         var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'line')
                         to_add.setAttribute("x1", x+16);
                         to_add.setAttribute("y1", y-5);
                         to_add.setAttribute("x2", x+16);
                         to_add.setAttribute("y2", y+18);
                         to_add.setAttribute("stroke", '#666');
                         to_add.setAttribute("stroke-width", '1');
                        
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             
                             console.log("created id = ", sum + x + y);
                         //to_add.innerHTML = minTommss(tot);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'polygon')
                         to_add.setAttribute("x", x+9);
                         to_add.setAttribute("y", y+8);
                         to_add.setAttribute("fill", '#666');
                             var p1x = x+10;
                             var p1y = y+8;
                             var p2x = x+16;
                             var p2y = y+2;
                             var p3x = x+16;
                             var p3y = y+14;
                         to_add.setAttribute("points", p1x + ' ' + p1y + ', ' + p2x + ' ' + p2y + ', ' + p3x + ' ' + p3y);
                             console.log('attribut pts :' + to_add.getAttribute('points'));
                         to_add.setAttribute("height", '17');
                          box.appendChild(to_add);
                          svg.appendChild(box);
                            
                             console.log("sum =" +sum);
                             
                             //alert('sum = ' + sum);
          
                         }

function disp_hint(event){
                             console.log('FIREF');
                              var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('target = '+ s.serializeToString(event.target));
               
                             var sum = event.target.getAttribute('hoursum');
                             var x = parseFloat(event.target.getAttribute('x'));
                             var y = parseFloat(event.target.getAttribute('y'));
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect')
                         to_add.setAttribute("x", x+17);
                         to_add.setAttribute("y", y-5);
                         to_add.setAttribute("fill", '#fff');
                         to_add.setAttribute("width", '53');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("filter", 'url(#black-glow)');
                         to_add.setAttribute("font-family", 'sans-serif');
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'text')
                         to_add.setAttribute("x", x+28);
                         to_add.setAttribute("y", y+11);
                         to_add.setAttribute("fill", '#444');
                         to_add.setAttribute("width", '42');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '13');
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                         var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'line')
                         to_add.setAttribute("x1", x+16);
                         to_add.setAttribute("y1", y-5);
                         to_add.setAttribute("x2", x+16);
                         to_add.setAttribute("y2", y+18);
                         to_add.setAttribute("stroke", '#666');
                         to_add.setAttribute("stroke-width", '1');
                        
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             
                             console.log("created id = ", sum + x + y);
                         //to_add.innerHTML = minTommss(tot);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'polygon')
                         to_add.setAttribute("x", x+9);
                         to_add.setAttribute("y", y+8);
                         to_add.setAttribute("fill", '#666');
                             var p1x = x+10;
                             var p1y = y+8;
                             var p2x = x+16;
                             var p2y = y+2;
                             var p3x = x+16;
                             var p3y = y+14;
                         to_add.setAttribute("points", p1x + ' ' + p1y + ', ' + p2x + ' ' + p2y + ', ' + p3x + ' ' + p3y);
                             console.log('attribut pts :' + to_add.getAttribute('points'));
                         to_add.setAttribute("height", '17');
                          box.appendChild(to_add);
                          svg.appendChild(box);
                            
                             console.log("sum =" +sum);
                             
                             //alert('sum = ' + sum);
          
                         }

function disp_hint_reverse( event ) {
                             console.log('FIREF');
                              var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('target = '+ s.serializeToString(event.target));
               
                             var sum = event.target.getAttribute('hoursum');
                             var x = parseFloat(event.target.getAttribute('x'));
                             var y = parseFloat(event.target.getAttribute('y'));
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect')
                         to_add.setAttribute("x", x-7-53);
                         to_add.setAttribute("y", y-5);
                         to_add.setAttribute("fill", '#fff');
                         to_add.setAttribute("width", '53');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("filter", 'url(#black-glow)');
                         to_add.setAttribute("font-family", 'sans-serif');
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'text')
                         to_add.setAttribute("x", x-8-42);
                         to_add.setAttribute("y", y+11);
                         to_add.setAttribute("fill", '#444');
                         to_add.setAttribute("width", '42');
                         to_add.setAttribute("height", '22');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '13');
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                         var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'line')
                         to_add.setAttribute("x1", x-6);
                         to_add.setAttribute("y1", y-5);
                         to_add.setAttribute("x2", x-6);
                         to_add.setAttribute("y2", y+18);
                         to_add.setAttribute("stroke", '#666');
                         to_add.setAttribute("stroke-width", '1');
                        
                         to_add.innerHTML = sum;
                         box.setAttribute("id", sum + x + y);
                         box.appendChild(to_add);
                             
                             
                             console.log("created id = ", sum + x + y);
                         //to_add.innerHTML = minTommss(tot);
                             
                             var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'polygon')
                         to_add.setAttribute("x", x+9);
                         to_add.setAttribute("y", y+8);
                         to_add.setAttribute("fill", '#666');
                             var p1x = x-1;
                             var p1y = y+8;
                             var p2x = x-6;
                             var p2y = y+2;
                             var p3x = x-6;
                             var p3y = y+14;
                         to_add.setAttribute("points", p1x + ' ' + p1y + ', ' + p2x + ' ' + p2y + ', ' + p3x + ' ' + p3y);
                             console.log('attribut pts :' + to_add.getAttribute('points'));
                         to_add.setAttribute("height", '17');
                          box.appendChild(to_add);
                          svg.appendChild(box);
                            
                             console.log("sum =" +sum);
                             
                             //alert('sum = ' + sum);
          
                         }

function remove_hint( event ) {
                              console.log('MOUSEOUT');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                    //console.log('svg = '+ s.serializeToString(event.target));
                             var sum = event.target.getAttribute('hoursum');
                             var x = event.target.getAttribute('x');
                             var y = event.target.getAttribute('y');
                             
                             var to_remove = document.getElementById(sum + x + y);

                             to_remove.parentNode.removeChild(to_remove);

                         }

function remove_hint_spoof( event ) {
                              console.log('MOUSEOUT');
                             var svg = document.getElementById("user-locations");
                             var s = new XMLSerializer();
                    //console.log('svg = '+ s.serializeToString(event.target));
                             var sum = event.target.parentNode.getAttribute('hoursum');
                             var x = event.target.parentNode.getAttribute('spoof_x');
                             var y = event.target.parentNode.getAttribute('spoof_y');
                             
                             var to_remove = document.getElementById(sum + x + y);

                             to_remove.parentNode.removeChild(to_remove);

                         }
 
 
window.onload = function(){
   
    var mois = [];
mois[1] = 0.0;
mois[2] = 0.0;
mois[3] = 0.0;
mois[4] = 0.0;
mois[5] = 0.0;
mois[6] = 0.0;
mois[7] = 0.0;
mois[8] = 0.0;
mois[9] = 0.0;
mois[10] = 0.0;
mois[11] = 0.0;
mois[12] = 0.0;
  
var mois_j = [];
  
  for (var w = 0; w <= 12; w++)
    {
      var jours = [];
      for (var z = 0; z <= 31; z++)
         {
            jours[z] = 0.0;
         }  
            mois_j[w] = jours;
    }

 
 
var months = [];
months[1] = 'Janvier';
months[2] = 'Febrier';
months[3] = 'Mars';
months[4] = 'April';
months[5] = 'May';
months[6] = 'June';
months[7] = 'July';
months[8] = 'August';
months[9] = 'Septembre';
months[10] = 'Octobre';
months[11] = 'Novembre';
months[12] = 'Decembre';
   
    var jl = document.getElementsByClassName("container-inner-item boxed");
var logtimes = document.getElementById("user-locations").getAttribute("data-location-graph");
   
    logtimes = logtimes.substr(1);
logtimes = logtimes.substr(0, logtimes.length - 1);
var set = logtimes.split(",");
 
set.forEach(function(element) {
 
    var base = element.split(":");
    var annee = base[0].substr(1,4);
    var ms = base[0].substr(6,2);
    var jour = base[0].substr(9,2);
 
    var heures = base[1].substr(1,2);
    var minutes = base[2];
    var secondes = base[3].substr(0,2);
 
    mois[parseInt(ms)] += parseInt(heures) + parseInt(minutes)/60;//+(parseInt(minutes)/60)*10);
    mois_j[parseInt(ms)][parseInt(jour)] = parseInt(heures) + parseInt(minutes)/60;
 
});
  
//  console.log('mj = ' + mois_j);
 
var d = new Date();
  console.log("la date c: " + d.toISOString());
var n = d.getMonth();
var total = mois[n-1] + mois[n-0] + mois[n+1];
 
var t = document.createElement("div");
 
t.innerHTML = '<h4>Logtime Plus : '+ minTommss(total) + '</h4>';
n = get_n(-1,d.getMonth());
t.innerHTML = t.innerHTML + months[n-1] +' : '+ minTommss(mois[n-1])+'<br/>';
n = get_n(0,d.getMonth());
t.innerHTML = t.innerHTML + months[n-0]+' : '+minTommss(mois[n-0])+'<br/>';
n = d.getMonth();
t.innerHTML = t.innerHTML + months[n+1]+' : '+minTommss(mois[n+1])+'<br/>';
 
 
 
var k = jl[2].getElementsByClassName('profile-title');
 
k[0].innerHTML = 'Logtime⁺';
 
    var svg = document.getElementById("user-locations");
  
  	//this kills the handlers
  	//svg.innerHTML = svg.innerHTML;
  
  
    svg.setAttribute('viewBox','0 0 610 200');
    var s = new XMLSerializer();
                // get the inner DOM of alpha.svg
                    console.log('svg = '+ s.serializeToString(svg));
                   var svgBrut = s.serializeToString(svg);
               
   
   
                var parser = new DOMParser();
                //var svgDoc = parser.parseFromString(svgBrut, "text/xml");
                var svgDoc = svg;
                var defs = document.createElementNS("http://www.w3.org/2000/svg", 'defs');
    defs.innerHTML = "<filter id=\"black-glow\">\
    <feColorMatrix type=\"matrix\" values=\
                \"0 0 0 0   0\
                 0 0 0 0   0\
                 0 0 0 0   0\
                 0 0 0 0.1 0\"/>\
    <feGaussianBlur stdDeviation=\"2.5\" result=\"coloredBlur\"/>\
    <feMerge>\
        <feMergeNode in=\"coloredBlur\"/>\
        <feMergeNode in=\"SourceGraphic\"/>\
    </feMerge>\
</filter>";
                svgDoc.insertBefore(defs, svgDoc.firstChild);
        
                var elemcol = [];
                var texts = svgDoc.getElementsByTagName("*");
                var kmatch = 999;
                var oldx = 0;
                var oldy = 0;
                var tot = 0.0;
                var match = false;
                var last = false;
                var max = texts.length;
                for(var i = 0; i <= max; i++) {
                    if ( i == max)
                        last = true;
                  /*
                  if (texts[i].tagName = 'g' && texts[i].firstChild && texts[i].firstChild.tagName == 'rect')
                  {
                    var sum = 0.0;
                    
                    n = get_n(kmatch,d.getMonth());
                    sum = mois_j[n+kmatch][texts[i].childNodes[1].innerHTML]
                    
                    console.log('en x =' + texts[i].childNodes[0].getAttribute('x'));
                    texts[i].setAttribute("hoursum", minTommss(sum));
                    texts[i].setAttribute("spoof_x", texts[i].childNodes[0].getAttribute('x') );
                    texts[i].setAttribute("spoof_y", texts[i].childNodes[0].getAttribute('y') );
            		texts[i].addEventListener("mouseover", disp_hint_top);
                    texts[i].addEventListener("mouseout",remove_hint_spoof);
                    console.log('g');
                  }
                 */
                   // console.log('elem: '+ texts[i].innerHTML);
                   
                  //valeurs a coté du nom du mois
                    for(var k = -2; k <= 1; k++)
                        {
                    n = get_n(k, d.getMonth());
                    var moistxt = months[n];
                    //console.log('mois = ' + moistxt);
                    //console.log('cmp = ' + moistxt.substr(0,3) + "html = "+ texts[i].innerHTML);
                   
                    if (texts[i].innerHTML == moistxt.substr(0,3))
                        {
                          match = true;
                          kmatch = k;
                            console.log("moistxt =" + moistxt + "k = " + k);
                            console.log("MATCH MATCH MATCH");
                            texts[i].innerHTML = moistxt.substr(0,3) +"  -  " + minTommss(mois[n]);  
                            texts[i].setAttribute('font-size','12');
                            if (k == -2)
                                {
                                  texts[i].setAttribute('x','50');
                                }
                            else if (k == -1)
                                {
                                  texts[i].setAttribute('x','195');
                                }
                            else if (k == 0)
                                {
                                  texts[i].setAttribute('x','339');
                                }
                            else if (k == 1)
                                {
                                  texts[i].setAttribute('x','480');
                                }
                        }  
                    }
                  
                  //decalage pour faire la place du temps semaine
                  var xxx = parseFloat(texts[i].getAttribute('x'));
                  var yyy = parseFloat(texts[i].getAttribute('y'));
                   			if (kmatch == -2)
                                {
                                   xxx += -10;
                                  texts[i].setAttribute('x',xxx);
                                }
                            else if (kmatch == -1)
                                {
                                  texts[i].setAttribute('x',xxx);
                                }
                            else if (kmatch == 0)
                                {
                                   xxx += 10;
                                  texts[i].setAttribute('x',xxx);
                                }
                            else if (kmatch == 1)
                                {
                                  xxx += 20;
                                  texts[i].setAttribute('x',xxx);
                                }
                  //fin de semaine ou besoin d'écrire le total de semaine
                  if ( oldx == 120.5 || oldx == 274.5 || oldx == 582.5 || oldx == 428.5 ||  match || last)
                    {
                      //creation du rectangle coloré pour la semaine
                        var box = document.createElementNS("http://www.w3.org/2000/svg", 'g');
                        var to_add = document.createElementNS("http://www.w3.org/2000/svg", 'rect');
                        
                        var en_x = 0;
                        if (match)
                            kmatch -= 1;
                         console.log('mois = ' + kmatch);
                        
                         if (kmatch == -2)
                                {
                                   en_x = 135.5;
                                }
                            else if (kmatch == -1)
                                {
                                   en_x = 289.5;
                                }
                            else if (kmatch == 0)
                                {
                                     en_x = 443.5;
                                }
                            else if (kmatch == 1)
                                {
                                     en_x = 597.5;
                                }
                        if (match)
                            kmatch += 1;
                        
                         to_add.setAttribute("x", en_x);
                         to_add.setAttribute("y", oldy-10);
                         if (tot)
                             {
                                var color = '#2CD57B';
                                 var ratio = (tot/60);
                             }
                         else
                             {
                                var color = '#F5F5F5';
                                var ratio = 1;
                             }
                         to_add.setAttribute("fill", color );
                         
                         to_add.setAttribute("fill-opacity", ratio);
                         to_add.setAttribute("width", '7');
                         to_add.setAttribute("height", '17');
                         to_add.setAttribute("font-family", 'sans-serif');
                         to_add.setAttribute("font-size", '8');
                         to_add.setAttribute("hoursum", minTommss(tot));
                        var tmp = oldx-5;
                        var tmp2 = oldy-10;
                        box.appendChild(to_add);
                        
                        
                        //ajout des listeners pour afficher le temps lors du survol.
                        if (!(last || kmatch == 1)) 
                           box.addEventListener("mouseover", disp_hint);
                        else 
                           box.addEventListener("mouseover",disp_hint_reverse);
                        
                         box.addEventListener("mouseout",remove_hint);
                         
                         svg.appendChild(box);
                        
                     
                      tot = 0.0;
                    }
                  n = get_n(kmatch,d.getMonth());
                  if (parseInt(texts[i].innerHTML) && kmatch != 999)
                    {
                    //  console.log("trying to get [" + n +"+"+kmatch + "][" + texts[i].innerHTML +"]");
                    // console.log("inside = " + mois_j[n+kmatch][texts[i].innerHTML]);
                       tot += mois_j[n][texts[i].innerHTML];
                    }
                  
                  if (xxx)
                      oldx = xxx;
                  else
                      oldx = -100;
                  if (xxx)
                      oldy = yyy;
                  match = false
 
                }       
                     
            };