Rate My Professor Ratings

Rate My Professor Extension for University of Rochester

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Rate My Professor Ratings 
// @description  Rate My Professor Extension for University of Rochester
// @namespace    http://tampermonkey.net/
// @version      0.1
// @author       Alex Witkowski
// @match        https://cdcs.ur.rochester.edu/*
// @grant        GM_xmlhttpRequest
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    // Pattern to find all instructor elements
    const pattern = /rpResults_ctl\d+_lblInstructors/;

    // URL of pastebin content
    const pastebinURL = 'https://pastebin.com/raw/k8hFxfhe';

    // Initialize an empty hashmap
    const dataMap = {};

    // Function to fetch data from Pastebin
    function fetchDataFromPastebin(url) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function(response) {
                if (response.status === 200) {
                    // Split the content into lines
                    const lines = response.responseText.split('\n');

                    // Create the hashmap
                    lines.forEach(line => {
                        const words = line.split(' ');
                        const key = words.slice(0, 2).join(' ');
                        dataMap[key] = line;
                    });
                } else {
                    console.error('Error fetching data from Pastebin. Status Code:', response.status);
                }
            },
            onerror: function(error) {
                console.error('Error fetching data from Pastebin:', error);
            }
        });
    }
    function findInstructorNames() {
        // Find all span elements with IDs matching the pattern
        const elements = document.querySelectorAll('span[id]');

        // Loop through the found elements and add a hover event listener
        elements.forEach((element) => {
            if (pattern.test(element.id)) {
                const instructorName = element.textContent;
                const data = dataMap[instructorName];
                if (data) {
                    // Create a popup with the information
                    element.addEventListener('mouseenter', function() {
                        const tooltip = document.createElement('div');
                        tooltip.textContent = data;
                        tooltip.style.position = 'absolute';
                        tooltip.style.background = 'aqua';
                        tooltip.style.padding = '5px';
                        tooltip.style.border = '1px solid #ccc';
                        tooltip.style.zIndex = '1000';

                        element.appendChild(tooltip);
                    });

                    // Remove the popup on mouse leave
                    element.addEventListener('mouseleave', function() {
                        const tooltip = element.querySelector('div');
                        if (tooltip) {
                            tooltip.remove();
                        }
                    });
                } else {
                    // If no data is found
                    element.addEventListener('mouseenter', function() {
                        const message = document.createElement('div');
                        message.textContent = 'No information found for this professor';
                        message.style.position = 'absolute';
                        message.style.background = 'aqua';
                        message.style.padding = '5px';
                        message.style.border = '1px solid #ccc';
                        message.style.zIndex = '1000';

                        element.appendChild(message);
                    });

                    // Remove the popup on mouse leave
                    element.addEventListener('mouseleave', function() {
                        const message = element.querySelector('div');
                        if (message) {
                            message.remove();
                        }
                    });
                }
            }
        });
    }

    // Call the function to fetch and process data from Pastebin
    fetchDataFromPastebin(pastebinURL);
    // Reloads data every 3 seconds
    setInterval(findInstructorNames, 3000);
})();