ClassDojo Crown Marker

point out the highest score person in your class!

当前为 2023-04-23 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         ClassDojo Crown Marker
// @namespace    https://github.com/IceLeiYu
// @version      1.0
// @description  point out the highest score person in your class!
// @author       XinShou#4767
// @match        https://teach.classdojo.com/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=classdojo.com
// @grant        none
// @license MIT
// ==/UserScript==



function arraysEqual(arr1, arr2) {
  // 判斷陣列的長度是否相等
  if (arr1.length !== arr2.length) {
    return false;
  }

  // 判斷陣列的每個元素是否相等
  return arr1.every((element, index) => {
    return element === arr2[index];
  });
}


let maxElements = [];

function mark() {
    let greenElements = document.getElementsByClassName("css-27mawu");
    let tmpMaxElements = [];
    let maxNumber = -1;

    // Loop through all elements found
    for (let i = 1; i < greenElements.length; i++) {
        let element = greenElements[i];
        let number = parseInt(element.innerHTML, 10);
        if (!isNaN(number)) {
            if (number > maxNumber) {
                maxNumber = number;
                tmpMaxElements.length = 0;
                tmpMaxElements.push(element);
            } else if (number === maxNumber) {
                tmpMaxElements.push(element)
            }
        }
    }

    if (arraysEqual(maxElements, tmpMaxElements)) {
        return;
    }

    let diff = [...new Set(tmpMaxElements.concat(maxElements))].filter(x => !tmpMaxElements.includes(x) || !maxElements.includes(x));

    for (let i = 0; i < diff.length; i++) {
        let element = diff[i];

        if (maxElements.includes(element)) { // remove
            let images = element.querySelectorAll('img'); // 選擇所有的 img 元素
            images.forEach(img => {
                img.style.width = "0%";
                setTimeout(() => {
                    img.remove();
                }, 200);

            }); // 移除所有 img 元素
        } else { // add
            let img = document.createElement('img'); // 創建一個新的 img 元素
            img.src = 'https://cdn-icons-png.flaticon.com/512/6941/6941697.png'; // 設定圖片 URL
            // 計算圖片大小,以符合元素高度比例
            let elementHeight = element.getBoundingClientRect().height; // 取得元素高度
            let imgSize = elementHeight * 1.5; // 計算圖片高度

            // 創建圖片元素
            let myImage = document.createElement("img");
            myImage.src = "https://media.discordapp.net/attachments/883638446684504074/1099696194290208848/qweqwe.png?width=467&height=468";
            myImage.id = "myImage";

            // 定義圖片的樣式
            myImage.style.position = 'absolute';
            myImage.style.top = `${-imgSize}px`; // 將圖片置於元素上方
            myImage.style.left = `0`;
            myImage.style.width = `${imgSize}px`;
            myImage.style.transition = "all 0.2s linear";

            setTimeout(() => {
                myImage.style.width = "80%";
                myImage.style.transform = `rotate(45deg)`;
            }, 50);

            setTimeout(() => {
                myImage.style.width = "200%";
            }, 150);

            setTimeout(() => {
                myImage.style.width = "100%";
            }, 225);

            setTimeout(() => {
                myImage.style.width = `${imgSize}px`;
            }, 400);


            element.appendChild(myImage);
        }
    }

    maxElements = tmpMaxElements;
}

(function() {
    'use strict';
    window.addEventListener("load", () => {
        setTimeout(() => {
            const refresh = setInterval(mark, 500);


        }, 3000);
    });
})();