Mostrar Notas

Script para mostrar las notas actuales de todos los usuarios en el scoreboard del CTFd.

目前为 2023-10-07 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Mostrar Notas
  3. // @namespace http://tampermonkey.net/
  4. // @license MIT
  5. // @version 0.1.4
  6. // @description Script para mostrar las notas actuales de todos los usuarios en el scoreboard del CTFd.
  7. // @author Neftalí Toledo
  8. // @match https://ic.catedras.linti.unlp.edu.ar/scoreboard
  9. // @icon https://www.google.com/s2/favicons?sz=64&domain=edu.ar
  10. // @grant none
  11. // @run-at document-end
  12. // ==/UserScript==
  13.  
  14. (async function() {
  15. 'use strict';
  16. const ENDPOINT = "https://ic.catedras.linti.unlp.edu.ar/api/v1/users/USER_ID/solves";
  17. const RETOS_ENDPOINT = "https://ic.catedras.linti.unlp.edu.ar/api/v1/challenges"
  18.  
  19. async function obtenerRetosResueltos(user) {
  20. const req = ENDPOINT.replace("USER_ID", user);
  21. const response = await fetch(req);
  22. const data = await response.json();
  23. return data;
  24. }
  25.  
  26. function obtenerPromedio(retos_resueltos, totalRetos) {
  27. return (retos_resueltos / totalRetos) * 10;
  28. }
  29.  
  30. // Obtener el total de retos
  31. const response = await fetch(RETOS_ENDPOINT);
  32. const retosData = await response.json();
  33. const cantRetos = retosData.data.length;
  34.  
  35. // Obtenemos la tabla de usuarios y sus filas
  36. const tablaUsuarios = document.querySelector(".table-striped");
  37. const filas = tablaUsuarios.querySelectorAll("tr");
  38.  
  39. // Añadir columna de notas
  40. const columnaNotas = document.createElement("td");
  41. columnaNotas.setAttribute("scope", "col");
  42. columnaNotas.innerHTML = "<b>Notas</b>";
  43. filas[0].appendChild(columnaNotas);
  44.  
  45. // Obtener las notas de cada usuario
  46. const userPromises = [];
  47. for (let i = 1; i < filas.length; i++) {
  48. //A veces este link cambia a "https://ic.catedras.linti.unlp.edu.ar/teams/" en vez de "https://ic.catedras.linti.unlp.edu.ar/users/"
  49. // No se por qué pasa
  50. const userID = parseInt(filas[i].querySelector("td a").href.replace("https://ic.catedras.linti.unlp.edu.ar/users/", ""));
  51. userPromises.push(obtenerRetosResueltos(userID));
  52. }
  53.  
  54. // Esperar a que se resuelvan todas las promesas
  55. const userNotes = await Promise.all(userPromises);
  56.  
  57. // Añadir notas a cada fila
  58. for (let i = 1; i < filas.length; i++) {
  59. const elementoNota = document.createElement("td");
  60. const promedio = obtenerPromedio(userNotes[i - 1].data.length, cantRetos);
  61. elementoNota.innerHTML = parseFloat(promedio).toPrecision(3);
  62. filas[i].appendChild(elementoNota);
  63. }
  64. })();