Emne-hjelper

Viser statistikk om NTNU-emner

  1. // ==UserScript==
  2. // @name Emne-hjelper
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.2
  5. // @description Viser statistikk om NTNU-emner
  6. // @author RandomNoobster
  7. // @match https://www.ntnu.no/studier/emner/*
  8. // @icon https://www.ntnu.no/o/ntnu-theme/images/logoicon.ico
  9. // @license MIT
  10. // @grant none
  11. // ==/UserScript==
  12. (async function () {
  13. "use strict";
  14. // Hent emnekode fra URL
  15. const url = window.location.href;
  16. const start = url.indexOf("/emner/") + 7;
  17. const end = url.indexOf("/", start);
  18. const end2 = url.indexOf("#", start);
  19. const emnekode = end === -1 ? url.substring(start, end2) : url.substring(start, end);
  20.  
  21. // Hent data fra API
  22. console.log(emnekode);
  23. const emnrResponse = await fetch(`https://api.emnr.no/course/${emnekode}/`);
  24. const emnrData = await emnrResponse.json();
  25.  
  26. makePopUp(emnrData);
  27. })();
  28. function makePopUp(data) {
  29. // Create a div element for the popup
  30. const popup = document.createElement("div");
  31. popup.className = "popup";
  32. // Create a text element with the message
  33. const message = document.createElement("p");
  34. message.style.marginBottom = "0px";
  35. // Create link
  36. const emnrLink = document.createElement("a");
  37. emnrLink.style.display = "block";
  38. emnrLink.href = `https://emnr.no/course/${data.course_code}`;
  39. emnrLink.textContent = `Emnr: ${data.course_code}`;
  40. popup.appendChild(emnrLink);
  41. const karakterLink = document.createElement("a");
  42. karakterLink.style.display = "block";
  43. karakterLink.href = `https://www.karakterweb.no/ntnu/${data.course_code}`;
  44. karakterLink.textContent = `Karakterweb: ${data.course_code}`;
  45. popup.appendChild(karakterLink);
  46. const karakternetLink = document.createElement("a");
  47. karakternetLink.style.display = "block";
  48. karakternetLink.href = `https://karakterer.net/course/${data.course_code}`;
  49. karakternetLink.textContent = `Karakterer.net: ${data.course_code}`;
  50. popup.appendChild(karakternetLink);
  51. message.textContent += `
  52. Statistikk fra emnr.no:
  53. Beståttprosent: ${data.pass_rate.toFixed(2)}%
  54. Karakter/arbeid: ${(data.average_grade / data.average_workload).toFixed(2)}
  55. Antall reviews: ${data.review_count}
  56. `;
  57. // Append the elements to the popup
  58. popup.appendChild(message);
  59. // Create a slider for Arbeidsmengde
  60. const workloadSlider = document.createElement("input");
  61. workloadSlider.type = "range";
  62. workloadSlider.min = "0";
  63. workloadSlider.max = "2";
  64. workloadSlider.step = "0.01";
  65. workloadSlider.value = data.average_workload.toFixed(2);
  66. workloadSlider.style.width = "100%";
  67. workloadSlider.disabled = true;
  68. // Create a label for the workload slider
  69. const workloadLabel = document.createElement("p");
  70. workloadLabel.style.marginBottom = "0px";
  71. workloadLabel.textContent = `Arbeidsmengde: ${data.average_workload.toFixed(
  72. 2
  73. )}`;
  74. // Append the workload slider and label to the message
  75. message.appendChild(workloadLabel);
  76. message.appendChild(workloadSlider);
  77. // Create a slider for Gjennomsnittskarakter
  78. const gradeSlider = document.createElement("input");
  79. gradeSlider.type = "range";
  80. gradeSlider.min = "0";
  81. gradeSlider.max = "5";
  82. gradeSlider.step = "0.01";
  83. gradeSlider.value = data.average_grade.toFixed(2);
  84. gradeSlider.style.width = "100%";
  85. gradeSlider.disabled = true;
  86. // Create a label for the grade slider
  87. const gradeLabel = document.createElement("p");
  88. gradeLabel.style.marginBottom = "0px";
  89. gradeLabel.textContent = `Gjennomsnittskarakter: ${data.average_grade.toFixed(
  90. 2
  91. )} (${data.average_grade_letter})`;
  92. // Append the grade slider and label to the message
  93. message.appendChild(gradeLabel);
  94. message.appendChild(gradeSlider);
  95. // Add some CSS styles to style the popup
  96. popup.style.position = "fixed";
  97. popup.style.top = "10px";
  98. popup.style.right = "10px";
  99. popup.style.backgroundColor = "white";
  100. popup.style.padding = "15px";
  101. popup.style.border = "2px solid #003d99";
  102. popup.style.boxShadow = "0 0 10px rgba(0, 0, 0, 0.3)";
  103. popup.style.fontFamily = "Arial, sans-serif";
  104. popup.style.borderRadius = "10px";
  105. popup.style.zIndex = "999999";
  106. popup.style.cursor = "move"; // Set cursor style to indicate draggable
  107. // Style the message
  108. message.style.color = "#333"; // Dark gray text color
  109. message.style.whiteSpace = "pre-line"; // Allow for line breaks in the text
  110. let isDragging = false;
  111. let initialX, initialY, offsetX, offsetY;
  112. // Function to handle mouse down event
  113. function handleMouseDown(event) {
  114. isDragging = true;
  115. initialX = event.clientX;
  116. initialY = event.clientY;
  117. offsetX = popup.getBoundingClientRect().left;
  118. offsetY = popup.getBoundingClientRect().top;
  119. }
  120. // Function to handle mouse move event
  121. function handleMouseMove(event) {
  122. if (isDragging) {
  123. const dx = event.clientX - initialX;
  124. const dy = event.clientY - initialY;
  125. popup.style.left = offsetX + dx + "px";
  126. popup.style.top = offsetY + dy + "px";
  127. popup.style.right = null;
  128. }
  129. }
  130. // Function to handle mouse up event
  131. function handleMouseUp() {
  132. isDragging = false;
  133. }
  134. // Add event listeners for mouse events
  135. popup.addEventListener("mousedown", handleMouseDown);
  136. document.addEventListener("mousemove", handleMouseMove);
  137. document.addEventListener("mouseup", handleMouseUp);
  138. // Append the popup to the body of the page
  139. document.body.appendChild(popup);
  140. }