Greasy Fork is available in English.

Emne-hjelper

Viser statistikk om NTNU-emner

// ==UserScript==
// @name         Emne-hjelper
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Viser statistikk om NTNU-emner
// @author       RandomNoobster
// @match        https://www.ntnu.no/studier/emner/*
// @icon         https://www.ntnu.no/o/ntnu-theme/images/logoicon.ico
// @license      MIT
// @grant        none
// ==/UserScript==
 
(async function () {
  "use strict";
 
  // Hent emnekode fra URL
  const url = window.location.href;
  const start = url.indexOf("/emner/") + 7;
  const end = url.indexOf("/", start);
  const end2 = url.indexOf("#", start);
  const emnekode = end === -1 ? url.substring(start, end2) : url.substring(start, end);

  // Hent data fra API
  console.log(emnekode);
  const emnrResponse = await fetch(`https://api.emnr.no/course/${emnekode}/`);
  const emnrData = await emnrResponse.json();

  makePopUp(emnrData);
})();
 
function makePopUp(data) {
  // Create a div element for the popup
  const popup = document.createElement("div");
  popup.className = "popup";
 
  // Create a text element with the message
  const message = document.createElement("p");
  message.style.marginBottom = "0px";
 
  // Create link
  const emnrLink = document.createElement("a");
  emnrLink.style.display = "block";
  emnrLink.href = `https://emnr.no/course/${data.course_code}`;
  emnrLink.textContent = `Emnr: ${data.course_code}`;
  popup.appendChild(emnrLink);
 
  const karakterLink = document.createElement("a");
  karakterLink.style.display = "block";
  karakterLink.href = `https://www.karakterweb.no/ntnu/${data.course_code}`;
  karakterLink.textContent = `Karakterweb: ${data.course_code}`;
  popup.appendChild(karakterLink);
 
  const karakternetLink = document.createElement("a");
  karakternetLink.style.display = "block";
  karakternetLink.href = `https://karakterer.net/course/${data.course_code}`;
  karakternetLink.textContent = `Karakterer.net: ${data.course_code}`;
  popup.appendChild(karakternetLink);
 
  message.textContent += `
  Statistikk fra emnr.no:
  Beståttprosent: ${data.pass_rate.toFixed(2)}%
  Karakter/arbeid: ${(data.average_grade / data.average_workload).toFixed(2)}
  Antall reviews: ${data.review_count}
  `;
 
  // Append the elements to the popup
  popup.appendChild(message);
 
  // Create a slider for Arbeidsmengde
  const workloadSlider = document.createElement("input");
  workloadSlider.type = "range";
  workloadSlider.min = "0";
  workloadSlider.max = "2";
  workloadSlider.step = "0.01";
  workloadSlider.value = data.average_workload.toFixed(2);
  workloadSlider.style.width = "100%";
  workloadSlider.disabled = true;
 
  // Create a label for the workload slider
  const workloadLabel = document.createElement("p");
  workloadLabel.style.marginBottom = "0px";
  workloadLabel.textContent = `Arbeidsmengde: ${data.average_workload.toFixed(
    2
  )}`;
 
  // Append the workload slider and label to the message
  message.appendChild(workloadLabel);
  message.appendChild(workloadSlider);
 
  // Create a slider for Gjennomsnittskarakter
  const gradeSlider = document.createElement("input");
  gradeSlider.type = "range";
  gradeSlider.min = "0";
  gradeSlider.max = "5";
  gradeSlider.step = "0.01";
  gradeSlider.value = data.average_grade.toFixed(2);
  gradeSlider.style.width = "100%";
  gradeSlider.disabled = true;
 
  // Create a label for the grade slider
  const gradeLabel = document.createElement("p");
  gradeLabel.style.marginBottom = "0px";
  gradeLabel.textContent = `Gjennomsnittskarakter: ${data.average_grade.toFixed(
    2
  )} (${data.average_grade_letter})`;
 
  // Append the grade slider and label to the message
  message.appendChild(gradeLabel);
  message.appendChild(gradeSlider);
 
  // Add some CSS styles to style the popup
  popup.style.position = "fixed";
  popup.style.top = "10px";
  popup.style.right = "10px";
  popup.style.backgroundColor = "white";
  popup.style.padding = "15px";
  popup.style.border = "2px solid #003d99";
  popup.style.boxShadow = "0 0 10px rgba(0, 0, 0, 0.3)";
  popup.style.fontFamily = "Arial, sans-serif";
  popup.style.borderRadius = "10px";
  popup.style.zIndex = "999999";
  popup.style.cursor = "move"; // Set cursor style to indicate draggable
 
  // Style the message
  message.style.color = "#333"; // Dark gray text color
  message.style.whiteSpace = "pre-line"; // Allow for line breaks in the text
 
  let isDragging = false;
  let initialX, initialY, offsetX, offsetY;
 
  // Function to handle mouse down event
  function handleMouseDown(event) {
    isDragging = true;
    initialX = event.clientX;
    initialY = event.clientY;
    offsetX = popup.getBoundingClientRect().left;
    offsetY = popup.getBoundingClientRect().top;
  }
 
  // Function to handle mouse move event
  function handleMouseMove(event) {
    if (isDragging) {
      const dx = event.clientX - initialX;
      const dy = event.clientY - initialY;
      popup.style.left = offsetX + dx + "px";
      popup.style.top = offsetY + dy + "px";
      popup.style.right = null;
    }
  }
 
  // Function to handle mouse up event
  function handleMouseUp() {
    isDragging = false;
  }
 
  // Add event listeners for mouse events
  popup.addEventListener("mousedown", handleMouseDown);
  document.addEventListener("mousemove", handleMouseMove);
  document.addEventListener("mouseup", handleMouseUp);
 
  // Append the popup to the body of the page
  document.body.appendChild(popup);
}