Facebook
From Sludgy Kitten, 3 Months ago, written in JavaScript.
Embed
Download Paste or View Raw
Hits: 57
  1. // ==UserScript==
  2. // @name         Hacker Panel
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  Add admin panel
  6. // @author       dumbasPL
  7. // @match        https://uonetplus-uczen.eszkola.opolskie.pl/opole/opolezse/Start
  8. // @grant        none
  9. // ==/UserScript==
  10.  
  11. function wait() {
  12.     let node = document.querySelector('#ext-component-1');
  13.     if(node){
  14.         node.style.margin = "auto";
  15.         node.style.textAlign = "center";
  16.         node.innerHTML = "<div id=\"admin-panel-button\" class=\"x-component x-button x-button-blue x-has-text x-icon-align-left x-arrow-align-right x-layout-auto-item\"><div class=\"x-inner-el\"><div class=\"x-body-el\"><div class=\"x-text-el\" id=\"ext-element-1119\">Admin Panel<\/div><\/div><\/div><button class=\"x-button-el\" type=\"button\"><\/button><\/div>";
  17.         let overlay = document.createElement("div");
  18.         overlay.style.position = "fixed";
  19.         overlay.style.display = "none";
  20.         overlay.style.width = "100%";
  21.         overlay.style.height = "100%";
  22.         overlay.style.top = "0";
  23.         overlay.style.left = "0";
  24.         overlay.style.right = "0";
  25.         overlay.style.bottom = "0";
  26.         overlay.style.backgroundColor = "rgba(0,0,0,0.5)";
  27.         overlay.style.zIndex = "999999";
  28.         overlay.style.boxSizing = "border-box";
  29.         overlay.style.padding = "5%";
  30.         //overlay.innerHTML = "";
  31.         //overlay.innerHTML = "";
  32.         //overlay.innerHTML = "";
  33.         overlay.innerHTML = "<div style=\"width: 100%;height: 100%;background-color: white;margin: auto;z-index: 5;\">\r\n    <div style=\"\r\n    width: 50%;\r\n    height: 100%;\r\n    float: left;\r\n    overflow: auto;\r\n    \">\r\n        <button id=\"get-cashed-grades-button\">Get cashed grades<\/button>\r\n        <table border=\"1\" cellpadding=\"5\" id=\"cashed-grades-table\" style=\"\r\n        border-collapse: collapse;\r\n        width: 100%;\r\n        text-align: center;\r\n        \">\r\n            <tbody><tr>\r\n                <th>Subject<\/th>\r\n                <th>Name<\/th>\r\n                <th>Real value<\/th>\r\n                <th>Action<\/th>\r\n                <th>Fake value<\/th>\r\n            <\/tr>\r\n        <\/tbody><\/table>\r\n    <\/div>\r\n    <div style=\"\r\n    width: 50%;\r\n    height: 100%;\r\n    display: inline-block;\r\n    clear: both;\r\n    overflow-y: auto;\r\n    overflow-x: hidden;\r\n    \">\r\n        <span id=\"overlay-clouse-buuton\" style=\"\r\n        top: 0;\r\n        left: calc(100% - 15px);\r\n        position: relative;\r\n        cursor: pointer;\r\n        \">X<\/span>\r\n        <input type=\"date\" id=\"presence-date-selector\">\r\n        <button id=\"get-cashed-presences-button\">Get cashed presences<\/button>\r\n        <input type=\"checkbox\" id=\"hide-present-entries-from-presence\" checked>\r\n        <label for=\"hide-present-entries\">hide entries where present<\/label>\r\n        <table border=\"1\" cellpadding=\"5\" id=\"cashed-presence-table\" style=\"\r\n        border-collapse: collapse;\r\n        width: 100%;\r\n        text-align: center;\r\n        \">\r\n            <tbody>\r\n                <tr>\r\n                    <th>nr<\/th>\r\n                    <th>value<\/th>\r\n                    <th>Action<\/th>\r\n                    <th>Fake value<\/th>\r\n                <\/tr>\r\n            <\/tbody>\r\n        <\/table>\r\n    <\/div>\r\n<\/div>";
  34.         document.body.appendChild(overlay);
  35.         document.getElementById("presence-date-selector").valueAsDate = new Date();
  36.         let btn = document.getElementById("admin-panel-button");
  37.         btn.onclick = function() {
  38.             overlay.style.display = "block";
  39.         }
  40.         let btn_c = document.getElementById("overlay-clouse-buuton");
  41.         btn_c.onclick = function() {
  42.             location.reload();
  43.         }
  44.         let btn_get_grades = document.getElementById("get-cashed-grades-button");
  45.         btn_get_grades.onclick = function() {
  46.             let table = document.getElementById("cashed-grades-table");
  47.             xhook.disable();
  48.             fetch(window.hackApiAdress + "/api/v1/grades/cached?userId=" + window.IdUczen + "&name=" + encodeURIComponent(window.name)).then(function(response) {
  49.                 if (!response.ok) { throw Error(response.statusText); }
  50.                 return response.json();
  51.             }).then(function(response) {
  52.                 let data = response[window.IdUczen];
  53.                 for(var i = 1;i<table.rows.length;){ table.deleteRow(i); }
  54.                 data.forEach(grade => {
  55.                     let nr = table.rows.length;
  56.                     let r = document.createElement("tr");
  57.                     let sub = document.createElement("td");
  58.                     sub.innerText = grade.subject;
  59.                     r.appendChild(sub);
  60.                     let name = document.createElement("td");
  61.                     name.innerText = grade.name;
  62.                     r.appendChild(name);
  63.                     let value = document.createElement("td");
  64.                     value.innerText = grade.value;
  65.                     r.appendChild(value);
  66.                     let replaced_value = document.createElement("td");
  67.                     let action = document.createElement("td");
  68.                     let input = document.createElement("input");
  69.                     input.type = "text";
  70.                     action.appendChild(input);
  71.                     let sendReplacmentRequest = function(data) {
  72.                         xhook.disable();
  73.                         fetch(window.hackApiAdress + "/api/v1/grades/update?userId=" + window.IdUczen + "&subject=" + encodeURIComponent(data.subject)
  74.                               + "&name=" + encodeURIComponent(data.name) + "&date=" + data.date + "&value=" + encodeURIComponent(data.value)
  75.                               + "&weight=" + encodeURIComponent(data.weight) + "&remove=" + data.remove).then(function(response) {
  76.                             if (!response.ok) { throw Error(response.statusText); }
  77.                             return response.json();
  78.                         }).then(function(response) {
  79.                             replaced_value.innerText = data.remove ? "Removed" : data.value == grade.value ? "" : data.value;
  80.                         }).catch(function(error) {
  81.                             replaced_value.innerText = "Failed!";
  82.                             console.error(error);
  83.                             alert(error);
  84.                         });
  85.                         xhook.enable();
  86.                     }
  87.                     let b_set_grade = document.createElement("button");
  88.                     b_set_grade.innerText = "Set";
  89.                     b_set_grade.onclick = function() {
  90.                         sendReplacmentRequest({subject: grade.subject, name: grade.name, date: grade.date, value: input.value, weight: grade.weight, remove: false});
  91.                     }
  92.                     action.appendChild(b_set_grade);
  93.                     let b_remove_grade = document.createElement("button");
  94.                     b_remove_grade.innerText = "Delete";
  95.                     b_remove_grade.onclick = function() {
  96.                         sendReplacmentRequest({subject: grade.subject, name: grade.name, date: grade.date, value: "0", weight: grade.weight, remove: true});
  97.                     }
  98.                     action.appendChild(b_remove_grade);
  99.                     r.appendChild(action);
  100.                     if(window.localStorage.gradereplacements && JSON.parse(window.localStorage.gradereplacements)[window.IdUczen]){
  101.                         JSON.parse(window.localStorage.gradereplacements)[window.IdUczen].forEach(g => {
  102.                             if(g.subject == grade.subject && g.name == grade.name && g.date == grade.date) {
  103.                                 replaced_value.innerText = g.remove ? "Removed" : g.value;
  104.                             }
  105.                         });
  106.                     } else {
  107.                         replaced_value.innerText = "Failed!";
  108.                     }
  109.                     r.appendChild(replaced_value);
  110.                     table.appendChild(r);
  111.                 });
  112.             }).catch(function(error) {
  113.                 for(var i = 1;i<table.rows.length;){ table.deleteRow(i); }
  114.                 console.error(error);
  115.                 alert(error);
  116.             });
  117.             xhook.enable();
  118.         }
  119.         let btn_get_presence = document.getElementById("get-cashed-presences-button");
  120.         btn_get_presence.onclick = function() {
  121.             let getMonday = function(d) {
  122.                 let day = d.getDay();
  123.                 let diff = d.getDate() - day + (day == 0 ? -6:1);
  124.                 let date = new Date(d.setDate(diff));
  125.                 date.setHours(0, 0, 0, 0);
  126.                 return date;
  127.             }
  128.             let getSunday = function(d) {
  129.                 let day = d.getDay();
  130.                 let diff = d.getDate() - day + (day == 0 ? -6:1);
  131.                 let date = new Date(d.setDate(diff + 6));
  132.                 date.setHours(23, 59, 59, 0);
  133.                 return date;
  134.             }
  135.             let date = document.getElementById("presence-date-selector").valueAsDate;
  136.             let from = Math.floor(getMonday(date).getTime() / 1000);
  137.             let too = Math.floor(getSunday(date).getTime() / 1000);
  138.             let table = document.getElementById("cashed-presence-table");
  139.             xhook.disable();
  140.             fetch(window.hackApiAdress + "/api/v1/presence/cached?userId=" + window.IdUczen + "&from=" + from + "&too=" + too).then(function(response) {
  141.                 if (!response.ok) { throw Error(response.statusText); }
  142.                 return response.json();
  143.             }).then(function(response) {
  144.                 let data = response[window.IdUczen];
  145.                 for(var i = 1;i<table.rows.length;){ table.deleteRow(i); }
  146.                 console.log(data);
  147.                 let presenceTypes = JSON.parse(window.localStorage.presenceTypes);
  148.                 let replacments = JSON.parse(localStorage.presencereplacements)[window.IdUczen];
  149.                 let skippresent = document.getElementById("hide-present-entries-from-presence").checked;
  150.                 data.forEach(day => {
  151.                     let r = document.createElement("tr");
  152.                     let d = document.createElement("td");
  153.                     d.colSpan = 4;
  154.                     d.innerHTML = "<b>" + new Date(day.day * 1000).toLocaleDateString() + "</b>";
  155.                     r.appendChild(d);
  156.                     table.appendChild(r);
  157.                     day.cachedPresences.forEach(presence => {
  158.                         if(skippresent && presence.value == 1) {
  159.                             return;
  160.                         }
  161.                         let rr = document.createElement("tr");
  162.                         let nr = document.createElement("td");
  163.                         nr.innerText = presence.nr;
  164.                         rr.appendChild(nr);
  165.                         let val = document.createElement("td");
  166.                         val.innerText = presence.valueText;
  167.                         rr.appendChild(val);
  168.                         let action = document.createElement("td");
  169.                         let select = document.createElement("SELECT");
  170.                         for(let x in presenceTypes) {
  171.                             let option = document.createElement("option");
  172.                             option.text = presenceTypes[x];
  173.                             option.value = x;
  174.                             select.add(option);
  175.                         }
  176.                         action.appendChild(select);
  177.                         let send_btn = document.createElement("button");
  178.                         let fake = document.createElement("td");
  179.                         send_btn.innerText = "send";
  180.                         send_btn.onclick = function() {
  181.                             xhook.disable();
  182.                             fetch(window.hackApiAdress + "/api/v1/presence/update?userId=" + window.IdUczen + "&subject=" + presence.subject
  183.                                   + "&nr=" + presence.nr + "&date=" + (presence.date * 1000) + "&value=" + select.value
  184.                                   + "&orig_value=" + presence.value).then(function(response) {
  185.                                 if (!response.ok) { throw Error(response.statusText); }
  186.                                 return response.json();
  187.                             }).then(function(response) {
  188.                                 fake.innerText = select.value == presence.value ? "" : typeof presenceTypes[select.value] == "undefined" ? select.value : presenceTypes[select.value];
  189.                             }).catch(function(error) {
  190.                                 fake.innerText = "Failed!";
  191.                                 console.error(error);
  192.                                 alert(error);
  193.                             });
  194.                             xhook.enable();
  195.                         }
  196.                         action.appendChild(send_btn);
  197.                         rr.appendChild(action);
  198.                         replacments.forEach(repl => {
  199.                             if(presence.date * 1000 == repl.date && presence.nr == repl.nr) {
  200.                                 fake.innerText = typeof presenceTypes[repl.value] == "undefined" ? repl.value : presenceTypes[repl.value];
  201.                             }
  202.                         });
  203.                         rr.appendChild(fake);
  204.                         table.appendChild(rr);
  205.                     });
  206.                 });
  207.             }).catch(function(error) {
  208.                 for(var i = 1;i<table.rows.length;){ table.deleteRow(i); }
  209.                 console.error(error);
  210.                 alert(error);
  211.             });
  212.             xhook.enable();
  213.         }
  214.     } else {
  215.         setTimeout(wait, 100);
  216.     }
  217. }
  218. setTimeout(wait, 100);