// ==UserScript==
// @name Better Hydro
// @namespace http://tampermonkey.net/
// @version 2.5
// @description Improve the Hydro interface with custom settings!
// @author Cheerimy
// @match *://hydro.ac/*
// @match *://oiclass.com/*
// @match *://www.oiclass.com/*
// @match *://106.53.100.188:1000/*
// @icon https://s21.ax1x.com/2024/08/22/pAi6KDP.png
// @grant none
// @license GPLv3
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
//Cookies 初始化函数
function setCookieIfNotExists(name, value) {
if (!document.cookie.split('; ').map(cookie => cookie.split('=')[0]).includes(name)) {
document.cookie = `${name}=${encodeURIComponent(value)};path=/;expires=${new Date(Date.now()+365*24*60*60*1000).toUTCString()}`
}
}
//获取 Cookies 模块
function getCookie(name) {
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? decodeURIComponent(match[2]) : null
}
//初始化 Cookies 模块
function initCookies() {
setCookieIfNotExists('browserupdateorg', 'pause');
setCookieIfNotExists('background', 'https://api.imlazy.ink/mcapi/mcbg.php');
setCookieIfNotExists('music', '//music.163.com/outchain/player?type=2&id=133567&auto=0&height=66');
console.log('Cookies 模块加载成功!');
}
//处理 IDE 频率限制模块(Demo)
function handleElement(element) {
const initialHTML = element.innerHTML;
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
const currentClass = mutation.target.className;
if (currentClass.includes('disable')) {
mutation.target.className = currentClass.replace('disable', 'enable');
console.log('Class "disable" detected and changed to "enable".');
// 更新 HTML 内容
mutation.target.innerHTML = initialHTML;
console.log('HTML updated to:', initialHTML);
}
}
}
});
const config = {
attributes: true,
attributeFilter: ['class']
};
observer.observe(element, config);
}
//基本模块(欢迎栏与 UI 优化)
function loadWelcomeMessage() {
const username = Array.from(document.querySelectorAll('li[data-dropdown-target="#menu-nav-user"]')).map(item => item.querySelector('a')).find(link => link && link.textContent.trim() !== 'Language')?.textContent.trim() || 'Visitor';
const panel = document.getElementById('panel');
panel.style.backgroundImage = `url(${getCookie('background')})`;
panel.style.backgroundSize = 'cover';
panel.style.backgroundPosition = 'center';
const style = document.createElement('style');
style.textContent = `.section{border-radius:8px!important;opacity:0.75!important}.section:hover{opacity:1!important}.section__table-header{border-radius:8px 8px 0 0;opacity:0.75!important}.section__table-header:hover{opacity:1!important}`;
document.head.append(style);
const title=document.title;
const name=title.split(" - ").pop().trim();
const newHTML = `
`;
const main = panel.querySelector('.main');
const element = main.querySelector('div');
element.insertAdjacentHTML('afterbegin', newHTML);
console.log('基本模块加载成功!');
}
//音乐模块(播放音乐源音乐)
function loadMusicPlayer() {
const musicURL = getCookie('music');
const musicHTML = ``;
const row = document.getElementById('panel').querySelector('.main').querySelector('.row');
const divs = row.querySelectorAll(':scope > div');
divs.forEach(div => {
const className = div.className;
if (className.includes('medium-3') && className.includes('columns')) {
div.insertAdjacentHTML('afterbegin', musicHTML)
}
});
console.log('音乐播放器加载成功!')
}
//个性化面板模块
function loadSettingsPanel() {
const settingDiv = document.createElement('div');
settingDiv.id = 'setting';
settingDiv.innerHTML = ``;
const omnibarContent = document.getElementById('omnibar-content');
omnibarContent.insertAdjacentElement('afterend', settingDiv);
const setCookie = (name, value, days = 365) => {
const expires = new Date(Date.now() + days * 24 * 60 * 60 * 1000).toUTCString();
document.cookie = `${name}=${value};expires=${expires};path=/`
};
const saveInput = (inputId, cookieName) => {
const input = document.getElementById(inputId);
if (input) {
setCookie(cookieName, input.value)
} else {
console.error(`Element#${inputId}not found`)
}
};
document.getElementById('save-background').onclick = () => saveInput('background-url', 'background');
document.getElementById('save-music').onclick = () => saveInput('music-url', 'music');
console.log('个性化面板模块加载成功!')
}
//去除在线 IDE 提交频率限制模块
function killidelimit() {
const elements = document.querySelectorAll('.scratchpad__toolbar__submit');
elements.forEach(handleElement);
// 观察整个文档,以便检测未来添加的目标元素
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) {
// 如果节点是目标元素的后代,进行深度检查
if (node.matches('.scratchpad__toolbar__item')) {
handleElement(node);
} else {
// 深度检查子节点
const descendantElements = node.querySelectorAll('.scratchpad__toolbar__item');
descendantElements.forEach(handleElement);
}
}
});
}
}
});
const config = {
childList: true,
subtree: true
};
observer.observe(document.body, config);
console.log('IDE 优化模块开始运行!');
}
//尝试加载 Cookies 模块
try {
initCookies();
} catch (error) {
console.error('Cookies 模块加载失败,错误::', error);
}
//尝试加载基础模块
try {
loadWelcomeMessage();
} catch (error) {
console.error('基础模块加载失败,错误::', error);
}
//尝试加载音乐模块
try {
loadMusicPlayer();
} catch (error) {
console.error('音乐模块加载失败,错误::', error);
}
//尝试 IDE 优化模块
try {
killidelimit();
} catch (error) {
console.error('IDE 优化模块加载失败,错误::', error);
}
//尝试个性化面板面板模块
setTimeout(function() {
try {
loadSettingsPanel();
} catch (error) {
console.error('个性化面板模块加载失败,错误::', error);
}
}, 2000);
})();